commit fb810a85f0571e5f443cab2fe6f66acafec5f88a Author: terry.wang <32783747@qq.com> Date: Mon Dec 8 16:51:40 2025 +0800 init version diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b0491ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/检查项目订单.xls +/检查项目统计.xls +/joju-ui-admin +/jojulogs +/joju-server/target diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..fb89695 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/../../../../../:\Research\96.boot\jojuboot\.idea/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/ApifoxUploaderProjectSetting.xml b/.idea/ApifoxUploaderProjectSetting.xml new file mode 100644 index 0000000..dafec8f --- /dev/null +++ b/.idea/ApifoxUploaderProjectSetting.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..1459115 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,56 @@ + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..e9565b9 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/examination.iml b/.idea/examination.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/examination.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..c45e077 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,73 @@ + + + + \ No newline at end of file diff --git a/.idea/intellij-javadocs-4.0.1.xml b/.idea/intellij-javadocs-4.0.1.xml new file mode 100644 index 0000000..0e84319 --- /dev/null +++ b/.idea/intellij-javadocs-4.0.1.xml @@ -0,0 +1,204 @@ + + + + + UPDATE + false + true + + FIELD + TYPE + METHOD + + + PUBLIC + PROTECTED + DEFAULT + + + + + + ^.*(public|protected|private)*.+interface\s+\w+.* + /**\n + * The interface ${name}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> + */ + + + ^.*(public|protected|private)*.+enum\s+\w+.* + /**\n + * The enum ${name}.\n + */ + + + ^.*(public|protected|private)*.+class\s+\w+.* + /**\n + * The type ${name}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> + */ + + + .+ + /**\n + * The type ${name}.\n + */ + + + + + .+ + /**\n + * Instantiates a new ${name}.\n +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + + + ^.*(public|protected|private)*\s*.*(\w(\s*<.+>)*)+\s+get\w+\s*\(.*\).+ + /**\n + * Gets ${partName}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if isNotVoid> + *\n + * @return the ${partName}\n +</#if> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + ^.*(public|protected|private)*\s*.*(void|\w(\s*<.+>)*)+\s+set\w+\s*\(.*\).+ + /**\n + * Sets ${partName}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if isNotVoid> + *\n + * @return the ${partName}\n +</#if> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + ^.*((public\s+static)|(static\s+public))\s+void\s+main\s*\(\s*String\s*(\[\s*\]|\.\.\.)\s+\w+\s*\).+ + /**\n + * The entry point of application.\n + + <#if element.parameterList.parameters?has_content> + *\n +</#if> + * @param ${element.parameterList.parameters[0].name} the input arguments\n +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + .+ + /**\n + * ${name}<#if isNotVoid> ${return}</#if>.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if isNotVoid> + *\n + * @return the ${return}\n +</#if> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + + + ^.*(public|protected|private)*.+static.*(\w\s\w)+.+ + /**\n + * The constant ${element.getName()}.\n + */ + + + ^.*(public|protected|private)*.*(\w\s\w)+.+ + /**\n + <#if element.parent.isInterface()> + * The constant ${element.getName()}.\n +<#else> + * The ${name}.\n +</#if> */ + + + .+ + /**\n + <#if element.parent.isEnum()> + *${name} ${typeName}.\n +<#else> + * The ${name}.\n +</#if>*/ + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..e9e3377 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/lib.xml b/.idea/libraries/lib.xml new file mode 100644 index 0000000..cebf6ea --- /dev/null +++ b/.idea/libraries/lib.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..fb87905 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5314fda --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/joju-dependencies/joju-dependencies.iml b/joju-dependencies/joju-dependencies.iml new file mode 100644 index 0000000..74f3f13 --- /dev/null +++ b/joju-dependencies/joju-dependencies.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-dependencies/pom.xml b/joju-dependencies/pom.xml new file mode 100644 index 0000000..92526b0 --- /dev/null +++ b/joju-dependencies/pom.xml @@ -0,0 +1,529 @@ + + + 4.0.0 + + com.jojubanking.boot + joju-dependencies + ${revision} + pom + + ${project.artifactId} + 基础 bom 文件,管理整个项目的依赖版本 + https://www.jojubanking.com + + + 2.0.0-beta + + 2.6.10 + + 3.0.3 + 1.6.6 + 2.5 + + 1.2.14 + 3.5.2 + 3.5.2 + 3.5.0 + 3.17.4 + + 1.9.2 + + 2.2.0 + 1.7.1 + + 8.7.0 + 2.6.7 + 0.31.0 + + 7.2.6.RELEASE + 0.1.16 + 4.0.0 + + 6.7.0 + + 3.0.4 + 1.18.20 + 1.4.1.Final + 5.7.22 + 3.1.1 + 2.2 + 1.0.5 + 1.2.83 + 30.1.1-jre + 5.1.0 + 2.12.2 + 3.8.0 + 0.1.55 + 2.4.1 + + 8.2.2 + 4.5.25 + 2.1.0 + 3.1.471 + 1.2.7 + 1.4.0 + 1.5.2 + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + + + com.jojubanking.boot + joju-spring-boot-starter-protection + ${revision} + + + com.jojubanking.boot + joju-spring-boot-starter-banner + ${revision} + + + com.jojubanking.boot + joju-spring-boot-starter-biz-operatelog + ${revision} + + + com.jojubanking.boot + joju-spring-boot-starter-biz-dict + ${revision} + + + com.jojubanking.boot + joju-spring-boot-starter-biz-sms + ${revision} + + + com.jojubanking.boot + joju-spring-boot-starter-biz-pay + ${revision} + + + + + + + + com.jojubanking.boot + joju-spring-boot-starter-biz-tenant + ${revision} + + + com.jojubanking.boot + joju-spring-boot-starter-biz-data-permission + ${revision} + + + com.jojubanking.boot + joju-spring-boot-starter-biz-social + ${revision} + + + com.jojubanking.boot + joju-spring-boot-starter-biz-error-code + ${revision} + + + + + + org.springframework.boot + spring-boot-configuration-processor + ${spring.boot.version} + + + + + com.jojubanking.boot + joju-spring-boot-starter-web + ${revision} + + + + com.jojubanking.boot + joju-spring-boot-starter-security + ${revision} + + + + com.github.xiaoymin + knife4j-spring-boot-starter + ${knife4j.version} + + + mapstruct + org.mapstruct + + + guava + com.google.guava + + + swagger-annotations + io.swagger + + + + + io.swagger + swagger-annotations + ${swagger-annotations.version} + + + + + com.jojubanking.boot + joju-spring-boot-starter-mybatis + ${revision} + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + + com.baomidou + dynamic-datasource-spring-boot-starter + ${dynamic-datasource.version} + + + + com.jojubanking.boot + joju-spring-boot-starter-redis + ${revision} + + + + org.redisson + redisson-spring-boot-starter + ${redisson.version} + + + + + + + + + + + com.ctrip.framework.apollo + apollo-client + ${apollo.version} + + + + + com.jojubanking.boot + joju-spring-boot-starter-job + ${revision} + + + + + com.jojubanking.boot + joju-spring-boot-starter-mq + ${revision} + + + + com.baomidou + lock4j-redisson-spring-boot-starter + ${lock4j.version} + + + redisson-spring-boot-starter + org.redisson + + + + + + io.github.resilience4j + resilience4j-ratelimiter + ${resilience4j.version} + + + io.github.resilience4j + resilience4j-spring-boot2 + ${resilience4j.version} + + + + io.opentracing + opentracing-api + ${opentracing.version} + + + io.opentracing + opentracing-util + ${opentracing.version} + + + io.opentracing + opentracing-noop + ${opentracing.version} + + + + + com.jojubanking.boot + joju-spring-boot-starter-test + ${revision} + test + + + + org.mockito + mockito-inline + ${mockito-inline.version} + + + + org.springframework.boot + spring-boot-starter-test + ${spring.boot.version} + + + asm + org.ow2.asm + + + org.mockito + mockito-core + + + + + + com.github.fppt + jedis-mock + ${jedis-mock.version} + + + + uk.co.jemos.podam + podam + ${podam.version} + + + + + com.jojubanking.boot + joju-common + ${revision} + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + ${jasypt-spring-boot-starter.version} + + + + com.jojubanking.boot + joju-spring-boot-starter-excel + ${revision} + + + + org.projectlombok + lombok + ${lombok.version} + + + + org.mapstruct + mapstruct + ${mapstruct.version} + + + org.mapstruct + mapstruct-jdk8 + ${mapstruct.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + cn.hutool + hutool-all + ${hutool.version} + + + + com.alibaba + easyexcel + ${easyexcel.verion} + + + + org.apache.tika + tika-core + ${tika-core.version} + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + + com.alibaba + fastjson + ${fastjson.version} + + + + cn.smallbun.screw + screw-core + ${screw.version} + + + org.freemarker + freemarker + + + com.alibaba + fastjson + + + + + + com.google.guava + guava + ${guava.version} + + + + com.google.inject + guice + ${guice.version} + + + + com.alibaba + transmittable-thread-local + ${transmittable-thread-local.version} + + + + commons-net + commons-net + ${commons-net.version} + + + com.jcraft + jsch + ${jsch.version} + + + + + com.jojubanking.boot + joju-spring-boot-starter-file + ${revision} + + + io.minio + minio + ${minio.version} + + + + + com.yunpian.sdk + yunpian-java-sdk + ${yunpian-java-sdk.version} + + + com.aliyun + aliyun-java-sdk-core + ${aliyun-java-sdk-core.version} + + + opentracing-api + io.opentracing + + + opentracing-util + io.opentracing + + + + + com.aliyun + aliyun-java-sdk-dysmsapi + ${aliyun-java-sdk-dysmsapi.version} + + + com.tencentcloudapi + tencentcloud-sdk-java + ${tencentcloud-sdk-java.version} + + + + + com.xkcoding.justauth + justauth-spring-boot-starter + ${justauth.version} + + + + + org.apache.skywalking + apm-toolkit-trace + ${skywalking.version} + + + org.apache.skywalking + apm-toolkit-logback-1.x + ${skywalking.version} + + + org.apache.skywalking + apm-toolkit-opentracing + ${skywalking.version} + + + + + + + + + + + + + + + + diff --git a/joju-framework/joju-common/joju-common.iml b/joju-framework/joju-common/joju-common.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-common/joju-common.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-common/pom.xml b/joju-framework/joju-common/pom.xml new file mode 100644 index 0000000..72d5180 --- /dev/null +++ b/joju-framework/joju-common/pom.xml @@ -0,0 +1,154 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-common + jar + + ${project.artifactId} + 定义基础 pojo 类、枚举、工具类等等 + https://www.jojubanking.com + + + + + org.springframework + spring-core + provided + + + org.springframework + spring-expression + provided + + + org.springframework + spring-aop + provided + + + org.aspectj + aspectjweaver + provided + + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + org.springframework + spring-web + provided + + + + jakarta.servlet + jakarta.servlet-api + provided + + + + io.swagger + swagger-annotations + provided + + + + + org.apache.skywalking + apm-toolkit-trace + + + + + commons-httpclient + commons-httpclient + 2.0.2 + + + org.apache.commons + commons-lang3 + 3.1 + + + + org.projectlombok + lombok + + + + org.mapstruct + mapstruct + + + org.mapstruct + mapstruct-jdk8 + + + org.mapstruct + mapstruct-processor + + + + com.google.guava + guava + provided + + + + com.fasterxml.jackson.core + jackson-databind + provided + + + com.fasterxml.jackson.core + jackson-core + provided + + + + org.slf4j + slf4j-api + provided + + + commons-lang + commons-lang + 2.6 + + + + jakarta.validation + jakarta.validation-api + provided + + + + cn.hutool + hutool-all + + + + com.alibaba + transmittable-thread-local + + + maven + dom4j + 1.7-20060614 + + + + + diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/core/IntArrayValuable.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/core/IntArrayValuable.java new file mode 100644 index 0000000..a618a1d --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/core/IntArrayValuable.java @@ -0,0 +1,15 @@ +package com.jojubanking.boot.framework.common.core; + +/** + * 可生成 Int 数组的接口 + * + * @author TW + */ +public interface IntArrayValuable { + + /** + * @return int 数组 + */ + int[] array(); + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/core/KeyValue.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/core/KeyValue.java new file mode 100644 index 0000000..a238b5f --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/core/KeyValue.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.framework.common.core; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * Key Value 的键值对 + * + * @author TW + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class KeyValue { + + private K key; + private V value; + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/enums/CommonStatusEnum.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/enums/CommonStatusEnum.java new file mode 100644 index 0000000..8a29c9f --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/enums/CommonStatusEnum.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.framework.common.enums; + +import com.jojubanking.boot.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 通用状态枚举 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum CommonStatusEnum implements IntArrayValuable { + + ENABLE(0, "开启"), + DISABLE(1, "关闭"); + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CommonStatusEnum::getStatus).toArray(); + + + /** + * 状态值 + */ + private final Integer status; + /** + * 状态名 + */ + private final String name; + + @Override + public int[] array() { + return ARRAYS; + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/enums/DocumentEnum.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/enums/DocumentEnum.java new file mode 100644 index 0000000..9d80fb3 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/enums/DocumentEnum.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.framework.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 文档地址 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum DocumentEnum { + + REDIS_INSTALL("https://gitee.com/zhijiantianya/ruoyi-vue-pro/issues/I4VCSJ", "Redis 安装文档"); + + private final String url; + private final String memo; + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/enums/UserTypeEnum.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/enums/UserTypeEnum.java new file mode 100644 index 0000000..015e957 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/enums/UserTypeEnum.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.framework.common.enums; + +import cn.hutool.core.util.ArrayUtil; +import com.jojubanking.boot.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 全局用户类型枚举 + */ +@AllArgsConstructor +@Getter +public enum UserTypeEnum implements IntArrayValuable { + + MEMBER(1, "会员"), // 面向 c 端,普通用户 + ADMIN(2, "管理员"); // 面向 b 端,管理后台 + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(UserTypeEnum::getValue).toArray(); + + /** + * 类型 + */ + private final Integer value; + /** + * 类型名 + */ + private final String name; + + public static UserTypeEnum valueOf(Integer value) { + return ArrayUtil.firstMatch(userType -> userType.getValue().equals(value), UserTypeEnum.values()); + } + + @Override + public int[] array() { + return ARRAYS; + } +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/enums/WebFilterOrderEnum.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/enums/WebFilterOrderEnum.java new file mode 100644 index 0000000..b1d8d47 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/enums/WebFilterOrderEnum.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.framework.common.enums; + +/** + * Web 过滤器顺序的枚举类,保证过滤器按照符合我们的预期 + * + * 考虑到每个 starter 都需要用到该工具类,所以放到 common 模块下的 enums 包下 + * + * @author TW + */ +public interface WebFilterOrderEnum { + + int CORS_FILTER = Integer.MIN_VALUE; + + int TRACE_FILTER = CORS_FILTER + 1; + + int REQUEST_BODY_CACHE_FILTER = Integer.MIN_VALUE + 500; + + // OrderedRequestContextFilter 默认为 -105,用于国际化上下文等等 + + int TENANT_CONTEXT_FILTER = - 104; // 需要保证在 ApiAccessLogFilter 前面 + + int API_ACCESS_LOG_FILTER = -103; // 需要保证在 RequestBodyCacheFilter 后面 + + int XSS_FILTER = -102; // 需要保证在 RequestBodyCacheFilter 后面 + + // Spring Security Filter 默认为 -100,可见 org.springframework.boot.autoconfigure.security.SecurityProperties 配置属性类 + + int TENANT_SECURITY_FILTER = -99; // 需要保证在 Spring Security 过滤器后面 + + int ACTIVITI_FILTER = -98; // 需要保证在 Spring Security 过滤后面 + + int FLOWABLE_FILTER = -98; // 需要保证在 Spring Security 过滤后面 + + int DEMO_FILTER = Integer.MAX_VALUE; + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/ErrorCode.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/ErrorCode.java new file mode 100644 index 0000000..4e85732 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/ErrorCode.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.framework.common.exception; + +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.common.exception.enums.ServiceErrorCodeRange; +import lombok.Data; + +/** + * 错误码对象 + * + * 全局错误码,占用 [0, 999], 参见 {@link GlobalErrorCodeConstants} + * 业务异常错误码,占用 [1 000 000 000, +∞),参见 {@link ServiceErrorCodeRange} + * + * TODO 错误码设计成对象的原因,为未来的 i18 国际化做准备 + */ +@Data +public class ErrorCode { + + /** + * 错误码 + */ + private final Integer code; + /** + * 错误提示 + */ + private final String msg; + + public ErrorCode(Integer code, String message) { + this.code = code; + this.msg = message; + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/ServerException.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/ServerException.java new file mode 100644 index 0000000..85b1df9 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/ServerException.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.framework.common.exception; + +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 服务器异常 Exception + */ +@Data +@EqualsAndHashCode(callSuper = true) +public final class ServerException extends RuntimeException { + + /** + * 全局错误码 + * + * @see GlobalErrorCodeConstants + */ + private Integer code; + /** + * 错误提示 + */ + private String message; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServerException() { + } + + public ServerException(ErrorCode errorCode) { + this.code = errorCode.getCode(); + this.message = errorCode.getMsg(); + } + + public ServerException(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public ServerException setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + return message; + } + + public ServerException setMessage(String message) { + this.message = message; + return this; + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/ServiceException.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/ServiceException.java new file mode 100644 index 0000000..c6e7c5d --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/ServiceException.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.framework.common.exception; + +import com.jojubanking.boot.framework.common.exception.enums.ServiceErrorCodeRange; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 业务逻辑异常 Exception + */ +@Data +@EqualsAndHashCode(callSuper = true) +public final class ServiceException extends RuntimeException { + + /** + * 业务错误码 + * + * @see ServiceErrorCodeRange + */ + private Integer code; + /** + * 错误提示 + */ + private String message; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() { + } + + public ServiceException(ErrorCode errorCode) { + this.code = errorCode.getCode(); + this.message = errorCode.getMsg(); + } + + public ServiceException(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public ServiceException setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + return message; + } + + public ServiceException setMessage(String message) { + this.message = message; + return this; + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/enums/GlobalErrorCodeConstants.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/enums/GlobalErrorCodeConstants.java new file mode 100644 index 0000000..d40bc34 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/enums/GlobalErrorCodeConstants.java @@ -0,0 +1,50 @@ +package com.jojubanking.boot.framework.common.exception.enums; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; + +/** + * 全局错误码枚举 + * 0-999 系统异常编码保留 + * + * 一般情况下,使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status + * 虽然说,HTTP 响应状态码作为业务使用表达能力偏弱,但是使用在系统层面还是非常不错的 + * 比较特殊的是,因为之前一直使用 0 作为成功,就不使用 200 啦。 + * + * @author TW + */ +public interface GlobalErrorCodeConstants { + + ErrorCode SUCCESS = new ErrorCode(0, "成功"); + + // ========== 客户端错误段 ========== + + ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确"); + ErrorCode UNAUTHORIZED = new ErrorCode(401, "账号未登录"); + ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限"); + ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到"); + ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确"); + ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许 + ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试"); + + // ========== 服务端错误段 ========== + + ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常"); + + // ========== 自定义错误段 ========== + ErrorCode REPEATED_REQUESTS = new ErrorCode(900, "重复请求,请稍后重试"); // 重复请求 + ErrorCode DEMO_DENY = new ErrorCode(901, "演示模式,禁止写操作"); + + ErrorCode UNKNOWN = new ErrorCode(999, "未知错误"); + + /** + * 是否为服务端错误,参考 HTTP 5XX 错误码段 + * + * @param code 错误码 + * @return 是否 + */ + static boolean isServerErrorCode(Integer code) { + return code != null + && code >= INTERNAL_SERVER_ERROR.getCode() && code <= INTERNAL_SERVER_ERROR.getCode() + 99; + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/enums/ServiceErrorCodeRange.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/enums/ServiceErrorCodeRange.java new file mode 100644 index 0000000..540d848 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/enums/ServiceErrorCodeRange.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.framework.common.exception.enums; + +/** + * 业务异常的错误码区间,解决:解决各模块错误码定义,避免重复,在此只声明不做实际使用 + * + * 一共 10 位,分成四段 + * + * 第一段,1 位,类型 + * 1 - 业务级别异常 + * x - 预留 + * 第二段,3 位,系统类型 + * 001 - 用户系统 + * 002 - 商品系统 + * 003 - 订单系统 + * 004 - 支付系统 + * 005 - 优惠劵系统 + * ... - ... + * 第三段,3 位,模块 + * 不限制规则。 + * 一般建议,每个系统里面,可能有多个模块,可以再去做分段。以用户系统为例子: + * 001 - OAuth2 模块 + * 002 - User 模块 + * 003 - MobileCode 模块 + * 第四段,3 位,错误码 + * 不限制规则。 + * 一般建议,每个模块自增。 + * + * @author TW + */ +public class ServiceErrorCodeRange { + + // 模块 infra 错误码区间 [1-001-000-000 ~ 1-002-000-000) + // 模块 system 错误码区间 [1-002-000-000 ~ 1-003-000-000) + // 模块 member 错误码区间 [1-004-000-000 ~ 1-005-000-000) + // 模块 pay 错误码区间 [1-007-000-000 ~ 1-008-000-000) + // 模块 bpm 错误码区间 [1-009-000-000 ~ 1-010-000-000) + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/util/ServiceExceptionUtil.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/util/ServiceExceptionUtil.java new file mode 100644 index 0000000..9634772 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/exception/util/ServiceExceptionUtil.java @@ -0,0 +1,122 @@ +package com.jojubanking.boot.framework.common.exception.util; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * {@link ServiceException} 工具类 + * + * 目的在于,格式化异常信息提示。 + * 考虑到 String.format 在参数不正确时会报错,因此使用 {} 作为占位符,并使用 {@link #doFormat(int, String, Object...)} 方法来格式化 + * + * 因为 {@link #MESSAGES} 里面默认是没有异常信息提示的模板的,所以需要使用方自己初始化进去。目前想到的有几种方式: + * + * 1. 异常提示信息,写在枚举类中,例如说,cn.iocoder.oceans.user.api.constants.ErrorCodeEnum 类 + ServiceExceptionConfiguration + * 2. 异常提示信息,写在 .properties 等等配置文件 + * 3. 异常提示信息,写在 Apollo 等等配置中心中,从而实现可动态刷新 + * 4. 异常提示信息,存储在 db 等等数据库中,从而实现可动态刷新 + */ +@Slf4j +public class ServiceExceptionUtil { + + /** + * 错误码提示模板 + */ + private static final ConcurrentMap MESSAGES = new ConcurrentHashMap<>(); + + public static void putAll(Map messages) { + ServiceExceptionUtil.MESSAGES.putAll(messages); + } + + public static void put(Integer code, String message) { + ServiceExceptionUtil.MESSAGES.put(code, message); + } + + public static void delete(Integer code, String message) { + ServiceExceptionUtil.MESSAGES.remove(code, message); + } + + // ========== 和 ServiceException 的集成 ========== + + public static ServiceException exception(ErrorCode errorCode) { + String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMsg()); + return exception0(errorCode.getCode(), messagePattern); + } + + public static ServiceException exception(ErrorCode errorCode, Object... params) { + String messagePattern = MESSAGES.getOrDefault(errorCode.getCode(), errorCode.getMsg()); + return exception0(errorCode.getCode(), messagePattern, params); + } + + /** + * 创建指定编号的 ServiceException 的异常 + * + * @param code 编号 + * @return 异常 + */ + public static ServiceException exception(Integer code) { + return exception0(code, MESSAGES.get(code)); + } + + /** + * 创建指定编号的 ServiceException 的异常 + * + * @param code 编号 + * @param params 消息提示的占位符对应的参数 + * @return 异常 + */ + public static ServiceException exception(Integer code, Object... params) { + return exception0(code, MESSAGES.get(code), params); + } + + public static ServiceException exception0(Integer code, String messagePattern, Object... params) { + String message = doFormat(code, messagePattern, params); + return new ServiceException(code, message); + } + + // ========== 格式化方法 ========== + + /** + * 将错误编号对应的消息使用 params 进行格式化。 + * + * @param code 错误编号 + * @param messagePattern 消息模版 + * @param params 参数 + * @return 格式化后的提示 + */ + @VisibleForTesting + public static String doFormat(int code, String messagePattern, Object... params) { + StringBuilder sbuf = new StringBuilder(messagePattern.length() + 50); + int i = 0; + int j; + int l; + for (l = 0; l < params.length; l++) { + j = messagePattern.indexOf("{}", i); + if (j == -1) { + log.error("[doFormat][参数过多:错误码({})|错误内容({})|参数({})", code, messagePattern, params); + if (i == 0) { + return messagePattern; + } else { + sbuf.append(messagePattern.substring(i)); + return sbuf.toString(); + } + } else { + sbuf.append(messagePattern, i, j); + sbuf.append(params[l]); + i = j + 2; + } + } + if (messagePattern.indexOf("{}", i) != -1) { + log.error("[doFormat][参数过少:错误码({})|错误内容({})|参数({})", code, messagePattern, params); + } + sbuf.append(messagePattern.substring(i)); + return sbuf.toString(); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/package-info.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/package-info.java new file mode 100644 index 0000000..b18c88e --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/package-info.java @@ -0,0 +1,6 @@ +/** + * 基础的通用类,和框架无关 + * + * 例如说,CommonResult 为通用返回 + */ +package com.jojubanking.boot.framework.common; diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/pojo/CommonResult.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/pojo/CommonResult.java new file mode 100644 index 0000000..8f39eaf --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/pojo/CommonResult.java @@ -0,0 +1,119 @@ +package com.jojubanking.boot.framework.common.pojo; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.common.exception.ServerException; +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.util.Assert; + +import java.io.Serializable; +import java.util.Objects; + +/** + * 通用返回 + * + * @param 数据泛型 + */ +@Data +@Accessors(chain = true) +public class CommonResult implements Serializable { + + /** + * 错误码 + * + * @see ErrorCode#getCode() + */ + private Integer code; + /** + * 返回数据 + */ + private T data; + /** + * 错误提示,用户可阅读 + * + * @see ErrorCode#getMsg() () + */ + private String msg; + + /** + * 将传入的 result 对象,转换成另外一个泛型结果的对象 + * + * 因为 A 方法返回的 CommonResult 对象,不满足调用其的 B 方法的返回,所以需要进行转换。 + * + * @param result 传入的 result 对象 + * @param 返回的泛型 + * @return 新的 CommonResult 对象 + */ + public static CommonResult error(CommonResult result) { + return error(result.getCode(), result.getMsg()); + } + + public static CommonResult error(Integer code, String message) { + Assert.isTrue(!GlobalErrorCodeConstants.SUCCESS.getCode().equals(code), "code 必须是错误的!"); + CommonResult result = new CommonResult<>(); + result.code = code; + result.msg = message; + return result; + } + + public static CommonResult error(ErrorCode errorCode) { + return error(errorCode.getCode(), errorCode.getMsg()); + } + + public static CommonResult success(T data) { + CommonResult result = new CommonResult<>(); + result.code = GlobalErrorCodeConstants.SUCCESS.getCode(); + result.data = data; + result.msg = ""; + return result; + } + + public static boolean isSuccess(Integer code) { + return Objects.equals(code, GlobalErrorCodeConstants.SUCCESS.getCode()); + } + + @JsonIgnore // 避免 jackson 序列化 + public boolean isSuccess() { + return isSuccess(code); + } + + @JsonIgnore // 避免 jackson 序列化 + public boolean isError() { + return !isSuccess(); + } + + // ========= 和 Exception 异常体系集成 ========= + + /** + * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常 + */ + public void checkError() throws ServiceException { + if (isSuccess()) { + return; + } + // 服务端异常 + if (GlobalErrorCodeConstants.isServerErrorCode(code)) { + throw new ServerException(code, msg); + } + // 业务异常 + throw new ServiceException(code, msg); + } + + /** + * 判断是否有异常。如果有,则抛出 {@link ServiceException} 异常 + * 如果没有,则返回 {@link #data} 数据 + */ + @JsonIgnore // 避免 jackson 序列化 + public T getCheckedData() { + checkError(); + return data; + } + + public static CommonResult error(ServiceException serviceException) { + return error(serviceException.getCode(), serviceException.getMessage()); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/pojo/PageParam.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/pojo/PageParam.java new file mode 100644 index 0000000..aae3cd5 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/pojo/PageParam.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.framework.common.pojo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.Max; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@ApiModel("分页参数") +@Data +public class PageParam implements Serializable { + + private static final Integer PAGE_NO = 1; + private static final Integer PAGE_SIZE = 10; + + @ApiModelProperty(value = "页码,从 1 开始", required = true,example = "1") + @NotNull(message = "页码不能为空") + @Min(value = 1, message = "页码最小值为 1") + private Integer pageNo = PAGE_NO; + + @ApiModelProperty(value = "每页条数,最大值为 100", required = true, example = "10") + @NotNull(message = "每页条数不能为空") + @Min(value = 1, message = "每页条数最小值为 1") + @Max(value = 100, message = "每页条数最大值为 100") + private Integer pageSize = PAGE_SIZE; + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/pojo/PageResult.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/pojo/PageResult.java new file mode 100644 index 0000000..6061045 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/pojo/PageResult.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.framework.common.pojo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@ApiModel("分页结果") +@Data +public final class PageResult implements Serializable { + + @ApiModelProperty(value = "数据", required = true) + private List list; + + @ApiModelProperty(value = "总量", required = true) + private Long total; + + public PageResult() { + } + + public PageResult(List list, Long total) { + this.list = list; + this.total = total; + } + + public PageResult(Long total) { + this.list = new ArrayList<>(); + this.total = total; + } + + public static PageResult empty() { + return new PageResult<>(0L); + } + + public static PageResult empty(Long total) { + return new PageResult<>(total); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/pojo/SortingField.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/pojo/SortingField.java new file mode 100644 index 0000000..415a749 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/pojo/SortingField.java @@ -0,0 +1,56 @@ +package com.jojubanking.boot.framework.common.pojo; + +import java.io.Serializable; + +/** + * 排序字段 DTO + * + * 类名加了 ing 的原因是,避免和 ES SortField 重名。 + */ +public class SortingField implements Serializable { + + /** + * 顺序 - 升序 + */ + public static final String ORDER_ASC = "asc"; + /** + * 顺序 - 降序 + */ + public static final String ORDER_DESC = "desc"; + + /** + * 字段 + */ + private String field; + /** + * 顺序 + */ + private String order; + + // 空构造方法,解决反序列化 + public SortingField() { + } + + public SortingField(String field, String order) { + this.field = field; + this.order = order; + } + + public String getField() { + return field; + } + + public SortingField setField(String field) { + this.field = field; + return this; + } + + public String getOrder() { + return order; + } + + public SortingField setOrder(String order) { + this.order = order; + return this; + } +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/cache/CacheUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/cache/CacheUtils.java new file mode 100644 index 0000000..c81a193 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/cache/CacheUtils.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.framework.common.util.cache; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + +import java.time.Duration; +import java.util.concurrent.Executors; + +/** + * Cache 工具类 + * + * @author TW + */ +public class CacheUtils { + + public static LoadingCache buildAsyncReloadingCache(Duration duration, CacheLoader loader) { + return CacheBuilder.newBuilder() + // 只阻塞当前数据加载线程,其他线程返回旧值 + .refreshAfterWrite(duration) + // 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程 + .build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool())); // TODO TW:可能要思考下,未来要不要做成可配置 + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/collection/ArrayUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/collection/ArrayUtils.java new file mode 100644 index 0000000..9c07ab0 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/collection/ArrayUtils.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.framework.common.util.collection; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ArrayUtil; + +import java.util.Collection; +import java.util.function.Consumer; +import java.util.function.Function; + +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertList; + +/** + * Array 工具类 + * + * @author TW + */ +public class ArrayUtils { + + /** + * 将 object 和 newElements 合并成一个数组 + * + * @param object 对象 + * @param newElements 数组 + * @param 泛型 + * @return 结果数组 + */ + @SafeVarargs + public static Consumer[] append(Consumer object, Consumer... newElements) { + if (object == null) { + return newElements; + } + Consumer[] result = ArrayUtil.newArray(Consumer.class, 1 + newElements.length); + result[0] = object; + System.arraycopy(newElements, 0, result, 1, newElements.length); + return result; + } + + public static V[] toArray(Collection from, Function mapper) { + return toArray(CollectionUtils.convertList(from, mapper)); + } + + @SuppressWarnings("unchecked") + public static T[] toArray(Collection from) { + if (CollectionUtil.isEmpty(from)) { + return (T[]) (new Object[0]); + } + return ArrayUtil.toArray(from, (Class) CollectionUtil.getElementType(from.iterator())); + } + + public static T get(T[] array, int index) { + if (null == array || index >= array.length) { + return null; + } + return array[index]; + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/collection/CollectionUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/collection/CollectionUtils.java new file mode 100644 index 0000000..5f6f5c2 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/collection/CollectionUtils.java @@ -0,0 +1,187 @@ +package com.jojubanking.boot.framework.common.util.collection; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.google.common.collect.ImmutableMap; + +import java.util.*; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +/** + * Collection 工具类 + * + * @author TW + */ +public class CollectionUtils { + + public static boolean containsAny(Object source, Object... targets) { + return Arrays.asList(targets).contains(source); + } + + public static boolean isAnyEmpty(Collection... collections) { + return Arrays.stream(collections).anyMatch(CollectionUtil::isEmpty); + } + + public static List filterList(Collection from, Predicate predicate) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().filter(predicate).collect(Collectors.toList()); + } + + public static List distinct(Collection from, Function keyMapper) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return distinct(from, keyMapper, (t1, t2) -> t1); + } + + public static List distinct(Collection from, Function keyMapper, BinaryOperator cover) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return new ArrayList<>(convertMap(from, keyMapper, Function.identity(), cover).values()); + } + + public static List convertList(Collection from, Function func) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().map(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static List convertList(Collection from, Function func, Predicate filter) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static Set convertSet(Collection from, Function func) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().map(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Set convertSet(Collection from, Function func, Predicate filter) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Map convertMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, Function.identity()); + } + + public static Map convertMap(Collection from, Function keyFunc, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return supplier.get(); + } + return convertMap(from, keyFunc, Function.identity(), supplier); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, valueFunc, (v1, v2) -> v1); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, BinaryOperator mergeFunction) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, valueFunc, mergeFunction, HashMap::new); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return supplier.get(); + } + return convertMap(from, keyFunc, valueFunc, (v1, v2) -> v1, supplier); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, BinaryOperator mergeFunction, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.toMap(keyFunc, valueFunc, mergeFunction, supplier)); + } + + public static Map> convertMultiMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(t -> t, Collectors.toList()))); + } + + public static Map> convertMultiMap(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream() + .collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toList()))); + } + + // 暂时没想好名字,先以 2 结尾噶 + public static Map> convertMultiMap2(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toSet()))); + } + + public static Map convertImmutableMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return Collections.emptyMap(); + } + ImmutableMap.Builder builder = ImmutableMap.builder(); + from.forEach(item -> builder.put(keyFunc.apply(item), item)); + return builder.build(); + } + + public static boolean containsAny(Collection source, Collection candidates) { + return org.springframework.util.CollectionUtils.containsAny(source, candidates); + } + + public static T getFirst(List from) { + return !CollectionUtil.isEmpty(from) ? from.get(0) : null; + } + + public static T findFirst(List from, Predicate predicate) { + if (CollUtil.isEmpty(from)) { + return null; + } + return from.stream().filter(predicate).findFirst().orElse(null); + } + + public static > V getMaxValue(List from, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return null; + } + assert from.size() > 0; // 断言,避免告警 + T t = from.stream().max(Comparator.comparing(valueFunc)).get(); + return valueFunc.apply(t); + } + + public static void addIfNotNull(Collection coll, T item) { + if (item == null) { + return; + } + coll.add(item); + } + + public static Collection singleton(T deptId) { + return deptId == null ? Collections.emptyList() : Collections.singleton(deptId); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/collection/MapUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/collection/MapUtils.java new file mode 100644 index 0000000..38fc771 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/collection/MapUtils.java @@ -0,0 +1,66 @@ +package com.jojubanking.boot.framework.common.util.collection; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +/** + * Map 工具类 + * + * @author TW + */ +public class MapUtils { + + /** + * 从哈希表表中,获得 keys 对应的所有 value 数组 + * + * @param multimap 哈希表 + * @param keys keys + * @return value 数组 + */ + public static List getList(Multimap multimap, Collection keys) { + List result = new ArrayList<>(); + keys.forEach(k -> { + Collection values = multimap.get(k); + if (CollectionUtil.isEmpty(values)) { + return; + } + result.addAll(values); + }); + return result; + } + + /** + * 从哈希表查找到 key 对应的 value,然后进一步处理 + * 注意,如果查找到的 value 为 null 时,不进行处理 + * + * @param map 哈希表 + * @param key key + * @param consumer 进一步处理的逻辑 + */ + public static void findAndThen(Map map, K key, Consumer consumer) { + if (CollUtil.isEmpty(map)) { + return; + } + V value = map.get(key); + if (value == null) { + return; + } + consumer.accept(value); + } + + public static Map convertMap(List> keyValues) { + Map map = Maps.newLinkedHashMapWithExpectedSize(keyValues.size()); + keyValues.forEach(keyValue -> map.put(keyValue.getKey(), keyValue.getValue())); + return map; + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/collection/SetUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/collection/SetUtils.java new file mode 100644 index 0000000..2eeacb6 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/collection/SetUtils.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.framework.common.util.collection; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * Set 工具类 + * + * @author TW + */ +public class SetUtils { + + public static Set asSet(T... objs) { + return new HashSet<>(Arrays.asList(objs)); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/date/DateUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/date/DateUtils.java new file mode 100644 index 0000000..12c7499 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/date/DateUtils.java @@ -0,0 +1,138 @@ +package com.jojubanking.boot.framework.common.util.date; + +import cn.hutool.core.date.DateUtil; + +import java.time.Duration; +import java.util.Calendar; +import java.util.Date; + +/** + * 时间工具类 + * + * @author TW + */ +public class DateUtils { + + /** + * 时区 - 默认 + */ + public static final String TIME_ZONE_DEFAULT = "GMT+8"; + + /** + * 秒转换成毫秒 + */ + public static final long SECOND_MILLIS = 1000; + + public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss"; + + public static Date addTime(Duration duration) { + return new Date(System.currentTimeMillis() + duration.toMillis()); + } + + public static boolean isExpired(Date time) { + return System.currentTimeMillis() > time.getTime(); + } + + public static long diff(Date endTime, Date startTime) { + return endTime.getTime() - startTime.getTime(); + } + + /** + * 创建指定时间 + * + * @param year 年 + * @param mouth 月 + * @param day 日 + * @return 指定时间 + */ + public static Date buildTime(int year, int mouth, int day) { + return buildTime(year, mouth, day, 0, 0, 0); + } + + /** + * 创建指定时间 + * + * @param year 年 + * @param mouth 月 + * @param day 日 + * @param hour 小时 + * @param minute 分钟 + * @param second 秒 + * @return 指定时间 + */ + public static Date buildTime(int year, int mouth, int day, + int hour, int minute, int second) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.MONTH, mouth - 1); + calendar.set(Calendar.DAY_OF_MONTH, day); + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, second); + calendar.set(Calendar.MILLISECOND, 0); // 一般情况下,都是 0 毫秒 + return calendar.getTime(); + } + + public static Date max(Date a, Date b) { + if (a == null) { + return b; + } + if (b == null) { + return a; + } + return a.compareTo(b) > 0 ? a : b; + } + + public static boolean beforeNow(Date date) { + return date.getTime() < System.currentTimeMillis(); + } + + public static boolean afterNow(Date date) { + return date.getTime() >= System.currentTimeMillis(); + } + + /** + * 计算当期时间相差的日期 + * + * @param field 日历字段.
eg:Calendar.MONTH,Calendar.DAY_OF_MONTH,
Calendar.HOUR_OF_DAY等. + * @param amount 相差的数值 + * @return 计算后的日志 + */ + public static Date addDate(int field, int amount) { + return addDate(null, field, amount); + } + + /** + * 计算当期时间相差的日期 + * + * @param date 设置时间 + * @param field 日历字段 例如说,{@link Calendar#DAY_OF_MONTH} 等 + * @param amount 相差的数值 + * @return 计算后的日志 + */ + public static Date addDate(Date date, int field, int amount) { + if (amount == 0) { + return date; + } + Calendar c = Calendar.getInstance(); + if (date != null) { + c.setTime(date); + } + c.add(field, amount); + return c.getTime(); + } + + /** + * 是否今天 + * + * @param date 日期 + * @return 是否 + */ + public static boolean isToday(Date date) { + if (date == null) { + return false; + } + return DateUtil.isSameDay(date, new Date()); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/http/HttpUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/http/HttpUtils.java new file mode 100644 index 0000000..2242517 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/http/HttpUtils.java @@ -0,0 +1,126 @@ +package com.jojubanking.boot.framework.common.util.http; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.map.TableMap; +import cn.hutool.core.net.url.UrlBuilder; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import org.springframework.util.StringUtils; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import javax.servlet.http.HttpServletRequest; +import java.net.URI; +import java.nio.charset.Charset; +import java.util.Map; + +/** + * HTTP 工具类 + * + * @author TW + */ +public class HttpUtils { + + @SuppressWarnings("unchecked") + public static String replaceUrlQuery(String url, String key, String value) { + UrlBuilder builder = UrlBuilder.of(url, Charset.defaultCharset()); + // 先移除 + TableMap query = (TableMap) + ReflectUtil.getFieldValue(builder.getQuery(), "query"); + query.remove(key); + // 后添加 + builder.addQuery(key, value); + return builder.build(); + } + + private String append(String base, Map query, boolean fragment) { + return append(base, query, null, fragment); + } + + /** + * 拼接 URL + * + * copy from Spring Security OAuth2 的 AuthorizationEndpoint 类的 append 方法 + * + * @param base 基础 URL + * @param query 查询参数 + * @param keys query 的 key,对应的原本的 key 的映射。例如说 query 里有个 key 是 xx,实际它的 key 是 extra_xx,则通过 keys 里添加这个映射 + * @param fragment URL 的 fragment,即拼接到 # 中 + * @return 拼接后的 URL + */ + public static String append(String base, Map query, Map keys, boolean fragment) { + UriComponentsBuilder template = UriComponentsBuilder.newInstance(); + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(base); + URI redirectUri; + try { + // assume it's encoded to start with (if it came in over the wire) + redirectUri = builder.build(true).toUri(); + } catch (Exception e) { + // ... but allow client registrations to contain hard-coded non-encoded values + redirectUri = builder.build().toUri(); + builder = UriComponentsBuilder.fromUri(redirectUri); + } + template.scheme(redirectUri.getScheme()).port(redirectUri.getPort()).host(redirectUri.getHost()) + .userInfo(redirectUri.getUserInfo()).path(redirectUri.getPath()); + + if (fragment) { + StringBuilder values = new StringBuilder(); + if (redirectUri.getFragment() != null) { + String append = redirectUri.getFragment(); + values.append(append); + } + for (String key : query.keySet()) { + if (values.length() > 0) { + values.append("&"); + } + String name = key; + if (keys != null && keys.containsKey(key)) { + name = keys.get(key); + } + values.append(name).append("={").append(key).append("}"); + } + if (values.length() > 0) { + template.fragment(values.toString()); + } + UriComponents encoded = template.build().expand(query).encode(); + builder.fragment(encoded.getFragment()); + } else { + for (String key : query.keySet()) { + String name = key; + if (keys != null && keys.containsKey(key)) { + name = keys.get(key); + } + template.queryParam(name, "{" + key + "}"); + } + template.fragment(redirectUri.getFragment()); + UriComponents encoded = template.build().expand(query).encode(); + builder.query(encoded.getQuery()); + } + return builder.build().toUriString(); + } + + public static String[] obtainBasicAuthorization(HttpServletRequest request) { + String clientId; + String clientSecret; + // 先从 Header 中获取 + String authorization = request.getHeader("Authorization"); + authorization = StrUtil.subAfter(authorization, "Basic ", true); + if (StringUtils.hasText(authorization)) { + authorization = Base64.decodeStr(authorization); + clientId = StrUtil.subBefore(authorization, ":", false); + clientSecret = StrUtil.subAfter(authorization, ":", false); + // 再从 Param 中获取 + } else { + clientId = request.getParameter("client_id"); + clientSecret = request.getParameter("client_secret"); + } + + // 如果两者非空,则返回 + if (StrUtil.isNotEmpty(clientId) && StrUtil.isNotEmpty(clientSecret)) { + return new String[]{clientId, clientSecret}; + } + return null; + } + + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/http/SoapUtil.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/http/SoapUtil.java new file mode 100644 index 0000000..09b7aae --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/http/SoapUtil.java @@ -0,0 +1,67 @@ +package com.jojubanking.boot.framework.common.util.http; + +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.methods.PostMethod; + + +/** + * 访问远程SOAP Web Service 协议接口 + */ +public class SoapUtil { + //外网测试地址 +// private static String url = "http://222.128.90.115:8010/BtGhYytWebService.asmx"; + //测试库地址 +// private static String url = "http://192.168.150.17:8002/BtGhYytWebService.asmx"; + + //生成库地址 +// private static String url = "http://192.168.150.15:8001/BtGhYytWebService.asmx"; + private static String url = "http://101.132.179.117/webservice/WebService.asmx"; + + /** + * @param xml + * @return + * @throws Exception + */ + public static String soapMethod(String xml) throws Exception { + HttpClient client = new HttpClient(); + PostMethod method = new PostMethod(url); + // 设置请求头头 + method.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); + // 设置请求体 + method.setRequestBody(xml); + // 获取响应状态码 + int code = client.executeMethod(method); + if (code == 200) { + return method.getResponseBodyAsString(); + } else { + throw ServiceExceptionUtil.exception(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR); +// throw new LogicException("异常,请联系管理员。"); + } + } + + /** + * 定时任务发送请求 + * + * @param xml + * @return + * @throws Exception + */ + public static String taskSoapMethod(String xml) throws Exception { + HttpClient client = new HttpClient(); + PostMethod method = new PostMethod(url); + // 设置请求头头 + method.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); + // 设置请求体 + method.setRequestBody(xml); + // 获取响应状态码 + int code = client.executeMethod(method); + if (code == 200) { + return method.getResponseBodyAsString(); + } else { + return ""; + } + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/io/FileUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/io/FileUtils.java new file mode 100644 index 0000000..b6ccf4f --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/io/FileUtils.java @@ -0,0 +1,84 @@ +package com.jojubanking.boot.framework.common.util.io; + +import cn.hutool.core.io.FileTypeUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; +import lombok.SneakyThrows; + +import java.io.ByteArrayInputStream; +import java.io.File; + +/** + * 文件工具类 + * + * @author TW + */ +public class FileUtils { + + /** + * 创建临时文件 + * 该文件会在 JVM 退出时,进行删除 + * + * @param data 文件内容 + * @return 文件 + */ + @SneakyThrows + public static File createTempFile(String data) { + File file = createTempFile(); + // 写入内容 + FileUtil.writeUtf8String(data, file); + return file; + } + + /** + * 创建临时文件 + * 该文件会在 JVM 退出时,进行删除 + * + * @param data 文件内容 + * @return 文件 + */ + @SneakyThrows + public static File createTempFile(byte[] data) { + File file = createTempFile(); + // 写入内容 + FileUtil.writeBytes(data, file); + return file; + } + + /** + * 创建临时文件,无内容 + * 该文件会在 JVM 退出时,进行删除 + * + * @return 文件 + */ + @SneakyThrows + public static File createTempFile() { + // 创建文件,通过 UUID 保证唯一 + File file = File.createTempFile(IdUtil.simpleUUID(), null); + // 标记 JVM 退出时,自动删除 + file.deleteOnExit(); + return file; + } + + /** + * 生成文件路径 + * + * @param content 文件内容 + * @param originalName 原始文件名 + * @return path,唯一不可重复 + */ + public static String generatePath(byte[] content, String originalName) { + String sha256Hex = DigestUtil.sha256Hex(content); + // 情况一:如果存在 name,则优先使用 name 的后缀 + if (StrUtil.isNotBlank(originalName)) { + String extName = FileNameUtil.extName(originalName); + return StrUtil.isBlank(extName) ? sha256Hex : sha256Hex + "." + extName; + } + // 情况二:基于 content 计算 + return sha256Hex + '.' + FileTypeUtil.getType(new ByteArrayInputStream(content)); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/io/IoUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/io/IoUtils.java new file mode 100644 index 0000000..25db556 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/io/IoUtils.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.framework.common.util.io; + +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; + +import java.io.InputStream; + +/** + * IO 工具类,用于 {@link cn.hutool.core.io.IoUtil} 缺失的方法 + * + * @author TW + */ +public class IoUtils { + + /** + * 从流中读取 UTF8 编码的内容 + * + * @param in 输入流 + * @param isClose 是否关闭 + * @return 内容 + * @throws IORuntimeException IO 异常 + */ + public static String readUtf8(InputStream in, boolean isClose) throws IORuntimeException { + return StrUtil.utf8Str(IoUtil.read(in, isClose)); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/json/JsonUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/json/JsonUtils.java new file mode 100644 index 0000000..5187277 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/json/JsonUtils.java @@ -0,0 +1,142 @@ +package com.jojubanking.boot.framework.common.util.json; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import lombok.SneakyThrows; +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * JSON 工具类 + * + * @author TW + */ +@UtilityClass +@Slf4j +public class JsonUtils { + + private static ObjectMapper objectMapper = new ObjectMapper(); + + static { + objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + } + + /** + * 初始化 objectMapper 属性 + *

+ * 通过这样的方式,使用 Spring 创建的 ObjectMapper Bean + * + * @param objectMapper ObjectMapper 对象 + */ + public static void init(ObjectMapper objectMapper) { + JsonUtils.objectMapper = objectMapper; + } + + @SneakyThrows + public static String toJsonString(Object object) { + return objectMapper.writeValueAsString(object); + } + + @SneakyThrows + public static byte[] toJsonByte(Object object) { + return objectMapper.writeValueAsBytes(object); + } + + @SneakyThrows + public static String toJsonPrettyString(Object object) { + return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); + } + + public static T parseObject(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return null; + } + try { + return objectMapper.readValue(text, clazz); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + /** + * 将字符串解析成指定类型的对象 + * 使用 {@link #parseObject(String, Class)} 时,在@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 的场景下, + * 如果 text 没有 class 属性,则会报错。此时,使用这个方法,可以解决。 + * + * @param text 字符串 + * @param clazz 类型 + * @return 对象 + */ + public static T parseObject2(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return null; + } + return JSONUtil.toBean(text, clazz); + } + + public static T parseObject(byte[] bytes, Class clazz) { + if (ArrayUtil.isEmpty(bytes)) { + return null; + } + try { + return objectMapper.readValue(bytes, clazz); + } catch (IOException e) { + log.error("json parse err,json:{}", bytes, e); + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, TypeReference typeReference) { + try { + return objectMapper.readValue(text, typeReference); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static List parseArray(String text, Class clazz) { + if (StrUtil.isEmpty(text)) { + return new ArrayList<>(); + } + try { + return objectMapper.readValue(text, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static JsonNode parseTree(String text) { + try { + return objectMapper.readTree(text); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static JsonNode parseTree(byte[] text) { + try { + return objectMapper.readTree(text); + } catch (IOException e) { + log.error("json parse err,json:{}", text, e); + throw new RuntimeException(e); + } + } + + public static boolean isJson(String text) { + return JSONUtil.isTypeJSON(text); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/monitor/TracerUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/monitor/TracerUtils.java new file mode 100644 index 0000000..32eda4a --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/monitor/TracerUtils.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.framework.common.util.monitor; + +import org.apache.skywalking.apm.toolkit.trace.TraceContext; + +/** + * 链路追踪工具类 + * + * 考虑到每个 starter 都需要用到该工具类,所以放到 common 模块下的 util 包下 + * + * @author TW + */ +public class TracerUtils { + + /** + * 私有化构造方法 + */ + private TracerUtils() { + } + + /** + * 获得链路追踪编号,直接返回 SkyWalking 的 TraceId。 + * 如果不存在的话为空字符串!!! + * + * @return 链路追踪编号 + */ + public static String getTraceId() { + return TraceContext.traceId(); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/number/NumberUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/number/NumberUtils.java new file mode 100644 index 0000000..0b4f318 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/number/NumberUtils.java @@ -0,0 +1,16 @@ +package com.jojubanking.boot.framework.common.util.number; + +import cn.hutool.core.util.StrUtil; + +/** + * 数字的工具类,补全 {@link cn.hutool.core.util.NumberUtil} 的功能 + * + * @author TW + */ +public class NumberUtils { + + public static Long parseLong(String str) { + return StrUtil.isNotEmpty(str) ? Long.valueOf(str) : null; + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/object/ObjectUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/object/ObjectUtils.java new file mode 100644 index 0000000..f1af84a --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/object/ObjectUtils.java @@ -0,0 +1,63 @@ +package com.jojubanking.boot.framework.common.util.object; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Objects; +import java.util.function.Consumer; + +/** + * Object 工具类 + * + * @author TW + */ +public class ObjectUtils { + + /** + * 复制对象,并忽略 Id 编号 + * + * @param object 被复制对象 + * @param consumer 消费者,可以二次编辑被复制对象 + * @return 复制后的对象 + */ + public static T cloneIgnoreId(T object, Consumer consumer) { + T result = ObjectUtil.clone(object); + // 忽略 id 编号 + Field field = ReflectUtil.getField(object.getClass(), "id"); + if (field != null) { + ReflectUtil.setFieldValue(result, field, null); + } + // 二次编辑 + if (result != null) { + consumer.accept(result); + } + return result; + } + + public static > T max(T obj1, T obj2) { + if (obj1 == null) { + return obj2; + } + if (obj2 == null) { + return obj1; + } + return obj1.compareTo(obj2) > 0 ? obj1 : obj2; + } + + public static T defaultIfNull(T... array) { + for (T item : array) { + if (item != null) { + return item; + } + } + return null; + } + + public static boolean equalsAny(T obj, T... array) { + return Arrays.asList(array).contains(obj); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/object/PageUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/object/PageUtils.java new file mode 100644 index 0000000..b48278d --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/object/PageUtils.java @@ -0,0 +1,16 @@ +package com.jojubanking.boot.framework.common.util.object; + +import com.jojubanking.boot.framework.common.pojo.PageParam; + +/** + * {@link PageParam} 工具类 + * + * @author TW + */ +public class PageUtils { + + public static int getStart(PageParam pageParam) { + return (pageParam.getPageNo() - 1) * pageParam.getPageSize(); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/package-info.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/package-info.java new file mode 100644 index 0000000..1d1ec7c --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/package-info.java @@ -0,0 +1,7 @@ +/** + * 对于工具类的选择,优先查找 Hutool 中有没对应的方法 + * 如果没有,则自己封装对应的工具类,以 Utils 结尾,用于区分 + * + * ps:如果担心 Hutool 存在坑的问题,可以阅读 Hutool 的实现源码,以确保可靠性。并且,可以补充相关的单元测试。 + */ +package com.jojubanking.boot.framework.common.util; diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/servlet/ServletUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/servlet/ServletUtils.java new file mode 100644 index 0000000..2317d1e --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/servlet/ServletUtils.java @@ -0,0 +1,95 @@ +package com.jojubanking.boot.framework.common.util.servlet; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.ServletUtil; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import org.springframework.http.MediaType; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; + +/** + * 客户端工具类 + * + * @author TW + */ +public class ServletUtils { + + /** + * 返回 JSON 字符串 + * + * @param response 响应 + * @param object 对象,会序列化成 JSON 字符串 + */ + @SuppressWarnings("deprecation") // 必须使用 APPLICATION_JSON_UTF8_VALUE,否则会乱码 + public static void writeJSON(HttpServletResponse response, Object object) { + String content = JsonUtils.toJsonString(object); + ServletUtil.write(response, content, MediaType.APPLICATION_JSON_UTF8_VALUE); + } + + /** + * 返回附件 + * + * @param response 响应 + * @param filename 文件名 + * @param content 附件内容 + * @throws IOException + */ + public static void writeAttachment(HttpServletResponse response, String filename, byte[] content) throws IOException { + // 设置 header 和 contentType + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + // 输出附件 + IoUtil.write(response.getOutputStream(), false, content); + } + + /** + * @param request 请求 + * @return ua + */ + public static String getUserAgent(HttpServletRequest request) { + String ua = request.getHeader("User-Agent"); + return ua != null ? ua : ""; + } + + /** + * 获得请求 + * + * @return HttpServletRequest + */ + public static HttpServletRequest getRequest() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (!(requestAttributes instanceof ServletRequestAttributes)) { + return null; + } + return ((ServletRequestAttributes) requestAttributes).getRequest(); + } + + public static String getUserAgent() { + HttpServletRequest request = getRequest(); + if (request == null) { + return null; + } + return getUserAgent(request); + } + + public static String getClientIP() { + HttpServletRequest request = getRequest(); + if (request == null) { + return null; + } + return ServletUtil.getClientIP(request); + } + + public static boolean isJsonRequest(ServletRequest request) { + return StrUtil.startWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/spring/SpringAopUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/spring/SpringAopUtils.java new file mode 100644 index 0000000..a164593 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/spring/SpringAopUtils.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.framework.common.util.spring; + +import cn.hutool.core.bean.BeanUtil; +import org.springframework.aop.framework.AdvisedSupport; +import org.springframework.aop.framework.AopProxy; +import org.springframework.aop.support.AopUtils; + +/** + * Spring AOP 工具类 + * + * 参考波克尔 http://www.bubuko.com/infodetail-3471885.html 实现 + */ +public class SpringAopUtils { + + /** + * 获取代理的目标对象 + * + * @param proxy 代理对象 + * @return 目标对象 + */ + public static Object getTarget(Object proxy) throws Exception { + // 不是代理对象 + if (!AopUtils.isAopProxy(proxy)) { + return proxy; + } + // Jdk 代理 + if (AopUtils.isJdkDynamicProxy(proxy)) { + return getJdkDynamicProxyTargetObject(proxy); + } + // Cglib 代理 + return getCglibProxyTargetObject(proxy); + } + + private static Object getCglibProxyTargetObject(Object proxy) throws Exception { + Object dynamicAdvisedInterceptor = BeanUtil.getFieldValue(proxy, "CGLIB$CALLBACK_0"); + AdvisedSupport advisedSupport = (AdvisedSupport) BeanUtil.getFieldValue(dynamicAdvisedInterceptor, "advised"); + return advisedSupport.getTargetSource().getTarget(); + } + + private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception { + AopProxy aopProxy = (AopProxy) BeanUtil.getFieldValue(proxy, "h"); + AdvisedSupport advisedSupport = (AdvisedSupport) BeanUtil.getFieldValue(aopProxy, "advised"); + return advisedSupport.getTargetSource().getTarget(); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/spring/SpringExpressionUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/spring/SpringExpressionUtils.java new file mode 100644 index 0000000..5a8cf4f --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/spring/SpringExpressionUtils.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.framework.common.util.spring; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.DefaultParameterNameDiscoverer; +import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.expression.EvaluationContext; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * Spring EL 表达式的工具类 + * + * @author mashu + */ +public class SpringExpressionUtils { + + private static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser(); + private static final ParameterNameDiscoverer PARAMETER_NAME_DISCOVERER = new DefaultParameterNameDiscoverer(); + + private SpringExpressionUtils() { + } + + /** + * 从切面中,单个解析 EL 表达式的结果 + * + * @param joinPoint 切面点 + * @param expressionString EL 表达式数组 + * @return 执行界面 + */ + public static Object parseExpression(ProceedingJoinPoint joinPoint, String expressionString) { + Map result = parseExpressions(joinPoint, Collections.singletonList(expressionString)); + return result.get(expressionString); + } + + /** + * 从切面中,批量解析 EL 表达式的结果 + * + * @param joinPoint 切面点 + * @param expressionStrings EL 表达式数组 + * @return 结果,key 为表达式,value 为对应值 + */ + public static Map parseExpressions(ProceedingJoinPoint joinPoint, List expressionStrings) { + // 如果为空,则不进行解析 + if (CollUtil.isEmpty(expressionStrings)) { + return MapUtil.newHashMap(); + } + + // 第一步,构建解析的上下文 EvaluationContext + // 通过 joinPoint 获取被注解方法 + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); + Method method = methodSignature.getMethod(); + // 使用 spring 的 ParameterNameDiscoverer 获取方法形参名数组 + String[] paramNames = PARAMETER_NAME_DISCOVERER.getParameterNames(method); + // Spring 的表达式上下文对象 + EvaluationContext context = new StandardEvaluationContext(); + // 给上下文赋值 + if (ArrayUtil.isNotEmpty(paramNames)) { + Object[] args = joinPoint.getArgs(); + for (int i = 0; i < paramNames.length; i++) { + context.setVariable(paramNames[i], args[i]); + } + } + + // 第二步,逐个参数解析 + Map result = MapUtil.newHashMap(expressionStrings.size(), true); + expressionStrings.forEach(key -> { + Object value = EXPRESSION_PARSER.parseExpression(key).getValue(context); + result.put(key, value); + }); + return result; + } +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/string/StrUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/string/StrUtils.java new file mode 100644 index 0000000..8a4a8e2 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/string/StrUtils.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.framework.common.util.string; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; + +import java.util.Collection; + +/** + * 字符串工具类 + * + * @author TW + */ +public class StrUtils { + + public static String maxLength(CharSequence str, int maxLength) { + return StrUtil.maxLength(str, maxLength - 3); // -3 的原因,是该方法会补充 ... 恰好 + } + + /** + * 给定字符串是否以任何一个字符串开始 + * 给定字符串和数组为空都返回 false + * + * @param str 给定字符串 + * @param prefixes 需要检测的开始字符串 + * @since 3.0.6 + */ + public static boolean startWithAny(String str, Collection prefixes) { + if (StrUtil.isEmpty(str) || ArrayUtil.isEmpty(prefixes)) { + return false; + } + + for (CharSequence suffix : prefixes) { + if (StrUtil.startWith(str, suffix, false)) { + return true; + } + } + return false; + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/validation/ValidationUtils.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/validation/ValidationUtils.java new file mode 100644 index 0000000..930b1e3 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/validation/ValidationUtils.java @@ -0,0 +1,49 @@ +package com.jojubanking.boot.framework.common.util.validation; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import org.springframework.util.StringUtils; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validator; +import java.util.Set; +import java.util.regex.Pattern; + +/** + * 校验工具类 + * + * @author TW + */ +public class ValidationUtils { + + private static final Pattern PATTERN_URL = Pattern.compile("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"); + + private static final Pattern PATTERN_XML_NCNAME = Pattern.compile("[a-zA-Z_][\\-_.0-9_a-zA-Z$]*"); + + public static boolean isMobile(String mobile) { + if (StrUtil.length(mobile) != 11) { + return false; + } + // TODO TW,后面完善手机校验 + return true; + } + + public static boolean isURL(String url) { + return StringUtils.hasText(url) + && PATTERN_URL.matcher(url).matches(); + } + + public static boolean isXmlNCName(String str) { + return StringUtils.hasText(str) + && PATTERN_XML_NCNAME.matcher(str).matches(); + } + + public static void validate(Validator validator, Object object, Class... groups) { + Set> constraintViolations = validator.validate(object, groups); + if (CollUtil.isNotEmpty(constraintViolations)) { + throw new ConstraintViolationException(constraintViolations); + } + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/xml/XmlUtil.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/xml/XmlUtil.java new file mode 100644 index 0000000..78703e2 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/util/xml/XmlUtil.java @@ -0,0 +1,283 @@ +package com.jojubanking.boot.framework.common.util.xml; + +import org.apache.commons.lang3.StringEscapeUtils; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; + +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.List; +import java.util.*; + +public class XmlUtil { +// public static void main(String[] args) { +// Reserve8Vo vo = new Reserve8Vo(); +// System.out.println(getOpAppAppoint(vo)); +// } + + /** + * 省份证的正则表达式^(\d{15}|\d{17}[\dx])$ + * + * @param id 省份证号 + * @return 生日(yyyy-MM-dd) + */ + public static String extractYearMonthDayOfIdCard(String id) { + String year = null; + String month = null; + String day = null; + //正则匹配身份证号是否是正确的,15位或者17位数字+数字/x/X + if (id.matches("^\\d{15}|\\d{17}[\\dxX]$")) { + year = id.substring(6, 10); + month = id.substring(10, 12); + day = id.substring(12, 14); + } else { + System.out.println("身份证号码不匹配!"); + return null; + } + return year + "-" + month + "-" + day; + } + + // 获取返回的报文统一处理 +// public static Map map = new HashMap(); + + public static Map parse(String soap) throws DocumentException { + //map.clear(); + String soapWeb = StringEscapeUtils.unescapeXml(soap); + soapWeb = soapWeb.replace("", ""); + Document doc = DocumentHelper.parseText(soapWeb);// 报文 转成 xml + Element root = doc.getRootElement();//获取根元素,准备递归解析这个XML树 + + Map map = getCodeNC(root); + return map; + } + + // 非递归遍历所有的 节点 和 数据 + public static Map getCodeNC(Element root) { + Map map = new HashMap(); + + Stack a = null; + a = new Stack<>(); + a.push(root); + + if (root.elements().size() == 0 || root.elements() == null) { + return map; + } + //top 是栈顶元素 + Element top = null; + while (!a.empty()) { + top = (Element) a.peek(); + a.pop(); + + //如果当前跟节点有子节点,找到子节点 + List list = top.elements(); + int size = top.elements().size(); + + for (Element e : list) { + //遍历每个节点 + if (e.elements().size() > 0) { + //对栈顶元素进行反向遍历,入栈 + a.push((Element) e); + } + if (e.elements().size() == 0) { + map.put(e.getName(), e.getTextTrim()); + }//如果为叶子节点,那么直接把名称和值放入map + } + } + + return map; + } + +// // 递归遍历所有的 节点 和 数据 +// public static Map getCode(Element root) { +// // Map map = new HashMap(); +// +// if (root.elements() != null) { +// List list = root.elements();//如果当前跟节点有子节点,找到子节点 +// for (Element e : list) {//遍历每个节点 +// if (e.elements().size() > 0) { +// getCode(e);//当前节点不为空的话,递归遍历子节点; +// } +// if (e.elements().size() == 0) { +// map.put(e.getName(), e.getTextTrim()); +// }//如果为叶子节点,那么直接把名称和值放入map +// } +// } +// return map; +// } +// + public static List> getPacsRes(String soap, String name) throws DocumentException { + String res1 = name + "Response"; + String res2 = name + "Result"; + String soapWeb = org.apache.commons.lang.StringEscapeUtils.unescapeXml(soap); + soapWeb = soapWeb.replace("", ""); + // 字符串转xml + Document doc = DocumentHelper.parseText(soapWeb); + + //获取根节点 + Element root = doc.getRootElement(); + Element body = root.element("Body").element(res1).element(res2).element("response"); + + Element elresult = body.element("returnresult"); + Element eldata = body.element("data"); + + System.out.println("根节点 为 : " + elresult.element("returncode").getText()); + + List> list = new ArrayList>(); + //判断返回值 + String soapcode = elresult.element("returncode").getText(); + if (soapcode.equals("1")) { + // 获取Body下的所有子节点 + + List bodyChild = eldata.elements(); + for (Iterator it = bodyChild.iterator(); it.hasNext(); ) { + Map soapMap = new HashMap(); + soapMap.put("returncode", soapcode); + + Element elm1 = (Element) it.next(); + List responseChild = elm1.elements(); + for (Iterator it1 = responseChild.iterator(); it1.hasNext(); ) { + Element elm2 = (Element) it1.next(); + soapMap.put(elm2.getName(), elm2.getTextTrim()); + } + + list.add(soapMap); + } + } else { + Map soapMap = new HashMap(); + soapMap.put("returncode", soapcode); + soapMap.put("errormsg", elresult.element("errormsg").getText()); + list.add(soapMap); + } + return list; + } + + /** + * 定时任务解析 xml + */ + public static List> getTasks(String soap) throws DocumentException { + String soapWeb = StringEscapeUtils.unescapeXml(soap); + soapWeb = soapWeb.replace("", ""); + Document doc = DocumentHelper.parseText(soapWeb); // 字符串转xml + Element root = doc.getRootElement();//获取根节点 + Element body = root.element("Body"); // 获取所需节点 + Element response = body.element("queryAppRegistRecordsNewResponse"); + Element result = response.element("queryAppRegistRecordsNewResult"); + Element Response = result.element("Response"); + + String Result_Code = Response.elementTextTrim("Result_Code"); + + List> list = new ArrayList>(); + if (Result_Code.equals("0000")) { + Element resultData = Response.element("Result_Data"); + Element recordList = resultData.element("Record_List"); + List elements = recordList.elements(); + Iterator iterator = elements.iterator(); + while (iterator.hasNext()) { + Element element = iterator.next(); + Map soapMap = new HashMap(); + soapMap.put("Result_Code", "0000"); + soapMap.put("HIS_ORDER_NO", element.elementTextTrim("HIS_ORDER_NO")); // 交易流水号 + soapMap.put("REGIST_TYPE", element.elementTextTrim("REGIST_TYPE")); // 预约单状态 1 已退费 0 正常 + soapMap.put("ALLOWREFUNDFLAG", element.elementTextTrim("ALLOWREFUNDFLAG")); // 允许退号标志 N 不允许 Y 允许 + list.add(soapMap); + } + } else { + Map soapMap = new HashMap(); + soapMap.put("Result_Code", Result_Code); + soapMap.put("Error_Msg", Response.elementTextTrim("Error_Msg")); + list.add(soapMap); + } + return list; + } + + /** + * 查询解析xml + */ + + public static List> getDeptQueryXml(String resp1, String resp2, String soap) throws DocumentException { + String soapWeb = StringEscapeUtils.unescapeXml(soap); + soapWeb = soapWeb.replace("", ""); + Document doc = DocumentHelper.parseText(soapWeb); // 字符串转xml + Element root = doc.getRootElement();//获取根节点 + Element body = root.element("Body"); // 获取所需节点 + Element response = body.element(resp1); + Element result = response.element(resp2); + Element Response = result.element("Response"); + + String Result_Code = Response.elementTextTrim("Result_Code"); + + List> list = new ArrayList>(); + if (Result_Code.equals("0000")) { + Element resultData = Response.element("Result_Data"); + Element recordList = resultData.element("Record_List"); + List elements = recordList.elements(); + Iterator iterator = elements.iterator(); + while (iterator.hasNext()) { + Element element = iterator.next(); + Map soapMap = new HashMap(); + soapMap.put("Result_Code", "0000"); + soapMap.put("DEPT_CODE", element.elementTextTrim("DEPT_CODE")); + soapMap.put("DEPT_NAME", element.elementTextTrim("DEPT_NAME")); + soapMap.put("IS_ONLINE", element.elementTextTrim("IS_ONLINE")); + list.add(soapMap); + } + } else { + Map soapMap = new HashMap(); + soapMap.put("Result_Code", Result_Code); + soapMap.put("Error_Msg", Response.elementTextTrim("Error_Msg")); + list.add(soapMap); + } + return list; + } + + public static List> getHidsQueryXml(String resp1, String resp2, String soap) throws DocumentException { + String soapWeb = StringEscapeUtils.unescapeXml(soap); + soapWeb = soapWeb.replace("", ""); + Document doc = DocumentHelper.parseText(soapWeb); // 字符串转xml + Element root = doc.getRootElement();//获取根节点 + Element body = root.element("Body"); // 获取所需节点 + Element response = body.element(resp1); + Element result = response.element(resp2); + Element Response = result.element("Response"); + + String Result_Code = Response.elementTextTrim("Result_Code"); + + List> list = new ArrayList>(); + if (Result_Code.equals("0000")) { + Element resultData = Response.element("Result_Data"); + Element recordList = resultData.element("Record_List"); + List elements = recordList.elements(); + Iterator iterator = elements.iterator(); + while (iterator.hasNext()) { + Element element = iterator.next(); + Map soapMap = new HashMap(); + soapMap.put("Result_Code", "0000"); + soapMap.put("HID", element.elementTextTrim("HID")); + soapMap.put("DEPT_CODE", element.elementTextTrim("DEPT_CODE")); + soapMap.put("DOCTOR_CODE", element.elementTextTrim("DOCTOR_CODE")); + soapMap.put("DOCTOR_NAME", element.elementTextTrim("DOCTOR_NAME")); + soapMap.put("CLINIC_DATE", element.elementTextTrim("CLINIC_DATE")); + soapMap.put("HB_TIME", element.elementTextTrim("HB_TIME")); + soapMap.put("CLINIC_DURATION", element.elementTextTrim("CLINIC_DURATION")); + soapMap.put("REGISTERED_FEE", element.elementTextTrim("REGISTERED_FEE")); + soapMap.put("PHARMACY_FEE", element.elementTextTrim("PHARMACY_FEE")); + soapMap.put("DIAG_FEE", element.elementTextTrim("DIAG_FEE")); + soapMap.put("IS_ONLINE", element.elementTextTrim("IS_ONLINE")); + soapMap.put("HB_TYPE", element.elementTextTrim("HB_TYPE")); + list.add(soapMap); + } + } else { + Map soapMap = new HashMap(); + soapMap.put("Result_Code", Result_Code); + soapMap.put("Error_Msg", Response.elementTextTrim("Error_Msg")); + list.add(soapMap); + } + return list; + } +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/InEnum.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/InEnum.java new file mode 100644 index 0000000..89f3fc9 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/InEnum.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.framework.common.validation; + +import com.jojubanking.boot.framework.common.core.IntArrayValuable; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Target({ + ElementType.METHOD, + ElementType.FIELD, + ElementType.ANNOTATION_TYPE, + ElementType.CONSTRUCTOR, + ElementType.PARAMETER, + ElementType.TYPE_USE +}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint( + validatedBy = InEnumValidator.class +) +public @interface InEnum { + + /** + * @return 实现 EnumValuable 接口的 + */ + Class value(); + + String message() default "必须在指定范围 {value}"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/InEnumValidator.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/InEnumValidator.java new file mode 100644 index 0000000..be9b15f --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/InEnumValidator.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.framework.common.validation; + +import com.jojubanking.boot.framework.common.core.IntArrayValuable; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class InEnumValidator implements ConstraintValidator { + + private List values; + + @Override + public void initialize(InEnum annotation) { + IntArrayValuable[] values = annotation.value().getEnumConstants(); + if (values.length == 0) { + this.values = Collections.emptyList(); + } else { + this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toList()); + } + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + // 为空时,默认不校验,即认为通过 + if (value == null) { + return true; + } + // 校验通过 + if (values.contains(value)) { + return true; + } + // 校验不通过,自定义提示语句(因为,注解上的 value 是枚举类,无法获得枚举类的实际值) + context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值 + context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate() + .replaceAll("\\{value}", values.toString())).addConstraintViolation(); // 重新添加错误提示语句 + return false; + } + +} + diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/Mobile.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/Mobile.java new file mode 100644 index 0000000..24662c3 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/Mobile.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.framework.common.validation; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Target({ + ElementType.METHOD, + ElementType.FIELD, + ElementType.ANNOTATION_TYPE, + ElementType.CONSTRUCTOR, + ElementType.PARAMETER, + ElementType.TYPE_USE +}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint( + validatedBy = MobileValidator.class +) +public @interface Mobile { + + String message() default "手机号格式不正确"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/MobileValidator.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/MobileValidator.java new file mode 100644 index 0000000..b3f11d7 --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/MobileValidator.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.framework.common.validation; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.util.validation.ValidationUtils; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +public class MobileValidator implements ConstraintValidator { + + @Override + public void initialize(Mobile annotation) { + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + // 如果手机号为空,默认不校验,即校验通过 + if (StrUtil.isEmpty(value)) { + return true; + } + // 校验手机 + return ValidationUtils.isMobile(value); + } + +} diff --git a/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/package-info.java b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/package-info.java new file mode 100644 index 0000000..36a002f --- /dev/null +++ b/joju-framework/joju-common/src/main/java/com/jojubanking/boot/framework/common/validation/package-info.java @@ -0,0 +1,4 @@ +/** + * 使用 Hibernate Validator 实现参数校验 + */ +package com.jojubanking.boot.framework.common.validation; diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/core/IntArrayValuable.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/core/IntArrayValuable.class new file mode 100644 index 0000000..a48ab27 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/core/IntArrayValuable.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/core/KeyValue.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/core/KeyValue.class new file mode 100644 index 0000000..edd9e68 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/core/KeyValue.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/enums/CommonStatusEnum.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/enums/CommonStatusEnum.class new file mode 100644 index 0000000..d6c5a62 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/enums/CommonStatusEnum.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/enums/DocumentEnum.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/enums/DocumentEnum.class new file mode 100644 index 0000000..53ba9c1 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/enums/DocumentEnum.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/enums/UserTypeEnum.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/enums/UserTypeEnum.class new file mode 100644 index 0000000..c58a53a Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/enums/UserTypeEnum.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/enums/WebFilterOrderEnum.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/enums/WebFilterOrderEnum.class new file mode 100644 index 0000000..ef938a4 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/enums/WebFilterOrderEnum.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/ErrorCode.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/ErrorCode.class new file mode 100644 index 0000000..f632eab Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/ErrorCode.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/ServerException.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/ServerException.class new file mode 100644 index 0000000..d79c0a8 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/ServerException.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/ServiceException.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/ServiceException.class new file mode 100644 index 0000000..2604a92 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/ServiceException.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/enums/GlobalErrorCodeConstants.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/enums/GlobalErrorCodeConstants.class new file mode 100644 index 0000000..0e43cb2 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/enums/GlobalErrorCodeConstants.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/enums/ServiceErrorCodeRange.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/enums/ServiceErrorCodeRange.class new file mode 100644 index 0000000..5ab7042 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/enums/ServiceErrorCodeRange.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/util/ServiceExceptionUtil.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/util/ServiceExceptionUtil.class new file mode 100644 index 0000000..de078a2 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/exception/util/ServiceExceptionUtil.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/pojo/CommonResult.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/pojo/CommonResult.class new file mode 100644 index 0000000..07b72d8 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/pojo/CommonResult.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/pojo/PageParam.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/pojo/PageParam.class new file mode 100644 index 0000000..7020bba Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/pojo/PageParam.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/pojo/PageResult.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/pojo/PageResult.class new file mode 100644 index 0000000..926995e Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/pojo/PageResult.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/pojo/SortingField.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/pojo/SortingField.class new file mode 100644 index 0000000..7e352c1 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/pojo/SortingField.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/cache/CacheUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/cache/CacheUtils.class new file mode 100644 index 0000000..56568dc Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/cache/CacheUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/collection/ArrayUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/collection/ArrayUtils.class new file mode 100644 index 0000000..f1665de Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/collection/ArrayUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/collection/CollectionUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/collection/CollectionUtils.class new file mode 100644 index 0000000..46f616a Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/collection/CollectionUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/collection/MapUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/collection/MapUtils.class new file mode 100644 index 0000000..019cc91 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/collection/MapUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/collection/SetUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/collection/SetUtils.class new file mode 100644 index 0000000..30c455b Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/collection/SetUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/date/DateUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/date/DateUtils.class new file mode 100644 index 0000000..573f6e7 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/date/DateUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/http/HttpUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/http/HttpUtils.class new file mode 100644 index 0000000..a20c8e7 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/http/HttpUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/http/SoapUtil.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/http/SoapUtil.class new file mode 100644 index 0000000..13e1474 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/http/SoapUtil.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/io/FileUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/io/FileUtils.class new file mode 100644 index 0000000..d7fead8 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/io/FileUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/io/IoUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/io/IoUtils.class new file mode 100644 index 0000000..b8b90e9 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/io/IoUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/json/JsonUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/json/JsonUtils.class new file mode 100644 index 0000000..cbefa2b Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/json/JsonUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/monitor/TracerUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/monitor/TracerUtils.class new file mode 100644 index 0000000..51fce28 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/monitor/TracerUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/number/NumberUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/number/NumberUtils.class new file mode 100644 index 0000000..682086c Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/number/NumberUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/object/ObjectUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/object/ObjectUtils.class new file mode 100644 index 0000000..9e45863 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/object/ObjectUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/object/PageUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/object/PageUtils.class new file mode 100644 index 0000000..cba5f9f Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/object/PageUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/servlet/ServletUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/servlet/ServletUtils.class new file mode 100644 index 0000000..652d5b4 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/servlet/ServletUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/spring/SpringAopUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/spring/SpringAopUtils.class new file mode 100644 index 0000000..578151a Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/spring/SpringAopUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/spring/SpringExpressionUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/spring/SpringExpressionUtils.class new file mode 100644 index 0000000..d272309 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/spring/SpringExpressionUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/string/StrUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/string/StrUtils.class new file mode 100644 index 0000000..d6863e6 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/string/StrUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/validation/ValidationUtils.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/validation/ValidationUtils.class new file mode 100644 index 0000000..7ce8d7c Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/validation/ValidationUtils.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/xml/XmlUtil.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/xml/XmlUtil.class new file mode 100644 index 0000000..5da1c2d Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/util/xml/XmlUtil.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/validation/InEnum.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/validation/InEnum.class new file mode 100644 index 0000000..01308ae Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/validation/InEnum.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/validation/InEnumValidator.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/validation/InEnumValidator.class new file mode 100644 index 0000000..c3f4b81 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/validation/InEnumValidator.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/validation/Mobile.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/validation/Mobile.class new file mode 100644 index 0000000..1274ab5 Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/validation/Mobile.class differ diff --git a/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/validation/MobileValidator.class b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/validation/MobileValidator.class new file mode 100644 index 0000000..165215c Binary files /dev/null and b/joju-framework/joju-common/target/classes/com/jojubanking/boot/framework/common/validation/MobileValidator.class differ diff --git a/joju-framework/joju-common/target/joju-common-2.0.0-beta.jar b/joju-framework/joju-common/target/joju-common-2.0.0-beta.jar new file mode 100644 index 0000000..4c7f841 Binary files /dev/null and b/joju-framework/joju-common/target/joju-common-2.0.0-beta.jar differ diff --git a/joju-framework/joju-common/target/maven-archiver/pom.properties b/joju-framework/joju-common/target/maven-archiver/pom.properties new file mode 100644 index 0000000..3776679 --- /dev/null +++ b/joju-framework/joju-common/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:22 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-common diff --git a/joju-framework/joju-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..f35c1e0 --- /dev/null +++ b/joju-framework/joju-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,41 @@ +com\jojubanking\boot\framework\common\util\number\NumberUtils.class +com\jojubanking\boot\framework\common\exception\ErrorCode.class +com\jojubanking\boot\framework\common\exception\util\ServiceExceptionUtil.class +com\jojubanking\boot\framework\common\util\validation\ValidationUtils.class +com\jojubanking\boot\framework\common\util\date\DateUtils.class +com\jojubanking\boot\framework\common\util\http\HttpUtils.class +com\jojubanking\boot\framework\common\pojo\PageResult.class +com\jojubanking\boot\framework\common\util\collection\ArrayUtils.class +com\jojubanking\boot\framework\common\exception\ServiceException.class +com\jojubanking\boot\framework\common\exception\enums\GlobalErrorCodeConstants.class +com\jojubanking\boot\framework\common\pojo\PageParam.class +com\jojubanking\boot\framework\common\util\spring\SpringExpressionUtils.class +com\jojubanking\boot\framework\common\util\io\IoUtils.class +com\jojubanking\boot\framework\common\validation\Mobile.class +com\jojubanking\boot\framework\common\util\io\FileUtils.class +com\jojubanking\boot\framework\common\util\json\JsonUtils.class +com\jojubanking\boot\framework\common\validation\MobileValidator.class +com\jojubanking\boot\framework\common\enums\UserTypeEnum.class +com\jojubanking\boot\framework\common\util\spring\SpringAopUtils.class +com\jojubanking\boot\framework\common\enums\DocumentEnum.class +com\jojubanking\boot\framework\common\util\servlet\ServletUtils.class +com\jojubanking\boot\framework\common\util\object\PageUtils.class +com\jojubanking\boot\framework\common\util\string\StrUtils.class +com\jojubanking\boot\framework\common\enums\WebFilterOrderEnum.class +com\jojubanking\boot\framework\common\util\object\ObjectUtils.class +com\jojubanking\boot\framework\common\enums\CommonStatusEnum.class +com\jojubanking\boot\framework\common\util\collection\MapUtils.class +com\jojubanking\boot\framework\common\util\collection\SetUtils.class +com\jojubanking\boot\framework\common\util\monitor\TracerUtils.class +com\jojubanking\boot\framework\common\exception\enums\ServiceErrorCodeRange.class +com\jojubanking\boot\framework\common\validation\InEnum.class +com\jojubanking\boot\framework\common\core\IntArrayValuable.class +com\jojubanking\boot\framework\common\pojo\CommonResult.class +com\jojubanking\boot\framework\common\util\cache\CacheUtils.class +com\jojubanking\boot\framework\common\util\xml\XmlUtil.class +com\jojubanking\boot\framework\common\core\KeyValue.class +com\jojubanking\boot\framework\common\util\collection\CollectionUtils.class +com\jojubanking\boot\framework\common\util\http\SoapUtil.class +com\jojubanking\boot\framework\common\validation\InEnumValidator.class +com\jojubanking\boot\framework\common\exception\ServerException.class +com\jojubanking\boot\framework\common\pojo\SortingField.class diff --git a/joju-framework/joju-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..67dccad --- /dev/null +++ b/joju-framework/joju-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,44 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\core\IntArrayValuable.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\spring\SpringAopUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\pojo\PageParam.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\enums\DocumentEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\pojo\PageResult.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\object\ObjectUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\core\KeyValue.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\collection\SetUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\xml\XmlUtil.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\exception\util\ServiceExceptionUtil.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\spring\SpringExpressionUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\http\HttpUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\exception\ServiceException.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\validation\ValidationUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\servlet\ServletUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\validation\InEnumValidator.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\enums\WebFilterOrderEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\pojo\CommonResult.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\json\JsonUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\validation\Mobile.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\date\DateUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\enums\CommonStatusEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\exception\enums\ServiceErrorCodeRange.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\string\StrUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\cache\CacheUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\exception\ServerException.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\io\FileUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\object\PageUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\exception\enums\GlobalErrorCodeConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\validation\MobileValidator.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\validation\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\exception\ErrorCode.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\pojo\SortingField.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\io\IoUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\validation\InEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\monitor\TracerUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\collection\CollectionUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\collection\ArrayUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\number\NumberUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\enums\UserTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\collection\MapUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-common\src\main\java\com\jojubanking\boot\framework\common\util\http\SoapUtil.java diff --git a/joju-framework/joju-framework.iml b/joju-framework/joju-framework.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-framework.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-banner/pom.xml b/joju-framework/joju-spring-boot-starter-banner/pom.xml new file mode 100644 index 0000000..5f2a8bf --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-banner/pom.xml @@ -0,0 +1,30 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-banner + jar + + ${project.artifactId} + Banner 用于在 console 控制台,打印开发文档、接口文档等 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + org.springframework.boot + spring-boot-starter + + + + diff --git a/joju-framework/joju-spring-boot-starter-banner/src/main/java/com/jojubanking/boot/framework/banner/config/JojuBannerAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-banner/src/main/java/com/jojubanking/boot/framework/banner/config/JojuBannerAutoConfiguration.java new file mode 100644 index 0000000..b3ee63b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-banner/src/main/java/com/jojubanking/boot/framework/banner/config/JojuBannerAutoConfiguration.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.framework.banner.config; + +import com.jojubanking.boot.framework.banner.core.BannerApplicationRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Banner 的自动配置类 + * + * @author TW + */ +@Configuration +public class JojuBannerAutoConfiguration { + + @Bean + public BannerApplicationRunner bannerApplicationRunner() { + return new BannerApplicationRunner(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-banner/src/main/java/com/jojubanking/boot/framework/banner/core/BannerApplicationRunner.java b/joju-framework/joju-spring-boot-starter-banner/src/main/java/com/jojubanking/boot/framework/banner/core/BannerApplicationRunner.java new file mode 100644 index 0000000..7ad3848 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-banner/src/main/java/com/jojubanking/boot/framework/banner/core/BannerApplicationRunner.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.framework.banner.core; + +import cn.hutool.core.thread.ThreadUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.util.ClassUtils; + +import java.util.concurrent.TimeUnit; + +/** + * 项目启动成功后,提供文档相关的地址 + * + * @author TW + */ +@Slf4j +public class BannerApplicationRunner implements ApplicationRunner { + + @Override + public void run(ApplicationArguments args) throws Exception { + ThreadUtil.execute(() -> { + ThreadUtil.sleep(1, TimeUnit.SECONDS); // 延迟 1 秒,保证输出到结尾 + log.info("\n----------------------------------------------------------\n\t" + + "项目启动成功!\n\t" + + "----------------------------------------------------------"); + + // 数据报表 + if (isNotPresent("com.jojubanking.boot.module.visualization.framework.security.config.SecurityConfiguration")) { + System.out.println("[报表模块 joju-module-visualization - 已禁用]"); + } + // 工作流 + if (isNotPresent("com.jojubanking.boot.framework.flowable.config.JojuFlowableConfiguration")) { + System.out.println("[工作流模块 joju-module-bpm - 已禁用]"); + } + }); + } + + private static boolean isNotPresent(String className) { + return !ClassUtils.isPresent(className, ClassUtils.getDefaultClassLoader()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-banner/src/main/java/com/jojubanking/boot/framework/banner/package-info.java b/joju-framework/joju-spring-boot-starter-banner/src/main/java/com/jojubanking/boot/framework/banner/package-info.java new file mode 100644 index 0000000..2564400 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-banner/src/main/java/com/jojubanking/boot/framework/banner/package-info.java @@ -0,0 +1,6 @@ +/** + * Banner 用于在 console 控制台,打印开发文档、接口文档等 + * + * @author TW + */ +package com.jojubanking.boot.framework.banner; diff --git a/joju-framework/joju-spring-boot-starter-banner/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-banner/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..901fbdc --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-banner/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.banner.config.JojuBannerAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-banner/src/main/resources/banner.txt b/joju-framework/joju-spring-boot-starter-banner/src/main/resources/banner.txt new file mode 100644 index 0000000..da1308f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-banner/src/main/resources/banner.txt @@ -0,0 +1,16 @@ +Application Version: ${joju.info.version} +Spring Boot Version: ${spring-boot.version} + +.__ __. ______ .______ __ __ _______ +| \ | | / __ \ | _ \ | | | | / _____| +| \| | | | | | | |_) | | | | | | | __ +| . ` | | | | | | _ < | | | | | | |_ | +| |\ | | `--' | | |_) | | `--' | | |__| | +|__| \__| \______/ |______/ \______/ \______| + +███╗ ██╗ ██████╗ ██████╗ ██╗ ██╗ ██████╗ +████╗ ██║██╔═══██╗ ██╔══██╗██║ ██║██╔════╝ +██╔██╗ ██║██║ ██║ ██████╔╝██║ ██║██║ ███╗ +██║╚██╗██║██║ ██║ ██╔══██╗██║ ██║██║ ██║ +██║ ╚████║╚██████╔╝ ██████╔╝╚██████╔╝╚██████╔╝ +╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ diff --git a/joju-framework/joju-spring-boot-starter-banner/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-banner/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..901fbdc --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-banner/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.banner.config.JojuBannerAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-banner/target/classes/banner.txt b/joju-framework/joju-spring-boot-starter-banner/target/classes/banner.txt new file mode 100644 index 0000000..da1308f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-banner/target/classes/banner.txt @@ -0,0 +1,16 @@ +Application Version: ${joju.info.version} +Spring Boot Version: ${spring-boot.version} + +.__ __. ______ .______ __ __ _______ +| \ | | / __ \ | _ \ | | | | / _____| +| \| | | | | | | |_) | | | | | | | __ +| . ` | | | | | | _ < | | | | | | |_ | +| |\ | | `--' | | |_) | | `--' | | |__| | +|__| \__| \______/ |______/ \______/ \______| + +███╗ ██╗ ██████╗ ██████╗ ██╗ ██╗ ██████╗ +████╗ ██║██╔═══██╗ ██╔══██╗██║ ██║██╔════╝ +██╔██╗ ██║██║ ██║ ██████╔╝██║ ██║██║ ███╗ +██║╚██╗██║██║ ██║ ██╔══██╗██║ ██║██║ ██║ +██║ ╚████║╚██████╔╝ ██████╔╝╚██████╔╝╚██████╔╝ +╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ diff --git a/joju-framework/joju-spring-boot-starter-banner/target/classes/com/jojubanking/boot/framework/banner/config/JojuBannerAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-banner/target/classes/com/jojubanking/boot/framework/banner/config/JojuBannerAutoConfiguration.class new file mode 100644 index 0000000..4642fc7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-banner/target/classes/com/jojubanking/boot/framework/banner/config/JojuBannerAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-banner/target/classes/com/jojubanking/boot/framework/banner/core/BannerApplicationRunner.class b/joju-framework/joju-spring-boot-starter-banner/target/classes/com/jojubanking/boot/framework/banner/core/BannerApplicationRunner.class new file mode 100644 index 0000000..45c1452 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-banner/target/classes/com/jojubanking/boot/framework/banner/core/BannerApplicationRunner.class differ diff --git a/joju-framework/joju-spring-boot-starter-banner/target/joju-spring-boot-starter-banner-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-banner/target/joju-spring-boot-starter-banner-2.0.0-beta.jar new file mode 100644 index 0000000..4362146 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-banner/target/joju-spring-boot-starter-banner-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-banner/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-banner/target/maven-archiver/pom.properties new file mode 100644 index 0000000..614178b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-banner/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:28:37 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-banner diff --git a/joju-framework/joju-spring-boot-starter-banner/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-banner/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..6c2415e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-banner/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,2 @@ +com\jojubanking\boot\framework\banner\core\BannerApplicationRunner.class +com\jojubanking\boot\framework\banner\config\JojuBannerAutoConfiguration.class diff --git a/joju-framework/joju-spring-boot-starter-banner/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-banner/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..bf2bdce --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-banner/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,3 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-banner\src\main\java\com\jojubanking\boot\framework\banner\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-banner\src\main\java\com\jojubanking\boot\framework\banner\core\BannerApplicationRunner.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-banner\src\main\java\com\jojubanking\boot\framework\banner\config\JojuBannerAutoConfiguration.java diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/joju-spring-boot-starter-biz-data-permission.iml b/joju-framework/joju-spring-boot-starter-biz-data-permission/joju-spring-boot-starter-biz-data-permission.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/joju-spring-boot-starter-biz-data-permission.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/pom.xml b/joju-framework/joju-spring-boot-starter-biz-data-permission/pom.xml new file mode 100644 index 0000000..8d7207e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/pom.xml @@ -0,0 +1,55 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-biz-data-permission + jar + + ${project.artifactId} + 数据权限 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + com.jojubanking.boot + joju-spring-boot-starter-security + true + ${revision} + + + + + com.jojubanking.boot + joju-spring-boot-starter-mybatis + ${revision} + + + + + com.jojubanking.boot + joju-module-system-api + ${revision} + + + + + com.jojubanking.boot + joju-spring-boot-starter-test + test + ${revision} + + + + diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/config/JojuDataPermissionAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/config/JojuDataPermissionAutoConfiguration.java new file mode 100644 index 0000000..564ca8f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/config/JojuDataPermissionAutoConfiguration.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.framework.datapermission.config; + +import com.jojubanking.boot.framework.datapermission.core.aop.DataPermissionAnnotationAdvisor; +import com.jojubanking.boot.framework.datapermission.core.db.DataPermissionDatabaseInterceptor; +import com.jojubanking.boot.framework.datapermission.core.rule.DataPermissionRule; +import com.jojubanking.boot.framework.datapermission.core.rule.DataPermissionRuleFactory; +import com.jojubanking.boot.framework.datapermission.core.rule.DataPermissionRuleFactoryImpl; +import com.jojubanking.boot.framework.mybatis.core.util.MyBatisUtils; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +/** + * 数据权限的自动配置类 + * + * @author TW + */ +@Configuration +public class JojuDataPermissionAutoConfiguration { + + @Bean + public DataPermissionRuleFactory dataPermissionRuleFactory(List rules) { + return new DataPermissionRuleFactoryImpl(rules); + } + + @Bean + public DataPermissionDatabaseInterceptor dataPermissionDatabaseInterceptor(MybatisPlusInterceptor interceptor, + List rules) { + // 创建 DataPermissionDatabaseInterceptor 拦截器 + DataPermissionRuleFactory ruleFactory = dataPermissionRuleFactory(rules); + DataPermissionDatabaseInterceptor inner = new DataPermissionDatabaseInterceptor(ruleFactory); + // 添加到 interceptor 中 + // 需要加在首个,主要是为了在分页插件前面。这个是 MyBatis Plus 的规定 + MyBatisUtils.addInterceptor(interceptor, inner, 0); + return inner; + } + + @Bean + public DataPermissionAnnotationAdvisor dataPermissionAnnotationAdvisor() { + return new DataPermissionAnnotationAdvisor(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/config/JojuDeptDataPermissionAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/config/JojuDeptDataPermissionAutoConfiguration.java new file mode 100644 index 0000000..d999644 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/config/JojuDeptDataPermissionAutoConfiguration.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.framework.datapermission.config; + +import com.jojubanking.boot.framework.datapermission.core.rule.dept.DeptDataPermissionRule; +import com.jojubanking.boot.framework.datapermission.core.rule.dept.DeptDataPermissionRuleCustomizer; +import com.jojubanking.boot.framework.security.core.LoginUser; +import com.jojubanking.boot.module.system.api.permission.PermissionApi; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +/** + * 基于部门的数据权限 AutoConfiguration + * + * @author TW + */ +@Configuration +@ConditionalOnClass(LoginUser.class) +@ConditionalOnBean(value = {PermissionApi.class, DeptDataPermissionRuleCustomizer.class}) +public class JojuDeptDataPermissionAutoConfiguration { + + @Bean + public DeptDataPermissionRule deptDataPermissionRule(PermissionApi permissionApi, + List customizers) { + // 创建 DeptDataPermissionRule 对象 + DeptDataPermissionRule rule = new DeptDataPermissionRule(permissionApi); + // 补全表配置 + customizers.forEach(customizer -> customizer.customize(rule)); + return rule; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/annotation/DataPermission.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/annotation/DataPermission.java new file mode 100644 index 0000000..4ac207d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/annotation/DataPermission.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.framework.datapermission.core.annotation; + +import com.jojubanking.boot.framework.datapermission.core.rule.DataPermissionRule; + +import java.lang.annotation.*; + +/** + * 数据权限注解 + * 可声明在类或者方法上,标识使用的数据权限规则 + * + * @author TW + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataPermission { + + /** + * 当前类或方法是否开启数据权限 + * 即使不添加 @DataPermission 注解,默认是开启状态 + * 可通过设置 enable 为 false 禁用 + */ + boolean enable() default true; + + /** + * 生效的数据权限规则数组,优先级高于 {@link #excludeRules()} + */ + Class[] includeRules() default {}; + + /** + * 排除的数据权限规则数组,优先级最低 + */ + Class[] excludeRules() default {}; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java new file mode 100644 index 0000000..c8f0a81 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.framework.datapermission.core.aop; + +import com.jojubanking.boot.framework.datapermission.core.annotation.DataPermission; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import org.aopalliance.aop.Advice; +import org.springframework.aop.Pointcut; +import org.springframework.aop.support.AbstractPointcutAdvisor; +import org.springframework.aop.support.ComposablePointcut; +import org.springframework.aop.support.annotation.AnnotationMatchingPointcut; + +/** + * {@link DataPermission} 注解的 Advisor 实现类 + * + * @author TW + */ +@Getter +@EqualsAndHashCode(callSuper = true) +public class DataPermissionAnnotationAdvisor extends AbstractPointcutAdvisor { + + private final Advice advice; + + private final Pointcut pointcut; + + public DataPermissionAnnotationAdvisor() { + this.advice = new DataPermissionAnnotationInterceptor(); + this.pointcut = this.buildPointcut(); + } + + protected Pointcut buildPointcut() { + Pointcut classPointcut = new AnnotationMatchingPointcut(DataPermission.class, true); + Pointcut methodPointcut = new AnnotationMatchingPointcut(null, DataPermission.class, true); + return new ComposablePointcut(classPointcut).union(methodPointcut); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java new file mode 100644 index 0000000..cf54a3f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.java @@ -0,0 +1,72 @@ +package com.jojubanking.boot.framework.datapermission.core.aop; + +import com.jojubanking.boot.framework.datapermission.core.annotation.DataPermission; +import lombok.Getter; +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; +import org.springframework.core.MethodClassKey; +import org.springframework.core.annotation.AnnotationUtils; + +import java.lang.reflect.Method; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * {@link DataPermission} 注解的拦截器 + * 1. 在执行方法前,将 @DataPermission 注解入栈 + * 2. 在执行方法后,将 @DataPermission 注解出栈 + * + * @author TW + */ +@DataPermission // 该注解,用于 {@link DATA_PERMISSION_NULL} 的空对象 +public class DataPermissionAnnotationInterceptor implements MethodInterceptor { + + /** + * DataPermission 空对象,用于方法无 {@link DataPermission} 注解时,使用 DATA_PERMISSION_NULL 进行占位 + */ + static final DataPermission DATA_PERMISSION_NULL = DataPermissionAnnotationInterceptor.class.getAnnotation(DataPermission.class); + + @Getter + private final Map dataPermissionCache = new ConcurrentHashMap<>(); + + @Override + public Object invoke(MethodInvocation methodInvocation) throws Throwable { + // 入栈 + DataPermission dataPermission = this.findAnnotation(methodInvocation); + if (dataPermission != null) { + DataPermissionContextHolder.add(dataPermission); + } + try { + // 执行逻辑 + return methodInvocation.proceed(); + } finally { + // 出栈 + if (dataPermission != null) { + DataPermissionContextHolder.remove(); + } + } + } + + private DataPermission findAnnotation(MethodInvocation methodInvocation) { + // 1. 从缓存中获取 + Method method = methodInvocation.getMethod(); + Object targetObject = methodInvocation.getThis(); + Class clazz = targetObject != null ? targetObject.getClass() : method.getDeclaringClass(); + MethodClassKey methodClassKey = new MethodClassKey(method, clazz); + DataPermission dataPermission = dataPermissionCache.get(methodClassKey); + if (dataPermission != null) { + return dataPermission != DATA_PERMISSION_NULL ? dataPermission : null; + } + + // 2.1 从方法中获取 + dataPermission = AnnotationUtils.findAnnotation(method, DataPermission.class); + // 2.2 从类上获取 + if (dataPermission == null) { + dataPermission = AnnotationUtils.findAnnotation(clazz, DataPermission.class); + } + // 2.3 添加到缓存中 + dataPermissionCache.put(methodClassKey, dataPermission != null ? dataPermission : DATA_PERMISSION_NULL); + return dataPermission; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionContextHolder.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionContextHolder.java new file mode 100644 index 0000000..b6c5914 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionContextHolder.java @@ -0,0 +1,72 @@ +package com.jojubanking.boot.framework.datapermission.core.aop; + +import com.jojubanking.boot.framework.datapermission.core.annotation.DataPermission; +import com.alibaba.ttl.TransmittableThreadLocal; + +import java.util.LinkedList; +import java.util.List; + +/** + * {@link DataPermission} 注解的 Context 上下文 + * + * @author TW + */ +public class DataPermissionContextHolder { + + /** + * 使用 List 的原因,可能存在方法的嵌套调用 + */ + private static final ThreadLocal> DATA_PERMISSIONS = + TransmittableThreadLocal.withInitial(LinkedList::new); + + /** + * 获得当前的 DataPermission 注解 + * + * @return DataPermission 注解 + */ + public static DataPermission get() { + return DATA_PERMISSIONS.get().peekLast(); + } + + /** + * 入栈 DataPermission 注解 + * + * @param dataPermission DataPermission 注解 + */ + public static void add(DataPermission dataPermission) { + DATA_PERMISSIONS.get().addLast(dataPermission); + } + + /** + * 出栈 DataPermission 注解 + * + * @return DataPermission 注解 + */ + public static DataPermission remove() { + DataPermission dataPermission = DATA_PERMISSIONS.get().removeLast(); + // 无元素时,清空 ThreadLocal + if (DATA_PERMISSIONS.get().isEmpty()) { + DATA_PERMISSIONS.remove(); + } + return dataPermission; + } + + /** + * 获得所有 DataPermission + * + * @return DataPermission 队列 + */ + public static List getAll() { + return DATA_PERMISSIONS.get(); + } + + /** + * 清空上下文 + * + * 目前仅仅用于单测 + */ + public static void clear() { + DATA_PERMISSIONS.remove(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptor.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptor.java new file mode 100644 index 0000000..6c72355 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptor.java @@ -0,0 +1,508 @@ +package com.jojubanking.boot.framework.datapermission.core.db; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.util.collection.SetUtils; +import com.jojubanking.boot.framework.datapermission.core.rule.DataPermissionRule; +import com.jojubanking.boot.framework.datapermission.core.rule.DataPermissionRuleFactory; +import com.jojubanking.boot.framework.mybatis.core.util.MyBatisUtils; +import com.alibaba.ttl.TransmittableThreadLocal; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.PluginUtils; +import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import net.sf.jsqlparser.expression.*; +import net.sf.jsqlparser.expression.operators.conditional.AndExpression; +import net.sf.jsqlparser.expression.operators.conditional.OrExpression; +import net.sf.jsqlparser.expression.operators.relational.ExistsExpression; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.expression.operators.relational.InExpression; +import net.sf.jsqlparser.expression.operators.relational.ItemsList; +import net.sf.jsqlparser.schema.Table; +import net.sf.jsqlparser.statement.delete.Delete; +import net.sf.jsqlparser.statement.select.*; +import net.sf.jsqlparser.statement.update.Update; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.executor.statement.StatementHandler; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; + +import java.sql.Connection; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 数据权限拦截器,通过 {@link DataPermissionRule} 数据权限规则,重写 SQL 的方式来实现 + * 主要的 SQL 重写方法,可见 {@link #builderExpression(Expression, Table)} 方法 + * + * 整体的代码实现上,参考 {@link com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor} 实现。 + * 所以每次 MyBatis Plus 升级时,需要 Review 下其具体的实现是否有变更! + * + * @author TW + */ +@RequiredArgsConstructor +public class DataPermissionDatabaseInterceptor extends JsqlParserSupport implements InnerInterceptor { + + private final DataPermissionRuleFactory ruleFactory; + + @Getter + private final MappedStatementCache mappedStatementCache = new MappedStatementCache(); + + @Override // SELECT 场景 + public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, + RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { + // 获得 Mapper 对应的数据权限的规则 + List rules = ruleFactory.getDataPermissionRule(ms.getId()); + if (mappedStatementCache.noRewritable(ms, rules)) { // 如果无需重写,则跳过 + return; + } + + PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql); + try { + // 初始化上下文 + ContextHolder.init(rules); + // 处理 SQL + mpBs.sql(parserSingle(mpBs.sql(), null)); + } finally { + addMappedStatementCache(ms); + ContextHolder.clear(); + } + } + + @Override // 只处理 UPDATE / DELETE 场景,不处理 INSERT 场景 + public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { + PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh); + MappedStatement ms = mpSh.mappedStatement(); + SqlCommandType sct = ms.getSqlCommandType(); + if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) { + // 获得 Mapper 对应的数据权限的规则 + List rules = ruleFactory.getDataPermissionRule(ms.getId()); + if (mappedStatementCache.noRewritable(ms, rules)) { // 如果无需重写,则跳过 + return; + } + + PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql(); + try { + // 初始化上下文 + ContextHolder.init(rules); + // 处理 SQL + mpBs.sql(parserMulti(mpBs.sql(), null)); + } finally { + addMappedStatementCache(ms); + ContextHolder.clear(); + } + } + } + + @Override + protected void processSelect(Select select, int index, String sql, Object obj) { + processSelectBody(select.getSelectBody()); + List withItemsList = select.getWithItemsList(); + if (!CollectionUtils.isEmpty(withItemsList)) { + withItemsList.forEach(this::processSelectBody); + } + } + + protected void processSelectBody(SelectBody selectBody) { + if (selectBody == null) { + return; + } + if (selectBody instanceof PlainSelect) { + processPlainSelect((PlainSelect) selectBody); + } else if (selectBody instanceof WithItem) { + WithItem withItem = (WithItem) selectBody; + processSelectBody(withItem.getSubSelect().getSelectBody()); + } else { + SetOperationList operationList = (SetOperationList) selectBody; + List selectBodys = operationList.getSelects(); + if (CollectionUtils.isNotEmpty(selectBodys)) { + selectBodys.forEach(this::processSelectBody); + } + } + } + + /** + * update 语句处理 + */ + @Override + protected void processUpdate(Update update, int index, String sql, Object obj) { + final Table table = update.getTable(); + update.setWhere(this.builderExpression(update.getWhere(), table)); + } + + /** + * delete 语句处理 + */ + @Override + protected void processDelete(Delete delete, int index, String sql, Object obj) { + delete.setWhere(this.builderExpression(delete.getWhere(), delete.getTable())); + } + + /** + * 处理 PlainSelect + */ + protected void processPlainSelect(PlainSelect plainSelect) { + FromItem fromItem = plainSelect.getFromItem(); + Expression where = plainSelect.getWhere(); + processWhereSubSelect(where); + if (fromItem instanceof Table) { + Table fromTable = (Table) fromItem; + plainSelect.setWhere(builderExpression(where, fromTable)); + } else { + processFromItem(fromItem); + } + //#3087 github + List selectItems = plainSelect.getSelectItems(); + if (CollectionUtils.isNotEmpty(selectItems)) { + selectItems.forEach(this::processSelectItem); + } + List joins = plainSelect.getJoins(); + if (CollectionUtils.isNotEmpty(joins)) { + processJoins(joins); + } + } + + /** + * 处理where条件内的子查询 + *

+ * 支持如下: + * 1. in + * 2. = + * 3. > + * 4. < + * 5. >= + * 6. <= + * 7. <> + * 8. EXISTS + * 9. NOT EXISTS + *

+ * 前提条件: + * 1. 子查询必须放在小括号中 + * 2. 子查询一般放在比较操作符的右边 + * + * @param where where 条件 + */ + protected void processWhereSubSelect(Expression where) { + if (where == null) { + return; + } + if (where instanceof FromItem) { + processFromItem((FromItem) where); + return; + } + if (where.toString().indexOf("SELECT") > 0) { + // 有子查询 + if (where instanceof BinaryExpression) { + // 比较符号 , and , or , 等等 + BinaryExpression expression = (BinaryExpression) where; + processWhereSubSelect(expression.getLeftExpression()); + processWhereSubSelect(expression.getRightExpression()); + } else if (where instanceof InExpression) { + // in + InExpression expression = (InExpression) where; + ItemsList itemsList = expression.getRightItemsList(); + if (itemsList instanceof SubSelect) { + processSelectBody(((SubSelect) itemsList).getSelectBody()); + } + } else if (where instanceof ExistsExpression) { + // exists + ExistsExpression expression = (ExistsExpression) where; + processWhereSubSelect(expression.getRightExpression()); + } else if (where instanceof NotExpression) { + // not exists + NotExpression expression = (NotExpression) where; + processWhereSubSelect(expression.getExpression()); + } else if (where instanceof Parenthesis) { + Parenthesis expression = (Parenthesis) where; + processWhereSubSelect(expression.getExpression()); + } + } + } + + protected void processSelectItem(SelectItem selectItem) { + if (selectItem instanceof SelectExpressionItem) { + SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem; + if (selectExpressionItem.getExpression() instanceof SubSelect) { + processSelectBody(((SubSelect) selectExpressionItem.getExpression()).getSelectBody()); + } else if (selectExpressionItem.getExpression() instanceof Function) { + processFunction((Function) selectExpressionItem.getExpression()); + } + } + } + + /** + * 处理函数 + *

支持: 1. select fun(args..) 2. select fun1(fun2(args..),args..)

+ *

fixed gitee pulls/141

+ * + * @param function 函数 + */ + protected void processFunction(Function function) { + ExpressionList parameters = function.getParameters(); + if (parameters != null) { + parameters.getExpressions().forEach(expression -> { + if (expression instanceof SubSelect) { + processSelectBody(((SubSelect) expression).getSelectBody()); + } else if (expression instanceof Function) { + processFunction((Function) expression); + } + }); + } + } + + /** + * 处理子查询等 + */ + protected void processFromItem(FromItem fromItem) { + if (fromItem instanceof SubJoin) { + SubJoin subJoin = (SubJoin) fromItem; + if (subJoin.getJoinList() != null) { + processJoins(subJoin.getJoinList()); + } + if (subJoin.getLeft() != null) { + processFromItem(subJoin.getLeft()); + } + } else if (fromItem instanceof SubSelect) { + SubSelect subSelect = (SubSelect) fromItem; + if (subSelect.getSelectBody() != null) { + processSelectBody(subSelect.getSelectBody()); + } + } else if (fromItem instanceof ValuesList) { + logger.debug("Perform a subquery, if you do not give us feedback"); + } else if (fromItem instanceof LateralSubSelect) { + LateralSubSelect lateralSubSelect = (LateralSubSelect) fromItem; + if (lateralSubSelect.getSubSelect() != null) { + SubSelect subSelect = lateralSubSelect.getSubSelect(); + if (subSelect.getSelectBody() != null) { + processSelectBody(subSelect.getSelectBody()); + } + } + } + } + + /** + * 处理 joins + * + * @param joins join 集合 + */ + private void processJoins(List joins) { + //对于 on 表达式写在最后的 join,需要记录下前面多个 on 的表名 + Deque tables = new LinkedList<>(); + for (Join join : joins) { + // 处理 on 表达式 + FromItem fromItem = join.getRightItem(); + if (fromItem instanceof Table) { + Table fromTable = (Table) fromItem; + // 获取 join 尾缀的 on 表达式列表 + Collection originOnExpressions = join.getOnExpressions(); + // 正常 join on 表达式只有一个,立刻处理 + if (originOnExpressions.size() == 1) { + processJoin(join); + continue; + } + tables.push(fromTable); + // 尾缀多个 on 表达式的时候统一处理 + if (originOnExpressions.size() > 1) { + Collection onExpressions = new LinkedList<>(); + for (Expression originOnExpression : originOnExpressions) { + Table currentTable = tables.poll(); + onExpressions.add(builderExpression(originOnExpression, currentTable)); + } + join.setOnExpressions(onExpressions); + } + } else { + // 处理右边连接的子表达式 + processFromItem(fromItem); + } + } + } + + /** + * 处理联接语句 + */ + protected void processJoin(Join join) { + if (join.getRightItem() instanceof Table) { + Table fromTable = (Table) join.getRightItem(); + Expression originOnExpression = CollUtil.getFirst(join.getOnExpressions()); + originOnExpression = builderExpression(originOnExpression, fromTable); + join.setOnExpressions(CollUtil.newArrayList(originOnExpression)); + } + } + + /** + * 处理条件 + */ + protected Expression builderExpression(Expression currentExpression, Table table) { + // 获得 Table 对应的数据权限条件 + Expression equalsTo = buildDataPermissionExpression(table); + if (equalsTo == null) { // 如果没条件,则返回 currentExpression 默认 + return currentExpression; + } + + // 表达式为空,则直接返回 equalsTo + if (currentExpression == null) { + return equalsTo; + } + // 如果表达式为 Or,则需要 (currentExpression) AND equalsTo + if (currentExpression instanceof OrExpression) { + return new AndExpression(new Parenthesis(currentExpression), equalsTo); + } + // 如果表达式为 And,则直接返回 currentExpression AND equalsTo + return new AndExpression(currentExpression, equalsTo); + } + + /** + * 构建指定表的数据权限的 Expression 过滤条件 + * + * @param table 表 + * @return Expression 过滤条件 + */ + private Expression buildDataPermissionExpression(Table table) { + // 生成条件 + Expression allExpression = null; + for (DataPermissionRule rule : ContextHolder.getRules()) { + // 判断表名是否匹配 + if (!rule.getTableNames().contains(table.getName())) { + continue; + } + // 如果有匹配的规则,说明可重写。 + // 为什么不是有 allExpression 非空才重写呢?在生成 column = value 过滤条件时,会因为 value 不存在,导致未重写。 + // 这样导致第一次无 value,被标记成无需重写;但是第二次有 value,此时会需要重写。 + ContextHolder.setRewrite(true); + + // 单条规则的条件 + String tableName = MyBatisUtils.getTableName(table); + Expression oneExpress = rule.getExpression(tableName, table.getAlias()); + // 拼接到 allExpression 中 + allExpression = allExpression == null ? oneExpress + : new AndExpression(allExpression, oneExpress); + } + + return allExpression; + } + + /** + * 判断 SQL 是否重写。如果没有重写,则添加到 {@link MappedStatementCache} 中 + * + * @param ms MappedStatement + */ + private void addMappedStatementCache(MappedStatement ms) { + if (ContextHolder.getRewrite()) { + return; + } + // 无重写,进行添加 + mappedStatementCache.addNoRewritable(ms, ContextHolder.getRules()); + } + + /** + * SQL 解析上下文,方便透传 {@link DataPermissionRule} 规则 + * + * @author TW + */ + static final class ContextHolder { + + /** + * 该 {@link MappedStatement} 对应的规则 + */ + private static final ThreadLocal> RULES = new TransmittableThreadLocal<>(); + /** + * SQL 是否进行重写 + */ + private static final ThreadLocal REWRITE = new TransmittableThreadLocal<>(); + + public static void init(List rules) { + RULES.set(rules); + REWRITE.set(false); + } + + public static void clear() { + RULES.remove(); + REWRITE.remove(); + } + + public static boolean getRewrite() { + return REWRITE.get(); + } + + public static void setRewrite(boolean rewrite) { + REWRITE.set(rewrite); + } + + public static List getRules() { + return RULES.get(); + } + + } + + /** + * {@link MappedStatement} 缓存 + * 目前主要用于,记录 {@link DataPermissionRule} 是否对指定 {@link MappedStatement} 无效 + * 如果无效,则可以避免 SQL 的解析,加快速度 + * + * @author TW + */ + static final class MappedStatementCache { + + /** + * 指定数据权限规则,对指定 MappedStatement 无需重写(不生效)的缓存 + * + * value:{@link MappedStatement#getId()} 编号 + */ + @Getter + private final Map, Set> noRewritableMappedStatements = new ConcurrentHashMap<>(); + + /** + * 判断是否无需重写 + * ps:虽然有点中文式英语,但是容易读懂即可 + * + * @param ms MappedStatement + * @param rules 数据权限规则数组 + * @return 是否无需重写 + */ + public boolean noRewritable(MappedStatement ms, List rules) { + // 如果规则为空,说明无需重写 + if (CollUtil.isEmpty(rules)) { + return true; + } + // 任一规则不在 noRewritableMap 中,则说明可能需要重写 + for (DataPermissionRule rule : rules) { + Set mappedStatementIds = noRewritableMappedStatements.get(rule.getClass()); + if (!CollUtil.contains(mappedStatementIds, ms.getId())) { + return false; + } + } + return true; + } + + /** + * 添加无需重写的 MappedStatement + * + * @param ms MappedStatement + * @param rules 数据权限规则数组 + */ + public void addNoRewritable(MappedStatement ms, List rules) { + for (DataPermissionRule rule : rules) { + Set mappedStatementIds = noRewritableMappedStatements.get(rule.getClass()); + if (CollUtil.isNotEmpty(mappedStatementIds)) { + mappedStatementIds.add(ms.getId()); + } else { + noRewritableMappedStatements.put(rule.getClass(), SetUtils.asSet(ms.getId())); + } + } + } + + /** + * 清空缓存 + * 目前主要提供给单元测试 + */ + public void clear() { + noRewritableMappedStatements.clear(); + } + + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRule.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRule.java new file mode 100644 index 0000000..cbc7d0b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRule.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.framework.datapermission.core.rule; + +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.expression.Expression; + +import java.util.Set; + +/** + * 数据权限规则接口 + * 通过实现接口,自定义数据规则。例如说, + * + * @author TW + */ +public interface DataPermissionRule { + + /** + * 返回需要生效的表名数组 + * 为什么需要该方法?Data Permission 数组基于 SQL 重写,通过 Where 返回只有权限的数据 + * + * 如果需要基于实体名获得表名,可调用 {@link TableInfoHelper#getTableInfo(Class)} 获得 + * + * @return 表名数组 + */ + Set getTableNames(); + + /** + * 根据表名和别名,生成对应的 WHERE / OR 过滤条件 + * + * @param tableName 表名 + * @param tableAlias 别名,可能为空 + * @return 过滤条件 Expression 表达式 + */ + Expression getExpression(String tableName, Alias tableAlias); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactory.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactory.java new file mode 100644 index 0000000..41e12e0 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactory.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.framework.datapermission.core.rule; + +import java.util.List; + +/** + * {@link DataPermissionRule} 工厂接口 + * 作为 {@link DataPermissionRule} 的容器,提供管理能力 + * + * @author TW + */ +public interface DataPermissionRuleFactory { + + /** + * 获得所有数据权限规则数组 + * + * @return 数据权限规则数组 + */ + List getDataPermissionRules(); + + /** + * 获得指定 Mapper 的数据权限规则数组 + * + * @param mappedStatementId 指定 Mapper 的编号 + * @return 数据权限规则数组 + */ + List getDataPermissionRule(String mappedStatementId); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java new file mode 100644 index 0000000..83369b9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java @@ -0,0 +1,62 @@ +package com.jojubanking.boot.framework.datapermission.core.rule; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import com.jojubanking.boot.framework.datapermission.core.annotation.DataPermission; +import com.jojubanking.boot.framework.datapermission.core.aop.DataPermissionContextHolder; +import lombok.RequiredArgsConstructor; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 默认的 DataPermissionRuleFactoryImpl 实现类 + * 支持通过 {@link DataPermissionContextHolder} 过滤数据权限 + * + * @author TW + */ +@RequiredArgsConstructor +public class DataPermissionRuleFactoryImpl implements DataPermissionRuleFactory { + + /** + * 数据权限规则数组 + */ + private final List rules; + + @Override + public List getDataPermissionRules() { + return rules; + } + + @Override // mappedStatementId 参数,暂时没有用。以后,可以基于 mappedStatementId + DataPermission 进行缓存 + public List getDataPermissionRule(String mappedStatementId) { + // 1. 无数据权限 + if (CollUtil.isEmpty(rules)) { + return Collections.emptyList(); + } + // 2. 未配置,则默认开启 + DataPermission dataPermission = DataPermissionContextHolder.get(); + if (dataPermission == null) { + return rules; + } + // 3. 已配置,但禁用 + if (!dataPermission.enable()) { + return Collections.emptyList(); + } + + // 4. 已配置,只选择部分规则 + if (ArrayUtil.isNotEmpty(dataPermission.includeRules())) { + return rules.stream().filter(rule -> ArrayUtil.contains(dataPermission.includeRules(), rule.getClass())) + .collect(Collectors.toList()); // 一般规则不会太多,所以不采用 HashSet 查询 + } + // 5. 已配置,只排除部分规则 + if (ArrayUtil.isNotEmpty(dataPermission.excludeRules())) { + return rules.stream().filter(rule -> !ArrayUtil.contains(dataPermission.excludeRules(), rule.getClass())) + .collect(Collectors.toList()); // 一般规则不会太多,所以不采用 HashSet 查询 + } + // 6. 已配置,全部规则 + return rules; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java new file mode 100644 index 0000000..af62fc6 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java @@ -0,0 +1,208 @@ +package com.jojubanking.boot.framework.datapermission.core.rule.dept; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.datapermission.core.rule.DataPermissionRule; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.mybatis.core.util.MyBatisUtils; +import com.jojubanking.boot.framework.security.core.LoginUser; +import com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils; +import com.jojubanking.boot.module.system.api.permission.PermissionApi; +import com.jojubanking.boot.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.NullValue; +import net.sf.jsqlparser.expression.operators.conditional.OrExpression; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.expression.operators.relational.InExpression; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * 基于部门的 {@link DataPermissionRule} 数据权限规则实现 + * + * 注意,使用 DeptDataPermissionRule 时,需要保证表中有 dept_id 部门编号的字段,可自定义。 + * + * 实际业务场景下,会存在一个经典的问题?当用户修改部门时,冗余的 dept_id 是否需要修改? + * 1. 一般情况下,dept_id 不进行修改,则会导致用户看到之前的数据。【joju-server 采用该方案】 + * 2. 部分情况下,希望该用户还是能看到之前的数据,则有两种方式解决:【需要你改造该 DeptDataPermissionRule 的实现代码】 + * 1)编写洗数据的脚本,将 dept_id 修改成新部门的编号;【建议】 + * 最终过滤条件是 WHERE dept_id = ? + * 2)洗数据的话,可能涉及的数据量较大,也可以采用 user_id 进行过滤的方式,此时需要获取到 dept_id 对应的所有 user_id 用户编号; + * 最终过滤条件是 WHERE user_id IN (?, ?, ? ...) + * 3)想要保证原 dept_id 和 user_id 都可以看的到,此时使用 dept_id 和 user_id 一起过滤; + * 最终过滤条件是 WHERE dept_id = ? OR user_id IN (?, ?, ? ...) + * + * @author TW + */ +@AllArgsConstructor +@Slf4j +public class DeptDataPermissionRule implements DataPermissionRule { + + /** + * LoginUser 的 Context 缓存 Key + */ + protected static final String CONTEXT_KEY = DeptDataPermissionRule.class.getSimpleName(); + + private static final String DEPT_COLUMN_NAME = "dept_id"; + private static final String USER_COLUMN_NAME = "user_id"; + + static final Expression EXPRESSION_NULL = new NullValue(); + + private final PermissionApi permissionApi; + + /** + * 基于部门的表字段配置 + * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。 + * + * key:表名 + * value:字段名 + */ + private final Map deptColumns = new HashMap<>(); + /** + * 基于用户的表字段配置 + * 一般情况下,每个表的部门编号字段是 dept_id,通过该配置自定义。 + * + * key:表名 + * value:字段名 + */ + private final Map userColumns = new HashMap<>(); + /** + * 所有表名,是 {@link #deptColumns} 和 {@link #userColumns} 的合集 + */ + private final Set TABLE_NAMES = new HashSet<>(); + + @Override + public Set getTableNames() { + return TABLE_NAMES; + } + + @Override + public Expression getExpression(String tableName, Alias tableAlias) { + // 只有有登陆用户的情况下,才进行数据权限的处理 + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + if (loginUser == null) { + return null; + } + // 只有管理员类型的用户,才进行数据权限的处理 + if (ObjectUtil.notEqual(loginUser.getUserType(), UserTypeEnum.ADMIN.getValue())) { + return null; + } + + // 获得数据权限 + DeptDataPermissionRespDTO deptDataPermission = loginUser.getContext(CONTEXT_KEY, DeptDataPermissionRespDTO.class); + // 从上下文中拿不到,则调用逻辑进行获取 + if (deptDataPermission == null) { + deptDataPermission = permissionApi.getDeptDataPermission(loginUser.getId()); + if (deptDataPermission == null) { + log.error("[getExpression][LoginUser({}) 获取数据权限为 null]", JsonUtils.toJsonString(loginUser)); + throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 未返回数据权限", + loginUser.getId(), tableName, tableAlias.getName())); + } + // 添加到上下文中,避免重复计算 + loginUser.setContext(CONTEXT_KEY, deptDataPermission); + } + + // 情况一,如果是 ALL 可查看全部,则无需拼接条件 + if (deptDataPermission.getAll()) { + return null; + } + + // 情况二,即不能查看部门,又不能查看自己,则说明 100% 无权限 + if (CollUtil.isEmpty(deptDataPermission.getDeptIds()) + && Boolean.FALSE.equals(deptDataPermission.getSelf())) { + return new EqualsTo(null, null); // WHERE null = null,可以保证返回的数据为空 + } + + // 情况三,拼接 Dept 和 User 的条件,最后组合 + Expression deptExpression = buildDeptExpression(tableName,tableAlias, deptDataPermission.getDeptIds()); + Expression userExpression = buildUserExpression(tableName, tableAlias, deptDataPermission.getSelf(), loginUser.getId()); + if (deptExpression == null && userExpression == null) { + // TODO TW:获得不到条件的时候,暂时不抛出异常,而是不返回数据 + log.warn("[getExpression][LoginUser({}) Table({}/{}) DeptDataPermission({}) 构建的条件为空]", + JsonUtils.toJsonString(loginUser), tableName, tableAlias, JsonUtils.toJsonString(deptDataPermission)); +// throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 构建的条件为空", +// loginUser.getId(), tableName, tableAlias.getName())); + return EXPRESSION_NULL; + } + if (deptExpression == null) { + return userExpression; + } + if (userExpression == null) { + return deptExpression; + } + // 目前,如果有指定部门 + 可查看自己,采用 OR 条件。即,WHERE dept_id IN ? OR user_id = ? + return new OrExpression(deptExpression, userExpression); + } + + private Expression buildDeptExpression(String tableName, Alias tableAlias, Set deptIds) { + // 如果不存在配置,则无需作为条件 + String columnName = deptColumns.get(tableName); + if (StrUtil.isEmpty(columnName)) { + return null; + } + // 如果为空,则无条件 + if (CollUtil.isEmpty(deptIds)) { + return null; + } + // 拼接条件 + return new InExpression(MyBatisUtils.buildColumn(tableName, tableAlias, columnName), + new ExpressionList(CollectionUtils.convertList(deptIds, LongValue::new))); + } + + private Expression buildUserExpression(String tableName, Alias tableAlias, Boolean self, Long userId) { + // 如果不查看自己,则无需作为条件 + if (Boolean.FALSE.equals(self)) { + return null; + } + String columnName = userColumns.get(tableName); + if (StrUtil.isEmpty(columnName)) { + return null; + } + // 拼接条件 + return new EqualsTo(MyBatisUtils.buildColumn(tableName, tableAlias, columnName), new LongValue(userId)); + } + + // ==================== 添加配置 ==================== + + public void addDeptColumn(Class entityClass) { + addDeptColumn(entityClass, DEPT_COLUMN_NAME); + } + + public void addDeptColumn(Class entityClass, String columnName) { + String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName(); + addDeptColumn(tableName, columnName); + } + + public void addDeptColumn(String tableName, String columnName) { + deptColumns.put(tableName, columnName); + TABLE_NAMES.add(tableName); + } + + public void addUserColumn(Class entityClass) { + addUserColumn(entityClass, USER_COLUMN_NAME); + } + + public void addUserColumn(Class entityClass, String columnName) { + String tableName = TableInfoHelper.getTableInfo(entityClass).getTableName(); + addUserColumn(tableName, columnName); + } + + public void addUserColumn(String tableName, String columnName) { + userColumns.put(tableName, columnName); + TABLE_NAMES.add(tableName); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java new file mode 100644 index 0000000..b25b66f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.framework.datapermission.core.rule.dept; + +/** + * {@link DeptDataPermissionRule} 的自定义配置接口 + * + * @author TW + */ +@FunctionalInterface +public interface DeptDataPermissionRuleCustomizer { + + /** + * 自定义该权限规则 + * 1. 调用 {@link DeptDataPermissionRule#addDeptColumn(Class, String)} 方法,配置基于 dept_id 的过滤规则 + * 2. 调用 {@link DeptDataPermissionRule#addUserColumn(Class, String)} 方法,配置基于 user_id 的过滤规则 + * + * @param rule 权限规则 + */ + void customize(DeptDataPermissionRule rule); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/dept/package-info.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/dept/package-info.java new file mode 100644 index 0000000..59dbf7d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/core/rule/dept/package-info.java @@ -0,0 +1,6 @@ +/** + * 基于部门的数据权限规则 + * + * @author TW + */ +package com.jojubanking.boot.framework.datapermission.core.rule.dept; diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/package-info.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/package-info.java new file mode 100644 index 0000000..3158e3e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/java/com/jojubanking/boot/framework/datapermission/package-info.java @@ -0,0 +1,4 @@ +/** + * 基于 JSqlParser 解析 SQL,增加数据权限的 WHERE 条件 + */ +package com.jojubanking.boot.framework.datapermission; diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..59a8c49 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.datapermission.config.JojuDataPermissionAutoConfiguration,\ + com.jojubanking.boot.framework.datapermission.config.JojuDeptDataPermissionAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest.java new file mode 100644 index 0000000..85aae73 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest.java @@ -0,0 +1,109 @@ +package com.jojubanking.boot.framework.datapermission.core.aop; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.datapermission.core.annotation.DataPermission; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import org.aopalliance.intercept.MethodInvocation; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.lang.reflect.Method; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.when; + +/** + * {@link DataPermissionAnnotationInterceptor} 的单元测试 + * + * @author TW + */ +public class DataPermissionAnnotationInterceptorTest extends BaseMockitoUnitTest { + + @InjectMocks + private DataPermissionAnnotationInterceptor interceptor; + + @Mock + private MethodInvocation methodInvocation; + + @BeforeEach + public void setUp() { + interceptor.getDataPermissionCache().clear(); + } + + @Test // 无 @DataPermission 注解 + public void testInvoke_none() throws Throwable { + // 参数 + mockMethodInvocation(TestNone.class); + + // 调用 + Object result = interceptor.invoke(methodInvocation); + // 断言 + assertEquals("none", result); + assertEquals(1, interceptor.getDataPermissionCache().size()); + Assertions.assertTrue(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable()); + } + + @Test // 在 Method 上有 @DataPermission 注解 + public void testInvoke_method() throws Throwable { + // 参数 + mockMethodInvocation(TestMethod.class); + + // 调用 + Object result = interceptor.invoke(methodInvocation); + // 断言 + assertEquals("method", result); + assertEquals(1, interceptor.getDataPermissionCache().size()); + Assertions.assertFalse(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable()); + } + + @Test // 在 Class 上有 @DataPermission 注解 + public void testInvoke_class() throws Throwable { + // 参数 + mockMethodInvocation(TestClass.class); + + // 调用 + Object result = interceptor.invoke(methodInvocation); + // 断言 + assertEquals("class", result); + assertEquals(1, interceptor.getDataPermissionCache().size()); + Assertions.assertFalse(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable()); + } + + private void mockMethodInvocation(Class clazz) throws Throwable { + Object targetObject = clazz.newInstance(); + Method method = targetObject.getClass().getMethod("echo"); + when(methodInvocation.getThis()).thenReturn(targetObject); + when(methodInvocation.getMethod()).thenReturn(method); + when(methodInvocation.proceed()).then(invocationOnMock -> method.invoke(targetObject)); + } + + static class TestMethod { + + @DataPermission(enable = false) + public String echo() { + return "method"; + } + + } + + @DataPermission(enable = false) + static class TestClass { + + public String echo() { + return "class"; + } + + } + + static class TestNone { + + public String echo() { + return "none"; + } + + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionContextHolderTest.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionContextHolderTest.java new file mode 100644 index 0000000..33b36ae --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionContextHolderTest.java @@ -0,0 +1,66 @@ +package com.jojubanking.boot.framework.datapermission.core.aop; + +import com.jojubanking.boot.framework.datapermission.core.annotation.DataPermission; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.mockito.Mockito.mock; + +/** + * {@link DataPermissionContextHolder} 的单元测试 + * + * @author TW + */ +class DataPermissionContextHolderTest { + + @BeforeEach + public void setUp() { + DataPermissionContextHolder.clear(); + } + + @Test + public void testGet() { + // mock 方法 + DataPermission dataPermission01 = mock(DataPermission.class); + DataPermissionContextHolder.add(dataPermission01); + DataPermission dataPermission02 = mock(DataPermission.class); + DataPermissionContextHolder.add(dataPermission02); + + // 调用 + DataPermission result = DataPermissionContextHolder.get(); + // 断言 + assertSame(result, dataPermission02); + } + + @Test + public void testPush() { + // 调用 + DataPermission dataPermission01 = mock(DataPermission.class); + DataPermissionContextHolder.add(dataPermission01); + DataPermission dataPermission02 = mock(DataPermission.class); + DataPermissionContextHolder.add(dataPermission02); + // 断言 + DataPermission first = DataPermissionContextHolder.getAll().get(0); + DataPermission second = DataPermissionContextHolder.getAll().get(1); + assertSame(dataPermission01, first); + assertSame(dataPermission02, second); + } + + @Test + public void testRemove() { + // mock 方法 + DataPermission dataPermission01 = mock(DataPermission.class); + DataPermissionContextHolder.add(dataPermission01); + DataPermission dataPermission02 = mock(DataPermission.class); + DataPermissionContextHolder.add(dataPermission02); + + // 调用 + DataPermission result = DataPermissionContextHolder.remove(); + // 断言 + assertSame(result, dataPermission02); + assertEquals(1, DataPermissionContextHolder.getAll().size()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest.java new file mode 100644 index 0000000..598d662 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest.java @@ -0,0 +1,190 @@ +package com.jojubanking.boot.framework.datapermission.core.db; + +import com.jojubanking.boot.framework.common.util.collection.SetUtils; +import com.jojubanking.boot.framework.datapermission.core.rule.DataPermissionRule; +import com.jojubanking.boot.framework.datapermission.core.rule.DataPermissionRuleFactory; +import com.jojubanking.boot.framework.mybatis.core.util.MyBatisUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import com.baomidou.mybatisplus.core.toolkit.PluginUtils; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.schema.Column; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.executor.statement.StatementHandler; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockedStatic; + +import java.sql.Connection; +import java.util.*; + +import static java.util.Collections.singletonList; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link DataPermissionDatabaseInterceptor} 的单元测试 + * 主要测试 {@link DataPermissionDatabaseInterceptor#beforePrepare(StatementHandler, Connection, Integer)} + * 和 {@link DataPermissionDatabaseInterceptor#beforeUpdate(Executor, MappedStatement, Object)} + * 以及在这个过程中,ContextHolder 和 MappedStatementCache + * + * @author TW + */ +public class DataPermissionDatabaseInterceptorTest extends BaseMockitoUnitTest { + + @InjectMocks + private DataPermissionDatabaseInterceptor interceptor; + + @Mock + private DataPermissionRuleFactory ruleFactory; + + @BeforeEach + public void setUp() { + // 清理上下文 + DataPermissionDatabaseInterceptor.ContextHolder.clear(); + // 清空缓存 + interceptor.getMappedStatementCache().clear(); + } + + @Test // 不存在规则,且不匹配 + public void testBeforeQuery_withoutRule() { + try (MockedStatic pluginUtilsMock = mockStatic(PluginUtils.class)) { + // 准备参数 + MappedStatement mappedStatement = mock(MappedStatement.class); + BoundSql boundSql = mock(BoundSql.class); + + // 调用 + interceptor.beforeQuery(null, mappedStatement, null, null, null, boundSql); + // 断言 + pluginUtilsMock.verify(() -> PluginUtils.mpBoundSql(boundSql), never()); + } + } + + @Test // 存在规则,且不匹配 + public void testBeforeQuery_withMatchRule() { + try (MockedStatic pluginUtilsMock = mockStatic(PluginUtils.class)) { + // 准备参数 + MappedStatement mappedStatement = mock(MappedStatement.class); + BoundSql boundSql = mock(BoundSql.class); + // mock 方法(数据权限) + when(ruleFactory.getDataPermissionRule(same(mappedStatement.getId()))) + .thenReturn(singletonList(new DeptDataPermissionRule())); + // mock 方法(MPBoundSql) + PluginUtils.MPBoundSql mpBs = mock(PluginUtils.MPBoundSql.class); + pluginUtilsMock.when(() -> PluginUtils.mpBoundSql(same(boundSql))).thenReturn(mpBs); + // mock 方法(SQL) + String sql = "select * from t_user where id = 1"; + when(mpBs.sql()).thenReturn(sql); + // 针对 ContextHolder 和 MappedStatementCache 暂时不 mock,主要想校验过程中,数据是否正确 + + // 调用 + interceptor.beforeQuery(null, mappedStatement, null, null, null, boundSql); + // 断言 + verify(mpBs, times(1)).sql( + eq("SELECT * FROM t_user WHERE id = 1 AND dept_id = 100")); + // 断言缓存 + assertTrue(interceptor.getMappedStatementCache().getNoRewritableMappedStatements().isEmpty()); + } + } + + @Test // 存在规则,但不匹配 + public void testBeforeQuery_withoutMatchRule() { + try (MockedStatic pluginUtilsMock = mockStatic(PluginUtils.class)) { + // 准备参数 + MappedStatement mappedStatement = mock(MappedStatement.class); + BoundSql boundSql = mock(BoundSql.class); + // mock 方法(数据权限) + when(ruleFactory.getDataPermissionRule(same(mappedStatement.getId()))) + .thenReturn(singletonList(new DeptDataPermissionRule())); + // mock 方法(MPBoundSql) + PluginUtils.MPBoundSql mpBs = mock(PluginUtils.MPBoundSql.class); + pluginUtilsMock.when(() -> PluginUtils.mpBoundSql(same(boundSql))).thenReturn(mpBs); + // mock 方法(SQL) + String sql = "select * from t_role where id = 1"; + when(mpBs.sql()).thenReturn(sql); + // 针对 ContextHolder 和 MappedStatementCache 暂时不 mock,主要想校验过程中,数据是否正确 + + // 调用 + interceptor.beforeQuery(null, mappedStatement, null, null, null, boundSql); + // 断言 + verify(mpBs, times(1)).sql( + eq("SELECT * FROM t_role WHERE id = 1")); + // 断言缓存 + assertFalse(interceptor.getMappedStatementCache().getNoRewritableMappedStatements().isEmpty()); + } + } + + @Test + public void testAddNoRewritable() { + // 准备参数 + MappedStatement ms = mock(MappedStatement.class); + List rules = singletonList(new DeptDataPermissionRule()); + // mock 方法 + when(ms.getId()).thenReturn("selectById"); + + // 调用 + interceptor.getMappedStatementCache().addNoRewritable(ms, rules); + // 断言 + Map, Set> noRewritableMappedStatements = + interceptor.getMappedStatementCache().getNoRewritableMappedStatements(); + assertEquals(1, noRewritableMappedStatements.size()); + assertEquals(SetUtils.asSet("selectById"), noRewritableMappedStatements.get(DeptDataPermissionRule.class)); + } + + @Test + public void testNoRewritable() { + // 准备参数 + MappedStatement ms = mock(MappedStatement.class); + // mock 方法 + when(ms.getId()).thenReturn("selectById"); + // mock 数据 + List rules = singletonList(new DeptDataPermissionRule()); + interceptor.getMappedStatementCache().addNoRewritable(ms, rules); + + // 场景一,rules 为空 + assertTrue(interceptor.getMappedStatementCache().noRewritable(ms, null)); + // 场景二,rules 非空,可重写 + assertFalse(interceptor.getMappedStatementCache().noRewritable(ms, singletonList(new EmptyDataPermissionRule()))); + // 场景三,rule 非空,不可重写 + assertTrue(interceptor.getMappedStatementCache().noRewritable(ms, rules)); + } + + private static class DeptDataPermissionRule implements DataPermissionRule { + + private static final String COLUMN = "dept_id"; + + @Override + public Set getTableNames() { + return SetUtils.asSet("t_user"); + } + + @Override + public Expression getExpression(String tableName, Alias tableAlias) { + Column column = MyBatisUtils.buildColumn(tableName, tableAlias, COLUMN); + LongValue value = new LongValue(100L); + return new EqualsTo(column, value); + } + + } + + private static class EmptyDataPermissionRule implements DataPermissionRule { + + @Override + public Set getTableNames() { + return Collections.emptySet(); + } + + @Override + public Expression getExpression(String tableName, Alias tableAlias) { + return null; + } + + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest2.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest2.java new file mode 100644 index 0000000..803c77d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest2.java @@ -0,0 +1,370 @@ +package com.jojubanking.boot.framework.datapermission.core.db; + +import com.jojubanking.boot.framework.datapermission.core.rule.DataPermissionRule; +import com.jojubanking.boot.framework.datapermission.core.rule.DataPermissionRuleFactory; +import com.jojubanking.boot.framework.mybatis.core.util.MyBatisUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.expression.operators.relational.ExpressionList; +import net.sf.jsqlparser.expression.operators.relational.InExpression; +import net.sf.jsqlparser.schema.Column; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.Arrays; +import java.util.Set; + +import static com.jojubanking.boot.framework.common.util.collection.SetUtils.asSet; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * {@link DataPermissionDatabaseInterceptor} 的单元测试 + * 主要复用了 MyBatis Plus 的 TenantLineInnerInterceptorTest 的单元测试 + * 不过它的单元测试不是很规范,考虑到是复用的,所以暂时不进行修改~ + * + * @author TW + */ +public class DataPermissionDatabaseInterceptorTest2 extends BaseMockitoUnitTest { + + @InjectMocks + private DataPermissionDatabaseInterceptor interceptor; + + @Mock + private DataPermissionRuleFactory ruleFactory; + + @BeforeEach + public void setUp() { + // 租户的数据权限规则 + DataPermissionRule tenantRule = new DataPermissionRule() { + + private static final String COLUMN = "tenant_id"; + + @Override + public Set getTableNames() { + return asSet("entity", "entity1", "entity2", "t1", "t2", // 支持 MyBatis Plus 的单元测试 + "t_user", "t_role"); // 满足自己的单元测试 + } + + @Override + public Expression getExpression(String tableName, Alias tableAlias) { + Column column = MyBatisUtils.buildColumn(tableName, tableAlias, COLUMN); + LongValue value = new LongValue(1L); + return new EqualsTo(column, value); + } + + }; + // 部门的数据权限规则 + DataPermissionRule deptRule = new DataPermissionRule() { + + private static final String COLUMN = "dept_id"; + + @Override + public Set getTableNames() { + return asSet("t_user"); // 满足自己的单元测试 + } + + @Override + public Expression getExpression(String tableName, Alias tableAlias) { + Column column = MyBatisUtils.buildColumn(tableName, tableAlias, COLUMN); + ExpressionList values = new ExpressionList(new LongValue(10L), + new LongValue(20L)); + return new InExpression(column, values); + } + + }; + // 设置到上下文,保证 + DataPermissionDatabaseInterceptor.ContextHolder.init(Arrays.asList(tenantRule, deptRule)); + } + + @Test + void delete() { + assertSql("delete from entity where id = ?", + "DELETE FROM entity WHERE id = ? AND tenant_id = 1"); + } + + @Test + void update() { + assertSql("update entity set name = ? where id = ?", + "UPDATE entity SET name = ? WHERE id = ? AND tenant_id = 1"); + } + + @Test + void selectSingle() { + // 单表 + assertSql("select * from entity where id = ?", + "SELECT * FROM entity WHERE id = ? AND tenant_id = 1"); + + assertSql("select * from entity where id = ? or name = ?", + "SELECT * FROM entity WHERE (id = ? OR name = ?) AND tenant_id = 1"); + + assertSql("SELECT * FROM entity WHERE (id = ? OR name = ?)", + "SELECT * FROM entity WHERE (id = ? OR name = ?) AND tenant_id = 1"); + + /* not */ + assertSql("SELECT * FROM entity WHERE not (id = ? OR name = ?)", + "SELECT * FROM entity WHERE NOT (id = ? OR name = ?) AND tenant_id = 1"); + } + + @Test + void selectSubSelectIn() { + /* in */ + assertSql("SELECT * FROM entity e WHERE e.id IN (select e1.id from entity1 e1 where e1.id = ?)", + "SELECT * FROM entity e WHERE e.id IN (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + // 在最前 + assertSql("SELECT * FROM entity e WHERE e.id IN " + + "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?", + "SELECT * FROM entity e WHERE e.id IN " + + "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1"); + // 在最后 + assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id IN " + + "(select e1.id from entity1 e1 where e1.id = ?)", + "SELECT * FROM entity e WHERE e.id = ? AND e.id IN " + + "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + // 在中间 + assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id IN " + + "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?", + "SELECT * FROM entity e WHERE e.id = ? AND e.id IN " + + "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1"); + } + + @Test + void selectSubSelectEq() { + /* = */ + assertSql("SELECT * FROM entity e WHERE e.id = (select e1.id from entity1 e1 where e1.id = ?)", + "SELECT * FROM entity e WHERE e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + } + + @Test + void selectSubSelectInnerNotEq() { + /* inner not = */ + assertSql("SELECT * FROM entity e WHERE not (e.id = (select e1.id from entity1 e1 where e1.id = ?))", + "SELECT * FROM entity e WHERE NOT (e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1)) AND e.tenant_id = 1"); + + assertSql("SELECT * FROM entity e WHERE not (e.id = (select e1.id from entity1 e1 where e1.id = ?) and e.id = ?)", + "SELECT * FROM entity e WHERE NOT (e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ?) AND e.tenant_id = 1"); + } + + @Test + void selectSubSelectExists() { + /* EXISTS */ + assertSql("SELECT * FROM entity e WHERE EXISTS (select e1.id from entity1 e1 where e1.id = ?)", + "SELECT * FROM entity e WHERE EXISTS (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + + + /* NOT EXISTS */ + assertSql("SELECT * FROM entity e WHERE NOT EXISTS (select e1.id from entity1 e1 where e1.id = ?)", + "SELECT * FROM entity e WHERE NOT EXISTS (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + } + + @Test + void selectSubSelect() { + /* >= */ + assertSql("SELECT * FROM entity e WHERE e.id >= (select e1.id from entity1 e1 where e1.id = ?)", + "SELECT * FROM entity e WHERE e.id >= (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + + /* <= */ + assertSql("SELECT * FROM entity e WHERE e.id <= (select e1.id from entity1 e1 where e1.id = ?)", + "SELECT * FROM entity e WHERE e.id <= (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + + /* <> */ + assertSql("SELECT * FROM entity e WHERE e.id <> (select e1.id from entity1 e1 where e1.id = ?)", + "SELECT * FROM entity e WHERE e.id <> (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + } + + @Test + void selectFromSelect() { + assertSql("SELECT * FROM (select e.id from entity e WHERE e.id = (select e1.id from entity1 e1 where e1.id = ?))", + "SELECT * FROM (SELECT e.id FROM entity e WHERE e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1)"); + } + + @Test + void selectBodySubSelect() { + assertSql("select t1.col1,(select t2.col2 from t2 t2 where t1.col1=t2.col1) from t1 t1", + "SELECT t1.col1, (SELECT t2.col2 FROM t2 t2 WHERE t1.col1 = t2.col1 AND t2.tenant_id = 1) FROM t1 t1 WHERE t1.tenant_id = 1"); + } + + @Test + void selectLeftJoin() { + // left join + assertSql("SELECT * FROM entity e " + + "left join entity1 e1 on e1.id = e.id " + + "WHERE e.id = ? OR e.name = ?", + "SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); + + assertSql("SELECT * FROM entity e " + + "left join entity1 e1 on e1.id = e.id " + + "WHERE (e.id = ? OR e.name = ?)", + "SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); + } + + @Test + void selectRightJoin() { + // right join + assertSql("SELECT * FROM entity e " + + "right join entity1 e1 on e1.id = e.id", + "SELECT * FROM entity e " + + "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE e.tenant_id = 1"); + + assertSql("SELECT * FROM entity e " + + "right join entity1 e1 on e1.id = e.id " + + "WHERE e.id = ? OR e.name = ?", + "SELECT * FROM entity e " + + "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); + } + + @Test + void selectLeftJoinMultipleTrailingOn() { + // 多个 on 尾缀的 + assertSql("SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 " + + "LEFT JOIN entity2 e2 ON e2.id = e1.id " + + "ON e1.id = e.id " + + "WHERE (e.id = ? OR e.NAME = ?)", + "SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 " + + "LEFT JOIN entity2 e2 ON e2.id = e1.id AND e2.tenant_id = 1 " + + "ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.NAME = ?) AND e.tenant_id = 1"); + + assertSql("SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 " + + "LEFT JOIN with_as_A e2 ON e2.id = e1.id " + + "ON e1.id = e.id " + + "WHERE (e.id = ? OR e.NAME = ?)", + "SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 " + + "LEFT JOIN with_as_A e2 ON e2.id = e1.id " + + "ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.NAME = ?) AND e.tenant_id = 1"); + } + + @Test + void selectInnerJoin() { + // inner join + assertSql("SELECT * FROM entity e " + + "inner join entity1 e1 on e1.id = e.id " + + "WHERE e.id = ? OR e.name = ?", + "SELECT * FROM entity e " + + "INNER JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); + + assertSql("SELECT * FROM entity e " + + "inner join entity1 e1 on e1.id = e.id " + + "WHERE (e.id = ? OR e.name = ?)", + "SELECT * FROM entity e " + + "INNER JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); + + // 垃圾 inner join todo +// assertSql("SELECT * FROM entity,entity1 " + +// "WHERE entity.id = entity1.id", +// "SELECT * FROM entity e " + +// "INNER JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + +// "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); + } + + @Test + void selectWithAs() { + assertSql("with with_as_A as (select * from entity) select * from with_as_A", + "WITH with_as_A AS (SELECT * FROM entity WHERE tenant_id = 1) SELECT * FROM with_as_A"); + } + + private void assertSql(String sql, String targetSql) { + assertEquals(targetSql, interceptor.parserSingle(sql, null)); + } + + // ========== 额外的测试 ========== + + @Test + public void testSelectSingle() { + // 单表 + assertSql("select * from t_user where id = ?", + "SELECT * FROM t_user WHERE id = ? AND tenant_id = 1 AND dept_id IN (10, 20)"); + + assertSql("select * from t_user where id = ? or name = ?", + "SELECT * FROM t_user WHERE (id = ? OR name = ?) AND tenant_id = 1 AND dept_id IN (10, 20)"); + + assertSql("SELECT * FROM t_user WHERE (id = ? OR name = ?)", + "SELECT * FROM t_user WHERE (id = ? OR name = ?) AND tenant_id = 1 AND dept_id IN (10, 20)"); + + /* not */ + assertSql("SELECT * FROM t_user WHERE not (id = ? OR name = ?)", + "SELECT * FROM t_user WHERE NOT (id = ? OR name = ?) AND tenant_id = 1 AND dept_id IN (10, 20)"); + } + + @Test + public void testSelectLeftJoin() { + // left join + assertSql("SELECT * FROM t_user e " + + "left join t_role e1 on e1.id = e.id " + + "WHERE e.id = ? OR e.name = ?", + "SELECT * FROM t_user e " + + "LEFT JOIN t_role e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1 AND e.dept_id IN (10, 20)"); + + // 条件 e.id = ? OR e.name = ? 带括号 + assertSql("SELECT * FROM t_user e " + + "left join t_role e1 on e1.id = e.id " + + "WHERE (e.id = ? OR e.name = ?)", + "SELECT * FROM t_user e " + + "LEFT JOIN t_role e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1 AND e.dept_id IN (10, 20)"); + } + + @Test + public void testSelectRightJoin() { + // right join + assertSql("SELECT * FROM t_user e " + + "right join t_role e1 on e1.id = e.id " + + "WHERE e.id = ? OR e.name = ?", + "SELECT * FROM t_user e " + + "RIGHT JOIN t_role e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1 AND e.dept_id IN (10, 20)"); + + // 条件 e.id = ? OR e.name = ? 带括号 + assertSql("SELECT * FROM t_user e " + + "right join t_role e1 on e1.id = e.id " + + "WHERE (e.id = ? OR e.name = ?)", + "SELECT * FROM t_user e " + + "RIGHT JOIN t_role e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1 AND e.dept_id IN (10, 20)"); + } + + @Test + public void testSelectInnerJoin() { + // inner join + assertSql("SELECT * FROM t_user e " + + "inner join entity1 e1 on e1.id = e.id " + + "WHERE e.id = ? OR e.name = ?", + "SELECT * FROM t_user e " + + "INNER JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1 AND e.dept_id IN (10, 20)"); + + // 条件 e.id = ? OR e.name = ? 带括号 + assertSql("SELECT * FROM t_user e " + + "inner join t_role e1 on e1.id = e.id " + + "WHERE (e.id = ? OR e.name = ?)", + "SELECT * FROM t_user e " + + "INNER JOIN t_role e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1 AND e.dept_id IN (10, 20)"); + + // 垃圾 inner join todo +// assertSql("SELECT * FROM entity,entity1 " + +// "WHERE entity.id = entity1.id", +// "SELECT * FROM entity e " + +// "INNER JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + +// "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest.java new file mode 100644 index 0000000..e0a6bd9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest.java @@ -0,0 +1,145 @@ +package com.jojubanking.boot.framework.datapermission.core.rule; + +import com.jojubanking.boot.framework.datapermission.core.annotation.DataPermission; +import com.jojubanking.boot.framework.datapermission.core.aop.DataPermissionContextHolder; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.expression.Expression; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Spy; +import org.springframework.core.annotation.AnnotationUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomString; +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link DataPermissionRuleFactoryImpl} 单元测试 + * + * @author TW + */ +class DataPermissionRuleFactoryImplTest extends BaseMockitoUnitTest { + + @InjectMocks + private DataPermissionRuleFactoryImpl dataPermissionRuleFactory; + + @Spy + private List rules = Arrays.asList(new DataPermissionRule01(), + new DataPermissionRule02()); + + @BeforeEach + public void setUp() { + DataPermissionContextHolder.clear(); + } + + @Test + public void testGetDataPermissionRule_02() { + // 准备参数 + String mappedStatementId = randomString(); + + // 调用 + List result = dataPermissionRuleFactory.getDataPermissionRule(mappedStatementId); + // 断言 + assertSame(rules, result); + } + + @Test + public void testGetDataPermissionRule_03() { + // 准备参数 + String mappedStatementId = randomString(); + // mock 方法 + DataPermissionContextHolder.add(AnnotationUtils.findAnnotation(TestClass03.class, DataPermission.class)); + + // 调用 + List result = dataPermissionRuleFactory.getDataPermissionRule(mappedStatementId); + // 断言 + assertTrue(result.isEmpty()); + } + + @Test + public void testGetDataPermissionRule_04() { + // 准备参数 + String mappedStatementId = randomString(); + // mock 方法 + DataPermissionContextHolder.add(AnnotationUtils.findAnnotation(TestClass04.class, DataPermission.class)); + + // 调用 + List result = dataPermissionRuleFactory.getDataPermissionRule(mappedStatementId); + // 断言 + assertEquals(1, result.size()); + assertEquals(DataPermissionRule01.class, result.get(0).getClass()); + } + + @Test + public void testGetDataPermissionRule_05() { + // 准备参数 + String mappedStatementId = randomString(); + // mock 方法 + DataPermissionContextHolder.add(AnnotationUtils.findAnnotation(TestClass05.class, DataPermission.class)); + + // 调用 + List result = dataPermissionRuleFactory.getDataPermissionRule(mappedStatementId); + // 断言 + assertEquals(1, result.size()); + assertEquals(DataPermissionRule02.class, result.get(0).getClass()); + } + + @Test + public void testGetDataPermissionRule_06() { + // 准备参数 + String mappedStatementId = randomString(); + // mock 方法 + DataPermissionContextHolder.add(AnnotationUtils.findAnnotation(TestClass06.class, DataPermission.class)); + + // 调用 + List result = dataPermissionRuleFactory.getDataPermissionRule(mappedStatementId); + // 断言 + assertSame(rules, result); + } + + @DataPermission(enable = false) + static class TestClass03 {} + + @DataPermission(includeRules = DataPermissionRule01.class) + static class TestClass04 {} + + @DataPermission(excludeRules = DataPermissionRule01.class) + static class TestClass05 {} + + @DataPermission + static class TestClass06 {} + + static class DataPermissionRule01 implements DataPermissionRule { + + @Override + public Set getTableNames() { + return null; + } + + @Override + public Expression getExpression(String tableName, Alias tableAlias) { + return null; + } + + } + + static class DataPermissionRule02 implements DataPermissionRule { + + @Override + public Set getTableNames() { + return null; + } + + @Override + public Expression getExpression(String tableName, Alias tableAlias) { + return null; + } + + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRuleTest.java b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRuleTest.java new file mode 100644 index 0000000..87efd6c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/src/test/java/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRuleTest.java @@ -0,0 +1,234 @@ +package com.jojubanking.boot.framework.datapermission.core.rule.dept; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ReflectUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.util.collection.SetUtils; +import com.jojubanking.boot.module.system.api.permission.PermissionApi; +import com.jojubanking.boot.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.jojubanking.boot.framework.security.core.LoginUser; +import com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.expression.Expression; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockedStatic; + +import java.util.Map; + +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomString; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.same; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.when; + +/** + * {@link DeptDataPermissionRule} 的单元测试 + * + * @author TW + */ +class DeptDataPermissionRuleTest extends BaseMockitoUnitTest { + + @InjectMocks + private DeptDataPermissionRule rule; + + @Mock + private PermissionApi permissionApi; + + @BeforeEach + @SuppressWarnings("unchecked") + public void setUp() { + // 清空 rule + rule.getTableNames().clear(); + ((Map) ReflectUtil.getFieldValue(rule, "deptColumns")).clear(); + ((Map) ReflectUtil.getFieldValue(rule, "deptColumns")).clear(); + } + + @Test // 无 LoginUser + public void testGetExpression_noLoginUser() { + // 准备参数 + String tableName = randomString(); + Alias tableAlias = new Alias(randomString()); + // mock 方法 + + // 调用 + Expression expression = rule.getExpression(tableName, tableAlias); + // 断言 + assertNull(expression); + } + + @Test // 无数据权限时 + public void testGetExpression_noDeptDataPermission() { + try (MockedStatic securityFrameworkUtilsMock + = mockStatic(SecurityFrameworkUtils.class)) { + // 准备参数 + String tableName = "t_user"; + Alias tableAlias = new Alias("u"); + // mock 方法 + LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) + .setUserType(UserTypeEnum.ADMIN.getValue())); + securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); + + // 调用 + NullPointerException exception = assertThrows(NullPointerException.class, + () -> rule.getExpression(tableName, tableAlias)); + // 断言 + assertEquals("LoginUser(1) Table(t_user/u) 未返回数据权限", exception.getMessage()); + } + } + + @Test // 全部数据权限 + public void testGetExpression_allDeptDataPermission() { + try (MockedStatic securityFrameworkUtilsMock + = mockStatic(SecurityFrameworkUtils.class)) { + // 准备参数 + String tableName = "t_user"; + Alias tableAlias = new Alias("u"); + // mock 方法(LoginUser) + LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) + .setUserType(UserTypeEnum.ADMIN.getValue())); + securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); + // mock 方法(DeptDataPermissionRespDTO) + DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO().setAll(true); + when(permissionApi.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission); + + // 调用 + Expression expression = rule.getExpression(tableName, tableAlias); + // 断言 + assertNull(expression); + assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); + } + } + + @Test // 即不能查看部门,又不能查看自己,则说明 100% 无权限 + public void testGetExpression_noDept_noSelf() { + try (MockedStatic securityFrameworkUtilsMock + = mockStatic(SecurityFrameworkUtils.class)) { + // 准备参数 + String tableName = "t_user"; + Alias tableAlias = new Alias("u"); + // mock 方法(LoginUser) + LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) + .setUserType(UserTypeEnum.ADMIN.getValue())); + securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); + // mock 方法(DeptDataPermissionRespDTO) + DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO(); + when(permissionApi.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission); + + // 调用 + Expression expression = rule.getExpression(tableName, tableAlias); + // 断言 + assertEquals("null = null", expression.toString()); + assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); + } + } + + @Test // 拼接 Dept 和 User 的条件(字段都不符合) + public void testGetExpression_noDeptColumn_noSelfColumn() { + try (MockedStatic securityFrameworkUtilsMock + = mockStatic(SecurityFrameworkUtils.class)) { + // 准备参数 + String tableName = "t_user"; + Alias tableAlias = new Alias("u"); + // mock 方法(LoginUser) + LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) + .setUserType(UserTypeEnum.ADMIN.getValue())); + securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); + // mock 方法(DeptDataPermissionRespDTO) + DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO() + .setDeptIds(SetUtils.asSet(10L, 20L)).setSelf(true); + when(permissionApi.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission); + + // 调用 + Expression expression = rule.getExpression(tableName, tableAlias); + // 断言 + assertSame(DeptDataPermissionRule.EXPRESSION_NULL, expression); + assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); + } + } + + @Test // 拼接 Dept 和 User 的条件(self 符合) + public void testGetExpression_noDeptColumn_yesSelfColumn() { + try (MockedStatic securityFrameworkUtilsMock + = mockStatic(SecurityFrameworkUtils.class)) { + // 准备参数 + String tableName = "t_user"; + Alias tableAlias = new Alias("u"); + // mock 方法(LoginUser) + LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) + .setUserType(UserTypeEnum.ADMIN.getValue())); + securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); + // mock 方法(DeptDataPermissionRespDTO) + DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO() + .setSelf(true); + when(permissionApi.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission); + // 添加 user 字段配置 + rule.addUserColumn("t_user", "id"); + + // 调用 + Expression expression = rule.getExpression(tableName, tableAlias); + // 断言 + assertEquals("u.id = 1", expression.toString()); + assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); + } + } + + @Test // 拼接 Dept 和 User 的条件(dept 符合) + public void testGetExpression_yesDeptColumn_noSelfColumn() { + try (MockedStatic securityFrameworkUtilsMock + = mockStatic(SecurityFrameworkUtils.class)) { + // 准备参数 + String tableName = "t_user"; + Alias tableAlias = new Alias("u"); + // mock 方法(LoginUser) + LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) + .setUserType(UserTypeEnum.ADMIN.getValue())); + securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); + // mock 方法(DeptDataPermissionRespDTO) + DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO() + .setDeptIds(CollUtil.newLinkedHashSet(10L, 20L)); + when(permissionApi.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission); + // 添加 dept 字段配置 + rule.addDeptColumn("t_user", "dept_id"); + + // 调用 + Expression expression = rule.getExpression(tableName, tableAlias); + // 断言 + assertEquals("u.dept_id IN (10, 20)", expression.toString()); + assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); + } + } + + @Test // 拼接 Dept 和 User 的条件(dept + self 符合) + public void testGetExpression_yesDeptColumn_yesSelfColumn() { + try (MockedStatic securityFrameworkUtilsMock + = mockStatic(SecurityFrameworkUtils.class)) { + // 准备参数 + String tableName = "t_user"; + Alias tableAlias = new Alias("u"); + // mock 方法(LoginUser) + LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L) + .setUserType(UserTypeEnum.ADMIN.getValue())); + securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser); + // mock 方法(DeptDataPermissionRespDTO) + DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO() + .setDeptIds(CollUtil.newLinkedHashSet(10L, 20L)).setSelf(true); + when(permissionApi.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission); + // 添加 user 字段配置 + rule.addUserColumn("t_user", "id"); + // 添加 dept 字段配置 + rule.addDeptColumn("t_user", "dept_id"); + + // 调用 + Expression expression = rule.getExpression(tableName, tableAlias); + // 断言 + assertEquals("u.dept_id IN (10, 20) OR u.id = 1", expression.toString()); + assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class)); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..59a8c49 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.datapermission.config.JojuDataPermissionAutoConfiguration,\ + com.jojubanking.boot.framework.datapermission.config.JojuDeptDataPermissionAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/config/JojuDataPermissionAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/config/JojuDataPermissionAutoConfiguration.class new file mode 100644 index 0000000..09ee6de Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/config/JojuDataPermissionAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/config/JojuDeptDataPermissionAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/config/JojuDeptDataPermissionAutoConfiguration.class new file mode 100644 index 0000000..6003008 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/config/JojuDeptDataPermissionAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/annotation/DataPermission.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/annotation/DataPermission.class new file mode 100644 index 0000000..663e9f6 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/annotation/DataPermission.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.class new file mode 100644 index 0000000..f54b0a3 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationAdvisor.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.class new file mode 100644 index 0000000..b1d6f7a Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptor.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionContextHolder.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionContextHolder.class new file mode 100644 index 0000000..c0b99b7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionContextHolder.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptor$ContextHolder.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptor$ContextHolder.class new file mode 100644 index 0000000..c355b77 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptor$ContextHolder.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptor$MappedStatementCache.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptor$MappedStatementCache.class new file mode 100644 index 0000000..30e4724 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptor$MappedStatementCache.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptor.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptor.class new file mode 100644 index 0000000..e874a29 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptor.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRule.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRule.class new file mode 100644 index 0000000..5cb8e3e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRule.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactory.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactory.class new file mode 100644 index 0000000..a04dcb2 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactory.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.class new file mode 100644 index 0000000..bcc20ac Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRule.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRule.class new file mode 100644 index 0000000..467cb79 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRule.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.class new file mode 100644 index 0000000..3020636 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/classes/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRuleCustomizer.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/joju-spring-boot-starter-biz-data-permission-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/joju-spring-boot-starter-biz-data-permission-2.0.0-beta.jar new file mode 100644 index 0000000..fabce6a Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/joju-spring-boot-starter-biz-data-permission-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-archiver/pom.properties new file mode 100644 index 0000000..6b2ebf8 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:36 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-biz-data-permission diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..1e0b139 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,14 @@ +com\jojubanking\boot\framework\datapermission\core\rule\dept\DeptDataPermissionRuleCustomizer.class +com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptor$ContextHolder.class +com\jojubanking\boot\framework\datapermission\config\JojuDeptDataPermissionAutoConfiguration.class +com\jojubanking\boot\framework\datapermission\core\annotation\DataPermission.class +com\jojubanking\boot\framework\datapermission\config\JojuDataPermissionAutoConfiguration.class +com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptor.class +com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionContextHolder.class +com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRuleFactoryImpl.class +com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRule.class +com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionAnnotationAdvisor.class +com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptor$MappedStatementCache.class +com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionAnnotationInterceptor.class +com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRuleFactory.class +com\jojubanking\boot\framework\datapermission\core\rule\dept\DeptDataPermissionRule.class diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..2105bd5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,14 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRule.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionAnnotationAdvisor.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\core\rule\dept\DeptDataPermissionRule.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionContextHolder.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\core\rule\dept\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\core\annotation\DataPermission.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptor.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\config\JojuDataPermissionAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionAnnotationInterceptor.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\core\rule\dept\DeptDataPermissionRuleCustomizer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\config\JojuDeptDataPermissionAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRuleFactoryImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRuleFactory.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-data-permission\src\main\java\com\jojubanking\boot\framework\datapermission\package-info.java diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..17ee71d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1,20 @@ +com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest$TestClass.class +com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$TestClass06.class +com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest$1.class +com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$TestClass05.class +com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionContextHolderTest.class +com\jojubanking\boot\framework\datapermission\core\rule\dept\DeptDataPermissionRuleTest.class +com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest.class +com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest$TestNone.class +com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest$TestMethod.class +com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$TestClass03.class +com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest2$2.class +com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest2$1.class +com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest$EmptyDataPermissionRule.class +com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest2.class +com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$TestClass04.class +com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest$DeptDataPermissionRule.class +com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest.class +com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$DataPermissionRule02.class +com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest$DataPermissionRule01.class +com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest.class diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..1c5a690 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1,6 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-data-permission\src\test\java\com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest2.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-data-permission\src\test\java\com\jojubanking\boot\framework\datapermission\core\rule\DataPermissionRuleFactoryImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-data-permission\src\test\java\com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionContextHolderTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-data-permission\src\test\java\com\jojubanking\boot\framework\datapermission\core\db\DataPermissionDatabaseInterceptorTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-data-permission\src\test\java\com\jojubanking\boot\framework\datapermission\core\aop\DataPermissionAnnotationInterceptorTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-data-permission\src\test\java\com\jojubanking\boot\framework\datapermission\core\rule\dept\DeptDataPermissionRuleTest.java diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest$TestClass.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest$TestClass.class new file mode 100644 index 0000000..b1dfa99 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest$TestClass.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest$TestMethod.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest$TestMethod.class new file mode 100644 index 0000000..10eae4e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest$TestMethod.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest$TestNone.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest$TestNone.class new file mode 100644 index 0000000..8143b95 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest$TestNone.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest.class new file mode 100644 index 0000000..3513479 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionContextHolderTest.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionContextHolderTest.class new file mode 100644 index 0000000..bea159b Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/aop/DataPermissionContextHolderTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest$1.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest$1.class new file mode 100644 index 0000000..4f7a164 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest$DeptDataPermissionRule.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest$DeptDataPermissionRule.class new file mode 100644 index 0000000..83bfd07 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest$DeptDataPermissionRule.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest$EmptyDataPermissionRule.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest$EmptyDataPermissionRule.class new file mode 100644 index 0000000..de4a523 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest$EmptyDataPermissionRule.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest.class new file mode 100644 index 0000000..d49cc55 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest2$1.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest2$1.class new file mode 100644 index 0000000..a55b17b Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest2$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest2$2.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest2$2.class new file mode 100644 index 0000000..fb480d4 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest2$2.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest2.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest2.class new file mode 100644 index 0000000..05230ff Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/db/DataPermissionDatabaseInterceptorTest2.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$DataPermissionRule01.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$DataPermissionRule01.class new file mode 100644 index 0000000..5d4fdda Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$DataPermissionRule01.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$DataPermissionRule02.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$DataPermissionRule02.class new file mode 100644 index 0000000..e8cff0a Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$DataPermissionRule02.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$TestClass03.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$TestClass03.class new file mode 100644 index 0000000..296b0b6 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$TestClass03.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$TestClass04.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$TestClass04.class new file mode 100644 index 0000000..ddb54d0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$TestClass04.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$TestClass05.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$TestClass05.class new file mode 100644 index 0000000..6188853 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$TestClass05.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$TestClass06.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$TestClass06.class new file mode 100644 index 0000000..6cdcda2 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest$TestClass06.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest.class new file mode 100644 index 0000000..f851bc7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRuleTest.class b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRuleTest.class new file mode 100644 index 0000000..62160c8 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-data-permission/target/test-classes/com/jojubanking/boot/framework/datapermission/core/rule/dept/DeptDataPermissionRuleTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/joju-spring-boot-starter-biz-dict.iml b/joju-framework/joju-spring-boot-starter-biz-dict/joju-spring-boot-starter-biz-dict.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-dict/joju-spring-boot-starter-biz-dict.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/pom.xml b/joju-framework/joju-spring-boot-starter-biz-dict/pom.xml new file mode 100644 index 0000000..3a38e3b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-dict/pom.xml @@ -0,0 +1,43 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-biz-dict + jar + + ${project.artifactId} + 字典类型、数据 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + org.springframework.boot + spring-boot-starter + + + + + com.jojubanking.boot + joju-module-system-api + ${revision} + + + + + com.google.guava + guava + + + diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/src/main/java/com/jojubanking/boot/framework/dict/config/JojuDictAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-biz-dict/src/main/java/com/jojubanking/boot/framework/dict/config/JojuDictAutoConfiguration.java new file mode 100644 index 0000000..7731db2 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-dict/src/main/java/com/jojubanking/boot/framework/dict/config/JojuDictAutoConfiguration.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.framework.dict.config; + +import com.jojubanking.boot.framework.dict.core.util.DictFrameworkUtils; +import com.jojubanking.boot.module.system.api.dict.DictDataApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class JojuDictAutoConfiguration { + + @Bean + @SuppressWarnings("InstantiationOfUtilityClass") + public DictFrameworkUtils dictUtils(DictDataApi dictDataApi) { + DictFrameworkUtils.init(dictDataApi); + return new DictFrameworkUtils(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/src/main/java/com/jojubanking/boot/framework/dict/core/package-info.java b/joju-framework/joju-spring-boot-starter-biz-dict/src/main/java/com/jojubanking/boot/framework/dict/core/package-info.java new file mode 100644 index 0000000..736bfaf --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-dict/src/main/java/com/jojubanking/boot/framework/dict/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.jojubanking.boot.framework.dict.core; diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/src/main/java/com/jojubanking/boot/framework/dict/core/util/DictFrameworkUtils.java b/joju-framework/joju-spring-boot-starter-biz-dict/src/main/java/com/jojubanking/boot/framework/dict/core/util/DictFrameworkUtils.java new file mode 100644 index 0000000..b3e9a8f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-dict/src/main/java/com/jojubanking/boot/framework/dict/core/util/DictFrameworkUtils.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.framework.dict.core.util; + +import cn.hutool.core.util.ObjectUtil; +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.common.util.cache.CacheUtils; +import com.jojubanking.boot.module.system.api.dict.DictDataApi; +import com.jojubanking.boot.module.system.api.dict.dto.DictDataRespDTO; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.time.Duration; + +/** + * 字典工具类 + * + * @author TW + */ +@Slf4j +public class DictFrameworkUtils { + + private static DictDataApi dictDataApi; + + private static final DictDataRespDTO DICT_DATA_NULL = new DictDataRespDTO(); + + /** + * 针对 {@link #getDictDataLabel(String, String)} 的缓存 + */ + private static final LoadingCache, DictDataRespDTO> getDictDataCache = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader, DictDataRespDTO>() { + + @Override + public DictDataRespDTO load(KeyValue key) { + return ObjectUtil.defaultIfNull(dictDataApi.getDictData(key.getKey(), key.getValue()), DICT_DATA_NULL); + } + + }); + + /** + * 针对 {@link #parseDictDataValue(String, String)} 的缓存 + */ + private static final LoadingCache, DictDataRespDTO> parseDictDataCache = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader, DictDataRespDTO>() { + + @Override + public DictDataRespDTO load(KeyValue key) { + return ObjectUtil.defaultIfNull(dictDataApi.parseDictData(key.getKey(), key.getValue()), DICT_DATA_NULL); + } + + }); + + public static void init(DictDataApi dictDataApi) { + DictFrameworkUtils.dictDataApi = dictDataApi; + log.info("[init][初始化 DictFrameworkUtils 成功]"); + } + + @SneakyThrows + public static String getDictDataLabel(String dictType, String value) { + return getDictDataCache.get(new KeyValue<>(dictType, value)).getLabel(); + } + + @SneakyThrows + public static String parseDictDataValue(String dictType, String label) { + return parseDictDataCache.get(new KeyValue<>(dictType, label)).getValue(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/src/main/java/com/jojubanking/boot/framework/dict/package-info.java b/joju-framework/joju-spring-boot-starter-biz-dict/src/main/java/com/jojubanking/boot/framework/dict/package-info.java new file mode 100644 index 0000000..6e3f6a4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-dict/src/main/java/com/jojubanking/boot/framework/dict/package-info.java @@ -0,0 +1,6 @@ +/** + * 字典数据模块,提供 {@link com.jojubanking.boot.framework.dict.core.util.DictFrameworkUtils} 工具类 + * + * 通过将字典缓存在内存中,保证性能 + */ +package com.jojubanking.boot.framework.dict; diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-dict/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..85eaa37 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-dict/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.dict.config.JojuDictAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..85eaa37 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.dict.config.JojuDictAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/com/jojubanking/boot/framework/dict/config/JojuDictAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/com/jojubanking/boot/framework/dict/config/JojuDictAutoConfiguration.class new file mode 100644 index 0000000..86b3100 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/com/jojubanking/boot/framework/dict/config/JojuDictAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/com/jojubanking/boot/framework/dict/core/util/DictFrameworkUtils$1.class b/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/com/jojubanking/boot/framework/dict/core/util/DictFrameworkUtils$1.class new file mode 100644 index 0000000..4e1e6ab Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/com/jojubanking/boot/framework/dict/core/util/DictFrameworkUtils$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/com/jojubanking/boot/framework/dict/core/util/DictFrameworkUtils$2.class b/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/com/jojubanking/boot/framework/dict/core/util/DictFrameworkUtils$2.class new file mode 100644 index 0000000..5fc4c02 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/com/jojubanking/boot/framework/dict/core/util/DictFrameworkUtils$2.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/com/jojubanking/boot/framework/dict/core/util/DictFrameworkUtils.class b/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/com/jojubanking/boot/framework/dict/core/util/DictFrameworkUtils.class new file mode 100644 index 0000000..953b817 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-dict/target/classes/com/jojubanking/boot/framework/dict/core/util/DictFrameworkUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/target/joju-spring-boot-starter-biz-dict-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-biz-dict/target/joju-spring-boot-starter-biz-dict-2.0.0-beta.jar new file mode 100644 index 0000000..0e86582 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-dict/target/joju-spring-boot-starter-biz-dict-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-biz-dict/target/maven-archiver/pom.properties new file mode 100644 index 0000000..d329dd6 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-dict/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:33 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-biz-dict diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-biz-dict/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..cb3281a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-dict/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,4 @@ +com\jojubanking\boot\framework\dict\core\util\DictFrameworkUtils$1.class +com\jojubanking\boot\framework\dict\config\JojuDictAutoConfiguration.class +com\jojubanking\boot\framework\dict\core\util\DictFrameworkUtils.class +com\jojubanking\boot\framework\dict\core\util\DictFrameworkUtils$2.class diff --git a/joju-framework/joju-spring-boot-starter-biz-dict/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-biz-dict/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..56958a7 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-dict/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,4 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-dict\src\main\java\com\jojubanking\boot\framework\dict\config\JojuDictAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-dict\src\main\java\com\jojubanking\boot\framework\dict\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-dict\src\main\java\com\jojubanking\boot\framework\dict\core\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-dict\src\main\java\com\jojubanking\boot\framework\dict\core\util\DictFrameworkUtils.java diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/joju-spring-boot-starter-biz-error-code.iml b/joju-framework/joju-spring-boot-starter-biz-error-code/joju-spring-boot-starter-biz-error-code.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/joju-spring-boot-starter-biz-error-code.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/pom.xml b/joju-framework/joju-spring-boot-starter-biz-error-code/pom.xml new file mode 100644 index 0000000..d6424d6 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/pom.xml @@ -0,0 +1,49 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-biz-error-code + jar + + ${project.artifactId} + + 错误码 ErrorCode 的自动配置功能,提供如下功能: + 1. 远程读取:项目启动时,从 system-server 服务,读取数据库中的 ErrorCode 错误码,实现错误码的提水可配置; + 2. 自动更新:管理员在管理后台修数据库中的 ErrorCode 错误码时,项目自动从 system-server 服务加载最新的 ErrorCode 错误码; + 3. 自动写入:项目启动时,将项目本地的错误码写到 system-server 服务中,方便管理员在管理后台编辑; + + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + org.springframework.boot + spring-boot-starter + + + + + com.jojubanking.boot + joju-module-system-api + ${revision} + + + + jakarta.validation + jakarta.validation-api + provided + + + + diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/config/ErrorCodeProperties.java b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/config/ErrorCodeProperties.java new file mode 100644 index 0000000..b60ec51 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/config/ErrorCodeProperties.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.framework.errorcode.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 错误码的配置属性类 + * + * @author dlyan + */ +@ConfigurationProperties("joju.error-code") +@Data +@Validated +public class ErrorCodeProperties { + + /** + * 是否开启 + */ + private Boolean enable = true; + /** + * 错误码枚举类 + */ + @NotNull(message = "错误码枚举类不能为空") + private List constantsClassList; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/config/JojuErrorCodeConfiguration.java b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/config/JojuErrorCodeConfiguration.java new file mode 100644 index 0000000..b689c27 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/config/JojuErrorCodeConfiguration.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.framework.errorcode.config; + +import com.jojubanking.boot.framework.errorcode.core.generator.ErrorCodeAutoGenerator; +import com.jojubanking.boot.framework.errorcode.core.generator.ErrorCodeAutoGeneratorImpl; +import com.jojubanking.boot.framework.errorcode.core.loader.ErrorCodeLoader; +import com.jojubanking.boot.framework.errorcode.core.loader.ErrorCodeLoaderImpl; +import com.jojubanking.boot.module.system.api.errorcode.ErrorCodeApi; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * 错误码配置类 + * + * @author TW + */ +@Configuration +@ConditionalOnProperty(prefix = "joju.error-code", value = "enable", matchIfMissing = true) // 允许使用 joju.error-code.enable=false 禁用访问日志 +@EnableConfigurationProperties(ErrorCodeProperties.class) +@EnableScheduling // 开启调度任务的功能,因为 ErrorCodeRemoteLoader 通过定时刷新错误码 +public class JojuErrorCodeConfiguration { + + @Bean + public ErrorCodeAutoGenerator errorCodeAutoGenerator(@Value("${spring.application.name}") String applicationName, + ErrorCodeProperties errorCodeProperties, + ErrorCodeApi errorCodeApi) { + return new ErrorCodeAutoGeneratorImpl(applicationName, errorCodeProperties.getConstantsClassList(), errorCodeApi); + } + + @Bean + public ErrorCodeLoader errorCodeLoader(@Value("${spring.application.name}") String applicationName, + ErrorCodeApi errorCodeApi) { + return new ErrorCodeLoaderImpl(applicationName, errorCodeApi); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java new file mode 100644 index 0000000..e856690 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java @@ -0,0 +1,15 @@ +package com.jojubanking.boot.framework.errorcode.core.generator; + +/** + * 错误码的自动生成器 + * + * @author dylan + */ +public interface ErrorCodeAutoGenerator { + + /** + * 将配置类到错误码写入数据库 + */ + void execute(); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java new file mode 100644 index 0000000..5aaf4f4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java @@ -0,0 +1,104 @@ +package com.jojubanking.boot.framework.errorcode.core.generator; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ReflectUtil; +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.module.system.api.errorcode.ErrorCodeApi; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ErrorCodeAutoGenerator 的实现类 + * 目的是,扫描指定的 {@link #constantsClassList} 类,写入到 system 服务中 + * + * @author dylan + */ +@RequiredArgsConstructor +@Slf4j +public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator { + + /** + * 应用分组 + */ + private final String applicationName; + /** + * 错误码枚举类 + */ + private final List constantsClassList; + /** + * 错误码 Api + */ + private final ErrorCodeApi errorCodeApi; + + @Override + @EventListener(ApplicationReadyEvent.class) + @Async // 异步,保证项目的启动过程,毕竟非关键流程 + public void execute() { + // 第一步,解析错误码 + List autoGenerateDTOs = parseErrorCode(); + log.info("[execute][解析到错误码数量为 ({}) 个]", autoGenerateDTOs.size()); + + // 第二步,写入到 system 服务 + errorCodeApi.autoGenerateErrorCodes(autoGenerateDTOs); + log.info("[execute][写入到 system 组件完成]"); + } + + /** + * 解析 constantsClassList 变量,转换成错误码数组 + * + * @return 错误码数组 + */ + private List parseErrorCode() { + // 校验 errorCodeConstantsClass 参数 + if (CollUtil.isEmpty(constantsClassList)) { + log.info("[execute][未配置 joju.error-code.constants-class-list 配置项,不进行自动写入到 system 服务中]"); + return new ArrayList<>(); + } + + // 解析错误码 + List autoGenerateDTOs = new ArrayList<>(); + constantsClassList.forEach(constantsClass -> { + try { + // 解析错误码枚举类 + Class errorCodeConstantsClazz = ClassUtil.loadClass(constantsClass); + // 解析错误码 + autoGenerateDTOs.addAll(parseErrorCode(errorCodeConstantsClazz)); + } catch (Exception ex) { + log.warn("[parseErrorCode][constantsClass({}) 加载失败({})]", constantsClass, + ExceptionUtil.getRootCauseMessage(ex)); + } + }); + return autoGenerateDTOs; + } + + /** + * 解析错误码类,获得错误码数组 + * + * @return 错误码数组 + */ + private List parseErrorCode(Class constantsClass) { + List autoGenerateDTOs = new ArrayList<>(); + Arrays.stream(constantsClass.getFields()).forEach(field -> { + if (field.getType() != ErrorCode.class) { + return; + } + // 转换成 ErrorCodeAutoGenerateReqDTO 对象 + ErrorCode errorCode = (ErrorCode) ReflectUtil.getFieldValue(constantsClass, field); + autoGenerateDTOs.add(new ErrorCodeAutoGenerateReqDTO().setApplicationName(applicationName) + .setCode(errorCode.getCode()).setMessage(errorCode.getMsg())); + }); + return autoGenerateDTOs; + } + +} + diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/core/loader/ErrorCodeLoader.java b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/core/loader/ErrorCodeLoader.java new file mode 100644 index 0000000..36bbb24 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/core/loader/ErrorCodeLoader.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.framework.errorcode.core.loader; + +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; + +/** + * 错误码加载器 + * + * 注意,错误码最终加载到 {@link ServiceExceptionUtil} 的 MESSAGES 变量中! + * + * @author dlyan + */ +public interface ErrorCodeLoader { + + /** + * 添加错误码 + * + * @param code 错误码的编号 + * @param msg 错误码的提示 + */ + default void putErrorCode(Integer code, String msg) { + ServiceExceptionUtil.put(code, msg); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java new file mode 100644 index 0000000..123254f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java @@ -0,0 +1,73 @@ +package com.jojubanking.boot.framework.errorcode.core.loader; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.module.system.api.errorcode.ErrorCodeApi; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeRespDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Scheduled; + +import java.util.Date; +import java.util.List; + +/** + * ErrorCodeLoader 的实现类,从 infra 的数据库中,加载错误码。 + * + * 考虑到错误码会刷新,所以按照 {@link #REFRESH_ERROR_CODE_PERIOD} 频率,增量加载错误码。 + * + * @author dlyan + */ +@RequiredArgsConstructor +@Slf4j +public class ErrorCodeLoaderImpl implements ErrorCodeLoader { + + /** + * 刷新错误码的频率,单位:毫秒 + */ + private static final int REFRESH_ERROR_CODE_PERIOD = 60 * 1000; + + /** + * 应用分组 + */ + private final String applicationName; + /** + * 错误码 Api + */ + private final ErrorCodeApi errorCodeApi; + + /** + * 缓存错误码的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private Date maxUpdateTime; + + @EventListener(ApplicationReadyEvent.class) + public void loadErrorCodes() { + this.loadErrorCodes0(); + } + + @Scheduled(fixedDelay = REFRESH_ERROR_CODE_PERIOD, initialDelay = REFRESH_ERROR_CODE_PERIOD) + public void refreshErrorCodes() { + this.loadErrorCodes0(); + } + + private void loadErrorCodes0() { + // 加载错误码 + List errorCodeRespDTOs = errorCodeApi.getErrorCodeList(applicationName, maxUpdateTime); + if (CollUtil.isEmpty(errorCodeRespDTOs)) { + return; + } + log.info("[loadErrorCodes0][加载到 ({}) 个错误码]", errorCodeRespDTOs.size()); + + // 刷新错误码的缓存 + errorCodeRespDTOs.forEach(errorCodeRespDTO -> { + // 写入到错误码的缓存 + putErrorCode(errorCodeRespDTO.getCode(), errorCodeRespDTO.getMessage()); + // 记录下更新时间,方便增量更新 + maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeRespDTO.getUpdateTime()); + }); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/package-info.java b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/package-info.java new file mode 100644 index 0000000..68663cc --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/java/com/jojubanking/boot/framework/errorcode/package-info.java @@ -0,0 +1,10 @@ +/** + * 错误码 ErrorCode 的自动配置功能,提供如下功能: + * + * 1. 远程读取:项目启动时,从 system-service 服务,读取数据库中的 ErrorCode 错误码,实现错误码的提水可配置; + * 2. 自动更新:管理员在管理后台修数据库中的 ErrorCode 错误码时,项目自动从 system-service 服务加载最新的 ErrorCode 错误码; + * 3. 自动写入:项目启动时,将项目本地的错误码写到 system-server 服务中,方便管理员在管理后台编辑; + * + * @author TW + */ +package com.jojubanking.boot.framework.errorcode; diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..e8f9d65 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.errorcode.config.JojuErrorCodeConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..e8f9d65 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.errorcode.config.JojuErrorCodeConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/config/ErrorCodeProperties.class b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/config/ErrorCodeProperties.class new file mode 100644 index 0000000..e277796 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/config/ErrorCodeProperties.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/config/JojuErrorCodeConfiguration.class b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/config/JojuErrorCodeConfiguration.class new file mode 100644 index 0000000..b163e23 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/config/JojuErrorCodeConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/core/generator/ErrorCodeAutoGenerator.class b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/core/generator/ErrorCodeAutoGenerator.class new file mode 100644 index 0000000..dda20ca Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/core/generator/ErrorCodeAutoGenerator.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.class b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.class new file mode 100644 index 0000000..1c2a083 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/core/loader/ErrorCodeLoader.class b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/core/loader/ErrorCodeLoader.class new file mode 100644 index 0000000..63cbedf Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/core/loader/ErrorCodeLoader.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/core/loader/ErrorCodeLoaderImpl.class b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/core/loader/ErrorCodeLoaderImpl.class new file mode 100644 index 0000000..405da65 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-error-code/target/classes/com/jojubanking/boot/framework/errorcode/core/loader/ErrorCodeLoaderImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/target/joju-spring-boot-starter-biz-error-code-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-biz-error-code/target/joju-spring-boot-starter-biz-error-code-2.0.0-beta.jar new file mode 100644 index 0000000..7a5b5ad Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-error-code/target/joju-spring-boot-starter-biz-error-code-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-biz-error-code/target/maven-archiver/pom.properties new file mode 100644 index 0000000..ea3775d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:28:37 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-biz-error-code diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-biz-error-code/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..209801b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,6 @@ +com\jojubanking\boot\framework\errorcode\config\ErrorCodeProperties.class +com\jojubanking\boot\framework\errorcode\core\loader\ErrorCodeLoader.class +com\jojubanking\boot\framework\errorcode\core\generator\ErrorCodeAutoGenerator.class +com\jojubanking\boot\framework\errorcode\core\generator\ErrorCodeAutoGeneratorImpl.class +com\jojubanking\boot\framework\errorcode\core\loader\ErrorCodeLoaderImpl.class +com\jojubanking\boot\framework\errorcode\config\JojuErrorCodeConfiguration.class diff --git a/joju-framework/joju-spring-boot-starter-biz-error-code/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-biz-error-code/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..66dfb75 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-error-code/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,7 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-error-code\src\main\java\com\jojubanking\boot\framework\errorcode\core\generator\ErrorCodeAutoGenerator.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-error-code\src\main\java\com\jojubanking\boot\framework\errorcode\core\loader\ErrorCodeLoaderImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-error-code\src\main\java\com\jojubanking\boot\framework\errorcode\core\generator\ErrorCodeAutoGeneratorImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-error-code\src\main\java\com\jojubanking\boot\framework\errorcode\config\ErrorCodeProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-error-code\src\main\java\com\jojubanking\boot\framework\errorcode\core\loader\ErrorCodeLoader.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-error-code\src\main\java\com\jojubanking\boot\framework\errorcode\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-error-code\src\main\java\com\jojubanking\boot\framework\errorcode\config\JojuErrorCodeConfiguration.java diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/joju-spring-boot-starter-biz-operatelog.iml b/joju-framework/joju-spring-boot-starter-biz-operatelog/joju-spring-boot-starter-biz-operatelog.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/joju-spring-boot-starter-biz-operatelog.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/pom.xml b/joju-framework/joju-spring-boot-starter-biz-operatelog/pom.xml new file mode 100644 index 0000000..60126c0 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/pom.xml @@ -0,0 +1,52 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-biz-operatelog + jar + + ${project.artifactId} + 操作日志 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.jojubanking.boot + joju-spring-boot-starter-web + ${revision} + provided + + + + + com.jojubanking.boot + joju-module-system-api + ${revision} + + + + + com.google.guava + guava + + + + diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/config/JojuOperateLogAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/config/JojuOperateLogAutoConfiguration.java new file mode 100644 index 0000000..d57a41c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/config/JojuOperateLogAutoConfiguration.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.framework.operatelog.config; + +import com.jojubanking.boot.framework.operatelog.core.aop.OperateLogAspect; +import com.jojubanking.boot.framework.operatelog.core.service.OperateLogFrameworkService; +import com.jojubanking.boot.framework.operatelog.core.service.OperateLogFrameworkServiceImpl; +import com.jojubanking.boot.module.system.api.logger.OperateLogApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class JojuOperateLogAutoConfiguration { + + @Bean + public OperateLogAspect operateLogAspect() { + return new OperateLogAspect(); + } + + @Bean + public OperateLogFrameworkService operateLogFrameworkService(OperateLogApi operateLogApi) { + return new OperateLogFrameworkServiceImpl(operateLogApi); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/annotations/OperateLog.java b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/annotations/OperateLog.java new file mode 100644 index 0000000..70a6a6e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/annotations/OperateLog.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.framework.operatelog.core.annotations; + +import com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 操作日志注解 + * + * @author TW + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface OperateLog { + + // ========== 模块字段 ========== + + /** + * 操作模块 + * + * 为空时,会尝试读取 {@link Api#value()} 属性 + */ + String module() default ""; + /** + * 操作名 + * + * 为空时,会尝试读取 {@link ApiOperation#value()} 属性 + */ + String name() default ""; + /** + * 操作分类 + * + * 实际并不是数组,因为枚举不能设置 null 作为默认值 + */ + OperateTypeEnum[] type() default {}; + + // ========== 开关字段 ========== + + /** + * 是否记录操作日志 + */ + boolean enable() default true; + /** + * 是否记录方法参数 + */ + boolean logArgs() default true; + /** + * 是否记录方法结果的数据 + */ + boolean logResultData() default true; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/aop/OperateLogAspect.java b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/aop/OperateLogAspect.java new file mode 100644 index 0000000..aa10f12 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/aop/OperateLogAspect.java @@ -0,0 +1,374 @@ +package com.jojubanking.boot.framework.operatelog.core.aop; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.servlet.ServletUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.common.util.monitor.TracerUtils; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum; +import com.jojubanking.boot.framework.operatelog.core.service.OperateLog; +import com.jojubanking.boot.framework.operatelog.core.service.OperateLogFrameworkService; +import com.jojubanking.boot.framework.web.core.util.WebFrameworkUtils; +import com.google.common.collect.Maps; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.lang.annotation.Annotation; +import java.lang.reflect.Array; +import java.util.*; +import java.util.function.Predicate; +import java.util.stream.IntStream; + +import static com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; +import static com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS; + +/** + * 拦截使用 @OperateLog 注解,如果满足条件,则生成操作日志。 + * 满足如下任一条件,则会进行记录: + * 1. 使用 @ApiOperation + 非 @GetMapping + * 2. 使用 @OperateLog 注解 + *

+ * 但是,如果声明 @OperateLog 注解时,将 enable 属性设置为 false 时,强制不记录。 + * + * @author TW + */ +@Aspect +@Slf4j +public class OperateLogAspect { + + /** + * 用于记录操作内容的上下文 + * + * @see OperateLog#getContent() + */ + private static final ThreadLocal CONTENT = new ThreadLocal<>(); + /** + * 用于记录拓展字段的上下文 + * + * @see OperateLog#getExts() + */ + private static final ThreadLocal> EXTS = new ThreadLocal<>(); + + @Resource + private OperateLogFrameworkService operateLogFrameworkService; + + @Around("@annotation(apiOperation)") + public Object around(ProceedingJoinPoint joinPoint, ApiOperation apiOperation) throws Throwable { + // 可能也添加了 @ApiOperation 注解 + com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog operateLog = getMethodAnnotation(joinPoint, + com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog.class); + return around0(joinPoint, operateLog, apiOperation); + } + + @Around("!@annotation(io.swagger.annotations.ApiOperation) && @annotation(operateLog)") + // 兼容处理,只添加 @OperateLog 注解的情况 + public Object around(ProceedingJoinPoint joinPoint, + com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog operateLog) throws Throwable { + return around0(joinPoint, operateLog, null); + } + + private Object around0(ProceedingJoinPoint joinPoint, + com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog operateLog, + ApiOperation apiOperation) throws Throwable { + // 目前,只有管理员,才记录操作日志!所以非管理员,直接调用,不进行记录 + Integer userType = WebFrameworkUtils.getLoginUserType(); + if (!Objects.equals(userType, UserTypeEnum.ADMIN.getValue())) { + return joinPoint.proceed(); + } + + // 记录开始时间 + Date startTime = new Date(); + try { + // 执行原有方法 + Object result = joinPoint.proceed(); + // 记录正常执行时的操作日志 + this.log(joinPoint, operateLog, apiOperation, startTime, result, null); + return result; + } catch (Throwable exception) { + this.log(joinPoint, operateLog, apiOperation, startTime, null, exception); + throw exception; + } finally { + clearThreadLocal(); + } + } + + public static void setContent(String content) { + CONTENT.set(content); + } + + public static void addExt(String key, Object value) { + if (EXTS.get() == null) { + EXTS.set(new HashMap<>()); + } + EXTS.get().put(key, value); + } + + private static void clearThreadLocal() { + CONTENT.remove(); + EXTS.remove(); + } + + private void log(ProceedingJoinPoint joinPoint, + com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog operateLog, + ApiOperation apiOperation, + Date startTime, Object result, Throwable exception) { + try { + // 判断不记录的情况 + if (!isLogEnable(joinPoint, operateLog)) { + return; + } + // 真正记录操作日志 + this.log0(joinPoint, operateLog, apiOperation, startTime, result, exception); + } catch (Throwable ex) { + log.error("[log][记录操作日志时,发生异常,其中参数是 joinPoint({}) operateLog({}) apiOperation({}) result({}) exception({}) ]", + joinPoint, operateLog, apiOperation, result, exception, ex); + } + } + + private void log0(ProceedingJoinPoint joinPoint, + com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog operateLog, + ApiOperation apiOperation, + Date startTime, Object result, Throwable exception) { + OperateLog operateLogObj = new OperateLog(); + // 补全通用字段 + operateLogObj.setTraceId(TracerUtils.getTraceId()); + operateLogObj.setStartTime(startTime); + // 补充用户信息 + fillUserFields(operateLogObj); + // 补全模块信息 + fillModuleFields(operateLogObj, joinPoint, operateLog, apiOperation); + // 补全请求信息 + fillRequestFields(operateLogObj); + // 补全方法信息 + fillMethodFields(operateLogObj, joinPoint, operateLog, startTime, result, exception); + + // 异步记录日志 + operateLogFrameworkService.createOperateLog(operateLogObj); + } + + private static void fillUserFields(OperateLog operateLogObj) { + operateLogObj.setUserId(WebFrameworkUtils.getLoginUserId()); + operateLogObj.setUserType(WebFrameworkUtils.getLoginUserType()); + } + + private static void fillModuleFields(OperateLog operateLogObj, + ProceedingJoinPoint joinPoint, + com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog operateLog, + ApiOperation apiOperation) { + // module 属性 + if (operateLog != null) { + operateLogObj.setModule(operateLog.module()); + } + if (StrUtil.isEmpty(operateLogObj.getModule())) { + Api api = getClassAnnotation(joinPoint, Api.class); + if (api != null) { + // 优先读取 @API 的 name 属性 + if (StrUtil.isNotEmpty(api.value())) { + operateLogObj.setModule(api.value()); + } + // 没有的话,读取 @API 的 tags 属性 + if (StrUtil.isEmpty(operateLogObj.getModule()) && ArrayUtil.isNotEmpty(api.tags())) { + operateLogObj.setModule(api.tags()[0]); + } + } + } + // name 属性 + if (operateLog != null) { + operateLogObj.setName(operateLog.name()); + } + if (StrUtil.isEmpty(operateLogObj.getName()) && apiOperation != null) { + operateLogObj.setName(apiOperation.value()); + } + // type 属性 + if (operateLog != null && ArrayUtil.isNotEmpty(operateLog.type())) { + operateLogObj.setType(operateLog.type()[0].getType()); + } + if (operateLogObj.getType() == null) { + RequestMethod requestMethod = obtainFirstMatchRequestMethod(obtainRequestMethod(joinPoint)); + OperateTypeEnum operateLogType = convertOperateLogType(requestMethod); + operateLogObj.setType(operateLogType != null ? operateLogType.getType() : null); + } + // content 和 exts 属性 + operateLogObj.setContent(CONTENT.get()); + operateLogObj.setExts(EXTS.get()); + } + + private static void fillRequestFields(OperateLog operateLogObj) { + // 获得 Request 对象 + HttpServletRequest request = ServletUtils.getRequest(); + if (request == null) { + return; + } + // 补全请求信息 + operateLogObj.setRequestMethod(request.getMethod()); + operateLogObj.setRequestUrl(request.getRequestURI()); + operateLogObj.setUserIp(ServletUtil.getClientIP(request)); + operateLogObj.setUserAgent(ServletUtils.getUserAgent(request)); + } + + private static void fillMethodFields(OperateLog operateLogObj, + ProceedingJoinPoint joinPoint, + com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog operateLog, + Date startTime, Object result, Throwable exception) { + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); + operateLogObj.setJavaMethod(methodSignature.toString()); + if (operateLog == null || operateLog.logArgs()) { + operateLogObj.setJavaMethodArgs(obtainMethodArgs(joinPoint)); + } + if (operateLog == null || operateLog.logResultData()) { + operateLogObj.setResultData(obtainResultData(result)); + } + operateLogObj.setDuration((int) (System.currentTimeMillis() - startTime.getTime())); + // (正常)处理 resultCode 和 resultMsg 字段 + if (result instanceof CommonResult) { + CommonResult commonResult = (CommonResult) result; + operateLogObj.setResultCode(commonResult.getCode()); + operateLogObj.setResultMsg(commonResult.getMsg()); + } else { + operateLogObj.setResultCode(SUCCESS.getCode()); + } + // (异常)处理 resultCode 和 resultMsg 字段 + if (exception != null) { + operateLogObj.setResultCode(INTERNAL_SERVER_ERROR.getCode()); + operateLogObj.setResultMsg(ExceptionUtil.getRootCauseMessage(exception)); + } + } + + private static boolean isLogEnable(ProceedingJoinPoint joinPoint, + com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog operateLog) { + // 有 @OperateLog 注解的情况下 + if (operateLog != null) { + return operateLog.enable(); + } + // 没有 @ApiOperation 注解的情况下,只记录 POST、PUT、DELETE 的情况 + return obtainFirstLogRequestMethod(obtainRequestMethod(joinPoint)) != null; + } + + private static RequestMethod obtainFirstLogRequestMethod(RequestMethod[] requestMethods) { + if (ArrayUtil.isEmpty(requestMethods)) { + return null; + } + return Arrays.stream(requestMethods).filter(requestMethod -> + requestMethod == RequestMethod.POST + || requestMethod == RequestMethod.PUT + || requestMethod == RequestMethod.DELETE) + .findFirst().orElse(null); + } + + private static RequestMethod obtainFirstMatchRequestMethod(RequestMethod[] requestMethods) { + if (ArrayUtil.isEmpty(requestMethods)) { + return null; + } + // 优先,匹配最优的 POST、PUT、DELETE + RequestMethod result = obtainFirstLogRequestMethod(requestMethods); + if (result != null) { + return result; + } + // 然后,匹配次优的 GET + result = Arrays.stream(requestMethods).filter(requestMethod -> requestMethod == RequestMethod.GET) + .findFirst().orElse(null); + if (result != null) { + return result; + } + // 兜底,获得第一个 + return requestMethods[0]; + } + + private static OperateTypeEnum convertOperateLogType(RequestMethod requestMethod) { + if (requestMethod == null) { + return null; + } + switch (requestMethod) { + case GET: + return OperateTypeEnum.GET; + case POST: + return OperateTypeEnum.CREATE; + case PUT: + return OperateTypeEnum.UPDATE; + case DELETE: + return OperateTypeEnum.DELETE; + default: + return OperateTypeEnum.OTHER; + } + } + + private static RequestMethod[] obtainRequestMethod(ProceedingJoinPoint joinPoint) { + RequestMapping requestMapping = AnnotationUtils.getAnnotation( // 使用 Spring 的工具类,可以处理 @RequestMapping 别名注解 + ((MethodSignature) joinPoint.getSignature()).getMethod(), RequestMapping.class); + return requestMapping != null ? requestMapping.method() : new RequestMethod[]{}; + } + + @SuppressWarnings("SameParameterValue") + private static T getMethodAnnotation(ProceedingJoinPoint joinPoint, Class annotationClass) { + return ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(annotationClass); + } + + @SuppressWarnings("SameParameterValue") + private static T getClassAnnotation(ProceedingJoinPoint joinPoint, Class annotationClass) { + return ((MethodSignature) joinPoint.getSignature()).getMethod().getDeclaringClass().getAnnotation(annotationClass); + } + + private static String obtainMethodArgs(ProceedingJoinPoint joinPoint) { + // TODO 提升:参数脱敏和忽略 + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); + String[] argNames = methodSignature.getParameterNames(); + Object[] argValues = joinPoint.getArgs(); + // 拼接参数 + Map args = Maps.newHashMapWithExpectedSize(argValues.length); + for (int i = 0; i < argNames.length; i++) { + String argName = argNames[i]; + Object argValue = argValues[i]; + // 被忽略时,标记为 ignore 字符串,避免和 null 混在一起 + args.put(argName, !isIgnoreArgs(argValue) ? argValue : "[ignore]"); + } + return JsonUtils.toJsonString(args); + } + + private static String obtainResultData(Object result) { + // TODO 提升:结果脱敏和忽略 + if (result instanceof CommonResult) { + result = ((CommonResult) result).getData(); + } + return JsonUtils.toJsonString(result); + } + + private static boolean isIgnoreArgs(Object object) { + Class clazz = object.getClass(); + // 处理数组的情况 + if (clazz.isArray()) { + return IntStream.range(0, Array.getLength(object)) + .anyMatch(index -> isIgnoreArgs(Array.get(object, index))); + } + // 递归,处理数组、Collection、Map 的情况 + if (Collection.class.isAssignableFrom(clazz)) { + return ((Collection) object).stream() + .anyMatch((Predicate) OperateLogAspect::isIgnoreArgs); + } + if (Map.class.isAssignableFrom(clazz)) { + return isIgnoreArgs(((Map) object).values()); + } + // obj + return object instanceof MultipartFile + || object instanceof HttpServletRequest + || object instanceof HttpServletResponse + || object instanceof BindingResult; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/enums/OperateTypeEnum.java b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/enums/OperateTypeEnum.java new file mode 100644 index 0000000..907e6f8 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/enums/OperateTypeEnum.java @@ -0,0 +1,55 @@ +package com.jojubanking.boot.framework.operatelog.core.enums; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 操作日志的操作类型 + * + * @author ruoyi + */ +@Getter +@AllArgsConstructor +public enum OperateTypeEnum { + + /** + * 查询 + * + * 绝大多数情况下,不会记录查询动作,因为过于大量显得没有意义。 + * 在有需要的时候,通过声明 {@link OperateLog} 注解来记录 + */ + GET(1), + /** + * 新增 + */ + CREATE(2), + /** + * 修改 + */ + UPDATE(3), + /** + * 删除 + */ + DELETE(4), + /** + * 导出 + */ + EXPORT(5), + /** + * 导入 + */ + IMPORT(6), + /** + * 其它 + * + * 在无法归类时,可以选择使用其它。因为还有操作名可以进一步标识 + */ + OTHER(0); + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/package-info.java b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/package-info.java new file mode 100644 index 0000000..885874a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/package-info.java @@ -0,0 +1 @@ +package com.jojubanking.boot.framework.operatelog.core; diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/service/OperateLog.java b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/service/OperateLog.java new file mode 100644 index 0000000..4a22a56 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/service/OperateLog.java @@ -0,0 +1,110 @@ +package com.jojubanking.boot.framework.operatelog.core.service; + +import lombok.Data; + +import java.util.Date; +import java.util.Map; + +/** + * 操作日志 + * + * @author TW + */ +@Data +public class OperateLog { + + /** + * 链路追踪编号 + */ + private String traceId; + + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + */ + private Integer userType; + + /** + * 操作模块 + */ + private String module; + + /** + * 操作名 + */ + private String name; + + /** + * 操作分类 + */ + private Integer type; + + /** + * 操作明细 + */ + private String content; + + /** + * 拓展字段 + */ + private Map exts; + + /** + * 请求方法名 + */ + private String requestMethod; + + /** + * 请求地址 + */ + private String requestUrl; + + /** + * 用户 IP + */ + private String userIp; + + /** + * 浏览器 UserAgent + */ + private String userAgent; + + /** + * Java 方法名 + */ + private String javaMethod; + + /** + * Java 方法的参数 + */ + private String javaMethodArgs; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + + /** + * 结果码 + */ + private Integer resultCode; + + /** + * 结果提示 + */ + private String resultMsg; + + /** + * 结果数据 + */ + private String resultData; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/service/OperateLogFrameworkService.java b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/service/OperateLogFrameworkService.java new file mode 100644 index 0000000..6066745 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/service/OperateLogFrameworkService.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.framework.operatelog.core.service; + +/** + * 操作日志 Framework Service 接口 + * + * @author TW + */ +public interface OperateLogFrameworkService { + + /** + * 记录操作日志 + * + * @param operateLog 操作日志请求 + */ + void createOperateLog(OperateLog operateLog); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.java b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.java new file mode 100644 index 0000000..7ba8572 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.framework.operatelog.core.service; + +import cn.hutool.core.bean.BeanUtil; +import com.jojubanking.boot.module.system.api.logger.OperateLogApi; +import com.jojubanking.boot.module.system.api.logger.dto.OperateLogCreateReqDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Async; + +/** + * 操作日志 Framework Service 实现类 + * + * 基于 {@link OperateLogApi} 实现,记录操作日志 + * + * @author TW + */ +@RequiredArgsConstructor +public class OperateLogFrameworkServiceImpl implements OperateLogFrameworkService { + + private final OperateLogApi operateLogApi; + + @Override + @Async + public void createOperateLog(OperateLog operateLog) { + OperateLogCreateReqDTO reqDTO = BeanUtil.copyProperties(operateLog, OperateLogCreateReqDTO.class); + operateLogApi.createOperateLog(reqDTO); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/util/OperateLogUtils.java b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/util/OperateLogUtils.java new file mode 100644 index 0000000..66c497a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/core/util/OperateLogUtils.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.framework.operatelog.core.util; + +import com.jojubanking.boot.framework.operatelog.core.aop.OperateLogAspect; + +/** + * 操作日志工具类 + * 目前主要的作用,是提供给业务代码,记录操作明细和拓展字段 + * + * @author TW + */ +public class OperateLogUtils { + + public static void setContent(String content) { + OperateLogAspect.setContent(content); + } + + public static void addExt(String key, Object value) { + OperateLogAspect.addExt(key, value); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/package-info.java b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/package-info.java new file mode 100644 index 0000000..ce1299e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/java/com/jojubanking/boot/framework/operatelog/package-info.java @@ -0,0 +1,6 @@ +/** + * 用户操作日志:记录用户的操作,用于对用户的操作的审计与追溯,永久保存。 + * + * @author TW + */ +package com.jojubanking.boot.framework.operatelog; diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..e871c3c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.operatelog.config.JojuOperateLogAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..e871c3c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.operatelog.config.JojuOperateLogAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/config/JojuOperateLogAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/config/JojuOperateLogAutoConfiguration.class new file mode 100644 index 0000000..e567f64 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/config/JojuOperateLogAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/annotations/OperateLog.class b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/annotations/OperateLog.class new file mode 100644 index 0000000..d31da22 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/annotations/OperateLog.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/aop/OperateLogAspect$1.class b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/aop/OperateLogAspect$1.class new file mode 100644 index 0000000..433f97e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/aop/OperateLogAspect$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/aop/OperateLogAspect.class b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/aop/OperateLogAspect.class new file mode 100644 index 0000000..58acd86 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/aop/OperateLogAspect.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/enums/OperateTypeEnum.class b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/enums/OperateTypeEnum.class new file mode 100644 index 0000000..63748df Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/enums/OperateTypeEnum.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/service/OperateLog.class b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/service/OperateLog.class new file mode 100644 index 0000000..6023051 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/service/OperateLog.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/service/OperateLogFrameworkService.class b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/service/OperateLogFrameworkService.class new file mode 100644 index 0000000..acfbde7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/service/OperateLogFrameworkService.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.class b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.class new file mode 100644 index 0000000..4e94cce Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/util/OperateLogUtils.class b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/util/OperateLogUtils.class new file mode 100644 index 0000000..0fdfe74 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/classes/com/jojubanking/boot/framework/operatelog/core/util/OperateLogUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/joju-spring-boot-starter-biz-operatelog-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/joju-spring-boot-starter-biz-operatelog-2.0.0-beta.jar new file mode 100644 index 0000000..baf7be8 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/joju-spring-boot-starter-biz-operatelog-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/maven-archiver/pom.properties new file mode 100644 index 0000000..12ac310 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:28 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-biz-operatelog diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..17f5cc0 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,9 @@ +com\jojubanking\boot\framework\operatelog\core\annotations\OperateLog.class +com\jojubanking\boot\framework\operatelog\core\service\OperateLogFrameworkServiceImpl.class +com\jojubanking\boot\framework\operatelog\config\JojuOperateLogAutoConfiguration.class +com\jojubanking\boot\framework\operatelog\core\service\OperateLogFrameworkService.class +com\jojubanking\boot\framework\operatelog\core\enums\OperateTypeEnum.class +com\jojubanking\boot\framework\operatelog\core\util\OperateLogUtils.class +com\jojubanking\boot\framework\operatelog\core\aop\OperateLogAspect$1.class +com\jojubanking\boot\framework\operatelog\core\aop\OperateLogAspect.class +com\jojubanking\boot\framework\operatelog\core\service\OperateLog.class diff --git a/joju-framework/joju-spring-boot-starter-biz-operatelog/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..d3fed28 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-operatelog/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,10 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-operatelog\src\main\java\com\jojubanking\boot\framework\operatelog\config\JojuOperateLogAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-operatelog\src\main\java\com\jojubanking\boot\framework\operatelog\core\util\OperateLogUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-operatelog\src\main\java\com\jojubanking\boot\framework\operatelog\core\annotations\OperateLog.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-operatelog\src\main\java\com\jojubanking\boot\framework\operatelog\core\service\OperateLog.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-operatelog\src\main\java\com\jojubanking\boot\framework\operatelog\core\enums\OperateTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-operatelog\src\main\java\com\jojubanking\boot\framework\operatelog\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-operatelog\src\main\java\com\jojubanking\boot\framework\operatelog\core\service\OperateLogFrameworkService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-operatelog\src\main\java\com\jojubanking\boot\framework\operatelog\core\aop\OperateLogAspect.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-operatelog\src\main\java\com\jojubanking\boot\framework\operatelog\core\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-operatelog\src\main\java\com\jojubanking\boot\framework\operatelog\core\service\OperateLogFrameworkServiceImpl.java diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/joju-spring-boot-starter-biz-pay.iml b/joju-framework/joju-spring-boot-starter-biz-pay/joju-spring-boot-starter-biz-pay.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/joju-spring-boot-starter-biz-pay.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/pom.xml b/joju-framework/joju-spring-boot-starter-biz-pay/pom.xml new file mode 100644 index 0000000..b6ad9ec --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/pom.xml @@ -0,0 +1,73 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + + joju-spring-boot-starter-biz-pay + ${project.artifactId} + 支付拓展,接入国内多个支付渠道 + 1. 支付宝,基于官方 SDK 接入 + 2. 微信支付,基于 weixin-java-pay 接入 + + + + + com.jojubanking.boot + joju-common + + + + + org.springframework.boot + spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.slf4j + slf4j-api + + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-core + + + + + com.alipay.sdk + alipay-sdk-java + 4.17.9.ALL + + + com.github.binarywang + weixin-java-pay + 4.1.9.B + + + + + + com.jojubanking.boot + joju-spring-boot-starter-test + test + ${revision} + + + + diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/config/JojuPayAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/config/JojuPayAutoConfiguration.java new file mode 100644 index 0000000..cf06e84 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/config/JojuPayAutoConfiguration.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.framework.pay.config; + +import com.jojubanking.boot.framework.pay.core.client.PayClientFactory; +import com.jojubanking.boot.framework.pay.core.client.impl.PayClientFactoryImpl; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 支付配置类 + * + * @author TW + */ +@Configuration +@EnableConfigurationProperties(PayProperties.class) +public class JojuPayAutoConfiguration { + + @Bean + public PayClientFactory payClientFactory() { + return new PayClientFactoryImpl(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/config/PayProperties.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/config/PayProperties.java new file mode 100644 index 0000000..58316ed --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/config/PayProperties.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.framework.pay.config; + +import lombok.Data; +import org.hibernate.validator.constraints.URL; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotEmpty; + +@ConfigurationProperties(prefix = "joju.pay") +@Validated +@Data +public class PayProperties { + + /** + * 支付回调地址 + * 注意,支付渠道统一回调到 payNotifyUrl 地址,由支付模块统一处理;然后,自己的支付模块,在回调 PayAppDO.payNotifyUrl 地址 + */ + @NotEmpty(message = "支付回调地址不能为空") + @URL(message = "支付回调地址的格式必须是 URL") + private String payNotifyUrl; + /** + * 退款回调地址 + * 注意点,同 {@link #payNotifyUrl} 属性 + */ + @NotEmpty(message = "退款回调地址不能为空") + @URL(message = "退款回调地址的格式必须是 URL") + private String refundNotifyUrl; + + + /** + * 支付完成的返回地址 + */ + @URL(message = "支付返回的地址的格式必须是 URL") + @NotEmpty(message = "支付返回的地址不能为空") + private String payReturnUrl; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/AbstractPayCodeMapping.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/AbstractPayCodeMapping.java new file mode 100644 index 0000000..33246ff --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/AbstractPayCodeMapping.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.framework.pay.core.client; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.pay.core.enums.PayFrameworkErrorCodeConstants; +import lombok.extern.slf4j.Slf4j; + +/** + * 将 API 的错误码,转换为通用的错误码 + * + * @see PayCommonResult + * @see PayFrameworkErrorCodeConstants + * + * @author TW + */ +@Slf4j +public abstract class AbstractPayCodeMapping { + + public final ErrorCode apply(String apiCode, String apiMsg) { + if (apiCode == null) { + log.error("[apply][API 错误码为空,请排查]"); + return PayFrameworkErrorCodeConstants.EXCEPTION; + } + ErrorCode errorCode = this.apply0(apiCode, apiMsg); + if (errorCode == null) { + log.error("[apply][API 错误码({}) 错误提示({}) 无法匹配]", apiCode, apiMsg); + return PayFrameworkErrorCodeConstants.PAY_UNKNOWN; + } + return errorCode; + } + + protected abstract ErrorCode apply0(String apiCode, String apiMsg); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/PayClient.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/PayClient.java new file mode 100644 index 0000000..ff92ef4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/PayClient.java @@ -0,0 +1,74 @@ +package com.jojubanking.boot.framework.pay.core.client; + + +import com.jojubanking.boot.framework.pay.core.client.dto.*; +import com.jojubanking.boot.framework.pay.core.client.dto.*; + +/** + * 支付客户端,用于对接各支付渠道的 SDK,实现发起支付、退款等功能 + * + * @author TW + */ +public interface PayClient { + + /** + * 获得渠道编号 + * + * @return 渠道编号 + */ + Long getId(); + + /** + * 调用支付渠道,统一下单 + * + * @param reqDTO 下单信息 + * @return 各支付渠道的返回结果 + */ + PayCommonResult unifiedOrder(PayOrderUnifiedReqDTO reqDTO); + + /** + * 解析支付单的通知结果 + * + * @param data 通知结果 + * @return 解析结果 + * @throws Exception 解析失败,抛出异常 + */ + PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws Exception; + + /** + * 调用支付渠道,进行退款 + * @param reqDTO 统一退款请求信息 + * @return 各支付渠道的统一返回结果 + */ + PayCommonResult unifiedRefund(PayRefundUnifiedReqDTO reqDTO); + + /** + * 解析支付退款通知数据 + * @param notifyData 支付退款通知请求数据 + * @return 支付退款通知的Notify DTO + */ + PayRefundNotifyDTO parseRefundNotify(PayNotifyDataDTO notifyData); + + // TODO @芋艿:后续改成非 default,避免不知道去实现 + /** + * 验证是否渠道通知 + * + * @param notifyData 通知数据 + * @return 默认是 true + */ + default boolean verifyNotifyData(PayNotifyDataDTO notifyData) { + return true; + } + + // TODO @芋艿:后续改成非 default,避免不知道去实现 + /** + * 判断是否为退款通知 + * + * @param notifyData 通知数据 + * @return 默认是 false + */ + default boolean isRefundNotify(PayNotifyDataDTO notifyData){ + return false; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/PayClientConfig.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/PayClientConfig.java new file mode 100644 index 0000000..eba5011 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/PayClientConfig.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.framework.pay.core.client; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validator; +import java.util.Set; + +/** + * 支付客户端的配置,本质是支付渠道的配置 + * 每个不同的渠道,需要不同的配置,通过子类来定义 + * + * @author TW + */ +@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) +// @JsonTypeInfo 注解的作用,Jackson 多态 +// 1. 序列化到时数据库时,增加 @class 属性。 +// 2. 反序列化到内存对象时,通过 @class 属性,可以创建出正确的类型 +public interface PayClientConfig { + + /** + * 配置验证参数是 + * + * @param validator 校验对象 + * @return 配置好的验证参数 + */ + Set> verifyParam(Validator validator); + + // TODO @aquan:貌似抽象一个 validation group 就好了! + /** + * 参数校验 + * + * @param validator 校验对象 + */ + default void validate(Validator validator) { + Set> violations = verifyParam(validator); + if (!violations.isEmpty()) { + throw new ConstraintViolationException(violations); + } + } +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/PayClientFactory.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/PayClientFactory.java new file mode 100644 index 0000000..80cbcec --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/PayClientFactory.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.framework.pay.core.client; + +/** + * 支付客户端的工厂接口 + * + * @author TW + */ +public interface PayClientFactory { + + /** + * 获得支付客户端 + * + * @param channelId 渠道编号 + * @return 支付客户端 + */ + PayClient getPayClient(Long channelId); + + /** + * 创建支付客户端 + * + * @param channelId 渠道编号 + * @param channelCode 渠道编码 + * @param config 支付配置 + */ + void createOrUpdatePayClient(Long channelId, String channelCode, + Config config); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/PayCommonResult.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/PayCommonResult.java new file mode 100644 index 0000000..a214556 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/PayCommonResult.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.framework.pay.core.client; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.lang.Assert; +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.pay.core.enums.PayFrameworkErrorCodeConstants; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 支付的 CommonResult 拓展类 + * + * 考虑到不同的平台,返回的 code 和 msg 是不同的,所以统一额外返回 {@link #apiCode} 和 {@link #apiMsg} 字段 + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayCommonResult extends CommonResult { + + /** + * API 返回错误码 + * + * 由于第三方的错误码可能是字符串,所以使用 String 类型 + */ + private String apiCode; + /** + * API 返回提示 + */ + private String apiMsg; + + private PayCommonResult() { + } + + public static PayCommonResult build(String apiCode, String apiMsg, T data, AbstractPayCodeMapping codeMapping) { + Assert.notNull(codeMapping, "参数 codeMapping 不能为空"); + PayCommonResult result = new PayCommonResult(); + result.setApiCode(apiCode); + result.setApiMsg(apiMsg); + result.setData(data); + // 翻译错误码 + if (codeMapping != null) { + ErrorCode errorCode = codeMapping.apply(apiCode, apiMsg); + result.setCode(errorCode.getCode()); + result.setMsg(errorCode.getMsg()); + } + return result; + } + + public static PayCommonResult error(Throwable ex) { + PayCommonResult result = new PayCommonResult<>(); + result.setCode(PayFrameworkErrorCodeConstants.EXCEPTION.getCode()); + result.setMsg(ExceptionUtil.getRootCauseMessage(ex)); + return result; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayNotifyDataDTO.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayNotifyDataDTO.java new file mode 100644 index 0000000..b88b973 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayNotifyDataDTO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.framework.pay.core.client.dto; + +import lombok.Builder; +import lombok.Data; +import lombok.ToString; + +import java.util.Map; + + +/** + * 支付订单,退款订单回调,渠道的统一通知请求数据 + */ +@Data +@ToString +@Builder +public class PayNotifyDataDTO { + + + /** + * HTTP 回调接口的 request body + */ + private String body; + + + /** + * HTTP 回调接口 content type 为 application/x-www-form-urlencoded 的所有参数 + */ + private Map params; +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderNotifyRespDTO.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderNotifyRespDTO.java new file mode 100644 index 0000000..4cb05e9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderNotifyRespDTO.java @@ -0,0 +1,54 @@ +package com.jojubanking.boot.framework.pay.core.client.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * 支付通知 Response DTO + * + * @author TW + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PayOrderNotifyRespDTO { + + /** + * 支付订单号(支付模块的) + */ + private String orderExtensionNo; + /** + * 支付渠道编号 + */ + private String channelOrderNo; + /** + * 支付渠道用户编号 + */ + private String channelUserId; + /** + * 支付成功时间 + */ + private Date successTime; + + /** + * 通知的原始数据 + * + * 主要用于持久化,方便后续修复数据,或者排错 + */ + private String data; + + /** + * TODO @jason 结合其他的渠道定义成枚举, + * alipay + * TRADE_CLOSED,未付款交易超时关闭,或支付完成后全额退款。 + * TRADE_SUCCESS, 交易支付成功 + * TRADE_FINISHED 交易结束,不可退款。 + */ + private String tradeStatus; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderUnifiedReqDTO.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderUnifiedReqDTO.java new file mode 100644 index 0000000..bc4c514 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderUnifiedReqDTO.java @@ -0,0 +1,83 @@ +package com.jojubanking.boot.framework.pay.core.client.dto; + +import lombok.Data; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.Map; + +/** + * 统一下单 Request DTO + * + * @author TW + */ +@Data +@Accessors(chain = true) +public class PayOrderUnifiedReqDTO { + + /** + * 用户 IP + */ + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + // ========== 商户相关字段 ========== + + /** + * 商户订单编号 + */ + @NotEmpty(message = "商户订单编号不能为空") + private String merchantOrderId; + /** + * 商品标题 + */ + @NotEmpty(message = "商品标题不能为空") + @Length(max = 32, message = "商品标题不能超过 32") + private String subject; + /** + * 商品描述信息 + */ + @NotEmpty(message = "商品描述信息不能为空") + @Length(max = 128, message = "商品描述信息长度不能超过128") + private String body; + /** + * 支付结果的 notify 回调地址 + */ + @NotEmpty(message = "支付结果的回调地址不能为空") + @URL(message = "支付结果的 notify 回调地址必须是 URL 格式") + private String notifyUrl; + /** + * 支付结果的 return 回调地址 + */ + @URL(message = "支付结果的 return 回调地址必须是 URL 格式") + private String returnUrl; + + // ========== 订单相关字段 ========== + + /** + * 支付金额,单位:分 + */ + @NotNull(message = "支付金额不能为空") + @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零") + private Long amount; + + /** + * 支付过期时间 + */ + @NotNull(message = "支付过期时间不能为空") + private Date expireTime; + + // ========== 拓展参数 ========== + /** + * 支付渠道的额外参数 + * + * 例如说,微信公众号需要传递 openid 参数 + */ + private Map channelExtras; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundNotifyDTO.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundNotifyDTO.java new file mode 100644 index 0000000..47a0f78 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundNotifyDTO.java @@ -0,0 +1,63 @@ +package com.jojubanking.boot.framework.pay.core.client.dto; + +import com.jojubanking.boot.framework.pay.core.enums.PayNotifyRefundStatusEnum; +import lombok.Builder; +import lombok.Data; +import lombok.ToString; + +import java.util.Date; + +/** + * 从渠道返回数据中解析得到的支付退款通知的Notify DTO + * + * @author jason + */ +@Data +@ToString +@Builder +public class PayRefundNotifyDTO { + + /** + * 支付渠道编号 + */ + private String channelOrderNo; + + + /** + * 交易订单号,根据规则生成 + * 调用支付渠道时,使用该字段作为对接的订单号。 + * 1. 调用微信支付 https://api.mch.weixin.qq.com/pay/unifiedorder 时,使用该字段作为 out_trade_no + * 2. 调用支付宝 https://opendocs.alipay.com/apis 时,使用该字段作为 out_trade_no + * 这里对应 pay_extension 里面的 no + * 例如说,P202110132239124200055 + */ + private String tradeNo; + + /** + * https://api.mch.weixin.qq.com/v3/refund/domestic/refunds 中的 out_refund_no + * https://opendocs.alipay.com/apis alipay.trade.refund 中的 out_request_no + * 退款请求号。 + * 标识一次退款请求,需要保证在交易号下唯一,如需部分退款,则此参数必传。 + * 注:针对同一次退款请求,如果调用接口失败或异常了,重试时需要保证退款请求号不能变更, + * 防止该笔交易重复退款。支付宝会保证同样的退款请求号多次请求只会退一次。 + * 退款单请求号,根据规则生成 + * + * 例如说,RR202109181134287570000 + */ + private String reqNo; + + + /** + * 退款是否成功 + */ + private PayNotifyRefundStatusEnum status; + + + + /** + * 退款成功时间 + */ + private Date refundSuccessTime; + + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedReqDTO.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedReqDTO.java new file mode 100644 index 0000000..24ea951 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedReqDTO.java @@ -0,0 +1,74 @@ +package com.jojubanking.boot.framework.pay.core.client.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 统一 退款 Request DTO + * + * @author jason + */ +@Accessors(chain = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class PayRefundUnifiedReqDTO { + + /** + * 用户 IP + */ + private String userIp; + + // TODO @jason:这个是否为非必传字段呀,只需要传递 payTradeNo 字段即可。尽可能精简 + /** + * https://api.mch.weixin.qq.com/v3/refund/domestic/refunds 中的 transaction_id + * https://opendocs.alipay.com/apis alipay.trade.refund 中的 trade_no + * 渠道订单号 + */ + private String channelOrderNo; + + /** + * https://api.mch.weixin.qq.com/v3/refund/domestic/refunds 中的 out_trade_no + * https://opendocs.alipay.com/apis alipay.trade.refund 中的 out_trade_no + * 支付交易号 {PayOrderExtensionDO no字段} 和 渠道订单号 不能同时为空 + */ + private String payTradeNo; + + /** + * https://api.mch.weixin.qq.com/v3/refund/domestic/refunds 中的 out_refund_no + * https://opendocs.alipay.com/apis alipay.trade.refund 中的 out_trade_no + * 退款请求单号 同一退款请求单号多次请求只退一笔。 + * 使用 商户的退款单号。{PayRefundDO 字段 merchantRefundNo} + */ + @NotEmpty(message = "退款请求单号") + private String merchantRefundId; + + /** + * 退款原因 + */ + @NotEmpty(message = "退款原因不能为空") + private String reason; + + /** + * 退款金额,单位:分 + */ + @NotNull(message = "退款金额不能为空") + @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零") + private Long amount; + + /** + * 退款结果 notify 回调地址, 支付宝退款不需要回调地址, 微信需要 + */ + @URL(message = "支付结果的 notify 回调地址必须是 URL 格式") + private String notifyUrl; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedRespDTO.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedRespDTO.java new file mode 100644 index 0000000..e401413 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedRespDTO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.framework.pay.core.client.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +/** + * 统一退款 Response DTO + * + * @author jason + */ +@Accessors(chain = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class PayRefundUnifiedRespDTO { + + /** + * 渠道退款单编号 + */ + private String channelRefundId; +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/AbstractPayClient.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/AbstractPayClient.java new file mode 100644 index 0000000..ccee269 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/AbstractPayClient.java @@ -0,0 +1,114 @@ +package com.jojubanking.boot.framework.pay.core.client.impl; + +import cn.hutool.extra.validation.ValidationUtil; +import com.jojubanking.boot.framework.pay.core.client.AbstractPayCodeMapping; +import com.jojubanking.boot.framework.pay.core.client.PayClient; +import com.jojubanking.boot.framework.pay.core.client.PayClientConfig; +import com.jojubanking.boot.framework.pay.core.client.PayCommonResult; +import com.jojubanking.boot.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; +import com.jojubanking.boot.framework.pay.core.client.dto.PayRefundUnifiedReqDTO; +import com.jojubanking.boot.framework.pay.core.client.dto.PayRefundUnifiedRespDTO; +import lombok.extern.slf4j.Slf4j; + +import static com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString; + +/** + * 支付客户端的抽象类,提供模板方法,减少子类的冗余代码 + * + * @author TW + */ +@Slf4j +public abstract class AbstractPayClient implements PayClient { + + /** + * 渠道编号 + */ + private final Long channelId; + /** + * 渠道编码 + */ + private final String channelCode; + /** + * 错误码枚举类 + */ + protected AbstractPayCodeMapping codeMapping; + /** + * 支付配置 + */ + protected Config config; + + public AbstractPayClient(Long channelId, String channelCode, Config config, AbstractPayCodeMapping codeMapping) { + this.channelId = channelId; + this.channelCode = channelCode; + this.codeMapping = codeMapping; + this.config = config; + } + + /** + * 初始化 + */ + public final void init() { + doInit(); + log.info("[init][配置({}) 初始化完成]", config); + } + + /** + * 自定义初始化 + */ + protected abstract void doInit(); + + public final void refresh(Config config) { + // 判断是否更新 + if (config.equals(this.config)) { + return; + } + log.info("[refresh][配置({})发生变化,重新初始化]", config); + this.config = config; + // 初始化 + this.init(); + } + + protected Double calculateAmount(Long amount) { + return amount / 100.0; + } + + @Override + public Long getId() { + return channelId; + } + + @Override + public final PayCommonResult unifiedOrder(PayOrderUnifiedReqDTO reqDTO) { + ValidationUtil.validate(reqDTO); + // 执行短信发送 + PayCommonResult result; + try { + result = doUnifiedOrder(reqDTO); + } catch (Throwable ex) { + // 打印异常日志 + log.error("[unifiedOrder][request({}) 发起支付失败]", toJsonString(reqDTO), ex); + // 封装返回 + return PayCommonResult.error(ex); + } + return result; + } + + protected abstract PayCommonResult doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) + throws Throwable; + + @Override + public PayCommonResult unifiedRefund(PayRefundUnifiedReqDTO reqDTO) { + PayCommonResult resp; + try { + resp = doUnifiedRefund(reqDTO); + } catch (Throwable ex) { + // 记录异常日志 + log.error("[unifiedRefund][request({}) 发起退款失败]", toJsonString(reqDTO), ex); + resp = PayCommonResult.error(ex); + } + return resp; + } + + protected abstract PayCommonResult doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws Throwable; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/PayClientFactoryImpl.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/PayClientFactoryImpl.java new file mode 100644 index 0000000..a75933f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/PayClientFactoryImpl.java @@ -0,0 +1,80 @@ +package com.jojubanking.boot.framework.pay.core.client.impl; + +import cn.hutool.core.lang.Assert; +import com.jojubanking.boot.framework.pay.core.client.PayClient; +import com.jojubanking.boot.framework.pay.core.client.PayClientConfig; +import com.jojubanking.boot.framework.pay.core.client.PayClientFactory; +import com.jojubanking.boot.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; +import com.jojubanking.boot.framework.pay.core.client.impl.alipay.AlipayPcPayClient; +import com.jojubanking.boot.framework.pay.core.client.impl.alipay.AlipayQrPayClient; +import com.jojubanking.boot.framework.pay.core.client.impl.alipay.AlipayWapPayClient; +import com.jojubanking.boot.framework.pay.core.client.impl.wx.WXLitePayClient; +import com.jojubanking.boot.framework.pay.core.client.impl.wx.WXNativePayClient; +import com.jojubanking.boot.framework.pay.core.client.impl.wx.WXPayClientConfig; +import com.jojubanking.boot.framework.pay.core.client.impl.wx.WXPubPayClient; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 支付客户端的工厂实现类 + * + * @author TW + */ +@Slf4j +public class PayClientFactoryImpl implements PayClientFactory { + + /** + * 支付客户端 Map + * key:渠道编号 + */ + private final ConcurrentMap> clients = new ConcurrentHashMap<>(); + + @Override + public PayClient getPayClient(Long channelId) { + AbstractPayClient client = clients.get(channelId); + if (client == null) { + log.error("[getPayClient][渠道编号({}) 找不到客户端]", channelId); + } + return client; + } + + @Override + @SuppressWarnings("unchecked") + public void createOrUpdatePayClient(Long channelId, String channelCode, + Config config) { + AbstractPayClient client = (AbstractPayClient) clients.get(channelId); + if (client == null) { + client = this.createPayClient(channelId, channelCode, config); + client.init(); + clients.put(client.getId(), client); + } else { + client.refresh(config); + } + } + + @SuppressWarnings("unchecked") + private AbstractPayClient createPayClient( + Long channelId, String channelCode, Config config) { + PayChannelEnum channelEnum = PayChannelEnum.getByCode(channelCode); + Assert.notNull(channelEnum, String.format("支付渠道(%s) 为空", channelEnum)); + // 创建客户端 + // TODO @芋艿 WX_LITE WX_APP 如果不添加在 项目启动的时候去初始化会报错无法启动。所以我手动加了两个,具体需要你来配 + switch (channelEnum) { + case WX_PUB: return (AbstractPayClient) new WXPubPayClient(channelId, (WXPayClientConfig) config); + case WX_LITE: return (AbstractPayClient) new WXLitePayClient(channelId, (WXPayClientConfig) config); //微信小程序请求支付 + case WX_APP: return (AbstractPayClient) new WXPubPayClient(channelId, (WXPayClientConfig) config); + case WX_NATIVE: return (AbstractPayClient) new WXNativePayClient(channelId, (WXPayClientConfig) config); + case ALIPAY_WAP: return (AbstractPayClient) new AlipayWapPayClient(channelId, (AlipayPayClientConfig) config); + case ALIPAY_QR: return (AbstractPayClient) new AlipayQrPayClient(channelId, (AlipayPayClientConfig) config); + case ALIPAY_APP: return (AbstractPayClient) new AlipayQrPayClient(channelId, (AlipayPayClientConfig) config); + case ALIPAY_PC: return (AbstractPayClient) new AlipayPcPayClient(channelId, (AlipayPayClientConfig) config); + } + // 创建失败,错误日志 + 抛出异常 + log.error("[createPayClient][配置({}) 找不到合适的客户端实现]", config); + throw new IllegalArgumentException(String.format("配置(%s) 找不到合适的客户端实现", config)); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AbstractAlipayClient.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AbstractAlipayClient.java new file mode 100644 index 0000000..01ced8e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AbstractAlipayClient.java @@ -0,0 +1,157 @@ +package com.jojubanking.boot.framework.pay.core.client.impl.alipay; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import com.jojubanking.boot.framework.pay.core.client.AbstractPayCodeMapping; +import com.jojubanking.boot.framework.pay.core.client.PayCommonResult; +import com.jojubanking.boot.framework.pay.core.client.dto.*; +import com.jojubanking.boot.framework.pay.core.client.impl.AbstractPayClient; +import com.jojubanking.boot.framework.pay.core.enums.PayNotifyRefundStatusEnum; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayConfig; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.domain.AlipayTradeRefundModel; +import com.alipay.api.internal.util.AlipaySignature; +import com.alipay.api.request.AlipayTradeRefundRequest; +import com.alipay.api.response.AlipayTradeRefundResponse; +import com.jojubanking.boot.framework.pay.core.client.dto.*; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString; + +/** + * 支付宝抽象类, 实现支付宝统一的接口。如退款 + * + * @author jason + */ +@Slf4j +public abstract class AbstractAlipayClient extends AbstractPayClient { + + protected DefaultAlipayClient client; + + public AbstractAlipayClient(Long channelId, String channelCode, + AlipayPayClientConfig config, AbstractPayCodeMapping codeMapping) { + super(channelId, channelCode, config, codeMapping); + } + + @Override + @SneakyThrows + protected void doInit() { + AlipayConfig alipayConfig = new AlipayConfig(); + BeanUtil.copyProperties(config, alipayConfig, false); + this.client = new DefaultAlipayClient(alipayConfig); + } + + /** + * 从支付宝通知返回参数中解析 PayOrderNotifyRespDTO, 通知具体参数参考 + * //https://opendocs.alipay.com/open/203/105286 + * @param data 通知结果 + * @return 解析结果 PayOrderNotifyRespDTO + * @throws Exception 解析失败,抛出异常 + */ + @Override + public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws Exception { + Map params = strToMap(data.getBody()); + + return PayOrderNotifyRespDTO.builder().orderExtensionNo(params.get("out_trade_no")) + .channelOrderNo(params.get("trade_no")).channelUserId(params.get("seller_id")) + .tradeStatus(params.get("trade_status")) + .successTime(DateUtil.parse(params.get("notify_time"), "yyyy-MM-dd HH:mm:ss")) + .data(data.getBody()).build(); + } + + @Override + public PayRefundNotifyDTO parseRefundNotify(PayNotifyDataDTO notifyData) { + Map params = strToMap(notifyData.getBody()); + PayRefundNotifyDTO notifyDTO = PayRefundNotifyDTO.builder().channelOrderNo(params.get("trade_no")) + .tradeNo(params.get("out_trade_no")) + .reqNo(params.get("out_biz_no")) + .status(PayNotifyRefundStatusEnum.SUCCESS) + .refundSuccessTime(DateUtil.parse(params.get("gmt_refund"), "yyyy-MM-dd HH:mm:ss")) + .build(); + return notifyDTO; + } + + @Override + public boolean isRefundNotify(PayNotifyDataDTO notifyData) { + if (notifyData.getParams().containsKey("refund_fee")) { + return true; + } else { + return false; + } + } + + @Override + public boolean verifyNotifyData(PayNotifyDataDTO notifyData) { + boolean verifyResult = false; + try { + verifyResult = AlipaySignature.rsaCheckV1(notifyData.getParams(), config.getAlipayPublicKey(), StandardCharsets.UTF_8.name(), "RSA2"); + } catch (AlipayApiException e) { + log.error("[AlipayClient verifyNotifyData][(notify param is :{}) 验证失败]", toJsonString(notifyData.getParams()), e); + } + return verifyResult; + } + + /** + * 支付宝统一的退款接口 alipay.trade.refund + * @param reqDTO 退款请求 request DTO + * @return 退款请求 Response + */ + @Override + protected PayCommonResult doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) { + AlipayTradeRefundModel model=new AlipayTradeRefundModel(); + model.setTradeNo(reqDTO.getChannelOrderNo()); + model.setOutTradeNo(reqDTO.getPayTradeNo()); + model.setOutRequestNo(reqDTO.getMerchantRefundId()); + model.setRefundAmount(calculateAmount(reqDTO.getAmount()).toString()); + model.setRefundReason(reqDTO.getReason()); + AlipayTradeRefundRequest refundRequest = new AlipayTradeRefundRequest(); + refundRequest.setBizModel(model); + try { + AlipayTradeRefundResponse response = client.execute(refundRequest); + log.info("[doUnifiedRefund][response({}) 发起退款 渠道返回", toJsonString(response)); + if (response.isSuccess()) { + //退款导致触发的异步通知是发送到支付接口中设置的notify_url + //支付宝不返回退款单号,设置为空 + PayRefundUnifiedRespDTO respDTO = new PayRefundUnifiedRespDTO(); + respDTO.setChannelRefundId(""); + return PayCommonResult.build(response.getCode(), response.getMsg(), respDTO, codeMapping); + } + // 失败。需要抛出异常 + return PayCommonResult.build(response.getCode(), response.getMsg(), null, codeMapping); + } catch (AlipayApiException e) { + // TODO 记录异常日志 + log.error("[doUnifiedRefund][request({}) 发起退款失败,网络读超时,退款状态未知]", toJsonString(reqDTO), e); + return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping); + } + } + + + + /** + * 支付宝统一回调参数 str 转 map + * + * @param s 支付宝支付通知回调参数 + * @return map 支付宝集合 + */ + public static Map strToMap(String s) { + // TODO @zxy:这个可以使用 hutool 的 HttpUtil decodeParams 方法么? + Map stringStringMap = new HashMap<>(); + // 调整时间格式 + String s3 = s.replaceAll("%3A", ":"); + // 获取 map + String s4 = s3.replace("+", " "); + String[] split = s4.split("&"); + for (String s1 : split) { + String[] split1 = s1.split("="); + stringStringMap.put(split1[0], split1[1]); + } + return stringStringMap; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.java new file mode 100644 index 0000000..54c4842 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.java @@ -0,0 +1,119 @@ +package com.jojubanking.boot.framework.pay.core.client.impl.alipay; + +import com.jojubanking.boot.framework.pay.core.client.PayClientConfig; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.ConstraintViolation; +import javax.validation.Validator; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Set; + +// TODO TW:参数校验 + +/** + * 支付宝的 PayClientConfig 实现类 + * 属性主要来自 {@link com.alipay.api.AlipayConfig} 的必要属性 + * + * @author TW + */ +@Data +@Accessors(chain = true) +public class AlipayPayClientConfig implements PayClientConfig { + + /** + * 网关地址 - 线上 + */ + public static final String SERVER_URL_PROD = "https://openapi.alipay.com/gateway.do"; + /** + * 网关地址 - 沙箱 + */ + public static final String SERVER_URL_SANDBOX = "https://openapi.alipaydev.com/gateway.do"; + + /** + * 公钥类型 - 公钥模式 + */ + public static final Integer MODE_PUBLIC_KEY = 1; + /** + * 公钥类型 - 证书模式 + */ + public static final Integer MODE_CERTIFICATE = 2; + + /** + * 签名算法类型 - RSA + */ + public static final String SIGN_TYPE_DEFAULT = "RSA2"; + + /** + * 网关地址 + * 1. {@link #SERVER_URL_PROD} + * 2. {@link #SERVER_URL_SANDBOX} + */ + @NotBlank(message = "网关地址不能为空", groups = {ModePublicKey.class, ModeCertificate.class}) + private String serverUrl; + + /** + * 开放平台上创建的应用的 ID + */ + @NotBlank(message = "开放平台上创建的应用的 ID不能为空", groups = {ModePublicKey.class, ModeCertificate.class}) + private String appId; + + /** + * 签名算法类型,推荐:RSA2 + *

+ * {@link #SIGN_TYPE_DEFAULT} + */ + @NotBlank(message = "签名算法类型不能为空", groups = {ModePublicKey.class, ModeCertificate.class}) + private String signType; + + /** + * 公钥类型 + * 1. {@link #MODE_PUBLIC_KEY} 情况,privateKey + alipayPublicKey + * 2. {@link #MODE_CERTIFICATE} 情况,appCertContent + alipayPublicCertContent + rootCertContent + */ + @NotNull(message = "公钥类型不能为空", groups = {ModePublicKey.class, ModeCertificate.class}) + private Integer mode; + + // ========== 公钥模式 ========== + /** + * 商户私钥 + */ + @NotBlank(message = "商户私钥不能为空", groups = {ModePublicKey.class}) + private String privateKey; + + /** + * 支付宝公钥字符串 + */ + @NotBlank(message = "支付宝公钥字符串不能为空", groups = {ModePublicKey.class}) + private String alipayPublicKey; + + // ========== 证书模式 ========== + /** + * 指定商户公钥应用证书内容字符串 + */ + @NotBlank(message = "指定商户公钥应用证书内容不能为空", groups = {ModeCertificate.class}) + private String appCertContent; + /** + * 指定支付宝公钥证书内容字符串 + */ + @NotBlank(message = "指定支付宝公钥证书内容不能为空", groups = {ModeCertificate.class}) + private String alipayPublicCertContent; + /** + * 指定根证书内容字符串 + */ + @NotBlank(message = "指定根证书内容字符串不能为空", groups = {ModeCertificate.class}) + private String rootCertContent; + + public interface ModePublicKey { + } + + public interface ModeCertificate { + } + + @Override + public Set> verifyParam(Validator validator) { + return validator.validate(this, + MODE_PUBLIC_KEY.equals(this.getMode()) ? ModePublicKey.class : ModeCertificate.class); + } +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayCodeMapping.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayCodeMapping.java new file mode 100644 index 0000000..7c52630 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayCodeMapping.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.framework.pay.core.client.impl.alipay; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.pay.core.client.AbstractPayCodeMapping; + +import java.util.Objects; + +/** + * 支付宝的 PayCodeMapping 实现类 + * + * @author TW + */ +public class AlipayPayCodeMapping extends AbstractPayCodeMapping { + + @Override + protected ErrorCode apply0(String apiCode, String apiMsg) { + if (Objects.equals(apiCode, "10000")) { + return GlobalErrorCodeConstants.SUCCESS; + } + // alipay wap api code 返回为null, 暂时定为-9999 + if (Objects.equals(apiCode, "-9999")) { + return GlobalErrorCodeConstants.SUCCESS; + } + return null; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPcPayClient.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPcPayClient.java new file mode 100644 index 0000000..1dc19e9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPcPayClient.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.framework.pay.core.client.impl.alipay; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.pay.core.client.PayCommonResult; +import com.jojubanking.boot.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayApiException; +import com.alipay.api.domain.AlipayTradePagePayModel; +import com.alipay.api.request.AlipayTradePagePayRequest; +import com.alipay.api.response.AlipayTradePagePayResponse; +import lombok.extern.slf4j.Slf4j; + + +/** + * 支付宝【PC网站支付】的 PayClient 实现类 + * 文档:https://opendocs.alipay.com/open/270/105898 + * + * @author XGD + */ +@Slf4j +public class AlipayPcPayClient extends AbstractAlipayClient { + + public AlipayPcPayClient(Long channelId, AlipayPayClientConfig config) { + super(channelId, PayChannelEnum.ALIPAY_PC.getCode(), config, new AlipayPayCodeMapping()); + } + + @Override + public PayCommonResult doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) { + // 构建 AlipayTradePagePayModel 请求 + AlipayTradePagePayModel model = new AlipayTradePagePayModel(); + // 构建 AlipayTradePagePayRequest + AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); + request.setBizModel(model); + JSONObject bizContent = new JSONObject(); + // 参数说明可查看: https://opendocs.alipay.com/open/028r8t?scene=22 + bizContent.put("out_trade_no", reqDTO.getMerchantOrderId()); + bizContent.put("total_amount", calculateAmount(reqDTO.getAmount())); + bizContent.put("subject", reqDTO.getSubject()); + bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY"); + // PC扫码支付的方式:支持前置模式和跳转模式。4: 订单码-可定义宽度的嵌入式二维码 + bizContent.put("qr_pay_mode", "4"); + // 自定义二维码宽度 + bizContent.put("qrcode_width", "150"); + request.setBizContent(bizContent.toJSONString()); + request.setNotifyUrl(reqDTO.getNotifyUrl()); + request.setReturnUrl(""); + // 执行请求 + AlipayTradePagePayResponse response; + try { + response = client.pageExecute(request); + } catch (AlipayApiException e) { + log.error("[unifiedOrder][request({}) 发起支付失败]", JsonUtils.toJsonString(reqDTO), e); + return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping); + } + // 响应为表单格式,前端可嵌入响应的页面或关闭当前支付窗口 + return PayCommonResult.build(StrUtil.blankToDefault(response.getCode(),"10000") ,response.getMsg(), response, codeMapping); + } +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java new file mode 100644 index 0000000..a11fbac --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java @@ -0,0 +1,52 @@ +package com.jojubanking.boot.framework.pay.core.client.impl.alipay; + +import com.jojubanking.boot.framework.pay.core.client.PayCommonResult; +import com.jojubanking.boot.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.alipay.api.AlipayApiException; +import com.alipay.api.domain.AlipayTradePrecreateModel; +import com.alipay.api.request.AlipayTradePrecreateRequest; +import com.alipay.api.response.AlipayTradePrecreateResponse; +import lombok.extern.slf4j.Slf4j; + +import static com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString; + +/** + * 支付宝【扫码支付】的 PayClient 实现类 + * 文档:https://opendocs.alipay.com/apis/02890k + * + * @author TW + */ +@Slf4j +public class AlipayQrPayClient extends AbstractAlipayClient { + + public AlipayQrPayClient(Long channelId, AlipayPayClientConfig config) { + super(channelId, PayChannelEnum.ALIPAY_QR.getCode(), config, new AlipayPayCodeMapping()); + } + + @Override + public PayCommonResult doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) { + // 构建 AlipayTradePrecreateModel 请求 + AlipayTradePrecreateModel model = new AlipayTradePrecreateModel(); + model.setOutTradeNo(reqDTO.getMerchantOrderId()); + model.setSubject(reqDTO.getSubject()); + model.setBody(reqDTO.getBody()); + model.setTotalAmount(calculateAmount(reqDTO.getAmount()).toString()); // 单位:元 + // TODO TW:userIp + expireTime + // 构建 AlipayTradePrecreateRequest + AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); + request.setBizModel(model); + request.setNotifyUrl(reqDTO.getNotifyUrl()); + request.setReturnUrl(reqDTO.getReturnUrl()); + // 执行请求 + AlipayTradePrecreateResponse response; + try { + response = client.execute(request); + } catch (AlipayApiException e) { + log.error("[unifiedOrder][request({}) 发起支付失败]", toJsonString(reqDTO), e); + return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping); + } + // TODO TW:sub Code 需要测试下各种失败的情况 + return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping); + } +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java new file mode 100644 index 0000000..dc237dc --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java @@ -0,0 +1,75 @@ +package com.jojubanking.boot.framework.pay.core.client.impl.alipay; + +import cn.hutool.core.date.DateUtil; +import com.jojubanking.boot.framework.pay.core.client.PayCommonResult; +import com.jojubanking.boot.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.alipay.api.AlipayApiException; +import com.alipay.api.domain.AlipayTradeWapPayModel; +import com.alipay.api.request.AlipayTradeWapPayRequest; +import com.alipay.api.response.AlipayTradeWapPayResponse; +import lombok.extern.slf4j.Slf4j; + +import java.util.Objects; + +/** + * 支付宝【手机网站】的 PayClient 实现类 + * 文档:https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay + * + * @author TW + */ +@Slf4j +public class AlipayWapPayClient extends AbstractAlipayClient { + + + public AlipayWapPayClient(Long channelId, AlipayPayClientConfig config) { + super(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), config, new AlipayPayCodeMapping()); + } + + @Override + public PayCommonResult doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) { + // 构建 AlipayTradeWapPayModel 请求 + AlipayTradeWapPayModel model = new AlipayTradeWapPayModel(); + model.setOutTradeNo(reqDTO.getMerchantOrderId()); + model.setSubject(reqDTO.getSubject()); + model.setBody(reqDTO.getBody()); + model.setTotalAmount(calculateAmount(reqDTO.getAmount()).toString()); + model.setProductCode("QUICK_WAP_PAY"); // TODO TW:这里咋整 + //TODO TW:这里咋整 jason @芋艿 可以去掉吧, + // TODO TW 似乎这里不用传sellerId + // https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay + //model.setSellerId("2088102147948060"); + model.setTimeExpire(DateUtil.format(reqDTO.getExpireTime(),"yyyy-MM-dd HH:mm:ss")); + // TODO TW:userIp + // 构建 AlipayTradeWapPayRequest + AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); + request.setBizModel(model); + request.setNotifyUrl(reqDTO.getNotifyUrl()); + request.setReturnUrl(reqDTO.getReturnUrl()); + + // 执行请求 + AlipayTradeWapPayResponse response; + try { + response = client.pageExecute(request); + } catch (AlipayApiException e) { + return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping); + } + + // TODO TW:sub Code + if(response.isSuccess() && Objects.isNull(response.getCode()) && Objects.nonNull(response.getBody())){ + //成功alipay wap 成功 code 为 null , body 为form 表单 + return PayCommonResult.build("-9999", "Success", response, codeMapping); + }else { + return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping); + } + } + + + + + + + + + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXCodeMapping.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXCodeMapping.java new file mode 100644 index 0000000..86b4411 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXCodeMapping.java @@ -0,0 +1,55 @@ +package com.jojubanking.boot.framework.pay.core.client.impl.wx; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.pay.core.client.AbstractPayCodeMapping; +import com.jojubanking.boot.framework.pay.core.enums.PayFrameworkErrorCodeConstants; + +import java.util.Objects; + +/** + * 微信支付 PayCodeMapping 实现类 + * + * @author TW + */ +public class WXCodeMapping extends AbstractPayCodeMapping { + + /** + * 错误码 - 成功 + * 由于 weixin-java-pay 封装的 Result 未返回 code,所以自己定义下 + */ + public static final String CODE_SUCCESS = "SUCCESS"; + /** + * 错误提示 - 成功 + */ + public static final String MESSAGE_SUCCESS = "成功"; + + @Override + protected ErrorCode apply0(String apiCode, String apiMsg) { + if (Objects.equals(apiCode, CODE_SUCCESS)) { + return GlobalErrorCodeConstants.SUCCESS; + } + if (Objects.equals(apiCode, "FAIL")) { + if (Objects.equals(apiMsg, "AppID不存在,请检查后再试")) { + return PayFrameworkErrorCodeConstants.PAY_CONFIG_APP_ID_ERROR; + } + if (Objects.equals(apiMsg, "签名错误,请检查后再试") + || Objects.equals(apiMsg, "签名错误")) { + return PayFrameworkErrorCodeConstants.PAY_CONFIG_SIGN_ERROR; + } + } + if (Objects.equals(apiCode, "PARAM_ERROR")) { + if (Objects.equals(apiMsg, "无效的openid")) { + return PayFrameworkErrorCodeConstants.PAY_OPENID_ERROR; + } + } + if (Objects.equals(apiCode, "CustomErrorCode")) { + if (StrUtil.contains(apiMsg, "必填字段")) { + return PayFrameworkErrorCodeConstants.PAY_PARAM_MISSING; + } + } + return null; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXLitePayClient.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXLitePayClient.java new file mode 100644 index 0000000..d65b396 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXLitePayClient.java @@ -0,0 +1,202 @@ +package com.jojubanking.boot.framework.pay.core.client.impl.wx; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.util.io.FileUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.pay.core.client.PayCommonResult; +import com.jojubanking.boot.framework.pay.core.client.dto.*; +import com.jojubanking.boot.framework.pay.core.client.impl.AbstractPayClient; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result; +import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; +import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; +import com.jojubanking.boot.framework.pay.core.client.dto.*; +import lombok.extern.slf4j.Slf4j; + +import java.util.Objects; + +import static com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString; + + +/** + * 微信小程序下支付 + * + * @author zwy + */ +@Slf4j +public class WXLitePayClient extends AbstractPayClient { + + private WxPayService client; + + public WXLitePayClient(Long channelId, WXPayClientConfig config) { + super(channelId, PayChannelEnum.WX_LITE.getCode(), config, new WXCodeMapping()); + } + + @Override + protected void doInit() { + WxPayConfig payConfig = new WxPayConfig(); + BeanUtil.copyProperties(config, payConfig, "keyContent"); + payConfig.setTradeType(WxPayConstants.TradeType.JSAPI); // 设置使用 JS API 支付方式 +// if (StrUtil.isNotEmpty(config.getKeyContent())) { +// payConfig.setKeyContent(config.getKeyContent().getBytes(StandardCharsets.UTF_8)); +// } + if (StrUtil.isNotEmpty(config.getPrivateKeyContent())) { + // weixin-pay-java 存在 BUG,无法直接设置内容,所以创建临时文件来解决 + payConfig.setPrivateKeyPath(FileUtils.createTempFile(config.getPrivateKeyContent()).getPath()); + } + if (StrUtil.isNotEmpty(config.getPrivateCertContent())) { + // weixin-pay-java 存在 BUG,无法直接设置内容,所以创建临时文件来解决 + payConfig.setPrivateCertPath(FileUtils.createTempFile(config.getPrivateCertContent()).getPath()); + } + // 真实客户端 + this.client = new WxPayServiceImpl(); + client.setConfig(payConfig); + } + + @Override + public PayCommonResult doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) { + WxPayMpOrderResult response; + try { + switch (config.getApiVersion()) { + case WXPayClientConfig.API_VERSION_V2: + response = this.unifiedOrderV2(reqDTO); + break; + case WXPayClientConfig.API_VERSION_V3: + WxPayUnifiedOrderV3Result.JsapiResult responseV3 = this.unifiedOrderV3(reqDTO); + // 将 V3 的结果,统一转换成 V2。返回的字段是一致的 + response = new WxPayMpOrderResult(); + BeanUtil.copyProperties(responseV3, response, true); + break; + default: + throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); + } + } catch (WxPayException e) { + log.error("[unifiedOrder][request({}) 发起支付失败,原因({})]", toJsonString(reqDTO), e); + return PayCommonResult.build(ObjectUtils.defaultIfNull(e.getErrCode(), e.getReturnCode(), "CustomErrorCode"), + ObjectUtils.defaultIfNull(e.getErrCodeDes(), e.getCustomErrorMsg()), null, codeMapping); + } + return PayCommonResult.build(WXCodeMapping.CODE_SUCCESS, WXCodeMapping.MESSAGE_SUCCESS, response, codeMapping); + } + + private WxPayMpOrderResult unifiedOrderV2(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { + // 构建 WxPayUnifiedOrderRequest 对象 + WxPayUnifiedOrderRequest request = WxPayUnifiedOrderRequest.newBuilder() + .outTradeNo(reqDTO.getMerchantOrderId()) + .body(reqDTO.getBody()) + .totalFee(reqDTO.getAmount().intValue()) // 单位分 + .timeExpire(DateUtil.format(reqDTO.getExpireTime(), "yyyyMMddHHmmss")) // v2的时间格式 + .spbillCreateIp(reqDTO.getUserIp()) + .openid(getOpenid(reqDTO)) + .notifyUrl(reqDTO.getNotifyUrl()) + .build(); + // 执行请求 + return client.createOrder(request); + } + + private WxPayUnifiedOrderV3Result.JsapiResult unifiedOrderV3(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { + // 构建 WxPayUnifiedOrderRequest 对象 + WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request(); + request.setOutTradeNo(reqDTO.getMerchantOrderId()); + + request.setDescription(reqDTO.getBody()); + request.setAmount(new WxPayUnifiedOrderV3Request + .Amount() + .setTotal(reqDTO + .getAmount() + .intValue())); // 单位分 + request.setTimeExpire(DateUtil.format(reqDTO.getExpireTime(), "yyyy-MM-dd'T'HH:mm:ssXXX")); // v3的时间格式 + request.setPayer(new WxPayUnifiedOrderV3Request.Payer().setOpenid(getOpenid(reqDTO))); + request.setSceneInfo(new WxPayUnifiedOrderV3Request.SceneInfo().setPayerClientIp(reqDTO.getUserIp())); + request.setNotifyUrl(reqDTO.getNotifyUrl()); + // 执行请求 + return client.createOrderV3(TradeTypeEnum.JSAPI, request); + } + + private static String getOpenid(PayOrderUnifiedReqDTO reqDTO) { + String openid = MapUtil.getStr(reqDTO.getChannelExtras(), "openid"); + if (StrUtil.isEmpty(openid)) { + throw new IllegalArgumentException("支付请求的 openid 不能为空!"); + } + return openid; + } + + /** + * + * 微信支付回调 分 v2 和v3 的处理方式 + * + * @param data 通知结果 + * @return 支付回调对象 + * @throws WxPayException 微信异常类 + */ + @Override + public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws WxPayException { + log.info("[parseOrderNotify][微信支付回调data数据:{}]", data.getBody()); + // 微信支付 v2 回调结果处理 + switch (config.getApiVersion()) { + case WXPayClientConfig.API_VERSION_V2: + return parseOrderNotifyV2(data); + case WXPayClientConfig.API_VERSION_V3: + return parseOrderNotifyV3(data); + default: + throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); + } + } + + private PayOrderNotifyRespDTO parseOrderNotifyV3(PayNotifyDataDTO data) throws WxPayException { + WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = client.parseOrderNotifyV3Result(data.getBody(), null); + WxPayOrderNotifyV3Result.DecryptNotifyResult result = wxPayOrderNotifyV3Result.getResult(); + // 转换结果 + Assert.isTrue(Objects.equals(wxPayOrderNotifyV3Result.getResult().getTradeState(), "SUCCESS"), + "支付结果非 SUCCESS"); + + return PayOrderNotifyRespDTO + .builder() + .orderExtensionNo(result.getOutTradeNo()) + .channelOrderNo(result.getTradeState()) + .successTime(DateUtil.parse(result.getSuccessTime(), "yyyy-MM-dd'T'HH:mm:ssXXX")) + .data(data.getBody()) + .build(); + } + + private PayOrderNotifyRespDTO parseOrderNotifyV2(PayNotifyDataDTO data) throws WxPayException { + WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getBody()); + Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS"); + // 转换结果 + return PayOrderNotifyRespDTO + .builder() + .orderExtensionNo(notifyResult.getOutTradeNo()) + .channelOrderNo(notifyResult.getTransactionId()) + .channelUserId(notifyResult.getOpenid()) + .successTime(DateUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss")) + .data(data.getBody()) + .build(); + + } + + @Override + public PayRefundNotifyDTO parseRefundNotify(PayNotifyDataDTO notifyData) { + //TODO 需要实现 + throw new UnsupportedOperationException("需要实现"); + } + + + @Override + protected PayCommonResult doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws Throwable { + //TODO 需要实现 + throw new UnsupportedOperationException(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXNativePayClient.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXNativePayClient.java new file mode 100644 index 0000000..e88712a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXNativePayClient.java @@ -0,0 +1,185 @@ +package com.jojubanking.boot.framework.pay.core.client.impl.wx; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.util.io.FileUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.pay.core.client.PayCommonResult; +import com.jojubanking.boot.framework.pay.core.client.dto.*; +import com.jojubanking.boot.framework.pay.core.client.impl.AbstractPayClient; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result; +import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; +import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; +import com.jojubanking.boot.framework.pay.core.client.dto.*; +import lombok.extern.slf4j.Slf4j; + +import java.util.Objects; + +import static com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString; + +/** + * 微信 App 支付 + * + * @author zwy + */ +@Slf4j +public class WXNativePayClient extends AbstractPayClient { + + private WxPayService client; + + public WXNativePayClient(Long channelId, WXPayClientConfig config) { + super(channelId, PayChannelEnum.WX_NATIVE.getCode(), config, new WXCodeMapping()); + } + + @Override + protected void doInit() { + WxPayConfig payConfig = new WxPayConfig(); + BeanUtil.copyProperties(config, payConfig, "keyContent"); + payConfig.setTradeType(WxPayConstants.TradeType.NATIVE); // 设置使用 native 支付方式 +// if (StrUtil.isNotEmpty(config.getKeyContent())) { +// payConfig.setKeyContent(config.getKeyContent().getBytes(StandardCharsets.UTF_8)); +// } + if (StrUtil.isNotEmpty(config.getPrivateKeyContent())) { + // weixin-pay-java 存在 BUG,无法直接设置内容,所以创建临时文件来解决 + payConfig.setPrivateKeyPath(FileUtils.createTempFile(config.getPrivateKeyContent()).getPath()); + } + if (StrUtil.isNotEmpty(config.getPrivateCertContent())) { + // weixin-pay-java 存在 BUG,无法直接设置内容,所以创建临时文件来解决 + payConfig.setPrivateCertPath(FileUtils.createTempFile(config.getPrivateCertContent()).getPath()); + } + // 真实客户端 + this.client = new WxPayServiceImpl(); + client.setConfig(payConfig); + } + + @Override + public PayCommonResult doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) { + // 这里原生的返回的是支付的 url 所以直接使用string接收 + // "invokeResponse": "weixin://wxpay/bizpayurl?pr=EGYAem7zz" + String responseV3; + try { + switch (config.getApiVersion()) { + case WXPayClientConfig.API_VERSION_V2: + responseV3 = unifiedOrderV2(reqDTO).getCodeUrl(); + break; + case WXPayClientConfig.API_VERSION_V3: + responseV3 = this.unifiedOrderV3(reqDTO); + break; + default: + throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); + } + } catch (WxPayException e) { + log.error("[unifiedOrder][request({}) 发起支付失败,原因({})]", toJsonString(reqDTO), e); + return PayCommonResult.build(ObjectUtils.defaultIfNull(e.getErrCode(), e.getReturnCode(), "CustomErrorCode"), + ObjectUtils.defaultIfNull(e.getErrCodeDes(), e.getCustomErrorMsg()), null, codeMapping); + } + return PayCommonResult.build(WXCodeMapping.CODE_SUCCESS, WXCodeMapping.MESSAGE_SUCCESS, responseV3, codeMapping); + } + + private WxPayNativeOrderResult unifiedOrderV2(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { + //前端 + String tradeType = reqDTO.getChannelExtras().get("trade_type"); + // 构建 WxPayUnifiedOrderRequest 对象 + WxPayUnifiedOrderRequest request = WxPayUnifiedOrderRequest + .newBuilder() + .outTradeNo(reqDTO.getMerchantOrderId()) + .body(reqDTO.getBody()) + .totalFee(reqDTO.getAmount().intValue()) // 单位分 + .timeExpire(DateUtil.format(reqDTO.getExpireTime(), "yyyy-MM-dd'T'HH:mm:ssXXX")) + .spbillCreateIp(reqDTO.getUserIp()) + .notifyUrl(reqDTO.getNotifyUrl()) + .productId(tradeType) + .build(); + // 执行请求 + return client.createOrder(request); + } + + private String unifiedOrderV3(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { + // 构建 WxPayUnifiedOrderRequest 对象 + WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request(); + request.setOutTradeNo(reqDTO.getMerchantOrderId()); + request.setDescription(reqDTO.getBody()); + request.setAmount(new WxPayUnifiedOrderV3Request.Amount().setTotal(reqDTO.getAmount().intValue())); // 单位分 + request.setSceneInfo(new WxPayUnifiedOrderV3Request.SceneInfo().setPayerClientIp(reqDTO.getUserIp())); + request.setNotifyUrl(reqDTO.getNotifyUrl()); + // 执行请求 + return client.createOrderV3(TradeTypeEnum.NATIVE, request); + } + + /** + * + * 微信支付回调 分v2 和v3 的处理方式 + * + * @param data 通知结果 + * @return 支付回调对象 + * @throws WxPayException 微信异常类 + */ + @Override + public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws WxPayException { + log.info("微信支付回调data数据:{}", data.getBody()); + // 微信支付 v2 回调结果处理 + switch (config.getApiVersion()) { + case WXPayClientConfig.API_VERSION_V2: + return parseOrderNotifyV2(data); + case WXPayClientConfig.API_VERSION_V3: + return parseOrderNotifyV3(data); + default: + throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); + } + } + + private PayOrderNotifyRespDTO parseOrderNotifyV3(PayNotifyDataDTO data) throws WxPayException { + WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = client.parseOrderNotifyV3Result(data.getBody(), null); + WxPayOrderNotifyV3Result.DecryptNotifyResult result = wxPayOrderNotifyV3Result.getResult(); + // 转换结果 + Assert.isTrue(Objects.equals(wxPayOrderNotifyV3Result.getResult().getTradeState(), "SUCCESS"), + "支付结果非 SUCCESS"); + return PayOrderNotifyRespDTO + .builder() + .orderExtensionNo(result.getOutTradeNo()) + .channelOrderNo(result.getTradeState()) + .successTime(DateUtil.parse(result.getSuccessTime(), "yyyy-MM-dd'T'HH:mm:ssXXX")) + .data(data.getBody()) + .build(); + } + + private PayOrderNotifyRespDTO parseOrderNotifyV2(PayNotifyDataDTO data) throws WxPayException { + WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getBody()); + Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS"); + // 转换结果 + return PayOrderNotifyRespDTO + .builder() + .orderExtensionNo(notifyResult.getOutTradeNo()) + .channelOrderNo(notifyResult.getTransactionId()) + .channelUserId(notifyResult.getOpenid()) + .successTime(DateUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss")) + .data(data.getBody()) + .build(); + + } + + @Override + public PayRefundNotifyDTO parseRefundNotify(PayNotifyDataDTO notifyData) { + // TODO 需要实现 + throw new UnsupportedOperationException("需要实现"); + } + + + @Override + protected PayCommonResult doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws Throwable { + // TODO 需要实现 + throw new UnsupportedOperationException(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPayClientConfig.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPayClientConfig.java new file mode 100644 index 0000000..cb5ed6e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPayClientConfig.java @@ -0,0 +1,113 @@ +package com.jojubanking.boot.framework.pay.core.client.impl.wx; + +import cn.hutool.core.io.IoUtil; +import com.jojubanking.boot.framework.pay.core.client.PayClientConfig; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.ConstraintViolation; +import javax.validation.Validator; +import javax.validation.constraints.NotBlank; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.Set; + +/** + * 微信支付的 PayClientConfig 实现类 + * 属性主要来自 {@link com.github.binarywang.wxpay.config.WxPayConfig} 的必要属性 + * + * @author TW + */ +@Data +@Accessors(chain = true) +public class WXPayClientConfig implements PayClientConfig { + + /** + * API 版本 - V2 + * https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_1 + */ + public static final String API_VERSION_V2 = "v2"; + /** + * API 版本 - V3 + * https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay-1.shtml + */ + public static final String API_VERSION_V3 = "v3"; + + /** + * 公众号或者小程序的 appid + */ + @NotBlank(message = "APPID 不能为空", groups = {V2.class, V3.class}) + private String appId; + /** + * 商户号 + */ + @NotBlank(message = "商户号 不能为空", groups = {V2.class, V3.class}) + private String mchId; + /** + * API 版本 + */ + @NotBlank(message = "API 版本 不能为空", groups = {V2.class, V3.class}) + private String apiVersion; + + // ========== V2 版本的参数 ========== + + /** + * 商户密钥 + */ + @NotBlank(message = "商户密钥 不能为空", groups = V2.class) + private String mchKey; + /** + * apiclient_cert.p12 证书文件的绝对路径或者以 classpath: 开头的类路径. + * 对应的字符串 + * + * 注意,可通过 {@link #main(String[])} 读取 + */ + /// private String keyContent; + + // ========== V3 版本的参数 ========== + /** + * apiclient_key.pem 证书文件的绝对路径或者以 classpath: 开头的类路径. + * 对应的字符串 + * 注意,可通过 {@link #main(String[])} 读取 + */ + @NotBlank(message = "apiclient_key 不能为空", groups = V3.class) + private String privateKeyContent; + /** + * apiclient_cert.pem 证书文件的绝对路径或者以 classpath: 开头的类路径. + * 对应的字符串 + *

+ * 注意,可通过 {@link #main(String[])} 读取 + */ + @NotBlank(message = "apiclient_cert 不能为空", groups = V3.class) + private String privateCertContent; + /** + * apiV3 密钥值 + */ + @NotBlank(message = "apiV3 密钥值 不能为空", groups = V3.class) + private String apiV3Key; + + /** + * 分组校验 v2版本 + */ + public interface V2 { + } + + /** + * 分组校验 v3版本 + */ + public interface V3 { + } + + @Override + public Set> verifyParam(Validator validator) { + return validator.validate(this, this.getApiVersion().equals(API_VERSION_V2) ? V2.class : V3.class); + } + + public static void main(String[] args) throws FileNotFoundException { + String path = "/Users/yunai/Downloads/wx_pay/apiclient_cert.p12"; + /// String path = "/Users/yunai/Downloads/wx_pay/apiclient_key.pem"; + /// String path = "/Users/yunai/Downloads/wx_pay/apiclient_cert.pem"; + System.out.println(IoUtil.readUtf8(new FileInputStream(path))); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPubPayClient.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPubPayClient.java new file mode 100644 index 0000000..a1267eb --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPubPayClient.java @@ -0,0 +1,197 @@ +package com.jojubanking.boot.framework.pay.core.client.impl.wx; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.util.io.FileUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.pay.core.client.PayCommonResult; +import com.jojubanking.boot.framework.pay.core.client.dto.*; +import com.jojubanking.boot.framework.pay.core.client.impl.AbstractPayClient; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result; +import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; +import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; +import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; +import com.jojubanking.boot.framework.pay.core.client.dto.*; +import lombok.extern.slf4j.Slf4j; + +import java.util.Objects; + +import static com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString; +import static com.jojubanking.boot.framework.pay.core.client.impl.wx.WXCodeMapping.CODE_SUCCESS; +import static com.jojubanking.boot.framework.pay.core.client.impl.wx.WXCodeMapping.MESSAGE_SUCCESS; + +/** + * 微信支付(公众号)的 PayClient 实现类 + * + * @author TW + */ +@Slf4j +public class WXPubPayClient extends AbstractPayClient { + + private WxPayService client; + + public WXPubPayClient(Long channelId, WXPayClientConfig config) { + super(channelId, PayChannelEnum.WX_PUB.getCode(), config, new WXCodeMapping()); + } + + @Override + protected void doInit() { + WxPayConfig payConfig = new WxPayConfig(); + BeanUtil.copyProperties(config, payConfig, "keyContent"); + payConfig.setTradeType(WxPayConstants.TradeType.JSAPI); // 设置使用 JS API 支付方式 +// if (StrUtil.isNotEmpty(config.getKeyContent())) { +// payConfig.setKeyContent(config.getKeyContent().getBytes(StandardCharsets.UTF_8)); +// } + if (StrUtil.isNotEmpty(config.getPrivateKeyContent())) { + // weixin-pay-java 存在 BUG,无法直接设置内容,所以创建临时文件来解决 + payConfig.setPrivateKeyPath(FileUtils.createTempFile(config.getPrivateKeyContent()).getPath()); + } + if (StrUtil.isNotEmpty(config.getPrivateCertContent())) { + // weixin-pay-java 存在 BUG,无法直接设置内容,所以创建临时文件来解决 + payConfig.setPrivateCertPath(FileUtils.createTempFile(config.getPrivateCertContent()).getPath()); + } + // 真实客户端 + this.client = new WxPayServiceImpl(); + client.setConfig(payConfig); + } + + @Override + public PayCommonResult doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) { + WxPayMpOrderResult response; + try { + switch (config.getApiVersion()) { + case WXPayClientConfig.API_VERSION_V2: + response = this.unifiedOrderV2(reqDTO); + break; + case WXPayClientConfig.API_VERSION_V3: + WxPayUnifiedOrderV3Result.JsapiResult responseV3 = this.unifiedOrderV3(reqDTO); + // 将 V3 的结果,统一转换成 V2。返回的字段是一致的 + response = new WxPayMpOrderResult(); + BeanUtil.copyProperties(responseV3, response, true); + break; + default: + throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); + } + } catch (WxPayException e) { + log.error("[unifiedOrder][request({}) 发起支付失败,原因({})]", toJsonString(reqDTO), e); + return PayCommonResult.build(ObjectUtils.defaultIfNull(e.getErrCode(), e.getReturnCode(), "CustomErrorCode"), + ObjectUtils.defaultIfNull(e.getErrCodeDes(), e.getCustomErrorMsg()),null, codeMapping); + } + return PayCommonResult.build(CODE_SUCCESS, MESSAGE_SUCCESS, response, codeMapping); + } + + + private WxPayMpOrderResult unifiedOrderV2(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { + // 构建 WxPayUnifiedOrderRequest 对象 + WxPayUnifiedOrderRequest request = WxPayUnifiedOrderRequest.newBuilder() + .outTradeNo(reqDTO.getMerchantOrderId()) + .body(reqDTO.getBody()) + .totalFee(reqDTO.getAmount().intValue()) // 单位分 + .timeExpire(DateUtil.format(reqDTO.getExpireTime(), "yyyy-MM-dd'T'HH:mm:ssXXX")) + .spbillCreateIp(reqDTO.getUserIp()) + .openid(getOpenid(reqDTO)) + .notifyUrl(reqDTO.getNotifyUrl()) + .build(); + // 执行请求 + return client.createOrder(request); + } + + private WxPayUnifiedOrderV3Result.JsapiResult unifiedOrderV3(PayOrderUnifiedReqDTO reqDTO) throws WxPayException { + // 构建 WxPayUnifiedOrderRequest 对象 + WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request(); + request.setOutTradeNo(reqDTO.getMerchantOrderId()); + request.setDescription(reqDTO.getBody()); + request.setAmount(new WxPayUnifiedOrderV3Request.Amount().setTotal(reqDTO.getAmount().intValue())); // 单位分 + request.setTimeExpire(DateUtil.format(reqDTO.getExpireTime(), "yyyy-MM-dd'T'HH:mm:ssXXX")); + request.setPayer(new WxPayUnifiedOrderV3Request.Payer().setOpenid(getOpenid(reqDTO))); + request.setSceneInfo(new WxPayUnifiedOrderV3Request.SceneInfo().setPayerClientIp(reqDTO.getUserIp())); + request.setNotifyUrl(reqDTO.getNotifyUrl()); + // 执行请求 + return client.createOrderV3(TradeTypeEnum.JSAPI, request); + } + + private static String getOpenid(PayOrderUnifiedReqDTO reqDTO) { + String openid = MapUtil.getStr(reqDTO.getChannelExtras(), "openid"); + if (StrUtil.isEmpty(openid)) { + throw new IllegalArgumentException("支付请求的 openid 不能为空!"); + } + return openid; + } + + /** + * + * 微信支付回调 分v2 和v3 的处理方式 + * + * @param data 通知结果 + * @return 支付回调对象 + * @throws WxPayException 微信异常类 + */ + @Override + public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws WxPayException { + log.info("[parseOrderNotify][微信支付回调data数据: {}]", data.getBody()); + // 微信支付 v2 回调结果处理 + switch (config.getApiVersion()) { + case WXPayClientConfig.API_VERSION_V2: + return parseOrderNotifyV2(data); + case WXPayClientConfig.API_VERSION_V3: + return parseOrderNotifyV3(data); + default: + throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); + } + } + + private PayOrderNotifyRespDTO parseOrderNotifyV3(PayNotifyDataDTO data) throws WxPayException { + WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = client.parseOrderNotifyV3Result(data.getBody(), null); + WxPayOrderNotifyV3Result.DecryptNotifyResult result = wxPayOrderNotifyV3Result.getResult(); + // 转换结果 + Assert.isTrue(Objects.equals(wxPayOrderNotifyV3Result.getResult().getTradeState(), "SUCCESS"), + "支付结果非 SUCCESS"); + return PayOrderNotifyRespDTO + .builder() + .orderExtensionNo(result.getOutTradeNo()) + .channelOrderNo(result.getTradeState()) + .successTime(DateUtil.parse(result.getSuccessTime(), "yyyy-MM-dd'T'HH:mm:ssXXX")) + .data(data.getBody()) + .build(); + } + + private PayOrderNotifyRespDTO parseOrderNotifyV2(PayNotifyDataDTO data) throws WxPayException { + WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getBody()); + Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS"); + // 转换结果 + return PayOrderNotifyRespDTO + .builder() + .orderExtensionNo(notifyResult.getOutTradeNo()) + .channelOrderNo(notifyResult.getTransactionId()) + .channelUserId(notifyResult.getOpenid()) + .successTime(DateUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss")) + .data(data.getBody()) + .build(); + + } + + @Override + public PayRefundNotifyDTO parseRefundNotify(PayNotifyDataDTO notifyData) { + // TODO 需要实现 + throw new UnsupportedOperationException("需要实现"); + } + + @Override + protected PayCommonResult doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws Throwable { + // TODO 需要实现 + throw new UnsupportedOperationException(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/enums/PayChannelEnum.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/enums/PayChannelEnum.java new file mode 100644 index 0000000..01ff16c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/enums/PayChannelEnum.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.framework.pay.core.enums; + +import cn.hutool.core.util.ArrayUtil; +import com.jojubanking.boot.framework.pay.core.client.PayClientConfig; +import com.jojubanking.boot.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; +import com.jojubanking.boot.framework.pay.core.client.impl.wx.WXPayClientConfig; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 支付渠道的编码的枚举 + * 枚举值 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum PayChannelEnum { + + WX_PUB("wx_pub", "微信 JSAPI 支付", WXPayClientConfig.class), // 公众号网页 + WX_LITE("wx_lite", "微信小程序支付", WXPayClientConfig.class), + WX_APP("wx_app", "微信 App 支付", WXPayClientConfig.class), + WX_NATIVE("wx_native", "微信 native 支付", WXPayClientConfig.class), + + ALIPAY_PC("alipay_pc", "支付宝 PC 网站支付", AlipayPayClientConfig.class), + ALIPAY_WAP("alipay_wap", "支付宝 Wap 网站支付", AlipayPayClientConfig.class), + ALIPAY_APP("alipay_app", "支付宝App 支付", AlipayPayClientConfig.class), + ALIPAY_QR("alipay_qr", "支付宝扫码支付", AlipayPayClientConfig.class); + + /** + * 编码 + *

+ * 参考 https://www.pingxx.com/api/支付渠道属性值.html + */ + private final String code; + /** + * 名字 + */ + private final String name; + + /** + * 配置类 + */ + private final Class configClass; + + /** + * 微信支付 + */ + public static final String WECHAT = "WECHAT"; + + /** + * 支付宝支付 + */ + public static final String ALIPAY = "ALIPAY"; + + public static PayChannelEnum getByCode(String code) { + return ArrayUtil.firstMatch(o -> o.getCode().equals(code), values()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/enums/PayChannelRefundRespEnum.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/enums/PayChannelRefundRespEnum.java new file mode 100644 index 0000000..ba8b24d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/enums/PayChannelRefundRespEnum.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.framework.pay.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 渠道统一的退款返回结果 + * + * @author jason + */ +@Getter +@AllArgsConstructor +public enum PayChannelRefundRespEnum { + + SUCCESS(1, "退款成功"), + FAILURE(2, "退款失败"), + PROCESSING(3,"退款处理中"), + CLOSED(4, "退款关闭"); + + private final Integer status; + private final String name; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/enums/PayFrameworkErrorCodeConstants.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/enums/PayFrameworkErrorCodeConstants.java new file mode 100644 index 0000000..628a5f7 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/enums/PayFrameworkErrorCodeConstants.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.framework.pay.core.enums; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; + +/** + * 支付框架的错误码枚举 + * + * 短信框架,使用 2-002-000-000 段 + * + * @author TW + */ +public interface PayFrameworkErrorCodeConstants { + + ErrorCode PAY_UNKNOWN = new ErrorCode(2002000000, "未知错误,需要解析"); + + // ========== 配置相关相关 2002000100 ========== + ErrorCode PAY_CONFIG_APP_ID_ERROR = new ErrorCode(2002000100, "支付渠道 AppId 不正确"); + ErrorCode PAY_CONFIG_SIGN_ERROR = new ErrorCode(2002000100, "签名错误"); // 例如说,微信支付,配置错了 mchId 或者 mchKey + + + // ========== 其它相关 2002000900 开头 ========== + ErrorCode PAY_OPENID_ERROR = new ErrorCode(2002000900, "无效的 openid"); // 例如说,微信 openid 未授权过 + ErrorCode PAY_PARAM_MISSING = new ErrorCode(2002000901, "请求参数缺失"); // 例如说,支付少传了金额 + + ErrorCode EXCEPTION = new ErrorCode(2002000999, "调用异常"); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/enums/PayNotifyRefundStatusEnum.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/enums/PayNotifyRefundStatusEnum.java new file mode 100644 index 0000000..ccb3b89 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/java/com/jojubanking/boot/framework/pay/core/enums/PayNotifyRefundStatusEnum.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.framework.pay.core.enums; + +/** + * 退款通知, 统一的渠道退款状态 + * + * @author jason + */ +public enum PayNotifyRefundStatusEnum { + /** + * 支付宝 中 全额退款 trade_status=TRADE_CLOSED, 部分退款 trade_status=TRADE_SUCCESS + * 退款成功 + */ + SUCCESS, + + /** + * 支付宝退款通知没有这个状态 + * 退款异常 + */ + ABNORMAL; +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..acf26a4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.pay.config.JojuPayAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/test-integration/java/cn/joju/fx/framework/core/client/impl/PayClientFactoryImplTest.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/test-integration/java/cn/joju/fx/framework/core/client/impl/PayClientFactoryImplTest.java new file mode 100644 index 0000000..f055cad --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/test-integration/java/cn/joju/fx/framework/core/client/impl/PayClientFactoryImplTest.java @@ -0,0 +1,133 @@ +package com.jojubanking.boot.framework.core.client.impl; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.RandomUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.pay.core.client.PayClient; +import com.jojubanking.boot.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; +import com.jojubanking.boot.framework.pay.core.client.impl.PayClientFactoryImpl; +import com.jojubanking.boot.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; +import com.jojubanking.boot.framework.pay.core.client.impl.alipay.AlipayQrPayClient; +import com.jojubanking.boot.framework.pay.core.client.impl.alipay.AlipayWapPayClient; +import com.jojubanking.boot.framework.pay.core.client.impl.wx.WXPayClientConfig; +import com.jojubanking.boot.framework.pay.core.client.impl.wx.WXPubPayClient; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.alipay.api.response.AlipayTradePrecreateResponse; +import org.junit.jupiter.api.Test; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +/** + * {@link PayClientFactoryImpl} 的集成测试 + * + * @author TW + */ +public class PayClientFactoryImplTest { + + private final PayClientFactoryImpl payClientFactory = new PayClientFactoryImpl(); + + /** + * {@link WXPubPayClient} 的 V2 版本 + */ + @Test + public void testCreatePayClient_WX_PUB_V2() { + // 创建配置 + WXPayClientConfig config = new WXPayClientConfig(); + config.setAppId("wx041349c6f39b268b"); + config.setMchId("1545083881"); + config.setApiVersion(WXPayClientConfig.API_VERSION_V2); + config.setMchKey("0alL64UDQdlCwiKZ73ib7ypaIjMns06p"); + // 创建客户端 + Long channelId = RandomUtil.randomLong(); + payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.WX_PUB.getCode(), config); + PayClient client = payClientFactory.getPayClient(channelId); + // 发起支付 + PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO(); + CommonResult result = client.unifiedOrder(reqDTO); + System.out.println(result); + } + + /** + * {@link WXPubPayClient} 的 V3 版本 + */ + @Test + public void testCreatePayClient_WX_PUB_V3() throws FileNotFoundException { + // 创建配置 + WXPayClientConfig config = new WXPayClientConfig(); + config.setAppId("wx041349c6f39b268b"); + config.setMchId("1545083881"); + config.setApiVersion(WXPayClientConfig.API_VERSION_V3); + config.setPrivateKeyContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_key.pem"))); + config.setPrivateCertContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_cert.pem"))); + config.setApiV3Key("joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"); + // 创建客户端 + Long channelId = RandomUtil.randomLong(); + payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.WX_PUB.getCode(), config); + PayClient client = payClientFactory.getPayClient(channelId); + // 发起支付 + PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO(); + CommonResult result = client.unifiedOrder(reqDTO); + System.out.println(result); + } + + /** + * {@link AlipayQrPayClient} + */ + @Test + @SuppressWarnings("unchecked") + public void testCreatePayClient_ALIPAY_QR() { + // 创建配置 + AlipayPayClientConfig config = new AlipayPayClientConfig(); + config.setAppId("2021000118634035"); + config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX); + config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT); + config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8="); + config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB"); + // 创建客户端 + Long channelId = RandomUtil.randomLong(); + payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.ALIPAY_QR.getCode(), config); + PayClient client = payClientFactory.getPayClient(channelId); + // 发起支付 + PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO(); + reqDTO.setNotifyUrl("http://niubi.natapp1.cc/api/pay/order/notify/alipay-qr/1"); // TODO @tina: 这里改成你的 natapp 回调地址 + CommonResult result = (CommonResult) client.unifiedOrder(reqDTO); + System.out.println(JsonUtils.toJsonString(result)); + System.out.println(result.getData().getQrCode()); + } + + /** + * {@link AlipayWapPayClient} + */ + @Test + public void testCreatePayClient_ALIPAY_WAP() { + // 创建配置 + AlipayPayClientConfig config = new AlipayPayClientConfig(); + config.setAppId("2021000118634035"); + config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX); + config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT); + config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8="); + config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB"); + // 创建客户端 + Long channelId = RandomUtil.randomLong(); + payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), config); + PayClient client = payClientFactory.getPayClient(channelId); + // 发起支付 + PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO(); + CommonResult result = client.unifiedOrder(reqDTO); + System.out.println(JsonUtils.toJsonString(result)); + } + + private static PayOrderUnifiedReqDTO buildPayOrderUnifiedReqDTO() { + PayOrderUnifiedReqDTO reqDTO = new PayOrderUnifiedReqDTO(); + reqDTO.setAmount(123L); + reqDTO.setSubject("IPhone 13"); + reqDTO.setBody("biubiubiu"); + reqDTO.setMerchantOrderId(String.valueOf(System.currentTimeMillis())); + reqDTO.setUserIp("127.0.0.1"); + reqDTO.setNotifyUrl("http://127.0.0.1:8080"); + return reqDTO; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/src/test/java/cn.iocoder.joju.framework.pay.core.client.impl/alipay/AlipayQrPayClientTest.java b/joju-framework/joju-spring-boot-starter-biz-pay/src/test/java/cn.iocoder.joju.framework.pay.core.client.impl/alipay/AlipayQrPayClientTest.java new file mode 100644 index 0000000..bac52da --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/src/test/java/cn.iocoder.joju.framework.pay.core.client.impl/alipay/AlipayQrPayClientTest.java @@ -0,0 +1,102 @@ +package com.jojubanking.boot.framework.pay.core.client.impl.alipay; +import cn.hutool.core.util.ReflectUtil; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.pay.core.client.PayCommonResult; +import com.jojubanking.boot.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import com.alipay.api.AlipayApiException; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.request.AlipayTradePrecreateRequest; +import com.alipay.api.response.AlipayTradePrecreateResponse; +import com.jojubanking.boot.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; +import com.jojubanking.boot.framework.pay.core.client.impl.alipay.AlipayQrPayClient; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatcher; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.when; + +public class AlipayQrPayClientTest extends BaseMockitoUnitTest { + + private final AlipayPayClientConfig config = new AlipayPayClientConfig(); +// .setAppId("2021000118634035") +// .setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX) +// .setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT) +// // TODO @tina:key 可以随机就好,简洁一点哈。 +// .setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJ" + +// "v890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T" + +// "01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH" + +// "6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScw" + +// "lSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63tr" + +// "epo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdk" + +// "USmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr" + +// "8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w" + +// "0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENi" + +// "vAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPw" + +// "YcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQO" + +// "LFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsm" + +// "yX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i9" + +// "5Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOU" + +// "hVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD" + +// "/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v1" + +// "8p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ" + +// "8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4e" + +// "N0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6p" + +// "bKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erx" + +// "TRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8=") +// .setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0" + +// "gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBN" + +// "lrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZ" + +// "ikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB"); + + // TODO @tina:= 前后要有空格哈 + @InjectMocks + AlipayQrPayClient client=new AlipayQrPayClient(10L,config); + + @Mock + private DefaultAlipayClient defaultAlipayClient; + + @Test + public void testDoInit(){ + client.doInit(); + assertNotSame(defaultAlipayClient, ReflectUtil.getFieldValue(client, "defaultAlipayClient")); + } + + @Test + @Disabled // TODO TW:临时禁用 + public void create() throws AlipayApiException { + // TODO @tina:参数可以尽量随机一点,使用随机方法。这样的好处是,避免对固定参数的依赖,导致可能仅仅满足固定参数的结果 + // 这里,设置可以直接随机整个对象。 + Long shopOrderId = System.currentTimeMillis(); + PayOrderUnifiedReqDTO reqDTO=new PayOrderUnifiedReqDTO(); + reqDTO.setMerchantOrderId(String.valueOf(System.currentTimeMillis())); + reqDTO.setAmount(1L); + reqDTO.setBody("内容:" + shopOrderId); + reqDTO.setSubject("标题:"+shopOrderId); + String notify="http://niubi.natapp1.cc/api/pay/order/notify"; + reqDTO.setNotifyUrl(notify); + + AlipayTradePrecreateResponse response=randomPojo(AlipayTradePrecreateResponse.class,o->o.setQrCode("success")); + + when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request ->{ + assertEquals(notify,request.getNotifyUrl()); + return true; + }))).thenReturn(response); + + + PayCommonResult result = client.doUnifiedOrder(reqDTO); + // 断言 + assertEquals(response.getCode(), result.getApiCode()); + assertEquals(response.getMsg(), result.getApiMsg()); + // TODO @tina:这个断言木有过? + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + + } +} diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..acf26a4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.pay.config.JojuPayAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/config/JojuPayAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/config/JojuPayAutoConfiguration.class new file mode 100644 index 0000000..b02412e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/config/JojuPayAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/config/PayProperties.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/config/PayProperties.class new file mode 100644 index 0000000..95b9e74 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/config/PayProperties.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/AbstractPayCodeMapping.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/AbstractPayCodeMapping.class new file mode 100644 index 0000000..9b985c3 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/AbstractPayCodeMapping.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/PayClient.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/PayClient.class new file mode 100644 index 0000000..7812b7e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/PayClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/PayClientConfig.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/PayClientConfig.class new file mode 100644 index 0000000..0812316 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/PayClientConfig.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/PayClientFactory.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/PayClientFactory.class new file mode 100644 index 0000000..cecd31f Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/PayClientFactory.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/PayCommonResult.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/PayCommonResult.class new file mode 100644 index 0000000..ca08ac9 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/PayCommonResult.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayNotifyDataDTO$PayNotifyDataDTOBuilder.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayNotifyDataDTO$PayNotifyDataDTOBuilder.class new file mode 100644 index 0000000..20b7eca Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayNotifyDataDTO$PayNotifyDataDTOBuilder.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayNotifyDataDTO.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayNotifyDataDTO.class new file mode 100644 index 0000000..544919c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayNotifyDataDTO.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderNotifyRespDTO$PayOrderNotifyRespDTOBuilder.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderNotifyRespDTO$PayOrderNotifyRespDTOBuilder.class new file mode 100644 index 0000000..dba112a Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderNotifyRespDTO$PayOrderNotifyRespDTOBuilder.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderNotifyRespDTO.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderNotifyRespDTO.class new file mode 100644 index 0000000..cf4ba47 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderNotifyRespDTO.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderUnifiedReqDTO.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderUnifiedReqDTO.class new file mode 100644 index 0000000..95afb3c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayOrderUnifiedReqDTO.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundNotifyDTO$PayRefundNotifyDTOBuilder.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundNotifyDTO$PayRefundNotifyDTOBuilder.class new file mode 100644 index 0000000..6b04523 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundNotifyDTO$PayRefundNotifyDTOBuilder.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundNotifyDTO.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundNotifyDTO.class new file mode 100644 index 0000000..cef8bc1 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundNotifyDTO.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedReqDTO$PayRefundUnifiedReqDTOBuilder.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedReqDTO$PayRefundUnifiedReqDTOBuilder.class new file mode 100644 index 0000000..92f127b Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedReqDTO$PayRefundUnifiedReqDTOBuilder.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedReqDTO.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedReqDTO.class new file mode 100644 index 0000000..b101be1 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedReqDTO.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedRespDTO$PayRefundUnifiedRespDTOBuilder.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedRespDTO$PayRefundUnifiedRespDTOBuilder.class new file mode 100644 index 0000000..83cf151 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedRespDTO$PayRefundUnifiedRespDTOBuilder.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedRespDTO.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedRespDTO.class new file mode 100644 index 0000000..33fe416 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/dto/PayRefundUnifiedRespDTO.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/AbstractPayClient.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/AbstractPayClient.class new file mode 100644 index 0000000..8f16058 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/AbstractPayClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/PayClientFactoryImpl$1.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/PayClientFactoryImpl$1.class new file mode 100644 index 0000000..e8038e1 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/PayClientFactoryImpl$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/PayClientFactoryImpl.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/PayClientFactoryImpl.class new file mode 100644 index 0000000..da5a412 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/PayClientFactoryImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AbstractAlipayClient.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AbstractAlipayClient.class new file mode 100644 index 0000000..e6ec200 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AbstractAlipayClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayClientConfig$ModeCertificate.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayClientConfig$ModeCertificate.class new file mode 100644 index 0000000..78c8987 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayClientConfig$ModeCertificate.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayClientConfig$ModePublicKey.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayClientConfig$ModePublicKey.class new file mode 100644 index 0000000..1c9dada Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayClientConfig$ModePublicKey.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.class new file mode 100644 index 0000000..3a8a217 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayCodeMapping.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayCodeMapping.class new file mode 100644 index 0000000..de6680b Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPayCodeMapping.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPcPayClient.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPcPayClient.class new file mode 100644 index 0000000..9da98d1 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayPcPayClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayQrPayClient.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayQrPayClient.class new file mode 100644 index 0000000..facee39 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayQrPayClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayWapPayClient.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayWapPayClient.class new file mode 100644 index 0000000..d1f43e0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayWapPayClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXCodeMapping.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXCodeMapping.class new file mode 100644 index 0000000..7c56fe8 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXCodeMapping.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXLitePayClient.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXLitePayClient.class new file mode 100644 index 0000000..fd26d77 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXLitePayClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXNativePayClient.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXNativePayClient.class new file mode 100644 index 0000000..4ae526c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXNativePayClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPayClientConfig$V2.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPayClientConfig$V2.class new file mode 100644 index 0000000..d738154 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPayClientConfig$V2.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPayClientConfig$V3.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPayClientConfig$V3.class new file mode 100644 index 0000000..b576d5c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPayClientConfig$V3.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPayClientConfig.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPayClientConfig.class new file mode 100644 index 0000000..3bc0d78 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPayClientConfig.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPubPayClient.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPubPayClient.class new file mode 100644 index 0000000..3f56d47 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/client/impl/wx/WXPubPayClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/enums/PayChannelEnum.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/enums/PayChannelEnum.class new file mode 100644 index 0000000..df4e1e7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/enums/PayChannelEnum.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/enums/PayChannelRefundRespEnum.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/enums/PayChannelRefundRespEnum.class new file mode 100644 index 0000000..9e33ee0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/enums/PayChannelRefundRespEnum.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/enums/PayFrameworkErrorCodeConstants.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/enums/PayFrameworkErrorCodeConstants.class new file mode 100644 index 0000000..d339ff5 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/enums/PayFrameworkErrorCodeConstants.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/enums/PayNotifyRefundStatusEnum.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/enums/PayNotifyRefundStatusEnum.class new file mode 100644 index 0000000..656c453 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/classes/com/jojubanking/boot/framework/pay/core/enums/PayNotifyRefundStatusEnum.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/joju-spring-boot-starter-biz-pay-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-biz-pay/target/joju-spring-boot-starter-biz-pay-2.0.0-beta.jar new file mode 100644 index 0000000..d6b7d60 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/joju-spring-boot-starter-biz-pay-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-archiver/pom.properties new file mode 100644 index 0000000..4d74a46 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:28:44 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-biz-pay diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..6359a98 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,40 @@ +com\jojubanking\boot\framework\pay\core\client\impl\wx\WXPayClientConfig$V3.class +com\jojubanking\boot\framework\pay\core\client\impl\wx\WXPayClientConfig.class +com\jojubanking\boot\framework\pay\core\enums\PayChannelRefundRespEnum.class +com\jojubanking\boot\framework\pay\core\client\impl\PayClientFactoryImpl.class +com\jojubanking\boot\framework\pay\core\client\impl\wx\WXLitePayClient.class +com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayPayClientConfig$ModePublicKey.class +com\jojubanking\boot\framework\pay\core\client\dto\PayNotifyDataDTO$PayNotifyDataDTOBuilder.class +com\jojubanking\boot\framework\pay\core\client\impl\wx\WXPubPayClient.class +com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayQrPayClient.class +com\jojubanking\boot\framework\pay\core\client\dto\PayOrderUnifiedReqDTO.class +com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayPayCodeMapping.class +com\jojubanking\boot\framework\pay\core\client\dto\PayRefundUnifiedReqDTO$PayRefundUnifiedReqDTOBuilder.class +com\jojubanking\boot\framework\pay\core\client\impl\alipay\AbstractAlipayClient.class +com\jojubanking\boot\framework\pay\core\client\impl\wx\WXCodeMapping.class +com\jojubanking\boot\framework\pay\core\client\impl\wx\WXNativePayClient.class +com\jojubanking\boot\framework\pay\core\client\dto\PayRefundUnifiedRespDTO.class +com\jojubanking\boot\framework\pay\core\client\impl\wx\WXPayClientConfig$V2.class +com\jojubanking\boot\framework\pay\config\PayProperties.class +com\jojubanking\boot\framework\pay\core\client\PayClientFactory.class +com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayPayClientConfig$ModeCertificate.class +com\jojubanking\boot\framework\pay\core\client\impl\PayClientFactoryImpl$1.class +com\jojubanking\boot\framework\pay\core\client\PayCommonResult.class +com\jojubanking\boot\framework\pay\core\enums\PayFrameworkErrorCodeConstants.class +com\jojubanking\boot\framework\pay\core\client\AbstractPayCodeMapping.class +com\jojubanking\boot\framework\pay\config\JojuPayAutoConfiguration.class +com\jojubanking\boot\framework\pay\core\client\PayClientConfig.class +com\jojubanking\boot\framework\pay\core\client\dto\PayOrderNotifyRespDTO$PayOrderNotifyRespDTOBuilder.class +com\jojubanking\boot\framework\pay\core\client\dto\PayNotifyDataDTO.class +com\jojubanking\boot\framework\pay\core\client\dto\PayRefundNotifyDTO$PayRefundNotifyDTOBuilder.class +com\jojubanking\boot\framework\pay\core\enums\PayNotifyRefundStatusEnum.class +com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayPayClientConfig.class +com\jojubanking\boot\framework\pay\core\client\PayClient.class +com\jojubanking\boot\framework\pay\core\client\dto\PayRefundUnifiedReqDTO.class +com\jojubanking\boot\framework\pay\core\client\dto\PayRefundNotifyDTO.class +com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayPcPayClient.class +com\jojubanking\boot\framework\pay\core\client\dto\PayRefundUnifiedRespDTO$PayRefundUnifiedRespDTOBuilder.class +com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayWapPayClient.class +com\jojubanking\boot\framework\pay\core\client\dto\PayOrderNotifyRespDTO.class +com\jojubanking\boot\framework\pay\core\enums\PayChannelEnum.class +com\jojubanking\boot\framework\pay\core\client\impl\AbstractPayClient.class diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..d6d8c8b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,30 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\alipay\AbstractAlipayClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\wx\WXLitePayClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\enums\PayNotifyRefundStatusEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\dto\PayRefundNotifyDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayWapPayClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayPayClientConfig.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayPcPayClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\dto\PayRefundUnifiedRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\dto\PayNotifyDataDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\dto\PayOrderNotifyRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\dto\PayOrderUnifiedReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\AbstractPayClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\PayClientConfig.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\enums\PayChannelRefundRespEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\AbstractPayCodeMapping.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\wx\WXCodeMapping.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\config\JojuPayAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\wx\WXPayClientConfig.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\PayCommonResult.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayPayCodeMapping.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\wx\WXNativePayClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\PayClientFactory.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\dto\PayRefundUnifiedReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\PayClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayQrPayClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\wx\WXPubPayClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\client\impl\PayClientFactoryImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\enums\PayChannelEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\core\enums\PayFrameworkErrorCodeConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-pay\src\main\java\com\jojubanking\boot\framework\pay\config\PayProperties.java diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..da158f8 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1 @@ +com\jojubanking\boot\framework\pay\core\client\impl\alipay\AlipayQrPayClientTest.class diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..f9fe9e2 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-pay/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-pay\src\test\java\cn.iocoder.joju.framework.pay.core.client.impl\alipay\AlipayQrPayClientTest.java diff --git a/joju-framework/joju-spring-boot-starter-biz-pay/target/test-classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayQrPayClientTest.class b/joju-framework/joju-spring-boot-starter-biz-pay/target/test-classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayQrPayClientTest.class new file mode 100644 index 0000000..a64016e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-pay/target/test-classes/com/jojubanking/boot/framework/pay/core/client/impl/alipay/AlipayQrPayClientTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/joju-spring-boot-starter-biz-sms.iml b/joju-framework/joju-spring-boot-starter-biz-sms/joju-spring-boot-starter-biz-sms.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/joju-spring-boot-starter-biz-sms.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/pom.xml b/joju-framework/joju-spring-boot-starter-biz-sms/pom.xml new file mode 100644 index 0000000..1e1b8b7 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/pom.xml @@ -0,0 +1,93 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-biz-sms + jar + + ${project.artifactId} + 短信拓展,支持阿里云、云片、腾讯云 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + org.springframework.boot + spring-boot-starter + + + + + io.opentracing + opentracing-util + + + + + com.jojubanking.boot + joju-spring-boot-starter-test + test + ${revision} + + + + + com.google.guava + guava + true + + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-core + + + + jakarta.validation + jakarta.validation-api + + + + cn.hutool + hutool-all + + + + + + + com.yunpian.sdk + yunpian-java-sdk + + + + com.aliyun + aliyun-java-sdk-core + + + com.aliyun + aliyun-java-sdk-dysmsapi + + + com.tencentcloudapi + tencentcloud-sdk-java + + + + + diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/config/JojuSmsAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/config/JojuSmsAutoConfiguration.java new file mode 100644 index 0000000..79bd90d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/config/JojuSmsAutoConfiguration.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.framework.sms.config; + +import com.jojubanking.boot.framework.sms.core.client.SmsClientFactory; +import com.jojubanking.boot.framework.sms.core.client.impl.SmsClientFactoryImpl; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 短信配置类 + * + * @author TW + */ +@Configuration +public class JojuSmsAutoConfiguration { + + @Bean + public SmsClientFactory smsClientFactory() { + return new SmsClientFactoryImpl(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/SmsClient.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/SmsClient.java new file mode 100644 index 0000000..8df1f81 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/SmsClient.java @@ -0,0 +1,54 @@ +package com.jojubanking.boot.framework.sms.core.client; + +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; + +import java.util.List; + +/** + * 短信客户端,用于对接各短信平台的 SDK,实现短信发送等功能 + * + * @author zzf + * @since 2021/1/25 14:14 + */ +public interface SmsClient { + + /** + * 获得渠道编号 + * + * @return 渠道编号 + */ + Long getId(); + + /** + * 发送消息 + * + * @param logId 日志编号 + * @param mobile 手机号 + * @param apiTemplateId 短信 API 的模板编号 + * @param templateParams 短信模板参数。通过 List 数组,保证参数的顺序 + * @return 短信发送结果 + */ + SmsCommonResult sendSms(Long logId, String mobile, String apiTemplateId, + List> templateParams); + + /** + * 解析接收短信的接收结果 + * + * @param text 结果 + * @return 结果内容 + * @throws Throwable 当解析 text 发生异常时,则会抛出异常 + */ + List parseSmsReceiveStatus(String text) throws Throwable; + + /** + * 查询指定的短信模板 + * + * @param apiTemplateId 短信 API 的模板编号 + * @return 短信模板 + */ + SmsCommonResult getSmsTemplate(String apiTemplateId); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/SmsClientFactory.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/SmsClientFactory.java new file mode 100644 index 0000000..a58b9ff --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/SmsClientFactory.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.framework.sms.core.client; + +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; + +/** + * 短信客户端的工厂接口 + * + * @author zzf + * @since 2021/1/28 14:01 + */ +public interface SmsClientFactory { + + /** + * 获得短信 Client + * + * @param channelId 渠道编号 + * @return 短信 Client + */ + SmsClient getSmsClient(Long channelId); + + /** + * 获得短信 Client + * + * @param channelCode 渠道编码 + * @return 短信 Client + */ + SmsClient getSmsClient(String channelCode); + + /** + * 创建短信 Client + * + * @param properties 配置对象 + */ + void createOrUpdateSmsClient(SmsChannelProperties properties); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/SmsCodeMapping.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/SmsCodeMapping.java new file mode 100644 index 0000000..84d38a8 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/SmsCodeMapping.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.framework.sms.core.client; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; + +import java.util.function.Function; + +/** + * 将 API 的错误码,转换为通用的错误码 + * + * @see SmsCommonResult + * @see SmsFrameworkErrorCodeConstants + * + * @author TW + */ +public interface SmsCodeMapping extends Function { +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/SmsCommonResult.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/SmsCommonResult.java new file mode 100644 index 0000000..e31d55f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/SmsCommonResult.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.framework.sms.core.client; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.lang.Assert; +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * 短信的 CommonResult 拓展类 + * + * 考虑到不同的平台,返回的 code 和 msg 是不同的,所以统一额外返回 {@link #apiCode} 和 {@link #apiMsg} 字段 + * + * 另外,一些短信平台(例如说阿里云、腾讯云)会返回一个请求编号,用于排查请求失败的问题,我们设置到 {@link #apiRequestId} 字段 + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Accessors(chain = true) +public class SmsCommonResult extends CommonResult { + + /** + * API 返回错误码 + * + * 由于第三方的错误码可能是字符串,所以使用 String 类型 + */ + private String apiCode; + /** + * API 返回提示 + */ + private String apiMsg; + + /** + * API 请求编号 + */ + private String apiRequestId; + + private SmsCommonResult() { + } + + public static SmsCommonResult build(String apiCode, String apiMsg, String apiRequestId, + T data, SmsCodeMapping codeMapping) { + Assert.notNull(codeMapping, "参数 codeMapping 不能为空"); + SmsCommonResult result = new SmsCommonResult().setApiCode(apiCode).setApiMsg(apiMsg).setApiRequestId(apiRequestId); + result.setData(data); + // 翻译错误码 + if (codeMapping != null) { + ErrorCode errorCode = codeMapping.apply(apiCode); + if (errorCode == null) { + errorCode = SmsFrameworkErrorCodeConstants.SMS_UNKNOWN; + } + result.setCode(errorCode.getCode()).setMsg(errorCode.getMsg()); + } + return result; + } + + public static SmsCommonResult error(Throwable ex) { + SmsCommonResult result = new SmsCommonResult<>(); + result.setCode(SmsFrameworkErrorCodeConstants.EXCEPTION.getCode()); + result.setMsg(ExceptionUtil.getRootCauseMessage(ex)); + return result; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/dto/SmsReceiveRespDTO.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/dto/SmsReceiveRespDTO.java new file mode 100644 index 0000000..b2d671d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/dto/SmsReceiveRespDTO.java @@ -0,0 +1,50 @@ +package com.jojubanking.boot.framework.sms.core.client.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 消息接收 Response DTO + * + * @author TW + */ +@Data +@Accessors(chain = true) +public class SmsReceiveRespDTO { + + /** + * 是否接收成功 + */ + private Boolean success; + /** + * API 接收结果的编码 + */ + private String errorCode; + /** + * API 接收结果的说明 + */ + private String errorMsg; + + /** + * 手机号 + */ + private String mobile; + /** + * 用户接收时间 + */ + private Date receiveTime; + + /** + * 短信 API 发送返回的序号 + */ + private String serialNo; + /** + * 短信日志编号 + * + * 对应 SysSmsLogDO 的编号 + */ + private Long logId; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/dto/SmsSendRespDTO.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/dto/SmsSendRespDTO.java new file mode 100644 index 0000000..8bc6b5b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/dto/SmsSendRespDTO.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.framework.sms.core.client.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 短信发送 Response DTO + * + * @author TW + */ +@Data +@Accessors(chain = true) +public class SmsSendRespDTO { + + /** + * 短信 API 发送返回的序号 + */ + private String serialNo; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/dto/SmsTemplateRespDTO.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/dto/SmsTemplateRespDTO.java new file mode 100644 index 0000000..6e28331 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/dto/SmsTemplateRespDTO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.framework.sms.core.client.dto; + +import com.jojubanking.boot.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 短信模板 Response DTO + * + * @author TW + */ +@Data +@Accessors(chain = true) +public class SmsTemplateRespDTO { + + /** + * 模板编号 + */ + private String id; + /** + * 短信内容 + */ + private String content; + /** + * 审核状态 + * + * 枚举 {@link SmsTemplateAuditStatusEnum} + */ + private Integer auditStatus; + /** + * 审核未通过的理由 + */ + private String auditReason; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/AbstractSmsClient.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/AbstractSmsClient.java new file mode 100644 index 0000000..82c29b9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/AbstractSmsClient.java @@ -0,0 +1,127 @@ +package com.jojubanking.boot.framework.sms.core.client.impl; + +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.sms.core.client.SmsClient; +import com.jojubanking.boot.framework.sms.core.client.SmsCodeMapping; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * 短信客户端的抽象类,提供模板方法,减少子类的冗余代码 + * + * @author zzf + * @since 2021/2/1 9:28 + */ +@Slf4j +public abstract class AbstractSmsClient implements SmsClient { + + /** + * 短信渠道配置 + */ + protected volatile SmsChannelProperties properties; + /** + * 错误码枚举类 + */ + protected final SmsCodeMapping codeMapping; + + public AbstractSmsClient(SmsChannelProperties properties, SmsCodeMapping codeMapping) { + this.properties = prepareProperties(properties); + this.codeMapping = codeMapping; + } + + /** + * 初始化 + */ + public final void init() { + doInit(); + log.info("[init][配置({}) 初始化完成]", properties); + } + + /** + * 自定义初始化 + */ + protected abstract void doInit(); + + public final void refresh(SmsChannelProperties properties) { + // 判断是否更新 + if (properties.equals(this.properties)) { + return; + } + log.info("[refresh][配置({})发生变化,重新初始化]", properties); + this.properties = prepareProperties(properties); + // 初始化 + this.init(); + } + + /** + * 在赋值给{@link this#properties}前,子类可根据需要预处理短信渠道配置 + * + * @param properties 数据库中存储的短信渠道配置 + * @return 满足子类实现的短信渠道配置 + */ + protected SmsChannelProperties prepareProperties(SmsChannelProperties properties) { + return properties; + } + + @Override + public Long getId() { + return properties.getId(); + } + + @Override + public final SmsCommonResult sendSms(Long logId, String mobile, + String apiTemplateId, List> templateParams) { + // 执行短信发送 + SmsCommonResult result; + try { + result = doSendSms(logId, mobile, apiTemplateId, templateParams); + } catch (Throwable ex) { + // 打印异常日志 + log.error("[sendSms][发送短信异常,sendLogId({}) mobile({}) apiTemplateId({}) templateParams({})]", + logId, mobile, apiTemplateId, templateParams, ex); + // 封装返回 + return SmsCommonResult.error(ex); + } + return result; + } + + protected abstract SmsCommonResult doSendSms(Long sendLogId, String mobile, + String apiTemplateId, List> templateParams) + throws Throwable; + + @Override + public List parseSmsReceiveStatus(String text) throws Throwable { + try { + return doParseSmsReceiveStatus(text); + } catch (Throwable ex) { + log.error("[parseSmsReceiveStatus][text({}) 解析发生异常]", text, ex); + throw ex; + } + } + + protected abstract List doParseSmsReceiveStatus(String text) throws Throwable; + + @Override + public SmsCommonResult getSmsTemplate(String apiTemplateId) { + // 执行短信发送 + SmsCommonResult result; + try { + result = doGetSmsTemplate(apiTemplateId); + } catch (Throwable ex) { + // 打印异常日志 + log.error("[getSmsTemplate][获得短信模板({}) 发生异常]", apiTemplateId, ex); + // 封装返回 + return SmsCommonResult.error(ex); + } + return result; + } + + protected abstract SmsCommonResult doGetSmsTemplate(String apiTemplateId) throws Throwable; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/SmsClientFactoryImpl.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/SmsClientFactoryImpl.java new file mode 100644 index 0000000..0c83bf0 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/SmsClientFactoryImpl.java @@ -0,0 +1,92 @@ +package com.jojubanking.boot.framework.sms.core.client.impl; + +import com.jojubanking.boot.framework.sms.core.client.SmsClient; +import com.jojubanking.boot.framework.sms.core.client.SmsClientFactory; +import com.jojubanking.boot.framework.sms.core.client.impl.aliyun.AliyunSmsClient; +import com.jojubanking.boot.framework.sms.core.client.impl.debug.DebugDingTalkSmsClient; +import com.jojubanking.boot.framework.sms.core.client.impl.tencent.TencentSmsClient; +import com.jojubanking.boot.framework.sms.core.client.impl.yunpian.YunpianSmsClient; +import com.jojubanking.boot.framework.sms.core.enums.SmsChannelEnum; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Assert; +import org.springframework.validation.annotation.Validated; + +import java.util.Arrays; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 短信客户端工厂接口 + * + * @author zzf + */ +@Validated +@Slf4j +public class SmsClientFactoryImpl implements SmsClientFactory { + + /** + * 短信客户端 Map + * key:渠道编号,使用 {@link SmsChannelProperties#getId()} + */ + private final ConcurrentMap channelIdClients = new ConcurrentHashMap<>(); + + /** + * 短信客户端 Map + * key:渠道编码,使用 {@link SmsChannelProperties#getCode()} ()} + * + * 注意,一些场景下,需要获得某个渠道类型的客户端,所以需要使用它。 + * 例如说,解析短信接收结果,是相对通用的,不需要使用某个渠道编号的 {@link #channelIdClients} + */ + private final ConcurrentMap channelCodeClients = new ConcurrentHashMap<>(); + + public SmsClientFactoryImpl() { + // 初始化 channelCodeClients 集合 + Arrays.stream(SmsChannelEnum.values()).forEach(channel -> { + // 创建一个空的 SmsChannelProperties 对象 + SmsChannelProperties properties = new SmsChannelProperties().setCode(channel.getCode()) + .setApiKey("default default").setApiSecret("default"); + // 创建 Sms 客户端 + AbstractSmsClient smsClient = createSmsClient(properties); + channelCodeClients.put(channel.getCode(), smsClient); + }); + } + + @Override + public SmsClient getSmsClient(Long channelId) { + return channelIdClients.get(channelId); + } + + @Override + public SmsClient getSmsClient(String channelCode) { + return channelCodeClients.get(channelCode); + } + + @Override + public void createOrUpdateSmsClient(SmsChannelProperties properties) { + AbstractSmsClient client = channelIdClients.get(properties.getId()); + if (client == null) { + client = this.createSmsClient(properties); + client.init(); + channelIdClients.put(client.getId(), client); + } else { + client.refresh(properties); + } + } + + private AbstractSmsClient createSmsClient(SmsChannelProperties properties) { + SmsChannelEnum channelEnum = SmsChannelEnum.getByCode(properties.getCode()); + Assert.notNull(channelEnum, String.format("渠道类型(%s) 为空", channelEnum)); + // 创建客户端 + switch (channelEnum) { + case ALIYUN: return new AliyunSmsClient(properties); + case YUN_PIAN: return new YunpianSmsClient(properties); + case DEBUG_DING_TALK: return new DebugDingTalkSmsClient(properties); + case TENCENT: return new TencentSmsClient(properties); + } + // 创建失败,错误日志 + 抛出异常 + log.error("[createSmsClient][配置({}) 找不到合适的客户端实现]", properties); + throw new IllegalArgumentException(String.format("配置(%s) 找不到合适的客户端实现", properties)); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClient.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClient.java new file mode 100644 index 0000000..8ec9562 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClient.java @@ -0,0 +1,212 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.aliyun; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.jojubanking.boot.framework.sms.core.client.impl.AbstractSmsClient; +import com.jojubanking.boot.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import com.jojubanking.boot.framework.common.util.collection.MapUtils; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.aliyuncs.AcsRequest; +import com.aliyuncs.AcsResponse; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateRequest; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.profile.DefaultProfile; +import com.aliyuncs.profile.IClientProfile; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.annotations.VisibleForTesting; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; + +/** + * 阿里短信客户端的实现类 + * + * @author zzf + * @since 2021/1/25 14:17 + */ +@Slf4j +public class AliyunSmsClient extends AbstractSmsClient { + + /** + * REGION, 使用杭州 + */ + private static final String ENDPOINT = "cn-hangzhou"; + + /** + * 阿里云客户端 + */ + private volatile IAcsClient client; + + public AliyunSmsClient(SmsChannelProperties properties) { + super(properties, new AliyunSmsCodeMapping()); + Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空"); + Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空"); + } + + @Override + protected void doInit() { + IClientProfile profile = DefaultProfile.getProfile(ENDPOINT, properties.getApiKey(), properties.getApiSecret()); + client = new DefaultAcsClient(profile); + } + + @Override + protected SmsCommonResult doSendSms(Long sendLogId, String mobile, + String apiTemplateId, List> templateParams) { + // 构建参数 + SendSmsRequest request = new SendSmsRequest(); + request.setPhoneNumbers(mobile); + request.setSignName(properties.getSignature()); + request.setTemplateCode(apiTemplateId); + request.setTemplateParam(JsonUtils.toJsonString(MapUtils.convertMap(templateParams))); + request.setOutId(String.valueOf(sendLogId)); + // 执行请求 + return invoke(request, response -> new SmsSendRespDTO().setSerialNo(response.getBizId())); + } + + @Override + protected List doParseSmsReceiveStatus(String text) throws Throwable { + List statuses = JsonUtils.parseArray(text, SmsReceiveStatus.class); + return statuses.stream().map(status -> { + SmsReceiveRespDTO resp = new SmsReceiveRespDTO(); + resp.setSuccess(status.getSuccess()); + resp.setErrorCode(status.getErrCode()).setErrorMsg(status.getErrMsg()); + resp.setMobile(status.getPhoneNumber()).setReceiveTime(status.getReportTime()); + resp.setSerialNo(status.getBizId()).setLogId(Long.valueOf(status.getOutId())); + return resp; + }).collect(Collectors.toList()); + } + + @Override + protected SmsCommonResult doGetSmsTemplate(String apiTemplateId) { + // 构建参数 + QuerySmsTemplateRequest request = new QuerySmsTemplateRequest(); + request.setTemplateCode(apiTemplateId); + // 执行请求 + return invoke(request, response -> { + SmsTemplateRespDTO data = new SmsTemplateRespDTO(); + data.setId(response.getTemplateCode()).setContent(response.getTemplateContent()); + data.setAuditStatus(convertSmsTemplateAuditStatus(response.getTemplateStatus())).setAuditReason(response.getReason()); + return data; + }); + } + + @VisibleForTesting + Integer convertSmsTemplateAuditStatus(Integer templateStatus) { + switch (templateStatus) { + case 0: return SmsTemplateAuditStatusEnum.CHECKING.getStatus(); + case 1: return SmsTemplateAuditStatusEnum.SUCCESS.getStatus(); + case 2: return SmsTemplateAuditStatusEnum.FAIL.getStatus(); + default: throw new IllegalArgumentException(String.format("未知审核状态(%d)", templateStatus)); + } + } + + @VisibleForTesting + SmsCommonResult invoke(AcsRequest request, Function responseConsumer) { + try { + // 执行发送. 由于阿里云 sms 短信没有统一的 Response,但是有统一的 code、message、requestId 属性,所以只好反射 + T sendResult = client.getAcsResponse(request); + String code = (String) ReflectUtil.getFieldValue(sendResult, "code"); + String message = (String) ReflectUtil.getFieldValue(sendResult, "message"); + String requestId = (String) ReflectUtil.getFieldValue(sendResult, "requestId"); + // 解析结果 + R data = null; + if (Objects.equals(code, "OK")) { // 请求成功的情况下 + data = responseConsumer.apply(sendResult); + } + // 拼接结果 + return SmsCommonResult.build(code, message, requestId, data, codeMapping); + } catch (ClientException ex) { + return SmsCommonResult.build(ex.getErrCode(), formatResultMsg(ex), ex.getRequestId(), null, codeMapping); + } + } + + private static String formatResultMsg(ClientException ex) { + if (StrUtil.isEmpty(ex.getErrorDescription())) { + return ex.getErrMsg(); + } + return ex.getErrMsg() + " => " + ex.getErrorDescription(); + } + + /** + * 短信接收状态 + * + * 参见 https://help.aliyun.com/document_detail/101867.html 文档 + * + * @author TW + */ + @Data + public static class SmsReceiveStatus { + + /** + * 手机号 + */ + @JsonProperty("phone_number") + private String phoneNumber; + /** + * 发送时间 + */ + @JsonProperty("send_time") + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + private Date sendTime; + /** + * 状态报告时间 + */ + @JsonProperty("report_time") + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + private Date reportTime; + /** + * 是否接收成功 + */ + private Boolean success; + /** + * 状态报告说明 + */ + @JsonProperty("err_msg") + private String errMsg; + /** + * 状态报告编码 + */ + @JsonProperty("err_code") + private String errCode; + /** + * 发送序列号 + */ + @JsonProperty("biz_id") + private String bizId; + /** + * 用户序列号 + * + * 这里我们传递的是 SysSmsLogDO 的日志编号 + */ + @JsonProperty("out_id") + private String outId; + /** + * 短信长度,例如说 1、2、3 + * + * 140 字节算一条短信,短信长度超过 140 字节时会拆分成多条短信发送 + */ + @JsonProperty("sms_size") + private Integer smsSize; + + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMapping.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMapping.java new file mode 100644 index 0000000..e1f2503 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMapping.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.aliyun; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.sms.core.client.SmsCodeMapping; +import com.jojubanking.boot.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; + +/** + * 阿里云的 SmsCodeMapping 实现类 + * + * 参见 https://help.aliyun.com/document_detail/101346.htm 文档 + * + * @author TW + */ +public class AliyunSmsCodeMapping implements SmsCodeMapping { + + @Override + public ErrorCode apply(String apiCode) { + switch (apiCode) { + case "OK": return GlobalErrorCodeConstants.SUCCESS; + case "isv.ACCOUNT_NOT_EXISTS": + case "isv.ACCOUNT_ABNORMAL": + case "MissingAccessKeyId": return SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID; + case "isp.RAM_PERMISSION_DENY": return SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY; + case "isv.INVALID_JSON_PARAM": + case "isv.INVALID_PARAMETERS": return SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR; + case "isv.BUSINESS_LIMIT_CONTROL": return SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL; + case "isv.DAY_LIMIT_CONTROL": return SmsFrameworkErrorCodeConstants.SMS_SEND_DAY_LIMIT_CONTROL; + case "isv.SMS_CONTENT_ILLEGAL": return SmsFrameworkErrorCodeConstants.SMS_SEND_CONTENT_INVALID; + case "isv.SMS_TEMPLATE_ILLEGAL": return SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID; + case "isv.SMS_SIGNATURE_ILLEGAL": + case "isv.SIGN_NAME_ILLEGAL": + case "isv.SMS_SIGN_ILLEGAL": return SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID; + case "isv.AMOUNT_NOT_ENOUGH": + case "isv.OUT_OF_SERVICE": return SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH; + case "isv.MOBILE_NUMBER_ILLEGAL": return SmsFrameworkErrorCodeConstants.SMS_MOBILE_INVALID; + case "isv.TEMPLATE_MISSING_PARAMETERS": return SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR; + } + return SmsFrameworkErrorCodeConstants.SMS_UNKNOWN; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/debug/DebugDingTalkCodeMapping.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/debug/DebugDingTalkCodeMapping.java new file mode 100644 index 0000000..48d749e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/debug/DebugDingTalkCodeMapping.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.debug; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.sms.core.client.SmsCodeMapping; +import com.jojubanking.boot.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; + +import java.util.Objects; + +/** + * 钉钉的 SmsCodeMapping 实现类 + * + * @author TW + */ +public class DebugDingTalkCodeMapping implements SmsCodeMapping { + + @Override + public ErrorCode apply(String apiCode) { + return Objects.equals(apiCode, "0") ? GlobalErrorCodeConstants.SUCCESS : SmsFrameworkErrorCodeConstants.SMS_UNKNOWN; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/debug/DebugDingTalkSmsClient.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/debug/DebugDingTalkSmsClient.java new file mode 100644 index 0000000..9f95a3b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/debug/DebugDingTalkSmsClient.java @@ -0,0 +1,96 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.debug; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.crypto.digest.HmacAlgorithm; +import cn.hutool.http.HttpUtil; +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.jojubanking.boot.framework.sms.core.client.impl.AbstractSmsClient; +import com.jojubanking.boot.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import com.jojubanking.boot.framework.common.util.collection.MapUtils; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 基于钉钉 WebHook 实现的调试的短信客户端实现类 + * + * 考虑到省钱,我们使用钉钉 WebHook 模拟发送短信,方便调试。 + * + * @author TW + */ +public class DebugDingTalkSmsClient extends AbstractSmsClient { + + public DebugDingTalkSmsClient(SmsChannelProperties properties) { + super(properties, new DebugDingTalkCodeMapping()); + Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空"); + Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空"); + } + + @Override + protected void doInit() { + } + + @Override + protected SmsCommonResult doSendSms(Long sendLogId, String mobile, + String apiTemplateId, List> templateParams) throws Throwable { + // 构建请求 + String url = buildUrl("robot/send"); + Map params = new HashMap<>(); + params.put("msgtype", "text"); + String content = String.format("【模拟短信】\n手机号:%s\n短信日志编号:%d\n模板参数:%s", + mobile, sendLogId, MapUtils.convertMap(templateParams)); + params.put("text", MapUtil.builder().put("content", content).build()); + // 执行请求 + String responseText = HttpUtil.post(url, JsonUtils.toJsonString(params)); + // 解析结果 + Map responseObj = JsonUtils.parseObject(responseText, Map.class); + return SmsCommonResult.build(MapUtil.getStr(responseObj, "errcode"), MapUtil.getStr(responseObj, "errorMsg"), + null, new SmsSendRespDTO().setSerialNo(StrUtil.uuid()), codeMapping); + } + + /** + * 构建请求地址 + * + * 参见 https://developers.dingtalk.com/document/app/custom-robot-access/title-nfv-794-g71 文档 + * + * @param path 请求路径 + * @return 请求地址 + */ + @SuppressWarnings("SameParameterValue") + private String buildUrl(String path) { + // 生成 timestamp + long timestamp = System.currentTimeMillis(); + // 生成 sign + String secret = properties.getApiSecret(); + String stringToSign = timestamp + "\n" + secret; + byte[] signData = DigestUtil.hmac(HmacAlgorithm.HmacSHA256, StrUtil.bytes(secret)).digest(stringToSign); + String sign = Base64.encode(signData); + // 构建最终 URL + return String.format("https://oapi.dingtalk.com/%s?access_token=%s×tamp=%d&sign=%s", + path, properties.getApiKey(), timestamp, sign); + } + + @Override + protected List doParseSmsReceiveStatus(String text) throws Throwable { + throw new UnsupportedOperationException("模拟短信客户端,暂时无需解析回调"); + } + + @Override + protected SmsCommonResult doGetSmsTemplate(String apiTemplateId) { + SmsTemplateRespDTO data = new SmsTemplateRespDTO().setId(apiTemplateId).setContent("") + .setAuditStatus(SmsTemplateAuditStatusEnum.SUCCESS.getStatus()).setAuditReason(""); + return SmsCommonResult.build("0", "success", null, data, codeMapping); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsChannelProperties.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsChannelProperties.java new file mode 100644 index 0000000..e8e002a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsChannelProperties.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.tencent; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 腾讯云短信配置实现类 + * 腾讯云发送短信时,需要额外的参数 sdkAppId, + * + * @author shiwp + */ +@Data +@Accessors(chain = true) +public class TencentSmsChannelProperties extends SmsChannelProperties { + + /** + * 应用 id + */ + private String sdkAppId; + + /** + * 考虑到不破坏原有的 apiKey + apiSecret 的结构, + * 所以腾讯云短信存储时,将 secretId 拼接到 apiKey 字段中,格式为 "secretId sdkAppId"。 + * 因此在使用时,需要将 secretId 和 sdkAppId 解析出来,分别存储到对应字段中。 + */ + public static TencentSmsChannelProperties build(SmsChannelProperties properties) { + if (properties instanceof TencentSmsChannelProperties) { + return (TencentSmsChannelProperties) properties; + } + TencentSmsChannelProperties result = BeanUtil.toBean(properties, TencentSmsChannelProperties.class); + String combineKey = properties.getApiKey(); + Assert.notEmpty(combineKey, "apiKey 不能为空"); + String[] keys = combineKey.trim().split(" "); + Assert.isTrue(keys.length == 2, "腾讯云短信 apiKey 配置格式错误,请配置 为[secretId sdkAppId]"); + Assert.notBlank(keys[0], "腾讯云短信 secretId 不能为空"); + Assert.notBlank(keys[1], "腾讯云短信 sdkAppId 不能为空"); + result.setSdkAppId(keys[1]).setApiKey(keys[0]); + return result; + } +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient.java new file mode 100644 index 0000000..24134ec --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient.java @@ -0,0 +1,304 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.tencent; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.jojubanking.boot.framework.sms.core.client.impl.AbstractSmsClient; +import com.jojubanking.boot.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.annotations.VisibleForTesting; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; + +/** + * 腾讯云短信功能实现 + *

+ * 参见 https://cloud.tencent.com/document/product/382/52077 + * + * @author shiwp + */ +public class TencentSmsClient extends AbstractSmsClient { + + /** + * 调用成功 code + */ + public static final String API_SUCCESS_CODE = "Ok"; + + /** + * REGION,使用南京 + */ + private static final String ENDPOINT = "ap-nanjing"; + + /** + * 是否国际/港澳台短信: + * 0:表示国内短信。 + * 1:表示国际/港澳台短信。 + */ + private static final long INTERNATIONAL = 0L; + + private SmsClient client; + + public TencentSmsClient(SmsChannelProperties properties) { + super(properties, new TencentSmsCodeMapping()); + Assert.notEmpty(properties.getApiSecret(), "apiSecret 不能为空"); + } + + @Override + protected void doInit() { + // 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId,secretKey + Credential credential = new Credential(properties.getApiKey(), properties.getApiSecret()); + client = new SmsClient(credential, ENDPOINT); + } + + @Override + protected SmsCommonResult doSendSms(Long sendLogId, + String mobile, + String apiTemplateId, + List> templateParams) throws Throwable { + return invoke(() -> buildSendSmsRequest(sendLogId, mobile, apiTemplateId, templateParams), + this::doSendSms0, + response -> { + SendStatus sendStatus = response.getSendStatusSet()[0]; + return SmsCommonResult.build(sendStatus.getCode(), sendStatus.getMessage(), response.getRequestId(), + new SmsSendRespDTO().setSerialNo(sendStatus.getSerialNo()), codeMapping); + }); + } + + + /** + * 腾讯云发放短信的时候,需要额外的参数 sdkAppId。 + * 考虑到不破坏原有的 apiKey + apiSecret 的结构,所以将 secretId 拼接到 apiKey 字段中,格式为 "secretId sdkAppId"。 + * 因此,这边需要使用 TencentSmsChannelProperties 做拆分,重新封装到 properties 内。 + * + * @param properties 数据库中存储的短信渠道配置 + * @return TencentSmsChannelProperties + */ + @Override + protected SmsChannelProperties prepareProperties(SmsChannelProperties properties) { + return TencentSmsChannelProperties.build(properties); + } + + /** + * 调用腾讯云 SDK 发送短信 + * + * @param request 发送短信请求 + * @return 发送短信响应 + * @throws TencentCloudSDKException SDK 用来封装发送短信失败 + */ + private SendSmsResponse doSendSms0(SendSmsRequest request) throws TencentCloudSDKException { + return client.SendSms(request); + } + + /** + * 封装腾讯云发送短信请求 + * + * @param sendLogId 日志编号 + * @param mobile 手机号 + * @param apiTemplateId 短信 API 的模板编号 + * @param templateParams 短信模板参数。通过 List 数组,保证参数的顺序 + * @return 腾讯云发送短信请求 + */ + private SendSmsRequest buildSendSmsRequest(Long sendLogId, + String mobile, + String apiTemplateId, + List> templateParams) { + SendSmsRequest request = new SendSmsRequest(); + request.setSmsSdkAppId(((TencentSmsChannelProperties) properties).getSdkAppId()); + request.setPhoneNumberSet(new String[]{mobile}); + request.setSignName(properties.getSignature()); + request.setTemplateId(apiTemplateId); + request.setTemplateParamSet(ArrayUtils.toArray(templateParams, e -> String.valueOf(e.getValue()))); + request.setSessionContext(JsonUtils.toJsonString(new SessionContext().setLogId(sendLogId))); + return request; + } + + @Override + protected List doParseSmsReceiveStatus(String text) throws Throwable { + List callback = JsonUtils.parseArray(text, SmsReceiveStatus.class); + return CollectionUtils.convertList(callback, status -> { + SmsReceiveRespDTO data = new SmsReceiveRespDTO(); + data.setErrorCode(status.getErrCode()).setErrorMsg(status.getDescription()); + data.setReceiveTime(status.getReceiveTime()).setSuccess(SmsReceiveStatus.SUCCESS_CODE.equalsIgnoreCase(status.getStatus())); + data.setMobile(status.getMobile()).setSerialNo(status.getSerialNo()); + SessionContext context; + Long logId; + Assert.notNull(context = status.getSessionContext(), "回执信息中未解析出 context,请联系腾讯云小助手"); + Assert.notNull(logId = context.getLogId(), "回执信息中未解析出 logId,请联系腾讯云小助手"); + data.setLogId(logId); + return data; + }); + } + + @Override + protected SmsCommonResult doGetSmsTemplate(String apiTemplateId) throws Throwable { + return invoke(() -> this.buildSmsTemplateStatusRequest(apiTemplateId), + this::doGetSmsTemplate0, + response -> { + SmsTemplateRespDTO data = convertTemplateStatusDTO(response.getDescribeTemplateStatusSet()[0]); + return SmsCommonResult.build(API_SUCCESS_CODE, null, response.getRequestId(), data, codeMapping); + }); + } + + @VisibleForTesting + SmsTemplateRespDTO convertTemplateStatusDTO(DescribeTemplateListStatus templateStatus) { + if (templateStatus == null) { + return null; + } + SmsTemplateAuditStatusEnum auditStatus; + Assert.notNull(templateStatus.getStatusCode(), + StrUtil.format("短信模版审核状态为 null,模版 id{}", templateStatus.getTemplateId())); + switch (templateStatus.getStatusCode().intValue()) { + case -1: + auditStatus = SmsTemplateAuditStatusEnum.FAIL; + break; + case 0: + auditStatus = SmsTemplateAuditStatusEnum.SUCCESS; + break; + case 1: + auditStatus = SmsTemplateAuditStatusEnum.CHECKING; + break; + default: + throw new IllegalStateException(StrUtil.format("不能解析短信模版审核状态{},模版 id{}", + templateStatus.getStatusCode(), templateStatus.getTemplateId())); + } + SmsTemplateRespDTO data = new SmsTemplateRespDTO(); + data.setId(String.valueOf(templateStatus.getTemplateId())).setContent(templateStatus.getTemplateContent()); + data.setAuditStatus(auditStatus.getStatus()).setAuditReason(templateStatus.getReviewReply()); + return data; + } + + /** + * 封装查询模版审核状态请求 + * @param apiTemplateId api 的模版 id + * @return 查询模版审核状态请求 + */ + private DescribeSmsTemplateListRequest buildSmsTemplateStatusRequest(String apiTemplateId) { + DescribeSmsTemplateListRequest request = new DescribeSmsTemplateListRequest(); + request.setTemplateIdSet(new Long[]{Long.parseLong(apiTemplateId)}); + // 地区 0:表示国内短信。1:表示国际/港澳台短信。 + request.setInternational(INTERNATIONAL); + return request; + } + + /** + * 调用腾讯云 SDK 查询短信模版状态 + * + * @param request 查询短信模版状态请求 + * @return 查询短信模版状态响应 + * @throws TencentCloudSDKException SDK 用来封装查询短信模版状态失败 + */ + private DescribeSmsTemplateListResponse doGetSmsTemplate0(DescribeSmsTemplateListRequest request) throws TencentCloudSDKException { + return client.DescribeSmsTemplateList(request); + } + + SmsCommonResult invoke(Supplier requestSupplier, + SdkFunction responseSupplier, + Function> resultGen) { + // 构建请求body + Q request = requestSupplier.get(); + P response; + // 调用腾讯云发送短信 + try { + response = responseSupplier.apply(request); + } catch (TencentCloudSDKException e) { + // 调用异常,封装结果 + return SmsCommonResult.build(e.getErrorCode(), e.getMessage(), e.getRequestId(), null, codeMapping); + } + return resultGen.apply(response); + } + + @Data + private static class SmsReceiveStatus { + + /** + * 短信接受成功 code + */ + public static final String SUCCESS_CODE = "SUCCESS"; + + /** + * 用户实际接收到短信的时间 + */ + @JsonProperty("user_receive_time") + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + private Date receiveTime; + + /** + * 国家(或地区)码 + */ + @JsonProperty("nationcode") + private String nationCode; + + /** + * 手机号码 + */ + private String mobile; + + /** + * 实际是否收到短信接收状态,SUCCESS(成功)、FAIL(失败) + */ + @JsonProperty("report_status") + private String status; + + /** + * 用户接收短信状态码错误信息 + */ + @JsonProperty("errmsg") + private String errCode; + + /** + * 用户接收短信状态描述 + */ + @JsonProperty("description") + private String description; + + /** + * 本次发送标识 ID(与发送接口返回的SerialNo对应) + */ + @JsonProperty("sid") + private String serialNo; + + /** + * 用户的 session 内容(与发送接口的请求参数SessionContext一致) + */ + @JsonProperty("ext") + private SessionContext sessionContext; + + } + + @VisibleForTesting + @Data + @Accessors(chain = true) + static class SessionContext { + + /** + * 发送短信记录id + */ + private Long logId; + } + + private interface SdkFunction { + R apply(T t) throws TencentCloudSDKException; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsCodeMapping.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsCodeMapping.java new file mode 100644 index 0000000..9666dda --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsCodeMapping.java @@ -0,0 +1,50 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.tencent; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.sms.core.client.SmsCodeMapping; +import com.jojubanking.boot.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; + +import static com.jojubanking.boot.framework.sms.core.enums.SmsFrameworkErrorCodeConstants.*; + +/** + * 腾讯云的 SmsCodeMapping 实现类 + * + * 参见 https://cloud.tencent.com/document/api/382/52075#.E5.85.AC.E5.85.B1.E9.94.99.E8.AF.AF.E7.A0.81 + * + * @author : shiwp + */ +public class TencentSmsCodeMapping implements SmsCodeMapping { + + @Override + public ErrorCode apply(String apiCode) { + switch (apiCode) { + case TencentSmsClient.API_SUCCESS_CODE: return GlobalErrorCodeConstants.SUCCESS; + case "FailedOperation.ContainSensitiveWord": return SMS_SEND_CONTENT_INVALID; + case "FailedOperation.JsonParseFail": + case "MissingParameter.EmptyPhoneNumberSet": + case "LimitExceeded.PhoneNumberCountLimit": + case "FailedOperation.FailResolvePacket": return GlobalErrorCodeConstants.BAD_REQUEST; + case "FailedOperation.InsufficientBalanceInSmsPackage": return SMS_ACCOUNT_MONEY_NOT_ENOUGH; + case "FailedOperation.MarketingSendTimeConstraint": return SMS_SEND_MARKET_LIMIT_CONTROL; + case "FailedOperation.PhoneNumberInBlacklist": return SMS_MOBILE_BLACK; + case "FailedOperation.SignatureIncorrectOrUnapproved": return SMS_SIGN_INVALID; + case "FailedOperation.MissingTemplateToModify": + case "FailedOperation.TemplateIncorrectOrUnapproved": return SMS_TEMPLATE_INVALID; + case "InvalidParameterValue.IncorrectPhoneNumber": return SMS_MOBILE_INVALID; + case "InvalidParameterValue.SdkAppIdNotExist": return SMS_APP_ID_INVALID; + case "InvalidParameterValue.TemplateParameterLengthLimit": + case "InvalidParameterValue.TemplateParameterFormatError": return SMS_TEMPLATE_PARAM_ERROR; + case "LimitExceeded.PhoneNumberDailyLimit": return SMS_SEND_DAY_LIMIT_CONTROL; + case "LimitExceeded.PhoneNumberThirtySecondLimit": + case "LimitExceeded.PhoneNumberOneHourLimit": return SMS_SEND_BUSINESS_LIMIT_CONTROL; + case "UnauthorizedOperation.RequestPermissionDeny": + case "FailedOperation.ForbidAddMarketingTemplates": + case "FailedOperation.NotEnterpriseCertification": + case "UnauthorizedOperation.IndividualUserMarketingSmsPermissionDeny": return SMS_PERMISSION_DENY; + case "UnauthorizedOperation.RequestIpNotInWhitelist": return SMS_IP_DENY; + case "AuthFailure.SecretIdNotFound": return SMS_ACCOUNT_INVALID; + } + return SmsFrameworkErrorCodeConstants.SMS_UNKNOWN; + } +} \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClient.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClient.java new file mode 100644 index 0000000..d2c92b4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClient.java @@ -0,0 +1,205 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.yunpian; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.jojubanking.boot.framework.sms.core.client.impl.AbstractSmsClient; +import com.jojubanking.boot.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.annotations.VisibleForTesting; +import com.yunpian.sdk.YunpianClient; +import com.yunpian.sdk.constant.YunpianConstant; +import com.yunpian.sdk.model.Result; +import com.yunpian.sdk.model.Template; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.*; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT; + +/** + * 云片短信客户端的实现类 + * + * @author zzf + * @since 9:48 2021/3/5 + */ +@Slf4j +public class YunpianSmsClient extends AbstractSmsClient { + + /** + * 云信短信客户端 + */ + private volatile YunpianClient client; + + public YunpianSmsClient(SmsChannelProperties properties) { + super(properties, new YunpianSmsCodeMapping()); + Assert.notEmpty(properties.getApiKey(), "apiKey 不能为空"); + } + + @Override + public void doInit() { + YunpianClient oldClient = client; + // 初始化新的客户端 + YunpianClient newClient = new YunpianClient(properties.getApiKey()); + newClient.init(); + this.client = newClient; + // 销毁老的客户端 + if (oldClient != null) { + oldClient.close(); + } + } + + @Override + protected SmsCommonResult doSendSms(Long sendLogId, String mobile, + String apiTemplateId, List> templateParams) throws Throwable { + return invoke(() -> { + Map request = new HashMap<>(); + request.put(YunpianConstant.MOBILE, mobile); + request.put(YunpianConstant.TPL_ID, apiTemplateId); + request.put(YunpianConstant.TPL_VALUE, formatTplValue(templateParams)); + request.put(YunpianConstant.UID, String.valueOf(sendLogId)); + request.put(YunpianConstant.CALLBACK_URL, properties.getCallbackUrl()); + return client.sms().tpl_single_send(request); + }, response -> new SmsSendRespDTO().setSerialNo(String.valueOf(response.getSid()))); + } + + private static String formatTplValue(List> templateParams) { + if (CollUtil.isEmpty(templateParams)) { + return ""; + } + // 参考 https://www.yunpian.com/official/document/sms/zh_cn/introduction_demos_encode_sample 格式化 + StringJoiner joiner = new StringJoiner("&"); + templateParams.forEach(param -> joiner.add(String.format("#%s#=%s", param.getKey(), + URLUtil.encode(String.valueOf(param.getValue()))))); + return joiner.toString(); + } + + @Override + protected List doParseSmsReceiveStatus(String text) throws Throwable { + List statuses = JsonUtils.parseArray(text, SmsReceiveStatus.class); + return statuses.stream().map(status -> { + SmsReceiveRespDTO resp = new SmsReceiveRespDTO(); + resp.setSuccess(Objects.equals(status.getReportStatus(), "SUCCESS")); + resp.setErrorCode(status.getErrorMsg()).setErrorMsg(status.getErrorDetail()); + resp.setMobile(status.getMobile()).setReceiveTime(status.getUserReceiveTime()); + resp.setSerialNo(String.valueOf(status.getSid())).setLogId(status.getUid()); + return resp; + }).collect(Collectors.toList()); + } + + @Override + protected SmsCommonResult doGetSmsTemplate(String apiTemplateId) throws Throwable { + return invoke(() -> { + Map request = new HashMap<>(); + request.put(YunpianConstant.APIKEY, properties.getApiKey()); + request.put(YunpianConstant.TPL_ID, apiTemplateId); + return client.tpl().get(request); + }, response -> { + Template template = response.get(0); + return new SmsTemplateRespDTO().setId(String.valueOf(template.getTpl_id())).setContent(template.getTpl_content()) + .setAuditStatus(convertSmsTemplateAuditStatus(template.getCheck_status())).setAuditReason(template.getReason()); + }); + } + + @VisibleForTesting + Integer convertSmsTemplateAuditStatus(String checkStatus) { + switch (checkStatus) { + case "CHECKING": return SmsTemplateAuditStatusEnum.CHECKING.getStatus(); + case "SUCCESS": return SmsTemplateAuditStatusEnum.SUCCESS.getStatus(); + case "FAIL": return SmsTemplateAuditStatusEnum.FAIL.getStatus(); + default: throw new IllegalArgumentException(String.format("未知审核状态(%s)", checkStatus)); + } + } + + @VisibleForTesting + SmsCommonResult invoke(Supplier> requestConsumer, Function responseConsumer) throws Throwable { + // 执行请求 + Result result = requestConsumer.get(); + if (result.getThrowable() != null) { + throw result.getThrowable(); + } + // 解析结果 + R data = null; + if (result.getData() != null) { + data = responseConsumer.apply(result.getData()); + } + // 拼接结果 + return SmsCommonResult.build(String.valueOf(result.getCode()), formatResultMsg(result), null, data, codeMapping); + } + + private static String formatResultMsg(Result sendResult) { + if (StrUtil.isEmpty(sendResult.getDetail())) { + return sendResult.getMsg(); + } + return sendResult.getMsg() + " => " + sendResult.getDetail(); + } + + /** + * 短信接收状态 + * + * 参见 https://www.yunpian.com/official/document/sms/zh_cn/domestic_push_report 文档 + * + * @author TW + */ + @Data + public static class SmsReceiveStatus { + + /** + * 接收状态 + * + * 目前仅有 SUCCESS / FAIL,所以使用 Boolean 接收 + */ + @JsonProperty("report_status") + private String reportStatus; + /** + * 接收手机号 + */ + private String mobile; + /** + * 运营商返回的代码,如:"DB:0103" + * + * 由于不同运营商信息不同,此字段仅供参考; + */ + @JsonProperty("error_msg") + private String errorMsg; + /** + * 运营商反馈代码的中文解释 + * + * 默认不推送此字段,如需推送,请联系客服 + */ + @JsonProperty("error_detail") + private String errorDetail; + /** + * 短信编号 + */ + private Long sid; + /** + * 用户自定义 id + * + * 这里我们传递的是 SysSmsLogDO 的日志编号 + */ + private Long uid; + /** + * 用户接收时间 + */ + @JsonProperty("user_receive_time") + @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT) + private Date userReceiveTime; + + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMapping.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMapping.java new file mode 100644 index 0000000..7e89c54 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMapping.java @@ -0,0 +1,59 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.yunpian; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.sms.core.client.SmsCodeMapping; +import com.jojubanking.boot.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; + +import static com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS; +import static com.yunpian.sdk.constant.Code.*; + +/** + * 云片的 SmsCodeMapping 实现类 + *

+ * 参见 https://www.yunpian.com/official/document/sms/zh_CN/returnvalue_common 文档 + * + * @author TW + */ +public class YunpianSmsCodeMapping implements SmsCodeMapping { + + @Override + public ErrorCode apply(String apiCode) { + int code = Integer.parseInt(apiCode); + switch (code) { + case OK: + return SUCCESS; + case ARGUMENT_MISSING: + return SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR; + case BAD_ARGUMENT_FORMAT: + return SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR; + case TPL_NOT_FOUND: + case TPL_NOT_VALID: + return SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID; + case MONEY_NOT_ENOUGH: + return SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH; + case BLACK_WORD: + return SmsFrameworkErrorCodeConstants.SMS_SEND_CONTENT_INVALID; + case DUP_IN_SHORT_TIME: + case TOO_MANY_TIME_IN_5: + case DAY_LIMIT_PER_MOBILE: + case HOUR_LIMIT_PER_MOBILE: + return SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL; + case BLACK_PHONE_FILTER: + return SmsFrameworkErrorCodeConstants.SMS_MOBILE_BLACK; + case SIGN_NOT_MATCH: + case BAD_SIGN_FORMAT: + case SIGN_NOT_VALID: + return SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID; + case BAD_API_KEY: + return SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID; + case API_NOT_ALLOWED: + return SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY; + case IP_NOT_ALLOWED: + return SmsFrameworkErrorCodeConstants.SMS_IP_DENY; + default: + break; + } + return SmsFrameworkErrorCodeConstants.SMS_UNKNOWN; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/enums/SmsChannelEnum.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/enums/SmsChannelEnum.java new file mode 100644 index 0000000..4858399 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/enums/SmsChannelEnum.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.framework.sms.core.enums; + +import cn.hutool.core.util.ArrayUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信渠道枚举 + * + * @author zzf + * @since 2021/1/25 10:56 + */ +@Getter +@AllArgsConstructor +public enum SmsChannelEnum { + + DEBUG_DING_TALK("DEBUG_DING_TALK", "调试(钉钉)"), + YUN_PIAN("YUN_PIAN", "云片"), + ALIYUN("ALIYUN", "阿里云"), + TENCENT("TENCENT", "腾讯云"), +// HUA_WEI("HUA_WEI", "华为云"), + ; + + /** + * 编码 + */ + private final String code; + /** + * 名字 + */ + private final String name; + + public static SmsChannelEnum getByCode(String code) { + return ArrayUtil.firstMatch(o -> o.getCode().equals(code), values()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.java new file mode 100644 index 0000000..0d7d721 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.framework.sms.core.enums; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; + +/** + * 短信框架的错误码枚举 + * + * 短信框架,使用 2-001-000-000 段 + * + * @author TW + */ +public interface SmsFrameworkErrorCodeConstants { + + ErrorCode SMS_UNKNOWN = new ErrorCode(2001000000, "未知错误,需要解析"); + + // ========== 权限 / 限流等相关 2001000100 ========== + + ErrorCode SMS_PERMISSION_DENY = new ErrorCode(2001000100, "没有发送短信的权限"); + // 云片:可以配置 IP 白名单,只有在白名单中才可以发送短信 + ErrorCode SMS_IP_DENY = new ErrorCode(2001000100, "IP 不允许发送短信"); + + // 阿里云:将短信发送频率限制在正常的业务限流范围内。默认短信验证码:使用同一签名,对同一个手机号验证码,支持 1 条 / 分钟,5 条 / 小时,累计 10 条 / 天。 + ErrorCode SMS_SEND_BUSINESS_LIMIT_CONTROL = new ErrorCode(2001000102, "指定手机的发送限流"); + // 阿里云:已经达到您在控制台设置的短信日发送量限额值。在国内消息设置 > 安全设置,修改发送总量阈值。 + ErrorCode SMS_SEND_DAY_LIMIT_CONTROL = new ErrorCode(2001000103, "每天的发送限流"); + + ErrorCode SMS_SEND_CONTENT_INVALID = new ErrorCode(2001000104, "短信内容有敏感词"); + + // 腾讯云:为避免骚扰用户,营销短信只允许在8点到22点发送。 + ErrorCode SMS_SEND_MARKET_LIMIT_CONTROL = new ErrorCode(2001000105, "营销短信发送时间限制"); + + // ========== 模板相关 2001000200 ========== + ErrorCode SMS_TEMPLATE_INVALID = new ErrorCode(2001000200, "短信模板不合法"); // 包括短信模板不存在 + ErrorCode SMS_TEMPLATE_PARAM_ERROR = new ErrorCode(2001000201, "模板参数不正确"); + + // ========== 签名相关 2001000300 ========== + ErrorCode SMS_SIGN_INVALID = new ErrorCode(2001000300, "短信签名不可用"); + + // ========== 账户相关 2001000400 ========== + ErrorCode SMS_ACCOUNT_MONEY_NOT_ENOUGH = new ErrorCode(2001000400, "账户余额不足"); + ErrorCode SMS_ACCOUNT_INVALID = new ErrorCode(2001000401, "apiKey 不存在"); + + // ========== 其它相关 2001000900 开头 ========== + ErrorCode SMS_API_PARAM_ERROR = new ErrorCode(2001000900, "请求参数缺失"); + ErrorCode SMS_MOBILE_INVALID = new ErrorCode(2001000901, "手机格式不正确"); + ErrorCode SMS_MOBILE_BLACK = new ErrorCode(2001000902, "手机号在黑名单中"); + ErrorCode SMS_APP_ID_INVALID = new ErrorCode(2001000903, "SdkAppId不合法"); + + ErrorCode EXCEPTION = new ErrorCode(2001000999, "调用异常"); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java new file mode 100644 index 0000000..98aa14b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/enums/SmsTemplateAuditStatusEnum.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.framework.sms.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信模板的审核状态枚举 + * + * @author TW + */ +@AllArgsConstructor +@Getter +public enum SmsTemplateAuditStatusEnum { + + CHECKING(1), + SUCCESS(2), + FAIL(3); + + private final Integer status; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/property/SmsChannelProperties.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/property/SmsChannelProperties.java new file mode 100644 index 0000000..8b6d29e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/java/com/jojubanking/boot/framework/sms/core/property/SmsChannelProperties.java @@ -0,0 +1,54 @@ +package com.jojubanking.boot.framework.sms.core.property; + +import com.jojubanking.boot.framework.sms.core.enums.SmsChannelEnum; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 短信渠道配置类 + * + * @author zzf + * @since 2021/1/25 17:01 + */ +@Data +@Validated +@Accessors(chain = true) +public class SmsChannelProperties { + + /** + * 渠道编号 + */ + @NotNull(message = "短信渠道 ID 不能为空") + private Long id; + /** + * 短信签名 + */ + @NotEmpty(message = "短信签名不能为空") + private String signature; + /** + * 渠道编码 + * + * 枚举 {@link SmsChannelEnum} + */ + @NotEmpty(message = "渠道编码不能为空") + private String code; + /** + * 短信 API 的账号 + */ + @NotEmpty(message = "短信 API 的账号不能为空") + private String apiKey; + /** + * 短信 API 的密钥 + */ + @NotEmpty(message = "短信 API 的密钥不能为空") + private String apiSecret; + /** + * 短信发送回调 URL + */ + private String callbackUrl; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..f116a12 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.sms.config.JojuSmsAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/test-integration/java/cn/joju/fx/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/test-integration/java/cn/joju/fx/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java new file mode 100644 index 0000000..5968f84 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/test-integration/java/cn/joju/fx/framework/sms/core/client/impl/aliyun/AliyunSmsClientIntegrationTest.java @@ -0,0 +1,55 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.aliyun; + +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.jojubanking.boot.framework.sms.core.client.impl.aliyun.AliyunSmsClient; +import com.jojubanking.boot.framework.sms.core.enums.SmsChannelEnum; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link AliyunSmsClient} 的集成测试 + */ +public class AliyunSmsClientIntegrationTest { + + private static AliyunSmsClient smsClient; + + @BeforeAll + public static void before() { + // 创建配置类 + SmsChannelProperties properties = new SmsChannelProperties(); + properties.setId(1L); + properties.setSignature("Ballcat"); + properties.setCode(SmsChannelEnum.ALIYUN.getCode()); + properties.setApiKey(System.getenv("ALIYUN_ACCESS_KEY")); + properties.setApiSecret(System.getenv("ALIYUN_SECRET_KEY")); + // 创建客户端 + smsClient = new AliyunSmsClient(properties); + smsClient.init(); + } + + @Test + public void testSendSms() { + List> templateParams = new ArrayList<>(); + templateParams.add(new KeyValue<>("code", "1024")); +// templateParams.put("operation", "嘿嘿"); +// SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams); + SmsCommonResult result = smsClient.sendSms(1L, "15601691399", + "SMS_207945135", templateParams); + System.out.println(result); + } + + @Test + public void testGetSmsTemplate() { + String apiTemplateId = "SMS_2079451351"; + SmsCommonResult result = smsClient.getSmsTemplate(apiTemplateId); + System.out.println(result); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/test-integration/java/cn/joju/fx/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/test-integration/java/cn/joju/fx/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java new file mode 100644 index 0000000..e02e5e6 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/test-integration/java/cn/joju/fx/framework/sms/core/client/impl/debug/DebugDingTalkSmsClientIntegrationTest.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.debug; + +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.sms.core.client.impl.debug.DebugDingTalkSmsClient; +import com.jojubanking.boot.framework.sms.core.enums.SmsChannelEnum; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link DebugDingTalkSmsClient} 的集成测试 + */ +public class DebugDingTalkSmsClientIntegrationTest { + + private static DebugDingTalkSmsClient smsClient; + + @BeforeAll + public static void init() { + // 创建配置类 + SmsChannelProperties properties = new SmsChannelProperties(); + properties.setId(1L); + properties.setSignature("芋道"); + properties.setCode(SmsChannelEnum.DEBUG_DING_TALK.getCode()); + properties.setApiKey("696b5d8ead48071237e4aa5861ff08dbadb2b4ded1c688a7b7c9afc615579859"); + properties.setApiSecret("SEC5c4e5ff888bc8a9923ae47f59e7ccd30af1f14d93c55b4e2c9cb094e35aeed67"); + // 创建客户端 + smsClient = new DebugDingTalkSmsClient(properties); + smsClient.init(); + } + + @Test + public void testSendSms() { + List> templateParams = new ArrayList<>(); + templateParams.add(new KeyValue<>("code", "1024")); + templateParams.add(new KeyValue<>("operation", "嘿嘿")); +// SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams); + SmsCommonResult result = smsClient.sendSms(1L, "15601691399", "4383920", templateParams); + System.out.println(result); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/test-integration/java/cn/joju/fx/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/test-integration/java/cn/joju/fx/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java new file mode 100644 index 0000000..94a3ac2 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/test-integration/java/cn/joju/fx/framework/sms/core/client/impl/yunpian/YunpianSmsClientIntegrationTest.java @@ -0,0 +1,53 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.yunpian; + +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.jojubanking.boot.framework.sms.core.client.impl.yunpian.YunpianSmsClient; +import com.jojubanking.boot.framework.sms.core.enums.SmsChannelEnum; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link YunpianSmsClient} 的集成测试 + */ +public class YunpianSmsClientIntegrationTest { + + private static YunpianSmsClient smsClient; + + @BeforeAll + public static void init() { + // 创建配置类 + SmsChannelProperties properties = new SmsChannelProperties(); + properties.setId(1L); + properties.setSignature("芋道"); + properties.setCode(SmsChannelEnum.YUN_PIAN.getCode()); + properties.setApiKey("1555a14277cb8a608cf45a9e6a80d510"); + // 创建客户端 + smsClient = new YunpianSmsClient(properties); + smsClient.init(); + } + + @Test + public void testSendSms() { + List> templateParams = new ArrayList<>(); + templateParams.add(new KeyValue<>("code", "1024")); + templateParams.add(new KeyValue<>("operation", "嘿嘿")); +// SmsResult result = smsClient.send(1L, "15601691399", "4372216", templateParams); + SmsCommonResult result = smsClient.sendSms(1L, "15601691399", "4383920", templateParams); + System.out.println(result); + } + + @Test + public void testGetSmsTemplate() { + String apiTemplateId = "4383920"; + SmsCommonResult result = smsClient.getSmsTemplate(apiTemplateId); + System.out.println(result); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java new file mode 100644 index 0000000..a105a4d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java @@ -0,0 +1,225 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.aliyun; + +import cn.hutool.core.util.ReflectUtil; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.jojubanking.boot.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import com.jojubanking.boot.framework.common.util.collection.MapUtils; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; +import com.aliyuncs.AcsRequest; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateRequest; +import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateResponse; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; +import com.aliyuncs.exceptions.ClientException; +import com.google.common.collect.Lists; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatcher; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.List; +import java.util.function.Function; + +import static com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.when; + +/** + * {@link AliyunSmsClient} 的单元测试 + * + * @author TW + */ +public class AliyunSmsClientTest extends BaseMockitoUnitTest { + + private final SmsChannelProperties properties = new SmsChannelProperties() + .setApiKey(randomString()) // 随机一个 apiKey,避免构建报错 + .setApiSecret(randomString()) // 随机一个 apiSecret,避免构建报错 + .setSignature("TW"); + + @InjectMocks + private final AliyunSmsClient smsClient = new AliyunSmsClient(properties); + + @Mock + private IAcsClient client; + + @Test + public void testDoInit() { + // 准备参数 + // mock 方法 + + // 调用 + smsClient.doInit(); + // 断言 + assertNotSame(client, ReflectUtil.getFieldValue(smsClient, "acsClient")); + } + + @Test + @SuppressWarnings("unchecked") + public void testDoSendSms() throws ClientException { + // 准备参数 + Long sendLogId = randomLongId(); + String mobile = randomString(); + String apiTemplateId = randomString(); + List> templateParams = Lists.newArrayList( + new KeyValue<>("code", 1234), new KeyValue<>("op", "login")); + // mock 方法 + SendSmsResponse response = randomPojo(SendSmsResponse.class, o -> o.setCode("OK")); + when(client.getAcsResponse(argThat((ArgumentMatcher) acsRequest -> { + assertEquals(mobile, acsRequest.getPhoneNumbers()); + assertEquals(properties.getSignature(), acsRequest.getSignName()); + assertEquals(apiTemplateId, acsRequest.getTemplateCode()); + assertEquals(toJsonString(MapUtils.convertMap(templateParams)), acsRequest.getTemplateParam()); + assertEquals(sendLogId.toString(), acsRequest.getOutId()); + return true; + }))).thenReturn(response); + + // 调用 + SmsCommonResult result = smsClient.doSendSms(sendLogId, mobile, + apiTemplateId, templateParams); + // 断言 + assertEquals(response.getCode(), result.getApiCode()); + assertEquals(response.getMessage(), result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertEquals(response.getRequestId(), result.getApiRequestId()); + // 断言结果 + assertEquals(response.getBizId(), result.getData().getSerialNo()); + } + + @Test + public void testDoTParseSmsReceiveStatus() throws Throwable { + // 准备参数 + String text = "[\n" + + " {\n" + + " \"phone_number\" : \"13900000001\",\n" + + " \"send_time\" : \"2017-01-01 11:12:13\",\n" + + " \"report_time\" : \"2017-02-02 22:23:24\",\n" + + " \"success\" : true,\n" + + " \"err_code\" : \"DELIVERED\",\n" + + " \"err_msg\" : \"用户接收成功\",\n" + + " \"sms_size\" : \"1\",\n" + + " \"biz_id\" : \"12345\",\n" + + " \"out_id\" : \"67890\"\n" + + " }\n" + + "]"; + // mock 方法 + + // 调用 + List statuses = smsClient.doParseSmsReceiveStatus(text); + // 断言 + assertEquals(1, statuses.size()); + assertTrue(statuses.get(0).getSuccess()); + assertEquals("DELIVERED", statuses.get(0).getErrorCode()); + assertEquals("用户接收成功", statuses.get(0).getErrorMsg()); + assertEquals("13900000001", statuses.get(0).getMobile()); + assertEquals(DateUtils.buildTime(2017, 2, 2, 22, 23, 24), statuses.get(0).getReceiveTime()); + assertEquals("12345", statuses.get(0).getSerialNo()); + assertEquals(67890L, statuses.get(0).getLogId()); + } + + @Test + public void testDoGetSmsTemplate() throws ClientException { + // 准备参数 + String apiTemplateId = randomString(); + // mock 方法 + QuerySmsTemplateResponse response = randomPojo(QuerySmsTemplateResponse.class, o -> { + o.setCode("OK"); + o.setTemplateStatus(1); // 设置模板通过 + }); + when(client.getAcsResponse(argThat((ArgumentMatcher) acsRequest -> { + assertEquals(apiTemplateId, acsRequest.getTemplateCode()); + return true; + }))).thenReturn(response); + + // 调用 + SmsCommonResult result = smsClient.doGetSmsTemplate(apiTemplateId); + // 断言 + assertEquals(response.getCode(), result.getApiCode()); + assertEquals(response.getMessage(), result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertEquals(response.getRequestId(), result.getApiRequestId()); + // 断言结果 + assertEquals(response.getTemplateCode(), result.getData().getId()); + assertEquals(response.getTemplateContent(), result.getData().getContent()); + assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), result.getData().getAuditStatus()); + assertEquals(response.getReason(), result.getData().getAuditReason()); + } + + @Test + public void testConvertSmsTemplateAuditStatus() { + assertEquals(SmsTemplateAuditStatusEnum.CHECKING.getStatus(), + smsClient.convertSmsTemplateAuditStatus(0)); + assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), + smsClient.convertSmsTemplateAuditStatus(1)); + assertEquals(SmsTemplateAuditStatusEnum.FAIL.getStatus(), + smsClient.convertSmsTemplateAuditStatus(2)); + assertThrows(IllegalArgumentException.class, () -> smsClient.convertSmsTemplateAuditStatus(3), + "未知审核状态(3)"); + } + + @Test + @SuppressWarnings("unchecked") + public void testInvoke_throwable() throws ClientException { + // 准备参数 + QuerySmsTemplateRequest request = new QuerySmsTemplateRequest(); + // mock 方法 + ClientException ex = new ClientException("isv.INVALID_PARAMETERS", "参数不正确", randomString()); + when(client.getAcsResponse(any(AcsRequest.class))).thenThrow(ex); + + // 调用,并断言异常 + SmsCommonResult result = smsClient.invoke(request,null); + // 断言 + assertEquals(ex.getErrCode(), result.getApiCode()); + assertEquals(ex.getErrMsg(), result.getApiMsg()); + Assertions.assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR.getCode(), result.getCode()); + Assertions.assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR.getMsg(), result.getMsg()); + assertEquals(ex.getRequestId(), result.getApiRequestId()); + } + + @Test + public void testInvoke_success() throws ClientException { + // 准备参数 + QuerySmsTemplateRequest request = new QuerySmsTemplateRequest(); + Function responseConsumer = response -> { + SmsTemplateRespDTO data = new SmsTemplateRespDTO(); + data.setId(response.getTemplateCode()).setContent(response.getTemplateContent()); + data.setAuditStatus(SmsTemplateAuditStatusEnum.SUCCESS.getStatus()).setAuditReason(response.getReason()); + return data; + }; + // mock 方法 + QuerySmsTemplateResponse response = randomPojo(QuerySmsTemplateResponse.class, o -> { + o.setCode("OK"); + o.setTemplateStatus(1); // 设置模板通过 + }); + when(client.getAcsResponse(any(AcsRequest.class))).thenReturn(response); + + // 调用 + SmsCommonResult result = smsClient.invoke(request, responseConsumer); + // 断言 + assertEquals(response.getCode(), result.getApiCode()); + assertEquals(response.getMessage(), result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertEquals(response.getRequestId(), result.getApiRequestId()); + // 断言结果 + assertEquals(response.getTemplateCode(), result.getData().getId()); + assertEquals(response.getTemplateContent(), result.getData().getContent()); + assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), result.getData().getAuditStatus()); + assertEquals(response.getReason(), result.getData().getAuditReason()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java new file mode 100644 index 0000000..0a9633c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.aliyun; + +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * {@link AliyunSmsCodeMapping} 的单元测试 + * + * @author TW + */ +public class AliyunSmsCodeMappingTest extends BaseMockitoUnitTest { + + @InjectMocks + private AliyunSmsCodeMapping codeMapping; + + @Test + public void testApply() { + assertEquals(GlobalErrorCodeConstants.SUCCESS, codeMapping.apply("OK")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("MissingAccessKeyId")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("isv.ACCOUNT_NOT_EXISTS")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("isv.ACCOUNT_ABNORMAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_DAY_LIMIT_CONTROL, codeMapping.apply("isv.DAY_LIMIT_CONTROL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_CONTENT_INVALID, codeMapping.apply("isv.SMS_CONTENT_ILLEGAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SMS_SIGN_ILLEGAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SIGN_NAME_ILLEGAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply("isp.RAM_PERMISSION_DENY")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply("isv.OUT_OF_SERVICE")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply("isv.AMOUNT_NOT_ENOUGH")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply("isv.SMS_TEMPLATE_ILLEGAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SMS_SIGNATURE_ILLEGAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply("isv.INVALID_PARAMETERS")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply("isv.INVALID_JSON_PARAM")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_MOBILE_INVALID, codeMapping.apply("isv.MOBILE_NUMBER_ILLEGAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR, codeMapping.apply("isv.TEMPLATE_MISSING_PARAMETERS")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply("isv.BUSINESS_LIMIT_CONTROL")); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClientTest.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClientTest.java new file mode 100644 index 0000000..a959380 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClientTest.java @@ -0,0 +1,222 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.tencent; + +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.jojubanking.boot.framework.common.util.collection.MapUtils; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.jojubanking.boot.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import com.google.common.collect.Lists; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.DescribeSmsTemplateListResponse; +import com.tencentcloudapi.sms.v20210111.models.DescribeTemplateListStatus; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; +import com.tencentcloudapi.sms.v20210111.models.SendStatus; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.ArrayList; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.when; + +/** + * {@link TencentSmsClient} 的单元测试 + * + * @author shiwp + */ +public class TencentSmsClientTest extends BaseMockitoUnitTest { + + private final SmsChannelProperties properties = new SmsChannelProperties() + .setApiKey(randomString() + " " + randomString()) // 随机一个 apiKey,避免构建报错 + .setApiSecret(randomString()) // 随机一个 apiSecret,避免构建报错 + .setSignature("TW"); + + @InjectMocks + private TencentSmsClient smsClient = new TencentSmsClient(properties); + + @Mock + private SmsClient client; + + @Test + public void testDoInit() { + // 准备参数 + // mock 方法 + + // 调用 + smsClient.doInit(); + // 断言 + assertNotSame(client, ReflectUtil.getFieldValue(smsClient, "client")); + } + + @Test + public void testRefresh() { + // 准备参数 + SmsChannelProperties p = new SmsChannelProperties() + .setApiKey(randomString() + " " + randomString()) // 随机一个 apiKey,避免构建报错 + .setApiSecret(randomString()) // 随机一个 apiSecret,避免构建报错 + .setSignature("TW"); + // 调用 + smsClient.refresh(p); + // 断言 + assertNotSame(client, ReflectUtil.getFieldValue(smsClient, "client")); + } + + @Test + public void testDoSendSms() throws Throwable { + // 准备参数 + Long sendLogId = randomLongId(); + String mobile = randomString(); + String apiTemplateId = randomString(); + List> templateParams = Lists.newArrayList( + new KeyValue<>("1", 1234), new KeyValue<>("2", "login")); + String requestId = randomString(); + String serialNo = randomString(); + // mock 方法 + SendSmsResponse response = randomPojo(SendSmsResponse.class, o -> { + o.setRequestId(requestId); + SendStatus[] sendStatuses = new SendStatus[1]; + o.setSendStatusSet(sendStatuses); + SendStatus sendStatus = new SendStatus(); + sendStatuses[0] = sendStatus; + sendStatus.setCode(TencentSmsClient.API_SUCCESS_CODE); + sendStatus.setMessage("send success"); + sendStatus.setSerialNo(serialNo); + }); + when(client.SendSms(argThat(request -> { + assertEquals(mobile, request.getPhoneNumberSet()[0]); + assertEquals(properties.getSignature(), request.getSignName()); + assertEquals(apiTemplateId, request.getTemplateId()); + assertEquals(toJsonString(ArrayUtils.toArray(new ArrayList<>(MapUtils.convertMap(templateParams).values()), String::valueOf)), + toJsonString(request.getTemplateParamSet())); + assertEquals(sendLogId, ReflectUtil.getFieldValue(JsonUtils.parseObject(request.getSessionContext(), TencentSmsClient.SessionContext.class), "logId")); + return true; + }))).thenReturn(response); + + // 调用 + SmsCommonResult result = smsClient.doSendSms(sendLogId, mobile, + apiTemplateId, templateParams); + // 断言 + assertEquals(response.getSendStatusSet()[0].getCode(), result.getApiCode()); + assertEquals(response.getSendStatusSet()[0].getMessage(), result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertEquals(response.getRequestId(), result.getApiRequestId()); + // 断言结果 + assertEquals(response.getSendStatusSet()[0].getSerialNo(), result.getData().getSerialNo()); + } + + @Test + public void testDoTParseSmsReceiveStatus() throws Throwable { + // 准备参数 + String text = "[\n" + + " {\n" + + " \"user_receive_time\": \"2015-10-17 08:03:04\",\n" + + " \"nationcode\": \"86\",\n" + + " \"mobile\": \"13900000001\",\n" + + " \"report_status\": \"SUCCESS\",\n" + + " \"errmsg\": \"DELIVRD\",\n" + + " \"description\": \"用户短信送达成功\",\n" + + " \"sid\": \"12345\",\n" + + " \"ext\": {\"logId\":\"67890\"}\n" + + " }\n" + + "]"; + // mock 方法 + + // 调用 + List statuses = smsClient.doParseSmsReceiveStatus(text); + // 断言 + assertEquals(1, statuses.size()); + assertTrue(statuses.get(0).getSuccess()); + assertEquals("DELIVRD", statuses.get(0).getErrorCode()); + assertEquals("用户短信送达成功", statuses.get(0).getErrorMsg()); + assertEquals("13900000001", statuses.get(0).getMobile()); + assertEquals(DateUtils.buildTime(2015, 10, 17, 8, 3, 4), statuses.get(0).getReceiveTime()); + assertEquals("12345", statuses.get(0).getSerialNo()); + assertEquals(67890L, statuses.get(0).getLogId()); + } + + @Test + public void testDoGetSmsTemplate() throws Throwable { + // 准备参数 + Long apiTemplateId = randomLongId(); + String requestId = randomString(); + + // mock 方法 + DescribeSmsTemplateListResponse response = randomPojo(DescribeSmsTemplateListResponse.class, o -> { + DescribeTemplateListStatus[] describeTemplateListStatuses = new DescribeTemplateListStatus[1]; + DescribeTemplateListStatus templateStatus = new DescribeTemplateListStatus(); + templateStatus.setTemplateId(apiTemplateId); + templateStatus.setStatusCode(0L);// 设置模板通过 + describeTemplateListStatuses[0] = templateStatus; + o.setDescribeTemplateStatusSet(describeTemplateListStatuses); + o.setRequestId(requestId); + }); + when(client.DescribeSmsTemplateList(argThat(request -> { + assertEquals(apiTemplateId, request.getTemplateIdSet()[0]); + return true; + }))).thenReturn(response); + + // 调用 + SmsCommonResult result = smsClient.doGetSmsTemplate(apiTemplateId.toString()); + // 断言 + assertEquals(TencentSmsClient.API_SUCCESS_CODE, result.getApiCode()); + assertNull(result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertEquals(response.getRequestId(), result.getApiRequestId()); + // 断言结果 + assertEquals(response.getDescribeTemplateStatusSet()[0].getTemplateId().toString(), result.getData().getId()); + assertEquals(response.getDescribeTemplateStatusSet()[0].getTemplateContent(), result.getData().getContent()); + assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), result.getData().getAuditStatus()); + assertEquals(response.getDescribeTemplateStatusSet()[0].getReviewReply(), result.getData().getAuditReason()); + } + + @Test + public void testConvertSuccessTemplateStatus() { + testTemplateStatus(SmsTemplateAuditStatusEnum.SUCCESS, 0L); + } + + @Test + public void testConvertCheckingTemplateStatus() { + testTemplateStatus(SmsTemplateAuditStatusEnum.CHECKING, 1L); + } + + @Test + public void testConvertFailTemplateStatus() { + testTemplateStatus(SmsTemplateAuditStatusEnum.FAIL, -1L); + } + + @Test + public void testConvertUnknownTemplateStatus() { + DescribeTemplateListStatus templateStatus = new DescribeTemplateListStatus(); + templateStatus.setStatusCode(3L); + Long templateId = randomLongId(); + // 调用,并断言结果 + assertThrows(IllegalStateException.class, () -> smsClient.convertTemplateStatusDTO(templateStatus), + StrUtil.format("不能解析短信模版审核状态[3],模版id[{}]", templateId)); + } + + private void testTemplateStatus(SmsTemplateAuditStatusEnum expected, Long value) { + DescribeTemplateListStatus templateStatus = new DescribeTemplateListStatus(); + templateStatus.setStatusCode(value); + SmsTemplateRespDTO result = smsClient.convertTemplateStatusDTO(templateStatus); + assertEquals(expected.getStatus(), result.getAuditStatus()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsCodeMappingTest.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsCodeMappingTest.java new file mode 100644 index 0000000..9d464f9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsCodeMappingTest.java @@ -0,0 +1,50 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.tencent; + +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * {@link TencentSmsCodeMapping} 的单元测试 + * + * @author : shiwp + */ +public class TencentSmsCodeMappingTest extends BaseMockitoUnitTest { + + @InjectMocks + private TencentSmsCodeMapping codeMapping; + + @Test + public void testApply() { + assertEquals(GlobalErrorCodeConstants.SUCCESS, codeMapping.apply(TencentSmsClient.API_SUCCESS_CODE)); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_CONTENT_INVALID, codeMapping.apply("FailedOperation.ContainSensitiveWord")); + assertEquals(GlobalErrorCodeConstants.BAD_REQUEST, codeMapping.apply("FailedOperation.JsonParseFail")); + assertEquals(GlobalErrorCodeConstants.BAD_REQUEST, codeMapping.apply("MissingParameter.EmptyPhoneNumberSet")); + assertEquals(GlobalErrorCodeConstants.BAD_REQUEST, codeMapping.apply("LimitExceeded.PhoneNumberCountLimit")); + assertEquals(GlobalErrorCodeConstants.BAD_REQUEST, codeMapping.apply("FailedOperation.FailResolvePacket")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply("FailedOperation.InsufficientBalanceInSmsPackage")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_MARKET_LIMIT_CONTROL, codeMapping.apply("FailedOperation.MarketingSendTimeConstraint")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_MOBILE_BLACK, codeMapping.apply("FailedOperation.PhoneNumberInBlacklist")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("FailedOperation.SignatureIncorrectOrUnapproved")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply("FailedOperation.MissingTemplateToModify")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply("FailedOperation.TemplateIncorrectOrUnapproved")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_MOBILE_INVALID, codeMapping.apply("InvalidParameterValue.IncorrectPhoneNumber")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_APP_ID_INVALID, codeMapping.apply("InvalidParameterValue.SdkAppIdNotExist")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR, codeMapping.apply("InvalidParameterValue.TemplateParameterLengthLimit")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR, codeMapping.apply("InvalidParameterValue.TemplateParameterFormatError")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_DAY_LIMIT_CONTROL, codeMapping.apply("LimitExceeded.PhoneNumberDailyLimit")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply("LimitExceeded.PhoneNumberThirtySecondLimit")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply("LimitExceeded.PhoneNumberOneHourLimit")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply("UnauthorizedOperation.RequestPermissionDeny")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply("FailedOperation.ForbidAddMarketingTemplates")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply("FailedOperation.NotEnterpriseCertification")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply("UnauthorizedOperation.IndividualUserMarketingSmsPermissionDeny")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_IP_DENY, codeMapping.apply("UnauthorizedOperation.RequestIpNotInWhitelist")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("AuthFailure.SecretIdNotFound")); + } + +} \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java new file mode 100644 index 0000000..037c5ec --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java @@ -0,0 +1,202 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.yunpian; + +import cn.hutool.core.util.ReflectUtil; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.jojubanking.boot.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.google.common.collect.Lists; +import com.yunpian.sdk.YunpianClient; +import com.yunpian.sdk.api.SmsApi; +import com.yunpian.sdk.api.TplApi; +import com.yunpian.sdk.constant.YunpianConstant; +import com.yunpian.sdk.model.Result; +import com.yunpian.sdk.model.SmsSingleSend; +import com.yunpian.sdk.model.Template; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Supplier; + +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static com.yunpian.sdk.constant.Code.OK; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * 对 {@link YunpianSmsClient} 的单元测试 + * + * @author TW + */ +public class YunpianSmsClientTest extends BaseMockitoUnitTest { + + private final SmsChannelProperties properties = new SmsChannelProperties() + .setApiKey(randomString()); // 随机一个 apiKey,避免构建报错 + + @InjectMocks + private final YunpianSmsClient smsClient = new YunpianSmsClient(properties); + + @Mock + private YunpianClient client; + + @Test + public void testDoInit() { + // 准备参数 + // mock 方法 + + // 调用 + smsClient.doInit(); + // 断言 + assertNotEquals(client, ReflectUtil.getFieldValue(smsClient, "client")); + verify(client, times(1)).close(); + } + + @Test + @SuppressWarnings("unchecked") + public void testDoSendSms() throws Throwable { + // 准备参数 + Long sendLogId = randomLongId(); + String mobile = randomString(); + String apiTemplateId = randomString(); + List> templateParams = Lists.newArrayList( + new KeyValue<>("code", 1234), new KeyValue<>("op", "login")); + // mock sms 方法 + SmsApi smsApi = mock(SmsApi.class); + when(client.sms()).thenReturn(smsApi); + // mock tpl_single_send 方法 + Map request = new HashMap<>(); + request.put(YunpianConstant.MOBILE, mobile); + request.put(YunpianConstant.TPL_ID, apiTemplateId); + request.put(YunpianConstant.TPL_VALUE, "#code#=1234&#op#=login"); + request.put(YunpianConstant.UID, String.valueOf(sendLogId)); + request.put(YunpianConstant.CALLBACK_URL, properties.getCallbackUrl()); + Result responseResult = randomPojo(Result.class, SmsSingleSend.class, + o -> o.setCode(OK)); // API 发送成功的 code +// when(smsApi.tpl_single_send(eq(request))).thenReturn(responseResult); + + // 调用 +// SmsCommonResult result = smsClient.doSendSms(sendLogId, mobile, +// apiTemplateId, templateParams); + // 断言 +// assertEquals(String.valueOf(responseResult.getCode()), result.getApiCode()); +// assertEquals(responseResult.getMsg() + " => " + responseResult.getDetail(), result.getApiMsg()); +// assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); +// assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); +// assertNull(result.getApiRequestId()); +// // 断言结果 +// assertEquals(String.valueOf(responseResult.getData().getSid()), result.getData().getSerialNo()); + } + + @Test + public void testDoParseSmsReceiveStatus() throws Throwable { + // 准备参数 + String text = "[{\"sid\":9527,\"uid\":1024,\"user_receive_time\":\"2014-03-17 22:55:21\",\"error_msg\":\"\",\"mobile\":\"15205201314\",\"report_status\":\"SUCCESS\"}]"; + // mock 方法 + + // 调用 + + // 断言 + // 调用 + List statuses = smsClient.doParseSmsReceiveStatus(text); + // 断言 + assertEquals(1, statuses.size()); + assertTrue(statuses.get(0).getSuccess()); + assertEquals("", statuses.get(0).getErrorCode()); + assertNull(statuses.get(0).getErrorMsg()); + assertEquals("15205201314", statuses.get(0).getMobile()); + assertEquals(DateUtils.buildTime(2014, 3, 17, 22, 55, 21), statuses.get(0).getReceiveTime()); + assertEquals("9527", statuses.get(0).getSerialNo()); + assertEquals(1024L, statuses.get(0).getLogId()); + } + + @Test + @SuppressWarnings("unchecked") + public void testDoGetSmsTemplate() throws Throwable { + // 准备参数 + String apiTemplateId = randomString(); + // mock tpl 方法 + TplApi tplApi = mock(TplApi.class); + when(client.tpl()).thenReturn(tplApi); + // mock get 方法 + Map request = new HashMap<>(); + request.put(YunpianConstant.APIKEY, properties.getApiKey()); + request.put(YunpianConstant.TPL_ID, apiTemplateId); + Result> responseResult = randomPojo(Result.class, List.class, o -> { + o.setCode(OK); // API 发送成功的 code + o.setData(randomPojoList(Template.class, t -> t.setCheck_status("SUCCESS"))); + }); + when(tplApi.get(eq(request))).thenReturn(responseResult); + + // 调用 + SmsCommonResult result = smsClient.doGetSmsTemplate(apiTemplateId); + // 断言 + assertEquals(String.valueOf(responseResult.getCode()), result.getApiCode()); + assertEquals(responseResult.getMsg() + " => " + responseResult.getDetail(), result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertNull(result.getApiRequestId()); + // 断言结果 + Template template = responseResult.getData().get(0); + assertEquals(template.getTpl_id().toString(), result.getData().getId()); + assertEquals(template.getTpl_content(), result.getData().getContent()); + assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), result.getData().getAuditStatus()); + assertEquals(template.getReason(), result.getData().getAuditReason()); + } + + @Test + public void testConvertSmsTemplateAuditStatus() { + assertEquals(SmsTemplateAuditStatusEnum.CHECKING.getStatus(), + smsClient.convertSmsTemplateAuditStatus("CHECKING")); + assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), + smsClient.convertSmsTemplateAuditStatus("SUCCESS")); + assertEquals(SmsTemplateAuditStatusEnum.FAIL.getStatus(), + smsClient.convertSmsTemplateAuditStatus("FAIL")); + assertThrows(IllegalArgumentException.class, () -> smsClient.convertSmsTemplateAuditStatus("test"), + "未知审核状态(test)"); + } + + @Test + public void testInvoke_throwable() { + // 准备参数 + Supplier> requestConsumer = + () -> new Result<>().setThrowable(new NullPointerException()); + // mock 方法 + + // 调用,并断言异常 + assertThrows(NullPointerException.class, + () -> smsClient.invoke(requestConsumer, null)); + } + + @Test + @SuppressWarnings("unchecked") + public void testInvoke_success() throws Throwable { + // 准备参数 + Result responseResult = randomPojo(Result.class, SmsSingleSend.class, o -> o.setCode(OK)); + Supplier> requestConsumer = () -> responseResult; + Function responseConsumer = + smsSingleSend -> new SmsSendRespDTO().setSerialNo(String.valueOf(responseResult.getData().getSid())); + // mock 方法 + + // 调用 + SmsCommonResult result = smsClient.invoke(requestConsumer, responseConsumer); + // 断言 + assertEquals(String.valueOf(responseResult.getCode()), result.getApiCode()); + assertEquals(responseResult.getMsg() + " => " + responseResult.getDetail(), result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertNull(result.getApiRequestId()); + assertEquals(String.valueOf(responseResult.getData().getSid()), result.getData().getSerialNo()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java b/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java new file mode 100644 index 0000000..577a967 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/src/test/java/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.framework.sms.core.client.impl.yunpian; + +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; + +import static com.yunpian.sdk.constant.Code.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * {@link YunpianSmsCodeMapping} 的单元测试 + * + * @author TW + */ +class YunpianSmsCodeMappingTest extends BaseMockitoUnitTest { + + @InjectMocks + private YunpianSmsCodeMapping codeMapping; + + @Test + public void testApply() { + assertEquals(GlobalErrorCodeConstants.SUCCESS, codeMapping.apply(String.valueOf(OK))); + Assertions.assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply(String.valueOf(ARGUMENT_MISSING))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR, codeMapping.apply(String.valueOf(BAD_ARGUMENT_FORMAT))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply(String.valueOf(MONEY_NOT_ENOUGH))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply(String.valueOf(TPL_NOT_FOUND))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply(String.valueOf(TPL_NOT_VALID))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(DUP_IN_SHORT_TIME))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(TOO_MANY_TIME_IN_5))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(DAY_LIMIT_PER_MOBILE))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(HOUR_LIMIT_PER_MOBILE))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_MOBILE_BLACK, codeMapping.apply(String.valueOf(BLACK_PHONE_FILTER))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(SIGN_NOT_MATCH))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(SIGN_NOT_VALID))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(BAD_SIGN_FORMAT))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply(String.valueOf(BAD_API_KEY))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply(String.valueOf(API_NOT_ALLOWED))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_IP_DENY, codeMapping.apply(String.valueOf(IP_NOT_ALLOWED))); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..f116a12 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.sms.config.JojuSmsAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/config/JojuSmsAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/config/JojuSmsAutoConfiguration.class new file mode 100644 index 0000000..ea6c514 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/config/JojuSmsAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/SmsClient.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/SmsClient.class new file mode 100644 index 0000000..2b4942c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/SmsClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/SmsClientFactory.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/SmsClientFactory.class new file mode 100644 index 0000000..f722b97 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/SmsClientFactory.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/SmsCodeMapping.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/SmsCodeMapping.class new file mode 100644 index 0000000..ac9f804 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/SmsCodeMapping.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/SmsCommonResult.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/SmsCommonResult.class new file mode 100644 index 0000000..2f4ccfd Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/SmsCommonResult.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/dto/SmsReceiveRespDTO.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/dto/SmsReceiveRespDTO.class new file mode 100644 index 0000000..efe8453 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/dto/SmsReceiveRespDTO.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/dto/SmsSendRespDTO.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/dto/SmsSendRespDTO.class new file mode 100644 index 0000000..2c3c35a Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/dto/SmsSendRespDTO.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/dto/SmsTemplateRespDTO.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/dto/SmsTemplateRespDTO.class new file mode 100644 index 0000000..0d46d69 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/dto/SmsTemplateRespDTO.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/AbstractSmsClient.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/AbstractSmsClient.class new file mode 100644 index 0000000..2158532 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/AbstractSmsClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/SmsClientFactoryImpl$1.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/SmsClientFactoryImpl$1.class new file mode 100644 index 0000000..fc0fae8 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/SmsClientFactoryImpl$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/SmsClientFactoryImpl.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/SmsClientFactoryImpl.class new file mode 100644 index 0000000..9ef0f8e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/SmsClientFactoryImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClient$SmsReceiveStatus.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClient$SmsReceiveStatus.class new file mode 100644 index 0000000..bd04c81 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClient$SmsReceiveStatus.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClient.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClient.class new file mode 100644 index 0000000..6404a5e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMapping.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMapping.class new file mode 100644 index 0000000..0084dc0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMapping.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/debug/DebugDingTalkCodeMapping.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/debug/DebugDingTalkCodeMapping.class new file mode 100644 index 0000000..f891cda Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/debug/DebugDingTalkCodeMapping.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/debug/DebugDingTalkSmsClient.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/debug/DebugDingTalkSmsClient.class new file mode 100644 index 0000000..3714d97 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/debug/DebugDingTalkSmsClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsChannelProperties.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsChannelProperties.class new file mode 100644 index 0000000..22ff318 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsChannelProperties.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient$SdkFunction.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient$SdkFunction.class new file mode 100644 index 0000000..9b04206 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient$SdkFunction.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient$SessionContext.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient$SessionContext.class new file mode 100644 index 0000000..e1dfb23 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient$SessionContext.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient$SmsReceiveStatus.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient$SmsReceiveStatus.class new file mode 100644 index 0000000..6fab743 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient$SmsReceiveStatus.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient.class new file mode 100644 index 0000000..6e42a17 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsCodeMapping.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsCodeMapping.class new file mode 100644 index 0000000..4218f37 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsCodeMapping.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClient$SmsReceiveStatus.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClient$SmsReceiveStatus.class new file mode 100644 index 0000000..ac2a3e8 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClient$SmsReceiveStatus.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClient.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClient.class new file mode 100644 index 0000000..f94cc4b Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMapping.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMapping.class new file mode 100644 index 0000000..df44cef Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMapping.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/enums/SmsChannelEnum.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/enums/SmsChannelEnum.class new file mode 100644 index 0000000..af82cd0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/enums/SmsChannelEnum.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.class new file mode 100644 index 0000000..320bee2 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/enums/SmsFrameworkErrorCodeConstants.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/enums/SmsTemplateAuditStatusEnum.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/enums/SmsTemplateAuditStatusEnum.class new file mode 100644 index 0000000..1403ff0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/enums/SmsTemplateAuditStatusEnum.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/property/SmsChannelProperties.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/property/SmsChannelProperties.class new file mode 100644 index 0000000..ba2c4a1 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/classes/com/jojubanking/boot/framework/sms/core/property/SmsChannelProperties.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/joju-spring-boot-starter-biz-sms-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-biz-sms/target/joju-spring-boot-starter-biz-sms-2.0.0-beta.jar new file mode 100644 index 0000000..2e3c84f Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/joju-spring-boot-starter-biz-sms-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-archiver/pom.properties new file mode 100644 index 0000000..6dcfb7f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:32 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-biz-sms diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..bed9c4f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,29 @@ +com\jojubanking\boot\framework\sms\config\JojuSmsAutoConfiguration.class +com\jojubanking\boot\framework\sms\core\enums\SmsFrameworkErrorCodeConstants.class +com\jojubanking\boot\framework\sms\core\client\impl\aliyun\AliyunSmsClient.class +com\jojubanking\boot\framework\sms\core\client\SmsCommonResult.class +com\jojubanking\boot\framework\sms\core\client\impl\debug\DebugDingTalkCodeMapping.class +com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsClient$SessionContext.class +com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsClient.class +com\jojubanking\boot\framework\sms\core\client\impl\aliyun\AliyunSmsClient$SmsReceiveStatus.class +com\jojubanking\boot\framework\sms\core\client\impl\aliyun\AliyunSmsCodeMapping.class +com\jojubanking\boot\framework\sms\core\client\impl\SmsClientFactoryImpl$1.class +com\jojubanking\boot\framework\sms\core\client\dto\SmsReceiveRespDTO.class +com\jojubanking\boot\framework\sms\core\client\impl\AbstractSmsClient.class +com\jojubanking\boot\framework\sms\core\client\dto\SmsTemplateRespDTO.class +com\jojubanking\boot\framework\sms\core\client\impl\yunpian\YunpianSmsCodeMapping.class +com\jojubanking\boot\framework\sms\core\client\SmsClient.class +com\jojubanking\boot\framework\sms\core\enums\SmsTemplateAuditStatusEnum.class +com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsClient$SdkFunction.class +com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsChannelProperties.class +com\jojubanking\boot\framework\sms\core\property\SmsChannelProperties.class +com\jojubanking\boot\framework\sms\core\enums\SmsChannelEnum.class +com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsClient$SmsReceiveStatus.class +com\jojubanking\boot\framework\sms\core\client\impl\yunpian\YunpianSmsClient$SmsReceiveStatus.class +com\jojubanking\boot\framework\sms\core\client\dto\SmsSendRespDTO.class +com\jojubanking\boot\framework\sms\core\client\SmsCodeMapping.class +com\jojubanking\boot\framework\sms\core\client\SmsClientFactory.class +com\jojubanking\boot\framework\sms\core\client\impl\yunpian\YunpianSmsClient.class +com\jojubanking\boot\framework\sms\core\client\impl\SmsClientFactoryImpl.class +com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsCodeMapping.class +com\jojubanking\boot\framework\sms\core\client\impl\debug\DebugDingTalkSmsClient.class diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..66fab49 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,23 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsChannelProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsCodeMapping.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\impl\yunpian\YunpianSmsCodeMapping.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\impl\aliyun\AliyunSmsClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\SmsCodeMapping.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\SmsCommonResult.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\impl\debug\DebugDingTalkCodeMapping.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\impl\SmsClientFactoryImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\dto\SmsSendRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\impl\AbstractSmsClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\enums\SmsChannelEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\property\SmsChannelProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\enums\SmsTemplateAuditStatusEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\impl\aliyun\AliyunSmsCodeMapping.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\dto\SmsTemplateRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\enums\SmsFrameworkErrorCodeConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\impl\debug\DebugDingTalkSmsClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\impl\yunpian\YunpianSmsClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\SmsClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\SmsClientFactory.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\config\JojuSmsAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\main\java\com\jojubanking\boot\framework\sms\core\client\dto\SmsReceiveRespDTO.java diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..b671341 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1,6 @@ +com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsCodeMappingTest.class +com\jojubanking\boot\framework\sms\core\client\impl\aliyun\AliyunSmsCodeMappingTest.class +com\jojubanking\boot\framework\sms\core\client\impl\aliyun\AliyunSmsClientTest.class +com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsClientTest.class +com\jojubanking\boot\framework\sms\core\client\impl\yunpian\YunpianSmsClientTest.class +com\jojubanking\boot\framework\sms\core\client\impl\yunpian\YunpianSmsCodeMappingTest.class diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..ff20c25 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-sms/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1,6 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\test\java\com\jojubanking\boot\framework\sms\core\client\impl\aliyun\AliyunSmsClientTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\test\java\com\jojubanking\boot\framework\sms\core\client\impl\yunpian\YunpianSmsClientTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\test\java\com\jojubanking\boot\framework\sms\core\client\impl\aliyun\AliyunSmsCodeMappingTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\test\java\com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsCodeMappingTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\test\java\com\jojubanking\boot\framework\sms\core\client\impl\tencent\TencentSmsClientTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-sms\src\test\java\com\jojubanking\boot\framework\sms\core\client\impl\yunpian\YunpianSmsCodeMappingTest.java diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.class new file mode 100644 index 0000000..b938244 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.class new file mode 100644 index 0000000..b9c03fb Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClientTest.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClientTest.class new file mode 100644 index 0000000..0ba5a5d Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsClientTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsCodeMappingTest.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsCodeMappingTest.class new file mode 100644 index 0000000..7d50a84 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/tencent/TencentSmsCodeMappingTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.class new file mode 100644 index 0000000..de0a9e5 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.class b/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.class new file mode 100644 index 0000000..0191034 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-sms/target/test-classes/com/jojubanking/boot/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-social/joju-spring-boot-starter-biz-social.iml b/joju-framework/joju-spring-boot-starter-biz-social/joju-spring-boot-starter-biz-social.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-social/joju-spring-boot-starter-biz-social.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-biz-social/pom.xml b/joju-framework/joju-spring-boot-starter-biz-social/pom.xml new file mode 100644 index 0000000..a05a494 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-social/pom.xml @@ -0,0 +1,58 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + jar + 4.0.0 + + joju-spring-boot-starter-biz-social + ${project.artifactId} + + + + com.jojubanking.boot + joju-common + + + + org.springframework.boot + spring-boot-starter-aop + + + + com.jojubanking.boot + joju-spring-boot-starter-web + ${revision} + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + com.xkcoding.justauth + justauth-spring-boot-starter + + + cn.hutool + hutool-core + + + + + com.jojubanking.boot + joju-spring-boot-starter-redis + ${revision} + + + + + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-biz-social/src/main/java/com/jojubanking/boot/framework/social/config/JojuSocialAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-biz-social/src/main/java/com/jojubanking/boot/framework/social/config/JojuSocialAutoConfiguration.java new file mode 100644 index 0000000..5ca3b07 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-social/src/main/java/com/jojubanking/boot/framework/social/config/JojuSocialAutoConfiguration.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.framework.social.config; + +import com.jojubanking.boot.framework.social.core.JojuAuthRequestFactory; +import com.xkcoding.http.HttpUtil; +import com.xkcoding.http.support.hutool.HutoolImpl; +import com.xkcoding.justauth.autoconfigure.JustAuthProperties; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.cache.AuthStateCache; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +/** + * 社交自动装配类 + * + * @author timfruit + * @date 2021-10-30 + */ +@Slf4j +@Configuration +@EnableConfigurationProperties(JustAuthProperties.class) +public class JojuSocialAutoConfiguration { + + @Bean + @Primary + @ConditionalOnProperty(prefix = "justauth", value = "enabled", havingValue = "true", matchIfMissing = true) + public JojuAuthRequestFactory jojuAuthRequestFactory(JustAuthProperties properties, AuthStateCache authStateCache) { + // 需要修改 HttpUtil 使用的实现,避免类报错 + HttpUtil.setHttp(new HutoolImpl()); + // 创建 JojuAuthRequestFactory + return new JojuAuthRequestFactory(properties, authStateCache); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-social/src/main/java/com/jojubanking/boot/framework/social/core/JojuAuthRequestFactory.java b/joju-framework/joju-spring-boot-starter-biz-social/src/main/java/com/jojubanking/boot/framework/social/core/JojuAuthRequestFactory.java new file mode 100644 index 0000000..28353ed --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-social/src/main/java/com/jojubanking/boot/framework/social/core/JojuAuthRequestFactory.java @@ -0,0 +1,84 @@ +package com.jojubanking.boot.framework.social.core; + +import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ReflectUtil; +import com.jojubanking.boot.framework.social.core.enums.AuthExtendSource; +import com.jojubanking.boot.framework.social.core.request.AuthWeChatMiniAppRequest; +import com.xkcoding.justauth.AuthRequestFactory; +import com.xkcoding.justauth.autoconfigure.JustAuthProperties; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthSource; +import me.zhyd.oauth.request.AuthRequest; + +import java.lang.reflect.Method; + +/** + * 第三方授权拓展 request 工厂类 + * 为使得拓展配置 {@link AuthConfig} 和默认配置齐平,所以自定义本工厂类 + * + * @author timfruit + * @date 2021-10-31 + */ +public class JojuAuthRequestFactory extends AuthRequestFactory { + + protected JustAuthProperties properties; + protected AuthStateCache authStateCache; + + /** + * 由于父类 configureHttpConfig 方法是 private 修饰,所以获取后,进行反射调用 + */ + private final Method configureHttpConfigMethod = ReflectUtil.getMethod(AuthRequestFactory.class, + "configureHttpConfig", String.class, AuthConfig.class, JustAuthProperties.JustAuthHttpConfig.class); + + public JojuAuthRequestFactory(JustAuthProperties properties, AuthStateCache authStateCache) { + super(properties, authStateCache); + this.properties = properties; + this.authStateCache = authStateCache; + } + + /** + * 返回 AuthRequest 对象 + * + * @param source {@link AuthSource} + * @return {@link AuthRequest} + */ + public AuthRequest get(String source) { + // 先尝试获取自定义扩展的 + AuthRequest authRequest = getExtendRequest(source); + // 找不到,使用默认拓展 + if (authRequest == null) { + authRequest = super.get(source); + } + return authRequest; + } + + protected AuthRequest getExtendRequest(String source) { + AuthExtendSource authExtendSource; + try { + authExtendSource = EnumUtil.fromString(AuthExtendSource.class, source.toUpperCase()); + } catch (IllegalArgumentException e) { + // 无自定义匹配 + return null; + } + + // 拓展配置和默认配置齐平,properties 放在一起 + AuthConfig config = properties.getType().get(authExtendSource.name()); + // 找不到对应关系,直接返回空 + if (config == null) { + return null; + } + // 反射调用,配置 http config + ReflectUtil.invoke(this, configureHttpConfigMethod, authExtendSource.name(), config, properties.getHttpConfig()); + + // 获得拓展的 Request + // noinspection SwitchStatementWithTooFewBranches + switch (authExtendSource) { + case WECHAT_MINI_APP: + return new AuthWeChatMiniAppRequest(config, authStateCache); + default: + return null; + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-social/src/main/java/com/jojubanking/boot/framework/social/core/enums/AuthExtendSource.java b/joju-framework/joju-spring-boot-starter-biz-social/src/main/java/com/jojubanking/boot/framework/social/core/enums/AuthExtendSource.java new file mode 100644 index 0000000..642c88f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-social/src/main/java/com/jojubanking/boot/framework/social/core/enums/AuthExtendSource.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.framework.social.core.enums; + +import me.zhyd.oauth.config.AuthSource; + +/** + * 拓展 JustAuth 各 api 需要的 url, 用枚举类分平台类型管理 + * + * 默认配置 {@link me.zhyd.oauth.config.AuthDefaultSource} + * + * @author timfruit + */ +public enum AuthExtendSource implements AuthSource { + + /** + * 微信小程序授权登录 + */ + WECHAT_MINI_APP { + + @Override + public String authorize() { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 文档 + throw new UnsupportedOperationException("不支持获取授权 url,请使用小程序内置函数 wx.login() 登录获取 code"); + } + + @Override + public String accessToken() { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html 文档 + // 获取 openid, unionId , session_key 等字段 + return "https://api.weixin.qq.com/sns/jscode2session"; + } + + @Override + public String userInfo() { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html 文档 + throw new UnsupportedOperationException("不支持获取用户信息 url,请使用小程序内置函数 wx.getUserProfile() 获取用户信息"); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-social/src/main/java/com/jojubanking/boot/framework/social/core/request/AuthWeChatMiniAppRequest.java b/joju-framework/joju-spring-boot-starter-biz-social/src/main/java/com/jojubanking/boot/framework/social/core/request/AuthWeChatMiniAppRequest.java new file mode 100644 index 0000000..c34b07f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-social/src/main/java/com/jojubanking/boot/framework/social/core/request/AuthWeChatMiniAppRequest.java @@ -0,0 +1,97 @@ +package com.jojubanking.boot.framework.social.core.request; + +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.social.core.enums.AuthExtendSource; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthDefaultRequest; +import me.zhyd.oauth.utils.HttpUtils; +import me.zhyd.oauth.utils.UrlBuilder; + +/** + * 微信小程序登陆 Request 请求 + * + * 由于 JustAuth 定位是面向 Web 为主的三方登录,所以微信小程序只能自己封装 + * + * @author timfruit + * @date 2021-10-29 + */ +public class AuthWeChatMiniAppRequest extends AuthDefaultRequest { + + public AuthWeChatMiniAppRequest(AuthConfig config, AuthStateCache authStateCache) { + super(config, AuthExtendSource.WECHAT_MINI_APP, authStateCache); + } + + @Override + protected AuthToken getAccessToken(AuthCallback authCallback) { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html 文档 + // 使用 code 获取对应的 openId、unionId 等字段 + String response = new HttpUtils(config.getHttpConfig()).get(accessTokenUrl(authCallback.getCode())); + JSCode2SessionResponse accessTokenObject = JsonUtils.parseObject(response, JSCode2SessionResponse.class); + assert accessTokenObject != null; + checkResponse(accessTokenObject); + // 拼装结果 + return AuthToken.builder() + .openId(accessTokenObject.getOpenid()) + .unionId(accessTokenObject.getUnionId()) + .build(); + } + + @Override + protected AuthUser getUserInfo(AuthToken authToken) { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html 文档 + // 如果需要用户信息,需要在小程序调用函数后传给后端 + return AuthUser.builder() + .username("") + .nickname("") + .avatar("") + .uuid(authToken.getOpenId()) + .token(authToken) + .source(source.toString()) + .build(); + } + + /** + * 检查响应内容是否正确 + * + * @param response 请求响应内容 + */ + private void checkResponse(JSCode2SessionResponse response) { + if (response.getErrorCode() != 0) { + throw new AuthException(response.getErrorCode(), response.getErrorMsg()); + } + } + + @Override + protected String accessTokenUrl(String code) { + return UrlBuilder.fromBaseUrl(source.accessToken()) + .queryParam("appid", config.getClientId()) + .queryParam("secret", config.getClientSecret()) + .queryParam("js_code", code) // 和父类不同,所以需要重写该方法 + .queryParam("grant_type", "authorization_code") + .build(); + } + + @Data + @SuppressWarnings("SpellCheckingInspection") + private static class JSCode2SessionResponse { + + @JsonProperty("errcode") + private int errorCode; + @JsonProperty("errmsg") + private String errorMsg; + @JsonProperty("session_key") + private String sessionKey; + private String openid; + @JsonProperty("unionid") + private String unionId; + + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-social/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-social/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..dc2346a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-social/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.social.config.JojuSocialAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-social/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..dc2346a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.social.config.JojuSocialAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/config/JojuSocialAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/config/JojuSocialAutoConfiguration.class new file mode 100644 index 0000000..6c76061 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/config/JojuSocialAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/JojuAuthRequestFactory$1.class b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/JojuAuthRequestFactory$1.class new file mode 100644 index 0000000..7dd72e1 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/JojuAuthRequestFactory$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/JojuAuthRequestFactory.class b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/JojuAuthRequestFactory.class new file mode 100644 index 0000000..4b4ae50 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/JojuAuthRequestFactory.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/enums/AuthExtendSource$1.class b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/enums/AuthExtendSource$1.class new file mode 100644 index 0000000..b6d150f Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/enums/AuthExtendSource$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/enums/AuthExtendSource.class b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/enums/AuthExtendSource.class new file mode 100644 index 0000000..ad311c5 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/enums/AuthExtendSource.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/request/AuthWeChatMiniAppRequest$JSCode2SessionResponse.class b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/request/AuthWeChatMiniAppRequest$JSCode2SessionResponse.class new file mode 100644 index 0000000..16fd952 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/request/AuthWeChatMiniAppRequest$JSCode2SessionResponse.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/request/AuthWeChatMiniAppRequest.class b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/request/AuthWeChatMiniAppRequest.class new file mode 100644 index 0000000..255285c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-social/target/classes/com/jojubanking/boot/framework/social/core/request/AuthWeChatMiniAppRequest.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-social/target/joju-spring-boot-starter-biz-social-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-biz-social/target/joju-spring-boot-starter-biz-social-2.0.0-beta.jar new file mode 100644 index 0000000..2bf91d6 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-social/target/joju-spring-boot-starter-biz-social-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-biz-social/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-biz-social/target/maven-archiver/pom.properties new file mode 100644 index 0000000..ce99059 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-social/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:36 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-biz-social diff --git a/joju-framework/joju-spring-boot-starter-biz-social/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-biz-social/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..937dacf --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-social/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,7 @@ +com\jojubanking\boot\framework\social\core\request\AuthWeChatMiniAppRequest.class +com\jojubanking\boot\framework\social\core\enums\AuthExtendSource.class +com\jojubanking\boot\framework\social\core\request\AuthWeChatMiniAppRequest$JSCode2SessionResponse.class +com\jojubanking\boot\framework\social\core\enums\AuthExtendSource$1.class +com\jojubanking\boot\framework\social\core\JojuAuthRequestFactory$1.class +com\jojubanking\boot\framework\social\core\JojuAuthRequestFactory.class +com\jojubanking\boot\framework\social\config\JojuSocialAutoConfiguration.class diff --git a/joju-framework/joju-spring-boot-starter-biz-social/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-biz-social/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..6ba7f50 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-social/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,4 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-social\src\main\java\com\jojubanking\boot\framework\social\core\JojuAuthRequestFactory.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-social\src\main\java\com\jojubanking\boot\framework\social\core\enums\AuthExtendSource.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-social\src\main\java\com\jojubanking\boot\framework\social\config\JojuSocialAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-social\src\main\java\com\jojubanking\boot\framework\social\core\request\AuthWeChatMiniAppRequest.java diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/joju-spring-boot-starter-biz-tenant.iml b/joju-framework/joju-spring-boot-starter-biz-tenant/joju-spring-boot-starter-biz-tenant.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/joju-spring-boot-starter-biz-tenant.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/pom.xml b/joju-framework/joju-spring-boot-starter-biz-tenant/pom.xml new file mode 100644 index 0000000..0a36507 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/pom.xml @@ -0,0 +1,72 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-biz-tenant + jar + + ${project.artifactId} + 多租户 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + com.jojubanking.boot + joju-spring-boot-starter-security + ${revision} + + + + + com.jojubanking.boot + joju-spring-boot-starter-mybatis + ${revision} + + + + com.jojubanking.boot + joju-spring-boot-starter-redis + ${revision} + + + + + com.jojubanking.boot + joju-spring-boot-starter-job + ${revision} + + + + + com.jojubanking.boot + joju-spring-boot-starter-mq + ${revision} + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + com.google.guava + guava + + + + diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/config/JojuTenantAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/config/JojuTenantAutoConfiguration.java new file mode 100644 index 0000000..6a33e66 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/config/JojuTenantAutoConfiguration.java @@ -0,0 +1,113 @@ +package com.jojubanking.boot.framework.tenant.config; + +import cn.hutool.core.annotation.AnnotationUtil; +import com.jojubanking.boot.framework.common.enums.WebFilterOrderEnum; +import com.jojubanking.boot.framework.mybatis.core.util.MyBatisUtils; +import com.jojubanking.boot.framework.quartz.core.handler.JobHandler; +import com.jojubanking.boot.framework.tenant.core.aop.TenantIgnoreAspect; +import com.jojubanking.boot.framework.tenant.core.db.TenantDatabaseInterceptor; +import com.jojubanking.boot.framework.tenant.core.job.TenantJob; +import com.jojubanking.boot.framework.tenant.core.job.TenantJobHandlerDecorator; +import com.jojubanking.boot.framework.tenant.core.mq.TenantRedisMessageInterceptor; +import com.jojubanking.boot.framework.tenant.core.security.TenantSecurityWebFilter; +import com.jojubanking.boot.framework.tenant.core.service.TenantFrameworkService; +import com.jojubanking.boot.framework.tenant.core.service.TenantFrameworkServiceImpl; +import com.jojubanking.boot.framework.tenant.core.web.TenantContextWebFilter; +import com.jojubanking.boot.framework.web.config.WebProperties; +import com.jojubanking.boot.framework.web.core.handler.GlobalExceptionHandler; +import com.jojubanking.boot.module.system.api.tenant.TenantApi; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConditionalOnProperty(prefix = "joju.tenant", value = "enable", matchIfMissing = true) // 允许使用 joju.tenant.enable=false 禁用多租户 +@EnableConfigurationProperties(TenantProperties.class) +public class JojuTenantAutoConfiguration { + + @Bean + public TenantFrameworkService tenantFrameworkService(TenantApi tenantApi) { + return new TenantFrameworkServiceImpl(tenantApi); + } + + // ========== AOP ========== + + @Bean + public TenantIgnoreAspect tenantIgnoreAspect() { + return new TenantIgnoreAspect(); + } + + // ========== DB ========== + + @Bean + public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties properties, + MybatisPlusInterceptor interceptor) { + TenantLineInnerInterceptor inner = new TenantLineInnerInterceptor(new TenantDatabaseInterceptor(properties)); + // 添加到 interceptor 中 + // 需要加在首个,主要是为了在分页插件前面。这个是 MyBatis Plus 的规定 + MyBatisUtils.addInterceptor(interceptor, inner, 0); + return inner; + } + + // ========== WEB ========== + + @Bean + public FilterRegistrationBean tenantContextWebFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new TenantContextWebFilter()); + registrationBean.setOrder(WebFilterOrderEnum.TENANT_CONTEXT_FILTER); + return registrationBean; + } + + // ========== Security ========== + + @Bean + public FilterRegistrationBean tenantSecurityWebFilter(TenantProperties tenantProperties, + WebProperties webProperties, + GlobalExceptionHandler globalExceptionHandler, + TenantFrameworkService tenantFrameworkService) { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new TenantSecurityWebFilter(tenantProperties, webProperties, + globalExceptionHandler, tenantFrameworkService)); + registrationBean.setOrder(WebFilterOrderEnum.TENANT_SECURITY_FILTER); + return registrationBean; + } + + // ========== MQ ========== + + @Bean + public TenantRedisMessageInterceptor tenantRedisMessageInterceptor() { + return new TenantRedisMessageInterceptor(); + } + + // ========== Job ========== + + @Bean + @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") + public BeanPostProcessor jobHandlerBeanPostProcessor(TenantFrameworkService tenantFrameworkService) { + return new BeanPostProcessor() { + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if (!(bean instanceof JobHandler)) { + return bean; + } + // 有 TenantJob 注解的情况下,才会进行处理 + if (!AnnotationUtil.hasAnnotation(bean.getClass(), TenantJob.class)) { + return bean; + } + + // 使用 TenantJobHandlerDecorator 装饰 + return new TenantJobHandlerDecorator(tenantFrameworkService, (JobHandler) bean); + } + + }; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/config/TenantProperties.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/config/TenantProperties.java new file mode 100644 index 0000000..de655f2 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/config/TenantProperties.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.framework.tenant.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.Collections; +import java.util.Set; + +/** + * 多租户配置 + * + * @author TW + */ +@ConfigurationProperties(prefix = "joju.tenant") +@Data +public class TenantProperties { + + /** + * 租户是否开启 + */ + private static final Boolean ENABLE_DEFAULT = true; + + /** + * 是否开启 + */ + private Boolean enable = ENABLE_DEFAULT; + + /** + * 需要忽略多租户的请求 + * + * 默认情况下,每个请求需要带上 tenant-id 的请求头。但是,部分请求是无需带上的,例如说短信回调、支付回调等 Open API! + */ + private Set ignoreUrls = Collections.emptySet(); + + /** + * 需要忽略多租户的表 + * + * 即默认所有表都开启多租户的功能,所以记得添加对应的 tenant_id 字段哟 + */ + private Set ignoreTables = Collections.emptySet(); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/aop/TenantIgnore.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/aop/TenantIgnore.java new file mode 100644 index 0000000..292d3f4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/aop/TenantIgnore.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.framework.tenant.core.aop; + +import java.lang.annotation.*; + +/** + * 忽略租户,标记指定方法不进行租户的自动过滤 + * + * 注意,只有 DB 的场景会过滤,其它场景暂时不过滤: + * 1、Redis 场景:因为是基于 Key 实现多租户的能力,所以忽略没有意义,不像 DB 是一个 column 实现的 + * 2、MQ 场景:有点难以抉择,目前可以通过 Consumer 手动在消费的方法上,添加 @TenantIgnore 进行忽略 + * + * @author TW + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface TenantIgnore { +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/aop/TenantIgnoreAspect.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/aop/TenantIgnoreAspect.java new file mode 100644 index 0000000..22a12c6 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/aop/TenantIgnoreAspect.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.framework.tenant.core.aop; + +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +/** + * 忽略多租户的 Aspect,基于 {@link TenantIgnore} 注解实现,用于一些全局的逻辑。 + * 例如说,一个定时任务,读取所有数据,进行处理。 + * 又例如说,读取所有数据,进行缓存。 + * + * @author TW + */ +@Aspect +@Slf4j +public class TenantIgnoreAspect { + + @Around("@annotation(tenantIgnore)") + public Object around(ProceedingJoinPoint joinPoint, TenantIgnore tenantIgnore) throws Throwable { + Boolean oldIgnore = TenantContextHolder.isIgnore(); + try { + TenantContextHolder.setIgnore(true); + // 执行逻辑 + return joinPoint.proceed(); + } finally { + TenantContextHolder.setIgnore(oldIgnore); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/context/TenantContextHolder.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/context/TenantContextHolder.java new file mode 100644 index 0000000..0f5c5aa --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/context/TenantContextHolder.java @@ -0,0 +1,66 @@ +package com.jojubanking.boot.framework.tenant.core.context; + +import com.alibaba.ttl.TransmittableThreadLocal; + +/** + * 多租户上下文 Holder + * + * @author TW + */ +public class TenantContextHolder { + + /** + * 当前租户编号 + */ + private static final ThreadLocal TENANT_ID = new TransmittableThreadLocal<>(); + + /** + * 是否忽略租户 + */ + private static final ThreadLocal IGNORE = new TransmittableThreadLocal<>(); + + /** + * 获得租户编号。 + * + * @return 租户编号 + */ + public static Long getTenantId() { + return TENANT_ID.get(); + } + + /** + * 获得租户编号。如果不存在,则抛出 NullPointerException 异常 + * + * @return 租户编号 + */ + public static Long getRequiredTenantId() { + Long tenantId = getTenantId(); + if (tenantId == null) { + throw new NullPointerException("TenantContextHolder 不存在租户编号"); // TODO TW:增加文档链接 + } + return tenantId; + } + + public static void setTenantId(Long tenantId) { + TENANT_ID.set(tenantId); + } + + public static void setIgnore(Boolean ignore) { + IGNORE.set(ignore); + } + + /** + * 当前是否忽略租户 + * + * @return 是否忽略 + */ + public static boolean isIgnore() { + return Boolean.TRUE.equals(IGNORE.get()); + } + + public static void clear() { + TENANT_ID.remove(); + IGNORE.remove(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/db/TenantBaseDO.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/db/TenantBaseDO.java new file mode 100644 index 0000000..970ef70 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/db/TenantBaseDO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.framework.tenant.core.db; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 拓展多租户的 BaseDO 基类 + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public abstract class TenantBaseDO extends BaseDO { + + /** + * 多租户编号 + */ + private Long tenantId; + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/db/TenantDatabaseInterceptor.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/db/TenantDatabaseInterceptor.java new file mode 100644 index 0000000..b9ace3b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/db/TenantDatabaseInterceptor.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.framework.tenant.core.db; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.tenant.config.TenantProperties; +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; +import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; + +import java.util.HashSet; +import java.util.Set; + +/** + * 基于 MyBatis Plus 多租户的功能,实现 DB 层面的多租户的功能 + * + * @author TW + */ +public class TenantDatabaseInterceptor implements TenantLineHandler { + + private final Set ignoreTables = new HashSet<>(); + + public TenantDatabaseInterceptor(TenantProperties properties) { + // 不同 DB 下,大小写的习惯不同,所以需要都添加进去 + properties.getIgnoreTables().forEach(table -> { + ignoreTables.add(table.toLowerCase()); + ignoreTables.add(table.toUpperCase()); + }); + // 在 OracleKeyGenerator 中,生成主键时,会查询这个表,查询这个表后,会自动拼接 TENANT_ID 导致报错 + ignoreTables.add("DUAL"); + } + + @Override + public Expression getTenantId() { + return new LongValue(TenantContextHolder.getRequiredTenantId()); + } + + @Override + public boolean ignoreTable(String tableName) { + return TenantContextHolder.isIgnore() // 情况一,全局忽略多租户 + || CollUtil.contains(ignoreTables, tableName); // 情况二,忽略多租户的表 + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/job/TenantJob.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/job/TenantJob.java new file mode 100644 index 0000000..d1cd620 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/job/TenantJob.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.framework.tenant.core.job; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 多租户 Job 注解 + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface TenantJob { +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/job/TenantJobHandlerDecorator.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/job/TenantJobHandlerDecorator.java new file mode 100644 index 0000000..6b8a0b4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/job/TenantJobHandlerDecorator.java @@ -0,0 +1,58 @@ +package com.jojubanking.boot.framework.tenant.core.job; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.quartz.core.handler.JobHandler; +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; +import com.jojubanking.boot.framework.tenant.core.service.TenantFrameworkService; +import lombok.AllArgsConstructor; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 多租户 JobHandler 装饰器 + * 任务执行时,会按照租户逐个执行 Job 的逻辑 + * + * 注意,需要保证 JobHandler 的幂等性。因为 Job 因为某个租户执行失败重试时,之前执行成功的租户也会再次执行。 + * + * @author TW + */ +@AllArgsConstructor +public class TenantJobHandlerDecorator implements JobHandler { + + private final TenantFrameworkService tenantFrameworkService; + /** + * 被装饰的 Job + */ + private final JobHandler jobHandler; + + @Override + public final String execute(String param) throws Exception { + // 获得租户列表 + List tenantIds = tenantFrameworkService.getTenantIds(); + if (CollUtil.isEmpty(tenantIds)) { + return null; + } + + // 逐个租户,执行 Job + Map results = new ConcurrentHashMap<>(); + tenantIds.parallelStream().forEach(tenantId -> { // TODO TW:先通过 parallel 实现并行;1)多个租户,是一条执行日志;2)异常的情况 + try { + // 设置租户 + TenantContextHolder.setTenantId(tenantId); + // 执行 Job + String result = jobHandler.execute(param); + // 添加结果 + results.put(tenantId, result); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + TenantContextHolder.clear(); + } + }); + return JsonUtils.toJsonString(results); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/mq/TenantRedisMessageInterceptor.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/mq/TenantRedisMessageInterceptor.java new file mode 100644 index 0000000..d12289e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/mq/TenantRedisMessageInterceptor.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.framework.tenant.core.mq; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.mq.core.interceptor.RedisMessageInterceptor; +import com.jojubanking.boot.framework.mq.core.message.AbstractRedisMessage; +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; + +import static com.jojubanking.boot.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID; + +/** + * 多租户 {@link AbstractRedisMessage} 拦截器 + * + * 1. Producer 发送消息时,将 {@link TenantContextHolder} 租户编号,添加到消息的 Header 中 + * 2. Consumer 消费消息时,将消息的 Header 的租户编号,添加到 {@link TenantContextHolder} 中 + * + * @author TW + */ +public class TenantRedisMessageInterceptor implements RedisMessageInterceptor { + + @Override + public void sendMessageBefore(AbstractRedisMessage message) { + Long tenantId = TenantContextHolder.getTenantId(); + if (tenantId != null) { + message.addHeader(HEADER_TENANT_ID, tenantId.toString()); + } + } + + @Override + public void consumeMessageBefore(AbstractRedisMessage message) { + String tenantIdStr = message.getHeader(HEADER_TENANT_ID); + if (StrUtil.isNotEmpty(tenantIdStr)) { + TenantContextHolder.setTenantId(Long.valueOf(tenantIdStr)); + } + } + + @Override + public void consumeMessageAfter(AbstractRedisMessage message) { + // 注意,Consumer 是一个逻辑的入口,所以不考虑原本上下文就存在租户编号的情况 + TenantContextHolder.clear(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/redis/TenantRedisKeyDefine.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/redis/TenantRedisKeyDefine.java new file mode 100644 index 0000000..4ff75a0 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/redis/TenantRedisKeyDefine.java @@ -0,0 +1,47 @@ +package com.jojubanking.boot.framework.tenant.core.redis; + +import cn.hutool.core.util.ArrayUtil; +import com.jojubanking.boot.framework.redis.core.RedisKeyDefine; +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; + +import java.time.Duration; + +/** + * 多租户拓展的 RedisKeyDefine 实现类 + * + * 由于 Redis 不同于 MySQL 有 column 字段,无法通过类似 WHERE tenant_id = ? 的方式过滤 + * 所以需要通过在 Redis Key 上增加后缀的方式,进行租户之间的隔离。具体的步骤是: + * 1. 假设 Redis Key 是 user:%d,示例是 user:1;对应到多租户的 Redis Key 是 user:%d:%d, + * 2. 在 Redis DAO 中,需要使用 {@link #formatKey(Object...)} 方法,进行 Redis Key 的格式化 + * + * 注意,大多数情况下,并不用使用 TenantRedisKeyDefine 实现。主要的使用场景,还是 Redis Key 可能存在冲突的情况。 + * 例如说,租户 1 和 2 都有一个手机号作为 Key,则他们会存在冲突的问题 + * + * @author TW + */ +public class TenantRedisKeyDefine extends RedisKeyDefine { + + /** + * 多租户的 KEY 模板 + */ + private static final String KEY_TEMPLATE_SUFFIX = ":%d"; + + public TenantRedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, Duration timeout) { + super(memo, buildKeyTemplate(keyTemplate), keyType, valueType, timeout); + } + + public TenantRedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, TimeoutTypeEnum timeoutType) { + super(memo, buildKeyTemplate(keyTemplate), keyType, valueType, timeoutType); + } + + private static String buildKeyTemplate(String keyTemplate) { + return keyTemplate + KEY_TEMPLATE_SUFFIX; + } + + @Override + public String formatKey(Object... args) { + args = ArrayUtil.append(args, TenantContextHolder.getRequiredTenantId()); + return super.formatKey(args); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/security/TenantSecurityWebFilter.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/security/TenantSecurityWebFilter.java new file mode 100644 index 0000000..6b085ec --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/security/TenantSecurityWebFilter.java @@ -0,0 +1,119 @@ +package com.jojubanking.boot.framework.tenant.core.security; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import com.jojubanking.boot.framework.security.core.LoginUser; +import com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils; +import com.jojubanking.boot.framework.tenant.config.TenantProperties; +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; +import com.jojubanking.boot.framework.tenant.core.service.TenantFrameworkService; +import com.jojubanking.boot.framework.web.config.WebProperties; +import com.jojubanking.boot.framework.web.core.filter.ApiRequestFilter; +import com.jojubanking.boot.framework.web.core.handler.GlobalExceptionHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.AntPathMatcher; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Objects; + +/** + * 多租户 Security Web 过滤器 + * 1. 如果是登陆的用户,校验是否有权限访问该租户,避免越权问题。 + * 2. 如果请求未带租户的编号,检查是否是忽略的 URL,否则也不允许访问。 + * 3. 校验租户是合法,例如说被禁用、到期 + * + * 校验用户访问的租户,是否是其所在的租户, + * + * @author TW + */ +@Slf4j +public class TenantSecurityWebFilter extends ApiRequestFilter { + + private final TenantProperties tenantProperties; + + private final AntPathMatcher pathMatcher; + + private final GlobalExceptionHandler globalExceptionHandler; + private final TenantFrameworkService tenantFrameworkService; + + public TenantSecurityWebFilter(TenantProperties tenantProperties, + WebProperties webProperties, + GlobalExceptionHandler globalExceptionHandler, + TenantFrameworkService tenantFrameworkService) { + super(webProperties); + this.tenantProperties = tenantProperties; + this.pathMatcher = new AntPathMatcher(); + this.globalExceptionHandler = globalExceptionHandler; + this.tenantFrameworkService = tenantFrameworkService; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + Long tenantId = TenantContextHolder.getTenantId(); + // 1. 登陆的用户,校验是否有权限访问该租户,避免越权问题。 + LoginUser user = SecurityFrameworkUtils.getLoginUser(); + if (user != null) { + // 如果获取不到租户编号,则尝试使用登陆用户的租户编号 + if (tenantId == null) { + tenantId = user.getTenantId(); + TenantContextHolder.setTenantId(tenantId); + // 如果传递了租户编号,则进行比对租户编号,避免越权问题 + } else if (!Objects.equals(user.getTenantId(), TenantContextHolder.getTenantId())) { + log.error("[doFilterInternal][租户({}) User({}/{}) 越权访问租户({}) URL({}/{})]", + user.getTenantId(), user.getId(), user.getUserType(), + TenantContextHolder.getTenantId(), request.getRequestURI(), request.getMethod()); + ServletUtils.writeJSON(response, CommonResult.error(GlobalErrorCodeConstants.FORBIDDEN.getCode(), + "您无权访问该租户的数据")); + return; + } + } + + // 如果非允许忽略租户的 URL,则校验租户是否合法 + if (!isIgnoreUrl(request)) { + // 2. 如果请求未带租户的编号,不允许访问。 + if (tenantId == null) { + log.error("[doFilterInternal][URL({}/{}) 未传递租户编号]", request.getRequestURI(), request.getMethod()); + ServletUtils.writeJSON(response, CommonResult.error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), + "租户的请求未传递,请进行排查")); + return; + } + // 3. 校验租户是合法,例如说被禁用、到期 + try { + tenantFrameworkService.validTenant(tenantId); + } catch (Throwable ex) { + CommonResult result = globalExceptionHandler.allExceptionHandler(request, ex); + ServletUtils.writeJSON(response, result); + return; + } + } else { // 如果是允许忽略租户的 URL,若未传递租户编号,则默认忽略租户编号,避免报错 + if (tenantId == null) { + TenantContextHolder.setIgnore(true); + } + } + + // 继续过滤 + chain.doFilter(request, response); + } + + private boolean isIgnoreUrl(HttpServletRequest request) { + // 快速匹配,保证性能 + if (CollUtil.contains(tenantProperties.getIgnoreUrls(), request.getRequestURI())) { + return true; + } + // 逐个 Ant 路径匹配 + for (String url : tenantProperties.getIgnoreUrls()) { + if (pathMatcher.match(url, request.getRequestURI())) { + return true; + } + } + return false; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkService.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkService.java new file mode 100644 index 0000000..0f4c045 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkService.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.framework.tenant.core.service; + +import java.util.List; + +/** + * Tenant 框架 Service 接口,定义获取租户信息 + * + * @author TW + */ +public interface TenantFrameworkService { + + /** + * 获得所有租户 + * + * @return 租户编号数组 + */ + List getTenantIds(); + + /** + * 校验租户是否合法 + * + * @param id 租户编号 + */ + void validTenant(Long id); + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkServiceImpl.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkServiceImpl.java new file mode 100644 index 0000000..734baca --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkServiceImpl.java @@ -0,0 +1,73 @@ +package com.jojubanking.boot.framework.tenant.core.service; + +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.framework.common.util.cache.CacheUtils; +import com.jojubanking.boot.module.system.api.tenant.TenantApi; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; + +import java.time.Duration; +import java.util.List; + +/** + * Tenant 框架 Service 实现类 + * + * @author TW + */ +@RequiredArgsConstructor +public class TenantFrameworkServiceImpl implements TenantFrameworkService { + + private static final ServiceException SERVICE_EXCEPTION_NULL = new ServiceException(); + + private final TenantApi tenantApi; + + /** + * 针对 {@link #getTenantIds()} 的缓存 + */ + private final LoadingCache> getTenantIdsCache = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader>() { + + @Override + public List load(Object key) { + return tenantApi.getTenantIds(); + } + + }); + + /** + * 针对 {@link #validTenant(Long)} 的缓存 + */ + private final LoadingCache validTenantCache = CacheUtils.buildAsyncReloadingCache( + Duration.ofMinutes(1L), // 过期时间 1 分钟 + new CacheLoader() { + + @Override + public ServiceException load(Long id) { + try { + tenantApi.validTenant(id); + return SERVICE_EXCEPTION_NULL; + } catch (ServiceException ex) { + return ex; + } + } + + }); + + @Override + @SneakyThrows + public List getTenantIds() { + return getTenantIdsCache.get(Boolean.TRUE); + } + + @Override + public void validTenant(Long id) { + ServiceException serviceException = validTenantCache.getUnchecked(id); + if (serviceException != SERVICE_EXCEPTION_NULL) { + throw serviceException; + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/util/TenantUtils.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/util/TenantUtils.java new file mode 100644 index 0000000..e807b96 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/util/TenantUtils.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.framework.tenant.core.util; + +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; + +/** + * 多租户 Util + * + * @author TW + */ +public class TenantUtils { + + /** + * 使用指定租户,执行对应的逻辑 + * + * 注意,如果当前是忽略租户的情况下,会被强制设置成不忽略租户 + * 当然,执行完成后,还是会恢复回去 + * + * @param tenantId 租户编号 + * @param runnable 逻辑 + */ + public static void execute(Long tenantId, Runnable runnable) { + Long oldTenantId = TenantContextHolder.getTenantId(); + Boolean oldIgnore = TenantContextHolder.isIgnore(); + try { + TenantContextHolder.setTenantId(tenantId); + TenantContextHolder.setIgnore(false); + // 执行逻辑 + runnable.run(); + } finally { + TenantContextHolder.setTenantId(oldTenantId); + TenantContextHolder.setIgnore(oldIgnore); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/web/TenantContextWebFilter.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/web/TenantContextWebFilter.java new file mode 100644 index 0000000..b053f0b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/core/web/TenantContextWebFilter.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.framework.tenant.core.web; + +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; +import com.jojubanking.boot.framework.web.core.util.WebFrameworkUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 多租户 Context Web 过滤器 + * 将请求 Header 中的 tenant-id 解析出来,添加到 {@link TenantContextHolder} 中,这样后续的 DB 等操作,可以获得到租户编号。 + * + * @author TW + */ +public class TenantContextWebFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + // 设置 + Long tenantId = WebFrameworkUtils.getTenantId(request); + if (tenantId != null) { + TenantContextHolder.setTenantId(tenantId); + } + try { + chain.doFilter(request, response); + } finally { + // 清理 + TenantContextHolder.clear(); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/package-info.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/package-info.java new file mode 100644 index 0000000..cd67487 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/java/com/jojubanking/boot/framework/tenant/package-info.java @@ -0,0 +1,17 @@ +/** + * 多租户,支持如下层面: + * 1. DB:基于 MyBatis Plus 多租户的功能实现。 + * 2. Redis:通过在 Redis Key 上拼接租户编号的方式,进行隔离。 + * 3. Web:请求 HTTP API 时,解析 Header 的 tenant-id 租户编号,添加到租户上下文。 + * 4. Security:校验当前登陆的用户,是否越权访问其它租户的数据。 + * 5. Job:在 JobHandler 执行任务时,会按照每个租户,都独立并行执行一次。 + * 6. MQ:在 Producer 发送消息时,Header 带上 tenant-id 租户编号;在 Consumer 消费消息时,将 Header 的 tenant-id 租户编号,添加到租户上下文。 + * 7. Async:异步需要保证 ThreadLocal 的传递性,通过使用阿里开源的 TransmittableThreadLocal 实现。相关的改造点,可见: + * 1)Spring Async: + * {@link com.jojubanking.boot.framework.quartz.config.JojuAsyncAutoConfiguration#threadPoolTaskExecutorBeanPostProcessor()} + * 2)Spring Security: + * TransmittableThreadLocalSecurityContextHolderStrategy + * 和 JojuSecurityAutoConfiguration#securityContextHolderMethodInvokingFactoryBean() 方法 + * + */ +package com.jojubanking.boot.framework.tenant; diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..5c4761f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.tenant.config.JojuTenantAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/src/test/java/com/jojubanking/boot/framework/tenant/core/redis/TenantRedisKeyDefineTest.java b/joju-framework/joju-spring-boot-starter-biz-tenant/src/test/java/com/jojubanking/boot/framework/tenant/core/redis/TenantRedisKeyDefineTest.java new file mode 100644 index 0000000..9f8887a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/src/test/java/com/jojubanking/boot/framework/tenant/core/redis/TenantRedisKeyDefineTest.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.framework.tenant.core.redis; + +import com.jojubanking.boot.framework.redis.core.RedisKeyDefine; +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class TenantRedisKeyDefineTest { + + @Test + public void testFormatKey() { + Long tenantId = 30L; + TenantContextHolder.setTenantId(tenantId); + // 准备参数 + TenantRedisKeyDefine define = new TenantRedisKeyDefine("", "user:%d:%d", RedisKeyDefine.KeyTypeEnum.HASH, + Object.class, RedisKeyDefine.TimeoutTypeEnum.FIXED); + Long userId = 10L; + Integer userType = 1; + + // 调用 + String key = define.formatKey(userId, userType); + // 断言 + assertEquals("user:10:1:30", key); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..5c4761f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.tenant.config.JojuTenantAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/config/JojuTenantAutoConfiguration$1.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/config/JojuTenantAutoConfiguration$1.class new file mode 100644 index 0000000..1c8395a Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/config/JojuTenantAutoConfiguration$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/config/JojuTenantAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/config/JojuTenantAutoConfiguration.class new file mode 100644 index 0000000..f000a67 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/config/JojuTenantAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/config/TenantProperties.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/config/TenantProperties.class new file mode 100644 index 0000000..9071423 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/config/TenantProperties.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/aop/TenantIgnore.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/aop/TenantIgnore.class new file mode 100644 index 0000000..bb00525 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/aop/TenantIgnore.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/aop/TenantIgnoreAspect.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/aop/TenantIgnoreAspect.class new file mode 100644 index 0000000..032c529 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/aop/TenantIgnoreAspect.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/context/TenantContextHolder.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/context/TenantContextHolder.class new file mode 100644 index 0000000..f87e7fa Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/context/TenantContextHolder.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/db/TenantBaseDO.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/db/TenantBaseDO.class new file mode 100644 index 0000000..7de995f Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/db/TenantBaseDO.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/db/TenantDatabaseInterceptor.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/db/TenantDatabaseInterceptor.class new file mode 100644 index 0000000..ff184f6 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/db/TenantDatabaseInterceptor.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/job/TenantJob.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/job/TenantJob.class new file mode 100644 index 0000000..8941b7a Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/job/TenantJob.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/job/TenantJobHandlerDecorator.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/job/TenantJobHandlerDecorator.class new file mode 100644 index 0000000..91b43f8 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/job/TenantJobHandlerDecorator.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/mq/TenantRedisMessageInterceptor.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/mq/TenantRedisMessageInterceptor.class new file mode 100644 index 0000000..18675e9 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/mq/TenantRedisMessageInterceptor.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/redis/TenantRedisKeyDefine.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/redis/TenantRedisKeyDefine.class new file mode 100644 index 0000000..bb4a0fc Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/redis/TenantRedisKeyDefine.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/security/TenantSecurityWebFilter.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/security/TenantSecurityWebFilter.class new file mode 100644 index 0000000..0bb0c74 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/security/TenantSecurityWebFilter.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkService.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkService.class new file mode 100644 index 0000000..1ce2d43 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkService.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkServiceImpl$1.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkServiceImpl$1.class new file mode 100644 index 0000000..58a67a1 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkServiceImpl$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkServiceImpl$2.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkServiceImpl$2.class new file mode 100644 index 0000000..e5a6144 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkServiceImpl$2.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkServiceImpl.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkServiceImpl.class new file mode 100644 index 0000000..0b68e19 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/service/TenantFrameworkServiceImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/util/TenantUtils.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/util/TenantUtils.class new file mode 100644 index 0000000..c3710d0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/util/TenantUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/web/TenantContextWebFilter.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/web/TenantContextWebFilter.class new file mode 100644 index 0000000..4a8d9f9 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/classes/com/jojubanking/boot/framework/tenant/core/web/TenantContextWebFilter.class differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/joju-spring-boot-starter-biz-tenant-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-biz-tenant/target/joju-spring-boot-starter-biz-tenant-2.0.0-beta.jar new file mode 100644 index 0000000..cba1380 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/joju-spring-boot-starter-biz-tenant-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-archiver/pom.properties new file mode 100644 index 0000000..91ee937 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:39 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-biz-tenant diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..c53c942 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,19 @@ +com\jojubanking\boot\framework\tenant\core\aop\TenantIgnore.class +com\jojubanking\boot\framework\tenant\core\db\TenantDatabaseInterceptor.class +com\jojubanking\boot\framework\tenant\config\TenantProperties.class +com\jojubanking\boot\framework\tenant\core\service\TenantFrameworkServiceImpl.class +com\jojubanking\boot\framework\tenant\config\JojuTenantAutoConfiguration$1.class +com\jojubanking\boot\framework\tenant\core\mq\TenantRedisMessageInterceptor.class +com\jojubanking\boot\framework\tenant\core\service\TenantFrameworkServiceImpl$1.class +com\jojubanking\boot\framework\tenant\core\web\TenantContextWebFilter.class +com\jojubanking\boot\framework\tenant\core\service\TenantFrameworkServiceImpl$2.class +com\jojubanking\boot\framework\tenant\core\util\TenantUtils.class +com\jojubanking\boot\framework\tenant\config\JojuTenantAutoConfiguration.class +com\jojubanking\boot\framework\tenant\core\db\TenantBaseDO.class +com\jojubanking\boot\framework\tenant\core\security\TenantSecurityWebFilter.class +com\jojubanking\boot\framework\tenant\core\job\TenantJob.class +com\jojubanking\boot\framework\tenant\core\context\TenantContextHolder.class +com\jojubanking\boot\framework\tenant\core\job\TenantJobHandlerDecorator.class +com\jojubanking\boot\framework\tenant\core\service\TenantFrameworkService.class +com\jojubanking\boot\framework\tenant\core\redis\TenantRedisKeyDefine.class +com\jojubanking\boot\framework\tenant\core\aop\TenantIgnoreAspect.class diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..3cfa41d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,17 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\job\TenantJobHandlerDecorator.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\redis\TenantRedisKeyDefine.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\service\TenantFrameworkService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\mq\TenantRedisMessageInterceptor.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\web\TenantContextWebFilter.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\service\TenantFrameworkServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\config\JojuTenantAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\db\TenantBaseDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\db\TenantDatabaseInterceptor.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\aop\TenantIgnoreAspect.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\util\TenantUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\aop\TenantIgnore.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\job\TenantJob.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\security\TenantSecurityWebFilter.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\config\TenantProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-biz-tenant\src\main\java\com\jojubanking\boot\framework\tenant\core\context\TenantContextHolder.java diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..3e0b121 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1 @@ +com\jojubanking\boot\framework\tenant\core\redis\TenantRedisKeyDefineTest.class diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..90513f4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-biz-tenant/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-biz-tenant\src\test\java\com\jojubanking\boot\framework\tenant\core\redis\TenantRedisKeyDefineTest.java diff --git a/joju-framework/joju-spring-boot-starter-biz-tenant/target/test-classes/com/jojubanking/boot/framework/tenant/core/redis/TenantRedisKeyDefineTest.class b/joju-framework/joju-spring-boot-starter-biz-tenant/target/test-classes/com/jojubanking/boot/framework/tenant/core/redis/TenantRedisKeyDefineTest.class new file mode 100644 index 0000000..eec536e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-biz-tenant/target/test-classes/com/jojubanking/boot/framework/tenant/core/redis/TenantRedisKeyDefineTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-excel/joju-spring-boot-starter-excel.iml b/joju-framework/joju-spring-boot-starter-excel/joju-spring-boot-starter-excel.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-excel/joju-spring-boot-starter-excel.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-excel/pom.xml b/joju-framework/joju-spring-boot-starter-excel/pom.xml new file mode 100644 index 0000000..a30b599 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-excel/pom.xml @@ -0,0 +1,53 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-excel + jar + + ${project.artifactId} + Excel 拓展 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + com.jojubanking.boot + joju-spring-boot-starter-biz-dict + true + ${revision} + + + + + org.springframework + spring-web + provided + + + + jakarta.servlet + jakarta.servlet-api + provided + + + + + com.alibaba + easyexcel + + + + + diff --git a/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/CustomRowHeightHandler.java b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/CustomRowHeightHandler.java new file mode 100644 index 0000000..6d3e2f9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/CustomRowHeightHandler.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.framework.excel; + +import com.alibaba.excel.write.handler.AbstractRowWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import org.apache.poi.ss.usermodel.Row; + +// 自定义行高处理器 +public class CustomRowHeightHandler extends AbstractRowWriteHandler { + private short rowHeight; + + public CustomRowHeightHandler(short rowHeight) { + this.rowHeight = rowHeight; + } + + @Override + public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { + // 设置行高 + row.setHeight(rowHeight); + } +} diff --git a/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/ExcelTitleHandler.java b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/ExcelTitleHandler.java new file mode 100644 index 0000000..d15be99 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/ExcelTitleHandler.java @@ -0,0 +1,59 @@ +package com.jojubanking.boot.framework.excel.core; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.PropertyPlaceholderHelper; + +import java.util.List; +import java.util.Properties; + + +public class ExcelTitleHandler implements CellWriteHandler { + /** + 错误信息处理时正则表达式的格式 + */ + private final String EXCEL_ERROR_REG = "^(.*)(\\(错误:)(.*)(\\))$"; + + private String bigHead; + + private String dateHead; + + PropertyPlaceholderHelper placeholderHelper = new PropertyPlaceholderHelper("${", "}"); + + public ExcelTitleHandler( String bigHead,String dateHead) { + this.bigHead = bigHead; //表头1 + this.dateHead = dateHead; //表头2 + } + + @Override + public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { + // 动态设置表头字段 + if (!ObjectUtil.isEmpty(head)) { + List headNameList = head.getHeadNameList(); + if (CollectionUtil.isNotEmpty(headNameList)) { + Properties properties = new Properties(); + properties.setProperty("bigHead", bigHead); + properties.setProperty("dateHead", dateHead); + for (int i = 0 ; i < headNameList.size() ; i++){ + // 循环遍历替换 + headNameList.set(i, placeholderHelper.replacePlaceholders(headNameList.get(i), properties)); + } + } + } + } + @Override + public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + } + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + } +} + diff --git a/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/annotations/DictFormat.java b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/annotations/DictFormat.java new file mode 100644 index 0000000..fa373ce --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/annotations/DictFormat.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.framework.excel.core.annotations; + +import java.lang.annotation.*; + +/** + * 字典格式化 + * + * 实现将字典数据的值,格式化成字典数据的标签 + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface DictFormat { + + /** + * 例如说,SysDictTypeConstants、InfDictTypeConstants + * + * @return 字典类型 + */ + String value(); + +} diff --git a/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/convert/DictConvert.java b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/convert/DictConvert.java new file mode 100644 index 0000000..ca53e98 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/convert/DictConvert.java @@ -0,0 +1,72 @@ +package com.jojubanking.boot.framework.excel.core.convert; + +import cn.hutool.core.convert.Convert; +import com.jojubanking.boot.framework.dict.core.util.DictFrameworkUtils; +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import lombok.extern.slf4j.Slf4j; + +/** + * Excel 数据字典转换器 + * + * @author TW + */ +@Slf4j +public class DictConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public Object convertToJavaData(ReadCellData readCellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 使用字典解析 + String type = getType(contentProperty); + String label = readCellData.getStringValue(); + String value = DictFrameworkUtils.parseDictDataValue(type, label); + if (value == null) { + log.error("[convertToJavaData][type({}) 解析不掉 label({})]", type, label); + return null; + } + // 将 String 的 value 转换成对应的属性 + Class fieldClazz = contentProperty.getField().getType(); + return Convert.convert(fieldClazz, value); + } + + @Override + public WriteCellData convertToExcelData(Object object, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 空时,返回空 + if (object == null) { + return new WriteCellData<>(""); + } + + // 使用字典格式化 + String type = getType(contentProperty); + String value = String.valueOf(object); + String label = DictFrameworkUtils.getDictDataLabel(type, value); + if (label == null) { + log.error("[convertToExcelData][type({}) 转换不了 label({})]", type, value); + return new WriteCellData<>(""); + } + // 生成 Excel 小表格 + return new WriteCellData<>(label); + } + + private static String getType(ExcelContentProperty contentProperty) { + return contentProperty.getField().getAnnotation(DictFormat.class).value(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/convert/JsonConvert.java b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/convert/JsonConvert.java new file mode 100644 index 0000000..f046d56 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/convert/JsonConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.framework.excel.core.convert; + +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; + +/** + * Excel Json 转换器 + * + * @author TW + */ +public class JsonConvert implements Converter { + + @Override + public Class supportJavaTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + throw new UnsupportedOperationException("暂不支持,也不需要"); + } + + @Override + public WriteCellData convertToExcelData(Object value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + // 生成 Excel 小表格 + return new WriteCellData<>(JsonUtils.toJsonString(value)); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/util/ExcelUtils.java b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/util/ExcelUtils.java new file mode 100644 index 0000000..d6fc6ec --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/core/util/ExcelUtils.java @@ -0,0 +1,480 @@ +package com.jojubanking.boot.framework.excel.core.util; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.metadata.Font; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.metadata.style.WriteFont; +import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import com.jojubanking.boot.framework.excel.CustomRowHeightHandler; +import com.jojubanking.boot.framework.excel.core.ExcelTitleHandler; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; +import java.util.List; + +/** + * Excel 工具类 + * + * @author TW + */ +public class ExcelUtils { + + /** + * 生成有图片的excel + * @param dataList 数据列表 + */ +// public static void generateImageExcel(HttpServletResponse response,List dataList) throws Exception { +// +// if (CollectionUtils.isEmpty(dataList)) return ; +// String fileName = "数据列表"; +// String sheetName = "数据列表"; +// +// String picHeadName = "截图"; +// +// //图片列最大图片数 +//// AtomicReference maxImageSize = new AtomicReference<>(0); +//// dataList.forEach(item -> { +//// String picUrls = item.getReportPicUrl(); +//// if (StringUtils.isNotEmpty(picUrls)){ +//// if (picUrls.split(",").length > maxImageSize.get()) { +//// maxImageSize.set(picUrls.split(",").length); +//// } +//// } +//// }); +// +// // 表头名称和列宽的映射 +//// Map stringIntegerMap = HandleObjDataUtil.headNameColumnWidthMap(ReportQuestionReplyExportDTO.class); +//// //设置列长度所用类 +//// AutoColumnWidthStyleStrategy longWidth = new AutoColumnWidthStyleStrategy(); +// +//// Integer partitionSize = dataList.size()/10; +//// // 对集合切割分区并发处理 +//// List> dataPartition = Lists.partition(dataList, partitionSize > 20? 20 : partitionSize); +// +//// dataPartition.parallelStream().forEach(objList -> { +//// objList.forEach(item -> { +// WriteCellData writeCellData = new WriteCellData<>(); +// if (StringUtils.isNotEmpty(item.getReportPicUrl())) { +// //每张图片间距 +// Integer splitWidth = -2; +// //每张图片的长度 +// Integer imageWidth = 60; +// //图片列的最大长度 +// Integer sumWidth = maxImageSize.get() * (imageWidth + splitWidth); +// +// List imageDataList = new ArrayList<>(); +// +// List imagePathList = Lists.newArrayList(item.getReportPicUrl().split(",")); +// for (int i = 1; i <= imagePathList.size(); i++) { +// String path = imagePathList.get(i - 1); +// Integer left = imageWidth * (i - 1) + i * splitWidth; +// Integer right = sumWidth - imageWidth - left; +// ImageData imageData = new ImageData(); +// +// byte[] bytes = null; +// InputStream inputStream = null; +// ByteArrayOutputStream outputStream = null; +// try { +// inputStream = new URL(path).openStream(); +// outputStream = new ByteArrayOutputStream(); +// // 对图片进行压缩 +// Thumbnails.of(inputStream).scale(0.9f).outputQuality(0.3f).toOutputStream(outputStream); +// bytes = outputStream.toByteArray(); +// } catch (IOException e) { +// e.printStackTrace(); +// continue; +// } finally { +// if (inputStream != null){ +// try { +// inputStream.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } +// if (bytes.length < 1) continue; +// +// imageData.setImage(bytes); +// imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG); +// //距离单元格顶部距离 +// imageData.setTop(1); +// //距离单元格底部距离 +// imageData.setBottom(1); +// //距离单元格左边距离 +// imageData.setLeft(left); +// //距离单元格右边距离 +// imageData.setRight(right); +// imageData.setAnchorType(ClientAnchorData.AnchorType.MOVE_AND_RESIZE); +// imageDataList.add(imageData); +// } +// writeCellData.set .setImageDataList(imageDataList); +// +// +// Map zdyColumnWidth = new HashMap<>(); +// //图片列名称,对应导出对象的列名称,图片列长度 +// zdyColumnWidth.put(picHeadName, sumWidth / 6); +// //设置列长度所用类 +// longWidth.setZdyColumnWidth(zdyColumnWidth,stringIntegerMap); +// } +// item.setWriteCellDataFile(writeCellData); +//// }); +//// }); +// +// ResponseDataUtils.setExcelRespProp(response,fileName); +// EasyExcel.write(response.getOutputStream()) +// .registerWriteHandler(longWidth) +// .head(ReportQuestionReplyExportDTO.class) +// .excelType(ExcelTypeEnum.XLSX) +// .sheet(sheetName) +// .doWrite(dataList); +// } + + /** + * 将列表以 Excel 响应给前端 + * + * @param response 响应 + * @param filename 文件名 + * @param sheetName Excel sheet 名 + * @param head Excel head 头 + * @param data 数据列表哦 + * @param 泛型,保证 head 和 data 类型的一致性 + * @throws IOException 写入失败的情况 + */ + public static void writexytj(HttpServletResponse response, String xyrwname, String filename, String sheetName, + Class head, List data) throws IOException { + + WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); + contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);//细实线 + contentWriteCellStyle.setBorderTop(BorderStyle.THIN); + contentWriteCellStyle.setBorderRight(BorderStyle.THIN); + contentWriteCellStyle.setBorderBottom(BorderStyle.THIN); + contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + contentWriteCellStyle.setWrapped(true); + // 设置内容字体大小 + WriteFont contentWriteFont = new WriteFont(); + contentWriteFont.setFontHeightInPoints((short) 20); // 设置内容字体大小为10 + contentWriteCellStyle.setWriteFont(contentWriteFont); + + WriteCellStyle headWriteCellStyle = new WriteCellStyle(); + headWriteCellStyle.setBorderLeft(BorderStyle.THIN);//细实线 + headWriteCellStyle.setBorderTop(BorderStyle.THIN); + headWriteCellStyle.setBorderRight(BorderStyle.THIN); + headWriteCellStyle.setBorderBottom(BorderStyle.THIN); + //设置头部标题居中 + headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现 + HorizontalCellStyleStrategy horizontalCellStyleStrategy = + new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); + +// //创建ExcelWriter写入对象 +// ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()) +// .autoCloseStream(false) +// .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) +// +// .build(); +// //创建Sheet对象 +// WriteSheet sheet = new WriteSheet(); +// //设置第N个Sheet +// sheet.setSheetNo(1); +// //设置Sheet名称 +// sheet.setSheetName(sheetName); +// //创建表格对象 +// WriteTable table = new WriteTable(); +// //设置第N个表格 +// table.setTableNo(1); +// +// xyrwname = "2024年第一批次"; +// //创建表头集合 +// List> headList = new ArrayList>(); +// +// //第N列的表头 +// List headTitle1 = new ArrayList<>(); +// List headTitle2 = new ArrayList<>(); +// List headTitle3 = new ArrayList<>(); +// List headTitle4 = new ArrayList<>(); +// List headTitle5 = new ArrayList<>(); +// List headTitle6 = new ArrayList<>(); +// List headTitle7 = new ArrayList<>(); +// List headTitle8 = new ArrayList<>(); +// List headTitle9 = new ArrayList<>(); +// List headTitle10 = new ArrayList<>(); +// List headTitle11 = new ArrayList<>(); +// List headTitle12 = new ArrayList<>(); +// headTitle1.add(xyrwname); +// headTitle1.add("就诊ID"); +// headTitle2.add("xyrwname"); +// headTitle2.add("学校"); +// headTitle3.add("xyrwname"); +// headTitle3.add("班级"); +// headTitle4.add(""); +// headTitle4.add("姓名"); +// headTitle5.add(""); +// headTitle5.add("性别"); +// headTitle6.add(""); +// headTitle6.add("身份证号"); +// headTitle7.add(""); +// headTitle7.add("基础项目"); +// headTitle8.add(""); +// headTitle8.add("基础项目总额(元)"); +// headTitle9.add(""); +// headTitle9.add("可选项目"); +// headTitle10.add(""); +// headTitle10.add("可选项目总额(元)"); +// headTitle11.add(""); +// headTitle11.add("缴费总额(元)"); +// headTitle12.add(""); +// headTitle12.add("就诊ID条码"); +// +// headList.add(headTitle1); +// headList.add(headTitle2); +// headList.add(headTitle3); +// headList.add(headTitle4); +// headList.add(headTitle5); +// headList.add(headTitle6); +// headList.add(headTitle7); +// headList.add(headTitle8); +// headList.add(headTitle9); +// headList.add(headTitle10); +// headList.add(headTitle11); +// headList.add(headTitle12); +// table.setHead(headList); +// +// List> list = new ArrayList<>(); +// excelWriter.write(list, sheet, table); +// // 记得 释放资源 +// excelWriter.finish(); + + //指定写出的excel文件 +/* String fileName = "C:\\Users\\admin\\Desktop\\demo.xlsx"; + //指定读取的图片文件 + String imagePath = "C:\\Users\\admin\\Desktop\\路飞.jpg"; + //如果插入多张 + List list = new ArrayList<>(); + //图片对象 + ImageDemoData imageDemoData = new ImageDemoData(); + //加入到list + list.add(imageDemoData); + //这里只用了File,还可以用对象里的InputStream、String、byte[]、URL + imageDemoData.setFile(new File(imagePath)); + EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list);*/ + + int batchSize = 10; // 可以根据实际情况调整批次大小 + int totalSize = data.size(); + int batchCount = (totalSize + batchSize - 1) / batchSize; + + // 输出 Excel + String dateHead = ""; +// EasyExcel.write(response.getOutputStream(), head) +// .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 +// .registerWriteHandler(new ExcelTitleHandler(xyrwname, dateHead)) +// //.registerWriteHandler(new SimpleColumnWidthStyleStrategy(20)) +// .registerWriteHandler(horizontalCellStyleStrategy) +// //.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 +// .sheet(sheetName).doWrite(data); +// EasyExcel.write(filename, head) +// .autoCloseStream(true) // 不要自动关闭,交给 Servlet 自己处理 +// .registerWriteHandler(new ExcelTitleHandler(xyrwname, dateHead)) +// //.registerWriteHandler(new SimpleColumnWidthStyleStrategy(20)) +// .registerWriteHandler(horizontalCellStyleStrategy) +// //.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 +// .sheet(sheetName).doWrite(data); + + // 创建 ExcelWriter + ExcelWriter excelWriter = EasyExcel.write(filename, head) + .autoCloseStream(true) // 不要自动关闭,交给 Servlet 自己处理 + .registerWriteHandler(new ExcelTitleHandler(xyrwname, dateHead)) + //.registerWriteHandler(new SimpleColumnWidthStyleStrategy(20)) + .registerWriteHandler(horizontalCellStyleStrategy) + //.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度 + .build(); + + try { + for (int i = 0; i < batchCount; i++) { + // 计算当前批次的起始和结束位置 + int start = i * batchSize; + int end = Math.min(start + batchSize, totalSize); + List subList = data.subList(start, end); + + // 创建 WriteSheet + WriteSheet writeSheet = EasyExcel.writerSheet(i, sheetName + "_" + (i + 1)).build(); + + // 写入数据 + excelWriter.write(subList, writeSheet); + } + } finally { + // 关闭 ExcelWriter + if (excelWriter != null) { + excelWriter.finish(); + } + } + + // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了 +// response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); +// response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + } + + + /** + * 将列表以 Excel 响应给前端 + * + * @param response 响应 + * @param filename 文件名 + * @param sheetName Excel sheet 名 + * @param head Excel head 头 + * @param data 数据列表哦 + * @param 泛型,保证 head 和 data 类型的一致性 + * @throws IOException 写入失败的情况 + */ + public static void write(HttpServletResponse response, String filename, String sheetName, + Class head, List data) throws IOException { + + WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); + contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);//细实线 + contentWriteCellStyle.setBorderTop(BorderStyle.THIN); + contentWriteCellStyle.setBorderRight(BorderStyle.THIN); + contentWriteCellStyle.setBorderBottom(BorderStyle.THIN); + contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + contentWriteCellStyle.setWrapped(true); + + WriteCellStyle headWriteCellStyle = new WriteCellStyle(); + headWriteCellStyle.setBorderLeft(BorderStyle.THIN);//细实线 + headWriteCellStyle.setBorderTop(BorderStyle.THIN); + headWriteCellStyle.setBorderRight(BorderStyle.THIN); + headWriteCellStyle.setBorderBottom(BorderStyle.THIN); + //设置头部标题居中 + headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现 + HorizontalCellStyleStrategy horizontalCellStyleStrategy = + new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); + + // 创建自定义行高处理器 + short rowHeight = 150 * 20; + CustomRowHeightHandler rowHeightHandler = new CustomRowHeightHandler(rowHeight); + // 输出 Excel +// EasyExcel.write(filename, head) +// .autoCloseStream(true) // 不要自动关闭,交给 Servlet 自己处理 +// .registerWriteHandler(horizontalCellStyleStrategy) +// .registerWriteHandler(rowHeightHandler) +// .sheet(sheetName).doWrite(data); + + //改成分批次写入excel,防止内存溢出 + // 每批次写入的数据量 + int batchSize = 100; // 可以根据实际情况调整批次大小 + int totalSize = data.size(); + int batchCount = (totalSize + batchSize - 1) / batchSize; + + // 创建 ExcelWriter + ExcelWriter excelWriter = EasyExcel.write(filename, head) + .autoCloseStream(true) // 不要自动关闭,交给 Servlet 自己处理 + .registerWriteHandler(horizontalCellStyleStrategy) + .registerWriteHandler(rowHeightHandler) + .build(); + + try { + for (int i = 0; i < batchCount; i++) { + // 计算当前批次的起始和结束位置 + int start = i * batchSize; + int end = Math.min(start + batchSize, totalSize); + List subList = data.subList(start, end); + + // 创建 WriteSheet + WriteSheet writeSheet = EasyExcel.writerSheet(i, sheetName + "_" + (i + 1)).build(); + + // 写入数据 + excelWriter.write(subList, writeSheet); + } + } finally { + // 关闭 ExcelWriter + if (excelWriter != null) { + excelWriter.finish(); + } + } + + } + + /** + * 将列表以 Excel 响应给前端 + * + * @param response 响应 + * @param filename 文件名 + * @param sheetName Excel sheet 名 + * @param head Excel head 头 + * @param data 数据列表哦 + * @param 泛型,保证 head 和 data 类型的一致性 + * @throws IOException 写入失败的情况 + */ + public static void writeorder(HttpServletResponse response, String filename, String sheetName, + Class head, List data) throws IOException { + + WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); + contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);//细实线 + contentWriteCellStyle.setBorderTop(BorderStyle.THIN); + contentWriteCellStyle.setBorderRight(BorderStyle.THIN); + contentWriteCellStyle.setBorderBottom(BorderStyle.THIN); + contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + contentWriteCellStyle.setWrapped(true); + + WriteCellStyle headWriteCellStyle = new WriteCellStyle(); + headWriteCellStyle.setBorderLeft(BorderStyle.THIN);//细实线 + headWriteCellStyle.setBorderTop(BorderStyle.THIN); + headWriteCellStyle.setBorderRight(BorderStyle.THIN); + headWriteCellStyle.setBorderBottom(BorderStyle.THIN); + //设置头部标题居中 + headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现 + HorizontalCellStyleStrategy horizontalCellStyleStrategy = + new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); + + // 创建自定义行高处理器 +// short rowHeight = 150 * 20; +// CustomRowHeightHandler rowHeightHandler = new CustomRowHeightHandler(rowHeight); + + //改成分批次写入excel,防止内存溢出 + // 每批次写入的数据量 + int batchSize = 500; // 可以根据实际情况调整批次大小 + int totalSize = data.size(); + int batchCount = (totalSize + batchSize - 1) / batchSize; + + // 创建 ExcelWriter + ExcelWriter excelWriter = EasyExcel.write(filename, head) + .autoCloseStream(true) // 不要自动关闭,交给 Servlet 自己处理 + .registerWriteHandler(horizontalCellStyleStrategy) +// .registerWriteHandler(rowHeightHandler) + .build(); + + try { + for (int i = 0; i < batchCount; i++) { + // 计算当前批次的起始和结束位置 + int start = i * batchSize; + int end = Math.min(start + batchSize, totalSize); + List subList = data.subList(start, end); + + // 创建 WriteSheet + WriteSheet writeSheet = EasyExcel.writerSheet(i, sheetName + "_" + (i + 1)).build(); + + // 写入数据 + excelWriter.write(subList, writeSheet); + } + } finally { + // 关闭 ExcelWriter + if (excelWriter != null) { + excelWriter.finish(); + } + } + + } + + public static List read(MultipartFile file, Class head) throws IOException { + return EasyExcel.read(file.getInputStream(), head, null) + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理 + .doReadAllSync(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/package-info.java b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/package-info.java new file mode 100644 index 0000000..76499af --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-excel/src/main/java/com/jojubanking/boot/framework/excel/package-info.java @@ -0,0 +1,4 @@ +/** + * 基于 EasyExcel 实现 Excel 相关的操作 + */ +package com.jojubanking.boot.framework.excel; diff --git a/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/CustomRowHeightHandler.class b/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/CustomRowHeightHandler.class new file mode 100644 index 0000000..41b409e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/CustomRowHeightHandler.class differ diff --git a/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/ExcelTitleHandler.class b/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/ExcelTitleHandler.class new file mode 100644 index 0000000..690ba8e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/ExcelTitleHandler.class differ diff --git a/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/annotations/DictFormat.class b/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/annotations/DictFormat.class new file mode 100644 index 0000000..b1d5ffa Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/annotations/DictFormat.class differ diff --git a/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/convert/DictConvert.class b/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/convert/DictConvert.class new file mode 100644 index 0000000..62a5c4d Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/convert/DictConvert.class differ diff --git a/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/convert/JsonConvert.class b/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/convert/JsonConvert.class new file mode 100644 index 0000000..5aac546 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/convert/JsonConvert.class differ diff --git a/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/util/ExcelUtils.class b/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/util/ExcelUtils.class new file mode 100644 index 0000000..00739d0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-excel/target/classes/com/jojubanking/boot/framework/excel/core/util/ExcelUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-excel/target/joju-spring-boot-starter-excel-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-excel/target/joju-spring-boot-starter-excel-2.0.0-beta.jar new file mode 100644 index 0000000..4922ccc Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-excel/target/joju-spring-boot-starter-excel-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-excel/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-excel/target/maven-archiver/pom.properties new file mode 100644 index 0000000..068e420 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-excel/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:40 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-excel diff --git a/joju-framework/joju-spring-boot-starter-excel/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-excel/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..222d3f7 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-excel/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,6 @@ +com\jojubanking\boot\framework\excel\core\util\ExcelUtils.class +com\jojubanking\boot\framework\excel\core\annotations\DictFormat.class +com\jojubanking\boot\framework\excel\core\convert\DictConvert.class +com\jojubanking\boot\framework\excel\CustomRowHeightHandler.class +com\jojubanking\boot\framework\excel\core\ExcelTitleHandler.class +com\jojubanking\boot\framework\excel\core\convert\JsonConvert.class diff --git a/joju-framework/joju-spring-boot-starter-excel/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-excel/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..037e822 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-excel/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,7 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-excel\src\main\java\com\jojubanking\boot\framework\excel\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-excel\src\main\java\com\jojubanking\boot\framework\excel\core\ExcelTitleHandler.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-excel\src\main\java\com\jojubanking\boot\framework\excel\core\util\ExcelUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-excel\src\main\java\com\jojubanking\boot\framework\excel\core\convert\JsonConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-excel\src\main\java\com\jojubanking\boot\framework\excel\CustomRowHeightHandler.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-excel\src\main\java\com\jojubanking\boot\framework\excel\core\annotations\DictFormat.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-excel\src\main\java\com\jojubanking\boot\framework\excel\core\convert\DictConvert.java diff --git a/joju-framework/joju-spring-boot-starter-file/joju-spring-boot-starter-file.iml b/joju-framework/joju-spring-boot-starter-file/joju-spring-boot-starter-file.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/joju-spring-boot-starter-file.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-file/pom.xml b/joju-framework/joju-spring-boot-starter-file/pom.xml new file mode 100644 index 0000000..fd7eb62 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/pom.xml @@ -0,0 +1,84 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-file + + ${project.artifactId} + 文件客户端,支持多种存储器 + 1. file:本地磁盘 + 2. ftp:FTP 服务器 + 2. sftp:SFTP 服务器 + 4. db:数据库 + 5. s3:支持 S3 协议的云存储服务,例如说 MinIO、阿里云、华为云、腾讯云、七牛云等等 + + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + org.springframework.boot + spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.slf4j + slf4j-api + + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-core + + + + commons-net + commons-net + + + com.jcraft + jsch + + + + org.apache.tika + tika-core + + + + + io.minio + minio + + + + + com.jojubanking.boot + joju-spring-boot-starter-test + test + ${revision} + + + + diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/config/JojuFileAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/config/JojuFileAutoConfiguration.java new file mode 100644 index 0000000..9aa4c16 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/config/JojuFileAutoConfiguration.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.framework.file.config; + +import com.jojubanking.boot.framework.file.core.client.FileClientFactory; +import com.jojubanking.boot.framework.file.core.client.FileClientFactoryImpl; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 文件配置类 + * + * @author TW + */ +@Configuration +public class JojuFileAutoConfiguration { + + @Bean + public FileClientFactory fileClientFactory() { + return new FileClientFactoryImpl(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/AbstractFileClient.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/AbstractFileClient.java new file mode 100644 index 0000000..b4ae25a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/AbstractFileClient.java @@ -0,0 +1,69 @@ +package com.jojubanking.boot.framework.file.core.client; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * 文件客户端的抽象类,提供模板方法,减少子类的冗余代码 + * + * @author TW + */ +@Slf4j +public abstract class AbstractFileClient implements FileClient { + + /** + * 配置编号 + */ + private final Long id; + /** + * 文件配置 + */ + protected Config config; + + public AbstractFileClient(Long id, Config config) { + this.id = id; + this.config = config; + } + + /** + * 初始化 + */ + public final void init() { + doInit(); + log.info("[init][配置({}) 初始化完成]", config); + } + + /** + * 自定义初始化 + */ + protected abstract void doInit(); + + public final void refresh(Config config) { + // 判断是否更新 + if (config.equals(this.config)) { + return; + } + log.info("[refresh][配置({})发生变化,重新初始化]", config); + this.config = config; + // 初始化 + this.init(); + } + + @Override + public Long getId() { + return id; + } + + /** + * 格式化文件的 URL 访问地址 + * 使用场景:local、ftp、db,通过 FileController 的 getFile 来获取文件内容 + * + * @param domain 自定义域名 + * @param path 文件路径 + * @return URL 访问地址 + */ + protected String formatFileUrl(String domain, String path) { + return StrUtil.format("{}/admin-api/infra/file/{}/get/{}", domain, getId(), path); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/FileClient.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/FileClient.java new file mode 100644 index 0000000..3eb15cf --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/FileClient.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.framework.file.core.client; + +/** + * 文件客户端 + * + * @author TW + */ +public interface FileClient { + + /** + * 获得客户端编号 + * + * @return 客户端编号 + */ + Long getId(); + + /** + * 上传文件 + * + * @param content 文件流 + * @param path 相对路径 + * @return 完整路径,即 HTTP 访问地址 + * @throws Exception 上传文件时,抛出 Exception 异常 + */ + String upload(byte[] content, String path) throws Exception; + + /** + * 删除文件 + * + * @param path 相对路径 + * @throws Exception 删除文件时,抛出 Exception 异常 + */ + void delete(String path) throws Exception; + + /** + * 获得文件的内容 + * + * @param path 相对路径 + * @return 文件的内容 + */ + byte[] getContent(String path) throws Exception; + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/FileClientConfig.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/FileClientConfig.java new file mode 100644 index 0000000..e1dd6f0 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/FileClientConfig.java @@ -0,0 +1,16 @@ +package com.jojubanking.boot.framework.file.core.client; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +/** + * 文件客户端的配置 + * 不同实现的客户端,需要不同的配置,通过子类来定义 + * + * @author TW + */ +@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) +// @JsonTypeInfo 注解的作用,Jackson 多态 +// 1. 序列化到时数据库时,增加 @class 属性。 +// 2. 反序列化到内存对象时,通过 @class 属性,可以创建出正确的类型 +public interface FileClientConfig { +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/FileClientFactory.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/FileClientFactory.java new file mode 100644 index 0000000..20d5c20 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/FileClientFactory.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.framework.file.core.client; + +import com.jojubanking.boot.framework.file.core.enums.FileStorageEnum; + +public interface FileClientFactory { + + /** + * 获得文件客户端 + * + * @param configId 配置编号 + * @return 文件客户端 + */ + FileClient getFileClient(Long configId); + + /** + * 创建文件客户端 + * + * @param configId 配置编号 + * @param storage 存储器的枚举 {@link FileStorageEnum} + * @param config 文件配置 + */ + void createOrUpdateFileClient(Long configId, Integer storage, Config config); + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/FileClientFactoryImpl.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/FileClientFactoryImpl.java new file mode 100644 index 0000000..93cc7c4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/FileClientFactoryImpl.java @@ -0,0 +1,56 @@ +package com.jojubanking.boot.framework.file.core.client; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ReflectUtil; +import com.jojubanking.boot.framework.file.core.enums.FileStorageEnum; +import lombok.extern.slf4j.Slf4j; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * 文件客户端的工厂实现类 + * + * @author TW + */ +@Slf4j +public class FileClientFactoryImpl implements FileClientFactory { + + /** + * 文件客户端 Map + * key:配置编号 + */ + private final ConcurrentMap> clients = new ConcurrentHashMap<>(); + + @Override + public FileClient getFileClient(Long configId) { + AbstractFileClient client = clients.get(configId); + if (client == null) { + log.error("[getFileClient][配置编号({}) 找不到客户端]", configId); + } + return client; + } + + @Override + @SuppressWarnings("unchecked") + public void createOrUpdateFileClient(Long configId, Integer storage, Config config) { + AbstractFileClient client = (AbstractFileClient) clients.get(configId); + if (client == null) { + client = this.createFileClient(configId, storage, config); + client.init(); + clients.put(client.getId(), client); + } else { + client.refresh(config); + } + } + + @SuppressWarnings("unchecked") + private AbstractFileClient createFileClient( + Long configId, Integer storage, Config config) { + FileStorageEnum storageEnum = FileStorageEnum.getByStorage(storage); + Assert.notNull(storageEnum, String.format("文件配置(%s) 为空", storageEnum)); + // 创建客户端 + return (AbstractFileClient) ReflectUtil.newInstance(storageEnum.getClientClass(), configId, config); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/db/DBFileClient.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/db/DBFileClient.java new file mode 100644 index 0000000..48c2c88 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/db/DBFileClient.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.framework.file.core.client.db; + +import cn.hutool.extra.spring.SpringUtil; +import com.jojubanking.boot.framework.file.core.client.AbstractFileClient; + +/** + * 基于 DB 存储的文件客户端的配置类 + * + * @author TW + */ +public class DBFileClient extends AbstractFileClient { + + private DBFileContentFrameworkDAO dao; + + public DBFileClient(Long id, DBFileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + } + + @Override + public String upload(byte[] content, String path) { + getDao().insert(getId(), path, content); + // 拼接返回路径 + return super.formatFileUrl(config.getDomain(), path); + } + + @Override + public void delete(String path) { + getDao().delete(getId(), path); + } + + @Override + public byte[] getContent(String path) { + return getDao().selectContent(getId(), path); + } + + private DBFileContentFrameworkDAO getDao() { + // 延迟获取,因为 SpringUtil 初始化太慢 + if (dao == null) { + dao = SpringUtil.getBean(DBFileContentFrameworkDAO.class); + } + return dao; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/db/DBFileClientConfig.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/db/DBFileClientConfig.java new file mode 100644 index 0000000..a04e2c4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/db/DBFileClientConfig.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.framework.file.core.client.db; + +import com.jojubanking.boot.framework.file.core.client.FileClientConfig; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.NotEmpty; + +/** + * 基于 DB 存储的文件客户端的配置类 + * + * @author TW + */ +@Data +public class DBFileClientConfig implements FileClientConfig { + + /** + * 自定义域名 + */ + @NotEmpty(message = "domain 不能为空") + @URL(message = "domain 必须是 URL 格式") + private String domain; + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/db/DBFileContentFrameworkDAO.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/db/DBFileContentFrameworkDAO.java new file mode 100644 index 0000000..aa8af9e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/db/DBFileContentFrameworkDAO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.framework.file.core.client.db; + +/** + * 文件内容 Framework DAO 接口 + * + * @author TW + */ +public interface DBFileContentFrameworkDAO { + + /** + * 插入文件内容 + * + * @param configId 配置编号 + * @param path 路径 + * @param content 内容 + */ + void insert(Long configId, String path, byte[] content); + + /** + * 删除文件内容 + * + * @param configId 配置编号 + * @param path 路径 + */ + void delete(Long configId, String path); + + /** + * 获得文件内容 + * + * @param configId 配置编号 + * @param path 路径 + * @return 内容 + */ + byte[] selectContent(Long configId, String path); + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClient.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClient.java new file mode 100644 index 0000000..a414c7e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClient.java @@ -0,0 +1,77 @@ +package com.jojubanking.boot.framework.file.core.client.ftp; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.ftp.Ftp; +import cn.hutool.extra.ftp.FtpException; +import cn.hutool.extra.ftp.FtpMode; +import com.jojubanking.boot.framework.file.core.client.AbstractFileClient; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +/** + * Ftp 文件客户端 + * + * @author TW + */ +public class FtpFileClient extends AbstractFileClient { + + private Ftp ftp; + + public FtpFileClient(Long id, FtpFileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + // 把配置的 \ 替换成 /, 如果路径配置 \a\test, 替换成 /a/test, 替换方法已经处理 null 情况 + config.setBasePath(StrUtil.replace(config.getBasePath(), StrUtil.BACKSLASH, StrUtil.SLASH)); + // ftp的路径是 / 结尾 + if (!config.getBasePath().endsWith(StrUtil.SLASH)) { + config.setBasePath(config.getBasePath() + StrUtil.SLASH); + } + // 初始化 Ftp 对象 + this.ftp = new Ftp(config.getHost(), config.getPort(), config.getUsername(), config.getPassword(), + CharsetUtil.CHARSET_UTF_8, null, null, FtpMode.valueOf(config.getMode())); + } + + @Override + public String upload(byte[] content, String path) { + // 执行写入 + String filePath = getFilePath(path); + String fileName = FileUtil.getName(filePath); + String dir = StrUtil.removeSuffix(filePath, fileName); + ftp.reconnectIfTimeout(); + boolean success = ftp.upload(dir, fileName, new ByteArrayInputStream(content)); + if (!success) { + throw new FtpException(StrUtil.format("上传文件到目标目录 ({}) 失败", filePath)); + } + // 拼接返回路径 + return super.formatFileUrl(config.getDomain(), path); + } + + @Override + public void delete(String path) { + String filePath = getFilePath(path); + ftp.reconnectIfTimeout(); + ftp.delFile(filePath); + } + + @Override + public byte[] getContent(String path) { + String filePath = getFilePath(path); + String fileName = FileUtil.getName(filePath); + String dir = StrUtil.removeSuffix(filePath, fileName); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ftp.reconnectIfTimeout(); + ftp.download(dir, fileName, out); + return out.toByteArray(); + } + + private String getFilePath(String path) { + return config.getBasePath() + path; + } + +} \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClientConfig.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClientConfig.java new file mode 100644 index 0000000..1b07599 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClientConfig.java @@ -0,0 +1,59 @@ +package com.jojubanking.boot.framework.file.core.client.ftp; + +import com.jojubanking.boot.framework.file.core.client.FileClientConfig; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * Ftp 文件客户端的配置类 + * + * @author TW + */ +@Data +public class FtpFileClientConfig implements FileClientConfig { + + /** + * 基础路径 + */ + @NotEmpty(message = "基础路径不能为空") + private String basePath; + + /** + * 自定义域名 + */ + @NotEmpty(message = "domain 不能为空") + @URL(message = "domain 必须是 URL 格式") + private String domain; + + /** + * 主机地址 + */ + @NotEmpty(message = "host 不能为空") + private String host; + /** + * 主机端口 + */ + @NotNull(message = "port 不能为空") + private Integer port; + /** + * 用户名 + */ + @NotEmpty(message = "用户名不能为空") + private String username; + /** + * 密码 + */ + @NotEmpty(message = "密码不能为空") + private String password; + /** + * 连接模式 + * + * 使用 {@link cn.hutool.extra.ftp.FtpMode} 对应的字符串 + */ + @NotEmpty(message = "连接模式不能为空") + private String mode; + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/local/LocalFileClient.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/local/LocalFileClient.java new file mode 100644 index 0000000..f9e2e34 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/local/LocalFileClient.java @@ -0,0 +1,52 @@ +package com.jojubanking.boot.framework.file.core.client.local; + +import cn.hutool.core.io.FileUtil; +import com.jojubanking.boot.framework.file.core.client.AbstractFileClient; + +import java.io.File; + +/** + * 本地文件客户端 + * + * @author TW + */ +public class LocalFileClient extends AbstractFileClient { + + public LocalFileClient(Long id, LocalFileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + // 补全风格。例如说 Linux 是 /,Windows 是 \ + if (!config.getBasePath().endsWith(File.separator)) { + config.setBasePath(config.getBasePath() + File.separator); + } + } + + @Override + public String upload(byte[] content, String path) { + // 执行写入 + String filePath = getFilePath(path); + FileUtil.writeBytes(content, filePath); + // 拼接返回路径 + return super.formatFileUrl(config.getDomain(), path); + } + + @Override + public void delete(String path) { + String filePath = getFilePath(path); + FileUtil.del(filePath); + } + + @Override + public byte[] getContent(String path) { + String filePath = getFilePath(path); + return FileUtil.readBytes(filePath); + } + + private String getFilePath(String path) { + return config.getBasePath() + path; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/local/LocalFileClientConfig.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/local/LocalFileClientConfig.java new file mode 100644 index 0000000..383ce42 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/local/LocalFileClientConfig.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.framework.file.core.client.local; + +import com.jojubanking.boot.framework.file.core.client.FileClientConfig; +import lombok.Data; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.NotEmpty; + +/** + * 本地文件客户端的配置类 + * + * @author TW + */ +@Data +@Accessors(chain = true) +public class LocalFileClientConfig implements FileClientConfig { + + /** + * 基础路径 + */ + @NotEmpty(message = "基础路径不能为空") + private String basePath; + + /** + * 自定义域名 + */ + @NotEmpty(message = "domain 不能为空") + @URL(message = "domain 必须是 URL 格式") + private String domain; + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/s3/S3FileClient.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/s3/S3FileClient.java new file mode 100644 index 0000000..8d1717e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/s3/S3FileClient.java @@ -0,0 +1,112 @@ +package com.jojubanking.boot.framework.file.core.client.s3; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import com.jojubanking.boot.framework.file.core.client.AbstractFileClient; +import io.minio.*; + +import java.io.ByteArrayInputStream; + +import static com.jojubanking.boot.framework.file.core.client.s3.S3FileClientConfig.ENDPOINT_ALIYUN; + +/** + * 基于 S3 协议的文件客户端,实现 MinIO、阿里云、腾讯云、七牛云、华为云等云服务 + * + * S3 协议的客户端,采用亚马逊提供的 software.amazon.awssdk.s3 库 + * + * @author TW + */ +public class S3FileClient extends AbstractFileClient { + + private MinioClient client; + + public S3FileClient(Long id, S3FileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + // 补全 domain + if (StrUtil.isEmpty(config.getDomain())) { + config.setDomain(buildDomain()); + } + // 初始化客户端 + client = MinioClient.builder() + .endpoint(buildEndpointURL()) // Endpoint URL + .region(buildRegion()) // Region + .credentials(config.getAccessKey(), config.getAccessSecret()) // 认证密钥 + .build(); + } + + /** + * 基于 endpoint 构建调用云服务的 URL 地址 + * + * @return URI 地址 + */ + private String buildEndpointURL() { + // 如果已经是 http 或者 https,则不进行拼接.主要适配 MinIO + if (HttpUtil.isHttp(config.getEndpoint()) || HttpUtil.isHttps(config.getEndpoint())) { + return config.getEndpoint(); + } + return StrUtil.format("https://{}", config.getEndpoint()); + } + + /** + * 基于 bucket + endpoint 构建访问的 Domain 地址 + * + * @return Domain 地址 + */ + private String buildDomain() { + // 如果已经是 http 或者 https,则不进行拼接.主要适配 MinIO + if (HttpUtil.isHttp(config.getEndpoint()) || HttpUtil.isHttps(config.getEndpoint())) { + return StrUtil.format("{}/{}", config.getEndpoint(), config.getBucket()); + } + // 阿里云、腾讯云、华为云都适合。七牛云比较特殊,必须有自定义域名 + return StrUtil.format("https://{}.{}", config.getBucket(), config.getEndpoint()); + } + + /** + * 基于 bucket 构建 region 地区 + * + * @return region 地区 + */ + private String buildRegion() { + // 阿里云必须有 region,否则会报错 + if (config.getEndpoint().contains(ENDPOINT_ALIYUN)) { + return StrUtil.subBefore(config.getEndpoint(), '.', false) + .replaceAll("-internal", ""); // 去除内网 Endpoint 的后缀 + } + return null; + } + + @Override + public String upload(byte[] content, String path) throws Exception { + // 执行上传 + client.putObject(PutObjectArgs.builder() + .bucket(config.getBucket()) // bucket 必须传递 + .object(path) // 相对路径作为 key + .stream(new ByteArrayInputStream(content), content.length, -1) // 文件内容 + .build()); + // 拼接返回路径 + return config.getDomain() + "/" + path; + } + + @Override + public void delete(String path) throws Exception { + client.removeObject(RemoveObjectArgs.builder() + .bucket(config.getBucket()) // bucket 必须传递 + .object(path) // 相对路径作为 key + .build()); + } + + @Override + public byte[] getContent(String path) throws Exception { + GetObjectResponse response = client.getObject(GetObjectArgs.builder() + .bucket(config.getBucket()) // bucket 必须传递 + .object(path) // 相对路径作为 key + .build()); + return IoUtil.readBytes(response); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/s3/S3FileClientConfig.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/s3/S3FileClientConfig.java new file mode 100644 index 0000000..8ec2791 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/s3/S3FileClientConfig.java @@ -0,0 +1,76 @@ +package com.jojubanking.boot.framework.file.core.client.s3; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.file.core.client.FileClientConfig; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.NotNull; + +/** + * S3 文件客户端的配置类 + * + * @author TW + */ +@Data +public class S3FileClientConfig implements FileClientConfig { + + public static final String ENDPOINT_QINIU = "qiniucs.com"; + public static final String ENDPOINT_ALIYUN = "aliyuncs.com"; + + /** + * 节点地址 + * 1. MinIO:https://www.iocoder.cn/Spring-Boot/MinIO 。例如说,http://127.0.0.1:9000 + * 2. 阿里云:https://help.aliyun.com/document_detail/31837.html + * 3. 腾讯云:https://cloud.tencent.com/document/product/436/6224 + * 4. 七牛云:https://developer.qiniu.com/kodo/4088/s3-access-domainname + * 5. 华为云:https://developer.huaweicloud.com/endpoint?OBS + */ + @NotNull(message = "endpoint 不能为空") + private String endpoint; + /** + * 自定义域名 + * 1. MinIO:通过 Nginx 配置 + * 2. 阿里云:https://help.aliyun.com/document_detail/31836.html + * 3. 腾讯云:https://cloud.tencent.com/document/product/436/11142 + * 4. 七牛云:https://developer.qiniu.com/kodo/8556/set-the-custom-source-domain-name + * 5. 华为云:https://support.huaweicloud.com/usermanual-obs/obs_03_0032.html + */ + @URL(message = "domain 必须是 URL 格式") + private String domain; + /** + * 存储 Bucket + */ + @NotNull(message = "bucket 不能为空") + private String bucket; + + /** + * 访问 Key + * 1. MinIO:https://www.iocoder.cn/Spring-Boot/MinIO + * 2. 阿里云:https://ram.console.aliyun.com/manage/ak + * 3. 腾讯云:https://console.cloud.tencent.com/cam/capi + * 4. 七牛云:https://portal.qiniu.com/user/key + * 5. 华为云:https://support.huaweicloud.com/qs-obs/obs_qs_0005.html + */ + @NotNull(message = "accessKey 不能为空") + private String accessKey; + /** + * 访问 Secret + */ + @NotNull(message = "accessSecret 不能为空") + private String accessSecret; + + @SuppressWarnings("RedundantIfStatement") + @AssertTrue(message = "domain 不能为空") + @JsonIgnore + public boolean isDomainValid() { + // 如果是七牛,必须带有 domain + if (StrUtil.contains(endpoint, ENDPOINT_QINIU) && StrUtil.isEmpty(domain)) { + return false; + } + return true; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClient.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClient.java new file mode 100644 index 0000000..2e25764 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClient.java @@ -0,0 +1,61 @@ +package com.jojubanking.boot.framework.file.core.client.sftp; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.extra.ssh.Sftp; +import com.jojubanking.boot.framework.common.util.io.FileUtils; +import com.jojubanking.boot.framework.file.core.client.AbstractFileClient; + +import java.io.File; + +/** + * Sftp 文件客户端 + * + * @author TW + */ +public class SftpFileClient extends AbstractFileClient { + + private Sftp sftp; + + public SftpFileClient(Long id, SftpFileClientConfig config) { + super(id, config); + } + + @Override + protected void doInit() { + // 补全风格。例如说 Linux 是 /,Windows 是 \ + if (!config.getBasePath().endsWith(File.separator)) { + config.setBasePath(config.getBasePath() + File.separator); + } + // 初始化 Ftp 对象 + this.sftp = new Sftp(config.getHost(), config.getPort(), config.getUsername(), config.getPassword()); + } + + @Override + public String upload(byte[] content, String path) { + // 执行写入 + String filePath = getFilePath(path); + File file = FileUtils.createTempFile(content); + sftp.upload(filePath, file); + // 拼接返回路径 + return super.formatFileUrl(config.getDomain(), path); + } + + @Override + public void delete(String path) { + String filePath = getFilePath(path); + sftp.delFile(filePath); + } + + @Override + public byte[] getContent(String path) { + String filePath = getFilePath(path); + File destFile = FileUtils.createTempFile(); + sftp.download(filePath, destFile); + return FileUtil.readBytes(destFile); + } + + private String getFilePath(String path) { + return config.getBasePath() + path; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClientConfig.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClientConfig.java new file mode 100644 index 0000000..3971f55 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClientConfig.java @@ -0,0 +1,52 @@ +package com.jojubanking.boot.framework.file.core.client.sftp; + +import com.jojubanking.boot.framework.file.core.client.FileClientConfig; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * Sftp 文件客户端的配置类 + * + * @author TW + */ +@Data +public class SftpFileClientConfig implements FileClientConfig { + + /** + * 基础路径 + */ + @NotEmpty(message = "基础路径不能为空") + private String basePath; + + /** + * 自定义域名 + */ + @NotEmpty(message = "domain 不能为空") + @URL(message = "domain 必须是 URL 格式") + private String domain; + + /** + * 主机地址 + */ + @NotEmpty(message = "host 不能为空") + private String host; + /** + * 主机端口 + */ + @NotNull(message = "port 不能为空") + private Integer port; + /** + * 用户名 + */ + @NotEmpty(message = "用户名不能为空") + private String username; + /** + * 密码 + */ + @NotEmpty(message = "密码不能为空") + private String password; + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/enums/FileStorageEnum.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/enums/FileStorageEnum.java new file mode 100644 index 0000000..96a2269 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/enums/FileStorageEnum.java @@ -0,0 +1,55 @@ +package com.jojubanking.boot.framework.file.core.enums; + +import cn.hutool.core.util.ArrayUtil; +import com.jojubanking.boot.framework.file.core.client.FileClient; +import com.jojubanking.boot.framework.file.core.client.FileClientConfig; +import com.jojubanking.boot.framework.file.core.client.db.DBFileClient; +import com.jojubanking.boot.framework.file.core.client.db.DBFileClientConfig; +import com.jojubanking.boot.framework.file.core.client.ftp.FtpFileClient; +import com.jojubanking.boot.framework.file.core.client.ftp.FtpFileClientConfig; +import com.jojubanking.boot.framework.file.core.client.local.LocalFileClient; +import com.jojubanking.boot.framework.file.core.client.local.LocalFileClientConfig; +import com.jojubanking.boot.framework.file.core.client.s3.S3FileClient; +import com.jojubanking.boot.framework.file.core.client.s3.S3FileClientConfig; +import com.jojubanking.boot.framework.file.core.client.sftp.SftpFileClient; +import com.jojubanking.boot.framework.file.core.client.sftp.SftpFileClientConfig; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 文件存储器枚举 + * + * @author TW + */ +@AllArgsConstructor +@Getter +public enum FileStorageEnum { + + DB(1, DBFileClientConfig.class, DBFileClient.class), + + LOCAL(10, LocalFileClientConfig.class, LocalFileClient.class), + FTP(11, FtpFileClientConfig.class, FtpFileClient.class), + SFTP(12, SftpFileClientConfig.class, SftpFileClient.class), + + S3(20, S3FileClientConfig.class, S3FileClient.class), + ; + + /** + * 存储器 + */ + private final Integer storage; + + /** + * 配置类 + */ + private final Class configClass; + /** + * 客户端类 + */ + private final Class clientClass; + + public static FileStorageEnum getByStorage(Integer storage) { + return ArrayUtil.firstMatch(o -> o.getStorage().equals(storage), values()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/utils/FileTypeUtils.java b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/utils/FileTypeUtils.java new file mode 100644 index 0000000..30210f2 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/java/com/jojubanking/boot/framework/file/core/utils/FileTypeUtils.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.framework.file.core.utils; + +import com.alibaba.ttl.TransmittableThreadLocal; +import lombok.SneakyThrows; +import org.apache.tika.Tika; + +/** + * 文件类型 Utils + * + * @author TW + */ +public class FileTypeUtils { + + private static final ThreadLocal TIKA = TransmittableThreadLocal.withInitial(Tika::new); + + /** + * 获得文件的 mineType,对于doc,jar等文件会有误差 + * + * @param data 文件内容 + * @return mineType 无法识别时会返回“application/octet-stream” + */ + @SneakyThrows + public static String getMineType(byte[] data) { + return TIKA.get().detect(data); + } + + /** + * 已知文件名,获取文件类型,在某些情况下比通过字节数组准确,例如使用jar文件时,通过名字更为准确 + * + * @param name 文件名 + * @return mineType 无法识别时会返回“application/octet-stream” + */ + public static String getMineType(String name) { + return TIKA.get().detect(name); + } + + /** + * 在拥有文件和数据的情况下,最好使用此方法,最为准确 + * + * @param data 文件内容 + * @param name 文件名 + * @return mineType 无法识别时会返回“application/octet-stream” + */ + public static String getMineType(byte[] data, String name) { + return TIKA.get().detect(data, name); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-file/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..8f60271 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.file.config.JojuFileAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/config/package-info.java b/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/config/package-info.java new file mode 100644 index 0000000..a0193eb --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/config/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位,避免 package 无法提交到 Git 仓库 + */ +package com.jojubanking.boot.framework.file.config; diff --git a/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClientTest.java b/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClientTest.java new file mode 100644 index 0000000..fd879ef --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClientTest.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.framework.file.core.client.ftp; + +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.extra.ftp.FtpMode; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +public class FtpFileClientTest { + + @Test + @Disabled + public void test() { + // 创建客户端 + FtpFileClientConfig config = new FtpFileClientConfig(); + config.setDomain("http://127.0.0.1:48080"); + config.setBasePath("/home/ftp"); + config.setHost("kanchai.club"); + config.setPort(221); + config.setUsername(""); + config.setPassword(""); + config.setMode(FtpMode.Passive.name()); + FtpFileClient client = new FtpFileClient(0L, config); + client.init(); + // 上传文件 + String path = IdUtil.fastSimpleUUID() + ".jpg"; + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + String fullPath = client.upload(content, path); + System.out.println("访问地址:" + fullPath); + if (false) { + byte[] bytes = client.getContent(path); + System.out.println("文件内容:" + bytes); + } + if (false) { + client.delete(path); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/client/local/LocalFileClientTest.java b/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/client/local/LocalFileClientTest.java new file mode 100644 index 0000000..4be1e33 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/client/local/LocalFileClientTest.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.framework.file.core.client.local; + +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.util.IdUtil; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +public class LocalFileClientTest { + + @Test + @Disabled + public void test() { + // 创建客户端 + LocalFileClientConfig config = new LocalFileClientConfig(); + config.setDomain("http://127.0.0.1:48080"); + config.setBasePath("/Users/yunai/file_test"); + LocalFileClient client = new LocalFileClient(0L, config); + client.init(); + // 上传文件 + String path = IdUtil.fastSimpleUUID() + ".jpg"; + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + String fullPath = client.upload(content, path); + System.out.println("访问地址:" + fullPath); + client.delete(path); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/client/s3/S3FileClientTest.java b/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/client/s3/S3FileClientTest.java new file mode 100644 index 0000000..1d75fdd --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/client/s3/S3FileClientTest.java @@ -0,0 +1,117 @@ +package com.jojubanking.boot.framework.file.core.client.s3; + +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.util.IdUtil; +import com.jojubanking.boot.framework.common.util.validation.ValidationUtils; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import javax.validation.Validation; + +public class S3FileClientTest { + + @Test + @Disabled // MinIO,如果要集成测试,可以注释本行 + public void testMinIO() throws Exception { + S3FileClientConfig config = new S3FileClientConfig(); + // 配置成你自己的 + config.setAccessKey("admin"); + config.setAccessSecret("password"); + config.setBucket("jojuyuanma"); + config.setDomain(null); + // 默认 9000 endpoint + config.setEndpoint("http://127.0.0.1:9000"); + + // 执行上传 + testExecuteUpload(config); + } + + @Test + @Disabled // 阿里云 OSS,如果要集成测试,可以注释本行 + public void testAliyun() throws Exception { + S3FileClientConfig config = new S3FileClientConfig(); + // 配置成你自己的 + config.setAccessKey(System.getenv("ALIYUN_ACCESS_KEY")); + config.setAccessSecret(System.getenv("ALIYUN_SECRET_KEY")); + config.setBucket("yunai-aoteman"); + config.setDomain(null); // 如果有自定义域名,则可以设置。http://ali-oss.iocoder.cn + // 默认北京的 endpoint + config.setEndpoint("oss-cn-beijing.aliyuncs.com"); + + // 执行上传 + testExecuteUpload(config); + } + + @Test + @Disabled // 腾讯云 COS,如果要集成测试,可以注释本行 + public void testQCloud() throws Exception { + S3FileClientConfig config = new S3FileClientConfig(); + // 配置成你自己的 + config.setAccessKey(System.getenv("QCLOUD_ACCESS_KEY")); + config.setAccessSecret(System.getenv("QCLOUD_SECRET_KEY")); + config.setBucket("aoteman-1255880240"); + config.setDomain(null); // 如果有自定义域名,则可以设置。http://tengxun-oss.iocoder.cn + // 默认上海的 endpoint + config.setEndpoint("cos.ap-shanghai.myqcloud.com"); + + // 执行上传 + testExecuteUpload(config); + } + + @Test + @Disabled // 七牛云存储,如果要集成测试,可以注释本行 + public void testQiniu() throws Exception { + S3FileClientConfig config = new S3FileClientConfig(); + // 配置成你自己的 +// config.setAccessKey(System.getenv("QINIU_ACCESS_KEY")); +// config.setAccessSecret(System.getenv("QINIU_SECRET_KEY")); + config.setAccessKey("b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8"); + config.setAccessSecret("kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP"); + config.setBucket("ruoyi-vue-pro"); + config.setDomain("http://test.joju.iocoder.cn"); // 如果有自定义域名,则可以设置。http://static.joju.iocoder.cn + // 默认上海的 endpoint + config.setEndpoint("s3-cn-south-1.qiniucs.com"); + + // 执行上传 + testExecuteUpload(config); + } + + @Test + @Disabled // 华为云存储,如果要集成测试,可以注释本行 + public void testHuaweiCloud() throws Exception { + S3FileClientConfig config = new S3FileClientConfig(); + // 配置成你自己的 +// config.setAccessKey(System.getenv("HUAWEI_CLOUD_ACCESS_KEY")); +// config.setAccessSecret(System.getenv("HUAWEI_CLOUD_SECRET_KEY")); + config.setBucket("joju"); + config.setDomain(null); // 如果有自定义域名,则可以设置。 + // 默认上海的 endpoint + config.setEndpoint("obs.cn-east-3.myhuaweicloud.com"); + + // 执行上传 + testExecuteUpload(config); + } + + private void testExecuteUpload(S3FileClientConfig config) throws Exception { + // 校验配置 + ValidationUtils.validate(Validation.buildDefaultValidatorFactory().getValidator(), config); + // 创建 Client + S3FileClient client = new S3FileClient(0L, config); + client.init(); + // 上传文件 + String path = IdUtil.fastSimpleUUID() + ".jpg"; + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + String fullPath = client.upload(content, path); + System.out.println("访问地址:" + fullPath); + // 读取文件 + if (true) { + byte[] bytes = client.getContent(path); + System.out.println("文件内容:" + bytes.length); + } + // 删除文件 + if (false) { + client.delete(path); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClientTest.java b/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClientTest.java new file mode 100644 index 0000000..d945b72 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClientTest.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.framework.file.core.client.sftp; + +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.util.IdUtil; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +public class SftpFileClientTest { + + @Test + @Disabled + public void test() { + // 创建客户端 + SftpFileClientConfig config = new SftpFileClientConfig(); + config.setDomain("http://127.0.0.1:48080"); + config.setBasePath("/home/ftp"); + config.setHost("kanchai.club"); + config.setPort(222); + config.setUsername(""); + config.setPassword(""); + SftpFileClient client = new SftpFileClient(0L, config); + client.init(); + // 上传文件 + String path = IdUtil.fastSimpleUUID() + ".jpg"; + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + String fullPath = client.upload(content, path); + System.out.println("访问地址:" + fullPath); + if (false) { + byte[] bytes = client.getContent(path); + System.out.println("文件内容:" + bytes); + } + if (false) { + client.delete(path); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/enums/package-info.java b/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/enums/package-info.java new file mode 100644 index 0000000..65e015d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/src/test/java/com/jojubanking/boot/framework/file/core/enums/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位,避免 package 无法提交到 Git 仓库 + */ +package com.jojubanking.boot.framework.file.core.enums; diff --git a/joju-framework/joju-spring-boot-starter-file/src/test/resources/file/erweima.jpg b/joju-framework/joju-spring-boot-starter-file/src/test/resources/file/erweima.jpg new file mode 100644 index 0000000..1447283 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/src/test/resources/file/erweima.jpg differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-file/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..8f60271 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.file.config.JojuFileAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/config/JojuFileAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/config/JojuFileAutoConfiguration.class new file mode 100644 index 0000000..87f4c4f Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/config/JojuFileAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/AbstractFileClient.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/AbstractFileClient.class new file mode 100644 index 0000000..ecd7843 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/AbstractFileClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/FileClient.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/FileClient.class new file mode 100644 index 0000000..4d99d27 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/FileClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/FileClientConfig.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/FileClientConfig.class new file mode 100644 index 0000000..f04afb6 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/FileClientConfig.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/FileClientFactory.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/FileClientFactory.class new file mode 100644 index 0000000..d5fbd75 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/FileClientFactory.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/FileClientFactoryImpl.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/FileClientFactoryImpl.class new file mode 100644 index 0000000..8fb8346 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/FileClientFactoryImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/db/DBFileClient.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/db/DBFileClient.class new file mode 100644 index 0000000..be6dbd3 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/db/DBFileClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/db/DBFileClientConfig.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/db/DBFileClientConfig.class new file mode 100644 index 0000000..1c30697 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/db/DBFileClientConfig.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/db/DBFileContentFrameworkDAO.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/db/DBFileContentFrameworkDAO.class new file mode 100644 index 0000000..efbdba0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/db/DBFileContentFrameworkDAO.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClient.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClient.class new file mode 100644 index 0000000..da2560e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClientConfig.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClientConfig.class new file mode 100644 index 0000000..ee4430c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClientConfig.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/local/LocalFileClient.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/local/LocalFileClient.class new file mode 100644 index 0000000..53acd54 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/local/LocalFileClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/local/LocalFileClientConfig.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/local/LocalFileClientConfig.class new file mode 100644 index 0000000..6bc1f67 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/local/LocalFileClientConfig.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/s3/S3FileClient.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/s3/S3FileClient.class new file mode 100644 index 0000000..204a282 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/s3/S3FileClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/s3/S3FileClientConfig.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/s3/S3FileClientConfig.class new file mode 100644 index 0000000..4055743 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/s3/S3FileClientConfig.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClient.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClient.class new file mode 100644 index 0000000..ae776aa Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClient.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClientConfig.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClientConfig.class new file mode 100644 index 0000000..0d80e21 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClientConfig.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/enums/FileStorageEnum.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/enums/FileStorageEnum.class new file mode 100644 index 0000000..d6b6277 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/enums/FileStorageEnum.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/utils/FileTypeUtils.class b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/utils/FileTypeUtils.class new file mode 100644 index 0000000..504bdc0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/classes/com/jojubanking/boot/framework/file/core/utils/FileTypeUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/joju-spring-boot-starter-file-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-file/target/joju-spring-boot-starter-file-2.0.0-beta.jar new file mode 100644 index 0000000..9cf0c2e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/joju-spring-boot-starter-file-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-file/target/maven-archiver/pom.properties new file mode 100644 index 0000000..cfe904b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:41 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-file diff --git a/joju-framework/joju-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..07358bc --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,19 @@ +com\jojubanking\boot\framework\file\core\client\s3\S3FileClient.class +com\jojubanking\boot\framework\file\core\client\sftp\SftpFileClient.class +com\jojubanking\boot\framework\file\core\client\ftp\FtpFileClientConfig.class +com\jojubanking\boot\framework\file\core\client\db\DBFileClientConfig.class +com\jojubanking\boot\framework\file\core\client\ftp\FtpFileClient.class +com\jojubanking\boot\framework\file\core\client\sftp\SftpFileClientConfig.class +com\jojubanking\boot\framework\file\core\client\db\DBFileClient.class +com\jojubanking\boot\framework\file\core\client\local\LocalFileClientConfig.class +com\jojubanking\boot\framework\file\core\client\s3\S3FileClientConfig.class +com\jojubanking\boot\framework\file\core\utils\FileTypeUtils.class +com\jojubanking\boot\framework\file\core\client\FileClientFactoryImpl.class +com\jojubanking\boot\framework\file\core\client\local\LocalFileClient.class +com\jojubanking\boot\framework\file\core\client\FileClientFactory.class +com\jojubanking\boot\framework\file\core\client\FileClientConfig.class +com\jojubanking\boot\framework\file\config\JojuFileAutoConfiguration.class +com\jojubanking\boot\framework\file\core\client\AbstractFileClient.class +com\jojubanking\boot\framework\file\core\client\FileClient.class +com\jojubanking\boot\framework\file\core\client\db\DBFileContentFrameworkDAO.class +com\jojubanking\boot\framework\file\core\enums\FileStorageEnum.class diff --git a/joju-framework/joju-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..014867a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,19 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\ftp\FtpFileClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\utils\FileTypeUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\enums\FileStorageEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\db\DBFileContentFrameworkDAO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\FileClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\s3\S3FileClientConfig.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\sftp\SftpFileClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\FileClientFactory.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\ftp\FtpFileClientConfig.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\db\DBFileClientConfig.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\db\DBFileClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\FileClientFactoryImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\s3\S3FileClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\sftp\SftpFileClientConfig.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\local\LocalFileClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\FileClientConfig.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\config\JojuFileAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\AbstractFileClient.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-framework\joju-spring-boot-starter-file\src\main\java\com\jojubanking\boot\framework\file\core\client\local\LocalFileClientConfig.java diff --git a/joju-framework/joju-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..bdc6a65 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1,4 @@ +com\jojubanking\boot\framework\file\core\client\ftp\FtpFileClientTest.class +com\jojubanking\boot\framework\file\core\client\local\LocalFileClientTest.class +com\jojubanking\boot\framework\file\core\client\sftp\SftpFileClientTest.class +com\jojubanking\boot\framework\file\core\client\s3\S3FileClientTest.class diff --git a/joju-framework/joju-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..6becde1 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-file/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1,6 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-file\src\test\java\com\jojubanking\boot\framework\file\core\client\ftp\FtpFileClientTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-file\src\test\java\com\jojubanking\boot\framework\file\core\client\sftp\SftpFileClientTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-file\src\test\java\com\jojubanking\boot\framework\file\core\client\s3\S3FileClientTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-file\src\test\java\com\jojubanking\boot\framework\file\core\enums\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-file\src\test\java\com\jojubanking\boot\framework\file\core\client\local\LocalFileClientTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-file\src\test\java\com\jojubanking\boot\framework\file\config\package-info.java diff --git a/joju-framework/joju-spring-boot-starter-file/target/test-classes/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClientTest.class b/joju-framework/joju-spring-boot-starter-file/target/test-classes/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClientTest.class new file mode 100644 index 0000000..b3e0fb7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/test-classes/com/jojubanking/boot/framework/file/core/client/ftp/FtpFileClientTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/test-classes/com/jojubanking/boot/framework/file/core/client/local/LocalFileClientTest.class b/joju-framework/joju-spring-boot-starter-file/target/test-classes/com/jojubanking/boot/framework/file/core/client/local/LocalFileClientTest.class new file mode 100644 index 0000000..d6b5587 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/test-classes/com/jojubanking/boot/framework/file/core/client/local/LocalFileClientTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/test-classes/com/jojubanking/boot/framework/file/core/client/s3/S3FileClientTest.class b/joju-framework/joju-spring-boot-starter-file/target/test-classes/com/jojubanking/boot/framework/file/core/client/s3/S3FileClientTest.class new file mode 100644 index 0000000..5779fe7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/test-classes/com/jojubanking/boot/framework/file/core/client/s3/S3FileClientTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/test-classes/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClientTest.class b/joju-framework/joju-spring-boot-starter-file/target/test-classes/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClientTest.class new file mode 100644 index 0000000..0851d04 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/test-classes/com/jojubanking/boot/framework/file/core/client/sftp/SftpFileClientTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-file/target/test-classes/file/erweima.jpg b/joju-framework/joju-spring-boot-starter-file/target/test-classes/file/erweima.jpg new file mode 100644 index 0000000..1447283 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-file/target/test-classes/file/erweima.jpg differ diff --git a/joju-framework/joju-spring-boot-starter-job/joju-spring-boot-starter-job.iml b/joju-framework/joju-spring-boot-starter-job/joju-spring-boot-starter-job.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/joju-spring-boot-starter-job.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-job/pom.xml b/joju-framework/joju-spring-boot-starter-job/pom.xml new file mode 100644 index 0000000..572c012 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/pom.xml @@ -0,0 +1,41 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-job + jar + + ${project.artifactId} + 任务拓展 + 1. 定时任务,基于 Quartz 拓展 + 2. 异步任务,基于 Spring Async 拓展 + + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + org.springframework.boot + spring-boot-starter-quartz + + + + + jakarta.validation + jakarta.validation-api + + + + + diff --git a/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/config/JojuAsyncAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/config/JojuAsyncAutoConfiguration.java new file mode 100644 index 0000000..140444a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/config/JojuAsyncAutoConfiguration.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.framework.quartz.config; + +import com.alibaba.ttl.TtlRunnable; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +/** + * 异步任务 Configuration + */ +@Configuration +@EnableAsync +public class JojuAsyncAutoConfiguration { + + @Bean + public BeanPostProcessor threadPoolTaskExecutorBeanPostProcessor() { + return new BeanPostProcessor() { + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if (!(bean instanceof ThreadPoolTaskExecutor)) { + return bean; + } + // 修改提交的任务,接入 TransmittableThreadLocal + ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) bean; + executor.setTaskDecorator(TtlRunnable::get); + return executor; + } + + }; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/config/JojuQuartzAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/config/JojuQuartzAutoConfiguration.java new file mode 100644 index 0000000..384d683 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/config/JojuQuartzAutoConfiguration.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.framework.quartz.config; + +import com.jojubanking.boot.framework.quartz.core.scheduler.SchedulerManager; +import org.quartz.Scheduler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * 定时任务 Configuration + */ +@Configuration +@EnableScheduling // 开启 Spring 自带的定时任务 +public class JojuQuartzAutoConfiguration { + + @Bean + public SchedulerManager schedulerManager(Scheduler scheduler) { + return new SchedulerManager(scheduler); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/enums/JobDataKeyEnum.java b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/enums/JobDataKeyEnum.java new file mode 100644 index 0000000..caa92b6 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/enums/JobDataKeyEnum.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.framework.quartz.core.enums; + +/** + * Quartz Job Data 的 key 枚举 + */ +public enum JobDataKeyEnum { + + JOB_ID, + JOB_HANDLER_NAME, + JOB_HANDLER_PARAM, + JOB_RETRY_COUNT, // 最大重试次数 + JOB_RETRY_INTERVAL, // 每次重试间隔 + +} diff --git a/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/handler/JobHandler.java b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/handler/JobHandler.java new file mode 100644 index 0000000..6500318 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/handler/JobHandler.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.framework.quartz.core.handler; + +/** + * 任务处理器 + * + * @author TW + */ +public interface JobHandler { + + /** + * 执行任务 + * + * @param param 参数 + * @return 结果 + * @throws Exception 异常 + */ + String execute(String param) throws Exception; + +} diff --git a/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/handler/JobHandlerInvoker.java b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/handler/JobHandlerInvoker.java new file mode 100644 index 0000000..fc6128c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/handler/JobHandlerInvoker.java @@ -0,0 +1,113 @@ +package com.jojubanking.boot.framework.quartz.core.handler; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.thread.ThreadUtil; +import com.jojubanking.boot.framework.quartz.core.enums.JobDataKeyEnum; +import com.jojubanking.boot.framework.quartz.core.service.JobLogFrameworkService; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.quartz.PersistJobDataAfterExecution; +import org.springframework.context.ApplicationContext; +import org.springframework.scheduling.quartz.QuartzJobBean; + +import javax.annotation.Resource; +import java.util.Date; + +import static cn.hutool.core.exceptions.ExceptionUtil.getRootCauseMessage; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.diff; + +/** + * 基础 Job 调用者,负责调用 {@link JobHandler#execute(String)} 执行任务 + * + * @author TW + */ +@DisallowConcurrentExecution +@PersistJobDataAfterExecution +@Slf4j +public class JobHandlerInvoker extends QuartzJobBean { + + @Resource + private ApplicationContext applicationContext; + + @Resource + private JobLogFrameworkService jobLogFrameworkService; + + @Override + protected void executeInternal(JobExecutionContext executionContext) throws JobExecutionException { + // 第一步,获得 Job 数据 + Long jobId = executionContext.getMergedJobDataMap().getLong(JobDataKeyEnum.JOB_ID.name()); + String jobHandlerName = executionContext.getMergedJobDataMap().getString(JobDataKeyEnum.JOB_HANDLER_NAME.name()); + String jobHandlerParam = executionContext.getMergedJobDataMap().getString(JobDataKeyEnum.JOB_HANDLER_PARAM.name()); + int refireCount = executionContext.getRefireCount(); + int retryCount = (Integer) executionContext.getMergedJobDataMap().getOrDefault(JobDataKeyEnum.JOB_RETRY_COUNT.name(), 0); + int retryInterval = (Integer) executionContext.getMergedJobDataMap().getOrDefault(JobDataKeyEnum.JOB_RETRY_INTERVAL.name(), 0); + + // 第二步,执行任务 + Long jobLogId = null; + Date startTime = new Date(); + String data = null; + Throwable exception = null; + try { + // 记录 Job 日志(初始) + jobLogId = jobLogFrameworkService.createJobLog(jobId, startTime, jobHandlerName, jobHandlerParam, refireCount + 1); + // 执行任务 + data = this.executeInternal(jobHandlerName, jobHandlerParam); + } catch (Throwable ex) { + exception = ex; + } + + // 第三步,记录执行日志 + this.updateJobLogResultAsync(jobLogId, startTime, data, exception, executionContext); + + // 第四步,处理有异常的情况 + handleException(exception, refireCount, retryCount, retryInterval); + } + + private String executeInternal(String jobHandlerName, String jobHandlerParam) throws Exception { + // 获得 JobHandler 对象 + JobHandler jobHandler = applicationContext.getBean(jobHandlerName, JobHandler.class); + Assert.notNull(jobHandler, "JobHandler 不会为空"); + // 执行任务 + return jobHandler.execute(jobHandlerParam); + } + + private void updateJobLogResultAsync(Long jobLogId, Date startTime, String data, Throwable exception, + JobExecutionContext executionContext) { + Date endTime = new Date(); + // 处理是否成功 + boolean success = exception == null; + if (!success) { + data = getRootCauseMessage(exception); + } + // 更新日志 + try { + jobLogFrameworkService.updateJobLogResultAsync(jobLogId, endTime, (int) diff(endTime, startTime), success, data); + } catch (Exception ex) { + log.error("[executeInternal][Job({}) logId({}) 记录执行日志失败({}/{})]", + executionContext.getJobDetail().getKey(), jobLogId, success, data); + } + } + + private void handleException(Throwable exception, + int refireCount, int retryCount, int retryInterval) throws JobExecutionException { + // 如果有异常,则进行重试 + if (exception == null) { + return; + } + // 情况一:如果到达重试上限,则直接抛出异常即可 + if (refireCount >= retryCount) { + throw new JobExecutionException(exception); + } + + // 情况二:如果未到达重试上限,则 sleep 一定间隔时间,然后重试 + // 这里使用 sleep 来实现,主要还是希望实现比较简单。因为,同一时间,不会存在大量失败的 Job。 + if (retryInterval > 0) { + ThreadUtil.sleep(retryInterval); + } + // 第二个参数,refireImmediately = true,表示立即重试 + throw new JobExecutionException(exception, true); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/scheduler/SchedulerManager.java b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/scheduler/SchedulerManager.java new file mode 100644 index 0000000..7be4b49 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/scheduler/SchedulerManager.java @@ -0,0 +1,130 @@ +package com.jojubanking.boot.framework.quartz.core.scheduler; + +import com.jojubanking.boot.framework.quartz.core.enums.JobDataKeyEnum; +import com.jojubanking.boot.framework.quartz.core.handler.JobHandlerInvoker; +import org.quartz.*; + +/** + * {@link org.quartz.Scheduler} 的管理器,负责创建任务 + * + * 考虑到实现的简洁性,我们使用 jobHandlerName 作为唯一标识,即: + * 1. Job 的 {@link JobDetail#getKey()} + * 2. Trigger 的 {@link Trigger#getKey()} + * + * 另外,jobHandlerName 对应到 Spring Bean 的名字,直接调用 + * + * @author TW + */ +public class SchedulerManager { + + private final Scheduler scheduler; + + public SchedulerManager(Scheduler scheduler) { + this.scheduler = scheduler; + } + + /** + * 添加 Job 到 Quartz 中 + * + * @param jobId 任务编号 + * @param jobHandlerName 任务处理器的名字 + * @param jobHandlerParam 任务处理器的参数 + * @param cronExpression CRON 表达式 + * @param retryCount 重试次数 + * @param retryInterval 重试间隔 + * @throws SchedulerException 添加异常 + */ + public void addJob(Long jobId, String jobHandlerName, String jobHandlerParam, String cronExpression, + Integer retryCount, Integer retryInterval) + throws SchedulerException { + // 创建 JobDetail 对象 + JobDetail jobDetail = JobBuilder.newJob(JobHandlerInvoker.class) + .usingJobData(JobDataKeyEnum.JOB_ID.name(), jobId) + .usingJobData(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName) + .withIdentity(jobHandlerName).build(); + // 创建 Trigger 对象 + Trigger trigger = this.buildTrigger(jobHandlerName, jobHandlerParam, cronExpression, retryCount, retryInterval); + // 新增调度 + scheduler.scheduleJob(jobDetail, trigger); + } + + /** + * 更新 Job 到 Quartz + * + * @param jobHandlerName 任务处理器的名字 + * @param jobHandlerParam 任务处理器的参数 + * @param cronExpression CRON 表达式 + * @param retryCount 重试次数 + * @param retryInterval 重试间隔 + * @throws SchedulerException 更新异常 + */ + public void updateJob(String jobHandlerName, String jobHandlerParam, String cronExpression, + Integer retryCount, Integer retryInterval) + throws SchedulerException { + // 创建新 Trigger 对象 + Trigger newTrigger = this.buildTrigger(jobHandlerName, jobHandlerParam, cronExpression, retryCount, retryInterval); + // 修改调度 + scheduler.rescheduleJob(new TriggerKey(jobHandlerName), newTrigger); + } + + /** + * 删除 Quartz 中的 Job + * + * @param jobHandlerName 任务处理器的名字 + * @throws SchedulerException 删除异常 + */ + public void deleteJob(String jobHandlerName) throws SchedulerException { + scheduler.deleteJob(new JobKey(jobHandlerName)); + } + + /** + * 暂停 Quartz 中的 Job + * + * @param jobHandlerName 任务处理器的名字 + * @throws SchedulerException 暂停异常 + */ + public void pauseJob(String jobHandlerName) throws SchedulerException { + scheduler.pauseJob(new JobKey(jobHandlerName)); + } + + /** + * 启动 Quartz 中的 Job + * + * @param jobHandlerName 任务处理器的名字 + * @throws SchedulerException 启动异常 + */ + public void resumeJob(String jobHandlerName) throws SchedulerException { + scheduler.resumeJob(new JobKey(jobHandlerName)); + scheduler.resumeTrigger(new TriggerKey(jobHandlerName)); + } + + /** + * 立即触发一次 Quartz 中的 Job + * + * @param jobId 任务编号 + * @param jobHandlerName 任务处理器的名字 + * @param jobHandlerParam 任务处理器的参数 + * @throws SchedulerException 触发异常 + */ + public void triggerJob(Long jobId, String jobHandlerName, String jobHandlerParam) + throws SchedulerException { + JobDataMap data = new JobDataMap(); // 无需重试,所以不设置 retryCount 和 retryInterval + data.put(JobDataKeyEnum.JOB_ID.name(), jobId); + data.put(JobDataKeyEnum.JOB_HANDLER_NAME.name(), jobHandlerName); + data.put(JobDataKeyEnum.JOB_HANDLER_PARAM.name(), jobHandlerParam); + // 触发任务 + scheduler.triggerJob(new JobKey(jobHandlerName), data); + } + + private Trigger buildTrigger(String jobHandlerName, String jobHandlerParam, String cronExpression, + Integer retryCount, Integer retryInterval) { + return TriggerBuilder.newTrigger() + .withIdentity(jobHandlerName) + .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)) + .usingJobData(JobDataKeyEnum.JOB_HANDLER_PARAM.name(), jobHandlerParam) + .usingJobData(JobDataKeyEnum.JOB_RETRY_COUNT.name(), retryCount) + .usingJobData(JobDataKeyEnum.JOB_RETRY_INTERVAL.name(), retryInterval) + .build(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/service/JobLogFrameworkService.java b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/service/JobLogFrameworkService.java new file mode 100644 index 0000000..da5aad1 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/service/JobLogFrameworkService.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.framework.quartz.core.service; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * Job 日志 Framework Service 接口 + * + * @author TW + */ +public interface JobLogFrameworkService { + + /** + * 创建 Job 日志 + * + * @param jobId 任务编号 + * @param beginTime 开始时间 + * @param jobHandlerName Job 处理器的名字 + * @param jobHandlerParam Job 处理器的参数 + * @param executeIndex 第几次执行 + * @return Job 日志的编号 + */ + Long createJobLog(@NotNull(message = "任务编号不能为空") Long jobId, + @NotNull(message = "开始时间") Date beginTime, + @NotEmpty(message = "Job 处理器的名字不能为空") String jobHandlerName, + String jobHandlerParam, + @NotNull(message = "第几次执行不能为空") Integer executeIndex); + + /** + * 更新 Job 日志的执行结果 + * + * @param logId 日志编号 + * @param endTime 结束时间。因为是异步,避免记录时间不准去 + * @param duration 运行时长,单位:毫秒 + * @param success 是否成功 + * @param result 成功数据 + */ + void updateJobLogResultAsync(@NotNull(message = "日志编号不能为空") Long logId, + @NotNull(message = "结束时间不能为空") Date endTime, + @NotNull(message = "运行时长不能为空") Integer duration, + boolean success, String result); + +} diff --git a/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/util/CronUtils.java b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/util/CronUtils.java new file mode 100644 index 0000000..4dc5199 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/core/util/CronUtils.java @@ -0,0 +1,54 @@ +package com.jojubanking.boot.framework.quartz.core.util; + +import org.quartz.CronExpression; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * Quartz Cron 表达式的工具类 + * + * @author TW + */ +public class CronUtils { + + /** + * 校验 CRON 表达式是否有效 + * + * @param cronExpression CRON 表达式 + * @return 是否有效 + */ + public static boolean isValid(String cronExpression) { + return CronExpression.isValidExpression(cronExpression); + } + + /** + * 基于 CRON 表达式,获得下 n 个满足执行的时间 + * + * @param cronExpression CRON 表达式 + * @param n 数量 + * @return 满足条件的执行时间 + */ + public static List getNextTimes(String cronExpression, int n) { + // 获得 CronExpression 对象 + CronExpression cron; + try { + cron = new CronExpression(cronExpression); + } catch (ParseException e) { + throw new IllegalArgumentException(e.getMessage()); + } + // 从当前开始计算,n 个满足条件的 + Date now = new Date(); + List nextTimes = new ArrayList<>(n); + for (int i = 0; i < n; i++) { + Date nextTime = cron.getNextValidTimeAfter(now); + nextTimes.add(nextTime); + // 切换现在,为下一个触发时间; + now = nextTime; + } + return nextTimes; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/package-info.java b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/package-info.java new file mode 100644 index 0000000..72e08fd --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/src/main/java/com/jojubanking/boot/framework/quartz/package-info.java @@ -0,0 +1,7 @@ +/** + * 1. 定时任务,采用 Quartz 实现进程内的任务执行。 + * 考虑到高可用,使用 Quartz 自带的 MySQL 集群方案。 + * + * 2. 异步任务,采用 Spring Async 异步执行。 + */ +package com.jojubanking.boot.framework.quartz; diff --git a/joju-framework/joju-spring-boot-starter-job/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-job/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..aa0ce1d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.quartz.config.JojuQuartzAutoConfiguration,\ + com.jojubanking.boot.framework.quartz.config.JojuAsyncAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-job/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-job/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..aa0ce1d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/target/classes/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.quartz.config.JojuQuartzAutoConfiguration,\ + com.jojubanking.boot.framework.quartz.config.JojuAsyncAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/config/JojuAsyncAutoConfiguration$1.class b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/config/JojuAsyncAutoConfiguration$1.class new file mode 100644 index 0000000..d8e7ff0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/config/JojuAsyncAutoConfiguration$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/config/JojuAsyncAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/config/JojuAsyncAutoConfiguration.class new file mode 100644 index 0000000..43083f6 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/config/JojuAsyncAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/config/JojuQuartzAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/config/JojuQuartzAutoConfiguration.class new file mode 100644 index 0000000..16d03f7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/config/JojuQuartzAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/enums/JobDataKeyEnum.class b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/enums/JobDataKeyEnum.class new file mode 100644 index 0000000..08997f3 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/enums/JobDataKeyEnum.class differ diff --git a/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/handler/JobHandler.class b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/handler/JobHandler.class new file mode 100644 index 0000000..2a1d5a2 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/handler/JobHandler.class differ diff --git a/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/handler/JobHandlerInvoker.class b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/handler/JobHandlerInvoker.class new file mode 100644 index 0000000..1c9ac3a Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/handler/JobHandlerInvoker.class differ diff --git a/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/scheduler/SchedulerManager.class b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/scheduler/SchedulerManager.class new file mode 100644 index 0000000..e009a03 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/scheduler/SchedulerManager.class differ diff --git a/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/service/JobLogFrameworkService.class b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/service/JobLogFrameworkService.class new file mode 100644 index 0000000..fb9c594 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/service/JobLogFrameworkService.class differ diff --git a/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/util/CronUtils.class b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/util/CronUtils.class new file mode 100644 index 0000000..f024913 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-job/target/classes/com/jojubanking/boot/framework/quartz/core/util/CronUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-job/target/joju-spring-boot-starter-job-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-job/target/joju-spring-boot-starter-job-2.0.0-beta.jar new file mode 100644 index 0000000..d6c4069 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-job/target/joju-spring-boot-starter-job-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-job/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-job/target/maven-archiver/pom.properties new file mode 100644 index 0000000..082439c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:37 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-job diff --git a/joju-framework/joju-spring-boot-starter-job/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-job/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..b82352e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,9 @@ +com\jojubanking\boot\framework\quartz\core\scheduler\SchedulerManager.class +com\jojubanking\boot\framework\quartz\core\service\JobLogFrameworkService.class +com\jojubanking\boot\framework\quartz\config\JojuAsyncAutoConfiguration$1.class +com\jojubanking\boot\framework\quartz\core\util\CronUtils.class +com\jojubanking\boot\framework\quartz\core\handler\JobHandlerInvoker.class +com\jojubanking\boot\framework\quartz\core\handler\JobHandler.class +com\jojubanking\boot\framework\quartz\config\JojuAsyncAutoConfiguration.class +com\jojubanking\boot\framework\quartz\config\JojuQuartzAutoConfiguration.class +com\jojubanking\boot\framework\quartz\core\enums\JobDataKeyEnum.class diff --git a/joju-framework/joju-spring-boot-starter-job/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-job/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..ab92353 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,9 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-job\src\main\java\com\jojubanking\boot\framework\quartz\core\scheduler\SchedulerManager.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-job\src\main\java\com\jojubanking\boot\framework\quartz\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-job\src\main\java\com\jojubanking\boot\framework\quartz\config\JojuAsyncAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-job\src\main\java\com\jojubanking\boot\framework\quartz\core\service\JobLogFrameworkService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-job\src\main\java\com\jojubanking\boot\framework\quartz\core\enums\JobDataKeyEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-job\src\main\java\com\jojubanking\boot\framework\quartz\core\util\CronUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-job\src\main\java\com\jojubanking\boot\framework\quartz\core\handler\JobHandlerInvoker.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-job\src\main\java\com\jojubanking\boot\framework\quartz\core\handler\JobHandler.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-job\src\main\java\com\jojubanking\boot\framework\quartz\config\JojuQuartzAutoConfiguration.java diff --git a/joju-framework/joju-spring-boot-starter-job/《芋道 Spring Boot 定时任务入门》.md b/joju-framework/joju-spring-boot-starter-job/《芋道 Spring Boot 定时任务入门》.md new file mode 100644 index 0000000..daecfa9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/《芋道 Spring Boot 定时任务入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-job/《芋道 Spring Boot 异步任务入门》.md b/joju-framework/joju-spring-boot-starter-job/《芋道 Spring Boot 异步任务入门》.md new file mode 100644 index 0000000..4fa3145 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-job/《芋道 Spring Boot 异步任务入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-monitor/joju-spring-boot-starter-monitor.iml b/joju-framework/joju-spring-boot-starter-monitor/joju-spring-boot-starter-monitor.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/joju-spring-boot-starter-monitor.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-monitor/pom.xml b/joju-framework/joju-spring-boot-starter-monitor/pom.xml new file mode 100644 index 0000000..d474dc6 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/pom.xml @@ -0,0 +1,73 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-monitor + jar + + ${project.artifactId} + 服务监控,提供链路追踪、日志服务、指标收集等等功能 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + org.springframework + spring-web + provided + + + + jakarta.servlet + jakarta.servlet-api + provided + + + + + io.opentracing + opentracing-util + + + org.apache.skywalking + apm-toolkit-trace + + + org.apache.skywalking + apm-toolkit-logback-1.x + + + org.apache.skywalking + apm-toolkit-opentracing + + + + + io.micrometer + micrometer-registry-prometheus + + + + + + + + + diff --git a/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/config/JojuTracerAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/config/JojuTracerAutoConfiguration.java new file mode 100644 index 0000000..c5f5999 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/config/JojuTracerAutoConfiguration.java @@ -0,0 +1,55 @@ +package com.jojubanking.boot.framework.tracer.config; + +import com.jojubanking.boot.framework.common.enums.WebFilterOrderEnum; +import com.jojubanking.boot.framework.tracer.core.aop.BizTraceAspect; +import com.jojubanking.boot.framework.tracer.core.filter.TraceFilter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Tracer 配置类 + * + * @author mashu + */ +@Configuration +@ConditionalOnClass({BizTraceAspect.class}) +@EnableConfigurationProperties(TracerProperties.class) +@ConditionalOnProperty(prefix = "joju.tracer", value = "enable", matchIfMissing = true) +public class JojuTracerAutoConfiguration { + + // TODO @芋艿:重要。目前 opentracing 版本存在冲突,要么保证 skywalking,要么保证阿里云短信 sdk +// @Bean +// public TracerProperties bizTracerProperties() { +// return new TracerProperties(); +// } +// +// @Bean +// public BizTraceAspect bizTracingAop() { +// return new BizTraceAspect(tracer()); +// } +// +// @Bean +// public Tracer tracer() { +// // 创建 SkywalkingTracer 对象 +// SkywalkingTracer tracer = new SkywalkingTracer(); +// // 设置为 GlobalTracer 的追踪器 +// GlobalTracer.register(tracer); +// return tracer; +// } + + /** + * 创建 TraceFilter 过滤器,响应 header 设置 traceId + */ + @Bean + public FilterRegistrationBean traceFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new TraceFilter()); + registrationBean.setOrder(WebFilterOrderEnum.TRACE_FILTER); + return registrationBean; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/config/TracerProperties.java b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/config/TracerProperties.java new file mode 100644 index 0000000..7ae8468 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/config/TracerProperties.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.framework.tracer.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * BizTracer配置类 + * + * @author 麻薯 + */ +@ConfigurationProperties("joju.tracer") +@Data +public class TracerProperties { +} diff --git a/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/core/annotation/BizTrace.java b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/core/annotation/BizTrace.java new file mode 100644 index 0000000..482df96 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/core/annotation/BizTrace.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.framework.tracer.core.annotation; + +import java.lang.annotation.*; + +/** + * 打印业务编号 / 业务类型注解 + * + * 使用时,需要设置 SkyWalking OAP Server 的 application.yaml 配置文件,修改 SW_SEARCHABLE_TAG_KEYS 配置项, + * 增加 biz.type 和 biz.id 两值,然后重启 SkyWalking OAP Server 服务器。 + * + * @author 麻薯 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +public @interface BizTrace { + + /** + * 业务编号 tag 名 + */ + String ID_TAG = "biz.id"; + /** + * 业务类型 tag 名 + */ + String TYPE_TAG = "biz.type"; + + /** + * @return 操作名 + */ + String operationName() default ""; + + /** + * @return 业务编号 + */ + String id(); + + /** + * @return 业务类型 + */ + String type(); + +} diff --git a/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/core/aop/BizTraceAspect.java b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/core/aop/BizTraceAspect.java new file mode 100644 index 0000000..dac0792 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/core/aop/BizTraceAspect.java @@ -0,0 +1,77 @@ +package com.jojubanking.boot.framework.tracer.core.aop; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.tracer.core.annotation.BizTrace; +import com.jojubanking.boot.framework.common.util.spring.SpringExpressionUtils; +import com.jojubanking.boot.framework.tracer.core.util.TracerFrameworkUtils; +import io.opentracing.Span; +import io.opentracing.Tracer; +import io.opentracing.tag.Tags; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +import java.util.Map; + +import static java.util.Arrays.asList; + +/** + * {@link BizTrace} 切面,记录业务链路 + * + * @author mashu + */ +@Aspect +@AllArgsConstructor +@Slf4j +public class BizTraceAspect { + + private static final String BIZ_OPERATION_NAME_PREFIX = "Biz/"; + + private final Tracer tracer; + + @Around(value = "@annotation(trace)") + public Object around(ProceedingJoinPoint joinPoint, BizTrace trace) throws Throwable { + // 创建 span + String operationName = getOperationName(joinPoint, trace); + Span span = tracer.buildSpan(operationName) + .withTag(Tags.COMPONENT.getKey(), "biz") + .start(); + try { + // 执行原有方法 + return joinPoint.proceed(); + } catch (Throwable throwable) { + TracerFrameworkUtils.onError(throwable, span); + throw throwable; + } finally { + // 设置 Span 的 biz 属性 + setBizTag(span, joinPoint, trace); + // 完成 Span + span.finish(); + } + } + + private String getOperationName(ProceedingJoinPoint joinPoint, BizTrace trace) { + // 自定义操作名 + if (StrUtil.isNotEmpty(trace.operationName())) { + return BIZ_OPERATION_NAME_PREFIX + trace.operationName(); + } + // 默认操作名,使用方法名 + return BIZ_OPERATION_NAME_PREFIX + + joinPoint.getSignature().getDeclaringType().getSimpleName() + + "/" + joinPoint.getSignature().getName(); + } + + private void setBizTag(Span span, ProceedingJoinPoint joinPoint, BizTrace trace) { + try { + Map result = SpringExpressionUtils.parseExpressions(joinPoint, asList(trace.type(), trace.id())); + span.setTag(BizTrace.TYPE_TAG, MapUtil.getStr(result, trace.type())); + span.setTag(BizTrace.ID_TAG, MapUtil.getStr(result, trace.id())); + } catch (Exception ex) { + log.error("[setBizTag][解析 bizType 与 bizId 发生异常]", ex); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/core/filter/TraceFilter.java b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/core/filter/TraceFilter.java new file mode 100644 index 0000000..aaccf59 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/core/filter/TraceFilter.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.framework.tracer.core.filter; + +import com.jojubanking.boot.framework.common.util.monitor.TracerUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Trace 过滤器,打印 traceId 到 header 中返回 + * + * @author TW + */ +public class TraceFilter extends OncePerRequestFilter { + + /** + * Header 名 - 链路追踪编号 + */ + private static final String HEADER_NAME_TRACE_ID = "trace-id"; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws IOException, ServletException { + // 设置响应 traceId + response.addHeader(HEADER_NAME_TRACE_ID, TracerUtils.getTraceId()); + // 继续过滤 + chain.doFilter(request, response); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/core/util/TracerFrameworkUtils.java b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/core/util/TracerFrameworkUtils.java new file mode 100644 index 0000000..3108977 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/core/util/TracerFrameworkUtils.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.framework.tracer.core.util; + +import io.opentracing.Span; +import io.opentracing.tag.Tags; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; + +/** + * 链路追踪 Util + * + * @author TW + */ +public class TracerFrameworkUtils { + + /** + * 将异常记录到 Span 中,参考自 com.aliyuncs.utils.TraceUtils + * + * @param throwable 异常 + * @param span Span + */ + public static void onError(Throwable throwable, Span span) { + Tags.ERROR.set(span, Boolean.TRUE); + if (throwable != null) { + span.log(errorLogs(throwable)); + } + } + + private static Map errorLogs(Throwable throwable) { + Map errorLogs = new HashMap(10); + errorLogs.put("event", Tags.ERROR.getKey()); + errorLogs.put("error.object", throwable); + errorLogs.put("error.kind", throwable.getClass().getName()); + String message = throwable.getCause() != null ? throwable.getCause().getMessage() : throwable.getMessage(); + if (message != null) { + errorLogs.put("message", message); + } + StringWriter sw = new StringWriter(); + throwable.printStackTrace(new PrintWriter(sw)); + errorLogs.put("stack", sw.toString()); + return errorLogs; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/package-info.java b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/package-info.java new file mode 100644 index 0000000..28290c5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/src/main/java/com/jojubanking/boot/framework/tracer/package-info.java @@ -0,0 +1,6 @@ +/** + * 使用 SkyWalking 组件,作为链路追踪、日志中心。 + * + * @author TW + */ +package com.jojubanking.boot.framework.tracer; diff --git a/joju-framework/joju-spring-boot-starter-monitor/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-monitor/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..619be80 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.tracer.config.JojuTracerAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-monitor/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-monitor/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..619be80 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.tracer.config.JojuTracerAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/config/JojuTracerAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/config/JojuTracerAutoConfiguration.class new file mode 100644 index 0000000..d010743 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/config/JojuTracerAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/config/TracerProperties.class b/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/config/TracerProperties.class new file mode 100644 index 0000000..dff7117 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/config/TracerProperties.class differ diff --git a/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/core/annotation/BizTrace.class b/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/core/annotation/BizTrace.class new file mode 100644 index 0000000..9d81a55 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/core/annotation/BizTrace.class differ diff --git a/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/core/aop/BizTraceAspect.class b/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/core/aop/BizTraceAspect.class new file mode 100644 index 0000000..0c73fe5 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/core/aop/BizTraceAspect.class differ diff --git a/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/core/filter/TraceFilter.class b/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/core/filter/TraceFilter.class new file mode 100644 index 0000000..8e7a9db Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/core/filter/TraceFilter.class differ diff --git a/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/core/util/TracerFrameworkUtils.class b/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/core/util/TracerFrameworkUtils.class new file mode 100644 index 0000000..72389f7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-monitor/target/classes/com/jojubanking/boot/framework/tracer/core/util/TracerFrameworkUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-monitor/target/joju-spring-boot-starter-monitor-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-monitor/target/joju-spring-boot-starter-monitor-2.0.0-beta.jar new file mode 100644 index 0000000..5a67f34 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-monitor/target/joju-spring-boot-starter-monitor-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-monitor/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-monitor/target/maven-archiver/pom.properties new file mode 100644 index 0000000..d3f8b77 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:28:43 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-monitor diff --git a/joju-framework/joju-spring-boot-starter-monitor/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-monitor/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..e2699a4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,6 @@ +com\jojubanking\boot\framework\tracer\core\filter\TraceFilter.class +com\jojubanking\boot\framework\tracer\core\util\TracerFrameworkUtils.class +com\jojubanking\boot\framework\tracer\config\JojuTracerAutoConfiguration.class +com\jojubanking\boot\framework\tracer\core\aop\BizTraceAspect.class +com\jojubanking\boot\framework\tracer\core\annotation\BizTrace.class +com\jojubanking\boot\framework\tracer\config\TracerProperties.class diff --git a/joju-framework/joju-spring-boot-starter-monitor/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-monitor/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..6795fb2 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,7 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-monitor\src\main\java\com\jojubanking\boot\framework\tracer\config\JojuTracerAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-monitor\src\main\java\com\jojubanking\boot\framework\tracer\core\util\TracerFrameworkUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-monitor\src\main\java\com\jojubanking\boot\framework\tracer\config\TracerProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-monitor\src\main\java\com\jojubanking\boot\framework\tracer\core\annotation\BizTrace.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-monitor\src\main\java\com\jojubanking\boot\framework\tracer\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-monitor\src\main\java\com\jojubanking\boot\framework\tracer\core\aop\BizTraceAspect.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-monitor\src\main\java\com\jojubanking\boot\framework\tracer\core\filter\TraceFilter.java diff --git a/joju-framework/joju-spring-boot-starter-monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md b/joju-framework/joju-spring-boot-starter-monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md new file mode 100644 index 0000000..4a5392d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/《芋道 Spring Boot 监控工具 Admin 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-monitor/《芋道 Spring Boot 监控端点 Actuator 入门》.md b/joju-framework/joju-spring-boot-starter-monitor/《芋道 Spring Boot 监控端点 Actuator 入门》.md new file mode 100644 index 0000000..05bf141 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/《芋道 Spring Boot 监控端点 Actuator 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-monitor/《芋道 Spring Boot 链路追踪 SkyWalking 入门》.md b/joju-framework/joju-spring-boot-starter-monitor/《芋道 Spring Boot 链路追踪 SkyWalking 入门》.md new file mode 100644 index 0000000..1d6b434 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-monitor/《芋道 Spring Boot 链路追踪 SkyWalking 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-mq/joju-spring-boot-starter-mq.iml b/joju-framework/joju-spring-boot-starter-mq/joju-spring-boot-starter-mq.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/joju-spring-boot-starter-mq.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-mq/pom.xml b/joju-framework/joju-spring-boot-starter-mq/pom.xml new file mode 100644 index 0000000..f11625b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/pom.xml @@ -0,0 +1,27 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-mq + jar + + ${project.artifactId} + 消息队列,基于 Redis Pub/Sub 实现广播消费,基于 Stream 实现集群消费 + https://www.jojubanking.com + + + + + com.jojubanking.boot + joju-spring-boot-starter-redis + ${revision} + + + + diff --git a/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/config/JojuMQAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/config/JojuMQAutoConfiguration.java new file mode 100644 index 0000000..73f58db --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/config/JojuMQAutoConfiguration.java @@ -0,0 +1,143 @@ +package com.jojubanking.boot.framework.mq.config; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.system.SystemUtil; +import com.jojubanking.boot.framework.common.enums.DocumentEnum; +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import com.jojubanking.boot.framework.mq.core.interceptor.RedisMessageInterceptor; +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.jojubanking.boot.framework.mq.core.stream.AbstractStreamMessageListener; +import com.jojubanking.boot.framework.redis.config.JojuRedisAutoConfiguration; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisServerCommands; +import org.springframework.data.redis.connection.stream.Consumer; +import org.springframework.data.redis.connection.stream.ObjectRecord; +import org.springframework.data.redis.connection.stream.ReadOffset; +import org.springframework.data.redis.connection.stream.StreamOffset; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.stream.DefaultStreamMessageListenerContainerX; +import org.springframework.data.redis.stream.StreamMessageListenerContainer; + +import java.util.List; +import java.util.Properties; + +/** + * 消息队列配置类 + * + * @author TW + */ +@Configuration +@AutoConfigureAfter(JojuRedisAutoConfiguration.class) +@Slf4j +public class JojuMQAutoConfiguration { + + @Bean + public RedisMQTemplate redisMQTemplate(StringRedisTemplate redisTemplate, + List interceptors) { + RedisMQTemplate redisMQTemplate = new RedisMQTemplate(redisTemplate); + // 添加拦截器 + interceptors.forEach(redisMQTemplate::addInterceptor); + return redisMQTemplate; + } + + // ========== 消费者相关 ========== + + /** + * 创建 Redis Pub/Sub 广播消费的容器 + */ + @Bean + public RedisMessageListenerContainer redisMessageListenerContainer( + RedisMQTemplate redisMQTemplate, List> listeners) { + // 创建 RedisMessageListenerContainer 对象 + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + // 设置 RedisConnection 工厂。 + container.setConnectionFactory(redisMQTemplate.getRedisTemplate().getRequiredConnectionFactory()); + // 添加监听器 + listeners.forEach(listener -> { + listener.setRedisMQTemplate(redisMQTemplate); + container.addMessageListener(listener, new ChannelTopic(listener.getChannel())); + log.info("[redisMessageListenerContainer][注册 Channel({}) 对应的监听器({})]", + listener.getChannel(), listener.getClass().getName()); + }); + return container; + } + + /** + * 创建 Redis Stream 集群消费的容器 + * + * Redis Stream 的 xreadgroup 命令:https://www.geek-book.com/src/docs/redis/redis/redis.io/commands/xreadgroup.html + */ + @Bean(initMethod = "start", destroyMethod = "stop") + public StreamMessageListenerContainer> redisStreamMessageListenerContainer( + RedisMQTemplate redisMQTemplate, List> listeners) { + RedisTemplate redisTemplate = redisMQTemplate.getRedisTemplate(); + checkRedisVersion(redisTemplate); + // 第一步,创建 StreamMessageListenerContainer 容器 + // 创建 options 配置 + StreamMessageListenerContainer.StreamMessageListenerContainerOptions> containerOptions = + StreamMessageListenerContainer.StreamMessageListenerContainerOptions.builder() + .batchSize(10) // 一次性最多拉取多少条消息 + .targetType(String.class) // 目标类型。统一使用 String,通过自己封装的 AbstractStreamMessageListener 去反序列化 + .build(); + // 创建 container 对象 + StreamMessageListenerContainer> container = +// StreamMessageListenerContainer.create(redisTemplate.getRequiredConnectionFactory(), containerOptions); + DefaultStreamMessageListenerContainerX.create(redisMQTemplate.getRedisTemplate().getRequiredConnectionFactory(), containerOptions); + + // 第二步,注册监听器,消费对应的 Stream 主题 + String consumerName = buildConsumerName(); + listeners.parallelStream().forEach(listener -> { + // 创建 listener 对应的消费者分组 + try { + redisTemplate.opsForStream().createGroup(listener.getStreamKey(), listener.getGroup()); + } catch (Exception ignore) {} + // 设置 listener 对应的 redisTemplate + listener.setRedisMQTemplate(redisMQTemplate); + // 创建 Consumer 对象 + Consumer consumer = Consumer.from(listener.getGroup(), consumerName); + // 设置 Consumer 消费进度,以最小消费进度为准 + StreamOffset streamOffset = StreamOffset.create(listener.getStreamKey(), ReadOffset.lastConsumed()); + // 设置 Consumer 监听 + StreamMessageListenerContainer.StreamReadRequestBuilder builder = StreamMessageListenerContainer.StreamReadRequest + .builder(streamOffset).consumer(consumer) + .autoAcknowledge(false) // 不自动 ack + .cancelOnError(throwable -> false); // 默认配置,发生异常就取消消费,显然不符合预期;因此,我们设置为 false + container.register(builder.build(), listener); + }); + return container; + } + + /** + * 构建消费者名字,使用本地 IP + 进程编号的方式。 + * 参考自 RocketMQ clientId 的实现 + * + * @return 消费者名字 + */ + private static String buildConsumerName() { + return String.format("%s@%d", SystemUtil.getHostInfo().getAddress(), SystemUtil.getCurrentPID()); + } + + /** + * 校验 Redis 版本号,是否满足最低的版本号要求! + */ + private static void checkRedisVersion(RedisTemplate redisTemplate) { + // 获得 Redis 版本 + Properties info = redisTemplate.execute((RedisCallback) RedisServerCommands::info); + String version = MapUtil.getStr(info, "redis_version"); + // 校验最低版本必须大于等于 5.0.0 + int majorVersion = Integer.parseInt(StrUtil.subBefore(version, '.', false)); + if (majorVersion < 5) { + throw new IllegalStateException(StrUtil.format("您当前的 Redis 版本为 {},小于最低要求的 5.0.0 版本!" + + "请参考 {} 文档进行安装。", version, DocumentEnum.REDIS_INSTALL.getUrl())); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/RedisMQTemplate.java b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/RedisMQTemplate.java new file mode 100644 index 0000000..7a4791a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/RedisMQTemplate.java @@ -0,0 +1,88 @@ +package com.jojubanking.boot.framework.mq.core; + +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.mq.core.interceptor.RedisMessageInterceptor; +import com.jojubanking.boot.framework.mq.core.message.AbstractRedisMessage; +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import com.jojubanking.boot.framework.mq.core.stream.AbstractStreamMessage; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.experimental.Accessors; +import org.springframework.data.redis.connection.stream.RecordId; +import org.springframework.data.redis.connection.stream.StreamRecords; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.ArrayList; +import java.util.List; + +/** + * Redis MQ 操作模板类 + * + * @author TW + */ +@AllArgsConstructor +public class RedisMQTemplate { + + @Getter + private final RedisTemplate redisTemplate; + /** + * 拦截器数组 + */ + @Getter + private final List interceptors = new ArrayList<>(); + + /** + * 发送 Redis 消息,基于 Redis pub/sub 实现 + * + * @param message 消息 + */ + public void send(T message) { + try { + sendMessageBefore(message); + // 发送消息 + redisTemplate.convertAndSend(message.getChannel(), JsonUtils.toJsonString(message)); + } finally { + sendMessageAfter(message); + } + } + + /** + * 发送 Redis 消息,基于 Redis Stream 实现 + * + * @param message 消息 + * @return 消息记录的编号对象 + */ + public RecordId send(T message) { + try { + sendMessageBefore(message); + // 发送消息 + return redisTemplate.opsForStream().add(StreamRecords.newRecord() + .ofObject(JsonUtils.toJsonString(message)) // 设置内容 + .withStreamKey(message.getStreamKey())); // 设置 stream key + } finally { + sendMessageAfter(message); + } + } + + /** + * 添加拦截器 + * + * @param interceptor 拦截器 + */ + public void addInterceptor(RedisMessageInterceptor interceptor) { + interceptors.add(interceptor); + } + + private void sendMessageBefore(AbstractRedisMessage message) { + // 正序 + interceptors.forEach(interceptor -> interceptor.sendMessageBefore(message)); + } + + private void sendMessageAfter(AbstractRedisMessage message) { + // 倒序 + for (int i = interceptors.size() - 1; i >= 0; i--) { + interceptors.get(i).sendMessageAfter(message); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/interceptor/RedisMessageInterceptor.java b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/interceptor/RedisMessageInterceptor.java new file mode 100644 index 0000000..a2961df --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/interceptor/RedisMessageInterceptor.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.framework.mq.core.interceptor; + +import com.jojubanking.boot.framework.mq.core.message.AbstractRedisMessage; + +/** + * {@link AbstractRedisMessage} 消息拦截器 + * 通过拦截器,作为插件机制,实现拓展。 + * 例如说,多租户场景下的 MQ 消息处理 + * + * @author TW + */ +public interface RedisMessageInterceptor { + + default void sendMessageBefore(AbstractRedisMessage message) { + } + + default void sendMessageAfter(AbstractRedisMessage message) { + } + + default void consumeMessageBefore(AbstractRedisMessage message) { + } + + default void consumeMessageAfter(AbstractRedisMessage message) { + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/message/AbstractRedisMessage.java b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/message/AbstractRedisMessage.java new file mode 100644 index 0000000..5a94d3a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/message/AbstractRedisMessage.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.framework.mq.core.message; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +/** + * Redis 消息抽象基类 + * + * @author TW + */ +@Data +public abstract class AbstractRedisMessage { + + /** + * 头 + */ + private Map headers = new HashMap<>(); + + public String getHeader(String key) { + return headers.get(key); + } + + public void addHeader(String key, String value) { + headers.put(key, value); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/pubsub/AbstractChannelMessage.java b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/pubsub/AbstractChannelMessage.java new file mode 100644 index 0000000..188dca0 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/pubsub/AbstractChannelMessage.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.framework.mq.core.pubsub; + +import com.jojubanking.boot.framework.mq.core.message.AbstractRedisMessage; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * Redis Channel Message 抽象类 + * + * @author TW + */ +public abstract class AbstractChannelMessage extends AbstractRedisMessage { + + /** + * 获得 Redis Channel + * + * @return Channel + */ + @JsonIgnore // 避免序列化。原因是,Redis 发布 Channel 消息的时候,已经会指定。 + public abstract String getChannel(); + +} diff --git a/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/pubsub/AbstractChannelMessageListener.java b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/pubsub/AbstractChannelMessageListener.java new file mode 100644 index 0000000..16e55de --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/pubsub/AbstractChannelMessageListener.java @@ -0,0 +1,103 @@ +package com.jojubanking.boot.framework.mq.core.pubsub; + +import cn.hutool.core.util.TypeUtil; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import com.jojubanking.boot.framework.mq.core.interceptor.RedisMessageInterceptor; +import com.jojubanking.boot.framework.mq.core.message.AbstractRedisMessage; +import lombok.Setter; +import lombok.SneakyThrows; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; + +import java.lang.reflect.Type; +import java.util.List; + +/** + * Redis Pub/Sub 监听器抽象类,用于实现广播消费 + * + * @param 消息类型。一定要填写噢,不然会报错 + * + * @author TW + */ +public abstract class AbstractChannelMessageListener implements MessageListener { + + /** + * 消息类型 + */ + private final Class messageType; + /** + * Redis Channel + */ + private final String channel; + /** + * RedisMQTemplate + */ + @Setter + private RedisMQTemplate redisMQTemplate; + + @SneakyThrows + protected AbstractChannelMessageListener() { + this.messageType = getMessageClass(); + this.channel = messageType.newInstance().getChannel(); + } + + /** + * 获得 Sub 订阅的 Redis Channel 通道 + * + * @return channel + */ + public final String getChannel() { + return channel; + } + + @Override + public final void onMessage(Message message, byte[] bytes) { + T messageObj = JsonUtils.parseObject(message.getBody(), messageType); + try { + consumeMessageBefore(messageObj); + // 消费消息 + this.onMessage(messageObj); + } finally { + consumeMessageAfter(messageObj); + } + } + + /** + * 处理消息 + * + * @param message 消息 + */ + public abstract void onMessage(T message); + + /** + * 通过解析类上的泛型,获得消息类型 + * + * @return 消息类型 + */ + @SuppressWarnings("unchecked") + private Class getMessageClass() { + Type type = TypeUtil.getTypeArgument(getClass(), 0); + if (type == null) { + throw new IllegalStateException(String.format("类型(%s) 需要设置消息类型", getClass().getName())); + } + return (Class) type; + } + + private void consumeMessageBefore(AbstractRedisMessage message) { + assert redisMQTemplate != null; + List interceptors = redisMQTemplate.getInterceptors(); + // 正序 + interceptors.forEach(interceptor -> interceptor.consumeMessageBefore(message)); + } + + private void consumeMessageAfter(AbstractRedisMessage message) { + assert redisMQTemplate != null; + List interceptors = redisMQTemplate.getInterceptors(); + // 倒序 + for (int i = interceptors.size() - 1; i >= 0; i--) { + interceptors.get(i).consumeMessageAfter(message); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/stream/AbstractStreamMessage.java b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/stream/AbstractStreamMessage.java new file mode 100644 index 0000000..7c7e787 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/stream/AbstractStreamMessage.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.framework.mq.core.stream; + +import com.jojubanking.boot.framework.mq.core.message.AbstractRedisMessage; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * Redis Stream Message 抽象类 + * + * @author TW + */ +public abstract class AbstractStreamMessage extends AbstractRedisMessage { + + /** + * 获得 Redis Stream Key + * + * @return Channel + */ + @JsonIgnore // 避免序列化 + public abstract String getStreamKey(); + +} diff --git a/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/stream/AbstractStreamMessageListener.java b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/stream/AbstractStreamMessageListener.java new file mode 100644 index 0000000..89abf7c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/core/stream/AbstractStreamMessageListener.java @@ -0,0 +1,113 @@ +package com.jojubanking.boot.framework.mq.core.stream; + +import cn.hutool.core.util.TypeUtil; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import com.jojubanking.boot.framework.mq.core.interceptor.RedisMessageInterceptor; +import com.jojubanking.boot.framework.mq.core.message.AbstractRedisMessage; +import lombok.Getter; +import lombok.Setter; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.connection.stream.ObjectRecord; +import org.springframework.data.redis.stream.StreamListener; + +import java.lang.reflect.Type; +import java.util.List; + +/** + * Redis Stream 监听器抽象类,用于实现集群消费 + * + * @param 消息类型。一定要填写噢,不然会报错 + * + * @author TW + */ +public abstract class AbstractStreamMessageListener + implements StreamListener> { + + /** + * 消息类型 + */ + private final Class messageType; + /** + * Redis Channel + */ + @Getter + private final String streamKey; + + /** + * Redis 消费者分组,默认使用 spring.application.name 名字 + */ + @Value("${spring.application.name}") + @Getter + private String group; + /** + * RedisMQTemplate + */ + @Setter + private RedisMQTemplate redisMQTemplate; + + @SneakyThrows + protected AbstractStreamMessageListener() { + this.messageType = getMessageClass(); + this.streamKey = messageType.newInstance().getStreamKey(); + } + + @Override + public void onMessage(ObjectRecord message) { + // 消费消息 + T messageObj = JsonUtils.parseObject(message.getValue(), messageType); + try { + consumeMessageBefore(messageObj); + // 消费消息 + this.onMessage(messageObj); + // ack 消息消费完成 + redisMQTemplate.getRedisTemplate().opsForStream().acknowledge(group, message); + // TODO TW:需要额外考虑以下几个点: + // 1. 处理异常的情况 + // 2. 发送日志;以及事务的结合 + // 3. 消费日志;以及通用的幂等性 + // 4. 消费失败的重试,https://zhuanlan.zhihu.com/p/60501638 + } finally { + consumeMessageAfter(messageObj); + } + } + + /** + * 处理消息 + * + * @param message 消息 + */ + public abstract void onMessage(T message); + + /** + * 通过解析类上的泛型,获得消息类型 + * + * @return 消息类型 + */ + @SuppressWarnings("unchecked") + private Class getMessageClass() { + Type type = TypeUtil.getTypeArgument(getClass(), 0); + if (type == null) { + throw new IllegalStateException(String.format("类型(%s) 需要设置消息类型", getClass().getName())); + } + return (Class) type; + } + + private void consumeMessageBefore(AbstractRedisMessage message) { + assert redisMQTemplate != null; + List interceptors = redisMQTemplate.getInterceptors(); + // 正序 + interceptors.forEach(interceptor -> interceptor.consumeMessageBefore(message)); + } + + private void consumeMessageAfter(AbstractRedisMessage message) { + assert redisMQTemplate != null; + List interceptors = redisMQTemplate.getInterceptors(); + // 倒序 + for (int i = interceptors.size() - 1; i >= 0; i--) { + interceptors.get(i).consumeMessageAfter(message); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/package-info.java b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/package-info.java new file mode 100644 index 0000000..c2aba67 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/src/main/java/com/jojubanking/boot/framework/mq/package-info.java @@ -0,0 +1,6 @@ +/** + * 消息队列,基于 Redis 提供: + * 1. 基于 Pub/Sub 实现广播消费 + * 2. 基于 Stream 实现集群消费 + */ +package com.jojubanking.boot.framework.mq; diff --git a/joju-framework/joju-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java b/joju-framework/joju-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java new file mode 100644 index 0000000..deb0860 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/src/main/java/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.java @@ -0,0 +1,62 @@ +package org.springframework.data.redis.stream; + +import cn.hutool.core.util.ReflectUtil; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.stream.ByteRecord; +import org.springframework.data.redis.connection.stream.ReadOffset; +import org.springframework.data.redis.connection.stream.Record; +import org.springframework.util.Assert; + +import java.util.Collections; +import java.util.List; +import java.util.function.Function; + +/** + * 拓展 DefaultStreamMessageListenerContainer 实现,解决 Spring Data Redis + Redisson 结合使用时,Redisson 在 Stream 获得不到数据时,返回 null 而不是空 List,导致 NPE 异常。 + * 对应 issue:https://github.com/spring-projects/spring-data-redis/issues/2147 和 https://github.com/redisson/redisson/issues/4006 + * 目前看下来 Spring Data Redis 不肯加 null 判断,Redisson 暂时也没改返回 null 到空 List 的打算,所以暂时只能自己改,哽咽! + * + * @author TW + */ +public class DefaultStreamMessageListenerContainerX> extends DefaultStreamMessageListenerContainer { + + /** + * 参考 {@link StreamMessageListenerContainer#create(RedisConnectionFactory, StreamMessageListenerContainerOptions)} 的实现 + */ + public static > StreamMessageListenerContainer create(RedisConnectionFactory connectionFactory, StreamMessageListenerContainer.StreamMessageListenerContainerOptions options) { + Assert.notNull(connectionFactory, "RedisConnectionFactory must not be null!"); + Assert.notNull(options, "StreamMessageListenerContainerOptions must not be null!"); + return new DefaultStreamMessageListenerContainerX<>(connectionFactory, options); + } + + public DefaultStreamMessageListenerContainerX(RedisConnectionFactory connectionFactory, StreamMessageListenerContainerOptions containerOptions) { + super(connectionFactory, containerOptions); + } + + /** + * 参考 {@link DefaultStreamMessageListenerContainer#register(StreamReadRequest, StreamListener)} 的实现 + */ + @Override + public Subscription register(StreamReadRequest streamRequest, StreamListener listener) { + return this.doRegisterX(getReadTaskX(streamRequest, listener)); + } + + @SuppressWarnings("unchecked") + private StreamPollTask getReadTaskX(StreamReadRequest streamRequest, StreamListener listener) { + StreamPollTask task = ReflectUtil.invoke(this, "getReadTask", streamRequest, listener); + // 修改 readFunction 方法 + Function> readFunction = (Function>) ReflectUtil.getFieldValue(task, "readFunction"); + ReflectUtil.setFieldValue(task, "readFunction", (Function>) readOffset -> { + List records = readFunction.apply(readOffset); + //【重点】保证 records 不是空,避免 NPE 的问题!!! + return records != null ? records : Collections.emptyList(); + }); + return task; + } + + private Subscription doRegisterX(Task task) { + return ReflectUtil.invoke(this, "doRegister", task); + } + +} + diff --git a/joju-framework/joju-spring-boot-starter-mq/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-mq/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..40968d2 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.mq.config.JojuMQAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-mq/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-mq/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..40968d2 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.mq.config.JojuMQAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/config/JojuMQAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/config/JojuMQAutoConfiguration.class new file mode 100644 index 0000000..9137c9b Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/config/JojuMQAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/RedisMQTemplate.class b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/RedisMQTemplate.class new file mode 100644 index 0000000..ca69d74 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/RedisMQTemplate.class differ diff --git a/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/interceptor/RedisMessageInterceptor.class b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/interceptor/RedisMessageInterceptor.class new file mode 100644 index 0000000..03b4b75 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/interceptor/RedisMessageInterceptor.class differ diff --git a/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/message/AbstractRedisMessage.class b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/message/AbstractRedisMessage.class new file mode 100644 index 0000000..af1a6f3 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/message/AbstractRedisMessage.class differ diff --git a/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/pubsub/AbstractChannelMessage.class b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/pubsub/AbstractChannelMessage.class new file mode 100644 index 0000000..0557b17 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/pubsub/AbstractChannelMessage.class differ diff --git a/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/pubsub/AbstractChannelMessageListener.class b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/pubsub/AbstractChannelMessageListener.class new file mode 100644 index 0000000..77269e0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/pubsub/AbstractChannelMessageListener.class differ diff --git a/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/stream/AbstractStreamMessage.class b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/stream/AbstractStreamMessage.class new file mode 100644 index 0000000..c6e8c8a Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/stream/AbstractStreamMessage.class differ diff --git a/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/stream/AbstractStreamMessageListener.class b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/stream/AbstractStreamMessageListener.class new file mode 100644 index 0000000..2d7b136 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mq/target/classes/com/jojubanking/boot/framework/mq/core/stream/AbstractStreamMessageListener.class differ diff --git a/joju-framework/joju-spring-boot-starter-mq/target/classes/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.class b/joju-framework/joju-spring-boot-starter-mq/target/classes/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.class new file mode 100644 index 0000000..231806f Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mq/target/classes/org/springframework/data/redis/stream/DefaultStreamMessageListenerContainerX.class differ diff --git a/joju-framework/joju-spring-boot-starter-mq/target/joju-spring-boot-starter-mq-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-mq/target/joju-spring-boot-starter-mq-2.0.0-beta.jar new file mode 100644 index 0000000..b1660fb Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mq/target/joju-spring-boot-starter-mq-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-mq/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-mq/target/maven-archiver/pom.properties new file mode 100644 index 0000000..37de604 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:38 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-mq diff --git a/joju-framework/joju-spring-boot-starter-mq/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-mq/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..b4ea0db --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,9 @@ +com\jojubanking\boot\framework\mq\core\pubsub\AbstractChannelMessageListener.class +com\jojubanking\boot\framework\mq\core\message\AbstractRedisMessage.class +com\jojubanking\boot\framework\mq\config\JojuMQAutoConfiguration.class +com\jojubanking\boot\framework\mq\core\RedisMQTemplate.class +com\jojubanking\boot\framework\mq\core\stream\AbstractStreamMessage.class +com\jojubanking\boot\framework\mq\core\pubsub\AbstractChannelMessage.class +com\jojubanking\boot\framework\mq\core\stream\AbstractStreamMessageListener.class +com\jojubanking\boot\framework\mq\core\interceptor\RedisMessageInterceptor.class +org\springframework\data\redis\stream\DefaultStreamMessageListenerContainerX.class diff --git a/joju-framework/joju-spring-boot-starter-mq/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-mq/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..bd645cc --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mq/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,10 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mq\src\main\java\com\jojubanking\boot\framework\mq\core\pubsub\AbstractChannelMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mq\src\main\java\com\jojubanking\boot\framework\mq\core\stream\AbstractStreamMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mq\src\main\java\org\springframework\data\redis\stream\DefaultStreamMessageListenerContainerX.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mq\src\main\java\com\jojubanking\boot\framework\mq\core\message\AbstractRedisMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mq\src\main\java\com\jojubanking\boot\framework\mq\core\RedisMQTemplate.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mq\src\main\java\com\jojubanking\boot\framework\mq\core\stream\AbstractStreamMessageListener.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mq\src\main\java\com\jojubanking\boot\framework\mq\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mq\src\main\java\com\jojubanking\boot\framework\mq\config\JojuMQAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mq\src\main\java\com\jojubanking\boot\framework\mq\core\interceptor\RedisMessageInterceptor.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mq\src\main\java\com\jojubanking\boot\framework\mq\core\pubsub\AbstractChannelMessageListener.java diff --git a/joju-framework/joju-spring-boot-starter-mybatis/joju-spring-boot-starter-mybatis.iml b/joju-framework/joju-spring-boot-starter-mybatis/joju-spring-boot-starter-mybatis.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/joju-spring-boot-starter-mybatis.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-mybatis/pom.xml b/joju-framework/joju-spring-boot-starter-mybatis/pom.xml new file mode 100644 index 0000000..57f2325 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/pom.xml @@ -0,0 +1,72 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-mybatis + jar + + ${project.artifactId} + 数据库连接池、多数据源、事务、MyBatis 拓展 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + com.jojubanking.boot + joju-spring-boot-starter-web + provided + ${revision} + + + + + mysql + mysql-connector-java + + + com.oracle.database.jdbc + ojdbc8 + + + org.postgresql + postgresql + + + com.microsoft.sqlserver + mssql-jdbc + + + + com.alibaba + druid-spring-boot-starter + + + com.baomidou + mybatis-plus-boot-starter + + + com.baomidou + dynamic-datasource-spring-boot-starter + + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + true + + + + + diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/datasource/config/JojuDataSourceAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/datasource/config/JojuDataSourceAutoConfiguration.java new file mode 100644 index 0000000..7eb7581 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/datasource/config/JojuDataSourceAutoConfiguration.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.framework.datasource.config; + +import com.jojubanking.boot.framework.datasource.core.filter.DruidAdRemoveFilter; +import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * 数据库配置类 + * + * @author TW + */ +@Configuration +@EnableTransactionManagement(proxyTargetClass = true) // 启动事务管理 +@EnableConfigurationProperties(DruidStatProperties.class) +public class JojuDataSourceAutoConfiguration { + + /** + * 创建 DruidAdRemoveFilter 过滤器,过滤 common.js 的广告 + */ + @Bean + @ConditionalOnProperty(name = "spring.datasource.druid.web-stat-filter.enabled", havingValue = "true") + public FilterRegistrationBean druidAdRemoveFilterFilter(DruidStatProperties properties) { + // 获取 druid web 监控页面的参数 + DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); + // 提取 common.js 的配置路径 + String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; + String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); + // 创建 DruidAdRemoveFilter Bean + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new DruidAdRemoveFilter()); + registrationBean.addUrlPatterns(commonJsPattern); + return registrationBean; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/datasource/core/enums/DataSourceEnum.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/datasource/core/enums/DataSourceEnum.java new file mode 100644 index 0000000..a024638 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/datasource/core/enums/DataSourceEnum.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.framework.datasource.core.enums; + +/** + * 对应于多数据源中不同数据源配置 + * + * 通过在方法上,使用 {@link com.baomidou.dynamic.datasource.annotation.DS} 注解,设置使用的数据源。 + * 注意,默认是 {@link #MASTER} 数据源 + * + * 对应官方文档为 http://dynamic-datasource.com/guide/customize/Annotation.html + */ +public interface DataSourceEnum { + + /** + * 主库,推荐使用 {@link com.baomidou.dynamic.datasource.annotation.Master} 注解 + */ + String MASTER = "master"; + /** + * 从库,推荐使用 {@link com.baomidou.dynamic.datasource.annotation.Slave} 注解 + */ + String SLAVE = "slave"; + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/datasource/core/filter/DruidAdRemoveFilter.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/datasource/core/filter/DruidAdRemoveFilter.java new file mode 100644 index 0000000..51b0e17 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/datasource/core/filter/DruidAdRemoveFilter.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.framework.datasource.core.filter; + +import com.alibaba.druid.util.Utils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Druid 底部广告过滤器 + * + * @author TW + */ +public class DruidAdRemoveFilter extends OncePerRequestFilter { + + /** + * common.js 的路径 + */ + private static final String COMMON_JS_ILE_PATH = "support/http/resources/js/common.js"; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + chain.doFilter(request, response); + // 重置缓冲区,响应头不会被重置 + response.resetBuffer(); + // 获取 common.js + String text = Utils.readFromResource(COMMON_JS_ILE_PATH); + // 正则替换 banner, 除去底部的广告信息 + text = text.replaceAll("
", ""); + text = text.replaceAll("powered.*?shrek.wang", ""); + response.getWriter().write(text); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/datasource/package-info.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/datasource/package-info.java new file mode 100644 index 0000000..4280ea1 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/datasource/package-info.java @@ -0,0 +1,5 @@ +/** + * 数据库连接池,采用 Druid + * 多数据源,采用爆米花 + */ +package com.jojubanking.boot.framework.datasource; diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java new file mode 100644 index 0000000..96e7cae --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java @@ -0,0 +1,108 @@ +package com.jojubanking.boot.framework.mybatis.config; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.util.collection.SetUtils; +import com.jojubanking.boot.framework.mybatis.core.enums.SqlConstants; +import com.jojubanking.boot.framework.mybatis.core.util.JdbcUtils; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.annotation.IdType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.core.env.ConfigurableEnvironment; + +import java.util.Set; + +/** + * 当 IdType 为 {@link IdType#NONE} 时,根据 PRIMARY 数据源所使用的数据库,自动设置 + * + * @author TW + */ +@Slf4j +public class IdTypeEnvironmentPostProcessor implements EnvironmentPostProcessor { + + private static final String ID_TYPE_KEY = "mybatis-plus.global-config.db-config.id-type"; + + private static final String DATASOURCE_DYNAMIC_KEY = "spring.datasource.dynamic"; + + private static final String QUARTZ_JOB_STORE_DRIVER_KEY = "spring.quartz.properties.org.quartz.jobStore.driverDelegateClass"; + + private static final Set INPUT_ID_TYPES = SetUtils.asSet(DbType.ORACLE, DbType.ORACLE_12C, + DbType.POSTGRE_SQL, DbType.KINGBASE_ES, DbType.DB2, DbType.H2); + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + // 如果获取不到 DbType,则不进行处理 + DbType dbType = getDbType(environment); + if (dbType == null) { + return; + } + + // 设置 Quartz JobStore 对应的 Driver + // TODO TW:暂时没有找到特别合适的地方,先放在这里 + setJobStoreDriverIfPresent(environment, dbType); + + // 初始化 SQL 静态变量 + SqlConstants.init(dbType); + + // 如果非 NONE,则不进行处理 + IdType idType = getIdType(environment); + if (idType != IdType.NONE) { + return; + } + // 情况一,用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库 + if (INPUT_ID_TYPES.contains(dbType)) { + setIdType(environment, IdType.INPUT); + return; + } + // 情况二,自增 ID,适合 MySQL 等直接自增的数据库 + setIdType(environment, IdType.AUTO); + } + + public IdType getIdType(ConfigurableEnvironment environment) { + return environment.getProperty(ID_TYPE_KEY, IdType.class); + } + + public void setIdType(ConfigurableEnvironment environment, IdType idType) { + environment.getSystemProperties().put(ID_TYPE_KEY, idType); + log.info("[setIdType][修改 MyBatis Plus 的 idType 为({})]", idType); + } + + public void setJobStoreDriverIfPresent(ConfigurableEnvironment environment, DbType dbType) { + String driverClass = environment.getProperty(QUARTZ_JOB_STORE_DRIVER_KEY); + if (StrUtil.isNotEmpty(driverClass)) { + return; + } + // 根据 dbType 类型,获取对应的 driverClass + switch (dbType) { + case POSTGRE_SQL: + driverClass = "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate"; + break; + case ORACLE: + case ORACLE_12C: + driverClass = "org.quartz.impl.jdbcjobstore.oracle.OracleDelegate"; + break; + case SQL_SERVER: + case SQL_SERVER2005: + driverClass = "org.quartz.impl.jdbcjobstore.MSSQLDelegate"; + break; + } + // 设置 driverClass 变量 + if (StrUtil.isNotEmpty(driverClass)) { + environment.getSystemProperties().put(QUARTZ_JOB_STORE_DRIVER_KEY, driverClass); + } + } + + public static DbType getDbType(ConfigurableEnvironment environment) { + String primary = environment.getProperty(DATASOURCE_DYNAMIC_KEY + "." + "primary"); + if (StrUtil.isEmpty(primary)) { + return null; + } + String url = environment.getProperty(DATASOURCE_DYNAMIC_KEY + ".datasource." + primary + ".url"); + if (StrUtil.isEmpty(url)) { + return null; + } + return JdbcUtils.getDbType(url); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/config/JojuMybatisAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/config/JojuMybatisAutoConfiguration.java new file mode 100644 index 0000000..4c16e94 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/config/JojuMybatisAutoConfiguration.java @@ -0,0 +1,64 @@ +package com.jojubanking.boot.framework.mybatis.config; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.mybatis.core.handler.DefaultDBFieldHandler; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; +import com.baomidou.mybatisplus.extension.incrementer.H2KeyGenerator; +import com.baomidou.mybatisplus.extension.incrementer.KingbaseKeyGenerator; +import com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator; +import com.baomidou.mybatisplus.extension.incrementer.PostgreKeyGenerator; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.apache.ibatis.annotations.Mapper; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.ConfigurableEnvironment; + +/** + * MyBaits 配置类 + * + * @author TW + */ +@Configuration +@MapperScan(value = "${joju.info.base-package}", annotationClass = Mapper.class, + lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试 +public class JojuMybatisAutoConfiguration { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); + mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 分页插件 + return mybatisPlusInterceptor; + } + + @Bean + public MetaObjectHandler defaultMetaObjectHandler(){ + return new DefaultDBFieldHandler(); // 自动填充参数类 + } + + @Bean + @ConditionalOnProperty(prefix = "mybatis-plus.global-config.db-config", name = "id-type", havingValue = "INPUT") + public IKeyGenerator keyGenerator(ConfigurableEnvironment environment) { + DbType dbType = IdTypeEnvironmentPostProcessor.getDbType(environment); + if (dbType != null) { + switch (dbType) { + case POSTGRE_SQL: + return new PostgreKeyGenerator(); + case ORACLE: + case ORACLE_12C: + return new OracleKeyGenerator(); + case H2: + return new H2KeyGenerator(); + case KINGBASE_ES: + return new KingbaseKeyGenerator(); + } + } + // 找不到合适的 IKeyGenerator 实现类 + throw new IllegalArgumentException(StrUtil.format("DbType{} 找不到合适的 IKeyGenerator 实现类", dbType)); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/dataobject/BaseDO.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/dataobject/BaseDO.java new file mode 100644 index 0000000..e9aeb99 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/dataobject/BaseDO.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.framework.mybatis.core.dataobject; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; +import lombok.Data; +import lombok.experimental.Accessors; +import org.apache.ibatis.type.JdbcType; + +import java.io.Serializable; +import java.util.Date; + +/** + * 基础实体对象 + * + * @author TW + */ +@Data +public abstract class BaseDO implements Serializable { + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + /** + * 最后更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + /** + * 创建者,目前使用 SysUser 的 id 编号 + * + * 使用 String 类型的原因是,未来可能会存在非数值的情况,留好拓展性。 + */ + @TableField(fill = FieldFill.INSERT, jdbcType = JdbcType.VARCHAR) + private String creator; + /** + * 更新者,目前使用 SysUser 的 id 编号 + * + * 使用 String 类型的原因是,未来可能会存在非数值的情况,留好拓展性。 + */ + @TableField(fill = FieldFill.INSERT_UPDATE, jdbcType = JdbcType.VARCHAR) + private String updater; + /** + * 是否删除 + */ + @TableLogic + private Boolean deleted; + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/enums/SqlConstants.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/enums/SqlConstants.java new file mode 100644 index 0000000..500344e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/enums/SqlConstants.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.framework.mybatis.core.enums; + +import com.baomidou.mybatisplus.annotation.DbType; + +/** + * SQL相关常量类 + * + * @author TW + */ +public class SqlConstants { + + /** + * 数据库的类型 + */ + public static DbType DB_TYPE; + + public static void init(DbType dbType) { + DB_TYPE = dbType; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/handler/DefaultDBFieldHandler.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/handler/DefaultDBFieldHandler.java new file mode 100644 index 0000000..1743d8d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/handler/DefaultDBFieldHandler.java @@ -0,0 +1,62 @@ +package com.jojubanking.boot.framework.mybatis.core.handler; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.web.core.util.WebFrameworkUtils; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; + +import java.util.Date; +import java.util.Objects; + +/** + * 通用参数填充实现类 + * + * 如果没有显式的对通用参数进行赋值,这里会对通用参数进行填充、赋值 + * + * @author hexiaowu + */ +public class DefaultDBFieldHandler implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) { + BaseDO baseDO = (BaseDO) metaObject.getOriginalObject(); + + Date current = new Date(); + // 创建时间为空,则以当前时间为插入时间 + if (Objects.isNull(baseDO.getCreateTime())) { + baseDO.setCreateTime(current); + } + // 更新时间为空,则以当前时间为更新时间 + if (Objects.isNull(baseDO.getUpdateTime())) { + baseDO.setUpdateTime(current); + } + + Long userId = WebFrameworkUtils.getLoginUserId(); + // 当前登录用户不为空,创建人为空,则当前登录用户为创建人 + if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) { + baseDO.setCreator(userId.toString()); + } + // 当前登录用户不为空,更新人为空,则当前登录用户为更新人 + if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) { + baseDO.setUpdater(userId.toString()); + } + } + } + + @Override + public void updateFill(MetaObject metaObject) { + // 更新时间为空,则以当前时间为更新时间 + Object modifyTime = getFieldValByName("updateTime", metaObject); + if (Objects.isNull(modifyTime)) { + setFieldValByName("updateTime", new Date(), metaObject); + } + + // 当前登录用户不为空,更新人为空,则当前登录用户为更新人 + Object modifier = getFieldValByName("updater", metaObject); + Long userId = WebFrameworkUtils.getLoginUserId(); + if (Objects.nonNull(userId) && Objects.isNull(modifier)) { + setFieldValByName("updater", userId.toString(), metaObject); + } + } +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/mapper/BaseMapperX.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/mapper/BaseMapperX.java new file mode 100644 index 0000000..7399702 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/mapper/BaseMapperX.java @@ -0,0 +1,94 @@ +package com.jojubanking.boot.framework.mybatis.core.mapper; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.util.MyBatisUtils; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力 + */ +public interface BaseMapperX extends BaseMapper { + + default PageResult selectPage(PageParam pageParam, @Param("ew") Wrapper queryWrapper) { + // MyBatis Plus 查询 + IPage mpPage = MyBatisUtils.buildPage(pageParam); + selectPage(mpPage, queryWrapper); + // 转换返回 + return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); + } + + default T selectOne(String field, Object value) { + return selectOne(new QueryWrapper().eq(field, value).last("limit 1")); + } + + default T selectOne(SFunction field, Object value) { + return selectOne(new LambdaQueryWrapper().eq(field, value)); + } + + default T selectOne(String field1, Object value1, String field2, Object value2) { + return selectOne(new QueryWrapper().eq(field1, value1).eq(field2, value2)); + } + + default T selectOne(SFunction field1, Object value1, SFunction field2, Object value2) { + return selectOne(new LambdaQueryWrapper().eq(field1, value1).eq(field2, value2)); + } + + default Long selectCount() { + return selectCount(new QueryWrapper()); + } + + default Long selectCount(String field, Object value) { + return selectCount(new QueryWrapper().eq(field, value)); + } + + default Long selectCount(SFunction field, Object value) { + return selectCount(new LambdaQueryWrapper().eq(field, value)); + } + + default List selectList() { + return selectList(new QueryWrapper<>()); + } + + default List selectList(String field, Object value) { + return selectList(new QueryWrapper().eq(field, value)); + } + + default List selectList(SFunction field, Object value) { + return selectList(new LambdaQueryWrapper().eq(field, value)); + } + + default List selectList(String field, Collection values) { + return selectList(new QueryWrapper().in(field, values)); + } + + default List selectList(SFunction field, Collection values) { + return selectList(new LambdaQueryWrapper().in(field, values)); + } + + /** + * 逐条插入,适合少量数据插入,或者对性能要求不高的场景 + * + * 如果大量,请使用 {@link com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#saveBatch(Collection)} 方法 + * 使用示例,可见 RoleMenuBatchInsertMapper、UserRoleBatchInsertMapper 类 + * + * @param entities 实体们 + */ + default void insertBatch(Collection entities) { + entities.forEach(this::insert); + } + + default void updateBatch(T update) { + update(update, new QueryWrapper<>()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/query/LambdaQueryWrapperX.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/query/LambdaQueryWrapperX.java new file mode 100644 index 0000000..c7b6c68 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/query/LambdaQueryWrapperX.java @@ -0,0 +1,135 @@ +package com.jojubanking.boot.framework.mybatis.core.query; + +import cn.hutool.core.util.ArrayUtil; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import org.springframework.util.StringUtils; + +import java.util.Collection; + +/** + * 拓展 MyBatis Plus QueryWrapper 类,主要增加如下功能: + * + * 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。 + * + * @param 数据类型 + */ +public class LambdaQueryWrapperX extends LambdaQueryWrapper { + + public LambdaQueryWrapperX likeIfPresent(SFunction column, String val) { + if (StringUtils.hasText(val)) { + return (LambdaQueryWrapperX) super.like(column, val); + } + return this; + } + + public LambdaQueryWrapperX inIfPresent(SFunction column, Collection values) { + if (!CollectionUtils.isEmpty(values)) { + return (LambdaQueryWrapperX) super.in(column, values); + } + return this; + } + + public LambdaQueryWrapperX inIfPresent(SFunction column, Object... values) { + if (!ArrayUtil.isEmpty(values)) { + return (LambdaQueryWrapperX) super.in(column, values); + } + return this; + } + + public LambdaQueryWrapperX eqIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.eq(column, val); + } + return this; + } + + public LambdaQueryWrapperX neIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.ne(column, val); + } + return this; + } + + public LambdaQueryWrapperX gtIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.gt(column, val); + } + return this; + } + + public LambdaQueryWrapperX geIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.ge(column, val); + } + return this; + } + + public LambdaQueryWrapperX ltIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.lt(column, val); + } + return this; + } + + public LambdaQueryWrapperX leIfPresent(SFunction column, Object val) { + if (val != null) { + return (LambdaQueryWrapperX) super.le(column, val); + } + return this; + } + + public LambdaQueryWrapperX betweenIfPresent(SFunction column, Object val1, Object val2) { + if (val1 != null && val2 != null) { + return (LambdaQueryWrapperX) super.between(column, val1, val2); + } + if (val1 != null) { + return (LambdaQueryWrapperX) ge(column, val1); + } + if (val2 != null) { + return (LambdaQueryWrapperX) le(column, val2); + } + return this; + } + + public LambdaQueryWrapperX betweenIfPresent(SFunction column, Object[] values) { + Object val1 = ArrayUtils.get(values, 0); + Object val2 = ArrayUtils.get(values, 1); + return betweenIfPresent(column, val1, val2); + } + + // ========== 重写父类方法,方便链式调用 ========== + + @Override + public LambdaQueryWrapperX eq(boolean condition, SFunction column, Object val) { + super.eq(condition, column, val); + return this; + } + + @Override + public LambdaQueryWrapperX eq(SFunction column, Object val) { + super.eq(column, val); + return this; + } + + @Override + public LambdaQueryWrapperX orderByDesc(SFunction column) { + super.orderByDesc(true, column); + return this; + } + + @Override + public LambdaQueryWrapperX last(String lastSql) { + super.last(lastSql); + return this; + } + + @Override + public LambdaQueryWrapperX in(SFunction column, Collection coll) { + super.in(column, coll); + return this; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/query/QueryWrapperX.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/query/QueryWrapperX.java new file mode 100644 index 0000000..a185656 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/query/QueryWrapperX.java @@ -0,0 +1,166 @@ +package com.jojubanking.boot.framework.mybatis.core.query; + +import cn.hutool.core.lang.Assert; +import com.jojubanking.boot.framework.mybatis.core.enums.SqlConstants; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.Collection; + +/** + * 拓展 MyBatis Plus QueryWrapper 类,主要增加如下功能: + * + * 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。 + * + * @param 数据类型 + */ +public class QueryWrapperX extends QueryWrapper { + + public QueryWrapperX likeIfPresent(String column, String val) { + if (StringUtils.hasText(val)) { + return (QueryWrapperX) super.like(column, val); + } + return this; + } + + public QueryWrapperX inIfPresent(String column, Collection values) { + if (!CollectionUtils.isEmpty(values)) { + return (QueryWrapperX) super.in(column, values); + } + return this; + } + + public QueryWrapperX inIfPresent(String column, Object... values) { + if (!ArrayUtils.isEmpty(values)) { + return (QueryWrapperX) super.in(column, values); + } + return this; + } + + public QueryWrapperX eqIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.eq(column, val); + } + return this; + } + + public QueryWrapperX neIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.ne(column, val); + } + return this; + } + + public QueryWrapperX gtIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.gt(column, val); + } + return this; + } + + public QueryWrapperX geIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.ge(column, val); + } + return this; + } + + public QueryWrapperX ltIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.lt(column, val); + } + return this; + } + + public QueryWrapperX leIfPresent(String column, Object val) { + if (val != null) { + return (QueryWrapperX) super.le(column, val); + } + return this; + } + + public QueryWrapperX betweenIfPresent(String column, Object val1, Object val2) { + if (val1 != null && val2 != null) { + return (QueryWrapperX) super.between(column, val1, val2); + } + if (val1 != null) { + return (QueryWrapperX) ge(column, val1); + } + if (val2 != null) { + return (QueryWrapperX) le(column, val2); + } + return this; + } + + public QueryWrapperX betweenIfPresent(String column, Object[] values) { + if (values!= null && values.length != 0 && values[0] != null && values[1] != null) { + return (QueryWrapperX) super.between(column, values[0], values[1]); + } + if (values!= null && values.length != 0 && values[0] != null) { + return (QueryWrapperX) ge(column, values[0]); + } + if (values!= null && values.length != 0 && values[1] != null) { + return (QueryWrapperX) le(column, values[1]); + } + return this; + } + + // ========== 重写父类方法,方便链式调用 ========== + + @Override + public QueryWrapperX eq(boolean condition, String column, Object val) { + super.eq(condition, column, val); + return this; + } + + @Override + public QueryWrapperX eq(String column, Object val) { + super.eq(column, val); + return this; + } + + @Override + public QueryWrapperX orderByDesc(String column) { + super.orderByDesc(true, column); + return this; + } + + @Override + public QueryWrapperX last(String lastSql) { + super.last(lastSql); + return this; + } + + @Override + public QueryWrapperX in(String column, Collection coll) { + super.in(column, coll); + return this; + } + + /** + * 设置只返回最后一条 + * + * TODO TW:不是完美解,需要在思考下。如果使用多数据源,并且数据源是多种类型时,可能会存在问题:实现之返回一条的语法不同 + * + * @return this + */ + public QueryWrapperX limit1() { + Assert.notNull(SqlConstants.DB_TYPE, "获取不到数据库的类型"); + switch (SqlConstants.DB_TYPE) { + case ORACLE: + case ORACLE_12C: + super.eq("ROWNUM", 1); + break; + case SQL_SERVER: + case SQL_SERVER2005: + super.select("TOP 1 *"); // 由于 SQL Server 是通过 SELECT TOP 1 实现限制一条,所以只好使用 * 查询剩余字段 + break; + default: + super.last("LIMIT 1"); + } + return this; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/type/EncryptTypeHandler.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/type/EncryptTypeHandler.java new file mode 100644 index 0000000..301036f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/type/EncryptTypeHandler.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.framework.mybatis.core.type; + +import cn.hutool.core.lang.Assert; +import cn.hutool.extra.spring.SpringUtil; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.jasypt.encryption.StringEncryptor; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * 字段字段的 TypeHandler 实现类,基于 {@link StringEncryptor} 实现 + * 可通过 jasypt.encryptor.password 配置项,设置密钥 + * + * @author TW + */ +public class EncryptTypeHandler extends BaseTypeHandler { + + private static StringEncryptor encryptor; + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { + ps.setString(i, getEncryptor().encrypt(parameter)); + } + + @Override + public String getNullableResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + return decrypt(value); + } + + @Override + public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + return decrypt(value); + } + + @Override + public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + return decrypt(value); + } + + private static String decrypt(String value) { + if (value == null) { + return null; + } + return getEncryptor().decrypt(value); + } + + public static String encrypt(String rawValue) { + if (rawValue == null) { + return null; + } + return getEncryptor().encrypt(rawValue); + } + + private static StringEncryptor getEncryptor() { + if (encryptor != null) { + return encryptor; + } + encryptor = SpringUtil.getBean(StringEncryptor.class); + Assert.notNull(encryptor, "StringEncryptor 不能为空"); + return encryptor; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/type/JsonLongSetTypeHandler.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/type/JsonLongSetTypeHandler.java new file mode 100644 index 0000000..71eb273 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/type/JsonLongSetTypeHandler.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.framework.mybatis.core.type; + +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; +import com.fasterxml.jackson.core.type.TypeReference; + +import java.util.Set; + +/** + * 参考 {@link com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler} 实现 + * 在我们将字符串反序列化为 Set 并且泛型为 Long 时,如果每个元素的数值太小,会被处理成 Integer 类型,导致可能存在隐性的 BUG。 + * + * 例如说哦,SysUserDO 的 postIds 属性 + * + * @author TW + */ +public class JsonLongSetTypeHandler extends AbstractJsonTypeHandler { + + private static final TypeReference> typeReference = new TypeReference>(){}; + + @Override + protected Object parse(String json) { + return JsonUtils.parseObject(json, typeReference); + } + + @Override + protected String toJson(Object obj) { + return JsonUtils.toJsonString(obj); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/type/StringListTypeHandler.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/type/StringListTypeHandler.java new file mode 100644 index 0000000..9ed6ae0 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/type/StringListTypeHandler.java @@ -0,0 +1,58 @@ +package com.jojubanking.boot.framework.mybatis.core.type; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.apache.ibatis.type.TypeHandler; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * List 的类型转换器实现类,对应数据库的 varchar 类型 + * + * @author 永不言败 + * @since 2022 3/23 12:50:15 + */ +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes(List.class) +public class StringListTypeHandler implements TypeHandler> { + + private static final String COMMA = ","; + + @Override + public void setParameter(PreparedStatement ps, int i, List strings, JdbcType jdbcType) throws SQLException { + // 设置占位符 + ps.setString(i, CollUtil.join(strings, COMMA)); + } + + @Override + public List getResult(ResultSet rs, String columnName) throws SQLException { + String value = rs.getString(columnName); + return getResult(value); + } + + @Override + public List getResult(ResultSet rs, int columnIndex) throws SQLException { + String value = rs.getString(columnIndex); + return getResult(value); + } + + @Override + public List getResult(CallableStatement cs, int columnIndex) throws SQLException { + String value = cs.getString(columnIndex); + return getResult(value); + } + + private List getResult(String value) { + if (value == null) { + return null; + } + return StrUtil.splitTrim(value, COMMA); + } +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/util/JdbcUtils.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/util/JdbcUtils.java new file mode 100644 index 0000000..db0d61a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/util/JdbcUtils.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.framework.mybatis.core.util; + +import com.baomidou.mybatisplus.annotation.DbType; + +import java.sql.Connection; +import java.sql.DriverManager; + +/** + * JDBC 工具类 + * + * @author TW + */ +public class JdbcUtils { + + /** + * 判断连接是否正确 + * + * @param url 数据源连接 + * @param username 账号 + * @param password 密码 + * @return 是否正确 + */ + public static boolean isConnectionOK(String url, String username, String password) { + try (Connection ignored = DriverManager.getConnection(url, username, password)) { + return true; + } catch (Exception ex) { + return false; + } + } + + /** + * 获得 URL 对应的 DB 类型 + * + * @param url URL + * @return DB 类型 + */ + public static DbType getDbType(String url) { + String name = com.alibaba.druid.util.JdbcUtils.getDbType(url, null); + return DbType.getDbType(name); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/util/MyBatisUtils.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/util/MyBatisUtils.java new file mode 100644 index 0000000..5213126 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/core/util/MyBatisUtils.java @@ -0,0 +1,84 @@ +package com.jojubanking.boot.framework.mybatis.core.util; + +import cn.hutool.core.collection.CollectionUtil; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import com.jojubanking.boot.framework.common.pojo.SortingField; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * MyBatis 工具类 + */ +public class MyBatisUtils { + + private static final String MYSQL_ESCAPE_CHARACTER = "`"; + + public static Page buildPage(PageParam pageParam) { + return buildPage(pageParam, null); + } + + public static Page buildPage(PageParam pageParam, Collection sortingFields) { + // 页码 + 数量 + Page page = new Page<>(pageParam.getPageNo(), pageParam.getPageSize()); + // 排序字段 + if (!CollectionUtil.isEmpty(sortingFields)) { + page.addOrder(sortingFields.stream().map(sortingField -> SortingField.ORDER_ASC.equals(sortingField.getOrder()) ? + OrderItem.asc(sortingField.getField()) : OrderItem.desc(sortingField.getField())) + .collect(Collectors.toList())); + } + return page; + } + + /** + * 将拦截器添加到链中 + * 由于 MybatisPlusInterceptor 不支持添加拦截器,所以只能全量设置 + * + * @param interceptor 链 + * @param inner 拦截器 + * @param index 位置 + */ + public static void addInterceptor(MybatisPlusInterceptor interceptor, InnerInterceptor inner, int index) { + List inners = new ArrayList<>(interceptor.getInterceptors()); + inners.add(index, inner); + interceptor.setInterceptors(inners); + } + + /** + * 获得 Table 对应的表名 + * + * 兼容 MySQL 转义表名 `t_xxx` + * + * @param table 表 + * @return 去除转移字符后的表名 + */ + public static String getTableName(Table table) { + String tableName = table.getName(); + if (tableName.startsWith(MYSQL_ESCAPE_CHARACTER) && tableName.endsWith(MYSQL_ESCAPE_CHARACTER)) { + tableName = tableName.substring(1, tableName.length() - 1); + } + return tableName; + } + + /** + * 构建 Column 对象 + * + * @param tableName 表名 + * @param tableAlias 别名 + * @param column 字段名 + * @return Column 对象 + */ + public static Column buildColumn(String tableName, Alias tableAlias, String column) { + return new Column(tableAlias != null ? tableAlias.getName() + "." + column : column); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/package-info.java b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/package-info.java new file mode 100644 index 0000000..57a241c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/java/com/jojubanking/boot/framework/mybatis/package-info.java @@ -0,0 +1,4 @@ +/** + * 使用 MyBatis Plus 提升使用 MyBatis 的开发效率 + */ +package com.jojubanking.boot.framework.mybatis; diff --git a/joju-framework/joju-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..de0a4c1 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/src/main/resources/META-INF/spring.factories @@ -0,0 +1,5 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.datasource.config.JojuDataSourceAutoConfiguration,\ + com.jojubanking.boot.framework.mybatis.config.JojuMybatisAutoConfiguration +org.springframework.boot.env.EnvironmentPostProcessor=\ + com.jojubanking.boot.framework.mybatis.config.IdTypeEnvironmentPostProcessor diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..de0a4c1 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/META-INF/spring.factories @@ -0,0 +1,5 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.datasource.config.JojuDataSourceAutoConfiguration,\ + com.jojubanking.boot.framework.mybatis.config.JojuMybatisAutoConfiguration +org.springframework.boot.env.EnvironmentPostProcessor=\ + com.jojubanking.boot.framework.mybatis.config.IdTypeEnvironmentPostProcessor diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/datasource/config/JojuDataSourceAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/datasource/config/JojuDataSourceAutoConfiguration.class new file mode 100644 index 0000000..1e776b7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/datasource/config/JojuDataSourceAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/datasource/core/enums/DataSourceEnum.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/datasource/core/enums/DataSourceEnum.class new file mode 100644 index 0000000..d6a39c4 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/datasource/core/enums/DataSourceEnum.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/datasource/core/filter/DruidAdRemoveFilter.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/datasource/core/filter/DruidAdRemoveFilter.class new file mode 100644 index 0000000..68901cb Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/datasource/core/filter/DruidAdRemoveFilter.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/config/IdTypeEnvironmentPostProcessor$1.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/config/IdTypeEnvironmentPostProcessor$1.class new file mode 100644 index 0000000..7e9dc5e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/config/IdTypeEnvironmentPostProcessor$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/config/IdTypeEnvironmentPostProcessor.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/config/IdTypeEnvironmentPostProcessor.class new file mode 100644 index 0000000..d99d9f0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/config/IdTypeEnvironmentPostProcessor.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/config/JojuMybatisAutoConfiguration$1.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/config/JojuMybatisAutoConfiguration$1.class new file mode 100644 index 0000000..81dc778 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/config/JojuMybatisAutoConfiguration$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/config/JojuMybatisAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/config/JojuMybatisAutoConfiguration.class new file mode 100644 index 0000000..36dbec8 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/config/JojuMybatisAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/dataobject/BaseDO.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/dataobject/BaseDO.class new file mode 100644 index 0000000..67d69fc Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/dataobject/BaseDO.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/enums/SqlConstants.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/enums/SqlConstants.class new file mode 100644 index 0000000..d8ef89d Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/enums/SqlConstants.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/handler/DefaultDBFieldHandler.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/handler/DefaultDBFieldHandler.class new file mode 100644 index 0000000..249255e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/handler/DefaultDBFieldHandler.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/mapper/BaseMapperX.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/mapper/BaseMapperX.class new file mode 100644 index 0000000..d55ad71 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/mapper/BaseMapperX.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/query/LambdaQueryWrapperX.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/query/LambdaQueryWrapperX.class new file mode 100644 index 0000000..6b5ff6e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/query/LambdaQueryWrapperX.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/query/QueryWrapperX$1.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/query/QueryWrapperX$1.class new file mode 100644 index 0000000..cf5b650 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/query/QueryWrapperX$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/query/QueryWrapperX.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/query/QueryWrapperX.class new file mode 100644 index 0000000..34dfad8 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/query/QueryWrapperX.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/type/EncryptTypeHandler.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/type/EncryptTypeHandler.class new file mode 100644 index 0000000..e56022d Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/type/EncryptTypeHandler.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/type/JsonLongSetTypeHandler$1.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/type/JsonLongSetTypeHandler$1.class new file mode 100644 index 0000000..2ac28fc Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/type/JsonLongSetTypeHandler$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/type/JsonLongSetTypeHandler.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/type/JsonLongSetTypeHandler.class new file mode 100644 index 0000000..6187424 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/type/JsonLongSetTypeHandler.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/type/StringListTypeHandler.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/type/StringListTypeHandler.class new file mode 100644 index 0000000..61402cd Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/type/StringListTypeHandler.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/util/JdbcUtils.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/util/JdbcUtils.class new file mode 100644 index 0000000..2535d17 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/util/JdbcUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/util/MyBatisUtils.class b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/util/MyBatisUtils.class new file mode 100644 index 0000000..dda66ee Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/classes/com/jojubanking/boot/framework/mybatis/core/util/MyBatisUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/joju-spring-boot-starter-mybatis-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-mybatis/target/joju-spring-boot-starter-mybatis-2.0.0-beta.jar new file mode 100644 index 0000000..747a6e3 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-mybatis/target/joju-spring-boot-starter-mybatis-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-mybatis/target/maven-archiver/pom.properties new file mode 100644 index 0000000..f621b2d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:30 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-mybatis diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-mybatis/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..e62b60f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,20 @@ +com\jojubanking\boot\framework\mybatis\core\type\JsonLongSetTypeHandler$1.class +com\jojubanking\boot\framework\mybatis\core\type\StringListTypeHandler.class +com\jojubanking\boot\framework\datasource\core\enums\DataSourceEnum.class +com\jojubanking\boot\framework\mybatis\config\IdTypeEnvironmentPostProcessor$1.class +com\jojubanking\boot\framework\mybatis\core\dataobject\BaseDO.class +com\jojubanking\boot\framework\mybatis\core\query\QueryWrapperX$1.class +com\jojubanking\boot\framework\mybatis\core\query\QueryWrapperX.class +com\jojubanking\boot\framework\mybatis\config\JojuMybatisAutoConfiguration.class +com\jojubanking\boot\framework\mybatis\core\handler\DefaultDBFieldHandler.class +com\jojubanking\boot\framework\mybatis\core\mapper\BaseMapperX.class +com\jojubanking\boot\framework\mybatis\core\util\JdbcUtils.class +com\jojubanking\boot\framework\mybatis\core\type\EncryptTypeHandler.class +com\jojubanking\boot\framework\datasource\config\JojuDataSourceAutoConfiguration.class +com\jojubanking\boot\framework\mybatis\config\JojuMybatisAutoConfiguration$1.class +com\jojubanking\boot\framework\mybatis\core\query\LambdaQueryWrapperX.class +com\jojubanking\boot\framework\mybatis\core\util\MyBatisUtils.class +com\jojubanking\boot\framework\mybatis\config\IdTypeEnvironmentPostProcessor.class +com\jojubanking\boot\framework\mybatis\core\enums\SqlConstants.class +com\jojubanking\boot\framework\mybatis\core\type\JsonLongSetTypeHandler.class +com\jojubanking\boot\framework\datasource\core\filter\DruidAdRemoveFilter.class diff --git a/joju-framework/joju-spring-boot-starter-mybatis/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-mybatis/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..4688c9d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,18 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\core\type\JsonLongSetTypeHandler.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\core\dataobject\BaseDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\core\type\EncryptTypeHandler.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\core\type\StringListTypeHandler.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\core\util\JdbcUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\datasource\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\core\handler\DefaultDBFieldHandler.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\core\query\QueryWrapperX.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\core\enums\SqlConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\core\mapper\BaseMapperX.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\config\IdTypeEnvironmentPostProcessor.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\config\JojuMybatisAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\core\query\LambdaQueryWrapperX.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\mybatis\core\util\MyBatisUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\datasource\config\JojuDataSourceAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\datasource\core\filter\DruidAdRemoveFilter.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-mybatis\src\main\java\com\jojubanking\boot\framework\datasource\core\enums\DataSourceEnum.java diff --git a/joju-framework/joju-spring-boot-starter-mybatis/《芋道 Spring Boot MyBatis 入门》.md b/joju-framework/joju-spring-boot-starter-mybatis/《芋道 Spring Boot MyBatis 入门》.md new file mode 100644 index 0000000..e01f03f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/《芋道 Spring Boot MyBatis 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-mybatis/《芋道 Spring Boot 多数据源(读写分离)入门》.md b/joju-framework/joju-spring-boot-starter-mybatis/《芋道 Spring Boot 多数据源(读写分离)入门》.md new file mode 100644 index 0000000..4707ef8 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/《芋道 Spring Boot 多数据源(读写分离)入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-mybatis/《芋道 Spring Boot 数据库连接池入门》.md b/joju-framework/joju-spring-boot-starter-mybatis/《芋道 Spring Boot 数据库连接池入门》.md new file mode 100644 index 0000000..24b4678 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-mybatis/《芋道 Spring Boot 数据库连接池入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-protection/joju-spring-boot-starter-protection.iml b/joju-framework/joju-spring-boot-starter-protection/joju-spring-boot-starter-protection.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/joju-spring-boot-starter-protection.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-protection/pom.xml b/joju-framework/joju-spring-boot-starter-protection/pom.xml new file mode 100644 index 0000000..4e93753 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/pom.xml @@ -0,0 +1,38 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-protection + jar + + ${project.artifactId} + 服务保证,提供分布式锁、幂等、限流、熔断等等功能 + https://www.jojubanking.com + + + + + com.jojubanking.boot + joju-spring-boot-starter-redis + ${revision} + + + + + com.baomidou + lock4j-redisson-spring-boot-starter + + + + io.github.resilience4j + resilience4j-spring-boot2 + + + + diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/config/JojuIdempotentConfiguration.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/config/JojuIdempotentConfiguration.java new file mode 100644 index 0000000..08051ca --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/config/JojuIdempotentConfiguration.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.framework.idempotent.config; + +import com.jojubanking.boot.framework.idempotent.core.aop.IdempotentAspect; +import com.jojubanking.boot.framework.idempotent.core.keyresolver.impl.DefaultIdempotentKeyResolver; +import com.jojubanking.boot.framework.idempotent.core.keyresolver.impl.ExpressionIdempotentKeyResolver; +import com.jojubanking.boot.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import com.jojubanking.boot.framework.idempotent.core.redis.IdempotentRedisDAO; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import com.jojubanking.boot.framework.redis.config.JojuRedisAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.List; + +@Configuration(proxyBeanMethods = false) +@AutoConfigureAfter(JojuRedisAutoConfiguration.class) +public class JojuIdempotentConfiguration { + + @Bean + public IdempotentAspect idempotentAspect(List keyResolvers, IdempotentRedisDAO idempotentRedisDAO) { + return new IdempotentAspect(keyResolvers, idempotentRedisDAO); + } + + @Bean + public IdempotentRedisDAO idempotentRedisDAO(StringRedisTemplate stringRedisTemplate) { + return new IdempotentRedisDAO(stringRedisTemplate); + } + + // ========== 各种 IdempotentKeyResolver Bean ========== + + @Bean + public DefaultIdempotentKeyResolver defaultIdempotentKeyResolver() { + return new DefaultIdempotentKeyResolver(); + } + + @Bean + public ExpressionIdempotentKeyResolver expressionIdempotentKeyResolver() { + return new ExpressionIdempotentKeyResolver(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/annotation/Idempotent.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/annotation/Idempotent.java new file mode 100644 index 0000000..df2c350 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/annotation/Idempotent.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.framework.idempotent.core.annotation; + +import com.jojubanking.boot.framework.idempotent.core.keyresolver.impl.DefaultIdempotentKeyResolver; +import com.jojubanking.boot.framework.idempotent.core.keyresolver.IdempotentKeyResolver; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.concurrent.TimeUnit; + +/** + * 幂等注解 + * + * @author TW + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Idempotent { + + /** + * 幂等的超时时间,默认为 1 秒 + * + * 注意,如果执行时间超过它,请求还是会进来 + */ + int timeout() default 1; + /** + * 时间单位,默认为 SECONDS 秒 + */ + TimeUnit timeUnit() default TimeUnit.SECONDS; + + /** + * 提示信息,正在执行中的提示 + */ + String message() default "重复请求,请稍后重试"; + + /** + * 使用的 Key 解析器 + */ + Class keyResolver() default DefaultIdempotentKeyResolver.class; + /** + * 使用的 Key 参数 + */ + String keyArg() default ""; + +} diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/aop/IdempotentAspect.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/aop/IdempotentAspect.java new file mode 100644 index 0000000..2f6b1dc --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/aop/IdempotentAspect.java @@ -0,0 +1,56 @@ +package com.jojubanking.boot.framework.idempotent.core.aop; + +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.idempotent.core.annotation.Idempotent; +import com.jojubanking.boot.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import com.jojubanking.boot.framework.idempotent.core.redis.IdempotentRedisDAO; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.util.Assert; + +import java.util.List; +import java.util.Map; + +/** + * 拦截声明了 {@link Idempotent} 注解的方法,实现幂等操作 + * + * @author TW + */ +@Aspect +@Slf4j +public class IdempotentAspect { + + /** + * IdempotentKeyResolver 集合 + */ + private final Map, IdempotentKeyResolver> keyResolvers; + + private final IdempotentRedisDAO idempotentRedisDAO; + + public IdempotentAspect(List keyResolvers, IdempotentRedisDAO idempotentRedisDAO) { + this.keyResolvers = CollectionUtils.convertMap(keyResolvers, IdempotentKeyResolver::getClass); + this.idempotentRedisDAO = idempotentRedisDAO; + } + + @Before("@annotation(idempotent)") + public void beforePointCut(JoinPoint joinPoint, Idempotent idempotent) { + // 获得 IdempotentKeyResolver + IdempotentKeyResolver keyResolver = keyResolvers.get(idempotent.keyResolver()); + Assert.notNull(keyResolver, "找不到对应的 IdempotentKeyResolver"); + // 解析 Key + String key = keyResolver.resolver(joinPoint, idempotent); + + // 锁定 Key。 + boolean success = idempotentRedisDAO.setIfAbsent(key, idempotent.timeout(), idempotent.timeUnit()); + // 锁定失败,抛出异常 + if (!success) { + log.info("[beforePointCut][方法({}) 参数({}) 存在重复请求]", joinPoint.getSignature().toString(), joinPoint.getArgs()); + throw new ServiceException(GlobalErrorCodeConstants.REPEATED_REQUESTS.getCode(), idempotent.message()); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/keyresolver/IdempotentKeyResolver.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/keyresolver/IdempotentKeyResolver.java new file mode 100644 index 0000000..a9357a9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/keyresolver/IdempotentKeyResolver.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.framework.idempotent.core.keyresolver; + +import com.jojubanking.boot.framework.idempotent.core.annotation.Idempotent; +import org.aspectj.lang.JoinPoint; + +/** + * 幂等 Key 解析器接口 + * + * @author TW + */ +public interface IdempotentKeyResolver { + + /** + * 解析一个 Key + * + * @param idempotent 幂等注解 + * @param joinPoint AOP 切面 + * @return Key + */ + String resolver(JoinPoint joinPoint, Idempotent idempotent); + +} diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.java new file mode 100644 index 0000000..bf2cc11 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.framework.idempotent.core.keyresolver.impl; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.jojubanking.boot.framework.idempotent.core.annotation.Idempotent; +import com.jojubanking.boot.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import org.aspectj.lang.JoinPoint; + +/** + * 默认幂等 Key 解析器,使用方法名 + 方法参数,组装成一个 Key + * + * 为了避免 Key 过长,使用 MD5 进行“压缩” + * + * @author TW + */ +public class DefaultIdempotentKeyResolver implements IdempotentKeyResolver { + + @Override + public String resolver(JoinPoint joinPoint, Idempotent idempotent) { + String methodName = joinPoint.getSignature().toString(); + String argsStr = StrUtil.join(",", joinPoint.getArgs()); + return SecureUtil.md5(methodName + argsStr); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java new file mode 100644 index 0000000..ea43f47 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java @@ -0,0 +1,63 @@ +package com.jojubanking.boot.framework.idempotent.core.keyresolver.impl; + +import cn.hutool.core.util.ArrayUtil; +import com.jojubanking.boot.framework.idempotent.core.annotation.Idempotent; +import com.jojubanking.boot.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.lang.reflect.Method; + +/** + * 基于 Spring EL 表达式, + * + * @author TW + */ +public class ExpressionIdempotentKeyResolver implements IdempotentKeyResolver { + + private final ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); + private final ExpressionParser expressionParser = new SpelExpressionParser(); + + @Override + public String resolver(JoinPoint joinPoint, Idempotent idempotent) { + // 获得被拦截方法参数名列表 + Method method = getMethod(joinPoint); + Object[] args = joinPoint.getArgs(); + String[] parameterNames = this.parameterNameDiscoverer.getParameterNames(method); + // 准备 Spring EL 表达式解析的上下文 + StandardEvaluationContext evaluationContext = new StandardEvaluationContext(); + if (ArrayUtil.isNotEmpty(parameterNames)) { + for (int i = 0; i < parameterNames.length; i++) { + evaluationContext.setVariable(parameterNames[i], args[i]); + } + } + + // 解析参数 + Expression expression = expressionParser.parseExpression(idempotent.keyArg()); + return expression.getValue(evaluationContext, String.class); + } + + private static Method getMethod(JoinPoint point) { + // 处理,声明在类上的情况 + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + if (!method.getDeclaringClass().isInterface()) { + return method; + } + + // 处理,声明在接口上的情况 + try { + return point.getTarget().getClass().getDeclaredMethod( + point.getSignature().getName(), method.getParameterTypes()); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/redis/IdempotentRedisDAO.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/redis/IdempotentRedisDAO.java new file mode 100644 index 0000000..f911e08 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/core/redis/IdempotentRedisDAO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.framework.idempotent.core.redis; + +import com.jojubanking.boot.framework.redis.core.RedisKeyDefine; +import lombok.AllArgsConstructor; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.concurrent.TimeUnit; + +import static com.jojubanking.boot.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING; + +/** + * 幂等 Redis DAO + * + * @author TW + */ +@AllArgsConstructor +public class IdempotentRedisDAO { + + private static final RedisKeyDefine IDEMPOTENT = new RedisKeyDefine("幂等操作", + "idempotent:%s", // 参数为 uuid + STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + + private final StringRedisTemplate redisTemplate; + + public Boolean setIfAbsent(String key, long timeout, TimeUnit timeUnit) { + String redisKey = formatKey(key); + return redisTemplate.opsForValue().setIfAbsent(redisKey, "", timeout, timeUnit); + } + + private static String formatKey(String key) { + return String.format(IDEMPOTENT.getKeyTemplate(), key); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/package-info.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/package-info.java new file mode 100644 index 0000000..8be05da --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/framework/idempotent/package-info.java @@ -0,0 +1,12 @@ +/** + * 幂等组件,参考 https://github.com/it4alla/idempotent 项目实现 + * 实现原理是,相同参数的方法,一段时间内,有且仅能执行一次。通过这样的方式,保证幂等性。 + * + * 使用场景:例如说,用户快速的双击了某个按钮,前端没有禁用该按钮,导致发送了两次重复的请求。 + * + * 和 it4alla/idempotent 组件的差异点,主要体现在两点: + * 1. 我们去掉了 @Idempotent 注解的 delKey 属性。原因是,本质上 delKey 为 true 时,实现的是分布式锁的能力 + * 此时,我们偏向使用 Lock4j 组件。原则上,一个组件只提供一种单一的能力。 + * 2. 考虑到组件的通用性,我们并未像 it4alla/idempotent 组件一样使用 Redisson RMap 结构,而是直接使用 Redis 的 String 数据格式。 + */ +package com.jojubanking.boot.framework.idempotent; diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/lock4j/config/JojuLock4jConfiguration.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/lock4j/config/JojuLock4jConfiguration.java new file mode 100644 index 0000000..4b24b99 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/lock4j/config/JojuLock4jConfiguration.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.lock4j.config; + +import cn.hutool.core.util.ClassUtil; +import com.baomidou.lock.spring.boot.autoconfigure.LockAutoConfiguration; +import com.jojubanking.boot.lock4j.core.DefaultLockFailureStrategy; +import com.jojubanking.boot.lock4j.core.Lock4jRedisKeyConstants; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@AutoConfigureBefore(LockAutoConfiguration.class) +public class JojuLock4jConfiguration { + + static { + // 手动加载 Lock4jRedisKeyConstants 类,因为它不会被使用到 + // 如果不加载,会导致 Redis 监控,看到它的 Redis Key 枚举 + ClassUtil.loadClass(Lock4jRedisKeyConstants.class.getName()); + } + + @Bean + public DefaultLockFailureStrategy lockFailureStrategy() { + return new DefaultLockFailureStrategy(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/lock4j/core/DefaultLockFailureStrategy.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/lock4j/core/DefaultLockFailureStrategy.java new file mode 100644 index 0000000..892f45e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/lock4j/core/DefaultLockFailureStrategy.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.lock4j.core; + +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.baomidou.lock.LockFailureStrategy; +import lombok.extern.slf4j.Slf4j; + +/** + * 自定义获取锁失败策略,抛出 {@link ServiceException} 异常 + */ +@Slf4j +public class DefaultLockFailureStrategy implements LockFailureStrategy { + + @Override + public void onLockFailure(String key, long acquireTimeout, int acquireCount) { + log.debug("[onLockFailure][线程:{} 获取锁失败,key:{} 获取超时时长:{} ms]", Thread.currentThread().getName(), key, acquireTimeout); + throw new ServiceException(GlobalErrorCodeConstants.LOCKED); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/lock4j/core/Lock4jRedisKeyConstants.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/lock4j/core/Lock4jRedisKeyConstants.java new file mode 100644 index 0000000..1b5da88 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/lock4j/core/Lock4jRedisKeyConstants.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.lock4j.core; + +import com.jojubanking.boot.framework.redis.core.RedisKeyDefine; +import org.redisson.api.RLock; + +import static com.jojubanking.boot.framework.redis.core.RedisKeyDefine.KeyTypeEnum.HASH; + +/** + * Lock4j Redis Key 枚举类 + * + * @author TW + */ +public interface Lock4jRedisKeyConstants { + + RedisKeyDefine LOCK4J = new RedisKeyDefine("分布式锁", + "lock4j:%s", // 参数来自 DefaultLockKeyBuilder 类 + HASH, RLock.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); // Redisson 的 Lock 锁,使用 Hash 数据结构 + +} diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/lock4j/package-info.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/lock4j/package-info.java new file mode 100644 index 0000000..35e04fb --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/lock4j/package-info.java @@ -0,0 +1,4 @@ +/** + * 分布式锁组件,使用 https://gitee.com/baomidou/lock4j 开源项目 + */ +package com.jojubanking.boot.lock4j; diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/resilience4j/package-info.java b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/resilience4j/package-info.java new file mode 100644 index 0000000..520380b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/resilience4j/package-info.java @@ -0,0 +1,9 @@ +/** + * 使用 Resilience4j 组件,实现服务保障,包括: + * 1. 熔断器 + * 2. 限流器 + * 3. 舱壁隔离 + * 4. 重试 + * 5. 限时器 + */ +package com.jojubanking.boot.resilience4j; diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/resilience4j/《芋道 Spring Boot 服务容错 Resilience4j 入门》.md b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/resilience4j/《芋道 Spring Boot 服务容错 Resilience4j 入门》.md new file mode 100644 index 0000000..3b39ef6 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/java/com/jojubanking/boot/resilience4j/《芋道 Spring Boot 服务容错 Resilience4j 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-protection/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-protection/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..a6989e5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.idempotent.config.JojuIdempotentConfiguration,\ + com.jojubanking.boot.lock4j.config.JojuLock4jConfiguration diff --git a/joju-framework/joju-spring-boot-starter-protection/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-protection/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..a6989e5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/target/classes/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.idempotent.config.JojuIdempotentConfiguration,\ + com.jojubanking.boot.lock4j.config.JojuLock4jConfiguration diff --git a/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/config/JojuIdempotentConfiguration.class b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/config/JojuIdempotentConfiguration.class new file mode 100644 index 0000000..ae01a73 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/config/JojuIdempotentConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/annotation/Idempotent.class b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/annotation/Idempotent.class new file mode 100644 index 0000000..69d8ffc Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/annotation/Idempotent.class differ diff --git a/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/aop/IdempotentAspect.class b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/aop/IdempotentAspect.class new file mode 100644 index 0000000..314f871 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/aop/IdempotentAspect.class differ diff --git a/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/keyresolver/IdempotentKeyResolver.class b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/keyresolver/IdempotentKeyResolver.class new file mode 100644 index 0000000..9f99228 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/keyresolver/IdempotentKeyResolver.class differ diff --git a/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.class b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.class new file mode 100644 index 0000000..2a07e81 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/keyresolver/impl/DefaultIdempotentKeyResolver.class differ diff --git a/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.class b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.class new file mode 100644 index 0000000..50cde55 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.class differ diff --git a/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/redis/IdempotentRedisDAO.class b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/redis/IdempotentRedisDAO.class new file mode 100644 index 0000000..63417f5 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/framework/idempotent/core/redis/IdempotentRedisDAO.class differ diff --git a/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/lock4j/config/JojuLock4jConfiguration.class b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/lock4j/config/JojuLock4jConfiguration.class new file mode 100644 index 0000000..fcdbd21 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/lock4j/config/JojuLock4jConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/lock4j/core/DefaultLockFailureStrategy.class b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/lock4j/core/DefaultLockFailureStrategy.class new file mode 100644 index 0000000..177e443 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/lock4j/core/DefaultLockFailureStrategy.class differ diff --git a/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/lock4j/core/Lock4jRedisKeyConstants.class b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/lock4j/core/Lock4jRedisKeyConstants.class new file mode 100644 index 0000000..49278da Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-protection/target/classes/com/jojubanking/boot/lock4j/core/Lock4jRedisKeyConstants.class differ diff --git a/joju-framework/joju-spring-boot-starter-protection/target/joju-spring-boot-starter-protection-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-protection/target/joju-spring-boot-starter-protection-2.0.0-beta.jar new file mode 100644 index 0000000..6275717 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-protection/target/joju-spring-boot-starter-protection-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-protection/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-protection/target/maven-archiver/pom.properties new file mode 100644 index 0000000..d8b2d6d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:26 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-protection diff --git a/joju-framework/joju-spring-boot-starter-protection/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-protection/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..46fe516 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,10 @@ +com\jojubanking\boot\framework\idempotent\core\keyresolver\impl\DefaultIdempotentKeyResolver.class +com\jojubanking\boot\framework\idempotent\core\keyresolver\impl\ExpressionIdempotentKeyResolver.class +com\jojubanking\boot\framework\idempotent\config\JojuIdempotentConfiguration.class +com\jojubanking\boot\framework\idempotent\core\annotation\Idempotent.class +com\jojubanking\boot\framework\idempotent\core\keyresolver\IdempotentKeyResolver.class +com\jojubanking\boot\framework\idempotent\core\redis\IdempotentRedisDAO.class +com\jojubanking\boot\framework\idempotent\core\aop\IdempotentAspect.class +com\jojubanking\boot\lock4j\core\DefaultLockFailureStrategy.class +com\jojubanking\boot\lock4j\config\JojuLock4jConfiguration.class +com\jojubanking\boot\lock4j\core\Lock4jRedisKeyConstants.class diff --git a/joju-framework/joju-spring-boot-starter-protection/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-protection/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..2ee4b14 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-protection/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,13 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\framework\idempotent\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\framework\idempotent\core\redis\IdempotentRedisDAO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\framework\idempotent\config\JojuIdempotentConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\framework\idempotent\core\keyresolver\impl\DefaultIdempotentKeyResolver.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\lock4j\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\framework\idempotent\core\aop\IdempotentAspect.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\framework\idempotent\core\keyresolver\impl\ExpressionIdempotentKeyResolver.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\framework\idempotent\core\keyresolver\IdempotentKeyResolver.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\framework\idempotent\core\annotation\Idempotent.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\lock4j\core\Lock4jRedisKeyConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\resilience4j\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\lock4j\config\JojuLock4jConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-protection\src\main\java\com\jojubanking\boot\lock4j\core\DefaultLockFailureStrategy.java diff --git a/joju-framework/joju-spring-boot-starter-redis/joju-spring-boot-starter-redis.iml b/joju-framework/joju-spring-boot-starter-redis/joju-spring-boot-starter-redis.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/joju-spring-boot-starter-redis.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-redis/pom.xml b/joju-framework/joju-spring-boot-starter-redis/pom.xml new file mode 100644 index 0000000..eeba924 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/pom.xml @@ -0,0 +1,37 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-redis + jar + + ${project.artifactId} + Redis 封装拓展 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + org.redisson + redisson-spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-cache + + + + + diff --git a/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/config/JojuCacheAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/config/JojuCacheAutoConfiguration.java new file mode 100644 index 0000000..b46e680 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/config/JojuCacheAutoConfiguration.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.framework.redis.config; + +import org.springframework.boot.autoconfigure.cache.CacheProperties; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.RedisSerializer; + +/** + * Cache 配置类,基于 Redis 实现 + */ +@Configuration +@EnableCaching +public class JojuCacheAutoConfiguration { + + /** + * RedisCacheConfiguration Bean + * + * 参考 org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration 的 createConfiguration 方法 + */ + @Bean + @Primary + public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) { + // 设置使用 JSON 序列化方式 + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); + config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json())); + + // 设置 CacheProperties.Redis 的属性 + CacheProperties.Redis redisProperties = cacheProperties.getRedis(); + if (redisProperties.getTimeToLive() != null) { + config = config.entryTtl(redisProperties.getTimeToLive()); + } + if (redisProperties.getKeyPrefix() != null) { + config = config.prefixCacheNameWith(redisProperties.getKeyPrefix()); + } + if (!redisProperties.isCacheNullValues()) { + config = config.disableCachingNullValues(); + } + if (!redisProperties.isUseKeyPrefix()) { + config = config.disableKeyPrefix(); + } + return config; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/config/JojuRedisAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/config/JojuRedisAutoConfiguration.java new file mode 100644 index 0000000..4f1c803 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/config/JojuRedisAutoConfiguration.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.framework.redis.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; + +/** + * Redis 配置类 + */ +@Configuration +public class JojuRedisAutoConfiguration { + + /** + * 创建 RedisTemplate Bean,使用 JSON 序列化方式 + */ + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + // 创建 RedisTemplate 对象 + RedisTemplate template = new RedisTemplate<>(); + // 设置 RedisConnection 工厂。😈 它就是实现多种 Java Redis 客户端接入的秘密工厂。感兴趣的胖友,可以自己去撸下。 + template.setConnectionFactory(factory); + // 使用 String 序列化方式,序列化 KEY 。 + template.setKeySerializer(RedisSerializer.string()); + template.setHashKeySerializer(RedisSerializer.string()); + // 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。 + template.setValueSerializer(RedisSerializer.json()); + template.setHashValueSerializer(RedisSerializer.json()); + return template; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/core/RedisKeyDefine.java b/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/core/RedisKeyDefine.java new file mode 100644 index 0000000..448edab --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/core/RedisKeyDefine.java @@ -0,0 +1,113 @@ +package com.jojubanking.boot.framework.redis.core; + +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +import java.time.Duration; + +/** + * Redis Key 定义类 + * + * @author TW + */ +@Data +public class RedisKeyDefine { + + @Getter + @AllArgsConstructor + public enum KeyTypeEnum { + + STRING("String"), + LIST("List"), + HASH("Hash"), + SET("Set"), + ZSET("Sorted Set"), + STREAM("Stream"), + PUBSUB("Pub/Sub"); + + /** + * 类型 + */ + @JsonValue + private final String type; + + } + + @Getter + @AllArgsConstructor + public enum TimeoutTypeEnum { + + FOREVER(1), // 永不超时 + DYNAMIC(2), // 动态超时 + FIXED(3); // 固定超时 + + /** + * 类型 + */ + @JsonValue + private final Integer type; + + } + + /** + * Key 模板 + */ + private final String keyTemplate; + /** + * Key 类型的枚举 + */ + private final KeyTypeEnum keyType; + /** + * Value 类型 + * + * 如果是使用分布式锁,设置为 {@link java.util.concurrent.locks.Lock} 类型 + */ + private final Class valueType; + /** + * 超时类型 + */ + private final TimeoutTypeEnum timeoutType; + /** + * 过期时间 + */ + private final Duration timeout; + /** + * 备注 + */ + private final String memo; + + private RedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, + TimeoutTypeEnum timeoutType, Duration timeout) { + this.memo = memo; + this.keyTemplate = keyTemplate; + this.keyType = keyType; + this.valueType = valueType; + this.timeout = timeout; + this.timeoutType = timeoutType; + // 添加注册表 + RedisKeyRegistry.add(this); + } + + public RedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, Duration timeout) { + this(memo, keyTemplate, keyType, valueType, TimeoutTypeEnum.FIXED, timeout); + } + + public RedisKeyDefine(String memo, String keyTemplate, KeyTypeEnum keyType, Class valueType, TimeoutTypeEnum timeoutType) { + this(memo, keyTemplate, keyType, valueType, timeoutType, Duration.ZERO); + } + + /** + * 格式化 Key + * + * 注意,内部采用 {@link String#format(String, Object...)} 实现 + * + * @param args 格式化的参数 + * @return Key + */ + public String formatKey(Object... args) { + return String.format(keyTemplate, args); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/core/RedisKeyRegistry.java b/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/core/RedisKeyRegistry.java new file mode 100644 index 0000000..5f5878a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/core/RedisKeyRegistry.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.framework.redis.core; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link RedisKeyDefine} 注册表 + */ +public class RedisKeyRegistry { + + /** + * Redis RedisKeyDefine 数组 + */ + private static final List defines = new ArrayList<>(); + + public static void add(RedisKeyDefine define) { + defines.add(define); + } + + public static List list() { + return defines; + } + + public static int size() { + return defines.size(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/package-info.java b/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/package-info.java new file mode 100644 index 0000000..0e991d2 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/src/main/java/com/jojubanking/boot/framework/redis/package-info.java @@ -0,0 +1,4 @@ +/** + * 采用 Spring Data Redis 操作 Redis,底层使用 Redisson 作为客户端 + */ +package com.jojubanking.boot.framework.redis; diff --git a/joju-framework/joju-spring-boot-starter-redis/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-redis/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..c67bf57 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.redis.config.JojuRedisAutoConfiguration,\ + com.jojubanking.boot.framework.redis.config.JojuCacheAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-redis/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-redis/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..c67bf57 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/target/classes/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.redis.config.JojuRedisAutoConfiguration,\ + com.jojubanking.boot.framework.redis.config.JojuCacheAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/config/JojuCacheAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/config/JojuCacheAutoConfiguration.class new file mode 100644 index 0000000..63a0ad3 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/config/JojuCacheAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/config/JojuRedisAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/config/JojuRedisAutoConfiguration.class new file mode 100644 index 0000000..68a8382 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/config/JojuRedisAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/core/RedisKeyDefine$KeyTypeEnum.class b/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/core/RedisKeyDefine$KeyTypeEnum.class new file mode 100644 index 0000000..b7370bf Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/core/RedisKeyDefine$KeyTypeEnum.class differ diff --git a/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/core/RedisKeyDefine$TimeoutTypeEnum.class b/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/core/RedisKeyDefine$TimeoutTypeEnum.class new file mode 100644 index 0000000..0b782f9 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/core/RedisKeyDefine$TimeoutTypeEnum.class differ diff --git a/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/core/RedisKeyDefine.class b/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/core/RedisKeyDefine.class new file mode 100644 index 0000000..7ae7fa2 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/core/RedisKeyDefine.class differ diff --git a/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/core/RedisKeyRegistry.class b/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/core/RedisKeyRegistry.class new file mode 100644 index 0000000..7ff7de8 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-redis/target/classes/com/jojubanking/boot/framework/redis/core/RedisKeyRegistry.class differ diff --git a/joju-framework/joju-spring-boot-starter-redis/target/joju-spring-boot-starter-redis-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-redis/target/joju-spring-boot-starter-redis-2.0.0-beta.jar new file mode 100644 index 0000000..079632c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-redis/target/joju-spring-boot-starter-redis-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-redis/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-redis/target/maven-archiver/pom.properties new file mode 100644 index 0000000..39725c8 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:25 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-redis diff --git a/joju-framework/joju-spring-boot-starter-redis/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-redis/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..c521456 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,6 @@ +com\jojubanking\boot\framework\redis\config\JojuCacheAutoConfiguration.class +com\jojubanking\boot\framework\redis\core\RedisKeyDefine$KeyTypeEnum.class +com\jojubanking\boot\framework\redis\core\RedisKeyRegistry.class +com\jojubanking\boot\framework\redis\config\JojuRedisAutoConfiguration.class +com\jojubanking\boot\framework\redis\core\RedisKeyDefine.class +com\jojubanking\boot\framework\redis\core\RedisKeyDefine$TimeoutTypeEnum.class diff --git a/joju-framework/joju-spring-boot-starter-redis/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-redis/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..83c2904 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,5 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-redis\src\main\java\com\jojubanking\boot\framework\redis\core\RedisKeyDefine.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-redis\src\main\java\com\jojubanking\boot\framework\redis\core\RedisKeyRegistry.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-redis\src\main\java\com\jojubanking\boot\framework\redis\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-redis\src\main\java\com\jojubanking\boot\framework\redis\config\JojuCacheAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-redis\src\main\java\com\jojubanking\boot\framework\redis\config\JojuRedisAutoConfiguration.java diff --git a/joju-framework/joju-spring-boot-starter-redis/《芋道 Spring Boot Cache 入门》.md b/joju-framework/joju-spring-boot-starter-redis/《芋道 Spring Boot Cache 入门》.md new file mode 100644 index 0000000..41df150 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/《芋道 Spring Boot Cache 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-redis/《芋道 Spring Boot Redis 入门》.md b/joju-framework/joju-spring-boot-starter-redis/《芋道 Spring Boot Redis 入门》.md new file mode 100644 index 0000000..0a31f7c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-redis/《芋道 Spring Boot Redis 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-security/joju-spring-boot-starter-security.iml b/joju-framework/joju-spring-boot-starter-security/joju-spring-boot-starter-security.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/joju-spring-boot-starter-security.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-security/pom.xml b/joju-framework/joju-spring-boot-starter-security/pom.xml new file mode 100644 index 0000000..9d1f3ca --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/pom.xml @@ -0,0 +1,62 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-security + jar + + ${project.artifactId} + 用户的认证、权限的校验 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.jojubanking.boot + joju-spring-boot-starter-web + ${revision} + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.springframework.boot + spring-boot-starter-security + + + + + com.google.guava + guava + + + + + com.jojubanking.boot + joju-module-system-api + ${revision} + + + + diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/config/AuthorizeRequestsCustomizer.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/config/AuthorizeRequestsCustomizer.java new file mode 100644 index 0000000..1f5909e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/config/AuthorizeRequestsCustomizer.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.framework.security.config; + +import com.jojubanking.boot.framework.web.config.WebProperties; +import org.springframework.core.Ordered; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; + +import javax.annotation.Resource; + +/** + * 自定义的 URL 的安全配置 + * 目的:每个 Maven Module 可以自定义规则! + * + * @author TW + */ +public abstract class AuthorizeRequestsCustomizer + implements Customizer.ExpressionInterceptUrlRegistry>, Ordered { + + @Resource + private WebProperties webProperties; + + protected String buildAdminApi(String url) { + return webProperties.getAdminApi().getPrefix() + url; + } + + protected String buildAppApi(String url) { + return webProperties.getAppApi().getPrefix() + url; + } + + @Override + public int getOrder() { + return 0; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/config/JojuSecurityAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/config/JojuSecurityAutoConfiguration.java new file mode 100644 index 0000000..230f8e4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/config/JojuSecurityAutoConfiguration.java @@ -0,0 +1,102 @@ +package com.jojubanking.boot.framework.security.config; + +import com.jojubanking.boot.framework.security.core.aop.PreAuthenticatedAspect; +import com.jojubanking.boot.framework.security.core.context.TransmittableThreadLocalSecurityContextHolderStrategy; +import com.jojubanking.boot.framework.security.core.filter.TokenAuthenticationFilter; +import com.jojubanking.boot.framework.security.core.handler.AccessDeniedHandlerImpl; +import com.jojubanking.boot.framework.security.core.handler.AuthenticationEntryPointImpl; +import com.jojubanking.boot.framework.security.core.service.SecurityFrameworkService; +import com.jojubanking.boot.framework.security.core.service.SecurityFrameworkServiceImpl; +import com.jojubanking.boot.framework.web.core.handler.GlobalExceptionHandler; +import com.jojubanking.boot.module.system.api.oauth2.OAuth2TokenApi; +import com.jojubanking.boot.module.system.api.permission.PermissionApi; +import org.springframework.beans.factory.config.MethodInvokingFactoryBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.access.AccessDeniedHandler; + +import javax.annotation.Resource; + +/** + * Spring Security 自动配置类,主要用于相关组件的配置 + * + * 注意,不能和 {@link JojuWebSecurityConfigurerAdapter} 用一个,原因是会导致初始化报错。 + * 参见 https://stackoverflow.com/questions/53847050/spring-boot-delegatebuilder-cannot-be-null-on-autowiring-authenticationmanager 文档。 + * + * @author TW + */ +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(SecurityProperties.class) +public class JojuSecurityAutoConfiguration { + + @Resource + private SecurityProperties securityProperties; + + /** + * 处理用户未登录拦截的切面的 Bean + */ + @Bean + public PreAuthenticatedAspect preAuthenticatedAspect() { + return new PreAuthenticatedAspect(); + } + + /** + * 认证失败处理类 Bean + */ + @Bean + public AuthenticationEntryPoint authenticationEntryPoint() { + return new AuthenticationEntryPointImpl(); + } + + /** + * 权限不够处理器 Bean + */ + @Bean + public AccessDeniedHandler accessDeniedHandler() { + return new AccessDeniedHandlerImpl(); + } + + /** + * Spring Security 加密器 + * 考虑到安全性,这里采用 BCryptPasswordEncoder 加密器 + * + * @see Password Encoding with Spring Security + */ + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + /** + * Token 认证过滤器 Bean + */ + @Bean + public TokenAuthenticationFilter authenticationTokenFilter(GlobalExceptionHandler globalExceptionHandler, + OAuth2TokenApi oauth2TokenApi) { + return new TokenAuthenticationFilter(securityProperties, globalExceptionHandler, oauth2TokenApi); + } + + @Bean("ss") // 使用 Spring Security 的缩写,方便使用 + public SecurityFrameworkService securityFrameworkService(PermissionApi permissionApi) { + return new SecurityFrameworkServiceImpl(permissionApi); + } + + /** + * 声明调用 {@link SecurityContextHolder#setStrategyName(String)} 方法, + * 设置使用 {@link TransmittableThreadLocalSecurityContextHolderStrategy} 作为 Security 的上下文策略 + */ + @Bean + public MethodInvokingFactoryBean securityContextHolderMethodInvokingFactoryBean() { + MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean(); + methodInvokingFactoryBean.setTargetClass(SecurityContextHolder.class); + methodInvokingFactoryBean.setTargetMethod("setStrategyName"); + methodInvokingFactoryBean.setArguments(TransmittableThreadLocalSecurityContextHolderStrategy.class.getName()); + return methodInvokingFactoryBean; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/config/JojuWebSecurityConfigurerAdapter.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/config/JojuWebSecurityConfigurerAdapter.java new file mode 100644 index 0000000..f131f06 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/config/JojuWebSecurityConfigurerAdapter.java @@ -0,0 +1,185 @@ +package com.jojubanking.boot.framework.security.config; + +import com.jojubanking.boot.framework.security.core.filter.TokenAuthenticationFilter; +import com.jojubanking.boot.framework.web.config.WebProperties; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 自定义的 Spring Security 配置适配器实现 + * + * @author TW + */ +@Configuration +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class JojuWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { + + @Resource + private WebProperties webProperties; + @Resource + private SecurityProperties securityProperties; + + /** + * 认证失败处理类 Bean + */ + @Resource + private AuthenticationEntryPoint authenticationEntryPoint; + /** + * 权限不够处理器 Bean + */ + @Resource + private AccessDeniedHandler accessDeniedHandler; + /** + * Token 认证过滤器 Bean + */ + @Resource + private TokenAuthenticationFilter authenticationTokenFilter; + + /** + * 自定义的权限映射 Bean 们 + * + * @see #configure(HttpSecurity) + */ + @Resource + private List authorizeRequestsCustomizers; + + @Resource + private ApplicationContext applicationContext; + + /** + * 由于 Spring Security 创建 AuthenticationManager 对象时,没声明 @Bean 注解,导致无法被注入 + * 通过覆写父类的该方法,添加 @Bean 注解,解决该问题 + */ + @Override + @Bean + @ConditionalOnMissingBean(AuthenticationManager.class) + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + /** + * 配置 URL 的安全配置 + * + * anyRequest | 匹配所有请求路径 + * access | SpringEl表达式结果为true时可以访问 + * anonymous | 匿名可以访问 + * denyAll | 用户不能访问 + * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) + * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 + * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 + * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 + * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 + * hasRole | 如果有参数,参数表示角色,则其角色可以访问 + * permitAll | 用户可以任意访问 + * rememberMe | 允许通过remember-me登录的用户访问 + * authenticated | 用户登录后可访问 + */ + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception { + // 登出 + httpSecurity + // 开启跨域 + .cors().and() + // CSRF 禁用,因为不使用 Session + .csrf().disable() + // 基于 token 机制,所以不需要 Session + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + .headers().frameOptions().disable().and() + // 一堆自定义的 Spring Security 处理器 + .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint) + .accessDeniedHandler(accessDeniedHandler); + // 登录、登录暂时不使用 Spring Security 的拓展点,主要考虑一方面拓展多用户、多种登录方式相对复杂,一方面用户的学习成本较高 + + // 获得 @PermitAll 带来的 URL 列表,免登录 + Multimap permitAllUrls = getPermitAllUrlsFromAnnotations(); + // 设置每个请求的权限 + httpSecurity + // ①:全局共享规则 + .authorizeRequests() + // 1.1 静态资源,可匿名访问 + .antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js").permitAll() + // 1.2 设置 @PermitAll 无需认证 + .antMatchers(HttpMethod.GET, permitAllUrls.get(HttpMethod.GET).toArray(new String[0])).permitAll() + .antMatchers(HttpMethod.POST, permitAllUrls.get(HttpMethod.POST).toArray(new String[0])).permitAll() + .antMatchers(HttpMethod.PUT, permitAllUrls.get(HttpMethod.PUT).toArray(new String[0])).permitAll() + .antMatchers(HttpMethod.DELETE, permitAllUrls.get(HttpMethod.DELETE).toArray(new String[0])).permitAll() + // 1.3 基于 joju.security.permit-all-urls 无需认证 + .antMatchers(securityProperties.getPermitAllUrls().toArray(new String[0])).permitAll() + // 1.4 设置 App API 无需认证 + .antMatchers(buildAppApi("/**")).permitAll() + // ②:每个项目的自定义规则 + .and().authorizeRequests(registry -> // 下面,循环设置自定义规则 + authorizeRequestsCustomizers.forEach(customizer -> customizer.customize(registry))) + // ③:兜底规则,必须认证 + .authorizeRequests() + .anyRequest().authenticated() + ; + + // 添加 Token Filter + httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + } + + private String buildAppApi(String url) { + return webProperties.getAppApi().getPrefix() + url; + } + + private Multimap getPermitAllUrlsFromAnnotations() { + Multimap result = HashMultimap.create(); + // 获得接口对应的 HandlerMethod 集合 + RequestMappingHandlerMapping requestMappingHandlerMapping = (RequestMappingHandlerMapping) + applicationContext.getBean("requestMappingHandlerMapping"); + Map handlerMethodMap = requestMappingHandlerMapping.getHandlerMethods(); + // 获得有 @PermitAll 注解的接口 + for (Map.Entry entry : handlerMethodMap.entrySet()) { + HandlerMethod handlerMethod = entry.getValue(); + if (!handlerMethod.hasMethodAnnotation(PermitAll.class)) { + continue; + } + if (entry.getKey().getPatternsCondition() == null) { + continue; + } + Set urls = entry.getKey().getPatternsCondition().getPatterns(); + // 根据请求方法,添加到 result 结果 + entry.getKey().getMethodsCondition().getMethods().forEach(requestMethod -> { + switch (requestMethod) { + case GET: + result.putAll(HttpMethod.GET, urls); + break; + case POST: + result.putAll(HttpMethod.POST, urls); + break; + case PUT: + result.putAll(HttpMethod.PUT, urls); + break; + case DELETE: + result.putAll(HttpMethod.DELETE, urls); + break; + } + }); + } + return result; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/config/SecurityProperties.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/config/SecurityProperties.java new file mode 100644 index 0000000..271da05 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/config/SecurityProperties.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.framework.security.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.List; + +@ConfigurationProperties(prefix = "joju.security") +@Validated +@Data +public class SecurityProperties { + + /** + * HTTP 请求时,访问令牌的请求 Header + */ + @NotEmpty(message = "Token Header 不能为空") + private String tokenHeader = "Authorization"; + + /** + * mock 模式的开关 + */ + @NotNull(message = "mock 模式的开关不能为空") + private Boolean mockEnable = false; + /** + * mock 模式的密钥 + * 一定要配置密钥,保证安全性 + */ + @NotEmpty(message = "mock 模式的密钥不能为空") // 这里设置了一个默认值,因为实际上只有 mockEnable 为 true 时才需要配置。 + private String mockSecret = "test"; + + /** + * 免登录的 URL 列表 + */ + private List permitAllUrls = Collections.emptyList(); + +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/LoginUser.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/LoginUser.java new file mode 100644 index 0000000..99f15b2 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/LoginUser.java @@ -0,0 +1,61 @@ +package com.jojubanking.boot.framework.security.core; + +import cn.hutool.core.map.MapUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 登录用户信息 + * + * @author TW + */ +@Data +@Accessors(chain = true) +public class LoginUser { + + /** + * 用户编号 + */ + private Long id; + /** + * 用户类型 + * + * 关联 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 租户编号 + */ + private Long tenantId; + /** + * 授权范围 + */ + private List scopes; + + // ========== 上下文 ========== + /** + * 上下文字段,不进行持久化 + * + * 1. 用于基于 LoginUser 维度的临时缓存 + */ + @JsonIgnore + private Map context; + + public void setContext(String key, Object value) { + if (context == null) { + context = new HashMap<>(); + } + context.put(key, value); + } + + public T getContext(String key, Class type) { + return MapUtil.get(context, key, type); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/annotations/PreAuthenticated.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/annotations/PreAuthenticated.java new file mode 100644 index 0000000..3cfe9e4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/annotations/PreAuthenticated.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.framework.security.core.annotations; + +import java.lang.annotation.*; + +/** + * 声明用户需要登录 + * + * 为什么不使用 {@link org.springframework.security.access.prepost.PreAuthorize} 注解,原因是不通过时,抛出的是认证不通过,而不是未登录 + * + * @author TW + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Inherited +@Documented +public @interface PreAuthenticated { +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/aop/PreAuthenticatedAspect.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/aop/PreAuthenticatedAspect.java new file mode 100644 index 0000000..d26cce7 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/aop/PreAuthenticatedAspect.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.framework.security.core.aop; + +import com.jojubanking.boot.framework.security.core.annotations.PreAuthenticated; +import com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +import static com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED; +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; + +@Aspect +@Slf4j +public class PreAuthenticatedAspect { + + @Around("@annotation(preAuthenticated)") + public Object around(ProceedingJoinPoint joinPoint, PreAuthenticated preAuthenticated) throws Throwable { + if (SecurityFrameworkUtils.getLoginUser() == null) { + throw exception(UNAUTHORIZED); + } + return joinPoint.proceed(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java new file mode 100644 index 0000000..44293b9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.framework.security.core.context; + +import com.alibaba.ttl.TransmittableThreadLocal; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolderStrategy; +import org.springframework.security.core.context.SecurityContextImpl; +import org.springframework.util.Assert; + +/** + * 基于 TransmittableThreadLocal 实现的 Security Context 持有者策略 + * 目的是,避免 @Async 等异步执行时,原生 ThreadLocal 的丢失问题 + * + * @author TW + */ +public class TransmittableThreadLocalSecurityContextHolderStrategy implements SecurityContextHolderStrategy { + + /** + * 使用 TransmittableThreadLocal 作为上下文 + */ + private static final ThreadLocal contextHolder = new TransmittableThreadLocal<>(); + + @Override + public void clearContext() { + contextHolder.remove(); + } + + @Override + public SecurityContext getContext() { + SecurityContext ctx = contextHolder.get(); + if (ctx == null) { + ctx = createEmptyContext(); + contextHolder.set(ctx); + } + return ctx; + } + + @Override + public void setContext(SecurityContext context) { + Assert.notNull(context, "Only non-null SecurityContext instances are permitted"); + contextHolder.set(context); + } + + @Override + public SecurityContext createEmptyContext() { + return new SecurityContextImpl(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/filter/TokenAuthenticationFilter.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/filter/TokenAuthenticationFilter.java new file mode 100644 index 0000000..93ba559 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/filter/TokenAuthenticationFilter.java @@ -0,0 +1,126 @@ +package com.jojubanking.boot.framework.security.core.filter; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import com.jojubanking.boot.framework.security.config.SecurityProperties; +import com.jojubanking.boot.framework.security.core.LoginUser; +import com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils; +import com.jojubanking.boot.framework.web.core.handler.GlobalExceptionHandler; +import com.jojubanking.boot.framework.web.core.util.WebFrameworkUtils; +import com.jojubanking.boot.module.system.api.oauth2.OAuth2TokenApi; +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Token 过滤器,验证 token 的有效性 + * 验证通过后,获得 {@link LoginUser} 信息,并加入到 Spring Security 上下文 + * + * @author TW + */ +@RequiredArgsConstructor +public class TokenAuthenticationFilter extends OncePerRequestFilter { + + private final SecurityProperties securityProperties; + + private final GlobalExceptionHandler globalExceptionHandler; + + private final OAuth2TokenApi oauth2TokenApi; + + @Override + @SuppressWarnings("NullableProblems") + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + String token = SecurityFrameworkUtils.obtainAuthorization(request, securityProperties.getTokenHeader()); + if (StrUtil.isNotEmpty(token)) { + Integer userType = WebFrameworkUtils.getLoginUserType(request); + try { + // 1.1 基于 token 构建登录用户 + LoginUser loginUser = buildLoginUserByToken(token, userType); + // 1.2 模拟 Login 功能,方便日常开发调试 + if (loginUser == null) { + loginUser = mockLoginUser(request, token, userType); + } + + // 2. 设置当前用户 + if (loginUser != null) { + SecurityFrameworkUtils.setLoginUser(loginUser, request); + } + } catch (Throwable ex) { + CommonResult result = globalExceptionHandler.allExceptionHandler(request, ex); + ServletUtils.writeJSON(response, result); + return; + } + } + + // 继续过滤链 + chain.doFilter(request, response); + } + + private LoginUser buildLoginUserByToken(String token, Integer userType) { + try { + OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token); + if (accessToken == null) { + return null; + } + // 用户类型不匹配,无权限 + if (ObjectUtil.notEqual(accessToken.getUserType(), userType)) { + throw new AccessDeniedException("错误的用户类型"); + } + // 构建登录用户 + LoginUser loginUser = new LoginUser(); + loginUser.setUserType(accessToken.getUserType()); + loginUser.setId(accessToken.getUserId()); + loginUser.setTenantId(accessToken.getTenantId()); + loginUser.setScopes(accessToken.getScopes()); + return loginUser; +// return new LoginUser().setUserType(accessToken.getUserType()).setId(accessToken.getUserId()) +// .setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes()); + } catch (ServiceException serviceException) { + // 校验 Token 不通过时,考虑到一些接口是无需登录的,所以直接返回 null 即可 + return null; + } + } + + /** + * 模拟登录用户,方便日常开发调试 + * + * 注意,在线上环境下,一定要关闭该功能!!! + * + * @param request 请求 + * @param token 模拟的 token,格式为 {@link SecurityProperties#getMockSecret()} + 用户编号 + * @param userType 用户类型 + * @return 模拟的 LoginUser + */ + private LoginUser mockLoginUser(HttpServletRequest request, String token, Integer userType) { + if (!securityProperties.getMockEnable()) { + return null; + } + // 必须以 mockSecret 开头 + if (!token.startsWith(securityProperties.getMockSecret())) { + return null; + } + // 构建模拟用户 + Long userId = Long.valueOf(token.substring(securityProperties.getMockSecret().length())); + + LoginUser loginUser = new LoginUser(); + loginUser.setUserType(userType); + loginUser.setId(userId); + loginUser.setTenantId(WebFrameworkUtils.getTenantId(request)); + return loginUser; + +// return new LoginUser().setId(userId).setUserType(userType) +// .setTenantId(WebFrameworkUtils.getTenantId(request)); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/handler/AccessDeniedHandlerImpl.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/handler/AccessDeniedHandlerImpl.java new file mode 100644 index 0000000..73e332c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/handler/AccessDeniedHandlerImpl.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.framework.security.core.handler; + +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.security.web.access.ExceptionTranslationFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +import static com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants.FORBIDDEN; +import static com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED; + +/** + * 访问一个需要认证的 URL 资源,已经认证(登录)但是没有权限的情况下,返回 {@link GlobalErrorCodeConstants#FORBIDDEN} 错误码。 + * + * 补充:Spring Security 通过 {@link ExceptionTranslationFilter#handleAccessDeniedException(HttpServletRequest, HttpServletResponse, FilterChain, AccessDeniedException)} 方法,调用当前类 + * + * @author TW + */ +@Slf4j +@SuppressWarnings("JavadocReference") +public class AccessDeniedHandlerImpl implements AccessDeniedHandler { + + @Override + public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) + throws IOException, ServletException { + // 打印 warn 的原因是,不定期合并 warn,看看有没恶意破坏 + log.warn("[commence][访问 URL({}) 时,用户({}) 权限不够]", request.getRequestURI(), + SecurityFrameworkUtils.getLoginUserId(), e); + // 返回 403 + ServletUtils.writeJSON(response, CommonResult.error(FORBIDDEN)); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/handler/AuthenticationEntryPointImpl.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/handler/AuthenticationEntryPointImpl.java new file mode 100644 index 0000000..47ff757 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/handler/AuthenticationEntryPointImpl.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.framework.security.core.handler; + +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.access.ExceptionTranslationFilter; + +import javax.servlet.FilterChain; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import static com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED; + +/** + * 访问一个需要认证的 URL 资源,但是此时自己尚未认证(登录)的情况下,返回 {@link GlobalErrorCodeConstants#UNAUTHORIZED} 错误码,从而使前端重定向到登录页 + * + * 补充:Spring Security 通过 {@link ExceptionTranslationFilter#sendStartAuthentication(HttpServletRequest, HttpServletResponse, FilterChain, AuthenticationException)} 方法,调用当前类 + * + * @author ruoyi + */ +@Slf4j +@SuppressWarnings("JavadocReference") // 忽略文档引用报错 +public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint { + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) { + log.debug("[commence][访问 URL({}) 时,没有登录]", request.getRequestURI(), e); + // 返回 401 + ServletUtils.writeJSON(response, CommonResult.error(UNAUTHORIZED)); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/service/SecurityFrameworkService.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/service/SecurityFrameworkService.java new file mode 100644 index 0000000..2fac718 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/service/SecurityFrameworkService.java @@ -0,0 +1,59 @@ +package com.jojubanking.boot.framework.security.core.service; + +/** + * Security 框架 Service 接口,定义权限相关的校验操作 + * + * @author TW + */ +public interface SecurityFrameworkService { + + /** + * 判断是否有权限 + * + * @param permission 权限 + * @return 是否 + */ + boolean hasPermission(String permission); + + /** + * 判断是否有权限,任一一个即可 + * + * @param permissions 权限 + * @return 是否 + */ + boolean hasAnyPermissions(String... permissions); + + /** + * 判断是否有角色 + * + * 注意,角色使用的是 SysRoleDO 的 code 标识 + * + * @param role 角色 + * @return 是否 + */ + boolean hasRole(String role); + + /** + * 判断是否有角色,任一一个即可 + * + * @param roles 角色数组 + * @return 是否 + */ + boolean hasAnyRoles(String... roles); + + /** + * 判断是否有授权 + * + * @param scope 授权 + * @return 是否 + */ + boolean hasScope(String scope); + + /** + * 判断是否有授权范围,任一一个即可 + * + * @param scope 授权范围数组 + * @return 是否 + */ + boolean hasAnyScopes(String... scope); +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/service/SecurityFrameworkServiceImpl.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/service/SecurityFrameworkServiceImpl.java new file mode 100644 index 0000000..2c8641c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/service/SecurityFrameworkServiceImpl.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.framework.security.core.service; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.security.core.LoginUser; +import com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils; +import com.jojubanking.boot.module.system.api.permission.PermissionApi; +import lombok.AllArgsConstructor; + +import java.util.Arrays; + +import static com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 默认的 {@link SecurityFrameworkService} 实现类 + * + * @author TW + */ +@AllArgsConstructor +public class SecurityFrameworkServiceImpl implements SecurityFrameworkService { + + private final PermissionApi permissionApi; + + @Override + public boolean hasPermission(String permission) { + return hasAnyPermissions(permission); + } + + @Override + public boolean hasAnyPermissions(String... permissions) { + return permissionApi.hasAnyPermissions(getLoginUserId(), permissions); + } + + @Override + public boolean hasRole(String role) { + return hasAnyRoles(role); + } + + @Override + public boolean hasAnyRoles(String... roles) { + return permissionApi.hasAnyRoles(getLoginUserId(), roles); + } + + @Override + public boolean hasScope(String scope) { + return hasAnyScopes(scope); + } + + @Override + public boolean hasAnyScopes(String... scope) { + LoginUser user = SecurityFrameworkUtils.getLoginUser(); + if (user == null) { + return false; + } + return CollUtil.containsAny(user.getScopes(), Arrays.asList(scope)); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/util/SecurityFrameworkUtils.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/util/SecurityFrameworkUtils.java new file mode 100644 index 0000000..de47029 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/core/util/SecurityFrameworkUtils.java @@ -0,0 +1,109 @@ +package com.jojubanking.boot.framework.security.core.util; + +import com.jojubanking.boot.framework.security.core.LoginUser; +import com.jojubanking.boot.framework.web.core.util.WebFrameworkUtils; +import org.springframework.lang.Nullable; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.Collections; + +/** + * 安全服务工具类 + * + * @author TW + */ +public class SecurityFrameworkUtils { + + public static final String AUTHORIZATION_BEARER = "Bearer"; + + private SecurityFrameworkUtils() {} + + /** + * 从请求中,获得认证 Token + * + * @param request 请求 + * @param header 认证 Token 对应的 Header 名字 + * @return 认证 Token + */ + public static String obtainAuthorization(HttpServletRequest request, String header) { + String authorization = request.getHeader(header); + if (!StringUtils.hasText(authorization)) { + return null; + } + int index = authorization.indexOf(AUTHORIZATION_BEARER + " "); + if (index == -1) { // 未找到 + return null; + } + return authorization.substring(index + 7).trim(); + } + + /** + * 获得当前认证信息 + * + * @return 认证信息 + */ + public static Authentication getAuthentication() { + SecurityContext context = SecurityContextHolder.getContext(); + if (context == null) { + return null; + } + return context.getAuthentication(); + } + + /** + * 获取当前用户 + * + * @return 当前用户 + */ + @Nullable + public static LoginUser getLoginUser() { + Authentication authentication = getAuthentication(); + if (authentication == null) { + return null; + } + return authentication.getPrincipal() instanceof LoginUser ? (LoginUser) authentication.getPrincipal() : null; + } + + /** + * 获得当前用户的编号,从上下文中 + * + * @return 用户编号 + */ + @Nullable + public static Long getLoginUserId() { + LoginUser loginUser = getLoginUser(); + return loginUser != null ? loginUser.getId() : null; + } + + /** + * 设置当前用户 + * + * @param loginUser 登录用户 + * @param request 请求 + */ + public static void setLoginUser(LoginUser loginUser, HttpServletRequest request) { + // 创建 Authentication,并设置到上下文 + Authentication authentication = buildAuthentication(loginUser, request); + SecurityContextHolder.getContext().setAuthentication(authentication); + + // 额外设置到 request 中,用于 ApiAccessLogFilter 可以获取到用户编号; + // 原因是,Spring Security 的 Filter 在 ApiAccessLogFilter 后面,在它记录访问日志时,线上上下文已经没有用户编号等信息 + WebFrameworkUtils.setLoginUserId(request, loginUser.getId()); + WebFrameworkUtils.setLoginUserType(request, loginUser.getUserType()); + } + + private static Authentication buildAuthentication(LoginUser loginUser, HttpServletRequest request) { + // 创建 UsernamePasswordAuthenticationToken 对象 + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + loginUser, null, Collections.emptyList()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + return authenticationToken; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/package-info.java b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/package-info.java new file mode 100644 index 0000000..c80a331 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/java/com/jojubanking/boot/framework/security/package-info.java @@ -0,0 +1,7 @@ +/** + * 基于 Spring Security 框架 + * 实现安全认证功能 + * + * @author TW + */ +package com.jojubanking.boot.framework.security; diff --git a/joju-framework/joju-spring-boot-starter-security/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-security/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..9bbba09 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.security.config.JojuSecurityAutoConfiguration,\ + com.jojubanking.boot.framework.security.config.JojuWebSecurityConfigurerAdapter diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-security/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..9bbba09 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/target/classes/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.security.config.JojuSecurityAutoConfiguration,\ + com.jojubanking.boot.framework.security.config.JojuWebSecurityConfigurerAdapter diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/AuthorizeRequestsCustomizer.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/AuthorizeRequestsCustomizer.class new file mode 100644 index 0000000..e7a8704 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/AuthorizeRequestsCustomizer.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/JojuSecurityAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/JojuSecurityAutoConfiguration.class new file mode 100644 index 0000000..7b5d2fd Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/JojuSecurityAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/JojuWebSecurityConfigurerAdapter$1.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/JojuWebSecurityConfigurerAdapter$1.class new file mode 100644 index 0000000..748462c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/JojuWebSecurityConfigurerAdapter$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/JojuWebSecurityConfigurerAdapter.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/JojuWebSecurityConfigurerAdapter.class new file mode 100644 index 0000000..e352a92 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/JojuWebSecurityConfigurerAdapter.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/SecurityProperties.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/SecurityProperties.class new file mode 100644 index 0000000..19a43dc Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/config/SecurityProperties.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/LoginUser.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/LoginUser.class new file mode 100644 index 0000000..5f7c1d7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/LoginUser.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/annotations/PreAuthenticated.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/annotations/PreAuthenticated.class new file mode 100644 index 0000000..b9f92db Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/annotations/PreAuthenticated.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/aop/PreAuthenticatedAspect.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/aop/PreAuthenticatedAspect.class new file mode 100644 index 0000000..4a19d3e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/aop/PreAuthenticatedAspect.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.class new file mode 100644 index 0000000..3157dea Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/filter/TokenAuthenticationFilter.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/filter/TokenAuthenticationFilter.class new file mode 100644 index 0000000..11a3bba Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/filter/TokenAuthenticationFilter.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/handler/AccessDeniedHandlerImpl.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/handler/AccessDeniedHandlerImpl.class new file mode 100644 index 0000000..3ab7637 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/handler/AccessDeniedHandlerImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/handler/AuthenticationEntryPointImpl.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/handler/AuthenticationEntryPointImpl.class new file mode 100644 index 0000000..9a2591d Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/handler/AuthenticationEntryPointImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/service/SecurityFrameworkService.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/service/SecurityFrameworkService.class new file mode 100644 index 0000000..380f5e0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/service/SecurityFrameworkService.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/service/SecurityFrameworkServiceImpl.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/service/SecurityFrameworkServiceImpl.class new file mode 100644 index 0000000..ab95cde Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/service/SecurityFrameworkServiceImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/util/SecurityFrameworkUtils.class b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/util/SecurityFrameworkUtils.class new file mode 100644 index 0000000..01aafbc Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/classes/com/jojubanking/boot/framework/security/core/util/SecurityFrameworkUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/joju-spring-boot-starter-security-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-security/target/joju-spring-boot-starter-security-2.0.0-beta.jar new file mode 100644 index 0000000..9255f28 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-security/target/joju-spring-boot-starter-security-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-security/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-security/target/maven-archiver/pom.properties new file mode 100644 index 0000000..5076988 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:34 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-security diff --git a/joju-framework/joju-spring-boot-starter-security/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-security/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..404edb1 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,15 @@ +com\jojubanking\boot\framework\security\core\aop\PreAuthenticatedAspect.class +com\jojubanking\boot\framework\security\config\SecurityProperties.class +com\jojubanking\boot\framework\security\core\context\TransmittableThreadLocalSecurityContextHolderStrategy.class +com\jojubanking\boot\framework\security\core\service\SecurityFrameworkService.class +com\jojubanking\boot\framework\security\core\filter\TokenAuthenticationFilter.class +com\jojubanking\boot\framework\security\config\AuthorizeRequestsCustomizer.class +com\jojubanking\boot\framework\security\core\util\SecurityFrameworkUtils.class +com\jojubanking\boot\framework\security\core\LoginUser.class +com\jojubanking\boot\framework\security\core\handler\AuthenticationEntryPointImpl.class +com\jojubanking\boot\framework\security\config\JojuSecurityAutoConfiguration.class +com\jojubanking\boot\framework\security\core\service\SecurityFrameworkServiceImpl.class +com\jojubanking\boot\framework\security\core\handler\AccessDeniedHandlerImpl.class +com\jojubanking\boot\framework\security\config\JojuWebSecurityConfigurerAdapter.class +com\jojubanking\boot\framework\security\config\JojuWebSecurityConfigurerAdapter$1.class +com\jojubanking\boot\framework\security\core\annotations\PreAuthenticated.class diff --git a/joju-framework/joju-spring-boot-starter-security/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-security/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..7936ba6 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,15 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\core\service\SecurityFrameworkServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\core\context\TransmittableThreadLocalSecurityContextHolderStrategy.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\core\LoginUser.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\config\JojuSecurityAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\core\filter\TokenAuthenticationFilter.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\core\handler\AuthenticationEntryPointImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\core\service\SecurityFrameworkService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\config\SecurityProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\core\handler\AccessDeniedHandlerImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\core\util\SecurityFrameworkUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\config\AuthorizeRequestsCustomizer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\config\JojuWebSecurityConfigurerAdapter.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\core\annotations\PreAuthenticated.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-security\src\main\java\com\jojubanking\boot\framework\security\core\aop\PreAuthenticatedAspect.java diff --git a/joju-framework/joju-spring-boot-starter-security/《芋道 Spring Boot 安全框架 Spring Security 入门》.md b/joju-framework/joju-spring-boot-starter-security/《芋道 Spring Boot 安全框架 Spring Security 入门》.md new file mode 100644 index 0000000..09650fa --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-security/《芋道 Spring Boot 安全框架 Spring Security 入门》.md @@ -0,0 +1,2 @@ +* 芋道 Spring Security 入门: +* Spring Security 基本概念: diff --git a/joju-framework/joju-spring-boot-starter-test/joju-spring-boot-starter-test.iml b/joju-framework/joju-spring-boot-starter-test/joju-spring-boot-starter-test.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/joju-spring-boot-starter-test.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-test/pom.xml b/joju-framework/joju-spring-boot-starter-test/pom.xml new file mode 100644 index 0000000..8767c88 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/pom.xml @@ -0,0 +1,62 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-test + jar + + ${project.artifactId} + 测试组件,用于单元测试、集成测试 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + com.jojubanking.boot + joju-spring-boot-starter-mybatis + ${revision} + + + + com.jojubanking.boot + joju-spring-boot-starter-redis + ${revision} + + + + + org.mockito + mockito-inline + + + org.springframework.boot + spring-boot-starter-test + + + + com.h2database + h2 + + + + com.github.fppt + jedis-mock + + + + uk.co.jemos.podam + podam + + + diff --git a/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/config/RedisTestConfiguration.java b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/config/RedisTestConfiguration.java new file mode 100644 index 0000000..57aa7f3 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/config/RedisTestConfiguration.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.framework.test.config; + +import com.github.fppt.jedismock.RedisServer; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +import java.io.IOException; + +/** + * Redis 测试 Configuration,主要实现内嵌 Redis 的启动 + * + * @author TW + */ +@Configuration(proxyBeanMethods = false) +@Lazy(false) // 禁止延迟加载 +@EnableConfigurationProperties(RedisProperties.class) +public class RedisTestConfiguration { + + /** + * 创建模拟的 Redis Server 服务器 + */ + @Bean + public RedisServer redisServer(RedisProperties properties) throws IOException { + RedisServer redisServer = new RedisServer(properties.getPort()); + // 一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。 + try { + redisServer.start(); + } catch (Exception ignore) {} + return redisServer; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/config/SqlInitializationTestConfiguration.java b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/config/SqlInitializationTestConfiguration.java new file mode 100644 index 0000000..f951b78 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/config/SqlInitializationTestConfiguration.java @@ -0,0 +1,52 @@ +package com.jojubanking.boot.framework.test.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; +import org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer; +import org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer; +import org.springframework.boot.sql.init.DatabaseInitializationSettings; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +import javax.sql.DataSource; + +/** + * SQL 初始化的测试 Configuration + * + * 为什么不使用 org.springframework.boot.autoconfigure.sql.init.DataSourceInitializationConfiguration 呢? + * 因为我们在单元测试会使用 spring.main.lazy-initialization 为 true,开启延迟加载。此时,会导致 DataSourceInitializationConfiguration 初始化 + * 不过呢,当前类的实现代码,基本是复制 DataSourceInitializationConfiguration 的哈! + * + * @author TW + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnMissingBean(AbstractScriptDatabaseInitializer.class) +@ConditionalOnSingleCandidate(DataSource.class) +@ConditionalOnClass(name = "org.springframework.jdbc.datasource.init.DatabasePopulator") +@Lazy(value = false) // 禁止延迟加载 +@EnableConfigurationProperties(SqlInitializationProperties.class) +public class SqlInitializationTestConfiguration { + + @Bean + public DataSourceScriptDatabaseInitializer dataSourceScriptDatabaseInitializer(DataSource dataSource, + SqlInitializationProperties initializationProperties) { + DatabaseInitializationSettings settings = createFrom(initializationProperties); + return new DataSourceScriptDatabaseInitializer(dataSource, settings); + } + + static DatabaseInitializationSettings createFrom(SqlInitializationProperties properties) { + DatabaseInitializationSettings settings = new DatabaseInitializationSettings(); + settings.setSchemaLocations(properties.getSchemaLocations()); + settings.setDataLocations(properties.getDataLocations()); + settings.setContinueOnError(properties.isContinueOnError()); + settings.setSeparator(properties.getSeparator()); + settings.setEncoding(properties.getEncoding()); + settings.setMode(properties.getMode()); + return settings; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/BaseDbAndRedisUnitTest.java b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/BaseDbAndRedisUnitTest.java new file mode 100644 index 0000000..0ba8e84 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/BaseDbAndRedisUnitTest.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.framework.test.core.ut; + +import com.jojubanking.boot.framework.datasource.config.JojuDataSourceAutoConfiguration; +import com.jojubanking.boot.framework.mybatis.config.JojuMybatisAutoConfiguration; +import com.jojubanking.boot.framework.redis.config.JojuRedisAutoConfiguration; +import com.jojubanking.boot.framework.test.config.RedisTestConfiguration; +import com.jojubanking.boot.framework.test.config.SqlInitializationTestConfiguration; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +/** + * 依赖内存 DB + Redis 的单元测试 + * + * 相比 {@link BaseDbUnitTest} 来说,额外增加了内存 Redis + * + * @author TW + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB +public class BaseDbAndRedisUnitTest { + + @Import({ + // DB 配置类 + JojuDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类 + SqlInitializationTestConfiguration.class, // SQL 初始化 + // MyBatis 配置类 + JojuMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + + // Redis 配置类 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + JojuRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/BaseDbUnitTest.java b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/BaseDbUnitTest.java new file mode 100644 index 0000000..bd9e1a9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/BaseDbUnitTest.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.framework.test.core.ut; + +import com.jojubanking.boot.framework.datasource.config.JojuDataSourceAutoConfiguration; +import com.jojubanking.boot.framework.mybatis.config.JojuMybatisAutoConfiguration; +import com.jojubanking.boot.framework.test.config.SqlInitializationTestConfiguration; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; + +/** + * 依赖内存 DB 的单元测试 + * + * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法 + * + * @author TW + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB +public class BaseDbUnitTest { + + @Import({ + // DB 配置类 + JojuDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + DruidDataSourceAutoConfigure.class, // Druid 自动配置类 + SqlInitializationTestConfiguration.class, // SQL 初始化 + // MyBatis 配置类 + JojuMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + }) + public static class Application { + } + +} diff --git a/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/BaseMockitoUnitTest.java b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/BaseMockitoUnitTest.java new file mode 100644 index 0000000..49f7d92 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/BaseMockitoUnitTest.java @@ -0,0 +1,13 @@ +package com.jojubanking.boot.framework.test.core.ut; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +/** + * 纯 Mockito 的单元测试 + * + * @author TW + */ +@ExtendWith(MockitoExtension.class) +public class BaseMockitoUnitTest { +} diff --git a/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/BaseRedisUnitTest.java b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/BaseRedisUnitTest.java new file mode 100644 index 0000000..8c3be7e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/BaseRedisUnitTest.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.framework.test.core.ut; + +import com.jojubanking.boot.framework.redis.config.JojuRedisAutoConfiguration; +import com.jojubanking.boot.framework.test.config.RedisTestConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +/** + * 依赖内存 Redis 的单元测试 + * + * 相比 {@link BaseDbUnitTest} 来说,从内存 DB 改成了内存 Redis + * + * @author TW + */ +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisUnitTest.Application.class) +@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件 +public class BaseRedisUnitTest { + + @Import({ + // Redis 配置类 + RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + JojuRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/package-info.java b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/package-info.java new file mode 100644 index 0000000..8828b44 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/ut/package-info.java @@ -0,0 +1,4 @@ +/** + * 提供单元测试 Unit Test 的基类 + */ +package com.jojubanking.boot.framework.test.core.ut; diff --git a/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/util/AssertUtils.java b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/util/AssertUtils.java new file mode 100644 index 0000000..daccced --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/util/AssertUtils.java @@ -0,0 +1,97 @@ +package com.jojubanking.boot.framework.test.core.util; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ReflectUtil; +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.function.Executable; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Objects; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * 单元测试,assert 断言工具类 + * + * @author TW + */ +public class AssertUtils { + + /** + * 比对两个对象的属性是否一致 + * + * 注意,如果 expected 存在的属性,actual 不存在的时候,会进行忽略 + * + * @param expected 期望对象 + * @param actual 实际对象 + * @param ignoreFields 忽略的属性数组 + */ + public static void assertPojoEquals(Object expected, Object actual, String... ignoreFields) { + Field[] expectedFields = ReflectUtil.getFields(expected.getClass()); + Arrays.stream(expectedFields).forEach(expectedField -> { + // 如果是忽略的属性,则不进行比对 + if (ArrayUtil.contains(ignoreFields, expectedField.getName())) { + return; + } + // 忽略不存在的属性 + Field actualField = ReflectUtil.getField(actual.getClass(), expectedField.getName()); + if (actualField == null) { + return; + } + // 比对 + Assertions.assertEquals( + ReflectUtil.getFieldValue(expected, expectedField), + ReflectUtil.getFieldValue(actual, actualField), + String.format("Field(%s) 不匹配", expectedField.getName()) + ); + }); + } + + /** + * 比对两个对象的属性是否一致 + * + * 注意,如果 expected 存在的属性,actual 不存在的时候,会进行忽略 + * + * @param expected 期望对象 + * @param actual 实际对象 + * @param ignoreFields 忽略的属性数组 + * @return 是否一致 + */ + public static boolean isPojoEquals(Object expected, Object actual, String... ignoreFields) { + Field[] expectedFields = ReflectUtil.getFields(expected.getClass()); + return Arrays.stream(expectedFields).allMatch(expectedField -> { + // 如果是忽略的属性,则不进行比对 + if (ArrayUtil.contains(ignoreFields, expectedField.getName())) { + return true; + } + // 忽略不存在的属性 + Field actualField = ReflectUtil.getField(actual.getClass(), expectedField.getName()); + if (actualField == null) { + return true; + } + return Objects.equals(ReflectUtil.getFieldValue(expected, expectedField), + ReflectUtil.getFieldValue(actual, actualField)); + }); + } + + /** + * 执行方法,校验抛出的 Service 是否符合条件 + * + * @param executable 业务异常 + * @param errorCode 错误码对象 + * @param messageParams 消息参数 + */ + public static void assertServiceException(Executable executable, ErrorCode errorCode, Object... messageParams) { + // 调用方法 + ServiceException serviceException = assertThrows(ServiceException.class, executable); + // 校验错误码 + Assertions.assertEquals(errorCode.getCode(), serviceException.getCode(), "错误码不匹配"); + String message = ServiceExceptionUtil.doFormat(errorCode.getCode(), errorCode.getMsg(), messageParams); + Assertions.assertEquals(message, serviceException.getMessage(), "错误提示不匹配"); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/util/RandomUtils.java b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/util/RandomUtils.java new file mode 100644 index 0000000..ec1d11a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/core/util/RandomUtils.java @@ -0,0 +1,119 @@ +package com.jojubanking.boot.framework.test.core.util; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import uk.co.jemos.podam.api.PodamFactory; +import uk.co.jemos.podam.api.PodamFactoryImpl; + +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 随机工具类 + * + * @author TW + */ +public class RandomUtils { + + private static final int RANDOM_STRING_LENGTH = 10; + + private static final int TINYINT_MAX = 127; + + private static final int RANDOM_DATE_MAX = 30; + + private static final int RANDOM_COLLECTION_LENGTH = 5; + + private static final PodamFactory PODAM_FACTORY = new PodamFactoryImpl(); + + static { + // 字符串 + PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(String.class, + (dataProviderStrategy, attributeMetadata, map) -> randomString()); + // Integer + PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(Integer.class, (dataProviderStrategy, attributeMetadata, map) -> { + // 如果是 status 的字段,返回 0 或 1 + if ("status".equals(attributeMetadata.getAttributeName())) { + return RandomUtil.randomEle(CommonStatusEnum.values()).getStatus(); + } + // 如果是 type、status 结尾的字段,返回 tinyint 范围 + if (StrUtil.endWithAnyIgnoreCase(attributeMetadata.getAttributeName(), + "type", "status", "category", "scope")) { + return RandomUtil.randomInt(0, TINYINT_MAX + 1); + } + return RandomUtil.randomInt(); + }); + // Boolean + PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(Boolean.class, (dataProviderStrategy, attributeMetadata, map) -> { + // 如果是 deleted 的字段,返回非删除 + if ("deleted".equals(attributeMetadata.getAttributeName())) { + return false; + } + return RandomUtil.randomBoolean(); + }); + } + + public static String randomString() { + return RandomUtil.randomString(RANDOM_STRING_LENGTH); + } + + public static Long randomLongId() { + return RandomUtil.randomLong(0, Long.MAX_VALUE); + } + + public static Integer randomInteger() { + return RandomUtil.randomInt(0, Integer.MAX_VALUE); + } + + public static Date randomDate() { + return RandomUtil.randomDay(0, RANDOM_DATE_MAX); + } + + public static Short randomShort() { + return (short) RandomUtil.randomInt(0, Short.MAX_VALUE); + } + + public static Set randomSet(Class clazz) { + return Stream.iterate(0, i -> i).limit(RandomUtil.randomInt(1, RANDOM_COLLECTION_LENGTH)) + .map(i -> randomPojo(clazz)).collect(Collectors.toSet()); + } + + public static Integer randomCommonStatus() { + return RandomUtil.randomEle(CommonStatusEnum.values()).getStatus(); + } + + @SafeVarargs + public static T randomPojo(Class clazz, Consumer... consumers) { + T pojo = PODAM_FACTORY.manufacturePojo(clazz); + // 非空时,回调逻辑。通过它,可以实现 Pojo 的进一步处理 + if (ArrayUtil.isNotEmpty(consumers)) { + Arrays.stream(consumers).forEach(consumer -> consumer.accept(pojo)); + } + return pojo; + } + + @SafeVarargs + public static T randomPojo(Class clazz, Type type, Consumer... consumers) { + T pojo = PODAM_FACTORY.manufacturePojo(clazz, type); + // 非空时,回调逻辑。通过它,可以实现 Pojo 的进一步处理 + if (ArrayUtil.isNotEmpty(consumers)) { + Arrays.stream(consumers).forEach(consumer -> consumer.accept(pojo)); + } + return pojo; + } + + @SafeVarargs + public static List randomPojoList(Class clazz, Consumer... consumers) { + int size = RandomUtil.randomInt(1, RANDOM_COLLECTION_LENGTH); + return Stream.iterate(0, i -> i).limit(size).map(o -> randomPojo(clazz, consumers)) + .collect(Collectors.toList()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/package-info.java b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/package-info.java new file mode 100644 index 0000000..ac24935 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/src/main/java/com/jojubanking/boot/framework/test/package-info.java @@ -0,0 +1,4 @@ +/** + * 测试组件,用于单元测试、集成测试等等 + */ +package com.jojubanking.boot.framework.test; diff --git a/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/config/RedisTestConfiguration.class b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/config/RedisTestConfiguration.class new file mode 100644 index 0000000..730a2e8 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/config/RedisTestConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/config/SqlInitializationTestConfiguration.class b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/config/SqlInitializationTestConfiguration.class new file mode 100644 index 0000000..0732417 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/config/SqlInitializationTestConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseDbAndRedisUnitTest$Application.class b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseDbAndRedisUnitTest$Application.class new file mode 100644 index 0000000..b151b11 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseDbAndRedisUnitTest$Application.class differ diff --git a/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseDbAndRedisUnitTest.class b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseDbAndRedisUnitTest.class new file mode 100644 index 0000000..5a3f4d7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseDbAndRedisUnitTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseDbUnitTest$Application.class b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseDbUnitTest$Application.class new file mode 100644 index 0000000..3b9554e Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseDbUnitTest$Application.class differ diff --git a/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseDbUnitTest.class b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseDbUnitTest.class new file mode 100644 index 0000000..2e318c9 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseDbUnitTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseMockitoUnitTest.class b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseMockitoUnitTest.class new file mode 100644 index 0000000..7653c34 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseMockitoUnitTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseRedisUnitTest$Application.class b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseRedisUnitTest$Application.class new file mode 100644 index 0000000..46b76f4 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseRedisUnitTest$Application.class differ diff --git a/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseRedisUnitTest.class b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseRedisUnitTest.class new file mode 100644 index 0000000..b76921c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/ut/BaseRedisUnitTest.class differ diff --git a/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/util/AssertUtils.class b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/util/AssertUtils.class new file mode 100644 index 0000000..74545f0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/util/AssertUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/util/RandomUtils.class b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/util/RandomUtils.class new file mode 100644 index 0000000..b0fb6ef Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-test/target/classes/com/jojubanking/boot/framework/test/core/util/RandomUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-test/target/joju-spring-boot-starter-test-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-test/target/joju-spring-boot-starter-test-2.0.0-beta.jar new file mode 100644 index 0000000..1219fca Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-test/target/joju-spring-boot-starter-test-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-test/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-test/target/maven-archiver/pom.properties new file mode 100644 index 0000000..9490585 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:31 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-test diff --git a/joju-framework/joju-spring-boot-starter-test/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-test/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..3d16fad --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,11 @@ +com\jojubanking\boot\framework\test\core\ut\BaseDbAndRedisUnitTest.class +com\jojubanking\boot\framework\test\core\ut\BaseRedisUnitTest$Application.class +com\jojubanking\boot\framework\test\core\ut\BaseDbAndRedisUnitTest$Application.class +com\jojubanking\boot\framework\test\core\util\AssertUtils.class +com\jojubanking\boot\framework\test\core\ut\BaseDbUnitTest$Application.class +com\jojubanking\boot\framework\test\core\ut\BaseRedisUnitTest.class +com\jojubanking\boot\framework\test\config\RedisTestConfiguration.class +com\jojubanking\boot\framework\test\config\SqlInitializationTestConfiguration.class +com\jojubanking\boot\framework\test\core\util\RandomUtils.class +com\jojubanking\boot\framework\test\core\ut\BaseMockitoUnitTest.class +com\jojubanking\boot\framework\test\core\ut\BaseDbUnitTest.class diff --git a/joju-framework/joju-spring-boot-starter-test/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-test/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..f378e48 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,10 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-test\src\main\java\com\jojubanking\boot\framework\test\config\SqlInitializationTestConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-test\src\main\java\com\jojubanking\boot\framework\test\core\util\RandomUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-test\src\main\java\com\jojubanking\boot\framework\test\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-test\src\main\java\com\jojubanking\boot\framework\test\core\ut\BaseDbAndRedisUnitTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-test\src\main\java\com\jojubanking\boot\framework\test\core\ut\BaseRedisUnitTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-test\src\main\java\com\jojubanking\boot\framework\test\core\ut\BaseDbUnitTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-test\src\main\java\com\jojubanking\boot\framework\test\core\util\AssertUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-test\src\main\java\com\jojubanking\boot\framework\test\config\RedisTestConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-test\src\main\java\com\jojubanking\boot\framework\test\core\ut\BaseMockitoUnitTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-test\src\main\java\com\jojubanking\boot\framework\test\core\ut\package-info.java diff --git a/joju-framework/joju-spring-boot-starter-test/《芋道 Spring Boot 单元测试 Test 入门》.md b/joju-framework/joju-spring-boot-starter-test/《芋道 Spring Boot 单元测试 Test 入门》.md new file mode 100644 index 0000000..716ec77 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-test/《芋道 Spring Boot 单元测试 Test 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-web/joju-spring-boot-starter-web.iml b/joju-framework/joju-spring-boot-starter-web/joju-spring-boot-starter-web.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/joju-spring-boot-starter-web.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-web/pom.xml b/joju-framework/joju-spring-boot-starter-web/pom.xml new file mode 100644 index 0000000..8266f97 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/pom.xml @@ -0,0 +1,72 @@ + + + + com.jojubanking.boot + joju-framework + ${revision} + + 4.0.0 + joju-spring-boot-starter-web + jar + + ${project.artifactId} + Web 框架,全局异常、API 日志等 + https://www.jojubanking.com + + + + com.jojubanking.boot + joju-common + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + com.github.xiaoymin + knife4j-spring-boot-starter + + + io.swagger + swagger-annotations + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.security + spring-security-core + provided + + + + + com.jojubanking.boot + joju-module-infra-api + ${revision} + + + + + io.github.resilience4j + resilience4j-ratelimiter + provided + + + + + diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/config/JojuApiLogAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/config/JojuApiLogAutoConfiguration.java new file mode 100644 index 0000000..5801868 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/config/JojuApiLogAutoConfiguration.java @@ -0,0 +1,55 @@ +package com.jojubanking.boot.framework.apilog.config; + +import com.jojubanking.boot.framework.apilog.core.filter.ApiAccessLogFilter; +import com.jojubanking.boot.framework.apilog.core.service.ApiAccessLogFrameworkService; +import com.jojubanking.boot.framework.apilog.core.service.ApiAccessLogFrameworkServiceImpl; +import com.jojubanking.boot.framework.apilog.core.service.ApiErrorLogFrameworkService; +import com.jojubanking.boot.framework.apilog.core.service.ApiErrorLogFrameworkServiceImpl; +import com.jojubanking.boot.framework.common.enums.WebFilterOrderEnum; +import com.jojubanking.boot.framework.web.config.WebProperties; +import com.jojubanking.boot.framework.web.config.JojuWebAutoConfiguration; +import com.jojubanking.boot.module.infra.api.logger.ApiAccessLogApi; +import com.jojubanking.boot.module.infra.api.logger.ApiErrorLogApi; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.servlet.Filter; + +@Configuration +@AutoConfigureAfter(JojuWebAutoConfiguration.class) +public class JojuApiLogAutoConfiguration { + + @Bean + public ApiAccessLogFrameworkService apiAccessLogFrameworkService(ApiAccessLogApi apiAccessLogApi) { + return new ApiAccessLogFrameworkServiceImpl(apiAccessLogApi); + } + + @Bean + public ApiErrorLogFrameworkService apiErrorLogFrameworkService(ApiErrorLogApi apiErrorLogApi) { + return new ApiErrorLogFrameworkServiceImpl(apiErrorLogApi); + } + + /** + * 创建 ApiAccessLogFilter Bean,记录 API 请求日志 + */ + @Bean + @ConditionalOnProperty(prefix = "joju.access-log", value = "enable", matchIfMissing = true) + // 允许使用 joju.access-log.enable=false 禁用访问日志 + public FilterRegistrationBean apiAccessLogFilter(WebProperties webProperties, + @Value("${spring.application.name}") String applicationName, + ApiAccessLogFrameworkService apiAccessLogFrameworkService) { + ApiAccessLogFilter filter = new ApiAccessLogFilter(webProperties, applicationName, apiAccessLogFrameworkService); + return createFilterBean(filter, WebFilterOrderEnum.API_ACCESS_LOG_FILTER); + } + + private static FilterRegistrationBean createFilterBean(T filter, Integer order) { + FilterRegistrationBean bean = new FilterRegistrationBean<>(filter); + bean.setOrder(order); + return bean; + } + +} \ No newline at end of file diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/filter/ApiAccessLogFilter.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/filter/ApiAccessLogFilter.java new file mode 100644 index 0000000..6dd9d16 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/filter/ApiAccessLogFilter.java @@ -0,0 +1,110 @@ +package com.jojubanking.boot.framework.apilog.core.filter; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.extra.servlet.ServletUtil; +import com.jojubanking.boot.framework.apilog.core.service.ApiAccessLog; +import com.jojubanking.boot.framework.apilog.core.service.ApiAccessLogFrameworkService; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.common.util.monitor.TracerUtils; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import com.jojubanking.boot.framework.web.config.WebProperties; +import com.jojubanking.boot.framework.web.core.filter.ApiRequestFilter; +import com.jojubanking.boot.framework.web.core.util.WebFrameworkUtils; +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Date; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString; + +/** + * API 访问日志 Filter + * + * @author TW + */ +@Slf4j +public class ApiAccessLogFilter extends ApiRequestFilter { + + private final String applicationName; + + private final ApiAccessLogFrameworkService apiAccessLogFrameworkService; + + public ApiAccessLogFilter(WebProperties webProperties, String applicationName, ApiAccessLogFrameworkService apiAccessLogFrameworkService) { + super(webProperties); + this.applicationName = applicationName; + this.apiAccessLogFrameworkService = apiAccessLogFrameworkService; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + // 获得开始时间 + Date beginTim = new Date(); + // 提前获得参数,避免 XssFilter 过滤处理 + Map queryString = ServletUtil.getParamMap(request); + String requestBody = ServletUtils.isJsonRequest(request) ? ServletUtil.getBody(request) : null; + + try { + // 继续过滤器 + filterChain.doFilter(request, response); + // 正常执行,记录日志 + createApiAccessLog(request, beginTim, queryString, requestBody, null); + } catch (Exception ex) { + // 异常执行,记录日志 + createApiAccessLog(request, beginTim, queryString, requestBody, ex); + throw ex; + } + } + + private void createApiAccessLog(HttpServletRequest request, Date beginTime, + Map queryString, String requestBody, Exception ex) { + ApiAccessLog accessLog = new ApiAccessLog(); + try { + this.buildApiAccessLogDTO(accessLog, request, beginTime, queryString, requestBody, ex); + apiAccessLogFrameworkService.createApiAccessLog(accessLog); + } catch (Throwable th) { + log.error("[createApiAccessLog][url({}) log({}) 发生异常]", request.getRequestURI(), toJsonString(accessLog), th); + } + } + + private void buildApiAccessLogDTO(ApiAccessLog accessLog, HttpServletRequest request, Date beginTime, + Map queryString, String requestBody, Exception ex) { + // 处理用户信息 + accessLog.setUserId(WebFrameworkUtils.getLoginUserId(request)); + accessLog.setUserType(WebFrameworkUtils.getLoginUserType(request)); + // 设置访问结果 + CommonResult result = WebFrameworkUtils.getCommonResult(request); + if (result != null) { + accessLog.setResultCode(result.getCode()); + accessLog.setResultMsg(result.getMsg()); + } else if (ex != null) { + accessLog.setResultCode(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode()); + accessLog.setResultMsg(ExceptionUtil.getRootCauseMessage(ex)); + } else { + accessLog.setResultCode(0); + accessLog.setResultMsg(""); + } + // 设置其它字段 + accessLog.setTraceId(TracerUtils.getTraceId()); + accessLog.setApplicationName(applicationName); + accessLog.setRequestUrl(request.getRequestURI()); + Map requestParams = MapUtil.builder().put("query", queryString).put("body", requestBody).build(); + accessLog.setRequestParams(toJsonString(requestParams)); + accessLog.setRequestMethod(request.getMethod()); + accessLog.setUserAgent(ServletUtils.getUserAgent(request)); + accessLog.setUserIp(ServletUtil.getClientIP(request)); + // 持续时间 + accessLog.setBeginTime(beginTime); + accessLog.setEndTime(new Date()); + accessLog.setDuration((int) DateUtils.diff(accessLog.getEndTime(), accessLog.getBeginTime())); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLog.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLog.java new file mode 100644 index 0000000..a10519f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLog.java @@ -0,0 +1,85 @@ +package com.jojubanking.boot.framework.apilog.core.service; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * API 访问日志 + * + * @author TW + */ +@Data +public class ApiAccessLog { + + /** + * 链路追踪编号 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + + /** + * 请求方法名 + */ + @NotNull(message = "http 请求方法不能为空") + private String requestMethod; + /** + * 访问地址 + */ + @NotNull(message = "访问地址不能为空") + private String requestUrl; + /** + * 请求参数 + */ + @NotNull(message = "请求参数不能为空") + private String requestParams; + /** + * 用户 IP + */ + @NotNull(message = "ip 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotNull(message = "User-Agent 不能为空") + private String userAgent; + + /** + * 开始请求时间 + */ + @NotNull(message = "开始请求时间不能为空") + private Date beginTime; + /** + * 结束请求时间 + */ + @NotNull(message = "结束请求时间不能为空") + private Date endTime; + /** + * 执行时长,单位:毫秒 + */ + @NotNull(message = "执行时长不能为空") + private Integer duration; + /** + * 结果码 + */ + @NotNull(message = "错误码不能为空") + private Integer resultCode; + /** + * 结果提示 + */ + private String resultMsg; + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLogFrameworkService.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLogFrameworkService.java new file mode 100644 index 0000000..b68f003 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLogFrameworkService.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.framework.apilog.core.service; + +/** + * API 访问日志 Framework Service 接口 + * + * @author TW + */ +public interface ApiAccessLogFrameworkService { + + /** + * 创建 API 访问日志 + * + * @param apiAccessLog API 访问日志 + */ + void createApiAccessLog(ApiAccessLog apiAccessLog); + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java new file mode 100644 index 0000000..28fb55a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.framework.apilog.core.service; + +import cn.hutool.core.bean.BeanUtil; +import com.jojubanking.boot.module.infra.api.logger.ApiAccessLogApi; +import com.jojubanking.boot.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Async; + +/** + * API 访问日志 Framework Service 实现类 + * + * 基于 {@link ApiAccessLogApi} 服务,记录访问日志 + * + * @author TW + */ +@RequiredArgsConstructor +public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkService { + + private final ApiAccessLogApi apiAccessLogApi; + + @Override + @Async + public void createApiAccessLog(ApiAccessLog apiAccessLog) { + ApiAccessLogCreateReqDTO reqDTO = BeanUtil.copyProperties(apiAccessLog, ApiAccessLogCreateReqDTO.class); + apiAccessLogApi.createApiAccessLog(reqDTO); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLog.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLog.java new file mode 100644 index 0000000..91ba795 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLog.java @@ -0,0 +1,107 @@ +package com.jojubanking.boot.framework.apilog.core.service; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * API 错误日志 + * + * @author TW + */ +@Data +public class ApiErrorLog { + + /** + * 链路编号 + */ + private String traceId; + /** + * 账号编号 + */ + private Long userId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + + /** + * 请求方法名 + */ + @NotNull(message = "http 请求方法不能为空") + private String requestMethod; + /** + * 访问地址 + */ + @NotNull(message = "访问地址不能为空") + private String requestUrl; + /** + * 请求参数 + */ + @NotNull(message = "请求参数不能为空") + private String requestParams; + /** + * 用户 IP + */ + @NotNull(message = "ip 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotNull(message = "User-Agent 不能为空") + private String userAgent; + + /** + * 异常时间 + */ + @NotNull(message = "异常时间不能为空") + private Date exceptionTime; + /** + * 异常名 + */ + @NotNull(message = "异常名不能为空") + private String exceptionName; + /** + * 异常发生的类全名 + */ + @NotNull(message = "异常发生的类全名不能为空") + private String exceptionClassName; + /** + * 异常发生的类文件 + */ + @NotNull(message = "异常发生的类文件不能为空") + private String exceptionFileName; + /** + * 异常发生的方法名 + */ + @NotNull(message = "异常发生的方法名不能为空") + private String exceptionMethodName; + /** + * 异常发生的方法所在行 + */ + @NotNull(message = "异常发生的方法所在行不能为空") + private Integer exceptionLineNumber; + /** + * 异常的栈轨迹异常的栈轨迹 + */ + @NotNull(message = "异常的栈轨迹不能为空") + private String exceptionStackTrace; + /** + * 异常导致的根消息 + */ + @NotNull(message = "异常导致的根消息不能为空") + private String exceptionRootCauseMessage; + /** + * 异常导致的消息 + */ + @NotNull(message = "异常导致的消息不能为空") + private String exceptionMessage; + + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLogFrameworkService.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLogFrameworkService.java new file mode 100644 index 0000000..cd09f1d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLogFrameworkService.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.framework.apilog.core.service; + +/** + * API 错误日志 Framework Service 接口 + * + * @author TW + */ +public interface ApiErrorLogFrameworkService { + + /** + * 创建 API 错误日志 + * + * @param apiErrorLog API 错误日志 + */ + void createApiErrorLog(ApiErrorLog apiErrorLog); + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java new file mode 100644 index 0000000..9af317e --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.framework.apilog.core.service; + +import cn.hutool.core.bean.BeanUtil; +import com.jojubanking.boot.module.infra.api.logger.ApiErrorLogApi; +import com.jojubanking.boot.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Async; + +/** + * API 错误日志 Framework Service 实现类 + * + * 基于 {@link ApiErrorLogApi} 服务,记录错误日志 + * + * @author TW + */ +@RequiredArgsConstructor +public class ApiErrorLogFrameworkServiceImpl implements ApiErrorLogFrameworkService { + + private final ApiErrorLogApi apiErrorLogApi; + + @Override + @Async + public void createApiErrorLog(ApiErrorLog apiErrorLog) { + ApiErrorLogCreateReqDTO reqDTO = BeanUtil.copyProperties(apiErrorLog, ApiErrorLogCreateReqDTO.class); + apiErrorLogApi.createApiErrorLog(reqDTO); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/package-info.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/package-info.java new file mode 100644 index 0000000..c7fc529 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/apilog/package-info.java @@ -0,0 +1,8 @@ +/** + * API 日志:包含两类 + * 1. API 访问日志:记录用户访问 API 的访问日志,定期归档历史日志。 + * 2. 异常日志:记录用户访问 API 的系统异常,方便日常排查问题与告警。 + * + * @author TW + */ +package com.jojubanking.boot.framework.apilog; diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/jackson/config/JojuJacksonAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/jackson/config/JojuJacksonAutoConfiguration.java new file mode 100644 index 0000000..717f889 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/jackson/config/JojuJacksonAutoConfiguration.java @@ -0,0 +1,49 @@ +package com.jojubanking.boot.framework.jackson.config; + +import com.jojubanking.boot.framework.jackson.core.databind.LocalDateTimeDeserializer; +import com.jojubanking.boot.framework.jackson.core.databind.LocalDateTimeSerializer; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.time.LocalDateTime; + +@Slf4j +@Configuration +public class JojuJacksonAutoConfiguration { + + @Bean + public BeanPostProcessor objectMapperBeanPostProcessor() { + return new BeanPostProcessor() { + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (!(bean instanceof ObjectMapper)) { + return bean; + } + ObjectMapper objectMapper = (ObjectMapper) bean; + SimpleModule simpleModule = new SimpleModule(); + /* + * 1. 新增Long类型序列化规则,数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型 + * 2. 新增LocalDateTime序列化、反序列化规则 + */ + simpleModule +// .addSerializer(Long.class, ToStringSerializer.instance) +// .addSerializer(Long.TYPE, ToStringSerializer.instance) + .addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE) + .addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE); + + objectMapper.registerModules(simpleModule); + + JsonUtils.init(objectMapper); + log.info("初始化 jackson 自动配置"); + return bean; + } + }; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/jackson/core/databind/LocalDateTimeDeserializer.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/jackson/core/databind/LocalDateTimeDeserializer.java new file mode 100644 index 0000000..3d85f74 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/jackson/core/databind/LocalDateTimeDeserializer.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.framework.jackson.core.databind; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +/** + * LocalDateTime反序列化规则 + *

+ * 会将毫秒级时间戳反序列化为LocalDateTime + */ +public class LocalDateTimeDeserializer extends JsonDeserializer { + + public static final LocalDateTimeDeserializer INSTANCE = new LocalDateTimeDeserializer(); + + @Override + public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { + return LocalDateTime.ofInstant(Instant.ofEpochMilli(p.getValueAsLong()), ZoneId.systemDefault()); + } +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/jackson/core/databind/LocalDateTimeSerializer.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/jackson/core/databind/LocalDateTimeSerializer.java new file mode 100644 index 0000000..52ed6bb --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/jackson/core/databind/LocalDateTimeSerializer.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.framework.jackson.core.databind; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneId; + +/** + * LocalDateTime序列化规则 + *

+ * 会将LocalDateTime序列化为毫秒级时间戳 + */ +public class LocalDateTimeSerializer extends JsonSerializer { + + public static final LocalDateTimeSerializer INSTANCE = new LocalDateTimeSerializer(); + + @Override + public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeNumber(value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()); + } +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/jackson/core/package-info.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/jackson/core/package-info.java new file mode 100644 index 0000000..7f87b28 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/jackson/core/package-info.java @@ -0,0 +1 @@ +package com.jojubanking.boot.framework.jackson.core; diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/package-info.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/package-info.java new file mode 100644 index 0000000..d6bc2f5 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/package-info.java @@ -0,0 +1 @@ +package com.jojubanking.boot.framework; diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/swagger/config/JojuSwaggerAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/swagger/config/JojuSwaggerAutoConfiguration.java new file mode 100644 index 0000000..135c29c --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/swagger/config/JojuSwaggerAutoConfiguration.java @@ -0,0 +1,119 @@ +package com.jojubanking.boot.framework.swagger.config; + +import com.jojubanking.boot.framework.swagger.core.SpringFoxHandlerProviderBeanPostProcessor; +import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +import com.jojubanking.boot.framework.web.core.util.WebFrameworkUtils; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.ExampleBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestParameterBuilder; +import springfox.documentation.service.*; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.Collections; +import java.util.List; + +import static springfox.documentation.builders.RequestHandlerSelectors.basePackage; + +/** + * Swagger2 自动配置类 + * + * @author TW + */ +@Configuration +@EnableSwagger2 +@EnableKnife4j +@ConditionalOnClass({Docket.class, ApiInfoBuilder.class}) +// 允许使用 swagger.enable=false 禁用 Swagger +@ConditionalOnProperty(prefix = "joju.swagger", value = "enable", matchIfMissing = true) +@EnableConfigurationProperties(SwaggerProperties.class) +public class JojuSwaggerAutoConfiguration { + + @Bean + public SpringFoxHandlerProviderBeanPostProcessor springFoxHandlerProviderBeanPostProcessor() { + return new SpringFoxHandlerProviderBeanPostProcessor(); + } + + @Bean + public Docket createRestApi(SwaggerProperties properties) { + // 创建 Docket 对象 + return new Docket(DocumentationType.SWAGGER_2) + // ① 用来创建该 API 的基本信息,展示在文档的页面中(自定义展示的信息) + .apiInfo(apiInfo(properties)) + // ② 设置扫描指定 package 包下的 + .select() + .apis(basePackage(properties.getBasePackage())) +// .apis(basePackage("com.jojubanking.boot.module.system")) // 可用于 swagger 无法展示时使用 + .paths(PathSelectors.any()) + .build() + // ③ 安全上下文(认证) + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + // ④ 全局参数(多租户 header) + .globalRequestParameters(globalRequestParameters()); + } + + // ========== apiInfo ========== + + /** + * API 摘要信息 + */ + private static ApiInfo apiInfo(SwaggerProperties properties) { + return new ApiInfoBuilder() + .title(properties.getTitle()) + .description(properties.getDescription()) + .contact(new Contact(properties.getAuthor(), null, null)) + .version(properties.getVersion()) + .build(); + } + + // ========== securitySchemes ========== + + /** + * 安全模式,这里配置通过请求头 Authorization 传递 token 参数 + */ + private static List securitySchemes() { + return Collections.singletonList(new ApiKey(HttpHeaders.AUTHORIZATION, "Authorization", "header")); + } + + /** + * 安全上下文 + * + * @see #securitySchemes() + * @see #authorizationScopes() + */ + private static List securityContexts() { + return Collections.singletonList(SecurityContext.builder() + .securityReferences(securityReferences()) + // 通过 PathSelectors.regex("^(?!auth).*$"),排除包含 "auth" 的接口不需要使用securitySchemes + .operationSelector(o -> o.requestMappingPattern().matches("^(?!auth).*$")) + .build()); + } + + private static List securityReferences() { + return Collections.singletonList(new SecurityReference(HttpHeaders.AUTHORIZATION, authorizationScopes())); + } + + private static AuthorizationScope[] authorizationScopes() { + return new AuthorizationScope[]{new AuthorizationScope("global", "accessEverything")}; + } + + // ========== globalRequestParameters ========== + + private static List globalRequestParameters() { + RequestParameterBuilder tenantParameter = new RequestParameterBuilder() + .name(WebFrameworkUtils.HEADER_TENANT_ID).description("租户编号") + .in(ParameterType.HEADER).example(new ExampleBuilder().value(1L).build()); + return Collections.singletonList(tenantParameter.build()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/swagger/config/SwaggerProperties.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/swagger/config/SwaggerProperties.java new file mode 100644 index 0000000..e849f14 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/swagger/config/SwaggerProperties.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.framework.swagger.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import javax.validation.constraints.NotEmpty; + +/** + * Swagger 配置属性 + * + * @author TW + */ +@ConfigurationProperties("joju.swagger") +@Data +public class SwaggerProperties { + + /** + * 标题 + */ + @NotEmpty(message = "标题不能为空") + private String title; + /** + * 描述 + */ + @NotEmpty(message = "描述不能为空") + private String description; + /** + * 作者 + */ + @NotEmpty(message = "作者不能为空") + private String author; + /** + * 版本 + */ + @NotEmpty(message = "版本不能为空") + private String version; + /** + * 扫描的包 + */ + @NotEmpty(message = "扫描的 package 不能为空") + private String basePackage; + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/swagger/core/SpringFoxHandlerProviderBeanPostProcessor.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/swagger/core/SpringFoxHandlerProviderBeanPostProcessor.java new file mode 100644 index 0000000..d36caa9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/swagger/core/SpringFoxHandlerProviderBeanPostProcessor.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.framework.swagger.core; + +import cn.hutool.core.util.ReflectUtil; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; +import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; +import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; + +import java.util.List; + +/** + * 解决 SpringFox 与 SpringBoot 2.6.x 不兼容的问题 + * 该问题对应的 issue 为 https://github.com/springfox/springfox/issues/3462 + * + * @author TW + */ +public class SpringFoxHandlerProviderBeanPostProcessor implements BeanPostProcessor { + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { + customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); + } + return bean; + } + + private void customizeSpringfoxHandlerMappings(List mappings) { + // 移除,只保留 patternParser + List copy = CollectionUtils.filterList(mappings, mapping -> mapping.getPatternParser() == null); + // 添加到 mappings 中 + mappings.clear(); + mappings.addAll(copy); + } + + @SuppressWarnings("unchecked") + private List getHandlerMappings(Object bean) { + return (List) + ReflectUtil.getFieldValue(bean, "handlerMappings"); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/swagger/package-info.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/swagger/package-info.java new file mode 100644 index 0000000..24cfdb6 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/swagger/package-info.java @@ -0,0 +1,6 @@ +/** + * 基于 Swagger + Knife4j 实现 API 接口文档 + * + * @author TW + */ +package com.jojubanking.boot.framework.swagger; diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/config/JojuWebAutoConfiguration.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/config/JojuWebAutoConfiguration.java new file mode 100644 index 0000000..631a16f --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/config/JojuWebAutoConfiguration.java @@ -0,0 +1,126 @@ +package com.jojubanking.boot.framework.web.config; + +import com.jojubanking.boot.framework.apilog.core.service.ApiErrorLogFrameworkService; +import com.jojubanking.boot.framework.common.enums.WebFilterOrderEnum; +import com.jojubanking.boot.framework.web.core.filter.CacheRequestBodyFilter; +import com.jojubanking.boot.framework.web.core.filter.DemoFilter; +import com.jojubanking.boot.framework.web.core.filter.XssFilter; +import com.jojubanking.boot.framework.web.core.handler.GlobalExceptionHandler; +import com.jojubanking.boot.framework.web.core.handler.GlobalResponseBodyHandler; +import com.jojubanking.boot.framework.web.core.util.WebFrameworkUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import javax.annotation.Resource; +import javax.servlet.Filter; + +@Configuration +@EnableConfigurationProperties({WebProperties.class, XssProperties.class}) +public class JojuWebAutoConfiguration implements WebMvcConfigurer { + + @Resource + private WebProperties webProperties; + /** + * 应用名 + */ + @Value("${spring.application.name}") + private String applicationName; + + @Override + public void configurePathMatch(PathMatchConfigurer configurer) { + configurePathMatch(configurer, webProperties.getAdminApi()); + configurePathMatch(configurer, webProperties.getAppApi()); + } + + /** + * 设置 API 前缀,仅仅匹配 controller 包下的 + * + * @param configurer 配置 + * @param api API 配置 + */ + private void configurePathMatch(PathMatchConfigurer configurer, WebProperties.Api api) { + AntPathMatcher antPathMatcher = new AntPathMatcher("."); + configurer.addPathPrefix(api.getPrefix(), clazz -> clazz.isAnnotationPresent(RestController.class) + && antPathMatcher.match(api.getController(), clazz.getPackage().getName())); // 仅仅匹配 controller 包 + } + + @Bean + public GlobalExceptionHandler globalExceptionHandler(ApiErrorLogFrameworkService ApiErrorLogFrameworkService) { + return new GlobalExceptionHandler(applicationName, ApiErrorLogFrameworkService); + } + + @Bean + public GlobalResponseBodyHandler globalResponseBodyHandler() { + return new GlobalResponseBodyHandler(); + } + + @Bean + @SuppressWarnings("InstantiationOfUtilityClass") + public WebFrameworkUtils webFrameworkUtils(WebProperties webProperties) { + // 由于 WebFrameworkUtils 需要使用到 webProperties 属性,所以注册为一个 Bean + return new WebFrameworkUtils(webProperties); + } + + // ========== Filter 相关 ========== + + /** + * 创建 CorsFilter Bean,解决跨域问题 + */ + @Bean + public FilterRegistrationBean corsFilterBean() { + // 创建 CorsConfiguration 对象 + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + config.addAllowedOriginPattern("*"); // 设置访问源地址 + config.addAllowedHeader("*"); // 设置访问源请求头 + config.addAllowedMethod("*"); // 设置访问源请求方法 + // 创建 UrlBasedCorsConfigurationSource 对象 + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); // 对接口配置跨域设置 + return createFilterBean(new CorsFilter(source), WebFilterOrderEnum.CORS_FILTER); + } + + /** + * 创建 RequestBodyCacheFilter Bean,可重复读取请求内容 + */ + @Bean + public FilterRegistrationBean requestBodyCacheFilter() { + return createFilterBean(new CacheRequestBodyFilter(), WebFilterOrderEnum.REQUEST_BODY_CACHE_FILTER); + } + + /** + * 创建 XssFilter Bean,解决 Xss 安全问题 + */ + @Bean + public FilterRegistrationBean xssFilter(XssProperties properties, PathMatcher pathMatcher) { + return createFilterBean(new XssFilter(properties, pathMatcher), WebFilterOrderEnum.XSS_FILTER); + } + + /** + * 创建 DemoFilter Bean,演示模式 + */ + @Bean + @ConditionalOnProperty(value = "joju.demo", havingValue = "true") + public FilterRegistrationBean demoFilter() { + return createFilterBean(new DemoFilter(), WebFilterOrderEnum.DEMO_FILTER); + } + + private static FilterRegistrationBean createFilterBean(T filter, Integer order) { + FilterRegistrationBean bean = new FilterRegistrationBean<>(filter); + bean.setOrder(order); + return bean; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/config/WebProperties.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/config/WebProperties.java new file mode 100644 index 0000000..c98443b --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/config/WebProperties.java @@ -0,0 +1,66 @@ +package com.jojubanking.boot.framework.web.config; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; + +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@ConfigurationProperties(prefix = "joju.web") +@Validated +@Data +public class WebProperties { + + @NotNull(message = "APP API 不能为空") + private Api appApi = new Api("/smapp-api", "**.controller.app.**"); + @NotNull(message = "Admin API 不能为空") + private Api adminApi = new Api("/smadmin-api", "**.controller.admin.**"); + + @NotNull(message = "Admin UI 不能为空") + private Ui adminUi; + + @Data + @AllArgsConstructor + @NoArgsConstructor + @Valid + public static class Api { + + /** + * API 前缀,实现所有 Controller 提供的 RESTFul API 的统一前缀 + * + * + * 意义:通过该前缀,避免 Swagger、Actuator 意外通过 Nginx 暴露出来给外部,带来安全性问题 + * 这样,Nginx 只需要配置转发到 /api/* 的所有接口即可。 + * + * @see JojuWebAutoConfiguration#configurePathMatch(PathMatchConfigurer) + */ + @NotEmpty(message = "API 前缀不能为空") + private String prefix; + + /** + * Controller 所在包的 Ant 路径规则 + * + * 主要目的是,给该 Controller 设置指定的 {@link #prefix} + */ + @NotEmpty(message = "Controller 所在包不能为空") + private String controller; + + } + + @Data + @Valid + public static class Ui { + + /** + * 访问地址 + */ + private String url; + + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/config/XssProperties.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/config/XssProperties.java new file mode 100644 index 0000000..9131666 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/config/XssProperties.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.framework.web.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import java.util.Collections; +import java.util.List; + +/** + * Xss 配置属性 + * + * @author TW + */ +@ConfigurationProperties(prefix = "joju.xss") +@Validated +@Data +public class XssProperties { + + /** + * 是否开启,默认为 true + */ + private boolean enable = true; + /** + * 需要排除的 URL,默认为空 + */ + private List excludeUrls = Collections.emptyList(); + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/ApiRequestFilter.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/ApiRequestFilter.java new file mode 100644 index 0000000..b472507 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/ApiRequestFilter.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.framework.web.core.filter; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.web.config.WebProperties; +import lombok.RequiredArgsConstructor; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.http.HttpServletRequest; + +/** + * 过滤 /admin-api、/app-api 等 API 请求的过滤器 + * + * @author TW + */ +@RequiredArgsConstructor +public abstract class ApiRequestFilter extends OncePerRequestFilter { + + protected final WebProperties webProperties; + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + // 只过滤 API 请求的地址 + return !StrUtil.startWithAny(request.getRequestURI(), webProperties.getAdminApi().getPrefix(), + webProperties.getAppApi().getPrefix()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyFilter.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyFilter.java new file mode 100644 index 0000000..183e8db --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyFilter.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.framework.web.core.filter; + +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Request Body 缓存 Filter,实现它的可重复读取 + * + * @author TW + */ +public class CacheRequestBodyFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws IOException, ServletException { + filterChain.doFilter(new CacheRequestBodyWrapper(request), response); + } + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + // 只处理 json 请求内容 + return !ServletUtils.isJsonRequest(request); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyWrapper.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyWrapper.java new file mode 100644 index 0000000..26366e4 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyWrapper.java @@ -0,0 +1,68 @@ +package com.jojubanking.boot.framework.web.core.filter; + +import cn.hutool.extra.servlet.ServletUtil; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * Request Body 缓存 Wrapper + * + * @author TW + */ +public class CacheRequestBodyWrapper extends HttpServletRequestWrapper { + + /** + * 缓存的内容 + */ + private final byte[] body; + + public CacheRequestBodyWrapper(HttpServletRequest request) { + super(request); + body = ServletUtil.getBodyBytes(request); + } + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + final ByteArrayInputStream inputStream = new ByteArrayInputStream(body); + // 返回 ServletInputStream + return new ServletInputStream() { + + @Override + public int read() { + return inputStream.read(); + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) {} + + @Override + public int available() { + return body.length; + } + + }; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/DemoFilter.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/DemoFilter.java new file mode 100644 index 0000000..96f4049 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/DemoFilter.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.framework.web.core.filter; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import com.jojubanking.boot.framework.web.core.util.WebFrameworkUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import static com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants.DEMO_DENY; + +/** + * 演示 Filter,禁止用户发起写操作,避免影响测试数据 + * + * @author TW + */ +public class DemoFilter extends OncePerRequestFilter { + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + String method = request.getMethod(); + return !StrUtil.equalsAnyIgnoreCase(method, "POST", "PUT", "DELETE") // 写操作时,不进行过滤率 + || WebFrameworkUtils.getLoginUserId(request) == null; // 非登录用户时,不进行过滤 + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) { + // 直接返回 DEMO_DENY 的结果。即,请求不继续 + ServletUtils.writeJSON(response, CommonResult.error(DEMO_DENY)); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/XssFilter.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/XssFilter.java new file mode 100644 index 0000000..1328393 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/XssFilter.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.framework.web.core.filter; + +import com.jojubanking.boot.framework.web.config.XssProperties; +import lombok.AllArgsConstructor; +import org.springframework.util.PathMatcher; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Xss 过滤器 + * + * 对 Xss 不了解的胖友,可以看看 http://www.iocoder.cn/Fight/The-new-girl-asked-me-why-AJAX-requests-are-not-secure-I-did-not-answer/ + * + * @author TW + */ +@AllArgsConstructor +public class XssFilter extends OncePerRequestFilter { + + /** + * 属性 + */ + private final XssProperties properties; + /** + * 路径匹配器 + */ + private final PathMatcher pathMatcher; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws IOException, ServletException { + filterChain.doFilter(new XssRequestWrapper(request), response); + } + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + // 如果关闭,则不过滤 + if (!properties.isEnable()) { + return true; + } + + // 如果匹配到无需过滤,则不过滤 + String uri = request.getRequestURI(); + return properties.getExcludeUrls().stream().anyMatch(excludeUrl -> pathMatcher.match(excludeUrl, uri)); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/XssRequestWrapper.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/XssRequestWrapper.java new file mode 100644 index 0000000..171f4c9 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/filter/XssRequestWrapper.java @@ -0,0 +1,136 @@ +package com.jojubanking.boot.framework.web.core.filter; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HTMLFilter; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Map; + +/** + * Xss 请求 Wrapper + * + * @author TW + */ +public class XssRequestWrapper extends HttpServletRequestWrapper { + + /** + * 基于线程级别的 HTMLFilter 对象,因为它线程非安全 + */ + private static final ThreadLocal HTML_FILTER = ThreadLocal.withInitial(() -> { + HTMLFilter htmlFilter = new HTMLFilter(); + // 反射修改 encodeQuotes 属性为 false,避免 " 被转移成 " 字符 + ReflectUtil.setFieldValue(htmlFilter, "encodeQuotes", false); + return htmlFilter; + }); + + public XssRequestWrapper(HttpServletRequest request) { + super(request); + } + + private static String filterXss(String content) { + if (StrUtil.isEmpty(content)) { + return content; + } + return HTML_FILTER.get().filter(content); + } + + // ========== IO 流相关 ========== + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + // 如果非 json 请求,不进行 Xss 处理 + if (!ServletUtils.isJsonRequest(this)) { + return super.getInputStream(); + } + + // 读取内容,并过滤 + String content = IoUtil.readUtf8(super.getInputStream()); + content = filterXss(content); + final ByteArrayInputStream newInputStream = new ByteArrayInputStream(content.getBytes()); + // 返回 ServletInputStream + return new ServletInputStream() { + + @Override + public int read() { + return newInputStream.read(); + } + + @Override + public boolean isFinished() { + return true; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener readListener) {} + + }; + } + + // ========== Param 相关 ========== + + @Override + public String getParameter(String name) { + String value = super.getParameter(name); + return filterXss(value); + } + + @Override + public String[] getParameterValues(String name) { + String[] values = super.getParameterValues(name); + if (ArrayUtil.isEmpty(values)) { + return values; + } + // 过滤处理 + for (int i = 0; i < values.length; i++) { + values[i] = filterXss(values[i]); + } + return values; + } + + @Override + public Map getParameterMap() { + Map valueMap = super.getParameterMap(); + if (CollUtil.isEmpty(valueMap)) { + return valueMap; + } + // 过滤处理 + for (Map.Entry entry : valueMap.entrySet()) { + String[] values = entry.getValue(); + for (int i = 0; i < values.length; i++) { + values[i] = filterXss(values[i]); + } + } + return valueMap; + } + + // ========== Header 相关 ========== + + @Override + public String getHeader(String name) { + String value = super.getHeader(name); + return filterXss(value); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/handler/GlobalExceptionHandler.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..fdff7fe --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/handler/GlobalExceptionHandler.java @@ -0,0 +1,273 @@ +package com.jojubanking.boot.framework.web.core.handler; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.extra.servlet.ServletUtil; +import com.jojubanking.boot.framework.apilog.core.service.ApiErrorLog; +import com.jojubanking.boot.framework.apilog.core.service.ApiErrorLogFrameworkService; +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.common.util.monitor.TracerUtils; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import com.jojubanking.boot.framework.web.core.util.WebFrameworkUtils; +import io.github.resilience4j.ratelimiter.RequestNotPermitted; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.util.Assert; +import org.springframework.validation.BindException; +import org.springframework.validation.FieldError; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import org.springframework.web.servlet.NoHandlerFoundException; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.ValidationException; +import java.util.Date; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants.*; + +/** + * 全局异常处理器,将 Exception 翻译成 CommonResult + 对应的异常编号 + * + * @author TW + */ +@RestControllerAdvice +@AllArgsConstructor +@Slf4j +public class GlobalExceptionHandler { + + private final String applicationName; + + private final ApiErrorLogFrameworkService apiErrorLogFrameworkService; + + /** + * 处理所有异常,主要是提供给 Filter 使用 + * 因为 Filter 不走 SpringMVC 的流程,但是我们又需要兜底处理异常,所以这里提供一个全量的异常处理过程,保持逻辑统一。 + * + * @param request 请求 + * @param ex 异常 + * @return 通用返回 + */ + public CommonResult allExceptionHandler(HttpServletRequest request, Throwable ex) { + if (ex instanceof MissingServletRequestParameterException) { + return missingServletRequestParameterExceptionHandler((MissingServletRequestParameterException) ex); + } + if (ex instanceof MethodArgumentTypeMismatchException) { + return methodArgumentTypeMismatchExceptionHandler((MethodArgumentTypeMismatchException) ex); + } + if (ex instanceof MethodArgumentNotValidException) { + return methodArgumentNotValidExceptionExceptionHandler((MethodArgumentNotValidException) ex); + } + if (ex instanceof BindException) { + return bindExceptionHandler((BindException) ex); + } + if (ex instanceof ConstraintViolationException) { + return constraintViolationExceptionHandler((ConstraintViolationException) ex); + } + if (ex instanceof ValidationException) { + return validationException((ValidationException) ex); + } + if (ex instanceof NoHandlerFoundException) { + return noHandlerFoundExceptionHandler((NoHandlerFoundException) ex); + } + if (ex instanceof HttpRequestMethodNotSupportedException) { + return httpRequestMethodNotSupportedExceptionHandler((HttpRequestMethodNotSupportedException) ex); + } + if (ex instanceof RequestNotPermitted) { + return requestNotPermittedExceptionHandler(request, (RequestNotPermitted) ex); + } + if (ex instanceof ServiceException) { + return serviceExceptionHandler((ServiceException) ex); + } + if (ex instanceof AccessDeniedException) { + return accessDeniedExceptionHandler(request, (AccessDeniedException) ex); + } + return defaultExceptionHandler(request, ex); + } + + /** + * 处理 SpringMVC 请求参数缺失 + * + * 例如说,接口上设置了 @RequestParam("xx") 参数,结果并未传递 xx 参数 + */ + @ExceptionHandler(value = MissingServletRequestParameterException.class) + public CommonResult missingServletRequestParameterExceptionHandler(MissingServletRequestParameterException ex) { + log.warn("[missingServletRequestParameterExceptionHandler]", ex); + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数缺失:%s", ex.getParameterName())); + } + + /** + * 处理 SpringMVC 请求参数类型错误 + * + * 例如说,接口上设置了 @RequestParam("xx") 参数为 Integer,结果传递 xx 参数类型为 String + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public CommonResult methodArgumentTypeMismatchExceptionHandler(MethodArgumentTypeMismatchException ex) { + log.warn("[missingServletRequestParameterExceptionHandler]", ex); + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数类型错误:%s", ex.getMessage())); + } + + /** + * 处理 SpringMVC 参数校验不正确 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public CommonResult methodArgumentNotValidExceptionExceptionHandler(MethodArgumentNotValidException ex) { + log.warn("[methodArgumentNotValidExceptionExceptionHandler]", ex); + FieldError fieldError = ex.getBindingResult().getFieldError(); + assert fieldError != null; // 断言,避免告警 + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", fieldError.getDefaultMessage())); + } + + /** + * 处理 SpringMVC 参数绑定不正确,本质上也是通过 Validator 校验 + */ + @ExceptionHandler(BindException.class) + public CommonResult bindExceptionHandler(BindException ex) { + log.warn("[handleBindException]", ex); + FieldError fieldError = ex.getFieldError(); + assert fieldError != null; // 断言,避免告警 + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", fieldError.getDefaultMessage())); + } + + /** + * 处理 Validator 校验不通过产生的异常 + */ + @ExceptionHandler(value = ConstraintViolationException.class) + public CommonResult constraintViolationExceptionHandler(ConstraintViolationException ex) { + log.warn("[constraintViolationExceptionHandler]", ex); + ConstraintViolation constraintViolation = ex.getConstraintViolations().iterator().next(); + return CommonResult.error(BAD_REQUEST.getCode(), String.format("请求参数不正确:%s", constraintViolation.getMessage())); + } + + /** + * 处理 Dubbo Consumer 本地参数校验时,抛出的 ValidationException 异常 + */ + @ExceptionHandler(value = ValidationException.class) + public CommonResult validationException(ValidationException ex) { + log.warn("[constraintViolationExceptionHandler]", ex); + // 无法拼接明细的错误信息,因为 Dubbo Consumer 抛出 ValidationException 异常时,是直接的字符串信息,且人类不可读 + return CommonResult.error(BAD_REQUEST); + } + + /** + * 处理 SpringMVC 请求地址不存在 + * + * 注意,它需要设置如下两个配置项: + * 1. spring.mvc.throw-exception-if-no-handler-found 为 true + * 2. spring.mvc.static-path-pattern 为 /statics/** + */ + @ExceptionHandler(NoHandlerFoundException.class) + public CommonResult noHandlerFoundExceptionHandler(NoHandlerFoundException ex) { + log.warn("[noHandlerFoundExceptionHandler]", ex); + return CommonResult.error(NOT_FOUND.getCode(), String.format("请求地址不存在:%s", ex.getRequestURL())); + } + + /** + * 处理 SpringMVC 请求方法不正确 + * + * 例如说,A 接口的方法为 GET 方式,结果请求方法为 POST 方式,导致不匹配 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public CommonResult httpRequestMethodNotSupportedExceptionHandler(HttpRequestMethodNotSupportedException ex) { + log.warn("[httpRequestMethodNotSupportedExceptionHandler]", ex); + return CommonResult.error(METHOD_NOT_ALLOWED.getCode(), String.format("请求方法不正确:%s", ex.getMessage())); + } + + /** + * 处理 Resilience4j 限流抛出的异常 + */ + @ExceptionHandler(value = RequestNotPermitted.class) + public CommonResult requestNotPermittedExceptionHandler(HttpServletRequest req, RequestNotPermitted ex) { + log.warn("[requestNotPermittedExceptionHandler][url({}) 访问过于频繁]", req.getRequestURL(), ex); + return CommonResult.error(TOO_MANY_REQUESTS); + } + + /** + * 处理 Spring Security 权限不足的异常 + * + * 来源是,使用 @PreAuthorize 注解,AOP 进行权限拦截 + */ + @ExceptionHandler(value = AccessDeniedException.class) + public CommonResult accessDeniedExceptionHandler(HttpServletRequest req, AccessDeniedException ex) { + log.warn("[accessDeniedExceptionHandler][userId({}) 无法访问 url({})]", WebFrameworkUtils.getLoginUserId(req), + req.getRequestURL(), ex); + return CommonResult.error(FORBIDDEN); + } + + /** + * 处理业务异常 ServiceException + * + * 例如说,商品库存不足,用户手机号已存在。 + */ + @ExceptionHandler(value = ServiceException.class) + public CommonResult serviceExceptionHandler(ServiceException ex) { + log.info("[serviceExceptionHandler]", ex); + return CommonResult.error(ex.getCode(), ex.getMessage()); + } + + /** + * 处理系统异常,兜底处理所有的一切 + */ + @ExceptionHandler(value = Exception.class) + public CommonResult defaultExceptionHandler(HttpServletRequest req, Throwable ex) { + log.error("[defaultExceptionHandler]", ex); + // 插入异常日志 + this.createExceptionLog(req, ex); + // 返回 ERROR CommonResult + return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg()); + } + + private void createExceptionLog(HttpServletRequest req, Throwable e) { + // 插入错误日志 + ApiErrorLog errorLog = new ApiErrorLog(); + try { + // 初始化 errorLog + initExceptionLog(errorLog, req, e); + // 执行插入 errorLog + apiErrorLogFrameworkService.createApiErrorLog(errorLog); + } catch (Throwable th) { + log.error("[createExceptionLog][url({}) log({}) 发生异常]", req.getRequestURI(), JsonUtils.toJsonString(errorLog), th); + } + } + + private void initExceptionLog(ApiErrorLog errorLog, HttpServletRequest request, Throwable e) { + // 处理用户信息 + errorLog.setUserId(WebFrameworkUtils.getLoginUserId(request)); + errorLog.setUserType(WebFrameworkUtils.getLoginUserType(request)); + // 设置异常字段 + errorLog.setExceptionName(e.getClass().getName()); + errorLog.setExceptionMessage(ExceptionUtil.getMessage(e)); + errorLog.setExceptionRootCauseMessage(ExceptionUtil.getRootCauseMessage(e)); + errorLog.setExceptionStackTrace(ExceptionUtils.getStackTrace(e)); + StackTraceElement[] stackTraceElements = e.getStackTrace(); + Assert.notEmpty(stackTraceElements, "异常 stackTraceElements 不能为空"); + StackTraceElement stackTraceElement = stackTraceElements[0]; + errorLog.setExceptionClassName(stackTraceElement.getClassName()); + errorLog.setExceptionFileName(stackTraceElement.getFileName()); + errorLog.setExceptionMethodName(stackTraceElement.getMethodName()); + errorLog.setExceptionLineNumber(stackTraceElement.getLineNumber()); + // 设置其它字段 + errorLog.setTraceId(TracerUtils.getTraceId()); + errorLog.setApplicationName(applicationName); + errorLog.setRequestUrl(request.getRequestURI()); + Map requestParams = MapUtil.builder() + .put("query", ServletUtil.getParamMap(request)) + .put("body", ServletUtil.getBody(request)).build(); + errorLog.setRequestParams(JsonUtils.toJsonString(requestParams)); + errorLog.setRequestMethod(request.getMethod()); + errorLog.setUserAgent(ServletUtils.getUserAgent(request)); + errorLog.setUserIp(ServletUtil.getClientIP(request)); + errorLog.setExceptionTime(new Date()); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/handler/GlobalResponseBodyHandler.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/handler/GlobalResponseBodyHandler.java new file mode 100644 index 0000000..92a02f7 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/handler/GlobalResponseBodyHandler.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.framework.web.core.handler; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.web.core.util.WebFrameworkUtils; +import com.jojubanking.boot.framework.apilog.core.filter.ApiAccessLogFilter; +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +/** + * 全局响应结果(ResponseBody)处理器 + * + * 不同于在网上看到的很多文章,会选择自动将 Controller 返回结果包上 {@link CommonResult}, + * 在 onemall 中,是 Controller 在返回时,主动自己包上 {@link CommonResult}。 + * 原因是,GlobalResponseBodyHandler 本质上是 AOP,它不应该改变 Controller 返回的数据结构 + * + * 目前,GlobalResponseBodyHandler 的主要作用是,记录 Controller 的返回结果, + * 方便 {@link ApiAccessLogFilter} 记录访问日志 + */ +@ControllerAdvice +public class GlobalResponseBodyHandler implements ResponseBodyAdvice { + + @Override + @SuppressWarnings("NullableProblems") // 避免 IDEA 警告 + public boolean supports(MethodParameter returnType, Class converterType) { + if (returnType.getMethod() == null) { + return false; + } + // 只拦截返回结果为 CommonResult 类型 + return returnType.getMethod().getReturnType() == CommonResult.class; + } + + @Override + @SuppressWarnings("NullableProblems") // 避免 IDEA 警告 + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, + ServerHttpRequest request, ServerHttpResponse response) { + // 记录 Controller 结果 + WebFrameworkUtils.setCommonResult(((ServletServerHttpRequest) request).getServletRequest(), (CommonResult) body); + return body; + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/util/WebFrameworkUtils.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/util/WebFrameworkUtils.java new file mode 100644 index 0000000..173d6a3 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/core/util/WebFrameworkUtils.java @@ -0,0 +1,127 @@ +package com.jojubanking.boot.framework.web.core.util; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.web.config.WebProperties; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; + +/** + * 专属于 web 包的工具类 + * + * @author TW + */ +public class WebFrameworkUtils { + + private static final String REQUEST_ATTRIBUTE_LOGIN_USER_ID = "login_user_id"; + private static final String REQUEST_ATTRIBUTE_LOGIN_USER_TYPE = "login_user_type"; + + private static final String REQUEST_ATTRIBUTE_COMMON_RESULT = "common_result"; + + public static final String HEADER_TENANT_ID = "tenant-id"; + + private static WebProperties properties; + + public WebFrameworkUtils(WebProperties webProperties) { + WebFrameworkUtils.properties = webProperties; + } + + /** + * 获得租户编号,从 header 中 + * 考虑到其它 framework 组件也会使用到租户编号,所以不得不放在 WebFrameworkUtils 统一提供 + * + * @param request 请求 + * @return 租户编号 + */ + public static Long getTenantId(HttpServletRequest request) { + String tenantId = request.getHeader(HEADER_TENANT_ID); + return StrUtil.isNotEmpty(tenantId) ? Long.valueOf(tenantId) : null; + } + + public static void setLoginUserId(ServletRequest request, Long userId) { + request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID, userId); + } + + /** + * 设置用户类型 + * + * @param request 请求 + * @param userType 用户类型 + */ + public static void setLoginUserType(ServletRequest request, Integer userType) { + request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE, userType); + } + + /** + * 获得当前用户的编号,从请求中 + * 注意:该方法仅限于 framework 框架使用!!! + * + * @param request 请求 + * @return 用户编号 + */ + public static Long getLoginUserId(HttpServletRequest request) { + if (request == null) { + return null; + } + return (Long) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID); + } + + /** + * 获得当前用户的类型 + * 注意:该方法仅限于 web 相关的 framework 组件使用!!! + * + * @param request 请求 + * @return 用户编号 + */ + public static Integer getLoginUserType(HttpServletRequest request) { + if (request == null) { + return null; + } + // 1. 优先,从 Attribute 中获取 + Integer userType = (Integer) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE); + if (userType != null) { + return userType; + } + // 2. 其次,基于 URL 前缀的约定 + if (request.getRequestURI().startsWith(properties.getAdminApi().getPrefix())) { + return UserTypeEnum.ADMIN.getValue(); + } + if (request.getRequestURI().startsWith(properties.getAppApi().getPrefix())) { + return UserTypeEnum.MEMBER.getValue(); + } + return null; + } + + public static Integer getLoginUserType() { + HttpServletRequest request = getRequest(); + return getLoginUserType(request); + } + + public static Long getLoginUserId() { + HttpServletRequest request = getRequest(); + return getLoginUserId(request); + } + + public static void setCommonResult(ServletRequest request, CommonResult result) { + request.setAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT, result); + } + + public static CommonResult getCommonResult(ServletRequest request) { + return (CommonResult) request.getAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT); + } + + public static HttpServletRequest getRequest() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + if (!(requestAttributes instanceof ServletRequestAttributes)) { + return null; + } + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes; + return servletRequestAttributes.getRequest(); + } + +} diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/package-info.java b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/package-info.java new file mode 100644 index 0000000..30daade --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/java/com/jojubanking/boot/framework/web/package-info.java @@ -0,0 +1,4 @@ +/** + * 针对 SpringMVC 的基础封装 + */ +package com.jojubanking.boot.framework.web; diff --git a/joju-framework/joju-spring-boot-starter-web/src/main/resources/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-web/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..f34401a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/src/main/resources/META-INF/spring.factories @@ -0,0 +1,5 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.apilog.config.JojuApiLogAutoConfiguration,\ + com.jojubanking.boot.framework.jackson.config.JojuJacksonAutoConfiguration,\ + com.jojubanking.boot.framework.swagger.config.JojuSwaggerAutoConfiguration,\ + com.jojubanking.boot.framework.web.config.JojuWebAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/META-INF/spring.factories b/joju-framework/joju-spring-boot-starter-web/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..f34401a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/target/classes/META-INF/spring.factories @@ -0,0 +1,5 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.jojubanking.boot.framework.apilog.config.JojuApiLogAutoConfiguration,\ + com.jojubanking.boot.framework.jackson.config.JojuJacksonAutoConfiguration,\ + com.jojubanking.boot.framework.swagger.config.JojuSwaggerAutoConfiguration,\ + com.jojubanking.boot.framework.web.config.JojuWebAutoConfiguration diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/config/JojuApiLogAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/config/JojuApiLogAutoConfiguration.class new file mode 100644 index 0000000..e8920fd Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/config/JojuApiLogAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/filter/ApiAccessLogFilter.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/filter/ApiAccessLogFilter.class new file mode 100644 index 0000000..93264c5 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/filter/ApiAccessLogFilter.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLog.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLog.class new file mode 100644 index 0000000..34a0c0d Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLog.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLogFrameworkService.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLogFrameworkService.class new file mode 100644 index 0000000..22ed11d Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLogFrameworkService.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.class new file mode 100644 index 0000000..5a88730 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLog.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLog.class new file mode 100644 index 0000000..982d038 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLog.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLogFrameworkService.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLogFrameworkService.class new file mode 100644 index 0000000..7c1638c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLogFrameworkService.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.class new file mode 100644 index 0000000..810e356 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/apilog/core/service/ApiErrorLogFrameworkServiceImpl.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/jackson/config/JojuJacksonAutoConfiguration$1.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/jackson/config/JojuJacksonAutoConfiguration$1.class new file mode 100644 index 0000000..8c3dcaa Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/jackson/config/JojuJacksonAutoConfiguration$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/jackson/config/JojuJacksonAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/jackson/config/JojuJacksonAutoConfiguration.class new file mode 100644 index 0000000..83bce6c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/jackson/config/JojuJacksonAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/jackson/core/databind/LocalDateTimeDeserializer.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/jackson/core/databind/LocalDateTimeDeserializer.class new file mode 100644 index 0000000..25d76d0 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/jackson/core/databind/LocalDateTimeDeserializer.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/jackson/core/databind/LocalDateTimeSerializer.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/jackson/core/databind/LocalDateTimeSerializer.class new file mode 100644 index 0000000..1221ace Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/jackson/core/databind/LocalDateTimeSerializer.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/swagger/config/JojuSwaggerAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/swagger/config/JojuSwaggerAutoConfiguration.class new file mode 100644 index 0000000..2ece4ce Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/swagger/config/JojuSwaggerAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/swagger/config/SwaggerProperties.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/swagger/config/SwaggerProperties.class new file mode 100644 index 0000000..0e63bcd Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/swagger/config/SwaggerProperties.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/swagger/core/SpringFoxHandlerProviderBeanPostProcessor.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/swagger/core/SpringFoxHandlerProviderBeanPostProcessor.class new file mode 100644 index 0000000..3864ed5 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/swagger/core/SpringFoxHandlerProviderBeanPostProcessor.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/JojuWebAutoConfiguration.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/JojuWebAutoConfiguration.class new file mode 100644 index 0000000..2fd38fd Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/JojuWebAutoConfiguration.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/WebProperties$Api.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/WebProperties$Api.class new file mode 100644 index 0000000..df97c5b Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/WebProperties$Api.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/WebProperties$Ui.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/WebProperties$Ui.class new file mode 100644 index 0000000..6c74d18 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/WebProperties$Ui.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/WebProperties.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/WebProperties.class new file mode 100644 index 0000000..a29c733 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/WebProperties.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/XssProperties.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/XssProperties.class new file mode 100644 index 0000000..91f1a46 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/config/XssProperties.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/ApiRequestFilter.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/ApiRequestFilter.class new file mode 100644 index 0000000..160b83d Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/ApiRequestFilter.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyFilter.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyFilter.class new file mode 100644 index 0000000..356c388 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyFilter.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyWrapper$1.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyWrapper$1.class new file mode 100644 index 0000000..cf93e58 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyWrapper$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyWrapper.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyWrapper.class new file mode 100644 index 0000000..73b41d7 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/CacheRequestBodyWrapper.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/DemoFilter.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/DemoFilter.class new file mode 100644 index 0000000..f243022 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/DemoFilter.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/XssFilter.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/XssFilter.class new file mode 100644 index 0000000..81d56b1 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/XssFilter.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/XssRequestWrapper$1.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/XssRequestWrapper$1.class new file mode 100644 index 0000000..b45065f Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/XssRequestWrapper$1.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/XssRequestWrapper.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/XssRequestWrapper.class new file mode 100644 index 0000000..4f2a930 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/filter/XssRequestWrapper.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/handler/GlobalExceptionHandler.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/handler/GlobalExceptionHandler.class new file mode 100644 index 0000000..d043fd4 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/handler/GlobalExceptionHandler.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/handler/GlobalResponseBodyHandler.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/handler/GlobalResponseBodyHandler.class new file mode 100644 index 0000000..c4f5d41 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/handler/GlobalResponseBodyHandler.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/util/WebFrameworkUtils.class b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/util/WebFrameworkUtils.class new file mode 100644 index 0000000..e48d26c Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/classes/com/jojubanking/boot/framework/web/core/util/WebFrameworkUtils.class differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/joju-spring-boot-starter-web-2.0.0-beta.jar b/joju-framework/joju-spring-boot-starter-web/target/joju-spring-boot-starter-web-2.0.0-beta.jar new file mode 100644 index 0000000..5e33d19 Binary files /dev/null and b/joju-framework/joju-spring-boot-starter-web/target/joju-spring-boot-starter-web-2.0.0-beta.jar differ diff --git a/joju-framework/joju-spring-boot-starter-web/target/maven-archiver/pom.properties b/joju-framework/joju-spring-boot-starter-web/target/maven-archiver/pom.properties new file mode 100644 index 0000000..2087e11 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:27 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-spring-boot-starter-web diff --git a/joju-framework/joju-spring-boot-starter-web/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-framework/joju-spring-boot-starter-web/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..08187ed --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,31 @@ +com\jojubanking\boot\framework\web\core\filter\CacheRequestBodyWrapper.class +com\jojubanking\boot\framework\jackson\config\JojuJacksonAutoConfiguration.class +com\jojubanking\boot\framework\web\core\filter\XssFilter.class +com\jojubanking\boot\framework\apilog\core\service\ApiErrorLogFrameworkServiceImpl.class +com\jojubanking\boot\framework\web\core\filter\ApiRequestFilter.class +com\jojubanking\boot\framework\jackson\config\JojuJacksonAutoConfiguration$1.class +com\jojubanking\boot\framework\web\core\handler\GlobalExceptionHandler.class +com\jojubanking\boot\framework\apilog\core\service\ApiErrorLogFrameworkService.class +com\jojubanking\boot\framework\jackson\core\databind\LocalDateTimeSerializer.class +com\jojubanking\boot\framework\web\config\WebProperties$Ui.class +com\jojubanking\boot\framework\apilog\config\JojuApiLogAutoConfiguration.class +com\jojubanking\boot\framework\apilog\core\filter\ApiAccessLogFilter.class +com\jojubanking\boot\framework\web\config\JojuWebAutoConfiguration.class +com\jojubanking\boot\framework\swagger\core\SpringFoxHandlerProviderBeanPostProcessor.class +com\jojubanking\boot\framework\swagger\config\SwaggerProperties.class +com\jojubanking\boot\framework\web\config\WebProperties$Api.class +com\jojubanking\boot\framework\web\core\filter\CacheRequestBodyWrapper$1.class +com\jojubanking\boot\framework\web\core\filter\DemoFilter.class +com\jojubanking\boot\framework\web\core\handler\GlobalResponseBodyHandler.class +com\jojubanking\boot\framework\web\core\util\WebFrameworkUtils.class +com\jojubanking\boot\framework\apilog\core\service\ApiAccessLogFrameworkServiceImpl.class +com\jojubanking\boot\framework\web\core\filter\CacheRequestBodyFilter.class +com\jojubanking\boot\framework\jackson\core\databind\LocalDateTimeDeserializer.class +com\jojubanking\boot\framework\web\core\filter\XssRequestWrapper.class +com\jojubanking\boot\framework\web\config\XssProperties.class +com\jojubanking\boot\framework\apilog\core\service\ApiAccessLog.class +com\jojubanking\boot\framework\apilog\core\service\ApiErrorLog.class +com\jojubanking\boot\framework\web\core\filter\XssRequestWrapper$1.class +com\jojubanking\boot\framework\apilog\core\service\ApiAccessLogFrameworkService.class +com\jojubanking\boot\framework\swagger\config\JojuSwaggerAutoConfiguration.class +com\jojubanking\boot\framework\web\config\WebProperties.class diff --git a/joju-framework/joju-spring-boot-starter-web/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-framework/joju-spring-boot-starter-web/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..9c0274d --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,31 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\apilog\core\service\ApiAccessLogFrameworkService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\apilog\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\core\filter\CacheRequestBodyFilter.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\apilog\core\service\ApiErrorLogFrameworkServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\core\filter\CacheRequestBodyWrapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\jackson\config\JojuJacksonAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\swagger\core\SpringFoxHandlerProviderBeanPostProcessor.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\jackson\core\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\core\filter\DemoFilter.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\core\handler\GlobalResponseBodyHandler.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\swagger\config\JojuSwaggerAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\config\WebProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\apilog\config\JojuApiLogAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\core\filter\ApiRequestFilter.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\apilog\core\service\ApiErrorLog.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\core\filter\XssFilter.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\apilog\core\service\ApiAccessLogFrameworkServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\core\filter\XssRequestWrapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\core\util\WebFrameworkUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\config\XssProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\apilog\core\service\ApiErrorLogFrameworkService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\apilog\core\service\ApiAccessLog.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\apilog\core\filter\ApiAccessLogFilter.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\swagger\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\config\JojuWebAutoConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\jackson\core\databind\LocalDateTimeSerializer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\swagger\config\SwaggerProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\jackson\core\databind\LocalDateTimeDeserializer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-framework\joju-spring-boot-starter-web\src\main\java\com\jojubanking\boot\framework\web\core\handler\GlobalExceptionHandler.java diff --git a/joju-framework/joju-spring-boot-starter-web/《芋道 Spring Boot API 接口文档 Swagger 入门》.md b/joju-framework/joju-spring-boot-starter-web/《芋道 Spring Boot API 接口文档 Swagger 入门》.md new file mode 100644 index 0000000..d93296a --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/《芋道 Spring Boot API 接口文档 Swagger 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/joju-spring-boot-starter-web/《芋道 Spring Boot SpringMVC 入门》.md b/joju-framework/joju-spring-boot-starter-web/《芋道 Spring Boot SpringMVC 入门》.md new file mode 100644 index 0000000..24bd0f0 --- /dev/null +++ b/joju-framework/joju-spring-boot-starter-web/《芋道 Spring Boot SpringMVC 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-framework/pom.xml b/joju-framework/pom.xml new file mode 100644 index 0000000..f42d7d7 --- /dev/null +++ b/joju-framework/pom.xml @@ -0,0 +1,58 @@ + + + + jojuboot + com.jojubanking.boot + ${revision} + + 4.0.0 + + pom + + joju-common + joju-spring-boot-starter-test + joju-spring-boot-starter-banner + joju-spring-boot-starter-mybatis + joju-spring-boot-starter-redis + joju-spring-boot-starter-web + joju-spring-boot-starter-security + + joju-spring-boot-starter-file + joju-spring-boot-starter-monitor + joju-spring-boot-starter-protection + + joju-spring-boot-starter-job + joju-spring-boot-starter-mq + + joju-spring-boot-starter-excel + + joju-spring-boot-starter-biz-operatelog + joju-spring-boot-starter-biz-dict + joju-spring-boot-starter-biz-sms + + joju-spring-boot-starter-biz-pay + + joju-spring-boot-starter-biz-social + joju-spring-boot-starter-biz-tenant + joju-spring-boot-starter-biz-data-permission + joju-spring-boot-starter-biz-error-code + + + + + joju-framework + + 该包是技术组件,每个子包,代表一个组件。每个组件包括两部分: + 1. core 包:是该组件的核心封装 + 2. config 包:是该组件基于 Spring 的配置 + + 技术组件,也分成两类: + 1. 框架组件:和我们熟悉的 MyBatis、Redis 等等的拓展 + 2. 业务组件:和业务相关的组件的封装,例如说数据字典、操作日志等等。 + 如果是业务组件,Maven 名字会包含 biz + + https://www.jojubanking.com + + \ No newline at end of file diff --git a/joju-module-infra/joju-module-infra-api/joju-module-infra-api.iml b/joju-module-infra/joju-module-infra-api/joju-module-infra-api.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/joju-module-infra-api.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-module-infra/joju-module-infra-api/pom.xml b/joju-module-infra/joju-module-infra-api/pom.xml new file mode 100644 index 0000000..a89df73 --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/pom.xml @@ -0,0 +1,33 @@ + + + + com.jojubanking.boot + joju-module-infra + ${revision} + + 4.0.0 + joju-module-infra-api + jar + + ${project.artifactId} + + infra 模块 API,暴露给其它模块调用 + + + + + com.jojubanking.boot + joju-common + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + diff --git a/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/file/FileApi.java b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/file/FileApi.java new file mode 100644 index 0000000..f4e72fa --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/file/FileApi.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.infra.api.file; + +/** + * 文件 API 接口 + * + * @author TW + */ +public interface FileApi { + + /** + * 保存文件,并返回文件的访问路径 + * + * @param content 文件内容 + * @return 文件路径 + */ + default String createFile(byte[] content) { + return createFile(null, null, content); + } + + /** + * 保存文件,并返回文件的访问路径 + * + * @param path 文件路径 + * @param content 文件内容 + * @return 文件路径 + */ + default String createFile(String path, byte[] content) { + return createFile(null, path, content); + } + + /** + * 保存文件,并返回文件的访问路径 + * + * @param name 文件名称 + * @param path 文件路径 + * @param content 文件内容 + * @return 文件路径 + */ + String createFile(String name, String path, byte[] content); + +} diff --git a/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/logger/ApiAccessLogApi.java b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/logger/ApiAccessLogApi.java new file mode 100644 index 0000000..1e61de2 --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/logger/ApiAccessLogApi.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.infra.api.logger; + +import com.jojubanking.boot.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; + +import javax.validation.Valid; + +/** + * API 访问日志的 API 接口 + * + * @author TW + */ +public interface ApiAccessLogApi { + + /** + * 创建 API 访问日志 + * + * @param createDTO 创建信息 + */ + void createApiAccessLog(@Valid ApiAccessLogCreateReqDTO createDTO); + +} diff --git a/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/logger/ApiErrorLogApi.java b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/logger/ApiErrorLogApi.java new file mode 100644 index 0000000..565a54c --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/logger/ApiErrorLogApi.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.infra.api.logger; + +import com.jojubanking.boot.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; + +import javax.validation.Valid; + +/** + * API 错误日志的 API 接口 + * + * @author TW + */ +public interface ApiErrorLogApi { + + /** + * 创建 API 错误日志 + * + * @param createDTO 创建信息 + */ + void createApiErrorLog(@Valid ApiErrorLogCreateReqDTO createDTO); + +} diff --git a/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java new file mode 100644 index 0000000..3e1dc99 --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java @@ -0,0 +1,85 @@ +package com.jojubanking.boot.module.infra.api.logger.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * API 访问日志 + * + * @author TW + */ +@Data +public class ApiAccessLogCreateReqDTO { + + /** + * 链路追踪编号 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + + /** + * 请求方法名 + */ + @NotNull(message = "http 请求方法不能为空") + private String requestMethod; + /** + * 访问地址 + */ + @NotNull(message = "访问地址不能为空") + private String requestUrl; + /** + * 请求参数 + */ + @NotNull(message = "请求参数不能为空") + private String requestParams; + /** + * 用户 IP + */ + @NotNull(message = "ip 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotNull(message = "User-Agent 不能为空") + private String userAgent; + + /** + * 开始请求时间 + */ + @NotNull(message = "开始请求时间不能为空") + private Date beginTime; + /** + * 结束请求时间 + */ + @NotNull(message = "结束请求时间不能为空") + private Date endTime; + /** + * 执行时长,单位:毫秒 + */ + @NotNull(message = "执行时长不能为空") + private Integer duration; + /** + * 结果码 + */ + @NotNull(message = "错误码不能为空") + private Integer resultCode; + /** + * 结果提示 + */ + private String resultMsg; + +} diff --git a/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.java b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.java new file mode 100644 index 0000000..f713cba --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.java @@ -0,0 +1,107 @@ +package com.jojubanking.boot.module.infra.api.logger.dto; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * API 错误日志 + * + * @author TW + */ +@Data +public class ApiErrorLogCreateReqDTO { + + /** + * 链路编号 + */ + private String traceId; + /** + * 账号编号 + */ + private Long userId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + + /** + * 请求方法名 + */ + @NotNull(message = "http 请求方法不能为空") + private String requestMethod; + /** + * 访问地址 + */ + @NotNull(message = "访问地址不能为空") + private String requestUrl; + /** + * 请求参数 + */ + @NotNull(message = "请求参数不能为空") + private String requestParams; + /** + * 用户 IP + */ + @NotNull(message = "ip 不能为空") + private String userIp; + /** + * 浏览器 UA + */ + @NotNull(message = "User-Agent 不能为空") + private String userAgent; + + /** + * 异常时间 + */ + @NotNull(message = "异常时间不能为空") + private Date exceptionTime; + /** + * 异常名 + */ + @NotNull(message = "异常名不能为空") + private String exceptionName; + /** + * 异常发生的类全名 + */ + @NotNull(message = "异常发生的类全名不能为空") + private String exceptionClassName; + /** + * 异常发生的类文件 + */ + @NotNull(message = "异常发生的类文件不能为空") + private String exceptionFileName; + /** + * 异常发生的方法名 + */ + @NotNull(message = "异常发生的方法名不能为空") + private String exceptionMethodName; + /** + * 异常发生的方法所在行 + */ + @NotNull(message = "异常发生的方法所在行不能为空") + private Integer exceptionLineNumber; + /** + * 异常的栈轨迹异常的栈轨迹 + */ + @NotNull(message = "异常的栈轨迹不能为空") + private String exceptionStackTrace; + /** + * 异常导致的根消息 + */ + @NotNull(message = "异常导致的根消息不能为空") + private String exceptionRootCauseMessage; + /** + * 异常导致的消息 + */ + @NotNull(message = "异常导致的消息不能为空") + private String exceptionMessage; + + +} diff --git a/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/package-info.java b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/package-info.java new file mode 100644 index 0000000..4af41e8 --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/api/package-info.java @@ -0,0 +1,4 @@ +/** + * infra API 包,定义暴露给其它模块的 API + */ +package com.jojubanking.boot.module.infra.api; diff --git a/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/enums/DictTypeConstants.java b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/enums/DictTypeConstants.java new file mode 100644 index 0000000..10342e3 --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/enums/DictTypeConstants.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.infra.enums; + +/** + * Infra 字典类型的枚举类 + * + * @author TW + */ +public interface DictTypeConstants { + + String REDIS_TIMEOUT_TYPE = "infra_redis_timeout_type"; // Redis 超时类型 + + String JOB_STATUS = "infra_job_status"; // 定时任务状态的枚举 + String JOB_LOG_STATUS = "infra_job_log_status"; // 定时任务日志状态的枚举 + + String API_ERROR_LOG_PROCESS_STATUS = "infra_api_error_log_process_status"; // API 错误日志的处理状态的枚举 + + String CONFIG_TYPE = "infra_config_type"; // 参数配置类型 + String BOOLEAN_STRING = "infra_boolean_string"; // Boolean 是否类型 + +} diff --git a/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/enums/ErrorCodeConstants.java b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..b30c00e --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/src/main/java/com/jojubanking/boot/module/infra/enums/ErrorCodeConstants.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.module.infra.enums; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; + +/** + * Infra 错误码枚举类 + * + * infra 系统,使用 1-001-000-000 段 + */ +public interface ErrorCodeConstants { + + // ========== 参数配置 1001000000 ========== + ErrorCode CONFIG_NOT_EXISTS = new ErrorCode(1001000001, "参数配置不存在"); + ErrorCode CONFIG_KEY_DUPLICATE = new ErrorCode(1001000002, "参数配置 key 重复"); + ErrorCode CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE = new ErrorCode(1001000003, "不能删除类型为系统内置的参数配置"); + ErrorCode CONFIG_GET_VALUE_ERROR_IF_VISIBLE = new ErrorCode(1001000004, "获取参数配置失败,原因:不允许获取不可见配置"); + + // ========== 定时任务 1001001000 ========== + ErrorCode JOB_NOT_EXISTS = new ErrorCode(1001001000, "定时任务不存在"); + ErrorCode JOB_HANDLER_EXISTS = new ErrorCode(1001001001, "定时任务的处理器已经存在"); + ErrorCode JOB_CHANGE_STATUS_INVALID = new ErrorCode(1001001002, "只允许修改为开启或者关闭状态"); + ErrorCode JOB_CHANGE_STATUS_EQUALS = new ErrorCode(1001001003, "定时任务已经处于该状态,无需修改"); + ErrorCode JOB_UPDATE_ONLY_NORMAL_STATUS = new ErrorCode(1001001004, "只有开启状态的任务,才可以修改"); + ErrorCode JOB_CRON_EXPRESSION_VALID = new ErrorCode(1001001005, "CRON 表达式不正确"); + + // ========== API 错误日志 1001002000 ========== + ErrorCode API_ERROR_LOG_NOT_FOUND = new ErrorCode(1001002000, "API 错误日志不存在"); + ErrorCode API_ERROR_LOG_PROCESSED = new ErrorCode(1001002001, "API 错误日志已处理"); + + // ========= 文件相关 1001003000================= + ErrorCode FILE_PATH_EXISTS = new ErrorCode(1001003000, "文件路径已存在"); + ErrorCode FILE_NOT_EXISTS = new ErrorCode(1001003001, "文件不存在"); + ErrorCode FILE_IS_EMPTY = new ErrorCode(1001003002, "文件为空"); + + // ========== 代码生成器 1001004000 ========== + ErrorCode CODEGEN_TABLE_EXISTS = new ErrorCode(1003001000, "表定义已经存在"); + ErrorCode CODEGEN_IMPORT_TABLE_NULL = new ErrorCode(1003001001, "导入的表不存在"); + ErrorCode CODEGEN_IMPORT_COLUMNS_NULL = new ErrorCode(1003001002, "导入的字段不存在"); + ErrorCode CODEGEN_TABLE_NOT_EXISTS = new ErrorCode(1003001004, "表定义不存在"); + ErrorCode CODEGEN_COLUMN_NOT_EXISTS = new ErrorCode(1003001005, "字段义不存在"); + ErrorCode CODEGEN_SYNC_COLUMNS_NULL = new ErrorCode(1003001006, "同步的字段不存在"); + ErrorCode CODEGEN_SYNC_NONE_CHANGE = new ErrorCode(1003001007, "同步失败,不存在改变"); + ErrorCode CODEGEN_TABLE_INFO_TABLE_COMMENT_IS_NULL = new ErrorCode(1003001008, "数据库的表注释未填写"); + ErrorCode CODEGEN_TABLE_INFO_COLUMN_COMMENT_IS_NULL = new ErrorCode(1003001009, "数据库的表字段({})注释未填写"); + + // ========== 字典类型(测试)1001005000 ========== + ErrorCode TEST_DEMO_NOT_EXISTS = new ErrorCode(1001005000, "测试示例不存在"); + + // ========== 文件配置 1001006000 ========== + ErrorCode FILE_CONFIG_NOT_EXISTS = new ErrorCode(1001006000, "文件配置不存在"); + ErrorCode FILE_CONFIG_DELETE_FAIL_MASTER = new ErrorCode(1001006001, "该文件配置不允许删除,原因:它是主配置,删除会导致无法上传文件"); + + // ========== 数据源配置 1001007000 ========== + ErrorCode DATA_SOURCE_CONFIG_NOT_EXISTS = new ErrorCode(1001007000, "数据源配置不存在"); + ErrorCode DATA_SOURCE_CONFIG_NOT_OK = new ErrorCode(1001007001, "数据源配置不正确,无法进行连接"); + +} diff --git a/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/file/FileApi.class b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/file/FileApi.class new file mode 100644 index 0000000..31872ff Binary files /dev/null and b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/file/FileApi.class differ diff --git a/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/logger/ApiAccessLogApi.class b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/logger/ApiAccessLogApi.class new file mode 100644 index 0000000..da119df Binary files /dev/null and b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/logger/ApiAccessLogApi.class differ diff --git a/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/logger/ApiErrorLogApi.class b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/logger/ApiErrorLogApi.class new file mode 100644 index 0000000..7c99d43 Binary files /dev/null and b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/logger/ApiErrorLogApi.class differ diff --git a/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.class b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.class new file mode 100644 index 0000000..2cff9b8 Binary files /dev/null and b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.class differ diff --git a/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.class b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.class new file mode 100644 index 0000000..50204ae Binary files /dev/null and b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/api/logger/dto/ApiErrorLogCreateReqDTO.class differ diff --git a/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/enums/DictTypeConstants.class b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/enums/DictTypeConstants.class new file mode 100644 index 0000000..0c9ee03 Binary files /dev/null and b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/enums/DictTypeConstants.class differ diff --git a/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/enums/ErrorCodeConstants.class b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/enums/ErrorCodeConstants.class new file mode 100644 index 0000000..95910a4 Binary files /dev/null and b/joju-module-infra/joju-module-infra-api/target/classes/com/jojubanking/boot/module/infra/enums/ErrorCodeConstants.class differ diff --git a/joju-module-infra/joju-module-infra-api/target/joju-module-infra-api-2.0.0-beta.jar b/joju-module-infra/joju-module-infra-api/target/joju-module-infra-api-2.0.0-beta.jar new file mode 100644 index 0000000..0eac1a6 Binary files /dev/null and b/joju-module-infra/joju-module-infra-api/target/joju-module-infra-api-2.0.0-beta.jar differ diff --git a/joju-module-infra/joju-module-infra-api/target/maven-archiver/pom.properties b/joju-module-infra/joju-module-infra-api/target/maven-archiver/pom.properties new file mode 100644 index 0000000..e6ea519 --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:24 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-module-infra-api diff --git a/joju-module-infra/joju-module-infra-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-module-infra/joju-module-infra-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..b7bddd3 --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,7 @@ +com\jojubanking\boot\module\infra\api\logger\dto\ApiAccessLogCreateReqDTO.class +com\jojubanking\boot\module\infra\api\file\FileApi.class +com\jojubanking\boot\module\infra\enums\DictTypeConstants.class +com\jojubanking\boot\module\infra\api\logger\dto\ApiErrorLogCreateReqDTO.class +com\jojubanking\boot\module\infra\api\logger\ApiAccessLogApi.class +com\jojubanking\boot\module\infra\api\logger\ApiErrorLogApi.class +com\jojubanking\boot\module\infra\enums\ErrorCodeConstants.class diff --git a/joju-module-infra/joju-module-infra-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-module-infra/joju-module-infra-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..3da5515 --- /dev/null +++ b/joju-module-infra/joju-module-infra-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,8 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-api\src\main\java\com\jojubanking\boot\module\infra\api\logger\ApiErrorLogApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-api\src\main\java\com\jojubanking\boot\module\infra\api\logger\ApiAccessLogApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-api\src\main\java\com\jojubanking\boot\module\infra\api\logger\dto\ApiAccessLogCreateReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-api\src\main\java\com\jojubanking\boot\module\infra\api\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-api\src\main\java\com\jojubanking\boot\module\infra\api\file\FileApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-api\src\main\java\com\jojubanking\boot\module\infra\api\logger\dto\ApiErrorLogCreateReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-api\src\main\java\com\jojubanking\boot\module\infra\enums\DictTypeConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-api\src\main\java\com\jojubanking\boot\module\infra\enums\ErrorCodeConstants.java diff --git a/joju-module-infra/joju-module-infra-biz/joju-module-infra-biz.iml b/joju-module-infra/joju-module-infra-biz/joju-module-infra-biz.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/joju-module-infra-biz.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-module-infra/joju-module-infra-biz/pom.xml b/joju-module-infra/joju-module-infra-biz/pom.xml new file mode 100644 index 0000000..b5f9c16 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/pom.xml @@ -0,0 +1,124 @@ + + + + com.jojubanking.boot + joju-module-infra + ${revision} + + 4.0.0 + joju-module-infra-biz + jar + + ${project.artifactId} + + infra 模块,主要提供两块能力: + 1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等 + 2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等 + + + + + com.jojubanking.boot + joju-module-system-api + ${revision} + + + com.jojubanking.boot + joju-module-infra-api + ${revision} + + + + + com.jojubanking.boot + joju-spring-boot-starter-biz-operatelog + + + + + com.jojubanking.boot + joju-spring-boot-starter-security + + + + + com.jojubanking.boot + joju-spring-boot-starter-mybatis + + + com.baomidou + mybatis-plus-generator + + + + com.jojubanking.boot + joju-spring-boot-starter-redis + + + + + + + + + + + com.jojubanking.boot + joju-spring-boot-starter-job + + + + + com.jojubanking.boot + joju-spring-boot-starter-mq + + + + + com.jojubanking.boot + joju-spring-boot-starter-test + test + + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + + + + com.jojubanking.boot + joju-spring-boot-starter-excel + + + + org.apache.velocity + velocity-engine-core + + + + cn.smallbun.screw + screw-core + + + + + + + + + + + + + + + + com.jojubanking.boot + joju-spring-boot-starter-file + + + + diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/api/file/FileApiImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/api/file/FileApiImpl.java new file mode 100644 index 0000000..79a4dd8 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/api/file/FileApiImpl.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.infra.api.file; + +import com.jojubanking.boot.module.infra.service.file.FileService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 文件 API 实现类 + * + * @author TW + */ +@Service +@Validated +public class FileApiImpl implements FileApi { + + @Resource + private FileService fileService; + + @Override + public String createFile(String name, String path, byte[] content) { + return fileService.createFile(name, path, content); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/api/logger/ApiAccessLogApiImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/api/logger/ApiAccessLogApiImpl.java new file mode 100644 index 0000000..30aa54d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/api/logger/ApiAccessLogApiImpl.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.infra.api.logger; + +import com.jojubanking.boot.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.jojubanking.boot.module.infra.service.logger.ApiAccessLogService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * API 访问日志的 API 实现类 + * + * @author TW + */ +@Service +@Validated +public class ApiAccessLogApiImpl implements ApiAccessLogApi { + + @Resource + private ApiAccessLogService apiAccessLogService; + + @Override + public void createApiAccessLog(ApiAccessLogCreateReqDTO createDTO) { + apiAccessLogService.createApiAccessLog(createDTO); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/api/logger/ApiErrorLogApiImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/api/logger/ApiErrorLogApiImpl.java new file mode 100644 index 0000000..1643f74 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/api/logger/ApiErrorLogApiImpl.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.infra.api.logger; + +import com.jojubanking.boot.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.jojubanking.boot.module.infra.service.logger.ApiErrorLogService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * API 访问日志的 API 接口 + * + * @author TW + */ +@Service +@Validated +public class ApiErrorLogApiImpl implements ApiErrorLogApi { + + @Resource + private ApiErrorLogService apiErrorLogService; + + @Override + public void createApiErrorLog(ApiErrorLogCreateReqDTO createDTO) { + apiErrorLogService.createApiErrorLog(createDTO); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/api/package-info.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/api/package-info.java new file mode 100644 index 0000000..f428339 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/api/package-info.java @@ -0,0 +1 @@ +package com.jojubanking.boot.module.infra.api; diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/CodegenController.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/CodegenController.java new file mode 100644 index 0000000..75b50fe --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/CodegenController.java @@ -0,0 +1,141 @@ +package com.jojubanking.boot.module.infra.controller.admin.codegen; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ZipUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenDetailRespVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenPreviewRespVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO; +import com.jojubanking.boot.module.infra.convert.codegen.CodegenConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.jojubanking.boot.module.infra.service.codegen.CodegenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Api(tags = "管理后台 - 代码生成器") +@RestController +@RequestMapping("/infra/codegen") +@Validated +public class CodegenController { + + @Resource + private CodegenService codegenService; + + @GetMapping("/db/table/list") + @ApiOperation(value = "获得数据库自带的表定义列表", notes = "会过滤掉已经导入 Codegen 的表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "dataSourceConfigId", value = "数据源配置的编号", required = true, example = "1", dataTypeClass = Long.class), + @ApiImplicitParam(name = "name", value = "表名,模糊匹配", example = "joju", dataTypeClass = String.class), + @ApiImplicitParam(name = "comment", value = "描述,模糊匹配", example = "芋道", dataTypeClass = String.class) + }) + @PreAuthorize("@ss.hasPermission('infra:codegen:query')") + public CommonResult> getDatabaseTableList( + @RequestParam(value = "dataSourceConfigId") Long dataSourceConfigId, + @RequestParam(value = "name", required = false) String name, + @RequestParam(value = "comment", required = false) String comment) { + return success(codegenService.getDatabaseTableList(dataSourceConfigId, name, comment)); + } + + @GetMapping("/table/page") + @ApiOperation("获得表定义分页") + @PreAuthorize("@ss.hasPermission('infra:codegen:query')") + public CommonResult> getCodeGenTablePage(@Valid CodegenTablePageReqVO pageReqVO) { + PageResult pageResult = codegenService.getCodegenTablePage(pageReqVO); + return success(CodegenConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/detail") + @ApiOperation("获得表和字段的明细") + @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:codegen:query')") + public CommonResult getCodegenDetail(@RequestParam("tableId") Long tableId) { + CodegenTableDO table = codegenService.getCodegenTablePage(tableId); + List columns = codegenService.getCodegenColumnListByTableId(tableId); + // 拼装返回 + return success(CodegenConvert.INSTANCE.convert(table, columns)); + } + + @ApiOperation("基于数据库的表结构,创建代码生成器的表和字段定义") + @PostMapping("/create-list") + @PreAuthorize("@ss.hasPermission('infra:codegen:create')") + public CommonResult> createCodegenList(@Valid @RequestBody CodegenCreateListReqVO reqVO) { + return success(codegenService.createCodegenList(getLoginUserId(), reqVO)); + } + + @ApiOperation("更新数据库的表和字段定义") + @PutMapping("/update") + @PreAuthorize("@ss.hasPermission('infra:codegen:update')") + public CommonResult updateCodegen(@Valid @RequestBody CodegenUpdateReqVO updateReqVO) { + codegenService.updateCodegen(updateReqVO); + return success(true); + } + + @ApiOperation("基于数据库的表结构,同步数据库的表和字段定义") + @PutMapping("/sync-from-db") + @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:codegen:update')") + public CommonResult syncCodegenFromDB(@RequestParam("tableId") Long tableId) { + codegenService.syncCodegenFromDB(tableId); + return success(true); + } + + @ApiOperation("删除数据库的表和字段定义") + @DeleteMapping("/delete") + @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:codegen:delete')") + public CommonResult deleteCodegen(@RequestParam("tableId") Long tableId) { + codegenService.deleteCodegen(tableId); + return success(true); + } + + @ApiOperation("预览生成代码") + @GetMapping("/preview") + @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:codegen:preview')") + public CommonResult> previewCodegen(@RequestParam("tableId") Long tableId) { + Map codes = codegenService.generationCodes(tableId); + return success(CodegenConvert.INSTANCE.convert(codes)); + } + + @ApiOperation("下载生成代码") + @GetMapping("/download") + @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:codegen:download')") + public void downloadCodegen(@RequestParam("tableId") Long tableId, + HttpServletResponse response) throws IOException { + // 生成代码 + Map codes = codegenService.generationCodes(tableId); + // 构建 zip 包 + String[] paths = codes.keySet().toArray(new String[0]); + ByteArrayInputStream[] ins = codes.values().stream().map(IoUtil::toUtf8Stream).toArray(ByteArrayInputStream[]::new); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipUtil.zip(outputStream, paths, ins); + // 输出 + ServletUtils.writeAttachment(response, "codegen.zip", outputStream.toByteArray()); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java new file mode 100644 index 0000000..e4ad2f1 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.infra.controller.admin.codegen.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@ApiModel("管理后台 - 基于数据库的表结构,创建代码生成器的表和字段定义 Request VO") +@Data +public class CodegenCreateListReqVO { + + @ApiModelProperty(value = "数据源配置的编号", required = true, example = "1") + @NotNull(message = "数据源配置的编号不能为空") + private Long dataSourceConfigId; + + @ApiModelProperty(value = "表名数组", required = true, example = "[1, 2, 3]") + @NotNull(message = "表名数组不能为空") + private List tableNames; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.java new file mode 100644 index 0000000..3cfebc2 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.infra.controller.admin.codegen.vo; + +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.column.CodegenColumnRespVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel("管理后台 - 代码生成表和字段的明细 Response VO") +@Data +public class CodegenDetailRespVO { + + @ApiModelProperty("表定义") + private CodegenTableRespVO table; + + @ApiModelProperty("字段定义") + private List columns; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.java new file mode 100644 index 0000000..c8791e5 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.infra.controller.admin.codegen.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value = "管理后台 - 代码生成预览 Response VO", description ="注意,每个文件都是一个该对象") +@Data +public class CodegenPreviewRespVO { + + @ApiModelProperty(value = "文件路径", required = true, example = "java/com.jojubanking.boot/adminserver/modules/system/controller/test/SysTestDemoController.java") + private String filePath; + + @ApiModelProperty(value = "代码", required = true, example = "Hello World") + private String code; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java new file mode 100644 index 0000000..0357d96 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.module.infra.controller.admin.codegen.vo; + +import cn.hutool.core.util.ObjectUtil; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.column.CodegenColumnBaseVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.CodegenTableBaseVO; +import com.jojubanking.boot.module.infra.enums.codegen.CodegenSceneEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.Valid; +import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.NotNull; +import java.util.List; + +@ApiModel("管理后台 - 代码生成表和字段的修改 Request VO") +@Data +public class CodegenUpdateReqVO { + + @Valid // 校验内嵌的字段 + @NotNull(message = "表定义不能为空") + private Table table; + + @Valid // 校验内嵌的字段 + @NotNull(message = "字段定义不能为空") + private List columns; + + @ApiModel("更新表定义") + @Data + @EqualsAndHashCode(callSuper = true) + @ToString(callSuper = true) + @Valid + public static class Table extends CodegenTableBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + private Long id; + + @AssertTrue(message = "上级菜单不能为空") + public boolean isParentMenuIdValid() { + // 生成场景为管理后台时,必须设置上级菜单,不然生成的菜单 SQL 是无父级菜单的 + return ObjectUtil.notEqual(getScene(), CodegenSceneEnum.ADMIN.getScene()) + || getParentMenuId() != null; + } + + } + + @ApiModel("更新表定义") + @Data + @EqualsAndHashCode(callSuper = true) + @ToString(callSuper = true) + public static class Column extends CodegenColumnBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + private Long id; + + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/column/CodegenColumnBaseVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/column/CodegenColumnBaseVO.java new file mode 100644 index 0000000..a307124 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/column/CodegenColumnBaseVO.java @@ -0,0 +1,85 @@ +package com.jojubanking.boot.module.infra.controller.admin.codegen.vo.column; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 代码生成字段定义 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class CodegenColumnBaseVO { + + @ApiModelProperty(value = "表编号", required = true, example = "1") + @NotNull(message = "表编号不能为空") + private Long tableId; + + @ApiModelProperty(value = "字段名", required = true, example = "user_age") + @NotNull(message = "字段名不能为空") + private String columnName; + + @ApiModelProperty(value = "字段类型", required = true, example = "int(11)") + @NotNull(message = "字段类型不能为空") + private String dataType; + + @ApiModelProperty(value = "字段描述", required = true, example = "年龄") + @NotNull(message = "字段描述不能为空") + private String columnComment; + + @ApiModelProperty(value = "是否允许为空", required = true, example = "true") + @NotNull(message = "是否允许为空不能为空") + private Boolean nullable; + + @ApiModelProperty(value = "是否主键", required = true, example = "false") + @NotNull(message = "是否主键不能为空") + private Boolean primaryKey; + + @ApiModelProperty(value = "是否自增", required = true, example = "true") + @NotNull(message = "是否自增不能为空") + private String autoIncrement; + + @ApiModelProperty(value = "排序", required = true, example = "10") + @NotNull(message = "排序不能为空") + private Integer ordinalPosition; + + @ApiModelProperty(value = "Java 属性类型", required = true, example = "userAge") + @NotNull(message = "Java 属性类型不能为空") + private String javaType; + + @ApiModelProperty(value = "Java 属性名", required = true, example = "Integer") + @NotNull(message = "Java 属性名不能为空") + private String javaField; + + @ApiModelProperty(value = "字典类型", example = "sys_gender") + private String dictType; + + @ApiModelProperty(value = "数据示例", example = "1024") + private String example; + + @ApiModelProperty(value = "是否为 Create 创建操作的字段", required = true, example = "true") + @NotNull(message = "是否为 Create 创建操作的字段不能为空") + private Boolean createOperation; + + @ApiModelProperty(value = "是否为 Update 更新操作的字段", required = true, example = "false") + @NotNull(message = "是否为 Update 更新操作的字段不能为空") + private Boolean updateOperation; + + @ApiModelProperty(value = "是否为 List 查询操作的字段", required = true, example = "true") + @NotNull(message = "是否为 List 查询操作的字段不能为空") + private Boolean listOperation; + + @ApiModelProperty(value = "List 查询操作的条件类型", required = true, example = "LIKE", notes = "参见 CodegenColumnListConditionEnum 枚举") + @NotNull(message = "List 查询操作的条件类型不能为空") + private String listOperationCondition; + + @ApiModelProperty(value = "是否为 List 查询操作的返回字段", required = true, example = "true") + @NotNull(message = "是否为 List 查询操作的返回字段不能为空") + private Boolean listOperationResult; + + @ApiModelProperty(value = "显示类型", required = true, example = "input") + @NotNull(message = "显示类型不能为空") + private String htmlType; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.java new file mode 100644 index 0000000..d478173 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.infra.controller.admin.codegen.vo.column; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 代码生成字段定义 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CodegenColumnRespVO extends CodegenColumnBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTableBaseVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTableBaseVO.java new file mode 100644 index 0000000..a579fab --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTableBaseVO.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 代码生成 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class CodegenTableBaseVO { + + @ApiModelProperty(value = "生成场景", required = true, example = "1", notes = "参见 CodegenSceneEnum 枚举") + @NotNull(message = "导入类型不能为空") + private Integer scene; + + @ApiModelProperty(value = "表名称", required = true, example = "joju") + @NotNull(message = "表名称不能为空") + private String tableName; + + @ApiModelProperty(value = "表描述", required = true, example = "芋道") + @NotNull(message = "表描述不能为空") + private String tableComment; + + @ApiModelProperty(value = "备注", example = "我是备注") + private String remark; + + @ApiModelProperty(value = "模块名", required = true, example = "system") + @NotNull(message = "模块名不能为空") + private String moduleName; + + @ApiModelProperty(value = "业务名", required = true, example = "codegen") + @NotNull(message = "业务名不能为空") + private String businessName; + + @ApiModelProperty(value = "类名称", required = true, example = "CodegenTable") + @NotNull(message = "类名称不能为空") + private String className; + + @ApiModelProperty(value = "类描述", required = true, example = "代码生成器的表定义") + @NotNull(message = "类描述不能为空") + private String classComment; + + @ApiModelProperty(value = "作者", required = true, example = "TW") + @NotNull(message = "作者不能为空") + private String author; + + @ApiModelProperty(value = "模板类型", required = true, example = "1", notes = "参见 CodegenTemplateTypeEnum 枚举") + @NotNull(message = "模板类型不能为空") + private Integer templateType; + + @ApiModelProperty(value = "父菜单编号", example = "1024") + private Long parentMenuId; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java new file mode 100644 index 0000000..9599f48 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 表定义分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CodegenTablePageReqVO extends PageParam { + + @ApiModelProperty(value = "表名称", example = "joju", notes = "模糊匹配") + private String tableName; + + @ApiModelProperty(value = "表描述", example = "芋道", notes = "模糊匹配") + private String tableComment; + + @ApiModelProperty(value = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java new file mode 100644 index 0000000..ac8cc4e --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 代码生成表定义 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CodegenTableRespVO extends CodegenTableBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "主键编号", required = true, example = "1024") + private Integer dataSourceConfigId; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + + @ApiModelProperty(value = "更新时间", required = true) + private Date updateTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java new file mode 100644 index 0000000..63d8d7f --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("管理后台 - 数据库的表定义 Response VO") +@Data +public class DatabaseTableRespVO { + + @ApiModelProperty(value = "表名称", required = true, example = "yuanma") + private String name; + + @ApiModelProperty(value = "表描述", required = true, example = "TW") + private String comment; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/ConfigController.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/ConfigController.java new file mode 100644 index 0000000..d0a2459 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/ConfigController.java @@ -0,0 +1,105 @@ +package com.jojubanking.boot.module.infra.controller.admin.config; + +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.*; +import com.jojubanking.boot.module.infra.convert.config.ConfigConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.config.ConfigDO; +import com.jojubanking.boot.module.infra.service.config.ConfigService; +import com.jojubanking.boot.module.infra.enums.ErrorCodeConstants; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 参数配置") +@RestController +@RequestMapping("/infra/config") +@Validated +public class ConfigController { + + @Resource + private ConfigService configService; + + @PostMapping("/create") + @ApiOperation("创建参数配置") + @PreAuthorize("@ss.hasPermission('infra:config:create')") + public CommonResult createConfig(@Valid @RequestBody ConfigCreateReqVO reqVO) { + return success(configService.createConfig(reqVO)); + } + + @PutMapping("/update") + @ApiOperation("修改参数配置") + @PreAuthorize("@ss.hasPermission('infra:config:update')") + public CommonResult updateConfig(@Valid @RequestBody ConfigUpdateReqVO reqVO) { + configService.updateConfig(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除参数配置") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:config:delete')") + public CommonResult deleteConfig(@RequestParam("id") Long id) { + configService.deleteConfig(id); + return success(true); + } + + @GetMapping(value = "/get") + @ApiOperation("获得参数配置") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:config:query')") + public CommonResult getConfig(@RequestParam("id") Long id) { + return success(ConfigConvert.INSTANCE.convert(configService.getConfig(id))); + } + + @GetMapping(value = "/get-value-by-key") + @ApiOperation(value = "根据参数键名查询参数值", notes = "不可见的配置,不允许返回给前端") + @ApiImplicitParam(name = "key", value = "参数键", required = true, example = "yunai.biz.username", dataTypeClass = String.class) + public CommonResult getConfigKey(@RequestParam("key") String key) { + ConfigDO config = configService.getConfigByKey(key); + if (config == null) { + return null; + } + if (config.getVisible()) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_VISIBLE); + } + return success(config.getValue()); + } + + @GetMapping("/page") + @ApiOperation("获取参数配置分页") + @PreAuthorize("@ss.hasPermission('infra:config:query')") + public CommonResult> getConfigPage(@Valid ConfigPageReqVO reqVO) { + PageResult page = configService.getConfigPage(reqVO); + return success(ConfigConvert.INSTANCE.convertPage(page)); + } + + @GetMapping("/export") + @ApiOperation("导出参数配置") + @PreAuthorize("@ss.hasPermission('infra:config:export')") + @OperateLog(type = EXPORT) + public void exportSysConfig(@Valid ConfigExportReqVO reqVO, + HttpServletResponse response) throws IOException { + List list = configService.getConfigList(reqVO); + // 拼接数据 + List datas = ConfigConvert.INSTANCE.convertList(list); + // 输出 + ExcelUtils.write(response, "参数配置.xls", "数据", ConfigExcelVO.class, datas); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigBaseVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigBaseVO.java new file mode 100644 index 0000000..81831b2 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigBaseVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.infra.controller.admin.config.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 参数配置 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class ConfigBaseVO { + + @ApiModelProperty(value = "参数分组", required = true, example = "biz") + @NotEmpty(message = "参数分组不能为空") + @Size(max = 50, message = "参数名称不能超过50个字符") + private String category; + + @ApiModelProperty(value = "参数名称", required = true, example = "数据库名") + @NotBlank(message = "参数名称不能为空") + @Size(max = 100, message = "参数名称不能超过100个字符") + private String name; + + @ApiModelProperty(value = "参数键值", required = true, example = "1024") + @NotBlank(message = "参数键值不能为空") + @Size(max = 500, message = "参数键值长度不能超过500个字符") + private String value; + + @ApiModelProperty(value = "是否敏感", required = true, example = "true") + @NotNull(message = "是否敏感不能为空") + private Boolean visible; + + @ApiModelProperty(value = "备注", example = "备注一下很帅气!") + private String remark; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigCreateReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigCreateReqVO.java new file mode 100644 index 0000000..99dd939 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigCreateReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.infra.controller.admin.config.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +@ApiModel("管理后台 - 参数配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class ConfigCreateReqVO extends ConfigBaseVO { + + @ApiModelProperty(value = "参数键名", required = true, example = "yunai.db.username") + @NotBlank(message = "参数键名长度不能为空") + @Size(max = 100, message = "参数键名长度不能超过100个字符") + private String key; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigExcelVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigExcelVO.java new file mode 100644 index 0000000..bf9c246 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigExcelVO.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.module.infra.controller.admin.config.vo; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.infra.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 参数配置 Excel 导出响应 VO + */ +@Data +public class ConfigExcelVO { + + @ExcelProperty("参数配置序号") + private Long id; + + @ExcelProperty("参数键名") + private String key; + + @ExcelProperty("参数分组") + private String group; + + @ExcelProperty("参数名称") + private String name; + + @ExcelProperty("参数键值") + private String value; + + @ExcelProperty(value = "参数类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.CONFIG_TYPE) + private Integer type; + + @ExcelProperty(value = "是否敏感", converter = DictConvert.class) + @DictFormat(DictTypeConstants.BOOLEAN_STRING) + private Boolean sensitive; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigExportReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigExportReqVO.java new file mode 100644 index 0000000..c47213b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigExportReqVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.infra.controller.admin.config.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 参数配置导出 Request VO") +@Data +public class ConfigExportReqVO { + + @ApiModelProperty(value = "参数名称", example = "模糊匹配") + private String name; + + @ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配") + private String key; + + @ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举") + private Integer type; + + @ApiModelProperty(value = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigPageReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigPageReqVO.java new file mode 100644 index 0000000..82b60b7 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigPageReqVO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.infra.controller.admin.config.vo; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 参数配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ConfigPageReqVO extends PageParam { + + @ApiModelProperty(value = "数据源名称", example = "模糊匹配") + private String name; + + @ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配") + private String key; + + @ApiModelProperty(value = "参数类型", example = "1", notes = "参见 SysConfigTypeEnum 枚举") + private Integer type; + + @ApiModelProperty(value = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigRespVO.java new file mode 100644 index 0000000..bef9ca2 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigRespVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.infra.controller.admin.config.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.Date; + +@ApiModel("管理后台 - 参数配置信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class ConfigRespVO extends ConfigBaseVO { + + @ApiModelProperty(value = "参数配置序号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "参数键名", required = true, example = "yunai.db.username") + @NotBlank(message = "参数键名长度不能为空") + @Size(max = 100, message = "参数键名长度不能超过100个字符") + private String key; + + @ApiModelProperty(value = "参数类型", required = true, example = "1", notes = "参见 SysConfigTypeEnum 枚举") + private Integer type; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.java new file mode 100644 index 0000000..91683d0 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.infra.controller.admin.config.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 参数配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ConfigUpdateReqVO extends ConfigBaseVO { + + @ApiModelProperty(value = "参数配置序号", required = true, example = "1024") + @NotNull(message = "参数配置编号不能为空") + private Long id; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/DataSourceConfigController.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/DataSourceConfigController.java new file mode 100644 index 0000000..45af15b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/DataSourceConfigController.java @@ -0,0 +1,73 @@ +package com.jojubanking.boot.module.infra.controller.admin.db; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.module.infra.controller.admin.db.vo.DataSourceConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.db.vo.DataSourceConfigRespVO; +import com.jojubanking.boot.module.infra.controller.admin.db.vo.DataSourceConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.convert.db.DataSourceConfigConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.jojubanking.boot.module.infra.service.db.DataSourceConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - 数据源配置") +@RestController +@RequestMapping("/infra/data-source-config") +@Validated +public class DataSourceConfigController { + + @Resource + private DataSourceConfigService dataSourceConfigService; + + @PostMapping("/create") + @ApiOperation("创建数据源配置") + @PreAuthorize("@ss.hasPermission('infra:data-source-config:create')") + public CommonResult createDataSourceConfig(@Valid @RequestBody DataSourceConfigCreateReqVO createReqVO) { + return success(dataSourceConfigService.createDataSourceConfig(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新数据源配置") + @PreAuthorize("@ss.hasPermission('infra:data-source-config:update')") + public CommonResult updateDataSourceConfig(@Valid @RequestBody DataSourceConfigUpdateReqVO updateReqVO) { + dataSourceConfigService.updateDataSourceConfig(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除数据源配置") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:data-source-config:delete')") + public CommonResult deleteDataSourceConfig(@RequestParam("id") Long id) { + dataSourceConfigService.deleteDataSourceConfig(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得数据源配置") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:data-source-config:query')") + public CommonResult getDataSourceConfig(@RequestParam("id") Long id) { + DataSourceConfigDO dataSourceConfig = dataSourceConfigService.getDataSourceConfig(id); + return success(DataSourceConfigConvert.INSTANCE.convert(dataSourceConfig)); + } + + @GetMapping("/list") + @ApiOperation("获得数据源配置列表") + @PreAuthorize("@ss.hasPermission('infra:data-source-config:query')") + public CommonResult> getDataSourceConfigList() { + List list = dataSourceConfigService.getDataSourceConfigList(); + return success(DataSourceConfigConvert.INSTANCE.convertList(list)); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/DatabaseDocController.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/DatabaseDocController.java new file mode 100644 index 0000000..29b5171 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/DatabaseDocController.java @@ -0,0 +1,157 @@ +package com.jojubanking.boot.module.infra.controller.admin.db; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import cn.smallbun.screw.core.Configuration; +import cn.smallbun.screw.core.engine.EngineConfig; +import cn.smallbun.screw.core.engine.EngineFileType; +import cn.smallbun.screw.core.engine.EngineTemplateType; +import cn.smallbun.screw.core.execute.DocumentationExecute; +import cn.smallbun.screw.core.process.ProcessConfig; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; + +@Api(tags = "管理后台 - 数据库文档") +@RestController +@RequestMapping("/infra/db-doc") +public class DatabaseDocController { + + @Resource + private DynamicDataSourceProperties dynamicDataSourceProperties; + + private static final String FILE_OUTPUT_DIR = System.getProperty("java.io.tmpdir") + File.separator + + "db-doc"; + private static final String DOC_FILE_NAME = "数据库文档"; + private static final String DOC_VERSION = "1.0.0"; + private static final String DOC_DESCRIPTION = "文档描述"; + + @GetMapping("/export-html") + @ApiOperation("导出 html 格式的数据文档") + @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", + dataTypeClass = Boolean.class) + public void exportHtml(@RequestParam(defaultValue = "true") Boolean deleteFile, + HttpServletResponse response) throws IOException { + doExportFile(EngineFileType.HTML, deleteFile, response); + } + + @GetMapping("/export-word") + @ApiOperation("导出 word 格式的数据文档") + @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", + dataTypeClass = Boolean.class) + public void exportWord(@RequestParam(defaultValue = "true") Boolean deleteFile, + HttpServletResponse response) throws IOException { + doExportFile(EngineFileType.WORD, deleteFile, response); + } + + @GetMapping("/export-markdown") + @ApiOperation("导出 markdown 格式的数据文档") + @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", + dataTypeClass = Boolean.class) + public void exportMarkdown(@RequestParam(defaultValue = "true") Boolean deleteFile, + HttpServletResponse response) throws IOException { + doExportFile(EngineFileType.MD, deleteFile, response); + } + + private void doExportFile(EngineFileType fileOutputType, Boolean deleteFile, + HttpServletResponse response) throws IOException { + String docFileName = DOC_FILE_NAME + "_" + IdUtil.fastSimpleUUID(); + String filePath = doExportFile(fileOutputType, docFileName); + String downloadFileName = DOC_FILE_NAME + fileOutputType.getFileSuffix(); //下载后的文件名 + try { + // 读取,返回 + ServletUtils.writeAttachment(response, downloadFileName, FileUtil.readBytes(filePath)); + } finally { + handleDeleteFile(deleteFile, filePath); + } + } + + /** + * 输出文件,返回文件路径 + * + * @param fileOutputType 文件类型 + * @param fileName 文件名, 无需 ".docx" 等文件后缀 + * @return 生成的文件所在路径 + */ + private String doExportFile(EngineFileType fileOutputType, String fileName) { + try (HikariDataSource dataSource = buildDataSource()) { + // 创建 screw 的配置 + Configuration config = Configuration.builder() + .version(DOC_VERSION) // 版本 + .description(DOC_DESCRIPTION) // 描述 + .dataSource(dataSource) // 数据源 + .engineConfig(buildEngineConfig(fileOutputType, fileName)) // 引擎配置 + .produceConfig(buildProcessConfig()) // 处理配置 + .build(); + + // 执行 screw,生成数据库文档 + new DocumentationExecute(config).execute(); + + return FILE_OUTPUT_DIR + File.separator + fileName + fileOutputType.getFileSuffix(); + } + } + + private void handleDeleteFile(Boolean deleteFile, String filePath) { + if (!deleteFile) { + return; + } + FileUtil.del(filePath); + } + + /** + * 创建数据源 + */ + // TODO TW:screw 暂时不支持 druid,尴尬 + private HikariDataSource buildDataSource() { + // 获得 DataSource 数据源,目前只支持首个 + String primary = dynamicDataSourceProperties.getPrimary(); + DataSourceProperty dataSourceProperty = dynamicDataSourceProperties.getDatasource().get(primary); + // 创建 HikariConfig 配置类 + HikariConfig hikariConfig = new HikariConfig(); + hikariConfig.setJdbcUrl(dataSourceProperty.getUrl()); + hikariConfig.setUsername(dataSourceProperty.getUsername()); + hikariConfig.setPassword(dataSourceProperty.getPassword()); + hikariConfig.addDataSourceProperty("useInformationSchema", "true"); // 设置可以获取 tables remarks 信息 + // 创建数据源 + return new HikariDataSource(hikariConfig); + } + + /** + * 创建 screw 的引擎配置 + */ + private static EngineConfig buildEngineConfig(EngineFileType fileOutputType, String docFileName) { + return EngineConfig.builder() + .fileOutputDir(FILE_OUTPUT_DIR) // 生成文件路径 + .openOutputDir(false) // 打开目录 + .fileType(fileOutputType) // 文件类型 + .produceType(EngineTemplateType.velocity) // 文件类型 + .fileName(docFileName) // 自定义文件名称 + .build(); + } + + /** + * 创建 screw 的处理配置,一般可忽略 + * 指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置 + */ + private static ProcessConfig buildProcessConfig() { + return ProcessConfig.builder() + .ignoreTablePrefix(Arrays.asList("QRTZ_", "ACT_")) // 忽略表前缀 + .build(); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigBaseVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigBaseVO.java new file mode 100644 index 0000000..d75a166 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigBaseVO.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.infra.controller.admin.db.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 数据源配置 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DataSourceConfigBaseVO { + + @ApiModelProperty(value = "数据源名称", required = true, example = "test") + @NotNull(message = "数据源名称不能为空") + private String name; + + @ApiModelProperty(value = "数据源连接", required = true, example = "jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro") + @NotNull(message = "数据源连接不能为空") + private String url; + + @ApiModelProperty(value = "用户名", required = true, example = "root") + @NotNull(message = "用户名不能为空") + private String username; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigCreateReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigCreateReqVO.java new file mode 100644 index 0000000..6c48fa1 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigCreateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.infra.controller.admin.db.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 数据源配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DataSourceConfigCreateReqVO extends DataSourceConfigBaseVO { + + @ApiModelProperty(value = "密码", required = true, example = "123456") + @NotNull(message = "密码不能为空") + private String password; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java new file mode 100644 index 0000000..f446ed3 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.infra.controller.admin.db.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 数据源配置 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DataSourceConfigRespVO extends DataSourceConfigBaseVO { + + @ApiModelProperty(value = "主键编号", required = true, example = "1024") + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigUpdateReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigUpdateReqVO.java new file mode 100644 index 0000000..b222273 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigUpdateReqVO.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.infra.controller.admin.db.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 数据源配置更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DataSourceConfigUpdateReqVO extends DataSourceConfigBaseVO { + + @ApiModelProperty(value = "主键编号", required = true, example = "1024") + @NotNull(message = "主键编号不能为空") + private Long id; + + @ApiModelProperty(value = "密码", required = true, example = "123456") + @NotNull(message = "密码不能为空") + private String password; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/FileConfigController.http b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/FileConfigController.http new file mode 100644 index 0000000..01a83cd --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/FileConfigController.http @@ -0,0 +1,45 @@ +### 请求 /infra/file-config/create 接口 => 成功 +POST {{baseUrl}}/infra/file-config/create +Content-Type: application/json +tenant-id: {{adminTenentId}} +Authorization: Bearer {{token}} + +{ + "name": "S3 - 七牛云", + "remark": "", + "storage": 20, + "config": { + "accessKey": "b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8", + "accessSecret": "kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP", + "bucket": "ruoyi-vue-pro", + "endpoint": "s3-cn-south-1.qiniucs.com", + "domain": "http://test.joju.iocoder.cn", + "region": "oss-cn-beijing" + } +} + +### 请求 /infra/file-config/update 接口 => 成功 +PUT {{baseUrl}}/infra/file-config/update +Content-Type: application/json +tenant-id: {{adminTenentId}} +Authorization: Bearer {{token}} + +{ + "id": 2, + "name": "S3 - 七牛云", + "remark": "", + "config": { + "accessKey": "b7yvuhBSAGjmtPhMFcn9iMOxUOY_I06cA_p0ZUx8", + "accessSecret": "kXM1l5ia1RvSX3QaOEcwI3RLz3Y2rmNszWonKZtP", + "bucket": "ruoyi-vue-pro", + "endpoint": "s3-cn-south-1.qiniucs.com", + "domain": "http://test.joju.iocoder.cn", + "region": "oss-cn-beijing" + } +} + +### 请求 /infra/file-config/test 接口 => 成功 +GET {{baseUrl}}/infra/file-config/test?id=2 +Content-Type: application/json +tenant-id: {{adminTenentId}} +Authorization: Bearer {{token}} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/FileConfigController.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/FileConfigController.java new file mode 100644 index 0000000..653caf6 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/FileConfigController.java @@ -0,0 +1,89 @@ +package com.jojubanking.boot.module.infra.controller.admin.file; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigRespVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.convert.file.FileConfigConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileConfigDO; +import com.jojubanking.boot.module.infra.service.file.FileConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - 文件配置") +@RestController +@RequestMapping("/infra/file-config") +@Validated +public class FileConfigController { + + @Resource + private FileConfigService fileConfigService; + + @PostMapping("/create") + @ApiOperation("创建文件配置") + @PreAuthorize("@ss.hasPermission('infra:file-config:create')") + public CommonResult createFileConfig(@Valid @RequestBody FileConfigCreateReqVO createReqVO) { + return success(fileConfigService.createFileConfig(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新文件配置") + @PreAuthorize("@ss.hasPermission('infra:file-config:update')") + public CommonResult updateFileConfig(@Valid @RequestBody FileConfigUpdateReqVO updateReqVO) { + fileConfigService.updateFileConfig(updateReqVO); + return success(true); + } + + @PutMapping("/update-master") + @ApiOperation("更新文件配置为 Master") + @PreAuthorize("@ss.hasPermission('infra:file-config:update')") + public CommonResult updateFileConfigMaster(@RequestParam("id") Long id) { + fileConfigService.updateFileConfigMaster(id); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除文件配置") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:file-config:delete')") + public CommonResult deleteFileConfig(@RequestParam("id") Long id) { + fileConfigService.deleteFileConfig(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得文件配置") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:file-config:query')") + public CommonResult getFileConfig(@RequestParam("id") Long id) { + FileConfigDO fileConfig = fileConfigService.getFileConfig(id); + return success(FileConfigConvert.INSTANCE.convert(fileConfig)); + } + + @GetMapping("/page") + @ApiOperation("获得文件配置分页") + @PreAuthorize("@ss.hasPermission('infra:file-config:query')") + public CommonResult> getFileConfigPage(@Valid FileConfigPageReqVO pageVO) { + PageResult pageResult = fileConfigService.getFileConfigPage(pageVO); + return success(FileConfigConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/test") + @ApiOperation("测试文件配置是否正确") + @PreAuthorize("@ss.hasPermission('infra:file-config:query')") + public CommonResult testFileConfig(@RequestParam("id") Long id) throws Exception { + String url = fileConfigService.testFileConfig(id); + return success(url); + } +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/FileController.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/FileController.java new file mode 100644 index 0000000..f18212a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/FileController.java @@ -0,0 +1,89 @@ +package com.jojubanking.boot.module.infra.controller.admin.file; + +import cn.hutool.core.io.IoUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.file.FilePageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.file.FileRespVO; +import com.jojubanking.boot.module.infra.convert.file.FileConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileDO; +import com.jojubanking.boot.module.infra.service.file.FileService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - 文件存储") +@RestController +@RequestMapping("/infra/file") +@Validated +@Slf4j +public class FileController { + + @Resource + private FileService fileService; + + @PostMapping("/upload") + @ApiOperation("上传文件") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "文件附件", required = true, dataTypeClass = MultipartFile.class), + @ApiImplicitParam(name = "path", value = "文件路径", example = "jojuyuanma.png", dataTypeClass = String.class) + }) + @OperateLog(logArgs = false) // 上传文件,没有记录操作日志的必要 + public CommonResult uploadFile(@RequestParam("file") MultipartFile file, + @RequestParam(value = "path", required = false) String path) throws Exception { + return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()))); + } + + @DeleteMapping("/delete") + @ApiOperation("删除文件") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:file:delete')") + public CommonResult deleteFile(@RequestParam("id") Long id) throws Exception { + fileService.deleteFile(id); + return success(true); + } + + @GetMapping("/{configId}/get/{path}") + @PermitAll + @ApiOperation("下载文件") + @ApiImplicitParams({ + @ApiImplicitParam(name = "configId", value = "配置编号", required = true, dataTypeClass = Long.class), + @ApiImplicitParam(name = "path", value = "文件路径", required = true, dataTypeClass = String.class) + }) + public void getFileContent(HttpServletResponse response, + @PathVariable("configId") Long configId, + @PathVariable("path") String path) throws Exception { + byte[] content = fileService.getFileContent(configId, path); + if (content == null) { + log.warn("[getFileContent][configId({}) path({}) 文件不存在]", configId, path); + response.setStatus(HttpStatus.NOT_FOUND.value()); + return; + } + ServletUtils.writeAttachment(response, path, content); + } + + @GetMapping("/page") + @ApiOperation("获得文件分页") + @PreAuthorize("@ss.hasPermission('infra:file:query')") + public CommonResult> getFilePage(@Valid FilePageReqVO pageVO) { + PageResult pageResult = fileService.getFilePage(pageVO); + return success(FileConvert.INSTANCE.convertPage(pageResult)); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigBaseVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigBaseVO.java new file mode 100644 index 0000000..3c26a5b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigBaseVO.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.infra.controller.admin.file.vo.config; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 文件配置 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class FileConfigBaseVO { + + @ApiModelProperty(value = "配置名", required = true, example = "S3 - 阿里云") + @NotNull(message = "配置名不能为空") + private String name; + + @ApiModelProperty(value = "备注", example = "我是备注") + private String remark; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigCreateReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigCreateReqVO.java new file mode 100644 index 0000000..da5e26d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigCreateReqVO.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.infra.controller.admin.file.vo.config; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +@ApiModel("管理后台 - 文件配置创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Accessors(chain = true) +public class FileConfigCreateReqVO extends FileConfigBaseVO { + + @ApiModelProperty(value = "存储器", required = true, example = "1", notes = "参见 FileStorageEnum 枚举类") + @NotNull(message = "存储器不能为空") + private Integer storage; + + @ApiModelProperty(value = "存储配置", required = true, notes = "配置是动态参数,所以使用 Map 接收") + @NotNull(message = "存储配置不能为空") + private Map config; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigPageReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigPageReqVO.java new file mode 100644 index 0000000..7669dde --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigPageReqVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.infra.controller.admin.file.vo.config; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 文件配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FileConfigPageReqVO extends PageParam { + + @ApiModelProperty(value = "配置名", example = "S3 - 阿里云") + private String name; + + @ApiModelProperty(value = "存储器", example = "1") + private Integer storage; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigRespVO.java new file mode 100644 index 0000000..ba20ba9 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigRespVO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.infra.controller.admin.file.vo.config; + +import com.jojubanking.boot.framework.file.core.client.FileClientConfig; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +@ApiModel("管理后台 - 文件配置 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FileConfigRespVO extends FileConfigBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "存储器", required = true, example = "1", notes = "参见 FileStorageEnum 枚举类") + @NotNull(message = "存储器不能为空") + private Integer storage; + + @ApiModelProperty(value = "是否为主配置", required = true, example = "true") + @NotNull(message = "是否为主配置不能为空") + private Boolean master; + + @ApiModelProperty(value = "存储配置", required = true) + private FileClientConfig config; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigUpdateReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigUpdateReqVO.java new file mode 100644 index 0000000..07cabd8 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigUpdateReqVO.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.infra.controller.admin.file.vo.config; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +@ApiModel("管理后台 - 文件配置更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FileConfigUpdateReqVO extends FileConfigBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + @NotNull(message = "编号不能为空") + private Long id; + + @ApiModelProperty(value = "存储配置", required = true, notes = "配置是动态参数,所以使用 Map 接收") + @NotNull(message = "存储配置不能为空") + private Map config; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/FilePageReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/FilePageReqVO.java new file mode 100644 index 0000000..5f9a680 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/FilePageReqVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.infra.controller.admin.file.vo.file; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 文件分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FilePageReqVO extends PageParam { + + @ApiModelProperty(value = "文件路径", example = "joju", notes = "模糊匹配") + private String path; + + @ApiModelProperty(value = "文件类型", example = "application/octet-stream", notes = "模糊匹配") + private String type; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/FileRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/FileRespVO.java new file mode 100644 index 0000000..81e1626 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/FileRespVO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.infra.controller.admin.file.vo.file; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@ApiModel(value = "管理后台 - 文件 Response VO", description = "不返回 content 字段,太大") +@Data +public class FileRespVO { + + @ApiModelProperty(value = "文件编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "配置编号", required = true, example = "11") + private Long configId; + + @ApiModelProperty(value = "文件路径", required = true, example = "joju.jpg") + private String path; + + @ApiModelProperty(value = "原文件名", required = true, example = "joju.jpg") + private String name; + + @ApiModelProperty(value = "文件 URL", required = true, example = "https://www.iocoder.cn/joju.jpg") + private String url; + + @ApiModelProperty(value = "文件MIME类型", example = "application/octet-stream") + private String type; + + @ApiModelProperty(value = "文件大小", example = "2048", required = true) + private Integer size; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/UploadRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/UploadRespVO.java new file mode 100644 index 0000000..5554491 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/UploadRespVO.java @@ -0,0 +1,16 @@ +package com.jojubanking.boot.module.infra.controller.admin.file.vo.file; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "管理后台 - 上传文件 VO") +public class UploadRespVO { + + @ApiModelProperty(value = "文件名", required = true, example = "joju.jpg") + private String fileName; + + @ApiModelProperty(value = "文件 URL", required = true, example = "https://www.iocoder.cn/joju.jpg") + private String fileUrl; +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/JobController.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/JobController.java new file mode 100644 index 0000000..1c6e61e --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/JobController.java @@ -0,0 +1,145 @@ +package com.jojubanking.boot.module.infra.controller.admin.job; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.framework.quartz.core.util.CronUtils; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.*; +import com.jojubanking.boot.module.infra.convert.job.JobConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobDO; +import com.jojubanking.boot.module.infra.service.job.JobService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.quartz.SchedulerException; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 定时任务") +@RestController +@RequestMapping("/infra/job") +@Validated +public class JobController { + + @Resource + private JobService jobService; + + @PostMapping("/create") + @ApiOperation("创建定时任务") + @PreAuthorize("@ss.hasPermission('infra:job:create')") + public CommonResult createJob(@Valid @RequestBody JobCreateReqVO createReqVO) + throws SchedulerException { + return success(jobService.createJob(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新定时任务") + @PreAuthorize("@ss.hasPermission('infra:job:update')") + public CommonResult updateJob(@Valid @RequestBody JobUpdateReqVO updateReqVO) + throws SchedulerException { + jobService.updateJob(updateReqVO); + return success(true); + } + + @PutMapping("/update-status") + @ApiOperation("更新定时任务的状态") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class), + @ApiImplicitParam(name = "status", value = "状态", required = true, example = "1", dataTypeClass = Integer.class), + }) + @PreAuthorize("@ss.hasPermission('infra:job:update')") + public CommonResult updateJobStatus(@RequestParam(value = "id") Long id, @RequestParam("status") Integer status) + throws SchedulerException { + jobService.updateJobStatus(id, status); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除定时任务") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:job:delete')") + public CommonResult deleteJob(@RequestParam("id") Long id) + throws SchedulerException { + jobService.deleteJob(id); + return success(true); + } + + @PutMapping("/trigger") + @ApiOperation("触发定时任务") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:job:trigger')") + public CommonResult triggerJob(@RequestParam("id") Long id) throws SchedulerException { + jobService.triggerJob(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得定时任务") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult getJob(@RequestParam("id") Long id) { + JobDO job = jobService.getJob(id); + return success(JobConvert.INSTANCE.convert(job)); + } + + @GetMapping("/list") + @ApiOperation("获得定时任务列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobList(@RequestParam("ids") Collection ids) { + List list = jobService.getJobList(ids); + return success(JobConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得定时任务分页") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobPage(@Valid JobPageReqVO pageVO) { + PageResult pageResult = jobService.getJobPage(pageVO); + return success(JobConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出定时任务 Excel") + @PreAuthorize("@ss.hasPermission('infra:job:export')") + @OperateLog(type = EXPORT) + public void exportJobExcel(@Valid JobExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = jobService.getJobList(exportReqVO); + // 导出 Excel + List datas = JobConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "定时任务.xls", "数据", JobExcelVO.class, datas); + } + + @GetMapping("/get_next_times") + @ApiOperation("获得定时任务的下 n 次执行时间") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class), + @ApiImplicitParam(name = "count", value = "数量", example = "5", dataTypeClass = Long.class) + }) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobNextTimes(@RequestParam("id") Long id, + @RequestParam(value = "count", required = false, defaultValue = "5") Integer count) { + JobDO job = jobService.getJob(id); + if (job == null) { + return success(Collections.emptyList()); + } + return success(CronUtils.getNextTimes(job.getCronExpression(), count)); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/JobLogController.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/JobLogController.java new file mode 100644 index 0000000..94e593b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/JobLogController.java @@ -0,0 +1,81 @@ +package com.jojubanking.boot.module.infra.controller.admin.job; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogRespVO; +import com.jojubanking.boot.module.infra.convert.job.JobLogConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobLogDO; +import com.jojubanking.boot.module.infra.service.job.JobLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 定时任务日志") +@RestController +@RequestMapping("/infra/job-log") +@Validated +public class JobLogController { + + @Resource + private JobLogService jobLogService; + + @GetMapping("/get") + @ApiOperation("获得定时任务日志") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult getJobLog(@RequestParam("id") Long id) { + JobLogDO jobLog = jobLogService.getJobLog(id); + return success(JobLogConvert.INSTANCE.convert(jobLog)); + } + + @GetMapping("/list") + @ApiOperation("获得定时任务日志列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobLogList(@RequestParam("ids") Collection ids) { + List list = jobLogService.getJobLogList(ids); + return success(JobLogConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得定时任务日志分页") + @PreAuthorize("@ss.hasPermission('infra:job:query')") + public CommonResult> getJobLogPage(@Valid JobLogPageReqVO pageVO) { + PageResult pageResult = jobLogService.getJobLogPage(pageVO); + return success(JobLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出定时任务日志 Excel") + @PreAuthorize("@ss.hasPermission('infra:job:export')") + @OperateLog(type = EXPORT) + public void exportJobLogExcel(@Valid JobLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = jobLogService.getJobLogList(exportReqVO); + // 导出 Excel + List datas = JobLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "任务日志.xls", "数据", JobLogExcelVO.class, datas); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobBaseVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobBaseVO.java new file mode 100644 index 0000000..e201f76 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobBaseVO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.infra.controller.admin.job.vo.job; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 定时任务 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class JobBaseVO { + + @ApiModelProperty(value = "任务名称", required = true, example = "测试任务") + @NotNull(message = "任务名称不能为空") + private String name; + + @ApiModelProperty(value = "处理器的参数", example = "joju") + private String handlerParam; + + @ApiModelProperty(value = "CRON 表达式", required = true, example = "0/10 * * * * ? *") + @NotNull(message = "CRON 表达式不能为空") + private String cronExpression; + + @ApiModelProperty(value = "重试次数", required = true, example = "3") + @NotNull(message = "重试次数不能为空") + private Integer retryCount; + + @ApiModelProperty(value = "重试间隔", required = true, example = "1000") + @NotNull(message = "重试间隔不能为空") + private Integer retryInterval; + + @ApiModelProperty(value = "监控超时时间", example = "1000") + private Integer monitorTimeout; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobCreateReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobCreateReqVO.java new file mode 100644 index 0000000..947a386 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobCreateReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.infra.controller.admin.job.vo.job; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 定时任务创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobCreateReqVO extends JobBaseVO { + + @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob") + @NotNull(message = "处理器的名字不能为空") + private String handlerName; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobExcelVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobExcelVO.java new file mode 100644 index 0000000..a40c966 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobExcelVO.java @@ -0,0 +1,56 @@ +package com.jojubanking.boot.module.infra.controller.admin.job.vo.job; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.infra.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 定时任务 Excel VO + * + * @author TW + */ +@Data +public class JobExcelVO { + + @ExcelProperty("任务编号") + private Long id; + + @ExcelProperty("任务名称") + private String name; + + @ExcelProperty(value = "任务状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.JOB_STATUS) + private Integer status; + + @ExcelProperty("处理器的名字") + private String handlerName; + + @ExcelProperty("处理器的参数") + private String handlerParam; + + @ExcelProperty("CRON 表达式") + private String cronExpression; + + @ExcelProperty("最后一次执行的开始时间") + private Date executeBeginTime; + + @ExcelProperty("最后一次执行的结束时间") + private Date executeEndTime; + + @ExcelProperty("上一次触发时间") + private Date firePrevTime; + + @ExcelProperty("下一次触发时间") + private Date fireNextTime; + + @ExcelProperty("监控超时时间") + private Integer monitorTimeout; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobExportReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobExportReqVO.java new file mode 100644 index 0000000..5198669 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobExportReqVO.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.infra.controller.admin.job.vo.job; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value = "管理后台 - 定时任务 Excel 导出 Request VO", description = "参数和 JobPageReqVO 是一致的") +@Data +public class JobExportReqVO { + + @ApiModelProperty(value = "任务名称", example = "测试任务", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "任务状态", example = "1", notes = "参见 JobStatusEnum 枚举") + private Integer status; + + @ApiModelProperty(value = "处理器的名字", example = "UserSessionTimeoutJob", notes = "模糊匹配") + private String handlerName; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobPageReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobPageReqVO.java new file mode 100644 index 0000000..48101a3 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobPageReqVO.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.infra.controller.admin.job.vo.job; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("管理后台 - 定时任务分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobPageReqVO extends PageParam { + + @ApiModelProperty(value = "任务名称", example = "测试任务", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "任务状态", example = "1", notes = "参见 JobStatusEnum 枚举") + private Integer status; + + @ApiModelProperty(value = "处理器的名字", example = "sysUserSessionTimeoutJob", notes = "模糊匹配") + private String handlerName; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobRespVO.java new file mode 100644 index 0000000..1b35ccc --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobRespVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.infra.controller.admin.job.vo.job; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +@ApiModel("管理后台 - 定时任务 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobRespVO extends JobBaseVO { + + @ApiModelProperty(value = "任务编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "任务状态", required = true, example = "1") + private Integer status; + + @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob") + @NotNull(message = "处理器的名字不能为空") + private String handlerName; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobUpdateReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobUpdateReqVO.java new file mode 100644 index 0000000..e66ab62 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobUpdateReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.infra.controller.admin.job.vo.job; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 定时任务更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobUpdateReqVO extends JobBaseVO { + + @ApiModelProperty(value = "任务编号", required = true, example = "1024") + @NotNull(message = "任务编号不能为空") + private Long id; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogBaseVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogBaseVO.java new file mode 100644 index 0000000..06d336e --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogBaseVO.java @@ -0,0 +1,53 @@ +package com.jojubanking.boot.module.infra.controller.admin.job.vo.log; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 定时任务日志 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class JobLogBaseVO { + + @ApiModelProperty(value = "任务编号", required = true, example = "1024") + @NotNull(message = "任务编号不能为空") + private Long jobId; + + @ApiModelProperty(value = "处理器的名字", required = true, example = "sysUserSessionTimeoutJob") + @NotNull(message = "处理器的名字不能为空") + private String handlerName; + + @ApiModelProperty(value = "处理器的参数", example = "joju") + private String handlerParam; + + @ApiModelProperty(value = "第几次执行", required = true, example = "1") + @NotNull(message = "第几次执行不能为空") + private Integer executeIndex; + + @ApiModelProperty(value = "开始执行时间", required = true) + @NotNull(message = "开始执行时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束执行时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + + @ApiModelProperty(value = "执行时长", example = "123") + private Integer duration; + + @ApiModelProperty(value = "任务状态", required = true, example = "1", notes = "参见 JobLogStatusEnum 枚举") + @NotNull(message = "任务状态不能为空") + private Integer status; + + @ApiModelProperty(value = "结果数据", example = "执行成功") + private String result; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogExcelVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogExcelVO.java new file mode 100644 index 0000000..39180fc --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogExcelVO.java @@ -0,0 +1,53 @@ +package com.jojubanking.boot.module.infra.controller.admin.job.vo.log; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.infra.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 定时任务 Excel VO + * + * @author 芋艿 + */ +@Data +public class JobLogExcelVO { + + @ExcelProperty("日志编号") + private Long id; + + @ExcelProperty("任务编号") + private Long jobId; + + @ExcelProperty("处理器的名字") + private String handlerName; + + @ExcelProperty("处理器的参数") + private String handlerParam; + + @ExcelProperty("第几次执行") + private Integer executeIndex; + + @ExcelProperty("开始执行时间") + private Date beginTime; + + @ExcelProperty("结束执行时间") + private Date endTime; + + @ExcelProperty("执行时长") + private Integer duration; + + @ExcelProperty(value = "任务状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.JOB_STATUS) + private Integer status; + + @ExcelProperty("结果数据") + private String result; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.java new file mode 100644 index 0000000..929b701 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.infra.controller.admin.job.vo.log; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 定时任务 Excel 导出 Request VO", description = "参数和 JobLogPageReqVO 是一致的") +@Data +public class JobLogExportReqVO { + + @ApiModelProperty(value = "任务编号", example = "10") + private Long jobId; + + @ApiModelProperty(value = "处理器的名字", notes = "模糊匹配") + private String handlerName; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始执行时间") + private Date beginTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束执行时间") + private Date endTime; + + @ApiModelProperty(value = "任务状态", notes = "参见 JobLogStatusEnum 枚举") + private Integer status; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java new file mode 100644 index 0000000..6f75e13 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.infra.controller.admin.job.vo.log; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 定时任务日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobLogPageReqVO extends PageParam { + + @ApiModelProperty(value = "任务编号", example = "10") + private Long jobId; + + @ApiModelProperty(value = "处理器的名字", notes = "模糊匹配") + private String handlerName; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始执行时间") + private Date beginTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "结束执行时间") + private Date endTime; + + @ApiModelProperty(value = "任务状态", notes = "参见 JobLogStatusEnum 枚举") + private Integer status; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogRespVO.java new file mode 100644 index 0000000..77255d8 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogRespVO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.infra.controller.admin.job.vo.log; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 定时任务日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class JobLogRespVO extends JobLogBaseVO { + + @ApiModelProperty(value = "日志编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/ApiAccessLogController.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/ApiAccessLogController.java new file mode 100644 index 0000000..13b4255 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/ApiAccessLogController.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.module.infra.controller.admin.logger; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogRespVO; +import com.jojubanking.boot.module.infra.convert.logger.ApiAccessLogConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import com.jojubanking.boot.module.infra.service.logger.ApiAccessLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - API 访问日志") +@RestController +@RequestMapping("/infra/api-access-log") +@Validated +public class ApiAccessLogController { + + @Resource + private ApiAccessLogService apiAccessLogService; + + @GetMapping("/page") + @ApiOperation("获得API 访问日志分页") + @PreAuthorize("@ss.hasPermission('infra:api-access-log:query')") + public CommonResult> getApiAccessLogPage(@Valid ApiAccessLogPageReqVO pageVO) { + PageResult pageResult = apiAccessLogService.getApiAccessLogPage(pageVO); + return success(ApiAccessLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出API 访问日志 Excel") + @PreAuthorize("@ss.hasPermission('infra:api-access-log:export')") + @OperateLog(type = EXPORT) + public void exportApiAccessLogExcel(@Valid ApiAccessLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = apiAccessLogService.getApiAccessLogList(exportReqVO); + // 导出 Excel + List datas = ApiAccessLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "API 访问日志.xls", "数据", ApiAccessLogExcelVO.class, datas); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/ApiErrorLogController.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/ApiErrorLogController.java new file mode 100644 index 0000000..55bf355 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/ApiErrorLogController.java @@ -0,0 +1,74 @@ +package com.jojubanking.boot.module.infra.controller.admin.logger; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogRespVO; +import com.jojubanking.boot.module.infra.convert.logger.ApiErrorLogConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import com.jojubanking.boot.module.infra.service.logger.ApiErrorLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Api(tags = "管理后台 - API 错误日志") +@RestController +@RequestMapping("/infra/api-error-log") +@Validated +public class ApiErrorLogController { + + @Resource + private ApiErrorLogService apiErrorLogService; + + @PutMapping("/update-status") + @ApiOperation("更新 API 错误日志的状态") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class), + @ApiImplicitParam(name = "processStatus", value = "处理状态", required = true, example = "1", dataTypeClass = Integer.class) + }) + @PreAuthorize("@ss.hasPermission('infra:api-error-log:update-status')") + public CommonResult updateApiErrorLogProcess(@RequestParam("id") Long id, + @RequestParam("processStatus") Integer processStatus) { + apiErrorLogService.updateApiErrorLogProcess(id, processStatus, getLoginUserId()); + return success(true); + } + + @GetMapping("/page") + @ApiOperation("获得 API 错误日志分页") + @PreAuthorize("@ss.hasPermission('infra:api-error-log:query')") + public CommonResult> getApiErrorLogPage(@Valid ApiErrorLogPageReqVO pageVO) { + PageResult pageResult = apiErrorLogService.getApiErrorLogPage(pageVO); + return success(ApiErrorLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出 API 错误日志 Excel") + @PreAuthorize("@ss.hasPermission('infra:api-error-log:export')") + @OperateLog(type = EXPORT) + public void exportApiErrorLogExcel(@Valid ApiErrorLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = apiErrorLogService.getApiErrorLogList(exportReqVO); + // 导出 Excel + List datas = ApiErrorLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "API 错误日志.xls", "数据", ApiErrorLogExcelVO.class, datas); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogBaseVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogBaseVO.java new file mode 100644 index 0000000..c59fa0c --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogBaseVO.java @@ -0,0 +1,75 @@ +package com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* API 访问日志 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ApiAccessLogBaseVO { + + @ApiModelProperty(value = "链路追踪编号", required = true, example = "66600cb6-7852-11eb-9439-0242ac130002") + @NotNull(message = "链路追踪编号不能为空") + private String traceId; + + @ApiModelProperty(value = "用户编号", required = true, example = "666") + @NotNull(message = "用户编号不能为空") + private Long userId; + + @ApiModelProperty(value = "用户类型", required = true, example = "2", notes = "参见 UserTypeEnum 枚举") + @NotNull(message = "用户类型不能为空") + private Integer userType; + + @ApiModelProperty(value = "应用名", required = true, example = "dashboard") + @NotNull(message = "应用名不能为空") + private String applicationName; + + @ApiModelProperty(value = "请求方法名", required = true, example = "GET") + @NotNull(message = "请求方法名不能为空") + private String requestMethod; + + @ApiModelProperty(value = "请求地址", required = true, example = "/xxx/yyy") + @NotNull(message = "请求地址不能为空") + private String requestUrl; + + @ApiModelProperty(value = "请求参数") + private String requestParams; + + @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") + @NotNull(message = "用户 IP不能为空") + private String userIp; + + @ApiModelProperty(value = "浏览器 UA", required = true, example = "Mozilla/5.0") + @NotNull(message = "浏览器 UA不能为空") + private String userAgent; + + @ApiModelProperty(value = "开始请求时间", required = true) + @NotNull(message = "开始请求时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date beginTime; + + @ApiModelProperty(value = "结束请求时间", required = true) + @NotNull(message = "结束请求时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date endTime; + + @ApiModelProperty(value = "执行时长", required = true, example = "100") + @NotNull(message = "执行时长不能为空") + private Integer duration; + + @ApiModelProperty(value = "结果码", required = true, example = "0") + @NotNull(message = "结果码不能为空") + private Integer resultCode; + + @ApiModelProperty(value = "结果提示", example = "TW,牛逼!") + private String resultMsg; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExcelVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExcelVO.java new file mode 100644 index 0000000..c6efc73 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExcelVO.java @@ -0,0 +1,65 @@ +package com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * API 访问日志 Excel VO + * + * @author TW + */ +@Data +public class ApiAccessLogExcelVO { + + @ExcelProperty("日志主键") + private Long id; + + @ExcelProperty("链路追踪编号") + private String traceId; + + @ExcelProperty("用户编号") + private Long userId; + + @ExcelProperty(value = "用户类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_TYPE) + private Integer userType; + + @ExcelProperty("应用名") + private String applicationName; + + @ExcelProperty("请求方法名") + private String requestMethod; + + @ExcelProperty("请求地址") + private String requestUrl; + + @ExcelProperty("请求参数") + private String requestParams; + + @ExcelProperty("用户 IP") + private String userIp; + + @ExcelProperty("浏览器 UA") + private String userAgent; + + @ExcelProperty("开始请求时间") + private Date beginTime; + + @ExcelProperty("结束请求时间") + private Date endTime; + + @ExcelProperty("执行时长") + private Integer duration; + + @ExcelProperty("结果码") + private Integer resultCode; + + @ExcelProperty("结果提示") + private String resultMsg; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java new file mode 100644 index 0000000..636068e --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - API 访问日志 Excel 导出 Request VO", description = "参数和 ApiAccessLogPageReqVO 是一致的") +@Data +public class ApiAccessLogExportReqVO { + + @ApiModelProperty(value = "用户编号", example = "666") + private Long userId; + + @ApiModelProperty(value = "用户类型", example = "2") + private Integer userType; + + @ApiModelProperty(value = "应用名", example = "dashboard") + private String applicationName; + + @ApiModelProperty(value = "请求地址", example = "/xxx/yyy", notes = "模糊匹配") + private String requestUrl; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始请求时间") + private Date[] beginTime; + + @ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒") + private Integer duration; + + @ApiModelProperty(value = "结果码", example = "0") + private Integer resultCode; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java new file mode 100644 index 0000000..790f39d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - API 访问日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ApiAccessLogPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户编号", example = "666") + private Long userId; + + @ApiModelProperty(value = "用户类型", example = "2") + private Integer userType; + + @ApiModelProperty(value = "应用名", example = "dashboard") + private String applicationName; + + @ApiModelProperty(value = "请求地址", example = "/xxx/yyy", notes = "模糊匹配") + private String requestUrl; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始请求时间") + private Date[] beginTime; + + @ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒") + private Integer duration; + + @ApiModelProperty(value = "结果码", example = "0") + private Integer resultCode; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java new file mode 100644 index 0000000..4975b32 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - API 访问日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ApiAccessLogRespVO extends ApiAccessLogBaseVO { + + @ApiModelProperty(value = "日志主键", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogBaseVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogBaseVO.java new file mode 100644 index 0000000..1b474f4 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogBaseVO.java @@ -0,0 +1,96 @@ +package com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* API 错误日志 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ApiErrorLogBaseVO { + + @ApiModelProperty(value = "链路追踪编号", required = true, example = "66600cb6-7852-11eb-9439-0242ac130002") + @NotNull(message = "链路追踪编号不能为空") + private String traceId; + + @ApiModelProperty(value = "用户编号", required = true, example = "666") + @NotNull(message = "用户编号不能为空") + private Integer userId; + + @ApiModelProperty(value = "用户类型", required = true, example = "1") + @NotNull(message = "用户类型不能为空") + private Integer userType; + + @ApiModelProperty(value = "应用名", required = true, example = "dashboard") + @NotNull(message = "应用名不能为空") + private String applicationName; + + @ApiModelProperty(value = "请求方法名", required = true, example = "GET") + @NotNull(message = "请求方法名不能为空") + private String requestMethod; + + @ApiModelProperty(value = "请求地址", required = true, example = "/xx/yy") + @NotNull(message = "请求地址不能为空") + private String requestUrl; + + @ApiModelProperty(value = "请求参数", required = true) + @NotNull(message = "请求参数不能为空") + private String requestParams; + + @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") + @NotNull(message = "用户 IP不能为空") + private String userIp; + + @ApiModelProperty(value = "浏览器 UA", required = true, example = "Mozilla/5.0") + @NotNull(message = "浏览器 UA不能为空") + private String userAgent; + + @ApiModelProperty(value = "异常发生时间", required = true) + @NotNull(message = "异常发生时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date exceptionTime; + + @ApiModelProperty(value = "异常名", required = true) + @NotNull(message = "异常名不能为空") + private String exceptionName; + + @ApiModelProperty(value = "异常导致的消息", required = true) + @NotNull(message = "异常导致的消息不能为空") + private String exceptionMessage; + + @ApiModelProperty(value = "异常导致的根消息", required = true) + @NotNull(message = "异常导致的根消息不能为空") + private String exceptionRootCauseMessage; + + @ApiModelProperty(value = "异常的栈轨迹", required = true) + @NotNull(message = "异常的栈轨迹不能为空") + private String exceptionStackTrace; + + @ApiModelProperty(value = "异常发生的类全名", required = true) + @NotNull(message = "异常发生的类全名不能为空") + private String exceptionClassName; + + @ApiModelProperty(value = "异常发生的类文件", required = true) + @NotNull(message = "异常发生的类文件不能为空") + private String exceptionFileName; + + @ApiModelProperty(value = "异常发生的方法名", required = true) + @NotNull(message = "异常发生的方法名不能为空") + private String exceptionMethodName; + + @ApiModelProperty(value = "异常发生的方法所在行", required = true) + @NotNull(message = "异常发生的方法所在行不能为空") + private Integer exceptionLineNumber; + + @ApiModelProperty(value = "处理状态", required = true, example = "0") + @NotNull(message = "处理状态不能为空") + private Integer processStatus; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExcelVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExcelVO.java new file mode 100644 index 0000000..b6ec7d6 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExcelVO.java @@ -0,0 +1,90 @@ +package com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.infra.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * API 错误日志 Excel VO + * + * @author TW + */ +@Data +public class ApiErrorLogExcelVO { + + @ExcelProperty("编号") + private Integer id; + + @ExcelProperty("链路追踪编号") + private String traceId; + + @ExcelProperty("用户编号") + private Integer userId; + + @ExcelProperty(value = "用户类型", converter = DictConvert.class) + @DictFormat(com.jojubanking.boot.module.system.enums.DictTypeConstants.USER_TYPE) + private Integer userType; + + @ExcelProperty("应用名") + private String applicationName; + + @ExcelProperty("请求方法名") + private String requestMethod; + + @ExcelProperty("请求地址") + private String requestUrl; + + @ExcelProperty("请求参数") + private String requestParams; + + @ExcelProperty("用户 IP") + private String userIp; + + @ExcelProperty("浏览器 UA") + private String userAgent; + + @ExcelProperty("异常发生时间") + private Date exceptionTime; + + @ExcelProperty("异常名") + private String exceptionName; + + @ExcelProperty("异常导致的消息") + private String exceptionMessage; + + @ExcelProperty("异常导致的根消息") + private String exceptionRootCauseMessage; + + @ExcelProperty("异常的栈轨迹") + private String exceptionStackTrace; + + @ExcelProperty("异常发生的类全名") + private String exceptionClassName; + + @ExcelProperty("异常发生的类文件") + private String exceptionFileName; + + @ExcelProperty("异常发生的方法名") + private String exceptionMethodName; + + @ExcelProperty("异常发生的方法所在行") + private Integer exceptionLineNumber; + + @ExcelProperty("创建时间") + private Date createTime; + + @ExcelProperty(value = "处理状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.API_ERROR_LOG_PROCESS_STATUS) + private Integer processStatus; + + @ExcelProperty("处理时间") + private Date processTime; + + @ExcelProperty("处理用户编号") + private Integer processUserId; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java new file mode 100644 index 0000000..c9767e0 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - API 错误日志 Excel 导出 Request VO", description = "参数和 ApiErrorLogPageReqVO 是一致的") +@Data +public class ApiErrorLogExportReqVO { + + @ApiModelProperty(value = "用户编号", example = "666") + private Long userId; + + @ApiModelProperty(value = "用户类型", example = "1") + private Integer userType; + + @ApiModelProperty(value = "应用名", example = "dashboard") + private String applicationName; + + @ApiModelProperty(value = "请求地址", example = "/xx/yy") + private String requestUrl; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "异常发生时间") + private Date[] exceptionTime; + + @ApiModelProperty(value = "处理状态", example = "0") + private Integer processStatus; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java new file mode 100644 index 0000000..fb58a0b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - API 错误日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ApiErrorLogPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户编号", example = "666") + private Long userId; + + @ApiModelProperty(value = "用户类型", example = "1") + private Integer userType; + + @ApiModelProperty(value = "应用名", example = "dashboard") + private String applicationName; + + @ApiModelProperty(value = "请求地址", example = "/xx/yy") + private String requestUrl; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "异常发生时间") + private Date[] exceptionTime; + + @ApiModelProperty(value = "处理状态", example = "0") + private Integer processStatus; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java new file mode 100644 index 0000000..fca401a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - API 错误日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ApiErrorLogRespVO extends ApiErrorLogBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + + @ApiModelProperty(value = "处理时间", required = true) + private Date processTime; + + @ApiModelProperty(value = "处理用户编号", example = "233") + private Integer processUserId; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/RedisController.http b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/RedisController.http new file mode 100644 index 0000000..0310dea --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/RedisController.http @@ -0,0 +1,9 @@ +### 请求 /infra/redis/get-monitor-info 接口 => 成功 +GET {{baseUrl}}/infra/redis/get-monitor-info +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### 请求 /infra/redis/get-key-list 接口 => 成功 +GET {{baseUrl}}/infra/redis/get-key-list +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/RedisController.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/RedisController.java new file mode 100644 index 0000000..ac4ab0c --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/RedisController.java @@ -0,0 +1,112 @@ +package com.jojubanking.boot.module.infra.controller.admin.redis; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.redis.core.RedisKeyDefine; +import com.jojubanking.boot.framework.redis.core.RedisKeyRegistry; +import com.jojubanking.boot.module.infra.controller.admin.redis.vo.RedisKeyDefineRespVO; +import com.jojubanking.boot.module.infra.controller.admin.redis.vo.RedisKeyValueRespVO; +import com.jojubanking.boot.module.infra.controller.admin.redis.vo.RedisMonitorRespVO; +import com.jojubanking.boot.module.infra.convert.redis.RedisConvert; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.data.redis.connection.RedisServerCommands; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.ScanOptions; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.*; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - Redis 监控") +@RestController +@RequestMapping("/infra/redis") +public class RedisController { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + @GetMapping("/get-monitor-info") + @ApiOperation("获得 Redis 监控信息") + @PreAuthorize("@ss.hasPermission('infra:redis:get-monitor-info')") + public CommonResult getRedisMonitorInfo() { + // 获得 Redis 统计信息 + Properties info = stringRedisTemplate.execute((RedisCallback) RedisServerCommands::info); + Long dbSize = stringRedisTemplate.execute(RedisServerCommands::dbSize); + Properties commandStats = stringRedisTemplate.execute(( + RedisCallback) connection -> connection.info("commandstats")); + assert commandStats != null; // 断言,避免警告 + // 拼接结果返回 + return success(RedisConvert.INSTANCE.build(info, dbSize, commandStats)); + } + + @GetMapping("/get-key-define-list") + @ApiOperation("获得 Redis Key 模板列表") + @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") + public CommonResult> getKeyDefineList() { + List keyDefines = RedisKeyRegistry.list(); + return success(RedisConvert.INSTANCE.convertList(keyDefines)); + } + + @GetMapping("/get-key-list") + @ApiOperation("获得 Redis keys 键名列表") + @ApiImplicitParam(name = "keyTemplate", value = "Redis Key 定义", example = "true", dataTypeClass = String.class) + @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") + public CommonResult> getKeyDefineList(@RequestParam("keyTemplate") String keyTemplate) { + return success(getKeyDefineList0(keyTemplate)); + } + + private Set getKeyDefineList0(String keyTemplate) { + // key 格式化 + String key = StrUtil.replace(keyTemplate, "%[s|c|b|d|x|o|f|a|e|g]", parameter -> "*"); + // scan 扫描 key + Set keys = new LinkedHashSet<>(); + stringRedisTemplate.execute((RedisCallback>) connection -> { + try (Cursor cursor = connection.scan(ScanOptions.scanOptions().match(key).count(100).build())) { + cursor.forEachRemaining(value -> keys.add(StrUtil.utf8Str(value))); + } catch (Exception e) { + throw new RuntimeException(e); + } + return keys; + }); + return keys; + } + + @GetMapping("/get-key-value") + @ApiOperation("获得 Redis key 内容") + @ApiImplicitParam(name = "key", value = "Redis Key", example = "oauth2_access_token:233", dataTypeClass = String.class) + @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") + public CommonResult getKeyValue(@RequestParam("key") String key) { + String value = stringRedisTemplate.opsForValue().get(key); + return success(new RedisKeyValueRespVO(key, value)); + } + + @DeleteMapping("/delete-key") + @ApiOperation("删除 Redis Key") + @ApiImplicitParam(name = "key", value = "Redis Key", example = "oauth2_access_token:233", dataTypeClass = String.class) + @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") + public CommonResult deleteKey(@RequestParam("key") String key) { + stringRedisTemplate.delete(key); + return success(Boolean.TRUE); + } + + @DeleteMapping("/delete-keys") + @ApiOperation("删除 Redis Key 根据模板") + @ApiImplicitParam(name = "keyTemplate", value = "Redis Key 定义", example = "true", dataTypeClass = String.class) + @PreAuthorize("@ss.hasPermission('infra:redis:get-key-list')") + public CommonResult deleteKeys(@RequestParam("keyTemplate") String keyTemplate) { + Set keys = getKeyDefineList0(keyTemplate); + if (CollUtil.isNotEmpty(keys)) { + stringRedisTemplate.delete(keys); + } + return success(Boolean.TRUE); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyDefineRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyDefineRespVO.java new file mode 100644 index 0000000..3891428 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyDefineRespVO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.infra.controller.admin.redis.vo; + +import com.jojubanking.boot.framework.redis.core.RedisKeyDefine; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.time.Duration; + +@ApiModel("管理后台 - Redis Key 信息 Response VO") +@Data +@Builder +@AllArgsConstructor +public class RedisKeyDefineRespVO { + + @ApiModelProperty(value = "Key 模板", required = true, example = "login_user:%s") + private String keyTemplate; + + @ApiModelProperty(value = "Key 类型的枚举", required = true, example = "String") + private RedisKeyDefine.KeyTypeEnum keyType; + + @ApiModelProperty(value = "Value 类型", required = true, example = "java.lang.String") + private Class valueType; + + @ApiModelProperty(value = "超时类型", required = true, example = "1") + private RedisKeyDefine.TimeoutTypeEnum timeoutType; + + @ApiModelProperty(value = "过期时间,单位:毫秒", required = true, example = "1024") + private Duration timeout; + + @ApiModelProperty(value = "备注", required = true, example = "啦啦啦啦~") + private String memo; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyValueRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyValueRespVO.java new file mode 100644 index 0000000..0ec9984 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyValueRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.infra.controller.admin.redis.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; + +@ApiModel("管理后台 - 单个 Redis Key Value Response VO") +@Data +@AllArgsConstructor +public class RedisKeyValueRespVO { + + @ApiModelProperty(value = "c5f6990767804a928f4bb96ca249febf", required = true, example = "String") + private String key; + + @ApiModelProperty(required = true, example = "String") + private String value; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.java new file mode 100644 index 0000000..802fe62 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.infra.controller.admin.redis.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Properties; + +@ApiModel("管理后台 - Redis 监控信息 Response VO") +@Data +@Builder +@AllArgsConstructor +public class RedisMonitorRespVO { + + @ApiModelProperty(value = "Redis info 指令结果", required = true, notes = "具体字段,查看 Redis 文档") + private Properties info; + + @ApiModelProperty(value = "Redis key 数量", required = true, example = "1024") + private Long dbSize; + + @ApiModelProperty(value = "CommandStat 数组", required = true) + private List commandStats; + + @ApiModel("Redis 命令统计结果") + @Data + @Builder + @AllArgsConstructor + public static class CommandStat { + + @ApiModelProperty(value = "Redis 命令", required = true, example = "get") + private String command; + + @ApiModelProperty(value = "调用次数", required = true, example = "1024") + private Long calls; + + @ApiModelProperty(value = "消耗 CPU 秒数", required = true, example = "666") + private Long usec; + + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/TestDemoController.http b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/TestDemoController.http new file mode 100644 index 0000000..ed65d0b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/TestDemoController.http @@ -0,0 +1,19 @@ +### 请求 /infra/test-demo/get 接口 => 成功 +GET {{baseUrl}}/infra/test-demo/get?id=106 +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### 请求 /infra/test-demo/update 接口 => 成功 +PUT {{baseUrl}}/infra/test-demo/update +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} +Content-Type: application/json + + +{ + "id": 106, + "name": "测试", + "status": "0", + "type": 1, + "category": 1 +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/TestDemoController.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/TestDemoController.java new file mode 100644 index 0000000..536eb2f --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/TestDemoController.java @@ -0,0 +1,97 @@ +package com.jojubanking.boot.module.infra.controller.admin.test; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.*; +import com.jojubanking.boot.module.infra.convert.test.TestDemoConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.test.TestDemoDO; +import com.jojubanking.boot.module.infra.service.test.TestDemoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 字典类型") +@RestController +@RequestMapping("/infra/test-demo") +@Validated +public class TestDemoController { + + @Resource + private TestDemoService testDemoService; + + @PostMapping("/create") + @ApiOperation("创建字典类型") + @PreAuthorize("@ss.hasPermission('infra:test-demo:create')") + public CommonResult createTestDemo(@Valid @RequestBody TestDemoCreateReqVO createReqVO) { + return success(testDemoService.createTestDemo(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新字典类型") + @PreAuthorize("@ss.hasPermission('infra:test-demo:update')") + public CommonResult updateTestDemo(@Valid @RequestBody TestDemoUpdateReqVO updateReqVO) { + testDemoService.updateTestDemo(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除字典类型") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:test-demo:delete')") + public CommonResult deleteTestDemo(@RequestParam("id") Long id) { + testDemoService.deleteTestDemo(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得字典类型") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('infra:test-demo:query')") + public CommonResult getTestDemo(@RequestParam("id") Long id) { + TestDemoDO testDemo = testDemoService.getTestDemo(id); + return success(TestDemoConvert.INSTANCE.convert(testDemo)); + } + + @GetMapping("/list") + @ApiOperation("获得字典类型列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('infra:test-demo:query')") + public CommonResult> getTestDemoList(@RequestParam("ids") Collection ids) { + List list = testDemoService.getTestDemoList(ids); + return success(TestDemoConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得字典类型分页") + @PreAuthorize("@ss.hasPermission('infra:test-demo:query')") public CommonResult> getTestDemoPage(@Valid TestDemoPageReqVO pageVO) { + PageResult pageResult = testDemoService.getTestDemoPage(pageVO); + return success(TestDemoConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出字典类型 Excel") + @PreAuthorize("@ss.hasPermission('infra:test-demo:export')") @OperateLog(type = EXPORT) + public void exportTestDemoExcel(@Valid TestDemoExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = testDemoService.getTestDemoList(exportReqVO); + // 导出 Excel + List datas = TestDemoConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "字典类型.xls", "数据", TestDemoExcelVO.class, datas); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoBaseVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoBaseVO.java new file mode 100644 index 0000000..e92152d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoBaseVO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.infra.controller.admin.test.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 字典类型 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class TestDemoBaseVO { + + @ApiModelProperty(value = "名字", required = true) + @NotNull(message = "名字不能为空") + private String name; + + @ApiModelProperty(value = "状态", required = true) + @NotNull(message = "状态不能为空") + private Integer status; + + @ApiModelProperty(value = "类型", required = true) + @NotNull(message = "类型不能为空") + private Integer type; + + @ApiModelProperty(value = "分类", required = true) + @NotNull(message = "分类不能为空") + private Integer category; + + @ApiModelProperty(value = "备注") + private String remark; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoCreateReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoCreateReqVO.java new file mode 100644 index 0000000..37afcde --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoCreateReqVO.java @@ -0,0 +1,12 @@ +package com.jojubanking.boot.module.infra.controller.admin.test.vo; + +import lombok.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 字典类型创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TestDemoCreateReqVO extends TestDemoBaseVO { + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoExcelVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoExcelVO.java new file mode 100644 index 0000000..437da6c --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoExcelVO.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.infra.controller.admin.test.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 字典类型 Excel VO + * + * @author TW + */ +@Data +public class TestDemoExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("名字") + private String name; + + @ExcelProperty("状态") + private Integer status; + + @ExcelProperty("类型") + private Integer type; + + @ExcelProperty("分类") + private Integer category; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoExportReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoExportReqVO.java new file mode 100644 index 0000000..d6aff0c --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoExportReqVO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.infra.controller.admin.test.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 字典类型 Excel 导出 Request VO", description = "参数和 TestDemoPageReqVO 是一致的") +@Data +public class TestDemoExportReqVO { + + @ApiModelProperty(value = "名字") + private String name; + + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(value = "类型") + private Integer type; + + @ApiModelProperty(value = "分类") + private Integer category; + + @ApiModelProperty(value = "备注") + private String remark; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoPageReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoPageReqVO.java new file mode 100644 index 0000000..6bd7ca4 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoPageReqVO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.infra.controller.admin.test.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 字典类型分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TestDemoPageReqVO extends PageParam { + + @ApiModelProperty(value = "名字") + private String name; + + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(value = "类型") + private Integer type; + + @ApiModelProperty(value = "分类") + private Integer category; + + @ApiModelProperty(value = "备注") + private String remark; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoRespVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoRespVO.java new file mode 100644 index 0000000..fcc9e65 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.infra.controller.admin.test.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 字典类型 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TestDemoRespVO extends TestDemoBaseVO { + + @ApiModelProperty(value = "编号", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoUpdateReqVO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoUpdateReqVO.java new file mode 100644 index 0000000..d7013b4 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoUpdateReqVO.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.infra.controller.admin.test.vo; + +import lombok.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 字典类型更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TestDemoUpdateReqVO extends TestDemoBaseVO { + + @ApiModelProperty(value = "编号", required = true) + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/app/package-info.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/app/package-info.java new file mode 100644 index 0000000..e111065 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/app/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.jojubanking.boot.module.infra.controller.app; diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/package-info.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/package-info.java new file mode 100644 index 0000000..fbe40f5 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/controller/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 RESTful API 给前端: + * 1. admin 包:提供给管理后台 joju-ui-admin 前端项目 + * 2. app 包:提供给用户 APP joju-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 + */ +package com.jojubanking.boot.module.infra.controller; diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/codegen/CodegenConvert.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/codegen/CodegenConvert.java new file mode 100644 index 0000000..605d32d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/codegen/CodegenConvert.java @@ -0,0 +1,86 @@ +package com.jojubanking.boot.module.infra.convert.codegen; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenDetailRespVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenPreviewRespVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.column.CodegenColumnRespVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Mapper +public interface CodegenConvert { + + CodegenConvert INSTANCE = Mappers.getMapper(CodegenConvert.class); + + // ========== TableInfo 相关 ========== + + @Mappings({ + @Mapping(source = "name", target = "tableName"), + @Mapping(source = "comment", target = "tableComment"), + }) + CodegenTableDO convert(TableInfo bean); + + List convertList(List list); + + @Mappings({ + @Mapping(source = "name", target = "columnName"), + @Mapping(source = "type", target = "dataType"), + @Mapping(source = "comment", target = "columnComment"), + @Mapping(source = "metaInfo.nullable", target = "nullable"), + @Mapping(source = "keyFlag", target = "primaryKey"), + @Mapping(source = "keyIdentityFlag", target = "autoIncrement"), + @Mapping(source = "columnType.type", target = "javaType"), + @Mapping(source = "propertyName", target = "javaField"), + }) + CodegenColumnDO convert(TableField bean); + + // ========== CodegenTableDO 相关 ========== + +// List convertList02(List list); + + CodegenTableRespVO convert(CodegenTableDO bean); + + PageResult convertPage(PageResult page); + + // ========== CodegenTableDO 相关 ========== + + List convertList02(List list); + + CodegenTableDO convert(CodegenUpdateReqVO.Table bean); + + List convertList03(List columns); + + List convertList04(List list); + + // ========== 其它 ========== + + default CodegenDetailRespVO convert(CodegenTableDO table, List columns) { + CodegenDetailRespVO respVO = new CodegenDetailRespVO(); + respVO.setTable(convert(table)); + respVO.setColumns(convertList02(columns)); + return respVO; + } + + default List convert(Map codes) { + return codes.entrySet().stream().map(entry -> { + CodegenPreviewRespVO respVO = new CodegenPreviewRespVO(); + respVO.setFilePath(entry.getKey()); + respVO.setCode(entry.getValue()); + return respVO; + }).collect(Collectors.toList()); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/config/ConfigConvert.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/config/ConfigConvert.java new file mode 100644 index 0000000..d71919c --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/config/ConfigConvert.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.infra.convert.config; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigRespVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.config.ConfigDO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface ConfigConvert { + + ConfigConvert INSTANCE = Mappers.getMapper(ConfigConvert.class); + + PageResult convertPage(PageResult page); + + @Mapping(source = "configKey", target = "key") + ConfigRespVO convert(ConfigDO bean); + + @Mapping(source = "key", target = "configKey") + ConfigDO convert(ConfigCreateReqVO bean); + + ConfigDO convert(ConfigUpdateReqVO bean); + + @Mapping(source = "configKey", target = "key") + List convertList(List list); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/db/DataSourceConfigConvert.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/db/DataSourceConfigConvert.java new file mode 100644 index 0000000..93931eb --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/db/DataSourceConfigConvert.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.infra.convert.db; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.infra.controller.admin.db.vo.*; +import com.jojubanking.boot.module.infra.dal.dataobject.db.DataSourceConfigDO; + +/** + * 数据源配置 Convert + * + * @author TW + */ +@Mapper +public interface DataSourceConfigConvert { + + DataSourceConfigConvert INSTANCE = Mappers.getMapper(DataSourceConfigConvert.class); + + DataSourceConfigDO convert(DataSourceConfigCreateReqVO bean); + + DataSourceConfigDO convert(DataSourceConfigUpdateReqVO bean); + + DataSourceConfigRespVO convert(DataSourceConfigDO bean); + + List convertList(List list); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/file/FileConfigConvert.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/file/FileConfigConvert.java new file mode 100644 index 0000000..2c1237e --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/file/FileConfigConvert.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.infra.convert.file; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigRespVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileConfigDO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 文件配置 Convert + * + * @author TW + */ +@Mapper +public interface FileConfigConvert { + + FileConfigConvert INSTANCE = Mappers.getMapper(FileConfigConvert.class); + + @Mapping(target = "config", ignore = true) + FileConfigDO convert(FileConfigCreateReqVO bean); + + @Mapping(target = "config", ignore = true) + FileConfigDO convert(FileConfigUpdateReqVO bean); + + FileConfigRespVO convert(FileConfigDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/file/FileConvert.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/file/FileConvert.java new file mode 100644 index 0000000..a189a28 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/file/FileConvert.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.infra.convert.file; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.file.FileRespVO; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface FileConvert { + + FileConvert INSTANCE = Mappers.getMapper(FileConvert.class); + + FileRespVO convert(FileDO bean); + + PageResult convertPage(PageResult page); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/job/JobConvert.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/job/JobConvert.java new file mode 100644 index 0000000..716a16a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/job/JobConvert.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.infra.convert.job; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobRespVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 定时任务 Convert + * + * @author TW + */ +@Mapper +public interface JobConvert { + + JobConvert INSTANCE = Mappers.getMapper(JobConvert.class); + + JobDO convert(JobCreateReqVO bean); + + JobDO convert(JobUpdateReqVO bean); + + JobRespVO convert(JobDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/job/JobLogConvert.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/job/JobLogConvert.java new file mode 100644 index 0000000..102b583 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/job/JobLogConvert.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.infra.convert.job; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogRespVO; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 定时任务日志 Convert + * + * @author 芋艿 + */ +@Mapper +public interface JobLogConvert { + + JobLogConvert INSTANCE = Mappers.getMapper(JobLogConvert.class); + + JobLogRespVO convert(JobLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/logger/ApiAccessLogConvert.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/logger/ApiAccessLogConvert.java new file mode 100644 index 0000000..fd1e42a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/logger/ApiAccessLogConvert.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.infra.convert.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogRespVO; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * API 访问日志 Convert + * + * @author TW + */ +@Mapper +public interface ApiAccessLogConvert { + + ApiAccessLogConvert INSTANCE = Mappers.getMapper(ApiAccessLogConvert.class); + + ApiAccessLogRespVO convert(ApiAccessLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + ApiAccessLogDO convert(ApiAccessLogCreateReqDTO bean); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/logger/ApiErrorLogConvert.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/logger/ApiErrorLogConvert.java new file mode 100644 index 0000000..f5945cb --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/logger/ApiErrorLogConvert.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.infra.convert.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogRespVO; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * API 错误日志 Convert + * + * @author TW + */ +@Mapper +public interface ApiErrorLogConvert { + + ApiErrorLogConvert INSTANCE = Mappers.getMapper(ApiErrorLogConvert.class); + + ApiErrorLogRespVO convert(ApiErrorLogDO bean); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + ApiErrorLogDO convert(ApiErrorLogCreateReqDTO bean); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/package-info.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/package-info.java new file mode 100644 index 0000000..4e0a20d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 POJO 类的实体转换 + * + * 目前使用 MapStruct 框架 + */ +package com.jojubanking.boot.module.infra.convert; diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/redis/RedisConvert.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/redis/RedisConvert.java new file mode 100644 index 0000000..06725db --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/redis/RedisConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.infra.convert.redis; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.redis.core.RedisKeyDefine; +import com.jojubanking.boot.module.infra.controller.admin.redis.vo.RedisKeyDefineRespVO; +import com.jojubanking.boot.module.infra.controller.admin.redis.vo.RedisMonitorRespVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +@Mapper +public interface RedisConvert { + + RedisConvert INSTANCE = Mappers.getMapper(RedisConvert.class); + + default RedisMonitorRespVO build(Properties info, Long dbSize, Properties commandStats) { + RedisMonitorRespVO respVO = RedisMonitorRespVO.builder().info(info).dbSize(dbSize) + .commandStats(new ArrayList<>(commandStats.size())).build(); + commandStats.forEach((key, value) -> { + respVO.getCommandStats().add(RedisMonitorRespVO.CommandStat.builder() + .command(StrUtil.subAfter((String) key, "cmdstat_", false)) + .calls(Long.valueOf(StrUtil.subBetween((String) value, "calls=", ","))) + .usec(Long.valueOf(StrUtil.subBetween((String) value, "usec=", ","))) + .build()); + }); + return respVO; + } + + List convertList(List list); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/test/TestDemoConvert.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/test/TestDemoConvert.java new file mode 100644 index 0000000..fe03247 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/test/TestDemoConvert.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.infra.convert.test; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoRespVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.test.TestDemoDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 字典类型 Convert + * + * @author TW + */ +@Mapper +public interface TestDemoConvert { + + TestDemoConvert INSTANCE = Mappers.getMapper(TestDemoConvert.class); + + TestDemoDO convert(TestDemoCreateReqVO bean); + + TestDemoDO convert(TestDemoUpdateReqVO bean); + + TestDemoRespVO convert(TestDemoDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md new file mode 100644 index 0000000..e034650 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/codegen/CodegenColumnDO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/codegen/CodegenColumnDO.java new file mode 100644 index 0000000..fa395d6 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/codegen/CodegenColumnDO.java @@ -0,0 +1,125 @@ +package com.jojubanking.boot.module.infra.dal.dataobject.codegen; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.infra.enums.codegen.CodegenColumnHtmlTypeEnum; +import com.jojubanking.boot.module.infra.enums.codegen.CodegenColumnListConditionEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 代码生成 column 字段定义 + * + * @author TW + */ +@TableName(value = "infra_codegen_column", autoResultMap = true) +@KeySequence("infra_codegen_column_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class CodegenColumnDO extends BaseDO { + + /** + * ID 编号 + */ + @TableId + private Long id; + /** + * 表编号 + * + * 关联 {@link CodegenTableDO#getId()} + */ + private Long tableId; + + // ========== 表相关字段 ========== + + /** + * 字段名 + */ + private String columnName; + /** + * 字段类型 + */ + private String dataType; + /** + * 字段描述 + */ + private String columnComment; + /** + * 是否允许为空 + */ + private Boolean nullable; + /** + * 是否主键 + */ + private Boolean primaryKey; + /** + * 是否自增 + */ + private Boolean autoIncrement; + /** + * 排序 + */ + private Integer ordinalPosition; + + // ========== Java 相关字段 ========== + + /** + * Java 属性类型 + * + * 例如说 String、Boolean 等等 + */ + private String javaType; + /** + * Java 属性名 + */ + private String javaField; + /** + * 字典类型 + * + * 关联 DictTypeDO 的 type 属性 + */ + private String dictType; + /** + * 数据示例,主要用于生成 Swagger 注解的 example 字段 + */ + private String example; + + // ========== CRUD 相关字段 ========== + + /** + * 是否为 Create 创建操作的字段 + */ + private Boolean createOperation; + /** + * 是否为 Update 更新操作的字段 + */ + private Boolean updateOperation; + /** + * 是否为 List 查询操作的字段 + */ + private Boolean listOperation; + /** + * List 查询操作的条件类型 + * + * 枚举 {@link CodegenColumnListConditionEnum} + */ + private String listOperationCondition; + /** + * 是否为 List 查询操作的返回字段 + */ + private Boolean listOperationResult; + + // ========== UI 相关字段 ========== + + /** + * 显示类型 + * + * 枚举 {@link CodegenColumnHtmlTypeEnum} + */ + private String htmlType; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/codegen/CodegenTableDO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/codegen/CodegenTableDO.java new file mode 100644 index 0000000..d09f1d9 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/codegen/CodegenTableDO.java @@ -0,0 +1,105 @@ +package com.jojubanking.boot.module.infra.dal.dataobject.codegen; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.jojubanking.boot.module.infra.enums.codegen.CodegenSceneEnum; +import com.jojubanking.boot.module.infra.enums.codegen.CodegenTemplateTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 代码生成 table 表定义 + * + * @author TW + */ +@TableName(value = "infra_codegen_table", autoResultMap = true) +@KeySequence("infra_codegen_table_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class CodegenTableDO extends BaseDO { + + /** + * ID 编号 + */ + private Long id; + + /** + * 数据源编号 + * + * 关联 {@link DataSourceConfigDO#getId()} + */ + private Long dataSourceConfigId; + /** + * 生成场景 + * + * 枚举 {@link CodegenSceneEnum} + */ + private Integer scene; + + // ========== 表相关字段 ========== + + /** + * 表名称 + */ + private String tableName; + /** + * 表描述 + */ + private String tableComment; + /** + * 备注 + */ + private String remark; + + // ========== 类相关字段 ========== + + /** + * 模块名,即一级目录 + * + * 例如说,system、infra、tool 等等 + */ + private String moduleName; + /** + * 业务名,即二级目录 + * + * 例如说,user、permission、dict 等等 + */ + private String businessName; + /** + * 类名称(首字母大写) + * + * 例如说,SysUser、SysMenu、SysDictData 等等 + */ + private String className; + /** + * 类描述 + */ + private String classComment; + /** + * 作者 + */ + private String author; + + // ========== 生成相关字段 ========== + + /** + * 模板类型 + * + * 枚举 {@link CodegenTemplateTypeEnum} + */ + private Integer templateType; + + // ========== 菜单相关字段 ========== + + /** + * 父菜单编号 + * + * 关联 MenuDO 的 id 属性 + */ + private Long parentMenuId; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/config/ConfigDO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/config/ConfigDO.java new file mode 100644 index 0000000..14eb433 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/config/ConfigDO.java @@ -0,0 +1,64 @@ +package com.jojubanking.boot.module.infra.dal.dataobject.config; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.infra.enums.config.ConfigTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 参数配置表 + * + * @author TW + */ +@TableName("infra_config") +@KeySequence("infra_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ConfigDO extends BaseDO { + + /** + * 参数主键 + */ + @TableId + private Long id; + /** + * 参数分类 + */ + private String category; + /** + * 参数名称 + */ + private String name; + /** + * 参数键名 + * + * 支持多 DB 类型时,无法直接使用 key + @TableField("config_key") 来实现转换,原因是 "config_key" AS key 而存在报错 + */ + private String configKey; + /** + * 参数键值 + */ + private String value; + /** + * 参数类型 + * + * 枚举 {@link ConfigTypeEnum} + */ + private Integer type; + /** + * 是否可见 + * + * 不可见的参数,一般是敏感参数,前端不可获取 + */ + private Boolean visible; + /** + * 备注 + */ + private String remark; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/db/DataSourceConfigDO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/db/DataSourceConfigDO.java new file mode 100644 index 0000000..a1e1019 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/db/DataSourceConfigDO.java @@ -0,0 +1,50 @@ +package com.jojubanking.boot.module.infra.dal.dataobject.db; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.mybatis.core.type.EncryptTypeHandler; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 数据源配置 + * + * @author TW + */ +@TableName(value = "infra_data_source_config", autoResultMap = true) +@KeySequence("infra_data_source_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@Accessors(chain = true) +public class DataSourceConfigDO extends BaseDO { + + /** + * 主键编号 - Master 数据源 + */ + public static final Long ID_MASTER = 0L; + + /** + * 主键编号 + */ + private Long id; + /** + * 连接名 + */ + private String name; + + /** + * 数据源连接 + */ + private String url; + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + @TableField(typeHandler = EncryptTypeHandler.class) + private String password; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/file/FileConfigDO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/file/FileConfigDO.java new file mode 100644 index 0000000..0633dbf --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/file/FileConfigDO.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.module.infra.dal.dataobject.file; + +import com.jojubanking.boot.framework.file.core.client.FileClientConfig; +import com.jojubanking.boot.framework.file.core.enums.FileStorageEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; +import lombok.experimental.Accessors; + +/** + * 文件配置表 + * + * @author TW + */ +@TableName(value = "infra_file_config", autoResultMap = true) +@KeySequence("infra_file_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class FileConfigDO extends BaseDO { + + /** + * 配置编号,数据库自增 + */ + private Long id; + /** + * 配置名 + */ + private String name; + /** + * 存储器 + * + * 枚举 {@link FileStorageEnum} + */ + private Integer storage; + /** + * 备注 + */ + private String remark; + /** + * 是否为主配置 + * + * 由于我们可以配置多个文件配置,默认情况下,使用主配置进行文件的上传 + */ + private Boolean master; + + /** + * 支付渠道配置 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private FileClientConfig config; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/file/FileContentDO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/file/FileContentDO.java new file mode 100644 index 0000000..a5905a8 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/file/FileContentDO.java @@ -0,0 +1,49 @@ +package com.jojubanking.boot.module.infra.dal.dataobject.file; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import lombok.experimental.Accessors; + +/** + * 文件内容表 + * + * 专门用于存储 {@link com.jojubanking.boot.framework.file.core.client.db.DBFileClient} 的文件内容 + * + * @author TW + */ +@TableName("infra_file_content") +@KeySequence("infra_file_content_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class FileContentDO extends BaseDO { + + /** + * 编号,数据库自增 + */ + @TableId(type = IdType.INPUT) + private String id; + /** + * 配置编号 + * + * 关联 {@link FileConfigDO#getId()} + */ + private Long configId; + /** + * 路径,即文件名 + */ + private String path; + /** + * 文件内容 + */ + private byte[] content; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/file/FileDO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/file/FileDO.java new file mode 100644 index 0000000..bbd05d3 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/file/FileDO.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.module.infra.dal.dataobject.file; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import lombok.experimental.Accessors; + +/** + * 文件表 + * 每次文件上传,都会记录一条记录到该表中 + * + * @author TW + */ +@TableName("infra_file") +@KeySequence("infra_file_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class FileDO extends BaseDO { + + /** + * 编号,数据库自增 + */ + private Long id; + /** + * 配置编号 + * + * 关联 {@link FileConfigDO#getId()} + */ + private Long configId; + /** + * 原文件名 + */ + private String name; + /** + * 路径,即文件名 + */ + private String path; + /** + * 访问地址 + */ + private String url; + /** + * 文件的 MIME 类型,例如 "application/octet-stream" + */ + private String type; + /** + * 文件大小 + */ + private Integer size; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/job/JobDO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/job/JobDO.java new file mode 100644 index 0000000..530c921 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/job/JobDO.java @@ -0,0 +1,74 @@ +package com.jojubanking.boot.module.infra.dal.dataobject.job; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.infra.enums.job.JobStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 定时任务 DO + * + * @author TW + */ +@TableName("infra_job") +@KeySequence("infra_job_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class JobDO extends BaseDO { + + /** + * 任务编号 + */ + @TableId + private Long id; + /** + * 任务名称 + */ + private String name; + /** + * 任务状态 + * + * 枚举 {@link JobStatusEnum} + */ + private Integer status; + /** + * 处理器的名字 + */ + private String handlerName; + /** + * 处理器的参数 + */ + private String handlerParam; + /** + * CRON 表达式 + */ + private String cronExpression; + + // ========== 重试相关字段 ========== + /** + * 重试次数 + * 如果不重试,则设置为 0 + */ + private Integer retryCount; + /** + * 重试间隔,单位:毫秒 + * 如果没有间隔,则设置为 0 + */ + private Integer retryInterval; + + // ========== 监控相关字段 ========== + /** + * 监控超时时间,单位:毫秒 + * 为空时,表示不监控 + * + * 注意,这里的超时的目的,不是进行任务的取消,而是告警任务的执行时间过长 + */ + private Integer monitorTimeout; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/job/JobLogDO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/job/JobLogDO.java new file mode 100644 index 0000000..5175d52 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/job/JobLogDO.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.infra.dal.dataobject.job; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.quartz.core.handler.JobHandler; +import com.jojubanking.boot.module.infra.enums.job.JobLogStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Date; + +/** + * 定时任务的执行日志 + * + * @author TW + */ +@TableName("infra_job_log") +@KeySequence("infra_job_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class JobLogDO extends BaseDO { + + /** + * 日志编号 + */ + private Long id; + /** + * 任务编号 + * + * 关联 {@link JobDO#getId()} + */ + private Long jobId; + /** + * 处理器的名字 + * + * 冗余字段 {@link JobDO#getHandlerName()} + */ + private String handlerName; + /** + * 处理器的参数 + * + * 冗余字段 {@link JobDO#getHandlerParam()} + */ + private String handlerParam; + /** + * 第几次执行 + * + * 用于区分是不是重试执行。如果是重试执行,则 index 大于 1 + */ + private Integer executeIndex; + + /** + * 开始执行时间 + */ + private Date beginTime; + /** + * 结束执行时间 + */ + private Date endTime; + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + /** + * 状态 + * + * 枚举 {@link JobLogStatusEnum} + */ + private Integer status; + /** + * 结果数据 + * + * 成功时,使用 {@link JobHandler#execute(String)} 的结果 + * 失败时,使用 {@link JobHandler#execute(String)} 的异常堆栈 + */ + private String result; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiAccessLogDO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiAccessLogDO.java new file mode 100644 index 0000000..6afcbfa --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiAccessLogDO.java @@ -0,0 +1,109 @@ +package com.jojubanking.boot.module.infra.dal.dataobject.logger; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Date; + +/** + * API 访问日志 + * + * @author TW + */ +@TableName("infra_api_access_log") +@KeySequence(value = "infra_api_access_log_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ApiAccessLogDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 应用名 + * + * 目前读取 `spring.application.name` 配置项 + */ + private String applicationName; + + // ========== 请求相关字段 ========== + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 访问地址 + */ + private String requestUrl; + /** + * 请求参数 + * + * query: Query String + * body: Quest Body + */ + private String requestParams; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + + // ========== 执行相关字段 ========== + + /** + * 开始请求时间 + */ + private Date beginTime; + /** + * 结束请求时间 + */ + private Date endTime; + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + /** + * 结果码 + * + * 目前使用的 {@link CommonResult#getCode()} 属性 + */ + private Integer resultCode; + /** + * 结果提示 + * + * 目前使用的 {@link CommonResult#getMsg()} 属性 + */ + private String resultMsg; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiErrorLogDO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiErrorLogDO.java new file mode 100644 index 0000000..8005631 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiErrorLogDO.java @@ -0,0 +1,156 @@ +package com.jojubanking.boot.module.infra.dal.dataobject.logger; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Date; + +/** + * API 异常数据 + * + * @author TW + */ +@TableName("infra_api_error_log") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@KeySequence(value = "infra_api_error_log_seq") +public class ApiErrorLogDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 用户编号 + */ + private Long userId; + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 应用名 + * + * 目前读取 spring.application.name + */ + private String applicationName; + + // ========== 请求相关字段 ========== + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 访问地址 + */ + private String requestUrl; + /** + * 请求参数 + * + * query: Query String + * body: Quest Body + */ + private String requestParams; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + + // ========== 异常相关字段 ========== + + /** + * 异常发生时间 + */ + private Date exceptionTime; + /** + * 异常名 + * + * {@link Throwable#getClass()} 的类全名 + */ + private String exceptionName; + /** + * 异常导致的消息 + * + * {@link cn.hutool.core.exceptions.ExceptionUtil#getMessage(Throwable)} + */ + private String exceptionMessage; + /** + * 异常导致的根消息 + * + * {@link cn.hutool.core.exceptions.ExceptionUtil#getRootCauseMessage(Throwable)} + */ + private String exceptionRootCauseMessage; + /** + * 异常的栈轨迹 + * + * {@link org.apache.commons.lang3.exception.ExceptionUtils#getStackTrace(Throwable)} + */ + private String exceptionStackTrace; + /** + * 异常发生的类全名 + * + * {@link StackTraceElement#getClassName()} + */ + private String exceptionClassName; + /** + * 异常发生的类文件 + * + * {@link StackTraceElement#getFileName()} + */ + private String exceptionFileName; + /** + * 异常发生的方法名 + * + * {@link StackTraceElement#getMethodName()} + */ + private String exceptionMethodName; + /** + * 异常发生的方法所在行 + * + * {@link StackTraceElement#getLineNumber()} + */ + private Integer exceptionLineNumber; + + // ========== 处理相关字段 ========== + + /** + * 处理状态 + * + * 枚举 {@link ApiErrorLogProcessStatusEnum} + */ + private Integer processStatus; + /** + * 处理时间 + */ + private Date processTime; + /** + * 处理用户编号 + * + * 关联 com.jojubanking.boot.adminserver.modules.system.dal.dataobject.user.SysUserDO.SysUserDO#getId() + */ + private Long processUserId; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/test/TestDemoDO.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/test/TestDemoDO.java new file mode 100644 index 0000000..137cd09 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/dataobject/test/TestDemoDO.java @@ -0,0 +1,50 @@ +package com.jojubanking.boot.module.infra.dal.dataobject.test; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 字典类型 DO + * + * @author TW + */ +@TableName("infra_test_demo") +@KeySequence("infra_test_demo_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TestDemoDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 名字 + */ + private String name; + /** + * 状态 + */ + private Integer status; + /** + * 类型 + */ + private Integer type; + /** + * 分类 + */ + private Integer category; + /** + * 备注 + */ + private String remark; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/codegen/CodegenColumnMapper.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/codegen/CodegenColumnMapper.java new file mode 100644 index 0000000..7d16650 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/codegen/CodegenColumnMapper.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.infra.dal.mysql.codegen; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface CodegenColumnMapper extends BaseMapperX { + + default List selectListByTableId(Long tableId) { + return selectList(new LambdaQueryWrapperX() + .eq(CodegenColumnDO::getTableId, tableId) + .orderByAsc(CodegenColumnDO::getId)); + } + + default void deleteListByTableId(Long tableId) { + delete(new LambdaQueryWrapperX() + .eq(CodegenColumnDO::getTableId, tableId)); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/codegen/CodegenTableMapper.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/codegen/CodegenTableMapper.java new file mode 100644 index 0000000..5c5cb8f --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/codegen/CodegenTableMapper.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.infra.dal.mysql.codegen; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenTableDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface CodegenTableMapper extends BaseMapperX { + + default CodegenTableDO selectByTableNameAndDataSourceConfigId(String tableName, Long dataSourceConfigId) { + return selectOne(CodegenTableDO::getTableName, tableName, + CodegenTableDO::getDataSourceConfigId, dataSourceConfigId); + } + + default PageResult selectPage(CodegenTablePageReqVO pageReqVO) { + return selectPage(pageReqVO, new LambdaQueryWrapperX() + .likeIfPresent(CodegenTableDO::getTableName, pageReqVO.getTableName()) + .likeIfPresent(CodegenTableDO::getTableComment, pageReqVO.getTableComment()) + .betweenIfPresent(CodegenTableDO::getCreateTime, pageReqVO.getCreateTime())); + } + + default List selectListByDataSourceConfigId(Long dataSourceConfigId) { + return selectList(CodegenTableDO::getDataSourceConfigId, dataSourceConfigId); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/config/ConfigMapper.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/config/ConfigMapper.java new file mode 100644 index 0000000..e2e02ab --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/config/ConfigMapper.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.infra.dal.mysql.config; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.config.ConfigDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ConfigMapper extends BaseMapperX { + + default ConfigDO selectByKey(String key) { + return selectOne(ConfigDO::getConfigKey, key); + } + + default PageResult selectPage(ConfigPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(ConfigDO::getName, reqVO.getName()) + .likeIfPresent(ConfigDO::getConfigKey, reqVO.getKey()) + .eqIfPresent(ConfigDO::getType, reqVO.getType()) + .betweenIfPresent(ConfigDO::getCreateTime, reqVO.getCreateTime())); + } + + default List selectList(ConfigExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(ConfigDO::getName, reqVO.getName()) + .likeIfPresent(ConfigDO::getConfigKey, reqVO.getKey()) + .eqIfPresent(ConfigDO::getType, reqVO.getType()) + .betweenIfPresent(ConfigDO::getCreateTime, reqVO.getCreateTime())); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/db/DataSourceConfigMapper.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/db/DataSourceConfigMapper.java new file mode 100644 index 0000000..2ca8915 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/db/DataSourceConfigMapper.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.infra.dal.mysql.db; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.infra.dal.dataobject.db.DataSourceConfigDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 数据源配置 Mapper + * + * @author TW + */ +@Mapper +public interface DataSourceConfigMapper extends BaseMapperX { +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/file/FileConfigMapper.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/file/FileConfigMapper.java new file mode 100644 index 0000000..186c718 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/file/FileConfigMapper.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.infra.dal.mysql.file; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileConfigDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; + +/** + * 文件配置 Mapper + * + * @author TW + */ +@Mapper +public interface FileConfigMapper extends BaseMapperX { + + default PageResult selectPage(FileConfigPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(FileConfigDO::getName, reqVO.getName()) + .eqIfPresent(FileConfigDO::getStorage, reqVO.getStorage()) + .betweenIfPresent(FileConfigDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(FileConfigDO::getId)); + } + + @Select("SELECT COUNT(*) FROM infra_file_config WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/file/FileContentDAOImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/file/FileContentDAOImpl.java new file mode 100644 index 0000000..ae89726 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/file/FileContentDAOImpl.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.infra.dal.mysql.file; + +import com.jojubanking.boot.framework.file.core.client.db.DBFileContentFrameworkDAO; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileContentDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; + +@Repository +public class FileContentDAOImpl implements DBFileContentFrameworkDAO { + + @Resource + private FileContentMapper fileContentMapper; + + @Override + public void insert(Long configId, String path, byte[] content) { + FileContentDO entity = new FileContentDO().setConfigId(configId) + .setPath(path).setContent(content); + fileContentMapper.insert(entity); + } + + @Override + public void delete(Long configId, String path) { + fileContentMapper.delete(buildQuery(configId, path)); + } + + @Override + public byte[] selectContent(Long configId, String path) { + FileContentDO fileContentDO = fileContentMapper.selectOne( + buildQuery(configId, path).select(FileContentDO::getContent)); + return fileContentDO != null ? fileContentDO.getContent() : null; + } + + private LambdaQueryWrapper buildQuery(Long configId, String path) { + return new LambdaQueryWrapper() + .eq(FileContentDO::getConfigId, configId) + .eq(FileContentDO::getPath, path); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/file/FileContentMapper.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/file/FileContentMapper.java new file mode 100644 index 0000000..6ccd711 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/file/FileContentMapper.java @@ -0,0 +1,9 @@ +package com.jojubanking.boot.module.infra.dal.mysql.file; + +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileContentDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FileContentMapper extends BaseMapper { +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/file/FileMapper.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/file/FileMapper.java new file mode 100644 index 0000000..e5e0f0c --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/file/FileMapper.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.infra.dal.mysql.file; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.file.FilePageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 文件操作 Mapper + * + * @author TW + */ +@Mapper +public interface FileMapper extends BaseMapperX { + + default PageResult selectPage(FilePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(FileDO::getPath, reqVO.getPath()) + .likeIfPresent(FileDO::getType, reqVO.getType()) + .betweenIfPresent(FileDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(FileDO::getId)); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/job/JobLogMapper.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/job/JobLogMapper.java new file mode 100644 index 0000000..60b7393 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/job/JobLogMapper.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.module.infra.dal.mysql.job; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.QueryWrapperX; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 任务日志 Mapper + * + * @author TW + */ +@Mapper +public interface JobLogMapper extends BaseMapperX { + + default PageResult selectPage(JobLogPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .eqIfPresent("job_id", reqVO.getJobId()) + .likeIfPresent("handler_name", reqVO.getHandlerName()) + .geIfPresent("begin_time", reqVO.getBeginTime()) + .leIfPresent("end_time", reqVO.getEndTime()) + .eqIfPresent("status", reqVO.getStatus()) + .orderByDesc("id") // ID 倒序 + ); + } + + default List selectList(JobLogExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .eqIfPresent("job_id", reqVO.getJobId()) + .likeIfPresent("handler_name", reqVO.getHandlerName()) + .geIfPresent("begin_time", reqVO.getBeginTime()) + .leIfPresent("end_time", reqVO.getEndTime()) + .eqIfPresent("status", reqVO.getStatus()) + .orderByDesc("id") // ID 倒序 + ); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/job/JobMapper.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/job/JobMapper.java new file mode 100644 index 0000000..94f2525 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/job/JobMapper.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.infra.dal.mysql.job; + +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 定时任务 Mapper + * + * @author TW + */ +@Mapper +public interface JobMapper extends BaseMapperX { + + default JobDO selectByHandlerName(String handlerName) { + return selectOne(JobDO::getHandlerName, handlerName); + } + + default PageResult selectPage(JobPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(JobDO::getName, reqVO.getName()) + .eqIfPresent(JobDO::getStatus, reqVO.getStatus()) + .likeIfPresent(JobDO::getHandlerName, reqVO.getHandlerName()) + ); + } + + default List selectList(JobExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(JobDO::getName, reqVO.getName()) + .eqIfPresent(JobDO::getStatus, reqVO.getStatus()) + .likeIfPresent(JobDO::getHandlerName, reqVO.getHandlerName()) + ); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/logger/ApiAccessLogMapper.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/logger/ApiAccessLogMapper.java new file mode 100644 index 0000000..22e4be3 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/logger/ApiAccessLogMapper.java @@ -0,0 +1,47 @@ +package com.jojubanking.boot.module.infra.dal.mysql.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * API 访问日志 Mapper + * + * @author TW + */ +@Mapper +public interface ApiAccessLogMapper extends BaseMapperX { + + default PageResult selectPage(ApiAccessLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ApiAccessLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(ApiAccessLogDO::getUserType, reqVO.getUserType()) + .eqIfPresent(ApiAccessLogDO::getApplicationName, reqVO.getApplicationName()) + .likeIfPresent(ApiAccessLogDO::getRequestUrl, reqVO.getRequestUrl()) + .betweenIfPresent(ApiAccessLogDO::getBeginTime, reqVO.getBeginTime()) + .geIfPresent(ApiAccessLogDO::getDuration, reqVO.getDuration()) + .eqIfPresent(ApiAccessLogDO::getResultCode, reqVO.getResultCode()) + .orderByDesc(ApiAccessLogDO::getId) + ); + } + + default List selectList(ApiAccessLogExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ApiAccessLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(ApiAccessLogDO::getUserType, reqVO.getUserType()) + .eqIfPresent(ApiAccessLogDO::getApplicationName, reqVO.getApplicationName()) + .likeIfPresent(ApiAccessLogDO::getRequestUrl, reqVO.getRequestUrl()) + .betweenIfPresent(ApiAccessLogDO::getBeginTime, reqVO.getBeginTime()) + .geIfPresent(ApiAccessLogDO::getDuration, reqVO.getDuration()) + .eqIfPresent(ApiAccessLogDO::getResultCode, reqVO.getResultCode()) + .orderByDesc(ApiAccessLogDO::getId) + ); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/logger/ApiErrorLogMapper.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/logger/ApiErrorLogMapper.java new file mode 100644 index 0000000..54b6b75 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/logger/ApiErrorLogMapper.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.infra.dal.mysql.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * API 错误日志 Mapper + * + * @author TW + */ +@Mapper +public interface ApiErrorLogMapper extends BaseMapperX { + + default PageResult selectPage(ApiErrorLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ApiErrorLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(ApiErrorLogDO::getUserType, reqVO.getUserType()) + .eqIfPresent(ApiErrorLogDO::getApplicationName, reqVO.getApplicationName()) + .likeIfPresent(ApiErrorLogDO::getRequestUrl, reqVO.getRequestUrl()) + .betweenIfPresent(ApiErrorLogDO::getExceptionTime, reqVO.getExceptionTime()) + .eqIfPresent(ApiErrorLogDO::getProcessStatus, reqVO.getProcessStatus()) + .orderByDesc(ApiErrorLogDO::getId) + ); + } + + default List selectList(ApiErrorLogExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ApiErrorLogDO::getUserId, reqVO.getUserId()) + .eqIfPresent(ApiErrorLogDO::getUserType, reqVO.getUserType()) + .eqIfPresent(ApiErrorLogDO::getApplicationName, reqVO.getApplicationName()) + .likeIfPresent(ApiErrorLogDO::getRequestUrl, reqVO.getRequestUrl()) + .betweenIfPresent(ApiErrorLogDO::getExceptionTime, reqVO.getExceptionTime()) + .eqIfPresent(ApiErrorLogDO::getProcessStatus, reqVO.getProcessStatus()) + .orderByDesc(ApiErrorLogDO::getId) + ); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/test/TestDemoMapper.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/test/TestDemoMapper.java new file mode 100644 index 0000000..6c9dc4d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/dal/mysql/test/TestDemoMapper.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.infra.dal.mysql.test; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.test.TestDemoDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 字典类型 Mapper + * + * @author TW + */ +@Mapper +public interface TestDemoMapper extends BaseMapperX { + + default PageResult selectPage(TestDemoPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(TestDemoDO::getName, reqVO.getName()) + .eqIfPresent(TestDemoDO::getStatus, reqVO.getStatus()) + .eqIfPresent(TestDemoDO::getType, reqVO.getType()) + .eqIfPresent(TestDemoDO::getCategory, reqVO.getCategory()) + .eqIfPresent(TestDemoDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(TestDemoDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TestDemoDO::getId)); + } + + default List selectList(TestDemoExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(TestDemoDO::getName, reqVO.getName()) + .eqIfPresent(TestDemoDO::getStatus, reqVO.getStatus()) + .eqIfPresent(TestDemoDO::getType, reqVO.getType()) + .eqIfPresent(TestDemoDO::getCategory, reqVO.getCategory()) + .eqIfPresent(TestDemoDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(TestDemoDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TestDemoDO::getId)); + } + + List selectList2(); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java new file mode 100644 index 0000000..7b7da6b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成器的字段 HTML 展示枚举 + */ +@AllArgsConstructor +@Getter +public enum CodegenColumnHtmlTypeEnum { + + INPUT("input"), // 文本框 + TEXTAREA("textarea"), // 文本域 + SELECT("select"), // 下拉框 + RADIO("radio"), // 单选框 + CHECKBOX("checkbox"), // 复选框 + DATETIME("datetime"), // 日期控件 + UPLOAD_IMAGE("upload_image"), // 上传图片 + UPLOAD_FILE("upload_file"), // 上传文件 + EDITOR("editor"), // 富文本控件 + ; + + /** + * 条件 + */ + private final String type; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/codegen/CodegenColumnListConditionEnum.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/codegen/CodegenColumnListConditionEnum.java new file mode 100644 index 0000000..98c26e1 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/codegen/CodegenColumnListConditionEnum.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成器的字段过滤条件枚举 + */ +@AllArgsConstructor +@Getter +public enum CodegenColumnListConditionEnum { + + EQ("="), + NE("!="), + GT(">"), + GTE(">="), + LT("<"), + LTE("<="), + LIKE("LIKE"), + BETWEEN("BETWEEN"); + + /** + * 条件 + */ + private final String condition; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/codegen/CodegenSceneEnum.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/codegen/CodegenSceneEnum.java new file mode 100644 index 0000000..df56d5c --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/codegen/CodegenSceneEnum.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import static cn.hutool.core.util.ArrayUtil.*; + +/** + * 代码生成的场景枚举 + * + * @author TW + */ +@AllArgsConstructor +@Getter +public enum CodegenSceneEnum { + + ADMIN(1, "管理后台", "admin", ""), + APP(2, "用户 APP", "app", "App"); + + /** + * 场景 + */ + private final Integer scene; + /** + * 场景名 + */ + private final String name; + /** + * 基础包名 + */ + private final String basePackage; + /** + * Controller 和 VO 类的前缀 + */ + private final String prefixClass; + + public static CodegenSceneEnum valueOf(Integer scene) { + return firstMatch(sceneEnum -> sceneEnum.getScene().equals(scene), values()); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/codegen/CodegenTemplateTypeEnum.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/codegen/CodegenTemplateTypeEnum.java new file mode 100644 index 0000000..3d66b72 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/codegen/CodegenTemplateTypeEnum.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.infra.enums.codegen; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 代码生成模板类型 + * + * @author TW + */ +@AllArgsConstructor +@Getter +public enum CodegenTemplateTypeEnum { + + CRUD(1), // 单表(增删改查) + TREE(2), // 树表(增删改查) + ; + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/config/ConfigTypeEnum.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/config/ConfigTypeEnum.java new file mode 100644 index 0000000..73c0a02 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/config/ConfigTypeEnum.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.infra.enums.config; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ConfigTypeEnum { + + /** + * 系统配置 + */ + SYSTEM(1), + /** + * 自定义配置 + */ + CUSTOM(2); + + private final Integer type; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/job/JobLogStatusEnum.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/job/JobLogStatusEnum.java new file mode 100644 index 0000000..5c65ba3 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/job/JobLogStatusEnum.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.infra.enums.job; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 任务日志的状态枚举 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum JobLogStatusEnum { + + RUNNING(0), // 运行中 + SUCCESS(1), // 成功 + FAILURE(2); // 失败 + + /** + * 状态 + */ + private final Integer status; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/job/JobStatusEnum.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/job/JobStatusEnum.java new file mode 100644 index 0000000..21d2558 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/job/JobStatusEnum.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.infra.enums.job; + +import com.google.common.collect.Sets; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.quartz.impl.jdbcjobstore.Constants; + +import java.util.Collections; +import java.util.Set; + +/** + * 任务状态的枚举 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum JobStatusEnum { + + /** + * 初始化中 + */ + INIT(0, Collections.emptySet()), + /** + * 开启 + */ + NORMAL(1, Sets.newHashSet(Constants.STATE_WAITING, Constants.STATE_ACQUIRED, Constants.STATE_BLOCKED)), + /** + * 暂停 + */ + STOP(2, Sets.newHashSet(Constants.STATE_PAUSED, Constants.STATE_PAUSED_BLOCKED)); + + /** + * 状态 + */ + private final Integer status; + /** + * 对应的 Quartz 触发器的状态集合 + */ + private final Set quartzStates; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java new file mode 100644 index 0000000..8a70a1e --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.infra.enums.logger; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * API 异常数据的处理状态 + * + * @author TW + */ +@AllArgsConstructor +@Getter +public enum ApiErrorLogProcessStatusEnum { + + INIT(0, "未处理"), + DONE(1, "已处理"), + IGNORE(2, "已忽略"); + + /** + * 状态 + */ + private final Integer status; + /** + * 资源类型名 + */ + private final String name; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/package-info.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/package-info.java new file mode 100644 index 0000000..9cb3715 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/enums/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.jojubanking.boot.module.infra.enums; diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/codegen/config/CodegenConfiguration.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/codegen/config/CodegenConfiguration.java new file mode 100644 index 0000000..e2f9759 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/codegen/config/CodegenConfiguration.java @@ -0,0 +1,9 @@ +package com.jojubanking.boot.module.infra.framework.codegen.config; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(CodegenProperties.class) +public class CodegenConfiguration { +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/codegen/config/CodegenProperties.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/codegen/config/CodegenProperties.java new file mode 100644 index 0000000..c8fdeef --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/codegen/config/CodegenProperties.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.infra.framework.codegen.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Collection; + +@ConfigurationProperties(prefix = "joju.codegen") +@Validated +@Data +public class CodegenProperties { + + /** + * 生成的 Java 代码的基础包 + */ + @NotNull(message = "Java 代码的基础包不能为空") + private String basePackage; + + /** + * 数据库名数组 + */ + @NotEmpty(message = "数据库不能为空") + private Collection dbSchemas; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/codegen/package-info.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/codegen/package-info.java new file mode 100644 index 0000000..9249c1a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/codegen/package-info.java @@ -0,0 +1,4 @@ +/** + * 代码生成器 + */ +package com.jojubanking.boot.module.infra.framework.codegen; diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/package-info.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/package-info.java new file mode 100644 index 0000000..b7d8a12 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 infra 模块的 framework 封装 + * + * @author TW + */ +package com.jojubanking.boot.module.infra.framework; diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/security/config/SecurityConfiguration.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/security/config/SecurityConfiguration.java new file mode 100644 index 0000000..584f214 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/security/config/SecurityConfiguration.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.infra.framework.security.config; + +import com.jojubanking.boot.framework.security.config.AuthorizeRequestsCustomizer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; + +/** + * Infra 模块的 Security 配置 + */ +@Configuration("infraSecurityConfiguration") +public class SecurityConfiguration { + + @Value("${spring.boot.admin.context-path:''}") + private String adminSeverContextPath; + + @Bean("infraAuthorizeRequestsCustomizer") + public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() { + return new AuthorizeRequestsCustomizer() { + + @Override + public void customize(ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry) { + // Swagger 接口文档 + registry.antMatchers("/swagger-ui.html").anonymous() + .antMatchers("/swagger-resources/**").anonymous() + .antMatchers("/webjars/**").anonymous() + .antMatchers("/*/api-docs").anonymous(); + //积木报表 + registry.antMatchers("/jmreport/**").permitAll(); + // Spring Boot Actuator 的安全配置 + registry.antMatchers("/actuator").anonymous() + .antMatchers("/actuator/**").anonymous(); + // Druid 监控 + registry.antMatchers("/druid/**").anonymous(); + // Spring Boot Admin Server 的安全配置 + registry.antMatchers(adminSeverContextPath).anonymous() + .antMatchers(adminSeverContextPath + "/**").anonymous(); + } + + }; + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/security/core/package-info.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/security/core/package-info.java new file mode 100644 index 0000000..a3afe19 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/framework/security/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.jojubanking.boot.module.infra.framework.security.core; diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/consumer/file/FileConfigRefreshConsumer.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/consumer/file/FileConfigRefreshConsumer.java new file mode 100644 index 0000000..18aa251 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/consumer/file/FileConfigRefreshConsumer.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.infra.mq.consumer.file; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.jojubanking.boot.module.infra.mq.message.file.FileConfigRefreshMessage; +import com.jojubanking.boot.module.infra.service.file.FileConfigService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link FileConfigRefreshMessage} 的消费者 + * + * @author TW + */ +@Component +@Slf4j +public class FileConfigRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private FileConfigService fileConfigService; + + @Override + public void onMessage(FileConfigRefreshMessage message) { + log.info("[onMessage][收到 FileConfig 刷新消息]"); + fileConfigService.initFileClients(); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/message/config/ConfigRefreshMessage.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/message/config/ConfigRefreshMessage.java new file mode 100644 index 0000000..af5013a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/message/config/ConfigRefreshMessage.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.infra.mq.message.config; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import lombok.Data; + +/** + * 配置数据刷新 Message + */ +@Data +public class ConfigRefreshMessage extends AbstractChannelMessage { + + @Override + public String getChannel() { + return "infra.config.refresh"; + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/message/file/FileConfigRefreshMessage.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/message/file/FileConfigRefreshMessage.java new file mode 100644 index 0000000..9b97d52 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/message/file/FileConfigRefreshMessage.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.infra.mq.message.file; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import lombok.Data; + +/** + * 文件配置数据刷新 Message + */ +@Data +public class FileConfigRefreshMessage extends AbstractChannelMessage { + + @Override + public String getChannel() { + return "infra.file-config.refresh"; + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/producer/config/ConfigProducer.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/producer/config/ConfigProducer.java new file mode 100644 index 0000000..96a89ab --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/producer/config/ConfigProducer.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.infra.mq.producer.config; + +import com.jojubanking.boot.module.infra.mq.message.config.ConfigRefreshMessage; +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Config 配置相关消息的 Producer + */ +@Component +public class ConfigProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送 {@link ConfigRefreshMessage} 消息 + */ + public void sendConfigRefreshMessage() { + ConfigRefreshMessage message = new ConfigRefreshMessage(); + redisMQTemplate.send(message); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/producer/file/FileConfigProducer.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/producer/file/FileConfigProducer.java new file mode 100644 index 0000000..1246bb8 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/mq/producer/file/FileConfigProducer.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.infra.mq.producer.file; + +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import com.jojubanking.boot.module.infra.mq.message.file.FileConfigRefreshMessage; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 文件配置相关消息的 Producer + */ +@Component +public class FileConfigProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送 {@link FileConfigRefreshMessage} 消息 + */ + public void sendFileConfigRefreshMessage() { + FileConfigRefreshMessage message = new FileConfigRefreshMessage(); + redisMQTemplate.send(message); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/package-info.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/package-info.java new file mode 100644 index 0000000..90f47db --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/package-info.java @@ -0,0 +1,9 @@ +/** + * infra 模块,主要提供两块能力: + * 1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等 + * 2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等 + * + * 1. Controller URL:以 /infra/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 infra_ 开头,方便在数据库中区分 + */ +package com.jojubanking.boot.module.infra; diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/codegen/CodegenService.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/codegen/CodegenService.java new file mode 100644 index 0000000..840a84d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/codegen/CodegenService.java @@ -0,0 +1,94 @@ +package com.jojubanking.boot.module.infra.service.codegen; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenTableDO; + +import java.util.List; +import java.util.Map; + +/** + * 代码生成 Service 接口 + * + * @author TW + */ +public interface CodegenService { + + /** + * 基于数据库的表结构,创建代码生成器的表定义 + * + * @param userId 用户编号 + * @param reqVO 表信息 + * @return 创建的表定义的编号数组 + */ + List createCodegenList(Long userId, CodegenCreateListReqVO reqVO); + + /** + * 更新数据库的表和字段定义 + * + * @param updateReqVO 更新信息 + */ + void updateCodegen(CodegenUpdateReqVO updateReqVO); + + /** + * 基于数据库的表结构,同步数据库的表和字段定义 + * + * @param tableId 表编号 + */ + void syncCodegenFromDB(Long tableId); + + /** + * 删除数据库的表和字段定义 + * + * @param tableId 数据编号 + */ + void deleteCodegen(Long tableId); + + /** + * 获得表定义分页 + * + * @param pageReqVO 分页条件 + * @return 表定义分页 + */ + PageResult getCodegenTablePage(CodegenTablePageReqVO pageReqVO); + + /** + * 获得表定义 + * + * @param id 表编号 + * @return 表定义 + */ + CodegenTableDO getCodegenTablePage(Long id); + + /** + * 获得指定表的字段定义数组 + * + * @param tableId 表编号 + * @return 字段定义数组 + */ + List getCodegenColumnListByTableId(Long tableId); + + /** + * 执行指定表的代码生成 + * + * @param tableId 表编号 + * @return 生成结果。key 为文件路径,value 为对应的代码内容 + */ + Map generationCodes(Long tableId); + + /** + * 获得数据库自带的表定义列表 + * + * + * @param dataSourceConfigId 数据源的配置编号 + * @param name 表名称 + * @param comment 表描述 + * @return 表定义列表 + */ + List getDatabaseTableList(Long dataSourceConfigId, String name, String comment); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/codegen/CodegenServiceImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/codegen/CodegenServiceImpl.java new file mode 100644 index 0000000..cba2571 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/codegen/CodegenServiceImpl.java @@ -0,0 +1,236 @@ +package com.jojubanking.boot.module.infra.service.codegen; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO; +import com.jojubanking.boot.module.infra.convert.codegen.CodegenConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.jojubanking.boot.module.infra.dal.mysql.codegen.CodegenColumnMapper; +import com.jojubanking.boot.module.infra.dal.mysql.codegen.CodegenTableMapper; +import com.jojubanking.boot.module.infra.enums.codegen.CodegenSceneEnum; +import com.jojubanking.boot.module.infra.service.codegen.inner.CodegenBuilder; +import com.jojubanking.boot.module.infra.service.codegen.inner.CodegenEngine; +import com.jojubanking.boot.module.infra.service.db.DatabaseTableService; +import com.jojubanking.boot.module.system.api.user.AdminUserApi; +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.*; + +/** + * 代码生成 Service 实现类 + * + * @author TW + */ +@Service +public class CodegenServiceImpl implements CodegenService { + + @Resource + private DatabaseTableService databaseTableService; + + @Resource + private CodegenTableMapper codegenTableMapper; + @Resource + private CodegenColumnMapper codegenColumnMapper; + + @Resource + private AdminUserApi userApi; + + @Resource + private CodegenBuilder codegenBuilder; + @Resource + private CodegenEngine codegenEngine; + + @Override + @Transactional(rollbackFor = Exception.class) + public List createCodegenList(Long userId, CodegenCreateListReqVO reqVO) { + List ids = new ArrayList<>(reqVO.getTableNames().size()); + // 遍历添加。虽然效率会低一点,但是没必要做成完全批量,因为不会这么大量 + reqVO.getTableNames().forEach(tableName -> ids.add(createCodegen(userId, reqVO.getDataSourceConfigId(), tableName))); + return ids; + } + + public Long createCodegen(Long userId, Long dataSourceConfigId, String tableName) { + // 从数据库中,获得数据库表结构 + TableInfo tableInfo = databaseTableService.getTable(dataSourceConfigId, tableName); + // 导入 + return createCodegen0(userId, dataSourceConfigId, tableInfo); + } + + private Long createCodegen0(Long userId, Long dataSourceConfigId, TableInfo tableInfo) { + // 校验导入的表和字段非空 + checkTableInfo(tableInfo); + // 校验是否已经存在 + if (codegenTableMapper.selectByTableNameAndDataSourceConfigId(tableInfo.getName(), + dataSourceConfigId) != null) { + throw exception(CODEGEN_TABLE_EXISTS); + } + + // 构建 CodegenTableDO 对象,插入到 DB 中 + CodegenTableDO table = codegenBuilder.buildTable(tableInfo); + table.setDataSourceConfigId(dataSourceConfigId); + table.setScene(CodegenSceneEnum.ADMIN.getScene()); // 默认配置下,使用管理后台的模板 + table.setAuthor(userApi.getUser(userId).getNickname()); + codegenTableMapper.insert(table); + + // 构建 CodegenColumnDO 数组,插入到 DB 中 + List columns = codegenBuilder.buildColumns(table.getId(), tableInfo.getFields()); + // 如果没有主键,则使用第一个字段作为主键 + if (!tableInfo.isHavePrimaryKey()) { + columns.get(0).setPrimaryKey(true); + } + codegenColumnMapper.insertBatch(columns); + return table.getId(); + } + + private void checkTableInfo(TableInfo tableInfo) { + if (tableInfo == null) { + throw exception(CODEGEN_IMPORT_TABLE_NULL); + } + if (StrUtil.isEmpty(tableInfo.getComment())) { + throw exception(CODEGEN_TABLE_INFO_TABLE_COMMENT_IS_NULL); + } + if (CollUtil.isEmpty(tableInfo.getFields())) { + throw exception(CODEGEN_IMPORT_COLUMNS_NULL); + } + tableInfo.getFields().forEach(field -> { + if (StrUtil.isEmpty(field.getComment())) { + throw exception(CODEGEN_TABLE_INFO_COLUMN_COMMENT_IS_NULL, field.getName()); + } + }); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCodegen(CodegenUpdateReqVO updateReqVO) { + // 校验是否已经存在 + if (codegenTableMapper.selectById(updateReqVO.getTable().getId()) == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + + // 更新 table 表定义 + CodegenTableDO updateTableObj = CodegenConvert.INSTANCE.convert(updateReqVO.getTable()); + codegenTableMapper.updateById(updateTableObj); + // 更新 column 字段定义 + List updateColumnObjs = CodegenConvert.INSTANCE.convertList03(updateReqVO.getColumns()); + updateColumnObjs.forEach(updateColumnObj -> codegenColumnMapper.updateById(updateColumnObj)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncCodegenFromDB(Long tableId) { + // 校验是否已经存在 + CodegenTableDO table = codegenTableMapper.selectById(tableId); + if (table == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + // 从数据库中,获得数据库表结构 + TableInfo tableInfo = databaseTableService.getTable(table.getDataSourceConfigId(), table.getTableName()); + // 执行同步 + syncCodegen0(tableId, tableInfo); + } + + private void syncCodegen0(Long tableId, TableInfo tableInfo) { + // 校验导入的表和字段非空 + checkTableInfo(tableInfo); + List tableFields = tableInfo.getFields(); + + // 构建 CodegenColumnDO 数组,只同步新增的字段 + List codegenColumns = codegenColumnMapper.selectListByTableId(tableId); + Set codegenColumnNames = CollectionUtils.convertSet(codegenColumns, CodegenColumnDO::getColumnName); + // 移除已经存在的字段 + tableFields.removeIf(column -> codegenColumnNames.contains(column.getColumnName())); + // 计算需要删除的字段 + Set tableFieldNames = CollectionUtils.convertSet(tableFields, TableField::getName); + Set deleteColumnIds = codegenColumns.stream().filter(column -> !tableFieldNames.contains(column.getColumnName())) + .map(CodegenColumnDO::getId).collect(Collectors.toSet()); + if (CollUtil.isEmpty(tableFields) && CollUtil.isEmpty(deleteColumnIds)) { + throw exception(CODEGEN_SYNC_NONE_CHANGE); + } + + // 插入新增的字段 + List columns = codegenBuilder.buildColumns(tableId, tableFields); + codegenColumnMapper.insertBatch(columns); + // 删除不存在的字段 + if (CollUtil.isNotEmpty(deleteColumnIds)) { + codegenColumnMapper.deleteBatchIds(deleteColumnIds); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCodegen(Long tableId) { + // 校验是否已经存在 + if (codegenTableMapper.selectById(tableId) == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + + // 删除 table 表定义 + codegenTableMapper.deleteById(tableId); + // 删除 column 字段定义 + codegenColumnMapper.deleteListByTableId(tableId); + } + + @Override + public PageResult getCodegenTablePage(CodegenTablePageReqVO pageReqVO) { + return codegenTableMapper.selectPage(pageReqVO); + } + + @Override + public CodegenTableDO getCodegenTablePage(Long id) { + return codegenTableMapper.selectById(id); + } + + @Override + public List getCodegenColumnListByTableId(Long tableId) { + return codegenColumnMapper.selectListByTableId(tableId); + } + + @Override + public Map generationCodes(Long tableId) { + // 校验是否已经存在 + CodegenTableDO table = codegenTableMapper.selectById(tableId); + if (table == null) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + List columns = codegenColumnMapper.selectListByTableId(tableId); + if (CollUtil.isEmpty(columns)) { + throw exception(CODEGEN_COLUMN_NOT_EXISTS); + } + + // 执行生成 + return codegenEngine.execute(table, columns); + } + + @Override + public List getDatabaseTableList(Long dataSourceConfigId, String name, String comment) { + List tables = databaseTableService.getTableList(dataSourceConfigId, name, comment); + // 移除置顶前缀的表名 // TODO 未来做成可配置 + tables.removeIf(table -> table.getName().toUpperCase().startsWith("QRTZ_")); + tables.removeIf(table -> table.getName().toUpperCase().startsWith("ACT_")); + tables.removeIf(table -> table.getName().toUpperCase().startsWith("FLW_")); + // 移除已经生成的表 + // 移除在 Codegen 中,已经存在的 + Set existsTables = CollectionUtils.convertSet( + codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId), CodegenTableDO::getTableName); + tables.removeIf(table -> existsTables.contains(table.getName())); + return CodegenConvert.INSTANCE.convertList04(tables); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/codegen/inner/CodegenBuilder.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/codegen/inner/CodegenBuilder.java new file mode 100644 index 0000000..c783e51 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/codegen/inner/CodegenBuilder.java @@ -0,0 +1,172 @@ +package com.jojubanking.boot.module.infra.service.codegen.inner; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.infra.convert.codegen.CodegenConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.jojubanking.boot.module.infra.enums.codegen.CodegenColumnHtmlTypeEnum; +import com.jojubanking.boot.module.infra.enums.codegen.CodegenColumnListConditionEnum; +import com.jojubanking.boot.module.infra.enums.codegen.CodegenTemplateTypeEnum; +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.google.common.collect.Sets; +import org.springframework.stereotype.Component; + +import java.util.*; + +import static cn.hutool.core.text.CharSequenceUtil.*; + +/** + * 代码生成器的 Builder,负责: + * 1. 将数据库的表 {@link TableInfo} 定义,构建成 {@link CodegenTableDO} + * 2. 将数据库的列 {@link TableField} 构定义,建成 {@link CodegenColumnDO} + */ +@Component +public class CodegenBuilder { + + /** + * 字段名与 {@link CodegenColumnListConditionEnum} 的默认映射 + * 注意,字段的匹配以后缀的方式 + */ + private static final Map columnListOperationConditionMappings = + MapUtil.builder() + .put("name", CodegenColumnListConditionEnum.LIKE) + .put("time", CodegenColumnListConditionEnum.BETWEEN) + .put("date", CodegenColumnListConditionEnum.BETWEEN) + .build(); + + /** + * 字段名与 {@link CodegenColumnHtmlTypeEnum} 的默认映射 + * 注意,字段的匹配以后缀的方式 + */ + private static final Map columnHtmlTypeMappings = + MapUtil.builder() + .put("status", CodegenColumnHtmlTypeEnum.RADIO) + .put("sex", CodegenColumnHtmlTypeEnum.RADIO) + .put("type", CodegenColumnHtmlTypeEnum.SELECT) + .put("image", CodegenColumnHtmlTypeEnum.UPLOAD_IMAGE) + .put("file", CodegenColumnHtmlTypeEnum.UPLOAD_FILE) + .put("content", CodegenColumnHtmlTypeEnum.EDITOR) + .put("description", CodegenColumnHtmlTypeEnum.EDITOR) + .put("demo", CodegenColumnHtmlTypeEnum.EDITOR) + .put("time", CodegenColumnHtmlTypeEnum.DATETIME) + .put("date", CodegenColumnHtmlTypeEnum.DATETIME) + .build(); + + /** + * 多租户编号的字段名 + */ + public static final String TENANT_ID_FIELD = "tenantId"; + /** + * {@link com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO} 的字段 + */ + public static final Set BASE_DO_FIELDS = new HashSet<>(); + /** + * 新增操作,不需要传递的字段 + */ + private static final Set CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); + /** + * 修改操作,不需要传递的字段 + */ + private static final Set UPDATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet(); + /** + * 列表操作的条件,不需要传递的字段 + */ + private static final Set LIST_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); + /** + * 列表操作的结果,不需要返回的字段 + */ + private static final Set LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet(); + + static { + Arrays.stream(ReflectUtil.getFields(BaseDO.class)).forEach(field -> BASE_DO_FIELDS.add(field.getName())); + BASE_DO_FIELDS.add(TENANT_ID_FIELD); + // 处理 OPERATION 相关的字段 + CREATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + UPDATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是可能需要传递的 + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); + LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是需要返回的 + } + + public CodegenTableDO buildTable(TableInfo tableInfo) { + CodegenTableDO table = CodegenConvert.INSTANCE.convert(tableInfo); + initTableDefault(table); + return table; + } + + /** + * 初始化 Table 表的默认字段 + * + * @param table 表定义 + */ + private void initTableDefault(CodegenTableDO table) { + // 以 system_dept 举例子。moduleName 为 system、businessName 为 dept、className 为 Dept + // 如果希望以 System 前缀,则可以手动在【代码生成 - 修改生成配置 - 基本信息】,将实体类名称改为 SystemDept 即可 + String tableName = table.getTableName().toLowerCase(); + // 第一步,_ 前缀的前面,作为 module 名字;第二步,moduleName 必须小写; + table.setModuleName(subBefore(tableName, '_', false).toLowerCase()); + // 第一步,第一个 _ 前缀的后面,作为 module 名字; 第二步,可能存在多个 _ 的情况,转换成驼峰; 第三步,businessName 必须小写; + table.setBusinessName(toCamelCase(subAfter(tableName, '_', false)).toLowerCase()); + // 驼峰 + 首字母大写;第一步,第一个 _ 前缀的后面,作为 class 名字;第二步,驼峰命名 + table.setClassName(upperFirst(toCamelCase(subAfter(tableName, '_', false)))); + // 去除结尾的表,作为类描述 + table.setClassComment(StrUtil.removeSuffixIgnoreCase(table.getTableComment(), "表")); + table.setTemplateType(CodegenTemplateTypeEnum.CRUD.getType()); + } + + public List buildColumns(Long tableId, List tableFields) { + List columns = CodegenConvert.INSTANCE.convertList(tableFields); + int index = 1; + for (CodegenColumnDO column : columns) { + column.setTableId(tableId); + column.setOrdinalPosition(index++); + // 初始化 Column 列的默认字段 + processColumnOperation(column); // 处理 CRUD 相关的字段的默认值 + processColumnUI(column); // 处理 UI 相关的字段的默认值 + } + return columns; + } + + private void processColumnOperation(CodegenColumnDO column) { + // 处理 createOperation 字段 + column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + && !column.getPrimaryKey()); // 对于主键,创建时无需传递 + // 处理 updateOperation 字段 + column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + || column.getPrimaryKey()); // 对于主键,更新时需要传递 + // 处理 listOperation 字段 + column.setListOperation(!LIST_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) + && !column.getPrimaryKey()); // 对于主键,列表过滤不需要传递 + // 处理 listOperationCondition 字段 + columnListOperationConditionMappings.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); + if (column.getListOperationCondition() == null) { + column.setListOperationCondition(CodegenColumnListConditionEnum.EQ.getCondition()); + } + // 处理 listOperationResult 字段 + column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); + } + + private void processColumnUI(CodegenColumnDO column) { + // 基于后缀进行匹配 + columnHtmlTypeMappings.entrySet().stream() + .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) + .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); + // 如果是 Boolean 类型时,设置为 radio 类型. + // 其它类型,因为字段名可以相对保障,所以不进行处理。例如说 date 对应 datetime 类型. + if (Boolean.class.getSimpleName().equals(column.getJavaType())) { + column.setHtmlType(CodegenColumnHtmlTypeEnum.RADIO.getType()); + } + // 兜底,设置默认为 input 类型 + if (column.getHtmlType() == null) { + column.setHtmlType(CodegenColumnHtmlTypeEnum.INPUT.getType()); + } + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/codegen/inner/CodegenEngine.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/codegen/inner/CodegenEngine.java new file mode 100644 index 0000000..3a5e05d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/codegen/inner/CodegenEngine.java @@ -0,0 +1,248 @@ +package com.jojubanking.boot.module.infra.service.codegen.inner; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.template.TemplateConfig; +import cn.hutool.extra.template.TemplateEngine; +import cn.hutool.extra.template.engine.velocity.VelocityEngine; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.jojubanking.boot.module.infra.enums.codegen.CodegenSceneEnum; +import com.jojubanking.boot.module.infra.framework.codegen.config.CodegenProperties; +import com.google.common.collect.Maps; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static cn.hutool.core.map.MapUtil.getStr; +import static cn.hutool.core.text.CharSequenceUtil.*; + +/** + * 代码生成的引擎,用于具体生成代码 + * 目前基于 {@link org.apache.velocity.app.Velocity} 模板引擎实现 + * + * 考虑到 Java 模板引擎的框架非常多,Freemarker、Velocity、Thymeleaf 等等,所以我们采用 hutool 封装的 {@link cn.hutool.extra.template.Template} 抽象 + * + * @author TW + */ +@Component +public class CodegenEngine { + + /** + * 模板配置 + * key:模板在 resources 的地址 + * value:生成的路径 + */ + private static final Map TEMPLATES = MapUtil.builder(new LinkedHashMap<>()) // 有序 + // Java module-biz Main + .put(javaTemplatePath("controller/vo/baseVO"), javaModuleImplVOFilePath("BaseVO")) + .put(javaTemplatePath("controller/vo/createReqVO"), javaModuleImplVOFilePath("CreateReqVO")) + .put(javaTemplatePath("controller/vo/pageReqVO"), javaModuleImplVOFilePath("PageReqVO")) + .put(javaTemplatePath("controller/vo/respVO"), javaModuleImplVOFilePath("RespVO")) + .put(javaTemplatePath("controller/vo/updateReqVO"), javaModuleImplVOFilePath("UpdateReqVO")) + .put(javaTemplatePath("controller/vo/exportReqVO"), javaModuleImplVOFilePath("ExportReqVO")) + .put(javaTemplatePath("controller/vo/excelVO"), javaModuleImplVOFilePath("ExcelVO")) + .put(javaTemplatePath("controller/controller"), javaModuleImplControllerFilePath()) + .put(javaTemplatePath("convert/convert"), + javaModuleImplMainFilePath("convert/${table.businessName}/${table.className}Convert")) + .put(javaTemplatePath("dal/do"), + javaModuleImplMainFilePath("dal/dataobject/${table.businessName}/${table.className}DO")) + .put(javaTemplatePath("dal/mapper"), + javaModuleImplMainFilePath("dal/mysql/${table.businessName}/${table.className}Mapper")) + .put(javaTemplatePath("dal/mapper.xml"), mapperXmlFilePath()) + .put(javaTemplatePath("service/serviceImpl"), + javaModuleImplMainFilePath("service/${table.businessName}/${table.className}ServiceImpl")) + .put(javaTemplatePath("service/service"), + javaModuleImplMainFilePath("service/${table.businessName}/${table.className}Service")) + // Java module-biz Test + .put(javaTemplatePath("test/serviceTest"), + javaModuleImplTestFilePath("service/${table.businessName}/${table.className}ServiceImplTest")) + // Java module-api Main + .put(javaTemplatePath("enums/errorcode"), javaModuleApiMainFilePath("enums/ErrorCodeConstants_手动操作")) + // Vue2 + .put(vueTemplatePath("views/index.vue"), + vueFilePath("views/${table.moduleName}/${classNameVar}/index.vue")) + .put(vueTemplatePath("api/api.js"), + vueFilePath("api/${table.moduleName}/${classNameVar}.js")) + // Vue3 + .put(vue3TemplatePath("views/index.vue"), + vue3FilePath("views/${table.moduleName}/${classNameVar}/index.vue")) + .put(vue3TemplatePath("views/data.ts"), + vue3FilePath("views/${table.moduleName}/${classNameVar}/${classNameVar}.data.ts")) + .put(vue3TemplatePath("api/api.ts"), + vue3FilePath("api/${table.moduleName}/${classNameVar}/index.ts")) + .put(vue3TemplatePath("api/types.ts"), + vue3FilePath("api/${table.moduleName}/${classNameVar}/types.ts")) + // SQL + .put("codegen/sql/sql.vm", "sql/sql.sql") + .put("codegen/sql/h2.vm", "sql/h2.sql") + .build(); + + @Resource + private CodegenProperties codegenProperties; + + /** + * 模板引擎,由 hutool 实现 + */ + private final TemplateEngine templateEngine; + /** + * 全局通用变量映射 + */ + private final Map globalBindingMap = new HashMap<>(); + + public CodegenEngine() { + // 初始化 TemplateEngine 属性 + TemplateConfig config = new TemplateConfig(); + config.setResourceMode(TemplateConfig.ResourceMode.CLASSPATH); + this.templateEngine = new VelocityEngine(config); + } + + @PostConstruct + private void initGlobalBindingMap() { + // 全局配置 + globalBindingMap.put("basePackage", codegenProperties.getBasePackage()); + globalBindingMap.put("baseFrameworkPackage", codegenProperties.getBasePackage() + + '.' + "framework"); // 用于后续获取测试类的 package 地址 + // 全局 Java Bean + globalBindingMap.put("CommonResultClassName", CommonResult.class.getName()); + globalBindingMap.put("PageResultClassName", PageResult.class.getName()); + // VO 类,独有字段 + globalBindingMap.put("PageParamClassName", PageParam.class.getName()); + globalBindingMap.put("DictFormatClassName", DictFormat.class.getName()); + // DO 类,独有字段 + globalBindingMap.put("BaseDOClassName", BaseDO.class.getName()); + globalBindingMap.put("baseDOFields", CodegenBuilder.BASE_DO_FIELDS); + globalBindingMap.put("QueryWrapperClassName", LambdaQueryWrapperX.class.getName()); + globalBindingMap.put("BaseMapperClassName", BaseMapperX.class.getName()); + // Util 工具类 + globalBindingMap.put("ServiceExceptionUtilClassName", ServiceExceptionUtil.class.getName()); + globalBindingMap.put("DateUtilsClassName", DateUtils.class.getName()); + globalBindingMap.put("ExcelUtilsClassName", ExcelUtils.class.getName()); + globalBindingMap.put("ObjectUtilsClassName", ObjectUtils.class.getName()); + globalBindingMap.put("DictConvertClassName", DictConvert.class.getName()); + globalBindingMap.put("OperateLogClassName", OperateLog.class.getName()); + globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName()); + } + + public Map execute(CodegenTableDO table, List columns) { + // 创建 bindingMap + Map bindingMap = new HashMap<>(globalBindingMap); + bindingMap.put("table", table); + bindingMap.put("columns", columns); + bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, CodegenColumnDO::getPrimaryKey)); // 主键字段 + bindingMap.put("sceneEnum", CodegenSceneEnum.valueOf(table.getScene())); + + // className 相关 + // 去掉指定前缀,将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀 + String simpleClassName = removePrefix(table.getClassName(), upperFirst(table.getModuleName())); + bindingMap.put("simpleClassName", simpleClassName); + bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type + bindingMap.put("classNameVar", lowerFirst(simpleClassName)); // 将 DictType 转换成 dictType,用于变量 + // 将 DictType 转换成 dict-type + String simpleClassNameStrikeCase = toSymbolCase(simpleClassName, '-'); + bindingMap.put("simpleClassName_strikeCase", simpleClassNameStrikeCase); + // permission 前缀 + bindingMap.put("permissionPrefix", table.getModuleName() + ":" + simpleClassNameStrikeCase); + + // 执行生成 + final Map result = Maps.newLinkedHashMapWithExpectedSize(TEMPLATES.size()); // 有序 + TEMPLATES.forEach((vmPath, filePath) -> { + filePath = formatFilePath(filePath, bindingMap); + String content = templateEngine.getTemplate(vmPath).render(bindingMap); + result.put(filePath, content); + }); + return result; + } + + private String formatFilePath(String filePath, Map bindingMap) { + filePath = StrUtil.replace(filePath, "${basePackage}", + getStr(bindingMap, "basePackage").replaceAll("\\.", "/")); + filePath = StrUtil.replace(filePath, "${classNameVar}", + getStr(bindingMap, "classNameVar")); + // sceneEnum 包含的字段 + CodegenSceneEnum sceneEnum = (CodegenSceneEnum) bindingMap.get("sceneEnum"); + filePath = StrUtil.replace(filePath, "${sceneEnum.prefixClass}", sceneEnum.getPrefixClass()); + filePath = StrUtil.replace(filePath, "${sceneEnum.basePackage}", sceneEnum.getBasePackage()); + // table 包含的字段 + CodegenTableDO table = (CodegenTableDO) bindingMap.get("table"); + filePath = StrUtil.replace(filePath, "${table.moduleName}", table.getModuleName()); + filePath = StrUtil.replace(filePath, "${table.businessName}", table.getBusinessName()); + filePath = StrUtil.replace(filePath, "${table.className}", table.getClassName()); + return filePath; + } + + private static String javaTemplatePath(String path) { + return "codegen/java/" + path + ".vm"; + } + + private static String javaModuleImplVOFilePath(String path) { + return javaModuleFilePath("controller/${sceneEnum.basePackage}/${table.businessName}/" + + "vo/${sceneEnum.prefixClass}${table.className}" + path, "biz", "main"); + } + + private static String javaModuleImplControllerFilePath() { + return javaModuleFilePath("controller/${sceneEnum.basePackage}/${table.businessName}/" + + "${sceneEnum.prefixClass}${table.className}Controller", "biz", "main"); + } + + private static String javaModuleImplMainFilePath(String path) { + return javaModuleFilePath(path, "biz", "main"); + } + + private static String javaModuleApiMainFilePath(String path) { + return javaModuleFilePath(path, "api", "main"); + } + + private static String javaModuleImplTestFilePath(String path) { + return javaModuleFilePath(path, "biz", "test"); + } + + private static String javaModuleFilePath(String path, String module, String src) { + return "joju-module-${table.moduleName}/" + // 顶级模块 + "joju-module-${table.moduleName}-" + module + "/" + // 子模块 + "src/" + src + "/java/${basePackage}/module/${table.moduleName}/" + path + ".java"; + } + + private static String mapperXmlFilePath() { + return "joju-module-${table.moduleName}/" + // 顶级模块 + "joju-module-${table.moduleName}-biz/" + // 子模块 + "src/main/resources/mapper/${table.businessName}/${table.className}Mapper.xml"; + } + + private static String vueTemplatePath(String path) { + return "codegen/vue/" + path + ".vm"; + } + + private static String vueFilePath(String path) { + return "joju-ui-${sceneEnum.basePackage}/" + // 顶级目录 + "src/" + path; + } + private static String vue3TemplatePath(String path) { + return "codegen/vue3/" + path + ".vm"; + } + + private static String vue3FilePath(String path) { + return "joju-ui-${sceneEnum.basePackage}-vue3/" + // 顶级目录 + "src/" + path; + } +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/config/ConfigService.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/config/ConfigService.java new file mode 100644 index 0000000..807465a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/config/ConfigService.java @@ -0,0 +1,75 @@ +package com.jojubanking.boot.module.infra.service.config; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.config.ConfigDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 参数配置 Service 接口 + * + * @author TW + */ +public interface ConfigService { + + /** + * 创建参数配置 + * + * @param reqVO 创建信息 + * @return 配置编号 + */ + Long createConfig(@Valid ConfigCreateReqVO reqVO); + + /** + * 更新参数配置 + * + * @param reqVO 更新信息 + */ + void updateConfig(@Valid ConfigUpdateReqVO reqVO); + + /** + * 删除参数配置 + * + * @param id 配置编号 + */ + void deleteConfig(Long id); + + /** + * 获得参数配置 + * + * @param id 配置编号 + * @return 参数配置 + */ + ConfigDO getConfig(Long id); + + /** + * 根据参数键,获得参数配置 + * + * @param key 配置键 + * @return 参数配置 + */ + ConfigDO getConfigByKey(String key); + + /** + * 获得参数配置分页列表 + * + * @param reqVO 分页条件 + * @return 分页列表 + */ + PageResult getConfigPage(@Valid ConfigPageReqVO reqVO); + + /** + * 获得参数配置列表 + * + * @param reqVO 列表 + * @return 列表 + */ + List getConfigList(@Valid ConfigExportReqVO reqVO); + + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/config/ConfigServiceImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/config/ConfigServiceImpl.java new file mode 100644 index 0000000..dc709ed --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/config/ConfigServiceImpl.java @@ -0,0 +1,132 @@ +package com.jojubanking.boot.module.infra.service.config; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.convert.config.ConfigConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.config.ConfigDO; +import com.jojubanking.boot.module.infra.dal.mysql.config.ConfigMapper; +import com.jojubanking.boot.module.infra.enums.ErrorCodeConstants; +import com.jojubanking.boot.module.infra.enums.config.ConfigTypeEnum; +import com.jojubanking.boot.module.infra.mq.producer.config.ConfigProducer; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 参数配置 Service 实现类 + */ +@Service +@Slf4j +@Validated +public class ConfigServiceImpl implements ConfigService { + + @Resource + private ConfigMapper configMapper; + + @Resource + private ConfigProducer configProducer; + + @Override + public Long createConfig(ConfigCreateReqVO reqVO) { + // 校验正确性 + checkCreateOrUpdate(null, reqVO.getKey()); + // 插入参数配置 + ConfigDO config = ConfigConvert.INSTANCE.convert(reqVO); + config.setType(ConfigTypeEnum.CUSTOM.getType()); + configMapper.insert(config); + // 发送刷新消息 + configProducer.sendConfigRefreshMessage(); + return config.getId(); + } + + @Override + public void updateConfig(ConfigUpdateReqVO reqVO) { + // 校验正确性 + checkCreateOrUpdate(reqVO.getId(), null); // 不允许更新 key + // 更新参数配置 + ConfigDO updateObj = ConfigConvert.INSTANCE.convert(reqVO); + configMapper.updateById(updateObj); + // 发送刷新消息 + configProducer.sendConfigRefreshMessage(); + } + + @Override + public void deleteConfig(Long id) { + // 校验配置存在 + ConfigDO config = checkConfigExists(id); + // 内置配置,不允许删除 + if (ConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); + } + // 删除 + configMapper.deleteById(id); + // 发送刷新消息 + configProducer.sendConfigRefreshMessage(); + } + + @Override + public ConfigDO getConfig(Long id) { + return configMapper.selectById(id); + } + + @Override + public ConfigDO getConfigByKey(String key) { + return configMapper.selectByKey(key); + } + + @Override + public PageResult getConfigPage(ConfigPageReqVO reqVO) { + return configMapper.selectPage(reqVO); + } + + @Override + public List getConfigList(ConfigExportReqVO reqVO) { + return configMapper.selectList(reqVO); + } + + private void checkCreateOrUpdate(Long id, String key) { + // 校验自己存在 + checkConfigExists(id); + // 校验参数配置 key 的唯一性 + if (StrUtil.isNotEmpty(key)) { + checkConfigKeyUnique(id, key); + } + } + + @VisibleForTesting + public ConfigDO checkConfigExists(Long id) { + if (id == null) { + return null; + } + ConfigDO config = configMapper.selectById(id); + if (config == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CONFIG_NOT_EXISTS); + } + return config; + } + + @VisibleForTesting + public void checkConfigKeyUnique(Long id, String key) { + ConfigDO config = configMapper.selectByKey(key); + if (config == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的参数配置 + if (id == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CONFIG_KEY_DUPLICATE); + } + if (!config.getId().equals(id)) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.CONFIG_KEY_DUPLICATE); + } + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/db/DataSourceConfigService.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/db/DataSourceConfigService.java new file mode 100644 index 0000000..8152481 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/db/DataSourceConfigService.java @@ -0,0 +1,54 @@ +package com.jojubanking.boot.module.infra.service.db; + +import com.jojubanking.boot.module.infra.controller.admin.db.vo.DataSourceConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.db.vo.DataSourceConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.db.DataSourceConfigDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 数据源配置 Service 接口 + * + * @author TW + */ +public interface DataSourceConfigService { + + /** + * 创建数据源配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDataSourceConfig(@Valid DataSourceConfigCreateReqVO createReqVO); + + /** + * 更新数据源配置 + * + * @param updateReqVO 更新信息 + */ + void updateDataSourceConfig(@Valid DataSourceConfigUpdateReqVO updateReqVO); + + /** + * 删除数据源配置 + * + * @param id 编号 + */ + void deleteDataSourceConfig(Long id); + + /** + * 获得数据源配置 + * + * @param id 编号 + * @return 数据源配置 + */ + DataSourceConfigDO getDataSourceConfig(Long id); + + /** + * 获得数据源配置列表 + * + * @return 数据源配置列表 + */ + List getDataSourceConfigList(); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/db/DataSourceConfigServiceImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/db/DataSourceConfigServiceImpl.java new file mode 100644 index 0000000..6b8d809 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/db/DataSourceConfigServiceImpl.java @@ -0,0 +1,107 @@ +package com.jojubanking.boot.module.infra.service.db; + +import com.jojubanking.boot.framework.mybatis.core.util.JdbcUtils; +import com.jojubanking.boot.module.infra.controller.admin.db.vo.DataSourceConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.db.vo.DataSourceConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.convert.db.DataSourceConfigConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.jojubanking.boot.module.infra.dal.mysql.db.DataSourceConfigMapper; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Objects; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_EXISTS; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_OK; + +/** + * 数据源配置 Service 实现类 + * + * @author TW + */ +@Service +@Validated +public class DataSourceConfigServiceImpl implements DataSourceConfigService { + + @Resource + private DataSourceConfigMapper dataSourceConfigMapper; + + @Resource + private DynamicDataSourceProperties dynamicDataSourceProperties; + + @Override + public Long createDataSourceConfig(DataSourceConfigCreateReqVO createReqVO) { + DataSourceConfigDO dataSourceConfig = DataSourceConfigConvert.INSTANCE.convert(createReqVO); + checkConnectionOK(dataSourceConfig); + + // 插入 + dataSourceConfigMapper.insert(dataSourceConfig); + // 返回 + return dataSourceConfig.getId(); + } + + @Override + public void updateDataSourceConfig(DataSourceConfigUpdateReqVO updateReqVO) { + // 校验存在 + validateDataSourceConfigExists(updateReqVO.getId()); + DataSourceConfigDO updateObj = DataSourceConfigConvert.INSTANCE.convert(updateReqVO); + checkConnectionOK(updateObj); + + // 更新 + dataSourceConfigMapper.updateById(updateObj); + } + + @Override + public void deleteDataSourceConfig(Long id) { + // 校验存在 + validateDataSourceConfigExists(id); + // 删除 + dataSourceConfigMapper.deleteById(id); + } + + private void validateDataSourceConfigExists(Long id) { + if (dataSourceConfigMapper.selectById(id) == null) { + throw exception(DATA_SOURCE_CONFIG_NOT_EXISTS); + } + } + + @Override + public DataSourceConfigDO getDataSourceConfig(Long id) { + // 如果 id 为 0,默认为 master 的数据源 + if (Objects.equals(id, DataSourceConfigDO.ID_MASTER)) { + return buildMasterDataSourceConfig(); + } + // 从 DB 中读取 + return dataSourceConfigMapper.selectById(id); + } + + @Override + public List getDataSourceConfigList() { + List result = dataSourceConfigMapper.selectList(); + // 补充 master 数据源 + result.add(0, buildMasterDataSourceConfig()); + return result; + } + + private void checkConnectionOK(DataSourceConfigDO config) { + boolean success = JdbcUtils.isConnectionOK(config.getUrl(), config.getUsername(), config.getPassword()); + if (!success) { + throw exception(DATA_SOURCE_CONFIG_NOT_OK); + } + } + + private DataSourceConfigDO buildMasterDataSourceConfig() { + String primary = dynamicDataSourceProperties.getPrimary(); + DataSourceProperty dataSourceProperty = dynamicDataSourceProperties.getDatasource().get(primary); + return new DataSourceConfigDO().setId(DataSourceConfigDO.ID_MASTER).setName(primary) + .setUrl(dataSourceProperty.getUrl()) + .setUsername(dataSourceProperty.getUsername()) + .setPassword(dataSourceProperty.getPassword()); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/db/DatabaseTableService.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/db/DatabaseTableService.java new file mode 100644 index 0000000..031f619 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/db/DatabaseTableService.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.infra.service.db; + +import com.baomidou.mybatisplus.generator.config.po.TableInfo; + +import java.util.List; + +/** + * 数据库表 Service + * + * @author TW + */ +public interface DatabaseTableService { + + /** + * 获得表列表,基于表名称 + 表描述进行模糊匹配 + * + * @param dataSourceConfigId 数据源配置的编号 + * @param nameLike 表名称,模糊匹配 + * @param commentLike 表描述,模糊匹配 + * @return 表列表 + */ + List getTableList(Long dataSourceConfigId, String nameLike, String commentLike); + + /** + * 获得指定表名 + * + * @param dataSourceConfigId 数据源配置的编号 + * @param tableName 表名称 + * @return 表 + */ + TableInfo getTable(Long dataSourceConfigId, String tableName); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/db/DatabaseTableServiceImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/db/DatabaseTableServiceImpl.java new file mode 100644 index 0000000..b76303b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/db/DatabaseTableServiceImpl.java @@ -0,0 +1,65 @@ +package com.jojubanking.boot.module.infra.service.db; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.baomidou.mybatisplus.generator.config.DataSourceConfig; +import com.baomidou.mybatisplus.generator.config.GlobalConfig; +import com.baomidou.mybatisplus.generator.config.StrategyConfig; +import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.baomidou.mybatisplus.generator.config.rules.DateType; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 数据库表 Service 实现类 + * + * @author TW + */ +@Service +public class DatabaseTableServiceImpl implements DatabaseTableService { + + @Resource + private DataSourceConfigService dataSourceConfigService; + + @Override + public List getTableList(Long dataSourceConfigId, String nameLike, String commentLike) { + List tables = getTableList0(dataSourceConfigId, null); + return tables.stream().filter(tableInfo -> (StrUtil.isEmpty(nameLike) || tableInfo.getName().contains(nameLike)) + && (StrUtil.isEmpty(commentLike) || tableInfo.getComment().contains(commentLike))) + .collect(Collectors.toList()); + } + + @Override + public TableInfo getTable(Long dataSourceConfigId, String name) { + return CollUtil.getFirst(getTableList0(dataSourceConfigId, name)); + } + + public List getTableList0(Long dataSourceConfigId, String name) { + // 获得数据源配置 + DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId); + Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId); + + // 使用 MyBatis Plus Generator 解析表结构 + DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(), + config.getPassword()).build(); + StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder(); + if (StrUtil.isNotEmpty(name)) { + strategyConfig.addInclude(name); + } + GlobalConfig globalConfig = new GlobalConfig.Builder().dateType(DateType.ONLY_DATE).build(); // 只使用 Date 类型,不使用 LocalDate + ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfig, strategyConfig.build(), + null, globalConfig, null); + // 按照名字排序 + List tables = builder.getTableInfoList(); + tables.sort(Comparator.comparing(TableInfo::getName)); + return tables; + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/file/FileConfigService.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/file/FileConfigService.java new file mode 100644 index 0000000..633e742 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/file/FileConfigService.java @@ -0,0 +1,102 @@ +package com.jojubanking.boot.module.infra.service.file; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.file.core.client.FileClient; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileConfigDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 文件配置 Service 接口 + * + * @author TW + */ +public interface FileConfigService { + + /** + * 初始化文件客户端 + */ + void initFileClients(); + + /** + * 创建文件配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createFileConfig(@Valid FileConfigCreateReqVO createReqVO); + + /** + * 更新文件配置 + * + * @param updateReqVO 更新信息 + */ + void updateFileConfig(@Valid FileConfigUpdateReqVO updateReqVO); + + /** + * 更新文件配置为 Master + * + * @param id 编号 + */ + void updateFileConfigMaster(Long id); + + /** + * 删除文件配置 + * + * @param id 编号 + */ + void deleteFileConfig(Long id); + + /** + * 获得文件配置 + * + * @param id 编号 + * @return 文件配置 + */ + FileConfigDO getFileConfig(Long id); + + /** + * 获得文件配置列表 + * + * @param ids 编号 + * @return 文件配置列表 + */ + List getFileConfigList(Collection ids); + + /** + * 获得文件配置分页 + * + * @param pageReqVO 分页查询 + * @return 文件配置分页 + */ + PageResult getFileConfigPage(FileConfigPageReqVO pageReqVO); + + /** + * 测试文件配置是否正确,通过上传文件 + * + * @param id 编号 + * @return 文件 URL + */ + String testFileConfig(Long id) throws Exception; + + /** + * 获得指定编号的文件客户端 + * + * @param id 配置编号 + * @return 文件客户端 + */ + FileClient getFileClient(Long id); + + /** + * 获得 Master 文件客户端 + * + * @return 文件客户端 + */ + FileClient getMasterFileClient(); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImpl.java new file mode 100644 index 0000000..96785ec --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImpl.java @@ -0,0 +1,241 @@ +package com.jojubanking.boot.module.infra.service.file; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.util.IdUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.common.util.validation.ValidationUtils; +import com.jojubanking.boot.framework.file.core.client.FileClient; +import com.jojubanking.boot.framework.file.core.client.FileClientConfig; +import com.jojubanking.boot.framework.file.core.client.FileClientFactory; +import com.jojubanking.boot.framework.file.core.enums.FileStorageEnum; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.convert.file.FileConfigConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileConfigDO; +import com.jojubanking.boot.module.infra.dal.mysql.file.FileConfigMapper; +import com.jojubanking.boot.module.infra.mq.producer.file.FileConfigProducer; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.FILE_CONFIG_DELETE_FAIL_MASTER; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.FILE_CONFIG_NOT_EXISTS; + +/** + * 文件配置 Service 实现类 + * + * @author TW + */ +@Service +@Validated +@Slf4j +public class FileConfigServiceImpl implements FileConfigService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + @Getter + private volatile Date maxUpdateTime; + + @Resource + private FileClientFactory fileClientFactory; + /** + * Master FileClient 对象,有且仅有一个,即 {@link FileConfigDO#getMaster()} 对应的 + */ + @Getter + private FileClient masterFileClient; + + @Resource + private FileConfigMapper fileConfigMapper; + + @Resource + private FileConfigProducer fileConfigProducer; + + @Resource + private Validator validator; + + @Resource + @Lazy // 注入自己,所以延迟加载 + private FileConfigService self; + + @Override + @PostConstruct + public void initFileClients() { + // 获取文件配置,如果有更新 + List configs = loadFileConfigIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(configs)) { + return; + } + + // 创建或更新支付 Client + configs.forEach(config -> { + fileClientFactory.createOrUpdateFileClient(config.getId(), config.getStorage(), config.getConfig()); + // 如果是 master,进行设置 + if (Boolean.TRUE.equals(config.getMaster())) { + masterFileClient = fileClientFactory.getFileClient(config.getId()); + } + }); + + // 写入缓存 + maxUpdateTime = CollectionUtils.getMaxValue(configs, FileConfigDO::getUpdateTime); + log.info("[initFileClients][初始化 FileConfig 数量为 {}]", configs.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + self.initFileClients(); + } + + /** + * 如果文件配置发生变化,从数据库中获取最新的全量文件配置。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前文件配置的最大更新时间 + * @return 文件配置列表 + */ + private List loadFileConfigIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadFileConfigIfUpdate][首次加载全量文件配置]"); + } else { // 判断数据库中是否有更新的文件配置 + if (fileConfigMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { + return null; + } + log.info("[loadFileConfigIfUpdate][增量加载全量文件配置]"); + } + // 第二步,如果有更新,则从数据库加载所有文件配置 + return fileConfigMapper.selectList(); + } + + @Override + public Long createFileConfig(FileConfigCreateReqVO createReqVO) { + // 插入 + FileConfigDO fileConfig = FileConfigConvert.INSTANCE.convert(createReqVO) + .setConfig(parseClientConfig(createReqVO.getStorage(), createReqVO.getConfig())) + .setMaster(false); // 默认非 master + fileConfigMapper.insert(fileConfig); + // 发送刷新配置的消息 + fileConfigProducer.sendFileConfigRefreshMessage(); + // 返回 + return fileConfig.getId(); + } + + @Override + public void updateFileConfig(FileConfigUpdateReqVO updateReqVO) { + // 校验存在 + FileConfigDO config = this.validateFileConfigExists(updateReqVO.getId()); + // 更新 + FileConfigDO updateObj = FileConfigConvert.INSTANCE.convert(updateReqVO) + .setConfig(parseClientConfig(config.getStorage(), updateReqVO.getConfig())); + fileConfigMapper.updateById(updateObj); + // 发送刷新配置的消息 + fileConfigProducer.sendFileConfigRefreshMessage(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateFileConfigMaster(Long id) { + // 校验存在 + this.validateFileConfigExists(id); + // 更新其它为非 master + fileConfigMapper.updateBatch(new FileConfigDO().setMaster(false)); + // 更新 + fileConfigMapper.updateById(new FileConfigDO().setId(id).setMaster(true)); + // 发送刷新配置的消息 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + fileConfigProducer.sendFileConfigRefreshMessage(); + } + + }); + } + + private FileClientConfig parseClientConfig(Integer storage, Map config) { + // 获取配置类 + Class configClass = FileStorageEnum.getByStorage(storage) + .getConfigClass(); + FileClientConfig clientConfig = JsonUtils.parseObject2(JsonUtils.toJsonString(config), configClass); + // 参数校验 + ValidationUtils.validate(validator, clientConfig); + // 设置参数 + return clientConfig; + } + + @Override + public void deleteFileConfig(Long id) { + // 校验存在 + FileConfigDO config = this.validateFileConfigExists(id); + if (Boolean.TRUE.equals(config.getMaster())) { + throw exception(FILE_CONFIG_DELETE_FAIL_MASTER); + } + // 删除 + fileConfigMapper.deleteById(id); + // 发送刷新配置的消息 + fileConfigProducer.sendFileConfigRefreshMessage(); + } + + private FileConfigDO validateFileConfigExists(Long id) { + FileConfigDO config = fileConfigMapper.selectById(id); + if (config == null) { + throw exception(FILE_CONFIG_NOT_EXISTS); + } + return config; + } + + @Override + public FileConfigDO getFileConfig(Long id) { + return fileConfigMapper.selectById(id); + } + + @Override + public List getFileConfigList(Collection ids) { + return fileConfigMapper.selectBatchIds(ids); + } + + @Override + public PageResult getFileConfigPage(FileConfigPageReqVO pageReqVO) { + return fileConfigMapper.selectPage(pageReqVO); + } + + @Override + public String testFileConfig(Long id) throws Exception { + // 校验存在 + this.validateFileConfigExists(id); + // 上传文件 + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + return fileClientFactory.getFileClient(id).upload(content, IdUtil.fastSimpleUUID() + ".jpg"); + } + + @Override + public FileClient getFileClient(Long id) { + return fileClientFactory.getFileClient(id); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/file/FileService.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/file/FileService.java new file mode 100644 index 0000000..7365a4b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/file/FileService.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.module.infra.service.file; + +import com.jojubanking.boot.module.infra.controller.admin.file.vo.file.FilePageReqVO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileDO; + +/** + * 文件 Service 接口 + * + * @author TW + */ +public interface FileService { + + /** + * 获得文件分页 + * + * @param pageReqVO 分页查询 + * @return 文件分页 + */ + PageResult getFilePage(FilePageReqVO pageReqVO); + + /** + * 保存文件,并返回文件的访问路径 + * + * @param name 文件名称 + * @param path 文件路径 + * @param content 文件内容 + * @return 文件路径 + */ + String createFile(String name, String path, byte[] content); + + /** + * 删除文件 + * + * @param id 编号 + */ + void deleteFile(Long id) throws Exception; + + /** + * 获得文件内容 + * + * @param configId 配置编号 + * @param path 文件路径 + * @return 文件内容 + */ + byte[] getFileContent(Long configId, String path) throws Exception; + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/file/FileServiceImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/file/FileServiceImpl.java new file mode 100644 index 0000000..16aa961 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/file/FileServiceImpl.java @@ -0,0 +1,98 @@ +package com.jojubanking.boot.module.infra.service.file; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.io.FileUtils; +import com.jojubanking.boot.framework.file.core.client.FileClient; +import com.jojubanking.boot.framework.file.core.utils.FileTypeUtils; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.file.FilePageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileDO; +import com.jojubanking.boot.module.infra.dal.mysql.file.FileMapper; +import lombok.SneakyThrows; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; + +/** + * 文件 Service 实现类 + * + * @author TW + */ +@Service +public class FileServiceImpl implements FileService { + + @Resource + private FileConfigService fileConfigService; + + @Resource + private FileMapper fileMapper; + + @Override + public PageResult getFilePage(FilePageReqVO pageReqVO) { + return fileMapper.selectPage(pageReqVO); + } + + @Override + @SneakyThrows + public String createFile(String name, String path, byte[] content) { + // 计算默认的 path 名 + String type = FileTypeUtils.getMineType(content, name); + if (StrUtil.isEmpty(path)) { + path = FileUtils.generatePath(content, name); + } + // 如果 name 为空,则使用 path 填充 + if (StrUtil.isEmpty(name)) { + name = path; + } + + // 上传到文件存储器 + FileClient client = fileConfigService.getMasterFileClient(); + Assert.notNull(client, "客户端(master) 不能为空"); + String url = client.upload(content, path); + + // 保存到数据库 + FileDO file = new FileDO(); + file.setConfigId(client.getId()); + file.setName(name); + file.setPath(path); + file.setUrl(url); + file.setType(type); + file.setSize(content.length); + fileMapper.insert(file); + return url; + } + + @Override + public void deleteFile(Long id) throws Exception { + // 校验存在 + FileDO file = this.validateFileExists(id); + + // 从文件存储器中删除 + FileClient client = fileConfigService.getFileClient(file.getConfigId()); + Assert.notNull(client, "客户端({}) 不能为空", file.getConfigId()); + client.delete(file.getPath()); + + // 删除记录 + fileMapper.deleteById(id); + } + + private FileDO validateFileExists(Long id) { + FileDO fileDO = fileMapper.selectById(id); + if (fileDO == null) { + throw exception(FILE_NOT_EXISTS); + } + return fileDO; + } + + @Override + public byte[] getFileContent(Long configId, String path) throws Exception { + FileClient client = fileConfigService.getFileClient(configId); + Assert.notNull(client, "客户端({}) 不能为空", configId); + return client.getContent(path); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/job/JobLogService.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/job/JobLogService.java new file mode 100644 index 0000000..ff03bf4 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/job/JobLogService.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.module.infra.service.job; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.quartz.core.service.JobLogFrameworkService; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobLogDO; + +import java.util.Collection; +import java.util.List; + +/** + * Job 日志 Service 接口 + * + * @author TW + */ +public interface JobLogService extends JobLogFrameworkService { + + /** + * 获得定时任务 + * + * @param id 编号 + * @return 定时任务 + */ + JobLogDO getJobLog(Long id); + + /** + * 获得定时任务列表 + * + * @param ids 编号 + * @return 定时任务列表 + */ + List getJobLogList(Collection ids); + + /** + * 获得定时任务分页 + * + * @param pageReqVO 分页查询 + * @return 定时任务分页 + */ + PageResult getJobLogPage(JobLogPageReqVO pageReqVO); + + /** + * 获得定时任务列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 定时任务分页 + */ + List getJobLogList(JobLogExportReqVO exportReqVO); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/job/JobLogServiceImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/job/JobLogServiceImpl.java new file mode 100644 index 0000000..be27a03 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/job/JobLogServiceImpl.java @@ -0,0 +1,73 @@ +package com.jojubanking.boot.module.infra.service.job; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobLogDO; +import com.jojubanking.boot.module.infra.dal.mysql.job.JobLogMapper; +import com.jojubanking.boot.module.infra.enums.job.JobLogStatusEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * Job 日志 Service 实现类 + * + * @author TW + */ +@Service +@Validated +@Slf4j +public class JobLogServiceImpl implements JobLogService { + + @Resource + private JobLogMapper jobLogMapper; + + @Override + public Long createJobLog(Long jobId, Date beginTime, String jobHandlerName, String jobHandlerParam, Integer executeIndex) { + JobLogDO log = JobLogDO.builder().jobId(jobId).handlerName(jobHandlerName).handlerParam(jobHandlerParam).executeIndex(executeIndex) + .beginTime(beginTime).status(JobLogStatusEnum.RUNNING.getStatus()).build(); + jobLogMapper.insert(log); + return log.getId(); + } + + @Override + @Async + public void updateJobLogResultAsync(Long logId, Date endTime, Integer duration, boolean success, String result) { + try { + JobLogDO updateObj = JobLogDO.builder().id(logId).endTime(endTime).duration(duration) + .status(success ? JobLogStatusEnum.SUCCESS.getStatus() : JobLogStatusEnum.FAILURE.getStatus()).result(result).build(); + jobLogMapper.updateById(updateObj); + } catch (Exception ex) { + log.error("[updateJobLogResultAsync][logId({}) endTime({}) duration({}) success({}) result({})]", + logId, endTime, duration, success, result); + } + } + + @Override + public JobLogDO getJobLog(Long id) { + return jobLogMapper.selectById(id); + } + + @Override + public List getJobLogList(Collection ids) { + return jobLogMapper.selectBatchIds(ids); + } + + @Override + public PageResult getJobLogPage(JobLogPageReqVO pageReqVO) { + return jobLogMapper.selectPage(pageReqVO); + } + + @Override + public List getJobLogList(JobLogExportReqVO exportReqVO) { + return jobLogMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/job/JobService.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/job/JobService.java new file mode 100644 index 0000000..1a23567 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/job/JobService.java @@ -0,0 +1,91 @@ +package com.jojubanking.boot.module.infra.service.job; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobDO; +import org.quartz.SchedulerException; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 定时任务 Service 接口 + * + * @author TW + */ +public interface JobService { + + /** + * 创建定时任务 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createJob(@Valid JobCreateReqVO createReqVO) throws SchedulerException; + + /** + * 更新定时任务 + * + * @param updateReqVO 更新信息 + */ + void updateJob(@Valid JobUpdateReqVO updateReqVO) throws SchedulerException; + + /** + * 更新定时任务的状态 + * + * @param id 任务编号 + * @param status 状态 + */ + void updateJobStatus(Long id, Integer status) throws SchedulerException; + + /** + * 触发定时任务 + * + * @param id 任务编号 + */ + void triggerJob(Long id) throws SchedulerException; + + /** + * 删除定时任务 + * + * @param id 编号 + */ + void deleteJob(Long id) throws SchedulerException; + + /** + * 获得定时任务 + * + * @param id 编号 + * @return 定时任务 + */ + JobDO getJob(Long id); + + /** + * 获得定时任务列表 + * + * @param ids 编号 + * @return 定时任务列表 + */ + List getJobList(Collection ids); + + /** + * 获得定时任务分页 + * + * @param pageReqVO 分页查询 + * @return 定时任务分页 + */ + PageResult getJobPage(JobPageReqVO pageReqVO); + + /** + * 获得定时任务列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 定时任务分页 + */ + List getJobList(JobExportReqVO exportReqVO); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/job/JobServiceImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/job/JobServiceImpl.java new file mode 100644 index 0000000..8d9f6c2 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/job/JobServiceImpl.java @@ -0,0 +1,173 @@ +package com.jojubanking.boot.module.infra.service.job; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.quartz.core.scheduler.SchedulerManager; +import com.jojubanking.boot.framework.quartz.core.util.CronUtils; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobUpdateReqVO; +import com.jojubanking.boot.module.infra.convert.job.JobConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobDO; +import com.jojubanking.boot.module.infra.dal.mysql.job.JobMapper; +import com.jojubanking.boot.module.infra.enums.job.JobStatusEnum; +import org.quartz.SchedulerException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.containsAny; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.*; + +/** + * 定时任务 Service 实现类 + * + * @author TW + */ +@Service +@Validated +public class JobServiceImpl implements JobService { + + @Resource + private JobMapper jobMapper; + + @Resource + private SchedulerManager schedulerManager; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createJob(JobCreateReqVO createReqVO) throws SchedulerException { + validateCronExpression(createReqVO.getCronExpression()); + // 校验唯一性 + if (jobMapper.selectByHandlerName(createReqVO.getHandlerName()) != null) { + throw exception(JOB_HANDLER_EXISTS); + } + // 插入 + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.INIT.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + + // 添加 Job 到 Quartz 中 + schedulerManager.addJob(job.getId(), job.getHandlerName(), job.getHandlerParam(), job.getCronExpression(), + createReqVO.getRetryCount(), createReqVO.getRetryInterval()); + // 更新 + JobDO updateObj = JobDO.builder().id(job.getId()).status(JobStatusEnum.NORMAL.getStatus()).build(); + jobMapper.updateById(updateObj); + + // 返回 + return job.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateJob(JobUpdateReqVO updateReqVO) throws SchedulerException { + validateCronExpression(updateReqVO.getCronExpression()); + // 校验存在 + JobDO job = this.validateJobExists(updateReqVO.getId()); + // 只有开启状态,才可以修改.原因是,如果出暂停状态,修改 Quartz Job 时,会导致任务又开始执行 + if (!job.getStatus().equals(JobStatusEnum.NORMAL.getStatus())) { + throw exception(JOB_UPDATE_ONLY_NORMAL_STATUS); + } + // 更新 + JobDO updateObj = JobConvert.INSTANCE.convert(updateReqVO); + fillJobMonitorTimeoutEmpty(updateObj); + jobMapper.updateById(updateObj); + + // 更新 Job 到 Quartz 中 + schedulerManager.updateJob(job.getHandlerName(), updateReqVO.getHandlerParam(), updateReqVO.getCronExpression(), + updateReqVO.getRetryCount(), updateReqVO.getRetryInterval()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateJobStatus(Long id, Integer status) throws SchedulerException { + // 校验 status + if (!containsAny(status, JobStatusEnum.NORMAL.getStatus(), JobStatusEnum.STOP.getStatus())) { + throw exception(JOB_CHANGE_STATUS_INVALID); + } + // 校验存在 + JobDO job = this.validateJobExists(id); + // 校验是否已经为当前状态 + if (job.getStatus().equals(status)) { + throw exception(JOB_CHANGE_STATUS_EQUALS); + } + // 更新 Job 状态 + JobDO updateObj = JobDO.builder().id(id).status(status).build(); + jobMapper.updateById(updateObj); + + // 更新状态 Job 到 Quartz 中 + if (JobStatusEnum.NORMAL.getStatus().equals(status)) { // 开启 + schedulerManager.resumeJob(job.getHandlerName()); + } else { // 暂停 + schedulerManager.pauseJob(job.getHandlerName()); + } + } + + @Override + public void triggerJob(Long id) throws SchedulerException { + // 校验存在 + JobDO job = this.validateJobExists(id); + + // 触发 Quartz 中的 Job + schedulerManager.triggerJob(job.getId(), job.getHandlerName(), job.getHandlerParam()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJob(Long id) throws SchedulerException { + // 校验存在 + JobDO job = this.validateJobExists(id); + // 更新 + jobMapper.deleteById(id); + + // 删除 Job 到 Quartz 中 + schedulerManager.deleteJob(job.getHandlerName()); + } + + private JobDO validateJobExists(Long id) { + JobDO job = jobMapper.selectById(id); + if (job == null) { + throw exception(JOB_NOT_EXISTS); + } + return job; + } + + private void validateCronExpression(String cronExpression) { + if (!CronUtils.isValid(cronExpression)) { + throw exception(JOB_CRON_EXPRESSION_VALID); + } + } + + @Override + public JobDO getJob(Long id) { + return jobMapper.selectById(id); + } + + @Override + public List getJobList(Collection ids) { + return jobMapper.selectBatchIds(ids); + } + + @Override + public PageResult getJobPage(JobPageReqVO pageReqVO) { + return jobMapper.selectPage(pageReqVO); + } + + @Override + public List getJobList(JobExportReqVO exportReqVO) { + return jobMapper.selectList(exportReqVO); + } + + private static void fillJobMonitorTimeoutEmpty(JobDO job) { + if (job.getMonitorTimeout() == null) { + job.setMonitorTimeout(0); + } + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogService.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogService.java new file mode 100644 index 0000000..a90d93a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogService.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.infra.service.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiAccessLogDO; + +import java.util.List; + +/** + * API 访问日志 Service 接口 + * + * @author TW + */ +public interface ApiAccessLogService { + + /** + * 创建 API 访问日志 + * + * @param createReqDTO API 访问日志 + */ + void createApiAccessLog(ApiAccessLogCreateReqDTO createReqDTO); + + /** + * 获得 API 访问日志分页 + * + * @param pageReqVO 分页查询 + * @return API 访问日志分页 + */ + PageResult getApiAccessLogPage(ApiAccessLogPageReqVO pageReqVO); + + /** + * 获得 API 访问日志列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return API 访问日志分页 + */ + List getApiAccessLogList(ApiAccessLogExportReqVO exportReqVO); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogServiceImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogServiceImpl.java new file mode 100644 index 0000000..0dff218 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogServiceImpl.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.infra.service.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.jojubanking.boot.module.infra.convert.logger.ApiAccessLogConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import com.jojubanking.boot.module.infra.dal.mysql.logger.ApiAccessLogMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * API 访问日志 Service 实现类 + * + * @author TW + */ +@Service +@Validated +public class ApiAccessLogServiceImpl implements ApiAccessLogService { + + @Resource + private ApiAccessLogMapper apiAccessLogMapper; + + @Override + public void createApiAccessLog(ApiAccessLogCreateReqDTO createDTO) { + ApiAccessLogDO apiAccessLog = ApiAccessLogConvert.INSTANCE.convert(createDTO); + apiAccessLogMapper.insert(apiAccessLog); + } + + @Override + public PageResult getApiAccessLogPage(ApiAccessLogPageReqVO pageReqVO) { + return apiAccessLogMapper.selectPage(pageReqVO); + } + + @Override + public List getApiAccessLogList(ApiAccessLogExportReqVO exportReqVO) { + return apiAccessLogMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogService.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogService.java new file mode 100644 index 0000000..4cd9b04 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogService.java @@ -0,0 +1,50 @@ +package com.jojubanking.boot.module.infra.service.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiErrorLogDO; + +import java.util.List; + +/** + * API 错误日志 Service 接口 + * + * @author TW + */ +public interface ApiErrorLogService { + + /** + * 创建 API 错误日志 + * + * @param createReqDTO API 错误日志 + */ + void createApiErrorLog(ApiErrorLogCreateReqDTO createReqDTO); + + /** + * 获得 API 错误日志分页 + * + * @param pageReqVO 分页查询 + * @return API 错误日志分页 + */ + PageResult getApiErrorLogPage(ApiErrorLogPageReqVO pageReqVO); + + /** + * 获得 API 错误日志列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return API 错误日志分页 + */ + List getApiErrorLogList(ApiErrorLogExportReqVO exportReqVO); + + /** + * 更新 API 错误日志已处理 + * + * @param id API 日志编号 + * @param processStatus 处理结果 + * @param processUserId 处理人 + */ + void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogServiceImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogServiceImpl.java new file mode 100644 index 0000000..fe8fe11 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogServiceImpl.java @@ -0,0 +1,63 @@ +package com.jojubanking.boot.module.infra.service.logger; + +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.jojubanking.boot.module.infra.convert.logger.ApiErrorLogConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import com.jojubanking.boot.module.infra.dal.mysql.logger.ApiErrorLogMapper; +import com.jojubanking.boot.module.infra.enums.ErrorCodeConstants; +import com.jojubanking.boot.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + * API 错误日志 Service 实现类 + * + * @author TW + */ +@Service +@Validated +public class ApiErrorLogServiceImpl implements ApiErrorLogService { + + @Resource + private ApiErrorLogMapper apiErrorLogMapper; + + @Override + public void createApiErrorLog(ApiErrorLogCreateReqDTO createDTO) { + ApiErrorLogDO apiErrorLog = ApiErrorLogConvert.INSTANCE.convert(createDTO); + apiErrorLog.setProcessStatus(ApiErrorLogProcessStatusEnum.INIT.getStatus()); + apiErrorLogMapper.insert(apiErrorLog); + } + + @Override + public PageResult getApiErrorLogPage(ApiErrorLogPageReqVO pageReqVO) { + return apiErrorLogMapper.selectPage(pageReqVO); + } + + @Override + public List getApiErrorLogList(ApiErrorLogExportReqVO exportReqVO) { + return apiErrorLogMapper.selectList(exportReqVO); + } + + @Override + public void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId) { + ApiErrorLogDO errorLog = apiErrorLogMapper.selectById(id); + if (errorLog == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.API_ERROR_LOG_NOT_FOUND); + } + if (!ApiErrorLogProcessStatusEnum.INIT.getStatus().equals(errorLog.getProcessStatus())) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.API_ERROR_LOG_PROCESSED); + } + // 标记处理 + apiErrorLogMapper.updateById(ApiErrorLogDO.builder().id(id).processStatus(processStatus) + .processUserId(processUserId).processTime(new Date()).build()); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/test/TestDemoService.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/test/TestDemoService.java new file mode 100644 index 0000000..6ef4765 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/test/TestDemoService.java @@ -0,0 +1,75 @@ +package com.jojubanking.boot.module.infra.service.test; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.test.TestDemoDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 字典类型 Service 接口 + * + * @author TW + */ +public interface TestDemoService { + + /** + * 创建字典类型 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTestDemo(@Valid TestDemoCreateReqVO createReqVO); + + /** + * 更新字典类型 + * + * @param updateReqVO 更新信息 + */ + void updateTestDemo(@Valid TestDemoUpdateReqVO updateReqVO); + + /** + * 删除字典类型 + * + * @param id 编号 + */ + void deleteTestDemo(Long id); + + /** + * 获得字典类型 + * + * @param id 编号 + * @return 字典类型 + */ + TestDemoDO getTestDemo(Long id); + + /** + * 获得字典类型列表 + * + * @param ids 编号 + * @return 字典类型列表 + */ + List getTestDemoList(Collection ids); + + /** + * 获得字典类型分页 + * + * @param pageReqVO 分页查询 + * @return 字典类型分页 + */ + PageResult getTestDemoPage(TestDemoPageReqVO pageReqVO); + + /** + * 获得字典类型列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 字典类型列表 + */ + List getTestDemoList(TestDemoExportReqVO exportReqVO); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/test/TestDemoServiceImpl.java b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/test/TestDemoServiceImpl.java new file mode 100644 index 0000000..28fb843 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/java/com/jojubanking/boot/module/infra/service/test/TestDemoServiceImpl.java @@ -0,0 +1,91 @@ +package com.jojubanking.boot.module.infra.service.test; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoUpdateReqVO; +import com.jojubanking.boot.module.infra.convert.test.TestDemoConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.test.TestDemoDO; +import com.jojubanking.boot.module.infra.dal.mysql.test.TestDemoMapper; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.TEST_DEMO_NOT_EXISTS; + +/** + * 字典类型 Service 实现类 + * + * @author TW + */ +@Service +@Validated +public class TestDemoServiceImpl implements TestDemoService { + + @Resource + private TestDemoMapper testDemoMapper; + + @Override + public Long createTestDemo(TestDemoCreateReqVO createReqVO) { + // 插入 + TestDemoDO testDemo = TestDemoConvert.INSTANCE.convert(createReqVO); + testDemoMapper.insert(testDemo); + // 返回 + return testDemo.getId(); + } + + @Override + @CacheEvict(value = "test", key = "#updateReqVO.id") + public void updateTestDemo(TestDemoUpdateReqVO updateReqVO) { + // 校验存在 + this.validateTestDemoExists(updateReqVO.getId()); + // 更新 + TestDemoDO updateObj = TestDemoConvert.INSTANCE.convert(updateReqVO); + testDemoMapper.updateById(updateObj); + } + + @Override + @CacheEvict(value = "test", key = "#id") + public void deleteTestDemo(Long id) { + // 校验存在 + this.validateTestDemoExists(id); + // 删除 + testDemoMapper.deleteById(id); + } + + private void validateTestDemoExists(Long id) { + if (testDemoMapper.selectById(id) == null) { + throw exception(TEST_DEMO_NOT_EXISTS); + } + } + + @Override + @Cacheable(cacheNames = "test", key = "#id") + public TestDemoDO getTestDemo(Long id) { + return testDemoMapper.selectById(id); + } + + @Override + public List getTestDemoList(Collection ids) { + return testDemoMapper.selectBatchIds(ids); + } + + @Override + public PageResult getTestDemoPage(TestDemoPageReqVO pageReqVO) { +// testDemoMapper.selectList2(); + return testDemoMapper.selectPage(pageReqVO); + } + + @Override + public List getTestDemoList(TestDemoExportReqVO exportReqVO) { + return testDemoMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm new file mode 100644 index 0000000..5b05467 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm @@ -0,0 +1,109 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +#if ($sceneEnum.scene == 1)import org.springframework.security.access.prepost.PreAuthorize;#end + +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import ${PageResultClassName}; +import ${CommonResultClassName}; +import static ${CommonResultClassName}.success; + +import ${ExcelUtilsClassName}; + +import ${OperateLogClassName}; +import static ${OperateTypeEnumClassName}.*; + +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.module.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; +import ${basePackage}.module.${table.moduleName}.service.${table.businessName}.${table.className}Service; + +@Api(tags = "${sceneEnum.name} - ${table.classComment}") +@RestController +##二级的 businessName 暂时不算在 HTTP 路径上,可以根据需要写 +@RequestMapping("/${table.moduleName}/${simpleClassName_strikeCase}") +@Validated +public class ${sceneEnum.prefixClass}${table.className}Controller { + + @Resource + private ${table.className}Service ${classNameVar}Service; + + @PostMapping("/create") + @ApiOperation("创建${table.classComment}") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')")#end + + public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}CreateReqVO createReqVO) { + return success(${classNameVar}Service.create${simpleClassName}(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新${table.classComment}") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')")#end + + public CommonResult update${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}UpdateReqVO updateReqVO) { + ${classNameVar}Service.update${simpleClassName}(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除${table.classComment}") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = ${primaryColumn.javaType}.class) +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')")#end + + public CommonResult delete${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { + ${classNameVar}Service.delete${simpleClassName}(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得${table.classComment}") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = ${primaryColumn.javaType}.class) +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")#end + + public CommonResult<${sceneEnum.prefixClass}${table.className}RespVO> get${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { + ${table.className}DO ${classNameVar} = ${classNameVar}Service.get${simpleClassName}(id); + return success(${table.className}Convert.INSTANCE.convert(${classNameVar})); + } + + @GetMapping("/list") + @ApiOperation("获得${table.classComment}列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")#end + + public CommonResult> get${simpleClassName}List(@RequestParam("ids") Collection<${primaryColumn.javaType}> ids) { + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(ids); + return success(${table.className}Convert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得${table.classComment}分页") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")#end + + public CommonResult> get${simpleClassName}Page(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageVO) { + PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(pageVO); + return success(${table.className}Convert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出${table.classComment} Excel") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')")#end + + @OperateLog(type = EXPORT) + public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}ExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(exportReqVO); + // 导出 Excel + List<${sceneEnum.prefixClass}${table.className}ExcelVO> datas = ${table.className}Convert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${sceneEnum.prefixClass}${table.className}ExcelVO.class, datas); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/_column.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/_column.vm new file mode 100644 index 0000000..2e22225 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/_column.vm @@ -0,0 +1,13 @@ +## 提供给 baseVO、createVO、updateVO 生成字段 + @ApiModelProperty(value = "${column.columnComment}"#if (!${column.nullable}), required = true#end#if ("$!column.example" != ""), example = "${column.example}"#end) +#if (!${column.nullable})## 判断 @NotEmpty 和 @NotNull 注解 +#if (${field.fieldType} == 'String') + @NotEmpty(message = "${column.columnComment}不能为空") +#else + @NotNull(message = "${column.columnComment}不能为空") +#end +#end +#if (${column.javaType} == "Date")## 时间类型 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) +#end + private ${column.javaType} ${column.javaField}; diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/baseVO.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/baseVO.vm new file mode 100644 index 0000000..8b9fbaa --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/baseVO.vm @@ -0,0 +1,37 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#break +#end +#end +import io.swagger.annotations.*; +import javax.validation.constraints.*; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.createOperation} && ${column.updateOperation} && ${column.listOperationResult} + && ${column.javaType} == "Date")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end + +/** +* ${table.classComment} Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ${sceneEnum.prefixClass}${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.createOperation} && ${column.updateOperation} && ${column.listOperationResult})##通用操作 + #parse("codegen/java/controller/vo/_column.vm") + +#end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/createReqVO.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/createReqVO.vm new file mode 100644 index 0000000..ca13efa --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/createReqVO.vm @@ -0,0 +1,30 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.createOperation} && (!${column.updateOperation} || !${column.listOperationResult}) + && ${column.javaType} == "Date")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end + +@ApiModel("${sceneEnum.name} - ${table.classComment}创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}CreateReqVO extends ${sceneEnum.prefixClass}${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.createOperation} && (!${column.updateOperation} || !${column.listOperationResult}))##不是通用字段 + #parse("codegen/java/controller/vo/_column.vm") + +#end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/excelVO.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/excelVO.vm new file mode 100644 index 0000000..6b3ea24 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/excelVO.vm @@ -0,0 +1,43 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#break +#end +#end +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; +#foreach ($column in $columns) +#if ("$!column.dictType" != "")## 有设置数据字典 +import ${DictFormatClassName}; +import ${DictConvertClassName}; + +#break +#end +#end + +/** + * ${table.classComment} Excel VO + * + * @author ${table.author} + */ +@Data +public class ${sceneEnum.prefixClass}${table.className}ExcelVO { + +#foreach ($column in $columns) + #if (${column.listOperationResult})##返回字段 + #if ("$!column.dictType" != "")##处理枚举值 + @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class) + @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 + #else + @ExcelProperty("${column.columnComment}") + #end + private ${column.javaType} ${column.javaField}; + + #end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/exportReqVO.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/exportReqVO.vm new file mode 100644 index 0000000..afd583c --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/exportReqVO.vm @@ -0,0 +1,38 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import ${PageParamClassName}; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.listOperation} && ${column.javaType} == "Date")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end +## 字段模板 +#macro(columnTpl $prefix $prefixStr) + @ApiModelProperty(value = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; +#end + +@ApiModel(value = "${sceneEnum.name} - ${table.classComment} Excel 导出 Request VO", description = "参数和 ${table.className}PageReqVO 是一致的") +@Data +public class ${sceneEnum.prefixClass}${table.className}ExportReqVO { + +#foreach ($column in $columns) +#if (${column.listOperation})##查询操作 +#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 + @ApiModelProperty(value = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private ${column.javaType}[] ${column.javaField}; +#else##情况二,非 Between 的时间 + #columnTpl('', '') +#end + +#end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/pageReqVO.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/pageReqVO.vm new file mode 100644 index 0000000..df2be70 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/pageReqVO.vm @@ -0,0 +1,40 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import ${PageParamClassName}; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.listOperation} && ${column.javaType} == "Date")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end +## 字段模板 +#macro(columnTpl $prefix $prefixStr) + @ApiModelProperty(value = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; +#end + +@ApiModel("${sceneEnum.name} - ${table.classComment}分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}PageReqVO extends PageParam { + +#foreach ($column in $columns) +#if (${column.listOperation})##查询操作 +#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 + @ApiModelProperty(value = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private ${column.javaType}[] ${column.javaField}; +#else##情况二,非 Between 的时间 + #columnTpl('', '') +#end + +#end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/respVO.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/respVO.vm new file mode 100644 index 0000000..4034b6f --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/respVO.vm @@ -0,0 +1,20 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("${sceneEnum.name} - ${table.classComment} Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}RespVO extends ${sceneEnum.prefixClass}${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.listOperationResult} && (!${column.createOperation} || !${column.updateOperation}))##不是通用字段 + @ApiModelProperty(value = "${column.columnComment}"#if (!${column.nullable}), required = true#end#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType} ${column.javaField}; + +#end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/updateReqVO.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/updateReqVO.vm new file mode 100644 index 0000000..c6057d5 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/controller/vo/updateReqVO.vm @@ -0,0 +1,30 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.updateOperation} && (!${column.createOperation} || !${column.listOperationResult}) + && ${column.javaType} == "Date")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end + +@ApiModel("${sceneEnum.name} - ${table.classComment}更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}UpdateReqVO extends ${sceneEnum.prefixClass}${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.updateOperation} && (!${column.createOperation} || !${column.listOperationResult}))##不是通用字段 + #parse("codegen/java/controller/vo/_column.vm") + +#end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/convert/convert.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/convert/convert.vm new file mode 100644 index 0000000..6176e0f --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/convert/convert.vm @@ -0,0 +1,34 @@ +package ${basePackage}.module.${table.moduleName}.convert.${table.businessName}; + +import java.util.*; + +import ${PageResultClassName}; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; + +/** + * ${table.classComment} Convert + * + * @author ${table.author} + */ +@Mapper +public interface ${table.className}Convert { + + ${table.className}Convert INSTANCE = Mappers.getMapper(${table.className}Convert.class); + + ${table.className}DO convert(${sceneEnum.prefixClass}${table.className}CreateReqVO bean); + + ${table.className}DO convert(${sceneEnum.prefixClass}${table.className}UpdateReqVO bean); + + ${sceneEnum.prefixClass}${table.className}RespVO convert(${table.className}DO bean); + + List<${sceneEnum.prefixClass}${table.className}RespVO> convertList(List<${table.className}DO> list); + + PageResult<${sceneEnum.prefixClass}${table.className}RespVO> convertPage(PageResult<${table.className}DO> page); + + List<${sceneEnum.prefixClass}${table.className}ExcelVO> convertList02(List<${table.className}DO> list); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/dal/do.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/dal/do.vm new file mode 100644 index 0000000..4abae15 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/dal/do.vm @@ -0,0 +1,45 @@ +package ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}; + +import lombok.*; +import java.util.*; +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#break +#end +#end +import com.baomidou.mybatisplus.annotation.*; +import ${BaseDOClassName}; + +/** + * ${table.classComment} DO + * + * @author ${table.author} + */ +@TableName("${table.tableName.toLowerCase()}") +@KeySequence("${table.tableName.toLowerCase()}_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ${table.className}DO extends BaseDO { + +#foreach ($column in $columns) +#if (!${baseDOFields.contains(${column.javaField})})##排除 BaseDO 的字段 + /** + * ${column.columnComment} + #if ("$!column.dictType" != "")##处理枚举值 + * + * 枚举 {@link TODO ${column.dictType} 对应的类} + #end + */ + #if (${column.primaryKey})##处理主键 + @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end + #end + private ${column.javaType} ${column.javaField}; +#end +#end + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/dal/mapper.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/dal/mapper.vm new file mode 100644 index 0000000..615ae33 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/dal/mapper.vm @@ -0,0 +1,66 @@ +package ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}; + +import java.util.*; + +import ${PageResultClassName}; +import ${QueryWrapperClassName}; +import ${BaseMapperClassName}; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import org.apache.ibatis.annotations.Mapper; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; + +## 字段模板 +#macro(listCondition) +#foreach ($column in $columns) +#if (${column.listOperation}) +#set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 +#if (${column.listOperationCondition} == "=")##情况一,= 的时候 + .eqIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "!=")##情况二,!= 的时候 + .neIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == ">")##情况三,> 的时候 + .gtIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == ">=")##情况四,>= 的时候 + .geIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "<")##情况五,< 的时候 + .ltIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "<=")##情况五,<= 的时候 + .leIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "LIKE")##情况七,Like 的时候 + .likeIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "BETWEEN")##情况八,Between 的时候 + .betweenIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#end +#end +#end +/** + * ${table.classComment} Mapper + * + * @author ${table.author} + */ +@Mapper +public interface ${table.className}Mapper extends BaseMapperX<${table.className}DO> { + + default PageResult<${table.className}DO> selectPage(${sceneEnum.prefixClass}${table.className}PageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX<${table.className}DO>() + #listCondition() + .orderByDesc(${table.className}DO::getId));## 大多数情况下,id 倒序 + + } + + default List<${table.className}DO> selectList(${sceneEnum.prefixClass}${table.className}ExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX<${table.className}DO>() + #listCondition() + .orderByDesc(${table.className}DO::getId));## 大多数情况下,id 倒序 + + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/dal/mapper.xml.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/dal/mapper.xml.vm new file mode 100644 index 0000000..d930db9 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/dal/mapper.xml.vm @@ -0,0 +1,12 @@ + + + + + + + diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/enums/errorcode.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/enums/errorcode.vm new file mode 100644 index 0000000..e7f350d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/enums/errorcode.vm @@ -0,0 +1,3 @@ +// TODO 待办:请将下面的错误码复制到 joju-module-${table.moduleName}-api 模块的 ErrorCodeConstants 类中。注意,请给“TODO 补充编号”设置一个错误码编号!!! +// ========== ${table.classComment} TODO 补充编号 ========== +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${table.classComment}不存在"); diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/service/service.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/service/service.vm new file mode 100644 index 0000000..b8c6376 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/service/service.vm @@ -0,0 +1,70 @@ +package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; + +import java.util.*; +import javax.validation.*; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${PageResultClassName}; + +/** + * ${table.classComment} Service 接口 + * + * @author ${table.author} + */ +public interface ${table.className}Service { + + /** + * 创建${table.classComment} + * + * @param createReqVO 创建信息 + * @return 编号 + */ + ${primaryColumn.javaType} create${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}CreateReqVO createReqVO); + + /** + * 更新${table.classComment} + * + * @param updateReqVO 更新信息 + */ + void update${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}UpdateReqVO updateReqVO); + + /** + * 删除${table.classComment} + * + * @param id 编号 + */ + void delete${simpleClassName}(${primaryColumn.javaType} id); + + /** + * 获得${table.classComment} + * + * @param id 编号 + * @return ${table.classComment} + */ + ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id); + + /** + * 获得${table.classComment}列表 + * + * @param ids 编号 + * @return ${table.classComment}列表 + */ + List<${table.className}DO> get${simpleClassName}List(Collection<${primaryColumn.javaType}> ids); + + /** + * 获得${table.classComment}分页 + * + * @param pageReqVO 分页查询 + * @return ${table.classComment}分页 + */ + PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO); + + /** + * 获得${table.classComment}列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return ${table.classComment}列表 + */ + List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ExportReqVO exportReqVO); + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm new file mode 100644 index 0000000..85dfa0a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm @@ -0,0 +1,82 @@ +package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${PageResultClassName}; + +import ${basePackage}.module.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; +import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; + +import static ${ServiceExceptionUtilClassName}.exception; +import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; + +/** + * ${table.classComment} Service 实现类 + * + * @author ${table.author} + */ +@Service +@Validated +public class ${table.className}ServiceImpl implements ${table.className}Service { + + @Resource + private ${table.className}Mapper ${classNameVar}Mapper; + + @Override + public ${primaryColumn.javaType} create${simpleClassName}(${sceneEnum.prefixClass}${table.className}CreateReqVO createReqVO) { + // 插入 + ${table.className}DO ${classNameVar} = ${table.className}Convert.INSTANCE.convert(createReqVO); + ${classNameVar}Mapper.insert(${classNameVar}); + // 返回 + return ${classNameVar}.getId(); + } + + @Override + public void update${simpleClassName}(${sceneEnum.prefixClass}${table.className}UpdateReqVO updateReqVO) { + // 校验存在 + this.validate${simpleClassName}Exists(updateReqVO.getId()); + // 更新 + ${table.className}DO updateObj = ${table.className}Convert.INSTANCE.convert(updateReqVO); + ${classNameVar}Mapper.updateById(updateObj); + } + + @Override + public void delete${simpleClassName}(${primaryColumn.javaType} id) { + // 校验存在 + this.validate${simpleClassName}Exists(id); + // 删除 + ${classNameVar}Mapper.deleteById(id); + } + + private void validate${simpleClassName}Exists(${primaryColumn.javaType} id) { + if (${classNameVar}Mapper.selectById(id) == null) { + throw exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + } + + @Override + public ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id) { + return ${classNameVar}Mapper.selectById(id); + } + + @Override + public List<${table.className}DO> get${simpleClassName}List(Collection<${primaryColumn.javaType}> ids) { + return ${classNameVar}Mapper.selectBatchIds(ids); + } + + @Override + public PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) { + return ${classNameVar}Mapper.selectPage(pageReqVO); + } + + @Override + public List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ExportReqVO exportReqVO) { + return ${classNameVar}Mapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm new file mode 100644 index 0000000..1b5c60a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm @@ -0,0 +1,163 @@ +package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import ${baseFrameworkPackage}.test.core.ut.BaseDbUnitTest; + +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; +import ${PageResultClassName}; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; + +import static cn.hutool.core.util.RandomUtil.*; +import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; +import static ${baseFrameworkPackage}.test.core.util.AssertUtils.*; +import static ${baseFrameworkPackage}.test.core.util.RandomUtils.*; +import static ${ObjectUtilsClassName}.*; +import static ${DateUtilsClassName}.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +## 字段模板 +#macro(getPageCondition $VO) + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class, o -> { // 等会查询到 + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + o.set$JavaField(null); + #end + #end + }); + ${classNameVar}Mapper.insert(db${simpleClassName}); + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + // 测试 ${column.javaField} 不匹配 + ${classNameVar}Mapper.insert(cloneIgnoreId(db${simpleClassName}, o -> o.set$JavaField(null))); + #end + #end + // 准备参数 + ${sceneEnum.prefixClass}${table.className}${VO} reqVO = new ${sceneEnum.prefixClass}${table.className}${VO}(); + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + #if (${column.listOperationCondition} == "BETWEEN")## BETWEEN 的情况 + reqVO.set${JavaField}((new Date[]{})); + #else + reqVO.set$JavaField(null); + #end + #end + #end +#end +/** +* {@link ${table.className}ServiceImpl} 的单元测试类 +* +* @author ${table.author} +*/ +@Import(${table.className}ServiceImpl.class) +public class ${table.className}ServiceImplTest extends BaseDbUnitTest { + + @Resource + private ${table.className}ServiceImpl ${classNameVar}Service; + + @Resource + private ${table.className}Mapper ${classNameVar}Mapper; + + @Test + public void testCreate${simpleClassName}_success() { + // 准备参数 + ${sceneEnum.prefixClass}${table.className}CreateReqVO reqVO = randomPojo(${sceneEnum.prefixClass}${table.className}CreateReqVO.class); + + // 调用 + ${primaryColumn.javaType} ${classNameVar}Id = ${classNameVar}Service.create${simpleClassName}(reqVO); + // 断言 + assertNotNull(${classNameVar}Id); + // 校验记录的属性是否正确 + ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(${classNameVar}Id); + assertPojoEquals(reqVO, ${classNameVar}); + } + + @Test + public void testUpdate${simpleClassName}_success() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); + ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 + // 准备参数 + ${sceneEnum.prefixClass}${table.className}UpdateReqVO reqVO = randomPojo(${sceneEnum.prefixClass}${table.className}UpdateReqVO.class, o -> { + o.setId(db${simpleClassName}.getId()); // 设置更新的 ID + }); + + // 调用 + ${classNameVar}Service.update${simpleClassName}(reqVO); + // 校验是否更新正确 + ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, ${classNameVar}); + } + + @Test + public void testUpdate${simpleClassName}_notExists() { + // 准备参数 + ${sceneEnum.prefixClass}${table.className}UpdateReqVO reqVO = randomPojo(${sceneEnum.prefixClass}${table.className}UpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> ${classNameVar}Service.update${simpleClassName}(reqVO), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + + @Test + public void testDelete${simpleClassName}_success() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); + ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 + // 准备参数 + ${primaryColumn.javaType} id = db${simpleClassName}.getId(); + + // 调用 + ${classNameVar}Service.delete${simpleClassName}(id); + // 校验数据不存在了 + assertNull(${classNameVar}Mapper.selectById(id)); + } + + @Test + public void testDelete${simpleClassName}_notExists() { + // 准备参数 + ${primaryColumn.javaType} id = random${primaryColumn.javaType}Id(); + + // 调用, 并断言异常 + assertServiceException(() -> ${classNameVar}Service.delete${simpleClassName}(id), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGet${simpleClassName}Page() { + #getPageCondition("PageReqVO") + + // 调用 + PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(db${simpleClassName}, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGet${simpleClassName}List() { + #getPageCondition("ExportReqVO") + + // 调用 + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(db${simpleClassName}, list.get(0)); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/sql/h2.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/sql/h2.vm new file mode 100644 index 0000000..a11d5d9 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/sql/h2.vm @@ -0,0 +1,35 @@ +-- 将该建表 SQL 语句,添加到 joju-module-${table.moduleName}-biz 模块的 test/resources/sql/create_tables.sql 文件里 +CREATE TABLE IF NOT EXISTS "${table.tableName.toLowerCase()}" ( +#foreach ($column in $columns) +#if (${column.javaType} == 'Long') + #set ($dataType='bigint') +#elseif (${column.javaType} == 'Integer') + #set ($dataType='int') +#elseif (${column.javaType} == 'Boolean') + #set ($dataType='bit') +#elseif (${column.javaType} == 'Date') + #set ($dataType='datetime') +#else + #set ($dataType='varchar') +#end + #if (${column.primaryKey})##处理主键 + "${column.javaField}"#if (${column.javaType} == 'String') ${dataType} NOT NULL#else ${dataType} NOT NULL GENERATED BY DEFAULT AS IDENTITY#end, + #else + #if (${column.columnName} == 'create_time') + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + #elseif (${column.columnName} == 'update_time') + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + #elseif (${column.columnName} == 'creator' || ${column.columnName} == 'updater') + "${column.columnName}" ${dataType} DEFAULT '', + #elseif (${column.columnName} == 'deleted') + "deleted" bit NOT NULL DEFAULT FALSE, + #else + "${column.columnName.toLowerCase()}" ${dataType}#if (${column.nullable} == false) NOT NULL#end, + #end + #end +#end + PRIMARY KEY ("${primaryColumn.columnName.toLowerCase()}") +) COMMENT '${table.tableComment}'; + +-- 将该删表 SQL 语句,添加到 joju-module-${table.moduleName}-biz 模块的 test/resources/sql/clean.sql 文件里 +DELETE FROM "${table.tableName}"; diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/sql/sql.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/sql/sql.vm new file mode 100644 index 0000000..0edbdc1 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/sql/sql.vm @@ -0,0 +1,28 @@ +-- 菜单 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, + '${simpleClassName_strikeCase}', '', '${table.moduleName}/${classNameVar}/index', 0 +); + +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +#set ($functionNames = ['查询', '创建', '更新', '删除', '导出']) +#set ($functionOps = ['query', 'create', 'update', 'delete', 'export']) +#foreach ($functionName in $functionNames) +#set ($index = $foreach.count - 1) +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, @parentId, + '', '', '', 0 +); +#end diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue/api/api.js.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue/api/api.js.vm new file mode 100644 index 0000000..5e9da32 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue/api/api.js.vm @@ -0,0 +1,55 @@ +import request from '@/utils/request' +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") + +// 创建${table.classComment} +export function create${simpleClassName}(data) { + return request({ + url: '${baseURL}/create', + method: 'post', + data: data + }) +} + +// 更新${table.classComment} +export function update${simpleClassName}(data) { + return request({ + url: '${baseURL}/update', + method: 'put', + data: data + }) +} + +// 删除${table.classComment} +export function delete${simpleClassName}(id) { + return request({ + url: '${baseURL}/delete?id=' + id, + method: 'delete' + }) +} + +// 获得${table.classComment} +export function get${simpleClassName}(id) { + return request({ + url: '${baseURL}/get?id=' + id, + method: 'get' + }) +} + +// 获得${table.classComment}分页 +export function get${simpleClassName}Page(query) { + return request({ + url: '${baseURL}/page', + method: 'get', + params: query + }) +} + +// 导出${table.classComment} Excel +export function export${simpleClassName}Excel(query) { + return request({ + url: '${baseURL}/export-excel', + method: 'get', + params: query, + responseType: 'blob' + }) +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue/views/index.vue.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue/views/index.vue.vm new file mode 100644 index 0000000..95f7d66 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue/views/index.vue.vm @@ -0,0 +1,369 @@ + + + diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm new file mode 100644 index 0000000..69da814 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue3/api/api.ts.vm @@ -0,0 +1,35 @@ +import { useAxios } from '@/hooks/web/useAxios' +import { ${simpleClassName}VO,${simpleClassName}PageReqVO,${simpleClassName}ExcelReqVO } from './types' + +const request = useAxios() + +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") +// 查询${table.classComment}列表 +export const get${simpleClassName}PageApi = async (params: ${simpleClassName}PageReqVO) => { + return await request.get({ url: '${baseURL}/page', params }) +} + +// 查询${table.classComment}详情 +export const get${simpleClassName}Api = async (id: number) => { + return await request.get({ url: '${baseURL}/get?id=' + id }) +} + +// 新增${table.classComment} +export const create${simpleClassName}Api = async (data: ${simpleClassName}VO) => { + return await request.post({ url: '${baseURL}/create', data }) +} + +// 修改${table.classComment} +export const update${simpleClassName}Api = async (data: ${simpleClassName}VO) => { + return await request.put({ url: '${baseURL}/update', data }) +} + +// 删除${table.classComment} +export const delete${simpleClassName}Api = async (id: number) => { + return await request.delete({ url: '${baseURL}/delete?id=' + id }) +} + +// 导出${table.classComment} Excel +export const export${simpleClassName}Api = async (params: ${simpleClassName}ExcelReqVO) => { + return await request.download({ url: '${baseURL}/export-excel', params }) +} diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue3/api/types.ts.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue3/api/types.ts.vm new file mode 100644 index 0000000..d5b5d93 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue3/api/types.ts.vm @@ -0,0 +1,35 @@ +export type ${simpleClassName}VO = { +#foreach ($column in $columns) +#if ($column.createOperation || $column.updateOperation) +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer") + ${column.javaField}: number +#else + ${column.javaField}: ${column.javaType.toLowerCase()} +#end +#end +#end +} + +export type ${simpleClassName}PageReqVO = { +#foreach ($column in $columns) +#if (${column.listOperation})##查询操作 +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer") + ${column.javaField}: number +#else + ${column.javaField}: ${column.javaType.toLowerCase()} +#end +#end +#end +} + +export type ${simpleClassName}ExcelReqVO = { +#foreach ($column in $columns) +#if (${column.listOperation})##查询操作 +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer") + ${column.javaField}: number +#else + ${column.javaField}: ${column.javaType.toLowerCase()} +#end +#end +#end +} \ No newline at end of file diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue3/views/data.ts.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue3/views/data.ts.vm new file mode 100644 index 0000000..965fe49 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue3/views/data.ts.vm @@ -0,0 +1,111 @@ +import { reactive } from 'vue' +import { useI18n } from '@/hooks/web/useI18n' +import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas' +import { DICT_TYPE } from '@/utils/dict' +const { t } = useI18n() // 国际化 +// 表单校验 +export const rules = reactive({ +#foreach ($column in $columns) +#if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 +#set($comment=$column.columnComment) + $column.javaField: [{ required: true, message: "${comment}不能为空", trigger: #if($column.htmlType == "select")"change"#else"blur"#end }], +#end +#end +}) +// CrudSchema +const crudSchemas = reactive([ +#foreach($column in $columns) + #if ($column.listOperation || $column.listOperationResult || $column.createOperation || $column.updateOperation) + #set ($dictType = $column.dictType) + { + label: '${column.columnComment}', + field: '${column.javaField}', + #if ("" != $dictType)## 有数据字典 + dictType: DICT_TYPE.$dictType.toUpperCase(), + #end + #if($column.primaryKey) + type: 'index', + form: { + show: false + }, + detail: { + show: false + } + #else + #if (!$column.createOperation && !$column.updateOperation) + form: { + false + }, + #elseif(!("" != $column.dictType)) + form: { + show: true, + #if ($column.htmlType == "datetime")## 时间框 + component: 'DatePicker', + componentProps: { + type: 'datetime', + valueFormat: 'YYYY-MM-DD HH:mm:ss' + } + #elseif($column.htmlType == "editor")## 文本编辑器 + component: 'Editor', + colProps: { + span: 24 + }, + componentProps: { + valueHtml: '' + } + #elseif($column.htmlType == "textarea")## 文本框 + component: 'Input', + componentProps: { + type: 'textarea', + rows: 4 + }, + colProps: { + span: 24 + } + #end + }, + #end + #if ($column.listOperationResult) + search: { + #if($column.htmlType == "input") + show: true + #else + #if($column.htmlType == "datetime") + show: true, + component: 'DatePicker', + componentProps: { + type: 'datetimerange', + valueFormat: 'YYYY-MM-DD HH:mm:ss' + } + #elseif($column.htmlType == "select" || $column.htmlType == "radio") + #if ("" == $dictType)## 没有数据字典 + show: true, + component: 'Select', + componentProps: { + option: [{'','请选择字典生成'}] + } + #else + show: true + #end + #end + #end + } + #end + #end + }, + #end +#end + { + label: t('table.action'), + field: 'action', + width: '240px', + form: { + show: false + }, + detail: { + show: false + } + } +]) + +export const { allSchemas } = useCrudSchemas(crudSchemas) \ No newline at end of file diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm new file mode 100644 index 0000000..c497a18 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm @@ -0,0 +1,204 @@ + + + diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/file/erweima.jpg b/joju-module-infra/joju-module-infra-biz/src/main/resources/file/erweima.jpg new file mode 100644 index 0000000..1447283 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/src/main/resources/file/erweima.jpg differ diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/mapper/test/TestDemoMapper.xml b/joju-module-infra/joju-module-infra-biz/src/main/resources/mapper/test/TestDemoMapper.xml new file mode 100644 index 0000000..140c4bd --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/main/resources/mapper/test/TestDemoMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/joju-module-infra/joju-module-infra-biz/src/main/resources/mapper/占位 b/joju-module-infra/joju-module-infra-biz/src/main/resources/mapper/占位 new file mode 100644 index 0000000..e69de29 diff --git a/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/dal/mysql/codegen/SchemaColumnMapperTest.java b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/dal/mysql/codegen/SchemaColumnMapperTest.java new file mode 100644 index 0000000..00ffb8b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/dal/mysql/codegen/SchemaColumnMapperTest.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.infra.dal.mysql.codegen; + +import com.jojubanking.boot.module.tool.dal.dataobject.codegen.SchemaColumnDO; +import com.jojubanking.boot.module.tool.test.BaseDbUnitTest; +import org.junit.jupiter.api.Test; + +import javax.annotation.Resource; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class SchemaColumnMapperTest extends BaseDbUnitTest { + + @Resource + private SchemaColumnMapper schemaColumnMapper; + + @Test + public void testSelectListByTableName() { + List columns = schemaColumnMapper.selectListByTableName("", "inf_config"); + assertTrue(columns.size() > 0); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/dal/mysql/package-info.java b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/dal/mysql/package-info.java new file mode 100644 index 0000000..c7f9331 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/dal/mysql/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.jojubanking.boot.module.infra.dal.mysql; diff --git a/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/dal/package-info.java b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/dal/package-info.java new file mode 100644 index 0000000..2a33100 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/dal/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.jojubanking.boot.module.infra.dal; diff --git a/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/service/codegen/CodegenEngineTest.java b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/service/codegen/CodegenEngineTest.java new file mode 100644 index 0000000..d2f83c4 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/service/codegen/CodegenEngineTest.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.infra.service.codegen; + +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenTableDO; +import com.jojubanking.boot.module.infra.dal.mysql.codegen.CodegenColumnMapper; +import com.jojubanking.boot.module.infra.dal.mysql.codegen.CodegenTableMapper; +import com.jojubanking.boot.module.infra.service.codegen.inner.CodegenEngine; +import com.jojubanking.boot.module.infra.test.BaseDbUnitTest; +import org.junit.jupiter.api.Test; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +public class CodegenEngineTest extends BaseDbUnitTest { + + @Resource + private CodegenTableMapper codegenTableMapper; + @Resource + private CodegenColumnMapper codegenColumnMapper; + + @Resource + private CodegenEngine codegenEngine; + + @Test + public void testExecute() { + CodegenTableDO table = codegenTableMapper.selectById(20); + List columns = codegenColumnMapper.selectListByTableId(table.getId()); + Map result = codegenEngine.execute(table, columns); + result.forEach((s, s2) -> System.out.println(s2)); +// System.out.println(result.get("vue/views/system/test/index.vue")); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/service/codegen/CodegenSQLParserTest.java b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/service/codegen/CodegenSQLParserTest.java new file mode 100644 index 0000000..a0451f8 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/service/codegen/CodegenSQLParserTest.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.infra.service.codegen; + +import com.jojubanking.boot.module.infra.service.codegen.inner.CodegenSQLParser; +import com.jojubanking.boot.module.infra.test.BaseDbUnitTest; +import org.junit.jupiter.api.Test; + +public class CodegenSQLParserTest extends BaseDbUnitTest { + + @Test + public void testParse() { + String sql = "CREATE TABLE `infra_test_demo` (\n" + + " `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',\n" + + " `name` varchar(100) NOT NULL DEFAULT '' COMMENT '名字',\n" + + " `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态',\n" + + " `type` tinyint(4) NOT NULL COMMENT '类型',\n" + + " `category` tinyint(4) NOT NULL COMMENT '分类',\n" + + " `remark` varchar(500) DEFAULT NULL COMMENT '备注',\n" + + " `create_by` varchar(64) DEFAULT '' COMMENT '创建者',\n" + + " `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n" + + " `update_by` varchar(64) DEFAULT '' COMMENT '更新者',\n" + + " `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',\n" + + " `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',\n" + + " PRIMARY KEY (`id`) USING BTREE\n" + + ") ENGINE=InnoDB AUTO_INCREMENT=108 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表';"; + CodegenSQLParser.parse(sql); + // TODO TW:后续完善断言 + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/service/codegen/CodegenServiceImplTest.java b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/service/codegen/CodegenServiceImplTest.java new file mode 100644 index 0000000..749b383 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/service/codegen/CodegenServiceImplTest.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.infra.service.codegen; + +import com.jojubanking.boot.module.infra.test.BaseDbUnitTest; +import org.junit.jupiter.api.Test; + +import javax.annotation.Resource; + +class CodegenServiceImplTest extends BaseDbUnitTest { + + @Resource + private CodegenServiceImpl codegenService; + + @Test + public void tetCreateCodegenTable() { + codegenService.createCodegen(0L, "infra_test_demo"); +// infraCodegenService.createCodegenTable("infra_codegen_table"); +// infraCodegenService.createCodegen("infra_codegen_column"); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/service/package-info.java b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/service/package-info.java new file mode 100644 index 0000000..59d158f --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/service/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.jojubanking.boot.module.infra.service; diff --git a/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/test/BaseDbAndRedisIntegrationTest.java b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/test/BaseDbAndRedisIntegrationTest.java new file mode 100644 index 0000000..9ebb218 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/test/BaseDbAndRedisIntegrationTest.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.infra.test; + +import com.jojubanking.boot.framework.datasource.config.JojuDataSourceAutoConfiguration; +import com.jojubanking.boot.framework.mybatis.config.JojuMybatisAutoConfiguration; +import com.jojubanking.boot.framework.redis.config.JojuRedisAutoConfiguration; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisIntegrationTest.Application.class) +@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 +public class BaseDbAndRedisIntegrationTest { + + @Import({ + // DB 配置类 + DynamicDataSourceAutoConfiguration.class, // Dynamic Datasource 配置类 + JojuDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + // MyBatis 配置类 + JojuMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + + // Redis 配置类 + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + JojuRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/test/BaseRedisIntegrationTest.java b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/test/BaseRedisIntegrationTest.java new file mode 100644 index 0000000..59d6837 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test-integration/java/cn/joju/fx/module/infra/test/BaseRedisIntegrationTest.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.infra.test; + +import com.jojubanking.boot.framework.redis.config.JojuRedisAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisIntegrationTest.Application.class) +@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 +public class BaseRedisIntegrationTest { + + @Import({ + // Redis 配置类 + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + JojuRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/DefaultDatabaseQueryTest.java b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/DefaultDatabaseQueryTest.java new file mode 100644 index 0000000..c676892 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/DefaultDatabaseQueryTest.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.infra.service; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.generator.IDatabaseQuery.DefaultDatabaseQuery; +import com.baomidou.mybatisplus.generator.config.DataSourceConfig; +import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; + +import java.util.List; + +public class DefaultDatabaseQueryTest { + + public static void main(String[] args) { +// DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder("jdbc:oracle:thin:@127.0.0.1:1521:xe", +// "root", "123456").build(); + DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder("jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro", + "root", "123456").build(); +// StrategyConfig strategyConfig = new StrategyConfig.Builder().build(); + + ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfig, null, null, null, null); + + DefaultDatabaseQuery query = new DefaultDatabaseQuery(builder); + + long time = System.currentTimeMillis(); + List tableInfos = query.queryTables(); + for (TableInfo tableInfo : tableInfos) { + if (StrUtil.startWithAny(tableInfo.getName().toLowerCase(), "act_", "flw_", "qrtz_")) { + continue; + } + System.out.println(String.format("CREATE SEQUENCE %s_seq MINVALUE 1;", tableInfo.getName())); +// System.out.println(String.format("DELETE FROM %s WHERE deleted = '1';", tableInfo.getName())); + } + System.out.println(tableInfos.size()); + System.out.println(System.currentTimeMillis() - time); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/config/ConfigServiceTest.java b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/config/ConfigServiceTest.java new file mode 100644 index 0000000..deb1fff --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/config/ConfigServiceTest.java @@ -0,0 +1,251 @@ +package com.jojubanking.boot.module.infra.service.config; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.framework.test.core.util.RandomUtils; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.config.ConfigDO; +import com.jojubanking.boot.module.infra.dal.mysql.config.ConfigMapper; +import com.jojubanking.boot.module.infra.enums.config.ConfigTypeEnum; +import com.jojubanking.boot.module.infra.mq.producer.config.ConfigProducer; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.*; + +@Import(ConfigServiceImpl.class) +public class ConfigServiceTest extends BaseDbUnitTest { + + @Resource + private ConfigServiceImpl configService; + + @Resource + private ConfigMapper configMapper; + @MockBean + private ConfigProducer configProducer; + + @Test + public void testCreateConfig_success() { + // 准备参数 + ConfigCreateReqVO reqVO = randomPojo(ConfigCreateReqVO.class); + + // 调用 + Long configId = configService.createConfig(reqVO); + // 断言 + assertNotNull(configId); + // 校验记录的属性是否正确 + ConfigDO config = configMapper.selectById(configId); + assertPojoEquals(reqVO, config); + Assertions.assertEquals(ConfigTypeEnum.CUSTOM.getType(), config.getType()); + // 校验调用 + verify(configProducer, times(1)).sendConfigRefreshMessage(); + } + + @Test + public void testUpdateConfig_success() { + // mock 数据 + ConfigDO dbConfig = randomConfigDO(); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + ConfigUpdateReqVO reqVO = randomPojo(ConfigUpdateReqVO.class, o -> { + o.setId(dbConfig.getId()); // 设置更新的 ID + }); + + // 调用 + configService.updateConfig(reqVO); + // 校验是否更新正确 + ConfigDO config = configMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, config); + // 校验调用 + verify(configProducer, times(1)).sendConfigRefreshMessage(); + } + + @Test + public void testDeleteConfig_success() { + // mock 数据 + ConfigDO dbConfig = randomConfigDO(o -> { + o.setType(ConfigTypeEnum.CUSTOM.getType()); // 只能删除 CUSTOM 类型 + }); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbConfig.getId(); + + // 调用 + configService.deleteConfig(id); + // 校验数据不存在了 + assertNull(configMapper.selectById(id)); + // 校验调用 + verify(configProducer, times(1)).sendConfigRefreshMessage(); + } + + @Test + public void testDeleteConfig_canNotDeleteSystemType() { + // mock 数据 + ConfigDO dbConfig = randomConfigDO(o -> { + o.setType(ConfigTypeEnum.SYSTEM.getType()); // SYSTEM 不允许删除 + }); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbConfig.getId(); + + // 调用, 并断言异常 + assertServiceException(() -> configService.deleteConfig(id), CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); + } + + @Test + public void testCheckConfigExists_success() { + // mock 数据 + ConfigDO dbConfigDO = randomConfigDO(); + configMapper.insert(dbConfigDO);// @Sql: 先插入出一条存在的数据 + + // 调用成功 + configService.checkConfigExists(dbConfigDO.getId()); + } + + @Test + public void testCheckConfigExist_notExists() { + assertServiceException(() -> configService.checkConfigExists(randomLongId()), CONFIG_NOT_EXISTS); + } + + @Test + public void testCheckConfigKeyUnique_success() { + // 调用,成功 + configService.checkConfigKeyUnique(randomLongId(), randomString()); + } + + @Test + public void testCheckConfigKeyUnique_keyDuplicateForCreate() { + // 准备参数 + String key = randomString(); + // mock 数据 + configMapper.insert(randomConfigDO(o -> o.setConfigKey(key))); + + // 调用,校验异常 + assertServiceException(() -> configService.checkConfigKeyUnique(null, key), + CONFIG_KEY_DUPLICATE); + } + + @Test + public void testCheckConfigKeyUnique_keyDuplicateForUpdate() { + // 准备参数 + Long id = randomLongId(); + String key = randomString(); + // mock 数据 + configMapper.insert(randomConfigDO(o -> o.setConfigKey(key))); + + // 调用,校验异常 + assertServiceException(() -> configService.checkConfigKeyUnique(id, key), + CONFIG_KEY_DUPLICATE); + } + + @Test + public void testGetConfigPage() { + // mock 数据 + ConfigDO dbConfig = randomConfigDO(o -> { // 等会查询到 + o.setName("芋艿"); + o.setConfigKey("yunai"); + o.setType(ConfigTypeEnum.SYSTEM.getType()); + o.setCreateTime(buildTime(2021, 2, 1)); + }); + configMapper.insert(dbConfig); + // 测试 name 不匹配 + configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setName("土豆"))); + // 测试 key 不匹配 + configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setConfigKey("tudou"))); + // 测试 type 不匹配 + configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setType(ConfigTypeEnum.CUSTOM.getType()))); + // 测试 createTime 不匹配 + configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + ConfigPageReqVO reqVO = new ConfigPageReqVO(); + reqVO.setName("艿"); + reqVO.setKey("nai"); + reqVO.setType(ConfigTypeEnum.SYSTEM.getType()); + reqVO.setCreateTime((new Date[]{buildTime(2021, 1, 15),buildTime(2021, 2, 15)})); + + // 调用 + PageResult pageResult = configService.getConfigPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbConfig, pageResult.getList().get(0)); + } + + @Test + public void testGetConfigList() { + // mock 数据 + ConfigDO dbConfig = randomConfigDO(o -> { // 等会查询到 + o.setName("芋艿"); + o.setConfigKey("yunai"); + o.setType(ConfigTypeEnum.SYSTEM.getType()); + o.setCreateTime(buildTime(2021, 2, 1)); + }); + configMapper.insert(dbConfig); + // 测试 name 不匹配 + configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setName("土豆"))); + // 测试 key 不匹配 + configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setConfigKey("tudou"))); + // 测试 type 不匹配 + configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setType(ConfigTypeEnum.CUSTOM.getType()))); + // 测试 createTime 不匹配 + configMapper.insert(ObjectUtils.cloneIgnoreId(dbConfig, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + ConfigExportReqVO reqVO = new ConfigExportReqVO(); + reqVO.setName("艿"); + reqVO.setKey("nai"); + reqVO.setType(ConfigTypeEnum.SYSTEM.getType()); + reqVO.setCreateTime((new Date[]{buildTime(2021, 1, 15),buildTime(2021, 2, 15)})); + + // 调用 + List list = configService.getConfigList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbConfig, list.get(0)); + } + + @Test + public void testGetConfigByKey() { + // mock 数据 + ConfigDO dbConfig = randomConfigDO(); + configMapper.insert(dbConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + String key = dbConfig.getConfigKey(); + + // 调用 + ConfigDO config = configService.getConfigByKey(key); + // 断言 + assertNotNull(config); + assertPojoEquals(dbConfig, config); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static ConfigDO randomConfigDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setType(randomEle(ConfigTypeEnum.values()).getType()); // 保证 key 的范围 + }; + return RandomUtils.randomPojo(ConfigDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/db/DataSourceConfigServiceImplTest.java b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/db/DataSourceConfigServiceImplTest.java new file mode 100644 index 0000000..0a0898a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/db/DataSourceConfigServiceImplTest.java @@ -0,0 +1,147 @@ +package com.jojubanking.boot.module.infra.service.db; + +import cn.hutool.core.util.ReflectUtil; +import com.jojubanking.boot.framework.mybatis.core.type.EncryptTypeHandler; +import com.jojubanking.boot.framework.mybatis.core.util.JdbcUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.infra.controller.admin.db.vo.DataSourceConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.db.vo.DataSourceConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.db.DataSourceConfigDO; +import com.jojubanking.boot.module.infra.dal.mysql.db.DataSourceConfigMapper; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; +import org.jasypt.encryption.StringEncryptor; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.stubbing.Answer; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomLongId; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.when; + +/** + * {@link DataSourceConfigServiceImpl} 的单元测试类 + * + * @author TW + */ +@Import(DataSourceConfigServiceImpl.class) +public class DataSourceConfigServiceImplTest extends BaseDbUnitTest { + + @Resource + private DataSourceConfigServiceImpl dataSourceConfigService; + + @Resource + private DataSourceConfigMapper dataSourceConfigMapper; + + @MockBean + private StringEncryptor stringEncryptor; + + @MockBean + private DynamicDataSourceProperties dynamicDataSourceProperties; + + @BeforeEach + public void setUp() { + // mock 一个空实现的 StringEncryptor,避免 EncryptTypeHandler 报错 + ReflectUtil.setFieldValue(EncryptTypeHandler.class, "encryptor", stringEncryptor); + when(stringEncryptor.encrypt(anyString())).then((Answer) invocation -> invocation.getArgument(0)); + when(stringEncryptor.decrypt(anyString())).then((Answer) invocation -> invocation.getArgument(0)); + } + + @Test + public void testCreateDataSourceConfig_success() { + try (MockedStatic databaseUtilsMock = mockStatic(JdbcUtils.class)) { + // 准备参数 + DataSourceConfigCreateReqVO reqVO = randomPojo(DataSourceConfigCreateReqVO.class); + // mock 方法 + databaseUtilsMock.when(() -> JdbcUtils.isConnectionOK(eq(reqVO.getUrl()), + eq(reqVO.getUsername()), eq(reqVO.getPassword()))).thenReturn(true); + + // 调用 + Long dataSourceConfigId = dataSourceConfigService.createDataSourceConfig(reqVO); + // 断言 + assertNotNull(dataSourceConfigId); + // 校验记录的属性是否正确 + DataSourceConfigDO dataSourceConfig = dataSourceConfigMapper.selectById(dataSourceConfigId); + assertPojoEquals(reqVO, dataSourceConfig); + } + } + + @Test + public void testUpdateDataSourceConfig_success() { + try (MockedStatic databaseUtilsMock = mockStatic(JdbcUtils.class)) { + // mock 数据 + DataSourceConfigDO dbDataSourceConfig = randomPojo(DataSourceConfigDO.class); + dataSourceConfigMapper.insert(dbDataSourceConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + DataSourceConfigUpdateReqVO reqVO = randomPojo(DataSourceConfigUpdateReqVO.class, o -> { + o.setId(dbDataSourceConfig.getId()); // 设置更新的 ID + }); + // mock 方法 +// when(stringEncryptor.encrypt(eq(reqVO.getPassword()))).thenReturn("123456"); + databaseUtilsMock.when(() -> JdbcUtils.isConnectionOK(eq(reqVO.getUrl()), + eq(reqVO.getUsername()), eq(reqVO.getPassword()))).thenReturn(true); + + // 调用 + dataSourceConfigService.updateDataSourceConfig(reqVO); + // 校验是否更新正确 + DataSourceConfigDO dataSourceConfig = dataSourceConfigMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, dataSourceConfig); + } + } + + @Test + public void testUpdateDataSourceConfig_notExists() { + // 准备参数 + DataSourceConfigUpdateReqVO reqVO = randomPojo(DataSourceConfigUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> dataSourceConfigService.updateDataSourceConfig(reqVO), DATA_SOURCE_CONFIG_NOT_EXISTS); + } + + @Test + public void testDeleteDataSourceConfig_success() { + // mock 数据 + DataSourceConfigDO dbDataSourceConfig = randomPojo(DataSourceConfigDO.class); + dataSourceConfigMapper.insert(dbDataSourceConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDataSourceConfig.getId(); + + // 调用 + dataSourceConfigService.deleteDataSourceConfig(id); + // 校验数据不存在了 + assertNull(dataSourceConfigMapper.selectById(id)); + } + + @Test + public void testDeleteDataSourceConfig_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> dataSourceConfigService.deleteDataSourceConfig(id), DATA_SOURCE_CONFIG_NOT_EXISTS); + } + + @Test // 测试使用 password 查询,可以查询到数据 + public void testSelectPassword() { + // mock 数据 + DataSourceConfigDO dbDataSourceConfig = randomPojo(DataSourceConfigDO.class); + dataSourceConfigMapper.insert(dbDataSourceConfig);// @Sql: 先插入出一条存在的数据 + + // 调用 + DataSourceConfigDO result = dataSourceConfigMapper.selectOne(DataSourceConfigDO::getPassword, + EncryptTypeHandler.encrypt(dbDataSourceConfig.getPassword())); + System.out.println(result); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImplTest.java b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImplTest.java new file mode 100644 index 0000000..3bfaee1 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImplTest.java @@ -0,0 +1,256 @@ +package com.jojubanking.boot.module.infra.service.file; + +import cn.hutool.core.map.MapUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.file.core.client.FileClient; +import com.jojubanking.boot.framework.file.core.client.FileClientConfig; +import com.jojubanking.boot.framework.file.core.client.FileClientFactory; +import com.jojubanking.boot.framework.file.core.client.local.LocalFileClientConfig; +import com.jojubanking.boot.framework.file.core.enums.FileStorageEnum; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileConfigDO; +import com.jojubanking.boot.module.infra.dal.mysql.file.FileConfigMapper; +import com.jojubanking.boot.module.infra.mq.producer.file.FileConfigProducer; +import lombok.Data; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.io.Serializable; +import java.util.Date; +import java.util.Map; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.max; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomLongId; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.FILE_CONFIG_DELETE_FAIL_MASTER; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.FILE_CONFIG_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +/** +* {@link FileConfigServiceImpl} 的单元测试类 +* +* @author TW +*/ +@Import(FileConfigServiceImpl.class) +public class FileConfigServiceImplTest extends BaseDbUnitTest { + + @Resource + private FileConfigServiceImpl fileConfigService; + + @Resource + private FileConfigMapper fileConfigMapper; + + @MockBean + private FileConfigProducer fileConfigProducer; + @MockBean + private Validator validator; + @MockBean + private FileClientFactory fileClientFactory; + + @Test + public void testInitLocalCache() { + // mock 数据 + FileConfigDO configDO1 = randomFileConfigDO().setId(1L).setMaster(true); + fileConfigMapper.insert(configDO1); + FileConfigDO configDO2 = randomFileConfigDO().setId(2L).setMaster(false); + fileConfigMapper.insert(configDO2); + // mock fileClientFactory 获得 master + FileClient masterFileClient = mock(FileClient.class); + when(fileClientFactory.getFileClient(eq(1L))).thenReturn(masterFileClient); + + // 调用 + fileConfigService.initFileClients(); + // 断言 fileClientFactory 调用 + verify(fileClientFactory).createOrUpdateFileClient(eq(1L), + eq(configDO1.getStorage()), eq(configDO1.getConfig())); + verify(fileClientFactory).createOrUpdateFileClient(eq(2L), + eq(configDO2.getStorage()), eq(configDO2.getConfig())); + assertSame(masterFileClient, fileConfigService.getMasterFileClient()); + // 断言 maxUpdateTime 缓存 + assertEquals(max(configDO1.getUpdateTime(), configDO2.getUpdateTime()), + fileConfigService.getMaxUpdateTime()); + } + + @Test + public void testCreateFileConfig_success() { + // 准备参数 + Map config = MapUtil.builder().put("basePath", "/yunai") + .put("domain", "https://www.iocoder.cn").build(); + FileConfigCreateReqVO reqVO = randomPojo(FileConfigCreateReqVO.class, + o -> o.setStorage(FileStorageEnum.LOCAL.getStorage()).setConfig(config)); + + // 调用 + Long fileConfigId = fileConfigService.createFileConfig(reqVO); + // 断言 + assertNotNull(fileConfigId); + // 校验记录的属性是否正确 + FileConfigDO fileConfig = fileConfigMapper.selectById(fileConfigId); + assertPojoEquals(reqVO, fileConfig, "config"); + assertFalse(fileConfig.getMaster()); + assertEquals("/yunai", ((LocalFileClientConfig) fileConfig.getConfig()).getBasePath()); + assertEquals("https://www.iocoder.cn", ((LocalFileClientConfig) fileConfig.getConfig()).getDomain()); + // verify 调用 + verify(fileConfigProducer).sendFileConfigRefreshMessage(); + } + + @Test + public void testUpdateFileConfig_success() { + // mock 数据 + FileConfigDO dbFileConfig = randomPojo(FileConfigDO.class, o -> o.setStorage(FileStorageEnum.LOCAL.getStorage()) + .setConfig(new LocalFileClientConfig().setBasePath("/yunai").setDomain("https://www.iocoder.cn"))); + fileConfigMapper.insert(dbFileConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + FileConfigUpdateReqVO reqVO = randomPojo(FileConfigUpdateReqVO.class, o -> { + o.setId(dbFileConfig.getId()); // 设置更新的 ID + Map config = MapUtil.builder().put("basePath", "/yunai2") + .put("domain", "https://doc.iocoder.cn").build(); + o.setConfig(config); + }); + + // 调用 + fileConfigService.updateFileConfig(reqVO); + // 校验是否更新正确 + FileConfigDO fileConfig = fileConfigMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, fileConfig, "config"); + assertEquals("/yunai2", ((LocalFileClientConfig) fileConfig.getConfig()).getBasePath()); + assertEquals("https://doc.iocoder.cn", ((LocalFileClientConfig) fileConfig.getConfig()).getDomain()); + // verify 调用 + verify(fileConfigProducer).sendFileConfigRefreshMessage(); + } + + @Test + public void testUpdateFileConfig_notExists() { + // 准备参数 + FileConfigUpdateReqVO reqVO = randomPojo(FileConfigUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> fileConfigService.updateFileConfig(reqVO), FILE_CONFIG_NOT_EXISTS); + } + + @Test + public void testUpdateFileConfigMaster_success() { + // mock 数据 + FileConfigDO dbFileConfig = randomFileConfigDO().setMaster(false); + fileConfigMapper.insert(dbFileConfig);// @Sql: 先插入出一条存在的数据 + FileConfigDO masterFileConfig = randomFileConfigDO().setMaster(true); + fileConfigMapper.insert(masterFileConfig);// @Sql: 先插入出一条存在的数据 + + // 调用 + fileConfigService.updateFileConfigMaster(dbFileConfig.getId()); + // 断言数据 + assertTrue(fileConfigMapper.selectById(dbFileConfig.getId()).getMaster()); + assertFalse(fileConfigMapper.selectById(masterFileConfig.getId()).getMaster()); + // verify 调用 + verify(fileConfigProducer).sendFileConfigRefreshMessage(); + } + + @Test + public void testUpdateFileConfigMaster_notExists() { + // 调用, 并断言异常 + assertServiceException(() -> fileConfigService.updateFileConfigMaster(randomLongId()), FILE_CONFIG_NOT_EXISTS); + } + + @Test + public void testDeleteFileConfig_success() { + // mock 数据 + FileConfigDO dbFileConfig = randomFileConfigDO().setMaster(false); + fileConfigMapper.insert(dbFileConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbFileConfig.getId(); + + // 调用 + fileConfigService.deleteFileConfig(id); + // 校验数据不存在了 + assertNull(fileConfigMapper.selectById(id)); + // verify 调用 + verify(fileConfigProducer).sendFileConfigRefreshMessage(); + } + + @Test + public void testDeleteFileConfig_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> fileConfigService.deleteFileConfig(id), FILE_CONFIG_NOT_EXISTS); + } + + @Test + public void testDeleteFileConfig_master() { + // mock 数据 + FileConfigDO dbFileConfig = randomFileConfigDO().setMaster(true); + fileConfigMapper.insert(dbFileConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbFileConfig.getId(); + + // 调用, 并断言异常 + assertServiceException(() -> fileConfigService.deleteFileConfig(id), FILE_CONFIG_DELETE_FAIL_MASTER); + } + + @Test + public void testGetFileConfigPage() { + // mock 数据 + FileConfigDO dbFileConfig = randomFileConfigDO().setName("TW") + .setStorage(FileStorageEnum.LOCAL.getStorage()); + dbFileConfig.setCreateTime(buildTime(2022, 11, 11));// 等会查询到 + fileConfigMapper.insert(dbFileConfig); + // 测试 name 不匹配 + fileConfigMapper.insert(cloneIgnoreId(dbFileConfig, o -> o.setName("源码"))); + // 测试 storage 不匹配 + fileConfigMapper.insert(cloneIgnoreId(dbFileConfig, o -> o.setStorage(FileStorageEnum.DB.getStorage()))); + // 测试 createTime 不匹配 + fileConfigMapper.insert(cloneIgnoreId(dbFileConfig, o -> o.setCreateTime(buildTime(2022, 12, 12)))); + // 准备参数 + FileConfigPageReqVO reqVO = new FileConfigPageReqVO(); + reqVO.setName("芋道"); + reqVO.setStorage(FileStorageEnum.LOCAL.getStorage()); + reqVO.setCreateTime((new Date[]{buildTime(2022, 11, 10),buildTime(2022, 11, 12)})); + + // 调用 + PageResult pageResult = fileConfigService.getFileConfigPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbFileConfig, pageResult.getList().get(0)); + } + + @Test + public void testFileConfig() throws Exception { + // mock 数据 + FileConfigDO dbFileConfig = randomFileConfigDO().setMaster(false); + fileConfigMapper.insert(dbFileConfig);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbFileConfig.getId(); + // mock 获得 Client + FileClient fileClient = mock(FileClient.class); + when(fileClientFactory.getFileClient(eq(id))).thenReturn(fileClient); + when(fileClient.upload(any(), any())).thenReturn("https://www.iocoder.cn"); + + // 调用,并断言 + assertEquals("https://www.iocoder.cn", fileConfigService.testFileConfig(id)); + } + + private FileConfigDO randomFileConfigDO() { + return randomPojo(FileConfigDO.class).setStorage(randomEle(FileStorageEnum.values()).getStorage()) + .setConfig(new EmptyFileClientConfig()); + } + + @Data + public static class EmptyFileClientConfig implements FileClientConfig, Serializable { + + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/file/FileServiceTest.java b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/file/FileServiceTest.java new file mode 100644 index 0000000..9a8e19e --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/file/FileServiceTest.java @@ -0,0 +1,142 @@ +package com.jojubanking.boot.module.infra.service.file; + +import cn.hutool.core.io.resource.ResourceUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.file.core.client.FileClient; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.framework.test.core.util.AssertUtils; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.file.FilePageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileDO; +import com.jojubanking.boot.module.infra.dal.mysql.file.FileMapper; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.same; +import static org.mockito.Mockito.*; + +@Import({FileServiceImpl.class}) +public class FileServiceTest extends BaseDbUnitTest { + + @Resource + private FileService fileService; + + @Resource + private FileMapper fileMapper; + + @MockBean + private FileConfigService fileConfigService; + + @Test + public void testGetFilePage() { + // mock 数据 + FileDO dbFile = randomPojo(FileDO.class, o -> { // 等会查询到 + o.setPath("yunai"); + o.setType("image/jpg"); + o.setCreateTime(buildTime(2021, 1, 15)); + }); + fileMapper.insert(dbFile); + // 测试 path 不匹配 + fileMapper.insert(ObjectUtils.cloneIgnoreId(dbFile, o -> o.setPath("tudou"))); + // 测试 type 不匹配 + fileMapper.insert(ObjectUtils.cloneIgnoreId(dbFile, o -> { + o.setType("image/png"); + })); + // 测试 createTime 不匹配 + fileMapper.insert(ObjectUtils.cloneIgnoreId(dbFile, o -> { + o.setCreateTime(buildTime(2020, 1, 15)); + })); + // 准备参数 + FilePageReqVO reqVO = new FilePageReqVO(); + reqVO.setPath("yunai"); + reqVO.setType("jp"); + reqVO.setCreateTime((new Date[]{buildTime(2021, 1, 10), buildTime(2021, 1, 20)})); + + // 调用 + PageResult pageResult = fileService.getFilePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + AssertUtils.assertPojoEquals(dbFile, pageResult.getList().get(0)); + } + + @Test + public void testCreateFile_success() throws Exception { + // 准备参数 + String path = randomString(); + byte[] content = ResourceUtil.readBytes("file/erweima.jpg"); + // mock Master 文件客户端 + FileClient client = mock(FileClient.class); + when(fileConfigService.getMasterFileClient()).thenReturn(client); + String url = randomString(); + when(client.upload(same(content), same(path))).thenReturn(url); + when(client.getId()).thenReturn(10L); + String name = "单测文件名"; + // 调用 + String result = fileService.createFile(name, path, content); + // 断言 + assertEquals(result, url); + // 校验数据 + FileDO file = fileMapper.selectOne(FileDO::getPath, path); + assertEquals(10L, file.getConfigId()); + assertEquals(path, file.getPath()); + assertEquals(url, file.getUrl()); + assertEquals("image/jpg", file.getType()); + assertEquals(content.length, file.getSize()); + } + + @Test + public void testDeleteFile_success() throws Exception { + // mock 数据 + FileDO dbFile = randomPojo(FileDO.class, o -> o.setConfigId(10L).setPath("tudou.jpg")); + fileMapper.insert(dbFile);// @Sql: 先插入出一条存在的数据 + // mock Master 文件客户端 + FileClient client = mock(FileClient.class); + when(fileConfigService.getFileClient(eq(10L))).thenReturn(client); + // 准备参数 + Long id = dbFile.getId(); + + // 调用 + fileService.deleteFile(id); + // 校验数据不存在了 + assertNull(fileMapper.selectById(id)); + // 校验调用 + verify(client).delete(eq("tudou.jpg")); + } + + @Test + public void testDeleteFile_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> fileService.deleteFile(id), FILE_NOT_EXISTS); + } + + @Test + public void testGetFileContent() throws Exception { + // 准备参数 + Long configId = 10L; + String path = "tudou.jpg"; + // mock 方法 + FileClient client = mock(FileClient.class); + when(fileConfigService.getFileClient(eq(10L))).thenReturn(client); + byte[] content = new byte[]{}; + when(client.getContent(eq("tudou.jpg"))).thenReturn(content); + + // 调用 + byte[] result = fileService.getFileContent(configId, path); + // 断言 + assertSame(result, content); + } +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/job/JobLogServiceTest.java b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/job/JobLogServiceTest.java new file mode 100644 index 0000000..2fcf894 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/job/JobLogServiceTest.java @@ -0,0 +1,163 @@ +package com.jojubanking.boot.module.infra.service.job; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobLogDO; +import com.jojubanking.boot.module.infra.dal.mysql.job.JobLogMapper; +import com.jojubanking.boot.module.infra.enums.job.JobLogStatusEnum; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@Import(JobLogServiceImpl.class) +public class JobLogServiceTest extends BaseDbUnitTest { + + @Resource + private JobLogServiceImpl jobLogService; + @Resource + private JobLogMapper jobLogMapper; + + @Test + public void testCreateJobLog_success() { + // 准备参数 + JobLogDO reqVO = randomPojo(JobLogDO.class, o -> { + o.setExecuteIndex(1); + }); + // 调用 + Long jobLogId = jobLogService.createJobLog(reqVO.getJobId(), reqVO.getBeginTime(), reqVO.getHandlerName(), reqVO.getHandlerParam(), reqVO.getExecuteIndex()); + // 断言 + assertNotNull(jobLogId); + // 校验记录的属性是否正确 + JobLogDO job = jobLogMapper.selectById(jobLogId); + assertEquals(JobLogStatusEnum.RUNNING.getStatus(), job.getStatus()); + } + + @Test + public void testUpdateJobLogResultAsync_success() { + // 准备参数 + JobLogDO reqVO = randomPojo(JobLogDO.class, o -> { + o.setExecuteIndex(1); + }); + JobLogDO log = JobLogDO.builder().jobId(reqVO.getJobId()).handlerName(reqVO.getHandlerName()).handlerParam(reqVO.getHandlerParam()).executeIndex(reqVO.getExecuteIndex()) + .beginTime(reqVO.getBeginTime()).status(JobLogStatusEnum.RUNNING.getStatus()).build(); + jobLogMapper.insert(log); + // 调用 + jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), true,reqVO.getResult()); + // 校验记录的属性是否正确 + JobLogDO job = jobLogMapper.selectById(log.getId()); + assertEquals(JobLogStatusEnum.SUCCESS.getStatus(), job.getStatus()); + + // 调用 + jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), false,reqVO.getResult()); + // 校验记录的属性是否正确 + JobLogDO job2 = jobLogMapper.selectById(log.getId()); + assertEquals(JobLogStatusEnum.FAILURE.getStatus(), job2.getStatus()); + } + + @Test + public void testGetJobLogListByIds_success() { + // mock 数据 + JobLogDO dbJobLog = randomPojo(JobLogDO.class, o -> { + o.setExecuteIndex(1); + o.setStatus(randomEle(JobLogStatusEnum.values()).getStatus()); // 保证 status 的范围 + }); + JobLogDO cloneJobLog = ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setHandlerName(randomString())); + jobLogMapper.insert(dbJobLog); + // 测试 handlerName 不匹配 + jobLogMapper.insert(cloneJobLog); + // 准备参数 + ArrayList ids = new ArrayList<>(); + ids.add(dbJobLog.getId()); + ids.add(cloneJobLog.getId()); + // 调用 + List list = jobLogService.getJobLogList(ids); + // 断言 + assertEquals(2, list.size()); + assertPojoEquals(dbJobLog, list.get(0)); + } + + @Test + public void testGetJobPage_success() { + // mock 数据 + JobLogDO dbJobLog = randomPojo(JobLogDO.class, o -> { + o.setExecuteIndex(1); + o.setHandlerName("handlerName 单元测试"); + o.setStatus(JobLogStatusEnum.SUCCESS.getStatus()); + o.setBeginTime(buildTime(2021, 1, 8)); + o.setEndTime(buildTime(2021, 1, 8)); + }); + jobLogMapper.insert(dbJobLog); + // 测试 jobId 不匹配 + jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setJobId(randomLongId()))); + // 测试 handlerName 不匹配 + jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setHandlerName(randomString()))); + // 测试 beginTime 不匹配 + jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setBeginTime(buildTime(2021, 1, 7)))); + // 测试 endTime 不匹配 + jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9)))); + // 测试 status 不匹配 + jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setStatus(JobLogStatusEnum.FAILURE.getStatus()))); + // 准备参数 + JobLogPageReqVO reqVo = new JobLogPageReqVO(); + reqVo.setJobId(dbJobLog.getJobId()); + reqVo.setHandlerName("单元"); + reqVo.setBeginTime(dbJobLog.getBeginTime()); + reqVo.setEndTime(dbJobLog.getEndTime()); + reqVo.setStatus(JobLogStatusEnum.SUCCESS.getStatus()); + // 调用 + PageResult pageResult = jobLogService.getJobLogPage(reqVo); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbJobLog, pageResult.getList().get(0)); + } + + @Test + public void testGetJobListForExport_success() { + // mock 数据 + JobLogDO dbJobLog = randomPojo(JobLogDO.class, o -> { + o.setExecuteIndex(1); + o.setHandlerName("handlerName 单元测试"); + o.setStatus(JobLogStatusEnum.SUCCESS.getStatus()); + o.setBeginTime(buildTime(2021, 1, 8)); + o.setEndTime(buildTime(2021, 1, 8)); + }); + jobLogMapper.insert(dbJobLog); + // 测试 jobId 不匹配 + jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setJobId(randomLongId()))); + // 测试 handlerName 不匹配 + jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setHandlerName(randomString()))); + // 测试 beginTime 不匹配 + jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setBeginTime(buildTime(2021, 1, 7)))); + // 测试 endTime 不匹配 + jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9)))); + // 测试 status 不匹配 + jobLogMapper.insert(ObjectUtils.cloneIgnoreId(dbJobLog, o -> o.setStatus(JobLogStatusEnum.FAILURE.getStatus()))); + // 准备参数 + JobLogExportReqVO reqVo = new JobLogExportReqVO(); + reqVo.setJobId(dbJobLog.getJobId()); + reqVo.setHandlerName("单元"); + reqVo.setBeginTime(dbJobLog.getBeginTime()); + reqVo.setEndTime(dbJobLog.getEndTime()); + reqVo.setStatus(JobLogStatusEnum.SUCCESS.getStatus()); + // 调用 + List list = jobLogService.getJobLogList(reqVo); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbJobLog, list.get(0)); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/job/JobServiceTest.java b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/job/JobServiceTest.java new file mode 100644 index 0000000..ef9e487 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/job/JobServiceTest.java @@ -0,0 +1,294 @@ +package com.jojubanking.boot.module.infra.service.job; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.quartz.core.scheduler.SchedulerManager; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobUpdateReqVO; +import com.jojubanking.boot.module.infra.convert.job.JobConvert; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobDO; +import com.jojubanking.boot.module.infra.dal.mysql.job.JobMapper; +import com.jojubanking.boot.module.infra.enums.job.JobStatusEnum; +import org.junit.jupiter.api.Test; +import org.quartz.SchedulerException; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.*; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomString; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@Import(JobServiceImpl.class) +public class JobServiceTest extends BaseDbUnitTest { + + @Resource + private JobServiceImpl jobService; + @Resource + private JobMapper jobMapper; + @MockBean + private SchedulerManager schedulerManager; + + @Test + public void testCreateJob_cronExpressionValid() { + // 准备参数。Cron 表达式为 String 类型,默认随机字符串。 + JobCreateReqVO reqVO = randomPojo(JobCreateReqVO.class); + // 调用,并断言异常 + assertServiceException(() -> jobService.createJob(reqVO), JOB_CRON_EXPRESSION_VALID); + } + + @Test + public void testCreateJob_jobHandlerExists() throws SchedulerException { + // 准备参数 指定 Cron 表达式 + JobCreateReqVO reqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + // 调用 + jobService.createJob(reqVO); + // 调用,并断言异常 + assertServiceException(() -> jobService.createJob(reqVO), JOB_HANDLER_EXISTS); + } + + @Test + public void testCreateJob_success() throws SchedulerException { + // 准备参数 指定 Cron 表达式 + JobCreateReqVO reqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + // 调用 + Long jobId = jobService.createJob(reqVO); + // 断言 + assertNotNull(jobId); + // 校验记录的属性是否正确 + JobDO job = jobMapper.selectById(jobId); + assertPojoEquals(reqVO, job); + assertEquals(JobStatusEnum.NORMAL.getStatus(), job.getStatus()); + // 校验调用 + verify(schedulerManager, times(1)).addJob(eq(job.getId()), eq(job.getHandlerName()), eq(job.getHandlerParam()), eq(job.getCronExpression()), + eq(reqVO.getRetryCount()), eq(reqVO.getRetryInterval())); + } + + @Test + public void testUpdateJob_jobNotExists(){ + // 准备参数 + JobUpdateReqVO reqVO = randomPojo(JobUpdateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + // 调用,并断言异常 + assertServiceException(() -> jobService.updateJob(reqVO), JOB_NOT_EXISTS); + } + + @Test + public void testUpdateJob_onlyNormalStatus(){ + // mock 数据 + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.INIT.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 准备参数 + JobUpdateReqVO updateReqVO = randomPojo(JobUpdateReqVO.class, o -> { + o.setId(job.getId()); + o.setName(createReqVO.getName()); + o.setCronExpression(createReqVO.getCronExpression()); + }); + // 调用,并断言异常 + assertServiceException(() -> jobService.updateJob(updateReqVO), JOB_UPDATE_ONLY_NORMAL_STATUS); + } + + @Test + public void testUpdateJob_success() throws SchedulerException { + // mock 数据 + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.NORMAL.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 准备参数 + JobUpdateReqVO updateReqVO = randomPojo(JobUpdateReqVO.class, o -> { + o.setId(job.getId()); + o.setName(createReqVO.getName()); + o.setCronExpression(createReqVO.getCronExpression()); + }); + // 调用 + jobService.updateJob(updateReqVO); + // 校验记录的属性是否正确 + JobDO updateJob = jobMapper.selectById(updateReqVO.getId()); + assertPojoEquals(updateReqVO, updateJob); + // 校验调用 + verify(schedulerManager, times(1)).updateJob(eq(job.getHandlerName()), eq(updateReqVO.getHandlerParam()), eq(updateReqVO.getCronExpression()), + eq(updateReqVO.getRetryCount()), eq(updateReqVO.getRetryInterval())); + } + + @Test + public void testUpdateJobStatus_changeStatusInvalid() { + // 调用,并断言异常 + assertServiceException(() -> jobService.updateJobStatus(1L, JobStatusEnum.INIT.getStatus()), JOB_CHANGE_STATUS_INVALID); + } + + @Test + public void testUpdateJobStatus_changeStatusEquals() { + // mock 数据 + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.NORMAL.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 调用,并断言异常 + assertServiceException(() -> jobService.updateJobStatus(job.getId(), job.getStatus()), JOB_CHANGE_STATUS_EQUALS); + } + + @Test + public void testUpdateJobStatus_NormalToStop_success() throws SchedulerException { + // mock 数据 + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.NORMAL.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 调用 + jobService.updateJobStatus(job.getId(), JobStatusEnum.STOP.getStatus()); + // 校验记录的属性是否正确 + JobDO updateJob = jobMapper.selectById(job.getId()); + assertEquals(JobStatusEnum.STOP.getStatus(), updateJob.getStatus()); + // 校验调用 + verify(schedulerManager, times(1)).pauseJob(eq(job.getHandlerName())); + } + + @Test + public void testUpdateJobStatus_StopToNormal_success() throws SchedulerException { + // mock 数据 + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.STOP.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 调用 + jobService.updateJobStatus(job.getId(), JobStatusEnum.NORMAL.getStatus()); + // 校验记录的属性是否正确 + JobDO updateJob = jobMapper.selectById(job.getId()); + assertEquals(JobStatusEnum.NORMAL.getStatus(), updateJob.getStatus()); + // 校验调用 + verify(schedulerManager, times(1)).resumeJob(eq(job.getHandlerName())); + } + + @Test + public void testTriggerJob_success() throws SchedulerException { + // mock 数据 + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.NORMAL.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 调用 + jobService.triggerJob(job.getId()); + // 校验调用 + verify(schedulerManager, times(1)).triggerJob(eq(job.getId()), eq(job.getHandlerName()), eq(job.getHandlerParam())); + } + + @Test + public void testDeleteJob_success() throws SchedulerException { + // mock 数据 + JobCreateReqVO createReqVO = randomPojo(JobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *")); + JobDO job = JobConvert.INSTANCE.convert(createReqVO); + job.setStatus(JobStatusEnum.NORMAL.getStatus()); + fillJobMonitorTimeoutEmpty(job); + jobMapper.insert(job); + // 调用 UPDATE inf_job SET deleted=1 WHERE id=? AND deleted=0 + jobService.deleteJob(job.getId()); + // 校验数据不存在了 WHERE id=? AND deleted=0 查询为空正常 + assertNull(jobMapper.selectById(job.getId())); + // 校验调用 + verify(schedulerManager, times(1)).deleteJob(eq(job.getHandlerName())); + } + + @Test + public void testGetJobListByIds_success() { + // mock 数据 + JobDO dbJob = randomPojo(JobDO.class, o -> { + o.setStatus(randomEle(JobStatusEnum.values()).getStatus()); // 保证 status 的范围 + }); + JobDO cloneJob = ObjectUtils.cloneIgnoreId(dbJob, o -> o.setHandlerName(randomString())); + jobMapper.insert(dbJob); + // 测试 handlerName 不匹配 + jobMapper.insert(cloneJob); + // 准备参数 + ArrayList ids = new ArrayList<>(); + ids.add(dbJob.getId()); + ids.add(cloneJob.getId()); + // 调用 + List list = jobService.getJobList(ids); + // 断言 + assertEquals(2, list.size()); + assertPojoEquals(dbJob, list.get(0)); + } + + @Test + public void testGetJobPage_success() { + // mock 数据 + JobDO dbJob = randomPojo(JobDO.class, o -> { + o.setName("定时任务测试"); + o.setHandlerName("handlerName 单元测试"); + o.setStatus(JobStatusEnum.INIT.getStatus()); + }); + jobMapper.insert(dbJob); + // 测试 name 不匹配 + jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setName("土豆"))); + // 测试 status 不匹配 + jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setStatus(JobStatusEnum.NORMAL.getStatus()))); + // 测试 handlerName 不匹配 + jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setHandlerName(randomString()))); + // 准备参数 + JobPageReqVO reqVo = new JobPageReqVO(); + reqVo.setName("定时"); + reqVo.setStatus(JobStatusEnum.INIT.getStatus()); + reqVo.setHandlerName("单元"); + // 调用 + PageResult pageResult = jobService.getJobPage(reqVo); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbJob, pageResult.getList().get(0)); + } + + @Test + public void testGetJobListForExport_success() { + // mock 数据 + JobDO dbJob = randomPojo(JobDO.class, o -> { + o.setName("定时任务测试"); + o.setHandlerName("handlerName 单元测试"); + o.setStatus(JobStatusEnum.INIT.getStatus()); + }); + jobMapper.insert(dbJob); + // 测试 name 不匹配 + jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setName("土豆"))); + // 测试 status 不匹配 + jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setStatus(JobStatusEnum.NORMAL.getStatus()))); + // 测试 handlerName 不匹配 + jobMapper.insert(ObjectUtils.cloneIgnoreId(dbJob, o -> o.setHandlerName(randomString()))); + // 准备参数 + JobExportReqVO reqVo = new JobExportReqVO(); + reqVo.setName("定时"); + reqVo.setStatus(JobStatusEnum.INIT.getStatus()); + reqVo.setHandlerName("单元"); + // 调用 + List list = jobService.getJobList(reqVo); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbJob, list.get(0)); + } + + private static void fillJobMonitorTimeoutEmpty(JobDO job) { + if (job.getMonitorTimeout() == null) { + job.setMonitorTimeout(0); + } + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogServiceImplTest.java b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogServiceImplTest.java new file mode 100644 index 0000000..88bf0d2 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogServiceImplTest.java @@ -0,0 +1,164 @@ +package com.jojubanking.boot.module.infra.service.logger; + +import cn.hutool.core.util.RandomUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.framework.test.core.util.RandomUtils; +import com.jojubanking.boot.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import com.jojubanking.boot.module.infra.dal.mysql.logger.ApiAccessLogMapper; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@Import(ApiAccessLogServiceImpl.class) +public class ApiAccessLogServiceImplTest extends BaseDbUnitTest { + + @Resource + private ApiAccessLogService apiAccessLogService; + + @Resource + private ApiAccessLogMapper apiAccessLogMapper; + + @Test + public void testGetApiAccessLogPage() { + // 构造测试数据 + long userId = 2233L; + int userType = UserTypeEnum.ADMIN.getValue(); + String applicationName = "joju-test"; + String requestUrl = "foo"; + Date beginTime = buildTime(2021, 3, 13); + int duration = 1000; + int resultCode = GlobalErrorCodeConstants.SUCCESS.getCode(); + + ApiAccessLogDO infApiAccessLogDO = RandomUtils.randomPojo(ApiAccessLogDO.class, dto -> { + dto.setUserId(userId); + dto.setUserType(userType); + dto.setApplicationName(applicationName); + dto.setRequestUrl(requestUrl); + dto.setBeginTime(beginTime); + dto.setDuration(duration); + dto.setResultCode(resultCode); + }); + apiAccessLogMapper.insert(infApiAccessLogDO); + + // 下面几个都是不匹配的数据 + // userId 不同的 + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setUserId(3344L))); + // userType + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + // applicationName 不同的 + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setApplicationName("test"))); + // requestUrl 不同的 + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setRequestUrl("bar"))); + // 构造一个早期时间 2021-02-06 00:00:00 + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setBeginTime(buildTime(2021, 2, 6)))); + // duration 不同的 + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setDuration(100))); + // resultCode 不同的 + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setResultCode(2))); + + // 构造调用参数 + ApiAccessLogPageReqVO reqVO = new ApiAccessLogPageReqVO(); + reqVO.setUserId(userId); + reqVO.setUserType(userType); + reqVO.setApplicationName(applicationName); + reqVO.setRequestUrl(requestUrl); + reqVO.setBeginTime((new Date[]{buildTime(2021, 3, 12),buildTime(2021, 3, 14)})); + reqVO.setDuration(duration); + reqVO.setResultCode(resultCode); + + // 调用service方法 + PageResult pageResult = apiAccessLogService.getApiAccessLogPage(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(infApiAccessLogDO, pageResult.getList().get(0)); + } + + @Test + public void testGetApiAccessLogList() { + // 构造测试数据 + long userId = 2233L; + int userType = UserTypeEnum.ADMIN.getValue(); + String applicationName = "joju-test"; + String requestUrl = "foo"; + Date beginTime = buildTime(2021, 3, 13); + int duration = 1000; + int resultCode = GlobalErrorCodeConstants.SUCCESS.getCode(); + + ApiAccessLogDO infApiAccessLogDO = RandomUtils.randomPojo(ApiAccessLogDO.class, dto -> { + dto.setUserId(userId); + dto.setUserType(userType); + dto.setApplicationName(applicationName); + dto.setRequestUrl(requestUrl); + dto.setBeginTime(beginTime); + dto.setDuration(duration); + dto.setResultCode(resultCode); + }); + apiAccessLogMapper.insert(infApiAccessLogDO); + + // 下面几个都是不匹配的数据 + // userId 不同的 + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setUserId(3344L))); + // userType + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + // applicationName 不同的 + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setApplicationName("test"))); + // requestUrl 不同的 + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setRequestUrl("bar"))); + // 构造一个早期时间 2021-02-06 00:00:00 + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setBeginTime(buildTime(2021, 2, 6)))); + // duration 不同的 + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setDuration(100))); + // resultCode 不同的 + apiAccessLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiAccessLogDO, logDO -> logDO.setResultCode(2))); + + // 构造调用参数 + ApiAccessLogExportReqVO reqVO = new ApiAccessLogExportReqVO(); + reqVO.setUserId(userId); + reqVO.setUserType(userType); + reqVO.setApplicationName(applicationName); + reqVO.setRequestUrl(requestUrl); + reqVO.setBeginTime((new Date[]{buildTime(2021, 3, 12),buildTime(2021, 3, 14)})); + reqVO.setDuration(duration); + reqVO.setResultCode(resultCode); + + // 调用service方法 + List list = apiAccessLogService.getApiAccessLogList(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, list.size()); + assertPojoEquals(infApiAccessLogDO, list.get(0)); + } + + @Test + public void testCreateApiAccessLogAsync() { + // 准备参数 + ApiAccessLogCreateReqDTO createDTO = RandomUtils.randomPojo(ApiAccessLogCreateReqDTO.class, + dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue())); + + // 调用 + apiAccessLogService.createApiAccessLog(createDTO); + // 断言 + ApiAccessLogDO infApiAccessLogDO = apiAccessLogMapper.selectOne(null); + assertNotNull(infApiAccessLogDO); + assertPojoEquals(createDTO, infApiAccessLogDO); + } + + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogServiceImplTest.java b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogServiceImplTest.java new file mode 100644 index 0000000..eec1b5e --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogServiceImplTest.java @@ -0,0 +1,195 @@ +package com.jojubanking.boot.module.infra.service.logger; + +import cn.hutool.core.util.RandomUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.framework.test.core.util.RandomUtils; +import com.jojubanking.boot.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import com.jojubanking.boot.module.infra.dal.mysql.logger.ApiErrorLogMapper; +import com.jojubanking.boot.module.infra.enums.logger.ApiErrorLogProcessStatusEnum; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.API_ERROR_LOG_NOT_FOUND; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.API_ERROR_LOG_PROCESSED; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@Import(ApiErrorLogServiceImpl.class) +public class ApiErrorLogServiceImplTest extends BaseDbUnitTest { + + @Resource + private ApiErrorLogServiceImpl apiErrorLogService; + + @Resource + private ApiErrorLogMapper infApiErrorLogMapper; + + @Test + public void testGetApiErrorLogPage() { + // 构造测试数据 + long userId = 2233L; + int userType = UserTypeEnum.ADMIN.getValue(); + String applicationName = "joju-test"; + String requestUrl = "foo"; + Date beginTime = buildTime(2021, 3, 13); + int progressStatus = ApiErrorLogProcessStatusEnum.INIT.getStatus(); + + ApiErrorLogDO infApiErrorLogDO = RandomUtils.randomPojo(ApiErrorLogDO.class, logDO -> { + logDO.setUserId(userId); + logDO.setUserType(userType); + logDO.setApplicationName(applicationName); + logDO.setRequestUrl(requestUrl); + logDO.setExceptionTime(beginTime); + logDO.setProcessStatus(progressStatus); + }); + infApiErrorLogMapper.insert(infApiErrorLogDO); + + // 下面几个都是不匹配的数据 + // userId 不同的 + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setUserId(3344L))); + // userType + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + // applicationName 不同的 + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setApplicationName("test"))); + // requestUrl 不同的 + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setRequestUrl("bar"))); + // 构造一个早期时间 2021-02-06 00:00:00 + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setExceptionTime(buildTime(2021, 2, 6)))); + // progressStatus 不同的 + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setProcessStatus(ApiErrorLogProcessStatusEnum.DONE.getStatus()))); + + // 构造调用参数 + ApiErrorLogPageReqVO reqVO = new ApiErrorLogPageReqVO(); + reqVO.setUserId(userId); + reqVO.setUserType(userType); + reqVO.setApplicationName(applicationName); + reqVO.setRequestUrl(requestUrl); + reqVO.setExceptionTime((new Date[]{buildTime(2021, 3, 12),buildTime(2021, 3, 14)})); + reqVO.setProcessStatus(progressStatus); + + // 调用service方法 + PageResult pageResult = apiErrorLogService.getApiErrorLogPage(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(infApiErrorLogDO, pageResult.getList().get(0)); + } + + @Test + public void testGetApiErrorLogList() { + // 构造测试数据 + long userId = 2233L; + int userType = UserTypeEnum.ADMIN.getValue(); + String applicationName = "joju-test"; + String requestUrl = "foo"; + Date beginTime = buildTime(2021, 3, 13); + int progressStatus = ApiErrorLogProcessStatusEnum.INIT.getStatus(); + + ApiErrorLogDO infApiErrorLogDO = RandomUtils.randomPojo(ApiErrorLogDO.class, logDO -> { + logDO.setUserId(userId); + logDO.setUserType(userType); + logDO.setApplicationName(applicationName); + logDO.setRequestUrl(requestUrl); + logDO.setExceptionTime(beginTime); + logDO.setProcessStatus(progressStatus); + }); + infApiErrorLogMapper.insert(infApiErrorLogDO); + + // 下面几个都是不匹配的数据 + // userId 不同的 + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setUserId(3344L))); + // userType + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setUserType(UserTypeEnum.MEMBER.getValue()))); + // applicationName 不同的 + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setApplicationName("test"))); + // requestUrl 不同的 + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setRequestUrl("bar"))); + // 构造一个早期时间 2021-02-06 00:00:00 + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setExceptionTime(buildTime(2021, 2, 6)))); + // progressStatus 不同的 + infApiErrorLogMapper.insert(ObjectUtils.cloneIgnoreId(infApiErrorLogDO, logDO -> logDO.setProcessStatus(ApiErrorLogProcessStatusEnum.DONE.getStatus()))); + + // 构造调用参数 + ApiErrorLogExportReqVO reqVO = new ApiErrorLogExportReqVO(); + reqVO.setUserId(userId); + reqVO.setUserType(userType); + reqVO.setApplicationName(applicationName); + reqVO.setRequestUrl(requestUrl); + reqVO.setExceptionTime((new Date[]{buildTime(2021, 3, 12),buildTime(2021, 3, 14)})); + reqVO.setProcessStatus(progressStatus); + + // 调用service方法 + List list = apiErrorLogService.getApiErrorLogList(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, list.size()); + assertPojoEquals(infApiErrorLogDO, list.get(0)); + } + + + // TODO TW:单元测试,可以拆小一点 + @Test + public void testUpdateApiErrorLogProcess() { + // 先构造两条数据,第一条用于抛出异常,第二条用于正常的执行update操作 + Long processUserId = 2233L; + + ApiErrorLogDO first = RandomUtils.randomPojo(ApiErrorLogDO.class, logDO -> { + logDO.setProcessUserId(processUserId); + logDO.setUserType(UserTypeEnum.ADMIN.getValue()); + logDO.setProcessStatus(ApiErrorLogProcessStatusEnum.DONE.getStatus()); + }); + infApiErrorLogMapper.insert(first); + + ApiErrorLogDO second = RandomUtils.randomPojo(ApiErrorLogDO.class, logDO -> { + logDO.setProcessUserId(1122L); + logDO.setUserType(UserTypeEnum.ADMIN.getValue()); + logDO.setProcessStatus(ApiErrorLogProcessStatusEnum.INIT.getStatus()); + }); + infApiErrorLogMapper.insert(second); + + Long firstId = first.getId(); + Long secondId = second.getId(); + + // 执行正常的 update 操作 + apiErrorLogService.updateApiErrorLogProcess(secondId, ApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId); + ApiErrorLogDO secondSelect = infApiErrorLogMapper.selectOne("id", secondId); + + // id 为 0 查询不到,应该抛出异常 API_ERROR_LOG_NOT_FOUND + assertServiceException(() -> apiErrorLogService.updateApiErrorLogProcess(0L, ApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_NOT_FOUND); + // id 为 first 的 progressStatus 为 DONE ,应该抛出 API_ERROR_LOG_PROCESSED + assertServiceException(() -> apiErrorLogService.updateApiErrorLogProcess(firstId, ApiErrorLogProcessStatusEnum.DONE.getStatus(), processUserId), API_ERROR_LOG_PROCESSED); + // 验证 progressStatus 是否修改成功 + Assertions.assertEquals(ApiErrorLogProcessStatusEnum.DONE.getStatus(), secondSelect.getProcessStatus()); + // 验证 progressUserId 是否修改成功 + Assertions.assertEquals(processUserId, secondSelect.getProcessUserId()); + } + + @Test + public void testCreateApiErrorLogAsync() { + // 准备参数 + ApiErrorLogCreateReqDTO createDTO = RandomUtils.randomPojo(ApiErrorLogCreateReqDTO.class, + dto -> dto.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue())); + + // 调用 + apiErrorLogService.createApiErrorLog(createDTO); + // 断言 + ApiErrorLogDO infApiErrorLogDO = infApiErrorLogMapper.selectOne(null); + assertNotNull(infApiErrorLogDO); + assertPojoEquals(createDTO, infApiErrorLogDO); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/test/TestDemoServiceImplTest.java b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/test/TestDemoServiceImplTest.java new file mode 100644 index 0000000..abf6343 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/java/com/jojubanking/boot/module/infra/service/test/TestDemoServiceImplTest.java @@ -0,0 +1,187 @@ +package com.jojubanking.boot.module.infra.service.test; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoExportReqVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoPageReqVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.test.TestDemoDO; +import com.jojubanking.boot.module.infra.dal.mysql.test.TestDemoMapper; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomLongId; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.TEST_DEMO_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link TestDemoServiceImpl} 的单元测试类 + * + * @author TW + */ +@Import(TestDemoServiceImpl.class) +public class TestDemoServiceImplTest extends BaseDbUnitTest { + + @Resource + private TestDemoServiceImpl testDemoService; + + @Resource + private TestDemoMapper testDemoMapper; + + @Test + public void testCreateTestDemo_success() { + // 准备参数 + TestDemoCreateReqVO reqVO = randomPojo(TestDemoCreateReqVO.class); + + // 调用 + Long testDemoId = testDemoService.createTestDemo(reqVO); + // 断言 + assertNotNull(testDemoId); + // 校验记录的属性是否正确 + TestDemoDO testDemo = testDemoMapper.selectById(testDemoId); + assertPojoEquals(reqVO, testDemo); + } + + @Test + public void testUpdateTestDemo_success() { + // mock 数据 + TestDemoDO dbTestDemo = randomPojo(TestDemoDO.class); + testDemoMapper.insert(dbTestDemo);// @Sql: 先插入出一条存在的数据 + // 准备参数 + TestDemoUpdateReqVO reqVO = randomPojo(TestDemoUpdateReqVO.class, o -> { + o.setId(dbTestDemo.getId()); // 设置更新的 ID + }); + + // 调用 + testDemoService.updateTestDemo(reqVO); + // 校验是否更新正确 + TestDemoDO testDemo = testDemoMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, testDemo); + } + + @Test + public void testUpdateTestDemo_notExists() { + // 准备参数 + TestDemoUpdateReqVO reqVO = randomPojo(TestDemoUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> testDemoService.updateTestDemo(reqVO), TEST_DEMO_NOT_EXISTS); + } + + @Test + public void testDeleteTestDemo_success() { + // mock 数据 + TestDemoDO dbTestDemo = randomPojo(TestDemoDO.class); + testDemoMapper.insert(dbTestDemo);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbTestDemo.getId(); + + // 调用 + testDemoService.deleteTestDemo(id); + // 校验数据不存在了 + assertNull(testDemoMapper.selectById(id)); + } + + @Test + public void testDeleteTestDemo_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> testDemoService.deleteTestDemo(id), TEST_DEMO_NOT_EXISTS); + } + + @Test + public void testGetTestDemoPage() { + // mock 数据 + TestDemoDO dbTestDemo = randomPojo(TestDemoDO.class, o -> { // 等会查询到 + o.setName("TW"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setType(1); + o.setCategory(2); + o.setRemark("哈哈哈"); + o.setCreateTime(DateUtils.buildTime(2021, 11, 11)); + }); + testDemoMapper.insert(dbTestDemo); + // 测试 name 不匹配 + testDemoMapper.insert(cloneIgnoreId(dbTestDemo, o -> o.setName("不匹配"))); + // 测试 status 不匹配 + testDemoMapper.insert(cloneIgnoreId(dbTestDemo, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 type 不匹配 + testDemoMapper.insert(cloneIgnoreId(dbTestDemo, o -> o.setType(2))); + // 测试 category 不匹配 + testDemoMapper.insert(cloneIgnoreId(dbTestDemo, o -> o.setCategory(1))); + // 测试 remark 不匹配 + testDemoMapper.insert(cloneIgnoreId(dbTestDemo, o -> o.setRemark("呵呵呵"))); + // 测试 createTime 不匹配 + testDemoMapper.insert(cloneIgnoreId(dbTestDemo, o -> o.setCreateTime(DateUtils.buildTime(2021, 12, 12)))); + // 准备参数 + TestDemoPageReqVO reqVO = new TestDemoPageReqVO(); + reqVO.setName("芋道"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setType(1); + reqVO.setCategory(2); + reqVO.setRemark("哈哈哈"); + reqVO.setCreateTime((new Date[]{buildTime(2021, 11, 10),buildTime(2021, 11, 12)})); + + // 调用 + PageResult pageResult = testDemoService.getTestDemoPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbTestDemo, pageResult.getList().get(0)); + } + + @Test + public void testGetTestDemoList() { + // mock 数据 + TestDemoDO dbTestDemo = randomPojo(TestDemoDO.class, o -> { // 等会查询到 + o.setName("TW"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setType(1); + o.setCategory(2); + o.setRemark("哈哈哈"); + o.setCreateTime(DateUtils.buildTime(2021, 11, 11)); + }); + testDemoMapper.insert(dbTestDemo); + // 测试 name 不匹配 + testDemoMapper.insert(cloneIgnoreId(dbTestDemo, o -> o.setName("不匹配"))); + // 测试 status 不匹配 + testDemoMapper.insert(cloneIgnoreId(dbTestDemo, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 type 不匹配 + testDemoMapper.insert(cloneIgnoreId(dbTestDemo, o -> o.setType(2))); + // 测试 category 不匹配 + testDemoMapper.insert(cloneIgnoreId(dbTestDemo, o -> o.setCategory(1))); + // 测试 remark 不匹配 + testDemoMapper.insert(cloneIgnoreId(dbTestDemo, o -> o.setRemark("呵呵呵"))); + // 测试 createTime 不匹配 + testDemoMapper.insert(cloneIgnoreId(dbTestDemo, o -> o.setCreateTime(DateUtils.buildTime(2021, 12, 12)))); + // 准备参数 + TestDemoExportReqVO reqVO = new TestDemoExportReqVO(); + reqVO.setName("芋道"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setType(1); + reqVO.setCategory(2); + reqVO.setRemark("哈哈哈"); + reqVO.setCreateTime((new Date[]{buildTime(2021, 11, 10),buildTime(2021, 11, 12)})); + + // 调用 + List list = testDemoService.getTestDemoList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbTestDemo, list.get(0)); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/src/test/resources/application-unit-test.yaml b/joju-module-infra/joju-module-infra-biz/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000..196f352 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/resources/application-unit-test.yaml @@ -0,0 +1,50 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + sql: + init: + schema-locations: classpath:/sql/create_tables.sql + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + +mybatis-plus: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + type-aliases-package: ${joju.info.base-package}.module.*.dal.dataobject + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +joju: + info: + base-package: com.jojubanking.boot diff --git a/joju-module-infra/joju-module-infra-biz/src/test/resources/logback.xml b/joju-module-infra/joju-module-infra-biz/src/test/resources/logback.xml new file mode 100644 index 0000000..daf756b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/resources/logback.xml @@ -0,0 +1,4 @@ + + + + diff --git a/joju-module-infra/joju-module-infra-biz/src/test/resources/sql/clean.sql b/joju-module-infra/joju-module-infra-biz/src/test/resources/sql/clean.sql new file mode 100644 index 0000000..eb05d3d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/resources/sql/clean.sql @@ -0,0 +1,12 @@ +DELETE FROM "infra_config"; +DELETE FROM "infra_file"; +DELETE FROM "infra_job"; +DELETE FROM "infra_job_log"; +DELETE FROM "infra_api_access_log"; +DELETE FROM "infra_api_error_log"; +DELETE FROM "infra_api_access_log"; +DELETE FROM "infra_file"; +DELETE FROM "infra_api_error_log"; +DELETE FROM "infra_test_demo"; +DELETE FROM "infra_file_config"; +DELETE FROM "infra_data_source_config"; diff --git a/joju-module-infra/joju-module-infra-biz/src/test/resources/sql/create_tables.sql b/joju-module-infra/joju-module-infra-biz/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000..c60230a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/src/test/resources/sql/create_tables.sql @@ -0,0 +1,184 @@ + +CREATE TABLE IF NOT EXISTS "infra_config" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "category" varchar(50) NOT NULL, + "type" tinyint NOT NULL, + "name" varchar(100) NOT NULL DEFAULT '', + "config_key" varchar(100) NOT NULL DEFAULT '', + "value" varchar(500) NOT NULL DEFAULT '', + "visible" bit NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '参数配置表'; + +CREATE TABLE IF NOT EXISTS "infra_file_config" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "storage" tinyint NOT NULL, + "remark" varchar(255), + "master" bit(1) NOT NULL, + "config" varchar(4096) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '文件配置表'; + +CREATE TABLE IF NOT EXISTS "infra_file" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "config_id" bigint NOT NULL, + "path" varchar(512), + "url" varchar(1024), + "type" varchar(63) DEFAULT NULL, + "size" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '文件表'; + +CREATE TABLE IF NOT EXISTS "infra_job" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号', + "name" varchar(32) NOT NULL COMMENT '任务名称', + "status" tinyint(4) NOT NULL COMMENT '任务状态', + "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', + "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', + "cron_expression" varchar(32) NOT NULL COMMENT 'CRON 表达式', + "retry_count" int(11) NOT NULL DEFAULT '0' COMMENT '重试次数', + "retry_interval" int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔', + "monitor_timeout" int(11) NOT NULL DEFAULT '0' COMMENT '监控超时时间', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY ("id") +) COMMENT='定时任务表'; + +CREATE TABLE IF NOT EXISTS "infra_job_log" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号', + "job_id" bigint(20) NOT NULL COMMENT '任务编号', + "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', + "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', + "execute_index" tinyint(4) NOT NULL DEFAULT '1' COMMENT '第几次执行', + "begin_time" datetime NOT NULL COMMENT '开始执行时间', + "end_time" datetime DEFAULT NULL COMMENT '结束执行时间', + "duration" int(11) DEFAULT NULL COMMENT '执行时长', + "status" tinyint(4) NOT NULL COMMENT '任务状态', + "result" varchar(4000) DEFAULT '' COMMENT '结果数据', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit(1) NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY ("id") +)COMMENT='定时任务日志表'; + +CREATE TABLE IF NOT EXISTS "inf_file" ( + "id" varchar(188) NOT NULL, + "type" varchar(63) DEFAULT NULL, + "content" blob NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") + ) COMMENT '文件表'; + +CREATE TABLE IF NOT EXISTS "infra_api_access_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null default '', + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null default '', + "request_url" varchar(255) not null default '', + "request_params" varchar(8000) not null default '', + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "begin_time" timestamp not null, + "end_time" timestamp not null, + "duration" integer not null, + "result_code" integer not null default '0', + "result_msg" varchar(512) default '', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") + ) COMMENT 'API 访问日志表'; + +CREATE TABLE IF NOT EXISTS "infra_api_error_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null, + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null, + "request_url" varchar(255) not null, + "request_params" varchar(8000) not null, + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "exception_time" timestamp not null, + "exception_name" varchar(128) not null default '', + "exception_message" clob not null, + "exception_root_cause_message" clob not null, + "exception_stack_trace" clob not null, + "exception_class_name" varchar(512) not null, + "exception_file_name" varchar(512) not null, + "exception_method_name" varchar(512) not null, + "exception_line_number" integer not null, + "process_status" tinyint not null, + "process_time" timestamp default null, + "process_user_id" bigint default '0', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) COMMENT '系统异常日志'; + +CREATE TABLE IF NOT EXISTS "infra_test_demo" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(100) NOT NULL, + "status" tinyint NOT NULL, + "type" tinyint NOT NULL, + "category" tinyint NOT NULL, + "remark" varchar(500), + "creator" varchar(64) DEFAULT '''', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '''', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典类型表'; + +CREATE TABLE IF NOT EXISTS "infra_data_source_config" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(100) NOT NULL, + "url" varchar(1024) NOT NULL, + "username" varchar(255) NOT NULL, + "password" varchar(255) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '数据源配置表'; diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/controller.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/controller.vm new file mode 100644 index 0000000..5b05467 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/controller.vm @@ -0,0 +1,109 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +#if ($sceneEnum.scene == 1)import org.springframework.security.access.prepost.PreAuthorize;#end + +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import ${PageResultClassName}; +import ${CommonResultClassName}; +import static ${CommonResultClassName}.success; + +import ${ExcelUtilsClassName}; + +import ${OperateLogClassName}; +import static ${OperateTypeEnumClassName}.*; + +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.module.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; +import ${basePackage}.module.${table.moduleName}.service.${table.businessName}.${table.className}Service; + +@Api(tags = "${sceneEnum.name} - ${table.classComment}") +@RestController +##二级的 businessName 暂时不算在 HTTP 路径上,可以根据需要写 +@RequestMapping("/${table.moduleName}/${simpleClassName_strikeCase}") +@Validated +public class ${sceneEnum.prefixClass}${table.className}Controller { + + @Resource + private ${table.className}Service ${classNameVar}Service; + + @PostMapping("/create") + @ApiOperation("创建${table.classComment}") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')")#end + + public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}CreateReqVO createReqVO) { + return success(${classNameVar}Service.create${simpleClassName}(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新${table.classComment}") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')")#end + + public CommonResult update${simpleClassName}(@Valid @RequestBody ${sceneEnum.prefixClass}${table.className}UpdateReqVO updateReqVO) { + ${classNameVar}Service.update${simpleClassName}(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除${table.classComment}") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = ${primaryColumn.javaType}.class) +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')")#end + + public CommonResult delete${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { + ${classNameVar}Service.delete${simpleClassName}(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得${table.classComment}") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = ${primaryColumn.javaType}.class) +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")#end + + public CommonResult<${sceneEnum.prefixClass}${table.className}RespVO> get${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { + ${table.className}DO ${classNameVar} = ${classNameVar}Service.get${simpleClassName}(id); + return success(${table.className}Convert.INSTANCE.convert(${classNameVar})); + } + + @GetMapping("/list") + @ApiOperation("获得${table.classComment}列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")#end + + public CommonResult> get${simpleClassName}List(@RequestParam("ids") Collection<${primaryColumn.javaType}> ids) { + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(ids); + return success(${table.className}Convert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得${table.classComment}分页") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")#end + + public CommonResult> get${simpleClassName}Page(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageVO) { + PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(pageVO); + return success(${table.className}Convert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出${table.classComment} Excel") +#if ($sceneEnum.scene == 1) @PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')")#end + + @OperateLog(type = EXPORT) + public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}ExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(exportReqVO); + // 导出 Excel + List<${sceneEnum.prefixClass}${table.className}ExcelVO> datas = ${table.className}Convert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${sceneEnum.prefixClass}${table.className}ExcelVO.class, datas); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/_column.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/_column.vm new file mode 100644 index 0000000..2e22225 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/_column.vm @@ -0,0 +1,13 @@ +## 提供给 baseVO、createVO、updateVO 生成字段 + @ApiModelProperty(value = "${column.columnComment}"#if (!${column.nullable}), required = true#end#if ("$!column.example" != ""), example = "${column.example}"#end) +#if (!${column.nullable})## 判断 @NotEmpty 和 @NotNull 注解 +#if (${field.fieldType} == 'String') + @NotEmpty(message = "${column.columnComment}不能为空") +#else + @NotNull(message = "${column.columnComment}不能为空") +#end +#end +#if (${column.javaType} == "Date")## 时间类型 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) +#end + private ${column.javaType} ${column.javaField}; diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/baseVO.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/baseVO.vm new file mode 100644 index 0000000..8b9fbaa --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/baseVO.vm @@ -0,0 +1,37 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#break +#end +#end +import io.swagger.annotations.*; +import javax.validation.constraints.*; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.createOperation} && ${column.updateOperation} && ${column.listOperationResult} + && ${column.javaType} == "Date")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end + +/** +* ${table.classComment} Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ${sceneEnum.prefixClass}${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.createOperation} && ${column.updateOperation} && ${column.listOperationResult})##通用操作 + #parse("codegen/java/controller/vo/_column.vm") + +#end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/createReqVO.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/createReqVO.vm new file mode 100644 index 0000000..ca13efa --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/createReqVO.vm @@ -0,0 +1,30 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.createOperation} && (!${column.updateOperation} || !${column.listOperationResult}) + && ${column.javaType} == "Date")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end + +@ApiModel("${sceneEnum.name} - ${table.classComment}创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}CreateReqVO extends ${sceneEnum.prefixClass}${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.createOperation} && (!${column.updateOperation} || !${column.listOperationResult}))##不是通用字段 + #parse("codegen/java/controller/vo/_column.vm") + +#end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/excelVO.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/excelVO.vm new file mode 100644 index 0000000..6b3ea24 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/excelVO.vm @@ -0,0 +1,43 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#break +#end +#end +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; +#foreach ($column in $columns) +#if ("$!column.dictType" != "")## 有设置数据字典 +import ${DictFormatClassName}; +import ${DictConvertClassName}; + +#break +#end +#end + +/** + * ${table.classComment} Excel VO + * + * @author ${table.author} + */ +@Data +public class ${sceneEnum.prefixClass}${table.className}ExcelVO { + +#foreach ($column in $columns) + #if (${column.listOperationResult})##返回字段 + #if ("$!column.dictType" != "")##处理枚举值 + @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class) + @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 + #else + @ExcelProperty("${column.columnComment}") + #end + private ${column.javaType} ${column.javaField}; + + #end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/exportReqVO.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/exportReqVO.vm new file mode 100644 index 0000000..afd583c --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/exportReqVO.vm @@ -0,0 +1,38 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import ${PageParamClassName}; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.listOperation} && ${column.javaType} == "Date")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end +## 字段模板 +#macro(columnTpl $prefix $prefixStr) + @ApiModelProperty(value = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; +#end + +@ApiModel(value = "${sceneEnum.name} - ${table.classComment} Excel 导出 Request VO", description = "参数和 ${table.className}PageReqVO 是一致的") +@Data +public class ${sceneEnum.prefixClass}${table.className}ExportReqVO { + +#foreach ($column in $columns) +#if (${column.listOperation})##查询操作 +#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 + @ApiModelProperty(value = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private ${column.javaType}[] ${column.javaField}; +#else##情况二,非 Between 的时间 + #columnTpl('', '') +#end + +#end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/pageReqVO.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/pageReqVO.vm new file mode 100644 index 0000000..df2be70 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/pageReqVO.vm @@ -0,0 +1,40 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import ${PageParamClassName}; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.listOperation} && ${column.javaType} == "Date")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end +## 字段模板 +#macro(columnTpl $prefix $prefixStr) + @ApiModelProperty(value = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; +#end + +@ApiModel("${sceneEnum.name} - ${table.classComment}分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}PageReqVO extends PageParam { + +#foreach ($column in $columns) +#if (${column.listOperation})##查询操作 +#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 + @ApiModelProperty(value = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private ${column.javaType}[] ${column.javaField}; +#else##情况二,非 Between 的时间 + #columnTpl('', '') +#end + +#end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/respVO.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/respVO.vm new file mode 100644 index 0000000..4034b6f --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/respVO.vm @@ -0,0 +1,20 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("${sceneEnum.name} - ${table.classComment} Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}RespVO extends ${sceneEnum.prefixClass}${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.listOperationResult} && (!${column.createOperation} || !${column.updateOperation}))##不是通用字段 + @ApiModelProperty(value = "${column.columnComment}"#if (!${column.nullable}), required = true#end#if ("$!column.example" != ""), example = "${column.example}"#end) + private ${column.javaType} ${column.javaField}; + +#end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/updateReqVO.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/updateReqVO.vm new file mode 100644 index 0000000..c6057d5 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/controller/vo/updateReqVO.vm @@ -0,0 +1,30 @@ +package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; +## 处理 Date 字段的引入 +#foreach ($column in $columns) +#if (${column.updateOperation} && (!${column.createOperation} || !${column.listOperationResult}) + && ${column.javaType} == "Date")## 时间类型 +import org.springframework.format.annotation.DateTimeFormat; + +import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; +#break +#end +#end + +@ApiModel("${sceneEnum.name} - ${table.classComment}更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ${sceneEnum.prefixClass}${table.className}UpdateReqVO extends ${sceneEnum.prefixClass}${table.className}BaseVO { + +#foreach ($column in $columns) +#if (${column.updateOperation} && (!${column.createOperation} || !${column.listOperationResult}))##不是通用字段 + #parse("codegen/java/controller/vo/_column.vm") + +#end +#end +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/convert/convert.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/convert/convert.vm new file mode 100644 index 0000000..6176e0f --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/convert/convert.vm @@ -0,0 +1,34 @@ +package ${basePackage}.module.${table.moduleName}.convert.${table.businessName}; + +import java.util.*; + +import ${PageResultClassName}; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; + +/** + * ${table.classComment} Convert + * + * @author ${table.author} + */ +@Mapper +public interface ${table.className}Convert { + + ${table.className}Convert INSTANCE = Mappers.getMapper(${table.className}Convert.class); + + ${table.className}DO convert(${sceneEnum.prefixClass}${table.className}CreateReqVO bean); + + ${table.className}DO convert(${sceneEnum.prefixClass}${table.className}UpdateReqVO bean); + + ${sceneEnum.prefixClass}${table.className}RespVO convert(${table.className}DO bean); + + List<${sceneEnum.prefixClass}${table.className}RespVO> convertList(List<${table.className}DO> list); + + PageResult<${sceneEnum.prefixClass}${table.className}RespVO> convertPage(PageResult<${table.className}DO> page); + + List<${sceneEnum.prefixClass}${table.className}ExcelVO> convertList02(List<${table.className}DO> list); + +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/dal/do.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/dal/do.vm new file mode 100644 index 0000000..4abae15 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/dal/do.vm @@ -0,0 +1,45 @@ +package ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}; + +import lombok.*; +import java.util.*; +#foreach ($column in $columns) +#if (${column.javaType} == "BigDecimal") +import java.math.BigDecimal; +#break +#end +#end +import com.baomidou.mybatisplus.annotation.*; +import ${BaseDOClassName}; + +/** + * ${table.classComment} DO + * + * @author ${table.author} + */ +@TableName("${table.tableName.toLowerCase()}") +@KeySequence("${table.tableName.toLowerCase()}_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ${table.className}DO extends BaseDO { + +#foreach ($column in $columns) +#if (!${baseDOFields.contains(${column.javaField})})##排除 BaseDO 的字段 + /** + * ${column.columnComment} + #if ("$!column.dictType" != "")##处理枚举值 + * + * 枚举 {@link TODO ${column.dictType} 对应的类} + #end + */ + #if (${column.primaryKey})##处理主键 + @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end + #end + private ${column.javaType} ${column.javaField}; +#end +#end + +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/dal/mapper.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/dal/mapper.vm new file mode 100644 index 0000000..615ae33 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/dal/mapper.vm @@ -0,0 +1,66 @@ +package ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}; + +import java.util.*; + +import ${PageResultClassName}; +import ${QueryWrapperClassName}; +import ${BaseMapperClassName}; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import org.apache.ibatis.annotations.Mapper; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; + +## 字段模板 +#macro(listCondition) +#foreach ($column in $columns) +#if (${column.listOperation}) +#set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 +#if (${column.listOperationCondition} == "=")##情况一,= 的时候 + .eqIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "!=")##情况二,!= 的时候 + .neIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == ">")##情况三,> 的时候 + .gtIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == ">=")##情况四,>= 的时候 + .geIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "<")##情况五,< 的时候 + .ltIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "<=")##情况五,<= 的时候 + .leIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "LIKE")##情况七,Like 的时候 + .likeIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#if (${column.listOperationCondition} == "BETWEEN")##情况八,Between 的时候 + .betweenIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) +#end +#end +#end +#end +/** + * ${table.classComment} Mapper + * + * @author ${table.author} + */ +@Mapper +public interface ${table.className}Mapper extends BaseMapperX<${table.className}DO> { + + default PageResult<${table.className}DO> selectPage(${sceneEnum.prefixClass}${table.className}PageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX<${table.className}DO>() + #listCondition() + .orderByDesc(${table.className}DO::getId));## 大多数情况下,id 倒序 + + } + + default List<${table.className}DO> selectList(${sceneEnum.prefixClass}${table.className}ExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX<${table.className}DO>() + #listCondition() + .orderByDesc(${table.className}DO::getId));## 大多数情况下,id 倒序 + + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/dal/mapper.xml.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/dal/mapper.xml.vm new file mode 100644 index 0000000..d930db9 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/dal/mapper.xml.vm @@ -0,0 +1,12 @@ + + + + + + + diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/enums/errorcode.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/enums/errorcode.vm new file mode 100644 index 0000000..e7f350d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/enums/errorcode.vm @@ -0,0 +1,3 @@ +// TODO 待办:请将下面的错误码复制到 joju-module-${table.moduleName}-api 模块的 ErrorCodeConstants 类中。注意,请给“TODO 补充编号”设置一个错误码编号!!! +// ========== ${table.classComment} TODO 补充编号 ========== +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${table.classComment}不存在"); diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/service/service.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/service/service.vm new file mode 100644 index 0000000..b8c6376 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/service/service.vm @@ -0,0 +1,70 @@ +package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; + +import java.util.*; +import javax.validation.*; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${PageResultClassName}; + +/** + * ${table.classComment} Service 接口 + * + * @author ${table.author} + */ +public interface ${table.className}Service { + + /** + * 创建${table.classComment} + * + * @param createReqVO 创建信息 + * @return 编号 + */ + ${primaryColumn.javaType} create${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}CreateReqVO createReqVO); + + /** + * 更新${table.classComment} + * + * @param updateReqVO 更新信息 + */ + void update${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}UpdateReqVO updateReqVO); + + /** + * 删除${table.classComment} + * + * @param id 编号 + */ + void delete${simpleClassName}(${primaryColumn.javaType} id); + + /** + * 获得${table.classComment} + * + * @param id 编号 + * @return ${table.classComment} + */ + ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id); + + /** + * 获得${table.classComment}列表 + * + * @param ids 编号 + * @return ${table.classComment}列表 + */ + List<${table.className}DO> get${simpleClassName}List(Collection<${primaryColumn.javaType}> ids); + + /** + * 获得${table.classComment}分页 + * + * @param pageReqVO 分页查询 + * @return ${table.classComment}分页 + */ + PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO); + + /** + * 获得${table.classComment}列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return ${table.classComment}列表 + */ + List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ExportReqVO exportReqVO); + +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/service/serviceImpl.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/service/serviceImpl.vm new file mode 100644 index 0000000..85dfa0a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/service/serviceImpl.vm @@ -0,0 +1,82 @@ +package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${PageResultClassName}; + +import ${basePackage}.module.${table.moduleName}.convert.${table.businessName}.${table.className}Convert; +import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; + +import static ${ServiceExceptionUtilClassName}.exception; +import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; + +/** + * ${table.classComment} Service 实现类 + * + * @author ${table.author} + */ +@Service +@Validated +public class ${table.className}ServiceImpl implements ${table.className}Service { + + @Resource + private ${table.className}Mapper ${classNameVar}Mapper; + + @Override + public ${primaryColumn.javaType} create${simpleClassName}(${sceneEnum.prefixClass}${table.className}CreateReqVO createReqVO) { + // 插入 + ${table.className}DO ${classNameVar} = ${table.className}Convert.INSTANCE.convert(createReqVO); + ${classNameVar}Mapper.insert(${classNameVar}); + // 返回 + return ${classNameVar}.getId(); + } + + @Override + public void update${simpleClassName}(${sceneEnum.prefixClass}${table.className}UpdateReqVO updateReqVO) { + // 校验存在 + this.validate${simpleClassName}Exists(updateReqVO.getId()); + // 更新 + ${table.className}DO updateObj = ${table.className}Convert.INSTANCE.convert(updateReqVO); + ${classNameVar}Mapper.updateById(updateObj); + } + + @Override + public void delete${simpleClassName}(${primaryColumn.javaType} id) { + // 校验存在 + this.validate${simpleClassName}Exists(id); + // 删除 + ${classNameVar}Mapper.deleteById(id); + } + + private void validate${simpleClassName}Exists(${primaryColumn.javaType} id) { + if (${classNameVar}Mapper.selectById(id) == null) { + throw exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + } + + @Override + public ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id) { + return ${classNameVar}Mapper.selectById(id); + } + + @Override + public List<${table.className}DO> get${simpleClassName}List(Collection<${primaryColumn.javaType}> ids) { + return ${classNameVar}Mapper.selectBatchIds(ids); + } + + @Override + public PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) { + return ${classNameVar}Mapper.selectPage(pageReqVO); + } + + @Override + public List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ExportReqVO exportReqVO) { + return ${classNameVar}Mapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/test/serviceTest.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/test/serviceTest.vm new file mode 100644 index 0000000..1b5c60a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/java/test/serviceTest.vm @@ -0,0 +1,163 @@ +package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import ${baseFrameworkPackage}.test.core.ut.BaseDbUnitTest; + +import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; +import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; +import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; +import ${PageResultClassName}; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; + +import static cn.hutool.core.util.RandomUtil.*; +import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; +import static ${baseFrameworkPackage}.test.core.util.AssertUtils.*; +import static ${baseFrameworkPackage}.test.core.util.RandomUtils.*; +import static ${ObjectUtilsClassName}.*; +import static ${DateUtilsClassName}.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +## 字段模板 +#macro(getPageCondition $VO) + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class, o -> { // 等会查询到 + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + o.set$JavaField(null); + #end + #end + }); + ${classNameVar}Mapper.insert(db${simpleClassName}); + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + // 测试 ${column.javaField} 不匹配 + ${classNameVar}Mapper.insert(cloneIgnoreId(db${simpleClassName}, o -> o.set$JavaField(null))); + #end + #end + // 准备参数 + ${sceneEnum.prefixClass}${table.className}${VO} reqVO = new ${sceneEnum.prefixClass}${table.className}${VO}(); + #foreach ($column in $columns) + #if (${column.listOperation}) + #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 + #if (${column.listOperationCondition} == "BETWEEN")## BETWEEN 的情况 + reqVO.set${JavaField}((new Date[]{})); + #else + reqVO.set$JavaField(null); + #end + #end + #end +#end +/** +* {@link ${table.className}ServiceImpl} 的单元测试类 +* +* @author ${table.author} +*/ +@Import(${table.className}ServiceImpl.class) +public class ${table.className}ServiceImplTest extends BaseDbUnitTest { + + @Resource + private ${table.className}ServiceImpl ${classNameVar}Service; + + @Resource + private ${table.className}Mapper ${classNameVar}Mapper; + + @Test + public void testCreate${simpleClassName}_success() { + // 准备参数 + ${sceneEnum.prefixClass}${table.className}CreateReqVO reqVO = randomPojo(${sceneEnum.prefixClass}${table.className}CreateReqVO.class); + + // 调用 + ${primaryColumn.javaType} ${classNameVar}Id = ${classNameVar}Service.create${simpleClassName}(reqVO); + // 断言 + assertNotNull(${classNameVar}Id); + // 校验记录的属性是否正确 + ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(${classNameVar}Id); + assertPojoEquals(reqVO, ${classNameVar}); + } + + @Test + public void testUpdate${simpleClassName}_success() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); + ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 + // 准备参数 + ${sceneEnum.prefixClass}${table.className}UpdateReqVO reqVO = randomPojo(${sceneEnum.prefixClass}${table.className}UpdateReqVO.class, o -> { + o.setId(db${simpleClassName}.getId()); // 设置更新的 ID + }); + + // 调用 + ${classNameVar}Service.update${simpleClassName}(reqVO); + // 校验是否更新正确 + ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, ${classNameVar}); + } + + @Test + public void testUpdate${simpleClassName}_notExists() { + // 准备参数 + ${sceneEnum.prefixClass}${table.className}UpdateReqVO reqVO = randomPojo(${sceneEnum.prefixClass}${table.className}UpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> ${classNameVar}Service.update${simpleClassName}(reqVO), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + + @Test + public void testDelete${simpleClassName}_success() { + // mock 数据 + ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); + ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 + // 准备参数 + ${primaryColumn.javaType} id = db${simpleClassName}.getId(); + + // 调用 + ${classNameVar}Service.delete${simpleClassName}(id); + // 校验数据不存在了 + assertNull(${classNameVar}Mapper.selectById(id)); + } + + @Test + public void testDelete${simpleClassName}_notExists() { + // 准备参数 + ${primaryColumn.javaType} id = random${primaryColumn.javaType}Id(); + + // 调用, 并断言异常 + assertServiceException(() -> ${classNameVar}Service.delete${simpleClassName}(id), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGet${simpleClassName}Page() { + #getPageCondition("PageReqVO") + + // 调用 + PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(db${simpleClassName}, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGet${simpleClassName}List() { + #getPageCondition("ExportReqVO") + + // 调用 + List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(db${simpleClassName}, list.get(0)); + } + +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/sql/h2.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/sql/h2.vm new file mode 100644 index 0000000..a11d5d9 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/sql/h2.vm @@ -0,0 +1,35 @@ +-- 将该建表 SQL 语句,添加到 joju-module-${table.moduleName}-biz 模块的 test/resources/sql/create_tables.sql 文件里 +CREATE TABLE IF NOT EXISTS "${table.tableName.toLowerCase()}" ( +#foreach ($column in $columns) +#if (${column.javaType} == 'Long') + #set ($dataType='bigint') +#elseif (${column.javaType} == 'Integer') + #set ($dataType='int') +#elseif (${column.javaType} == 'Boolean') + #set ($dataType='bit') +#elseif (${column.javaType} == 'Date') + #set ($dataType='datetime') +#else + #set ($dataType='varchar') +#end + #if (${column.primaryKey})##处理主键 + "${column.javaField}"#if (${column.javaType} == 'String') ${dataType} NOT NULL#else ${dataType} NOT NULL GENERATED BY DEFAULT AS IDENTITY#end, + #else + #if (${column.columnName} == 'create_time') + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + #elseif (${column.columnName} == 'update_time') + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + #elseif (${column.columnName} == 'creator' || ${column.columnName} == 'updater') + "${column.columnName}" ${dataType} DEFAULT '', + #elseif (${column.columnName} == 'deleted') + "deleted" bit NOT NULL DEFAULT FALSE, + #else + "${column.columnName.toLowerCase()}" ${dataType}#if (${column.nullable} == false) NOT NULL#end, + #end + #end +#end + PRIMARY KEY ("${primaryColumn.columnName.toLowerCase()}") +) COMMENT '${table.tableComment}'; + +-- 将该删表 SQL 语句,添加到 joju-module-${table.moduleName}-biz 模块的 test/resources/sql/clean.sql 文件里 +DELETE FROM "${table.tableName}"; diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/sql/sql.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/sql/sql.vm new file mode 100644 index 0000000..0edbdc1 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/sql/sql.vm @@ -0,0 +1,28 @@ +-- 菜单 SQL +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, + '${simpleClassName_strikeCase}', '', '${table.moduleName}/${classNameVar}/index', 0 +); + +-- 按钮父菜单ID +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +#set ($functionNames = ['查询', '创建', '更新', '删除', '导出']) +#set ($functionOps = ['query', 'create', 'update', 'delete', 'export']) +#foreach ($functionName in $functionNames) +#set ($index = $foreach.count - 1) +INSERT INTO system_menu( + name, permission, type, sort, parent_id, + path, icon, component, status +) +VALUES ( + '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, @parentId, + '', '', '', 0 +); +#end diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue/api/api.js.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue/api/api.js.vm new file mode 100644 index 0000000..5e9da32 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue/api/api.js.vm @@ -0,0 +1,55 @@ +import request from '@/utils/request' +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") + +// 创建${table.classComment} +export function create${simpleClassName}(data) { + return request({ + url: '${baseURL}/create', + method: 'post', + data: data + }) +} + +// 更新${table.classComment} +export function update${simpleClassName}(data) { + return request({ + url: '${baseURL}/update', + method: 'put', + data: data + }) +} + +// 删除${table.classComment} +export function delete${simpleClassName}(id) { + return request({ + url: '${baseURL}/delete?id=' + id, + method: 'delete' + }) +} + +// 获得${table.classComment} +export function get${simpleClassName}(id) { + return request({ + url: '${baseURL}/get?id=' + id, + method: 'get' + }) +} + +// 获得${table.classComment}分页 +export function get${simpleClassName}Page(query) { + return request({ + url: '${baseURL}/page', + method: 'get', + params: query + }) +} + +// 导出${table.classComment} Excel +export function export${simpleClassName}Excel(query) { + return request({ + url: '${baseURL}/export-excel', + method: 'get', + params: query, + responseType: 'blob' + }) +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue/views/index.vue.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue/views/index.vue.vm new file mode 100644 index 0000000..95f7d66 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue/views/index.vue.vm @@ -0,0 +1,369 @@ + + + diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue3/api/api.ts.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue3/api/api.ts.vm new file mode 100644 index 0000000..69da814 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue3/api/api.ts.vm @@ -0,0 +1,35 @@ +import { useAxios } from '@/hooks/web/useAxios' +import { ${simpleClassName}VO,${simpleClassName}PageReqVO,${simpleClassName}ExcelReqVO } from './types' + +const request = useAxios() + +#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") +// 查询${table.classComment}列表 +export const get${simpleClassName}PageApi = async (params: ${simpleClassName}PageReqVO) => { + return await request.get({ url: '${baseURL}/page', params }) +} + +// 查询${table.classComment}详情 +export const get${simpleClassName}Api = async (id: number) => { + return await request.get({ url: '${baseURL}/get?id=' + id }) +} + +// 新增${table.classComment} +export const create${simpleClassName}Api = async (data: ${simpleClassName}VO) => { + return await request.post({ url: '${baseURL}/create', data }) +} + +// 修改${table.classComment} +export const update${simpleClassName}Api = async (data: ${simpleClassName}VO) => { + return await request.put({ url: '${baseURL}/update', data }) +} + +// 删除${table.classComment} +export const delete${simpleClassName}Api = async (id: number) => { + return await request.delete({ url: '${baseURL}/delete?id=' + id }) +} + +// 导出${table.classComment} Excel +export const export${simpleClassName}Api = async (params: ${simpleClassName}ExcelReqVO) => { + return await request.download({ url: '${baseURL}/export-excel', params }) +} diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue3/api/types.ts.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue3/api/types.ts.vm new file mode 100644 index 0000000..d5b5d93 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue3/api/types.ts.vm @@ -0,0 +1,35 @@ +export type ${simpleClassName}VO = { +#foreach ($column in $columns) +#if ($column.createOperation || $column.updateOperation) +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer") + ${column.javaField}: number +#else + ${column.javaField}: ${column.javaType.toLowerCase()} +#end +#end +#end +} + +export type ${simpleClassName}PageReqVO = { +#foreach ($column in $columns) +#if (${column.listOperation})##查询操作 +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer") + ${column.javaField}: number +#else + ${column.javaField}: ${column.javaType.toLowerCase()} +#end +#end +#end +} + +export type ${simpleClassName}ExcelReqVO = { +#foreach ($column in $columns) +#if (${column.listOperation})##查询操作 +#if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer") + ${column.javaField}: number +#else + ${column.javaField}: ${column.javaType.toLowerCase()} +#end +#end +#end +} \ No newline at end of file diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue3/views/data.ts.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue3/views/data.ts.vm new file mode 100644 index 0000000..965fe49 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue3/views/data.ts.vm @@ -0,0 +1,111 @@ +import { reactive } from 'vue' +import { useI18n } from '@/hooks/web/useI18n' +import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas' +import { DICT_TYPE } from '@/utils/dict' +const { t } = useI18n() // 国际化 +// 表单校验 +export const rules = reactive({ +#foreach ($column in $columns) +#if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 +#set($comment=$column.columnComment) + $column.javaField: [{ required: true, message: "${comment}不能为空", trigger: #if($column.htmlType == "select")"change"#else"blur"#end }], +#end +#end +}) +// CrudSchema +const crudSchemas = reactive([ +#foreach($column in $columns) + #if ($column.listOperation || $column.listOperationResult || $column.createOperation || $column.updateOperation) + #set ($dictType = $column.dictType) + { + label: '${column.columnComment}', + field: '${column.javaField}', + #if ("" != $dictType)## 有数据字典 + dictType: DICT_TYPE.$dictType.toUpperCase(), + #end + #if($column.primaryKey) + type: 'index', + form: { + show: false + }, + detail: { + show: false + } + #else + #if (!$column.createOperation && !$column.updateOperation) + form: { + false + }, + #elseif(!("" != $column.dictType)) + form: { + show: true, + #if ($column.htmlType == "datetime")## 时间框 + component: 'DatePicker', + componentProps: { + type: 'datetime', + valueFormat: 'YYYY-MM-DD HH:mm:ss' + } + #elseif($column.htmlType == "editor")## 文本编辑器 + component: 'Editor', + colProps: { + span: 24 + }, + componentProps: { + valueHtml: '' + } + #elseif($column.htmlType == "textarea")## 文本框 + component: 'Input', + componentProps: { + type: 'textarea', + rows: 4 + }, + colProps: { + span: 24 + } + #end + }, + #end + #if ($column.listOperationResult) + search: { + #if($column.htmlType == "input") + show: true + #else + #if($column.htmlType == "datetime") + show: true, + component: 'DatePicker', + componentProps: { + type: 'datetimerange', + valueFormat: 'YYYY-MM-DD HH:mm:ss' + } + #elseif($column.htmlType == "select" || $column.htmlType == "radio") + #if ("" == $dictType)## 没有数据字典 + show: true, + component: 'Select', + componentProps: { + option: [{'','请选择字典生成'}] + } + #else + show: true + #end + #end + #end + } + #end + #end + }, + #end +#end + { + label: t('table.action'), + field: 'action', + width: '240px', + form: { + show: false + }, + detail: { + show: false + } + } +]) + +export const { allSchemas } = useCrudSchemas(crudSchemas) \ No newline at end of file diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue3/views/index.vue.vm b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue3/views/index.vue.vm new file mode 100644 index 0000000..c497a18 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/codegen/vue3/views/index.vue.vm @@ -0,0 +1,204 @@ + + + diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/api/file/FileApiImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/api/file/FileApiImpl.class new file mode 100644 index 0000000..9406001 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/api/file/FileApiImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/api/logger/ApiAccessLogApiImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/api/logger/ApiAccessLogApiImpl.class new file mode 100644 index 0000000..5f043c0 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/api/logger/ApiAccessLogApiImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/api/logger/ApiErrorLogApiImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/api/logger/ApiErrorLogApiImpl.class new file mode 100644 index 0000000..1cf58fe Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/api/logger/ApiErrorLogApiImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/CodegenController.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/CodegenController.class new file mode 100644 index 0000000..272d165 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/CodegenController.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.class new file mode 100644 index 0000000..d72f992 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.class new file mode 100644 index 0000000..f6d4b87 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.class new file mode 100644 index 0000000..e826f54 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO$Column.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO$Column.class new file mode 100644 index 0000000..dfbe409 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO$Column.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO$Table.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO$Table.class new file mode 100644 index 0000000..e99cac2 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO$Table.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.class new file mode 100644 index 0000000..947a2b3 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/column/CodegenColumnBaseVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/column/CodegenColumnBaseVO.class new file mode 100644 index 0000000..9654680 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/column/CodegenColumnBaseVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.class new file mode 100644 index 0000000..fa8c4c3 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTableBaseVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTableBaseVO.class new file mode 100644 index 0000000..3669956 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTableBaseVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.class new file mode 100644 index 0000000..3322ad4 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.class new file mode 100644 index 0000000..a90181e Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.class new file mode 100644 index 0000000..1c7f2b5 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/ConfigController.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/ConfigController.class new file mode 100644 index 0000000..bc65a77 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/ConfigController.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigBaseVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigBaseVO.class new file mode 100644 index 0000000..3737fde Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigBaseVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigCreateReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigCreateReqVO.class new file mode 100644 index 0000000..dc16ab9 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigCreateReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigExcelVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigExcelVO.class new file mode 100644 index 0000000..21e84e5 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigExcelVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigExportReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigExportReqVO.class new file mode 100644 index 0000000..c52be32 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigExportReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigPageReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigPageReqVO.class new file mode 100644 index 0000000..9698201 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigPageReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigRespVO.class new file mode 100644 index 0000000..40adc90 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.class new file mode 100644 index 0000000..59190bc Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/config/vo/ConfigUpdateReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/DataSourceConfigController.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/DataSourceConfigController.class new file mode 100644 index 0000000..e7688ea Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/DataSourceConfigController.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/DatabaseDocController.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/DatabaseDocController.class new file mode 100644 index 0000000..1fd2858 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/DatabaseDocController.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigBaseVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigBaseVO.class new file mode 100644 index 0000000..672e319 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigBaseVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigCreateReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigCreateReqVO.class new file mode 100644 index 0000000..6fc284e Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigCreateReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.class new file mode 100644 index 0000000..b65858c Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigUpdateReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigUpdateReqVO.class new file mode 100644 index 0000000..1eceeb4 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/db/vo/DataSourceConfigUpdateReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/FileConfigController.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/FileConfigController.class new file mode 100644 index 0000000..b5aaad3 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/FileConfigController.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/FileController.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/FileController.class new file mode 100644 index 0000000..11d2b00 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/FileController.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigBaseVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigBaseVO.class new file mode 100644 index 0000000..4c08d43 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigBaseVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigCreateReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigCreateReqVO.class new file mode 100644 index 0000000..26acb7c Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigCreateReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigPageReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigPageReqVO.class new file mode 100644 index 0000000..3117a8a Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigPageReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigRespVO.class new file mode 100644 index 0000000..18fe74b Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigUpdateReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigUpdateReqVO.class new file mode 100644 index 0000000..31bce6b Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/config/FileConfigUpdateReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/FilePageReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/FilePageReqVO.class new file mode 100644 index 0000000..4a77f38 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/FilePageReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/FileRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/FileRespVO.class new file mode 100644 index 0000000..53c9a79 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/FileRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/UploadRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/UploadRespVO.class new file mode 100644 index 0000000..05452f5 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/file/vo/file/UploadRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/JobController.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/JobController.class new file mode 100644 index 0000000..ac91e6f Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/JobController.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/JobLogController.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/JobLogController.class new file mode 100644 index 0000000..6120e41 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/JobLogController.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobBaseVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobBaseVO.class new file mode 100644 index 0000000..53f9c3e Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobBaseVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobCreateReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobCreateReqVO.class new file mode 100644 index 0000000..168a730 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobCreateReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobExcelVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobExcelVO.class new file mode 100644 index 0000000..6fdc83b Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobExcelVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobExportReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobExportReqVO.class new file mode 100644 index 0000000..de24081 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobExportReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobPageReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobPageReqVO.class new file mode 100644 index 0000000..b876c05 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobPageReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobRespVO.class new file mode 100644 index 0000000..752e843 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobUpdateReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobUpdateReqVO.class new file mode 100644 index 0000000..0d44100 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/job/JobUpdateReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogBaseVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogBaseVO.class new file mode 100644 index 0000000..47d664e Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogBaseVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogExcelVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogExcelVO.class new file mode 100644 index 0000000..878dc93 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogExcelVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.class new file mode 100644 index 0000000..e7efa57 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogExportReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.class new file mode 100644 index 0000000..39f8e37 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogPageReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogRespVO.class new file mode 100644 index 0000000..5c2759f Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/job/vo/log/JobLogRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/ApiAccessLogController.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/ApiAccessLogController.class new file mode 100644 index 0000000..491cff9 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/ApiAccessLogController.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/ApiErrorLogController.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/ApiErrorLogController.class new file mode 100644 index 0000000..e227f82 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/ApiErrorLogController.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogBaseVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogBaseVO.class new file mode 100644 index 0000000..4713d5f Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogBaseVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExcelVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExcelVO.class new file mode 100644 index 0000000..90e6ea5 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExcelVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.class new file mode 100644 index 0000000..7ea3f70 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogExportReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.class new file mode 100644 index 0000000..c90b303 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogPageReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.class new file mode 100644 index 0000000..d45bf84 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apiaccesslog/ApiAccessLogRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogBaseVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogBaseVO.class new file mode 100644 index 0000000..69966f9 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogBaseVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExcelVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExcelVO.class new file mode 100644 index 0000000..525ae5b Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExcelVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.class new file mode 100644 index 0000000..d6da67d Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogExportReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.class new file mode 100644 index 0000000..8739f59 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogPageReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.class new file mode 100644 index 0000000..d3d60ff Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/logger/vo/apierrorlog/ApiErrorLogRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/RedisController.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/RedisController.class new file mode 100644 index 0000000..52a502e Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/RedisController.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyDefineRespVO$RedisKeyDefineRespVOBuilder.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyDefineRespVO$RedisKeyDefineRespVOBuilder.class new file mode 100644 index 0000000..392c974 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyDefineRespVO$RedisKeyDefineRespVOBuilder.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyDefineRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyDefineRespVO.class new file mode 100644 index 0000000..9ca7c66 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyDefineRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyValueRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyValueRespVO.class new file mode 100644 index 0000000..65e3c7e Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisKeyValueRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO$CommandStat$CommandStatBuilder.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO$CommandStat$CommandStatBuilder.class new file mode 100644 index 0000000..65b0dc8 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO$CommandStat$CommandStatBuilder.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO$CommandStat.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO$CommandStat.class new file mode 100644 index 0000000..63d9983 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO$CommandStat.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO$RedisMonitorRespVOBuilder.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO$RedisMonitorRespVOBuilder.class new file mode 100644 index 0000000..0acfc82 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO$RedisMonitorRespVOBuilder.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.class new file mode 100644 index 0000000..66dc1e2 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/redis/vo/RedisMonitorRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/TestDemoController.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/TestDemoController.class new file mode 100644 index 0000000..7424038 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/TestDemoController.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoBaseVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoBaseVO.class new file mode 100644 index 0000000..0fc3aaf Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoBaseVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoCreateReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoCreateReqVO.class new file mode 100644 index 0000000..14687f6 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoCreateReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoExcelVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoExcelVO.class new file mode 100644 index 0000000..090a7f7 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoExcelVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoExportReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoExportReqVO.class new file mode 100644 index 0000000..ec88493 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoExportReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoPageReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoPageReqVO.class new file mode 100644 index 0000000..602f83e Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoPageReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoRespVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoRespVO.class new file mode 100644 index 0000000..a6aa1a0 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoRespVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoUpdateReqVO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoUpdateReqVO.class new file mode 100644 index 0000000..689aa14 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/controller/admin/test/vo/TestDemoUpdateReqVO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/codegen/CodegenConvert.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/codegen/CodegenConvert.class new file mode 100644 index 0000000..cdbc348 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/codegen/CodegenConvert.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/codegen/CodegenConvertImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/codegen/CodegenConvertImpl.class new file mode 100644 index 0000000..c0269f3 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/codegen/CodegenConvertImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/config/ConfigConvert.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/config/ConfigConvert.class new file mode 100644 index 0000000..6d00eae Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/config/ConfigConvert.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/config/ConfigConvertImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/config/ConfigConvertImpl.class new file mode 100644 index 0000000..bce9f95 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/config/ConfigConvertImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/db/DataSourceConfigConvert.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/db/DataSourceConfigConvert.class new file mode 100644 index 0000000..d2525d7 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/db/DataSourceConfigConvert.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/db/DataSourceConfigConvertImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/db/DataSourceConfigConvertImpl.class new file mode 100644 index 0000000..b986647 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/db/DataSourceConfigConvertImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/file/FileConfigConvert.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/file/FileConfigConvert.class new file mode 100644 index 0000000..960b9b3 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/file/FileConfigConvert.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/file/FileConfigConvertImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/file/FileConfigConvertImpl.class new file mode 100644 index 0000000..a93f0fb Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/file/FileConfigConvertImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/file/FileConvert.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/file/FileConvert.class new file mode 100644 index 0000000..0f2a63e Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/file/FileConvert.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/file/FileConvertImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/file/FileConvertImpl.class new file mode 100644 index 0000000..c7a518e Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/file/FileConvertImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/job/JobConvert.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/job/JobConvert.class new file mode 100644 index 0000000..df9e4ee Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/job/JobConvert.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/job/JobConvertImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/job/JobConvertImpl.class new file mode 100644 index 0000000..5a17bb1 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/job/JobConvertImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/job/JobLogConvert.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/job/JobLogConvert.class new file mode 100644 index 0000000..ee7f817 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/job/JobLogConvert.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/job/JobLogConvertImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/job/JobLogConvertImpl.class new file mode 100644 index 0000000..ad8bb8c Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/job/JobLogConvertImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/logger/ApiAccessLogConvert.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/logger/ApiAccessLogConvert.class new file mode 100644 index 0000000..db4e388 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/logger/ApiAccessLogConvert.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/logger/ApiAccessLogConvertImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/logger/ApiAccessLogConvertImpl.class new file mode 100644 index 0000000..3f562d1 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/logger/ApiAccessLogConvertImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/logger/ApiErrorLogConvert.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/logger/ApiErrorLogConvert.class new file mode 100644 index 0000000..2631229 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/logger/ApiErrorLogConvert.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/logger/ApiErrorLogConvertImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/logger/ApiErrorLogConvertImpl.class new file mode 100644 index 0000000..1779249 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/logger/ApiErrorLogConvertImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/redis/RedisConvert.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/redis/RedisConvert.class new file mode 100644 index 0000000..05651f2 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/redis/RedisConvert.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/redis/RedisConvertImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/redis/RedisConvertImpl.class new file mode 100644 index 0000000..04f16f0 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/redis/RedisConvertImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/test/TestDemoConvert.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/test/TestDemoConvert.class new file mode 100644 index 0000000..1435fdf Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/test/TestDemoConvert.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/test/TestDemoConvertImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/test/TestDemoConvertImpl.class new file mode 100644 index 0000000..faa04f1 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/convert/test/TestDemoConvertImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/codegen/CodegenColumnDO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/codegen/CodegenColumnDO.class new file mode 100644 index 0000000..c4e20fb Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/codegen/CodegenColumnDO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/codegen/CodegenTableDO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/codegen/CodegenTableDO.class new file mode 100644 index 0000000..d76f351 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/codegen/CodegenTableDO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/config/ConfigDO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/config/ConfigDO.class new file mode 100644 index 0000000..7758d84 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/config/ConfigDO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/db/DataSourceConfigDO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/db/DataSourceConfigDO.class new file mode 100644 index 0000000..976b332 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/db/DataSourceConfigDO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileConfigDO$FileConfigDOBuilder.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileConfigDO$FileConfigDOBuilder.class new file mode 100644 index 0000000..4d5ef22 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileConfigDO$FileConfigDOBuilder.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileConfigDO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileConfigDO.class new file mode 100644 index 0000000..8cf42ab Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileConfigDO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileContentDO$FileContentDOBuilder.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileContentDO$FileContentDOBuilder.class new file mode 100644 index 0000000..14f2a67 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileContentDO$FileContentDOBuilder.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileContentDO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileContentDO.class new file mode 100644 index 0000000..a72194c Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileContentDO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileDO$FileDOBuilder.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileDO$FileDOBuilder.class new file mode 100644 index 0000000..a7b45c7 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileDO$FileDOBuilder.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileDO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileDO.class new file mode 100644 index 0000000..2c00b91 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/file/FileDO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/job/JobDO$JobDOBuilder.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/job/JobDO$JobDOBuilder.class new file mode 100644 index 0000000..7838a56 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/job/JobDO$JobDOBuilder.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/job/JobDO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/job/JobDO.class new file mode 100644 index 0000000..4d5ebce Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/job/JobDO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/job/JobLogDO$JobLogDOBuilder.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/job/JobLogDO$JobLogDOBuilder.class new file mode 100644 index 0000000..ac90d8b Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/job/JobLogDO$JobLogDOBuilder.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/job/JobLogDO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/job/JobLogDO.class new file mode 100644 index 0000000..c2b295c Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/job/JobLogDO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiAccessLogDO$ApiAccessLogDOBuilder.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiAccessLogDO$ApiAccessLogDOBuilder.class new file mode 100644 index 0000000..d16096b Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiAccessLogDO$ApiAccessLogDOBuilder.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiAccessLogDO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiAccessLogDO.class new file mode 100644 index 0000000..77b7b9e Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiAccessLogDO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiErrorLogDO$ApiErrorLogDOBuilder.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiErrorLogDO$ApiErrorLogDOBuilder.class new file mode 100644 index 0000000..918637b Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiErrorLogDO$ApiErrorLogDOBuilder.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiErrorLogDO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiErrorLogDO.class new file mode 100644 index 0000000..ee7125a Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/logger/ApiErrorLogDO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/test/TestDemoDO$TestDemoDOBuilder.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/test/TestDemoDO$TestDemoDOBuilder.class new file mode 100644 index 0000000..c869d64 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/test/TestDemoDO$TestDemoDOBuilder.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/test/TestDemoDO.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/test/TestDemoDO.class new file mode 100644 index 0000000..ec68c45 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/dataobject/test/TestDemoDO.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/codegen/CodegenColumnMapper.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/codegen/CodegenColumnMapper.class new file mode 100644 index 0000000..16ea94f Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/codegen/CodegenColumnMapper.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/codegen/CodegenTableMapper.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/codegen/CodegenTableMapper.class new file mode 100644 index 0000000..75ec2f4 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/codegen/CodegenTableMapper.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/config/ConfigMapper.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/config/ConfigMapper.class new file mode 100644 index 0000000..5791ab8 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/config/ConfigMapper.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/db/DataSourceConfigMapper.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/db/DataSourceConfigMapper.class new file mode 100644 index 0000000..e9f5817 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/db/DataSourceConfigMapper.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/file/FileConfigMapper.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/file/FileConfigMapper.class new file mode 100644 index 0000000..02fccfa Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/file/FileConfigMapper.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/file/FileContentDAOImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/file/FileContentDAOImpl.class new file mode 100644 index 0000000..3f3d20f Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/file/FileContentDAOImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/file/FileContentMapper.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/file/FileContentMapper.class new file mode 100644 index 0000000..4e9582c Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/file/FileContentMapper.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/file/FileMapper.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/file/FileMapper.class new file mode 100644 index 0000000..6745f52 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/file/FileMapper.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/job/JobLogMapper.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/job/JobLogMapper.class new file mode 100644 index 0000000..205543d Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/job/JobLogMapper.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/job/JobMapper.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/job/JobMapper.class new file mode 100644 index 0000000..6c64ecb Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/job/JobMapper.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/logger/ApiAccessLogMapper.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/logger/ApiAccessLogMapper.class new file mode 100644 index 0000000..5615512 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/logger/ApiAccessLogMapper.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/logger/ApiErrorLogMapper.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/logger/ApiErrorLogMapper.class new file mode 100644 index 0000000..6d04807 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/logger/ApiErrorLogMapper.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/test/TestDemoMapper.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/test/TestDemoMapper.class new file mode 100644 index 0000000..5676e77 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/dal/mysql/test/TestDemoMapper.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.class new file mode 100644 index 0000000..e6c5e3d Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/codegen/CodegenColumnListConditionEnum.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/codegen/CodegenColumnListConditionEnum.class new file mode 100644 index 0000000..7c05720 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/codegen/CodegenColumnListConditionEnum.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/codegen/CodegenSceneEnum.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/codegen/CodegenSceneEnum.class new file mode 100644 index 0000000..1e668b9 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/codegen/CodegenSceneEnum.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/codegen/CodegenTemplateTypeEnum.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/codegen/CodegenTemplateTypeEnum.class new file mode 100644 index 0000000..57549cc Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/codegen/CodegenTemplateTypeEnum.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/config/ConfigTypeEnum.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/config/ConfigTypeEnum.class new file mode 100644 index 0000000..fda2326 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/config/ConfigTypeEnum.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/job/JobLogStatusEnum.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/job/JobLogStatusEnum.class new file mode 100644 index 0000000..035bab4 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/job/JobLogStatusEnum.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/job/JobStatusEnum.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/job/JobStatusEnum.class new file mode 100644 index 0000000..396bdab Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/job/JobStatusEnum.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.class new file mode 100644 index 0000000..e4a2bf5 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/enums/logger/ApiErrorLogProcessStatusEnum.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/framework/codegen/config/CodegenConfiguration.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/framework/codegen/config/CodegenConfiguration.class new file mode 100644 index 0000000..57891fc Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/framework/codegen/config/CodegenConfiguration.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/framework/codegen/config/CodegenProperties.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/framework/codegen/config/CodegenProperties.class new file mode 100644 index 0000000..c3cd73f Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/framework/codegen/config/CodegenProperties.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/framework/security/config/SecurityConfiguration$1.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/framework/security/config/SecurityConfiguration$1.class new file mode 100644 index 0000000..8726b19 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/framework/security/config/SecurityConfiguration$1.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/framework/security/config/SecurityConfiguration.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/framework/security/config/SecurityConfiguration.class new file mode 100644 index 0000000..72f4d6e Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/framework/security/config/SecurityConfiguration.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/consumer/file/FileConfigRefreshConsumer.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/consumer/file/FileConfigRefreshConsumer.class new file mode 100644 index 0000000..e8a2493 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/consumer/file/FileConfigRefreshConsumer.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/message/config/ConfigRefreshMessage.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/message/config/ConfigRefreshMessage.class new file mode 100644 index 0000000..a34744c Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/message/config/ConfigRefreshMessage.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/message/file/FileConfigRefreshMessage.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/message/file/FileConfigRefreshMessage.class new file mode 100644 index 0000000..3a0d334 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/message/file/FileConfigRefreshMessage.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/producer/config/ConfigProducer.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/producer/config/ConfigProducer.class new file mode 100644 index 0000000..f76bf16 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/producer/config/ConfigProducer.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/producer/file/FileConfigProducer.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/producer/file/FileConfigProducer.class new file mode 100644 index 0000000..f451eef Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/mq/producer/file/FileConfigProducer.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/codegen/CodegenService.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/codegen/CodegenService.class new file mode 100644 index 0000000..7e8d308 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/codegen/CodegenService.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/codegen/CodegenServiceImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/codegen/CodegenServiceImpl.class new file mode 100644 index 0000000..c262c62 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/codegen/CodegenServiceImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/codegen/inner/CodegenBuilder.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/codegen/inner/CodegenBuilder.class new file mode 100644 index 0000000..00f3232 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/codegen/inner/CodegenBuilder.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/codegen/inner/CodegenEngine.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/codegen/inner/CodegenEngine.class new file mode 100644 index 0000000..9b76f89 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/codegen/inner/CodegenEngine.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/config/ConfigService.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/config/ConfigService.class new file mode 100644 index 0000000..e03abd4 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/config/ConfigService.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/config/ConfigServiceImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/config/ConfigServiceImpl.class new file mode 100644 index 0000000..ac00a84 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/config/ConfigServiceImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/db/DataSourceConfigService.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/db/DataSourceConfigService.class new file mode 100644 index 0000000..1cccdc3 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/db/DataSourceConfigService.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/db/DataSourceConfigServiceImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/db/DataSourceConfigServiceImpl.class new file mode 100644 index 0000000..ff2f5b0 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/db/DataSourceConfigServiceImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/db/DatabaseTableService.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/db/DatabaseTableService.class new file mode 100644 index 0000000..09818b6 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/db/DatabaseTableService.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/db/DatabaseTableServiceImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/db/DatabaseTableServiceImpl.class new file mode 100644 index 0000000..80c39f1 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/db/DatabaseTableServiceImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileConfigService.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileConfigService.class new file mode 100644 index 0000000..521cea0 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileConfigService.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImpl$1.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImpl$1.class new file mode 100644 index 0000000..464897d Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImpl$1.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImpl.class new file mode 100644 index 0000000..f0cecc6 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileService.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileService.class new file mode 100644 index 0000000..69329f0 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileService.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileServiceImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileServiceImpl.class new file mode 100644 index 0000000..1a9749a Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/file/FileServiceImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/job/JobLogService.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/job/JobLogService.class new file mode 100644 index 0000000..61cef63 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/job/JobLogService.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/job/JobLogServiceImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/job/JobLogServiceImpl.class new file mode 100644 index 0000000..abed1d4 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/job/JobLogServiceImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/job/JobService.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/job/JobService.class new file mode 100644 index 0000000..c16d6b4 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/job/JobService.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/job/JobServiceImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/job/JobServiceImpl.class new file mode 100644 index 0000000..7e7ab0e Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/job/JobServiceImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogService.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogService.class new file mode 100644 index 0000000..bbc29b6 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogService.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogServiceImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogServiceImpl.class new file mode 100644 index 0000000..f9505c4 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogServiceImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogService.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogService.class new file mode 100644 index 0000000..4fe36a5 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogService.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogServiceImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogServiceImpl.class new file mode 100644 index 0000000..e9667e5 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogServiceImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/test/TestDemoService.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/test/TestDemoService.class new file mode 100644 index 0000000..972a628 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/test/TestDemoService.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/test/TestDemoServiceImpl.class b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/test/TestDemoServiceImpl.class new file mode 100644 index 0000000..c5675e7 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/com/jojubanking/boot/module/infra/service/test/TestDemoServiceImpl.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/file/erweima.jpg b/joju-module-infra/joju-module-infra-biz/target/classes/file/erweima.jpg new file mode 100644 index 0000000..1447283 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/classes/file/erweima.jpg differ diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/mapper/test/TestDemoMapper.xml b/joju-module-infra/joju-module-infra-biz/target/classes/mapper/test/TestDemoMapper.xml new file mode 100644 index 0000000..140c4bd --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/classes/mapper/test/TestDemoMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/joju-module-infra/joju-module-infra-biz/target/classes/mapper/占位 b/joju-module-infra/joju-module-infra-biz/target/classes/mapper/占位 new file mode 100644 index 0000000..e69de29 diff --git a/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/codegen/CodegenConvertImpl.java b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/codegen/CodegenConvertImpl.java new file mode 100644 index 0000000..eb234c2 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/codegen/CodegenConvertImpl.java @@ -0,0 +1,300 @@ +package com.jojubanking.boot.module.infra.convert.codegen; + +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableField.MetaInfo; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.baomidou.mybatisplus.generator.config.rules.IColumnType; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO.Column; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO.Table; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.column.CodegenColumnRespVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO; +import com.jojubanking.boot.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenColumnDO; +import com.jojubanking.boot.module.infra.dal.dataobject.codegen.CodegenTableDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:31:57+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class CodegenConvertImpl implements CodegenConvert { + + @Override + public CodegenTableDO convert(TableInfo bean) { + if ( bean == null ) { + return null; + } + + CodegenTableDO codegenTableDO = new CodegenTableDO(); + + codegenTableDO.setTableName( bean.getName() ); + codegenTableDO.setTableComment( bean.getComment() ); + + return codegenTableDO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( TableField tableField : list ) { + list1.add( convert( tableField ) ); + } + + return list1; + } + + @Override + public CodegenColumnDO convert(TableField bean) { + if ( bean == null ) { + return null; + } + + CodegenColumnDO codegenColumnDO = new CodegenColumnDO(); + + codegenColumnDO.setColumnName( bean.getName() ); + codegenColumnDO.setDataType( bean.getType() ); + codegenColumnDO.setColumnComment( bean.getComment() ); + codegenColumnDO.setNullable( beanMetaInfoNullable( bean ) ); + codegenColumnDO.setPrimaryKey( bean.isKeyFlag() ); + codegenColumnDO.setAutoIncrement( bean.isKeyIdentityFlag() ); + codegenColumnDO.setJavaType( beanColumnTypeType( bean ) ); + codegenColumnDO.setJavaField( bean.getPropertyName() ); + + return codegenColumnDO; + } + + @Override + public CodegenTableRespVO convert(CodegenTableDO bean) { + if ( bean == null ) { + return null; + } + + CodegenTableRespVO codegenTableRespVO = new CodegenTableRespVO(); + + codegenTableRespVO.setScene( bean.getScene() ); + codegenTableRespVO.setTableName( bean.getTableName() ); + codegenTableRespVO.setTableComment( bean.getTableComment() ); + codegenTableRespVO.setRemark( bean.getRemark() ); + codegenTableRespVO.setModuleName( bean.getModuleName() ); + codegenTableRespVO.setBusinessName( bean.getBusinessName() ); + codegenTableRespVO.setClassName( bean.getClassName() ); + codegenTableRespVO.setClassComment( bean.getClassComment() ); + codegenTableRespVO.setAuthor( bean.getAuthor() ); + codegenTableRespVO.setTemplateType( bean.getTemplateType() ); + codegenTableRespVO.setParentMenuId( bean.getParentMenuId() ); + codegenTableRespVO.setId( bean.getId() ); + if ( bean.getDataSourceConfigId() != null ) { + codegenTableRespVO.setDataSourceConfigId( bean.getDataSourceConfigId().intValue() ); + } + codegenTableRespVO.setCreateTime( bean.getCreateTime() ); + codegenTableRespVO.setUpdateTime( bean.getUpdateTime() ); + + return codegenTableRespVO; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( codegenTableDOListToCodegenTableRespVOList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( CodegenColumnDO codegenColumnDO : list ) { + list1.add( codegenColumnDOToCodegenColumnRespVO( codegenColumnDO ) ); + } + + return list1; + } + + @Override + public CodegenTableDO convert(Table bean) { + if ( bean == null ) { + return null; + } + + CodegenTableDO codegenTableDO = new CodegenTableDO(); + + codegenTableDO.setId( bean.getId() ); + codegenTableDO.setScene( bean.getScene() ); + codegenTableDO.setTableName( bean.getTableName() ); + codegenTableDO.setTableComment( bean.getTableComment() ); + codegenTableDO.setRemark( bean.getRemark() ); + codegenTableDO.setModuleName( bean.getModuleName() ); + codegenTableDO.setBusinessName( bean.getBusinessName() ); + codegenTableDO.setClassName( bean.getClassName() ); + codegenTableDO.setClassComment( bean.getClassComment() ); + codegenTableDO.setAuthor( bean.getAuthor() ); + codegenTableDO.setTemplateType( bean.getTemplateType() ); + codegenTableDO.setParentMenuId( bean.getParentMenuId() ); + + return codegenTableDO; + } + + @Override + public List convertList03(List columns) { + if ( columns == null ) { + return null; + } + + List list = new ArrayList( columns.size() ); + for ( Column column : columns ) { + list.add( columnToCodegenColumnDO( column ) ); + } + + return list; + } + + @Override + public List convertList04(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( TableInfo tableInfo : list ) { + list1.add( tableInfoToDatabaseTableRespVO( tableInfo ) ); + } + + return list1; + } + + private Boolean beanMetaInfoNullable(TableField tableField) { + if ( tableField == null ) { + return null; + } + MetaInfo metaInfo = tableField.getMetaInfo(); + if ( metaInfo == null ) { + return null; + } + boolean nullable = metaInfo.isNullable(); + return nullable; + } + + private String beanColumnTypeType(TableField tableField) { + if ( tableField == null ) { + return null; + } + IColumnType columnType = tableField.getColumnType(); + if ( columnType == null ) { + return null; + } + String type = columnType.getType(); + if ( type == null ) { + return null; + } + return type; + } + + protected List codegenTableDOListToCodegenTableRespVOList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( CodegenTableDO codegenTableDO : list ) { + list1.add( convert( codegenTableDO ) ); + } + + return list1; + } + + protected CodegenColumnRespVO codegenColumnDOToCodegenColumnRespVO(CodegenColumnDO codegenColumnDO) { + if ( codegenColumnDO == null ) { + return null; + } + + CodegenColumnRespVO codegenColumnRespVO = new CodegenColumnRespVO(); + + codegenColumnRespVO.setTableId( codegenColumnDO.getTableId() ); + codegenColumnRespVO.setColumnName( codegenColumnDO.getColumnName() ); + codegenColumnRespVO.setDataType( codegenColumnDO.getDataType() ); + codegenColumnRespVO.setColumnComment( codegenColumnDO.getColumnComment() ); + codegenColumnRespVO.setNullable( codegenColumnDO.getNullable() ); + codegenColumnRespVO.setPrimaryKey( codegenColumnDO.getPrimaryKey() ); + if ( codegenColumnDO.getAutoIncrement() != null ) { + codegenColumnRespVO.setAutoIncrement( String.valueOf( codegenColumnDO.getAutoIncrement() ) ); + } + codegenColumnRespVO.setOrdinalPosition( codegenColumnDO.getOrdinalPosition() ); + codegenColumnRespVO.setJavaType( codegenColumnDO.getJavaType() ); + codegenColumnRespVO.setJavaField( codegenColumnDO.getJavaField() ); + codegenColumnRespVO.setDictType( codegenColumnDO.getDictType() ); + codegenColumnRespVO.setExample( codegenColumnDO.getExample() ); + codegenColumnRespVO.setCreateOperation( codegenColumnDO.getCreateOperation() ); + codegenColumnRespVO.setUpdateOperation( codegenColumnDO.getUpdateOperation() ); + codegenColumnRespVO.setListOperation( codegenColumnDO.getListOperation() ); + codegenColumnRespVO.setListOperationCondition( codegenColumnDO.getListOperationCondition() ); + codegenColumnRespVO.setListOperationResult( codegenColumnDO.getListOperationResult() ); + codegenColumnRespVO.setHtmlType( codegenColumnDO.getHtmlType() ); + codegenColumnRespVO.setId( codegenColumnDO.getId() ); + codegenColumnRespVO.setCreateTime( codegenColumnDO.getCreateTime() ); + + return codegenColumnRespVO; + } + + protected CodegenColumnDO columnToCodegenColumnDO(Column column) { + if ( column == null ) { + return null; + } + + CodegenColumnDO codegenColumnDO = new CodegenColumnDO(); + + codegenColumnDO.setId( column.getId() ); + codegenColumnDO.setTableId( column.getTableId() ); + codegenColumnDO.setColumnName( column.getColumnName() ); + codegenColumnDO.setDataType( column.getDataType() ); + codegenColumnDO.setColumnComment( column.getColumnComment() ); + codegenColumnDO.setNullable( column.getNullable() ); + codegenColumnDO.setPrimaryKey( column.getPrimaryKey() ); + if ( column.getAutoIncrement() != null ) { + codegenColumnDO.setAutoIncrement( Boolean.parseBoolean( column.getAutoIncrement() ) ); + } + codegenColumnDO.setOrdinalPosition( column.getOrdinalPosition() ); + codegenColumnDO.setJavaType( column.getJavaType() ); + codegenColumnDO.setJavaField( column.getJavaField() ); + codegenColumnDO.setDictType( column.getDictType() ); + codegenColumnDO.setExample( column.getExample() ); + codegenColumnDO.setCreateOperation( column.getCreateOperation() ); + codegenColumnDO.setUpdateOperation( column.getUpdateOperation() ); + codegenColumnDO.setListOperation( column.getListOperation() ); + codegenColumnDO.setListOperationCondition( column.getListOperationCondition() ); + codegenColumnDO.setListOperationResult( column.getListOperationResult() ); + codegenColumnDO.setHtmlType( column.getHtmlType() ); + + return codegenColumnDO; + } + + protected DatabaseTableRespVO tableInfoToDatabaseTableRespVO(TableInfo tableInfo) { + if ( tableInfo == null ) { + return null; + } + + DatabaseTableRespVO databaseTableRespVO = new DatabaseTableRespVO(); + + databaseTableRespVO.setName( tableInfo.getName() ); + databaseTableRespVO.setComment( tableInfo.getComment() ); + + return databaseTableRespVO; + } +} diff --git a/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/config/ConfigConvertImpl.java b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/config/ConfigConvertImpl.java new file mode 100644 index 0000000..9a0853d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/config/ConfigConvertImpl.java @@ -0,0 +1,134 @@ +package com.jojubanking.boot.module.infra.convert.config; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigRespVO; +import com.jojubanking.boot.module.infra.controller.admin.config.vo.ConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.config.ConfigDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:31:57+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class ConfigConvertImpl implements ConfigConvert { + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( configDOListToConfigRespVOList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public ConfigRespVO convert(ConfigDO bean) { + if ( bean == null ) { + return null; + } + + ConfigRespVO configRespVO = new ConfigRespVO(); + + configRespVO.setKey( bean.getConfigKey() ); + configRespVO.setCategory( bean.getCategory() ); + configRespVO.setName( bean.getName() ); + configRespVO.setValue( bean.getValue() ); + configRespVO.setVisible( bean.getVisible() ); + configRespVO.setRemark( bean.getRemark() ); + configRespVO.setId( bean.getId() ); + configRespVO.setType( bean.getType() ); + configRespVO.setCreateTime( bean.getCreateTime() ); + + return configRespVO; + } + + @Override + public ConfigDO convert(ConfigCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + ConfigDO configDO = new ConfigDO(); + + configDO.setConfigKey( bean.getKey() ); + configDO.setCategory( bean.getCategory() ); + configDO.setName( bean.getName() ); + configDO.setValue( bean.getValue() ); + configDO.setVisible( bean.getVisible() ); + configDO.setRemark( bean.getRemark() ); + + return configDO; + } + + @Override + public ConfigDO convert(ConfigUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + ConfigDO configDO = new ConfigDO(); + + configDO.setId( bean.getId() ); + configDO.setCategory( bean.getCategory() ); + configDO.setName( bean.getName() ); + configDO.setValue( bean.getValue() ); + configDO.setVisible( bean.getVisible() ); + configDO.setRemark( bean.getRemark() ); + + return configDO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ConfigDO configDO : list ) { + list1.add( configDOToConfigExcelVO( configDO ) ); + } + + return list1; + } + + protected List configDOListToConfigRespVOList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ConfigDO configDO : list ) { + list1.add( convert( configDO ) ); + } + + return list1; + } + + protected ConfigExcelVO configDOToConfigExcelVO(ConfigDO configDO) { + if ( configDO == null ) { + return null; + } + + ConfigExcelVO configExcelVO = new ConfigExcelVO(); + + configExcelVO.setId( configDO.getId() ); + configExcelVO.setName( configDO.getName() ); + configExcelVO.setValue( configDO.getValue() ); + configExcelVO.setType( configDO.getType() ); + configExcelVO.setRemark( configDO.getRemark() ); + configExcelVO.setCreateTime( configDO.getCreateTime() ); + + return configExcelVO; + } +} diff --git a/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/db/DataSourceConfigConvertImpl.java b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/db/DataSourceConfigConvertImpl.java new file mode 100644 index 0000000..6c7ee99 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/db/DataSourceConfigConvertImpl.java @@ -0,0 +1,83 @@ +package com.jojubanking.boot.module.infra.convert.db; + +import com.jojubanking.boot.module.infra.controller.admin.db.vo.DataSourceConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.db.vo.DataSourceConfigRespVO; +import com.jojubanking.boot.module.infra.controller.admin.db.vo.DataSourceConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.db.DataSourceConfigDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:31:57+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class DataSourceConfigConvertImpl implements DataSourceConfigConvert { + + @Override + public DataSourceConfigDO convert(DataSourceConfigCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + DataSourceConfigDO dataSourceConfigDO = new DataSourceConfigDO(); + + dataSourceConfigDO.setName( bean.getName() ); + dataSourceConfigDO.setUrl( bean.getUrl() ); + dataSourceConfigDO.setUsername( bean.getUsername() ); + dataSourceConfigDO.setPassword( bean.getPassword() ); + + return dataSourceConfigDO; + } + + @Override + public DataSourceConfigDO convert(DataSourceConfigUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + DataSourceConfigDO dataSourceConfigDO = new DataSourceConfigDO(); + + dataSourceConfigDO.setId( bean.getId() ); + dataSourceConfigDO.setName( bean.getName() ); + dataSourceConfigDO.setUrl( bean.getUrl() ); + dataSourceConfigDO.setUsername( bean.getUsername() ); + dataSourceConfigDO.setPassword( bean.getPassword() ); + + return dataSourceConfigDO; + } + + @Override + public DataSourceConfigRespVO convert(DataSourceConfigDO bean) { + if ( bean == null ) { + return null; + } + + DataSourceConfigRespVO dataSourceConfigRespVO = new DataSourceConfigRespVO(); + + dataSourceConfigRespVO.setName( bean.getName() ); + dataSourceConfigRespVO.setUrl( bean.getUrl() ); + dataSourceConfigRespVO.setUsername( bean.getUsername() ); + if ( bean.getId() != null ) { + dataSourceConfigRespVO.setId( bean.getId().intValue() ); + } + dataSourceConfigRespVO.setCreateTime( bean.getCreateTime() ); + + return dataSourceConfigRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DataSourceConfigDO dataSourceConfigDO : list ) { + list1.add( convert( dataSourceConfigDO ) ); + } + + return list1; + } +} diff --git a/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/file/FileConfigConvertImpl.java b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/file/FileConfigConvertImpl.java new file mode 100644 index 0000000..e25c690 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/file/FileConfigConvertImpl.java @@ -0,0 +1,95 @@ +package com.jojubanking.boot.module.infra.convert.file; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigRespVO; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.config.FileConfigUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileConfigDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:31:57+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class FileConfigConvertImpl implements FileConfigConvert { + + @Override + public FileConfigDO convert(FileConfigCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + FileConfigDO fileConfigDO = new FileConfigDO(); + + fileConfigDO.setName( bean.getName() ); + fileConfigDO.setStorage( bean.getStorage() ); + fileConfigDO.setRemark( bean.getRemark() ); + + return fileConfigDO; + } + + @Override + public FileConfigDO convert(FileConfigUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + FileConfigDO fileConfigDO = new FileConfigDO(); + + fileConfigDO.setId( bean.getId() ); + fileConfigDO.setName( bean.getName() ); + fileConfigDO.setRemark( bean.getRemark() ); + + return fileConfigDO; + } + + @Override + public FileConfigRespVO convert(FileConfigDO bean) { + if ( bean == null ) { + return null; + } + + FileConfigRespVO fileConfigRespVO = new FileConfigRespVO(); + + fileConfigRespVO.setName( bean.getName() ); + fileConfigRespVO.setRemark( bean.getRemark() ); + fileConfigRespVO.setId( bean.getId() ); + fileConfigRespVO.setStorage( bean.getStorage() ); + fileConfigRespVO.setMaster( bean.getMaster() ); + fileConfigRespVO.setConfig( bean.getConfig() ); + fileConfigRespVO.setCreateTime( bean.getCreateTime() ); + + return fileConfigRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( FileConfigDO fileConfigDO : list ) { + list1.add( convert( fileConfigDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } +} diff --git a/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/file/FileConvertImpl.java b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/file/FileConvertImpl.java new file mode 100644 index 0000000..da4a80e --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/file/FileConvertImpl.java @@ -0,0 +1,63 @@ +package com.jojubanking.boot.module.infra.convert.file; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.file.vo.file.FileRespVO; +import com.jojubanking.boot.module.infra.dal.dataobject.file.FileDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:31:57+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class FileConvertImpl implements FileConvert { + + @Override + public FileRespVO convert(FileDO bean) { + if ( bean == null ) { + return null; + } + + FileRespVO fileRespVO = new FileRespVO(); + + fileRespVO.setId( bean.getId() ); + fileRespVO.setConfigId( bean.getConfigId() ); + fileRespVO.setPath( bean.getPath() ); + fileRespVO.setName( bean.getName() ); + fileRespVO.setUrl( bean.getUrl() ); + fileRespVO.setType( bean.getType() ); + fileRespVO.setSize( bean.getSize() ); + fileRespVO.setCreateTime( bean.getCreateTime() ); + + return fileRespVO; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( fileDOListToFileRespVOList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + protected List fileDOListToFileRespVOList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( FileDO fileDO : list ) { + list1.add( convert( fileDO ) ); + } + + return list1; + } +} diff --git a/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/job/JobConvertImpl.java b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/job/JobConvertImpl.java new file mode 100644 index 0000000..acbecc8 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/job/JobConvertImpl.java @@ -0,0 +1,140 @@ +package com.jojubanking.boot.module.infra.convert.job; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobRespVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.job.JobUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:31:57+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class JobConvertImpl implements JobConvert { + + @Override + public JobDO convert(JobCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + JobDO jobDO = new JobDO(); + + jobDO.setName( bean.getName() ); + jobDO.setHandlerName( bean.getHandlerName() ); + jobDO.setHandlerParam( bean.getHandlerParam() ); + jobDO.setCronExpression( bean.getCronExpression() ); + jobDO.setRetryCount( bean.getRetryCount() ); + jobDO.setRetryInterval( bean.getRetryInterval() ); + jobDO.setMonitorTimeout( bean.getMonitorTimeout() ); + + return jobDO; + } + + @Override + public JobDO convert(JobUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + JobDO jobDO = new JobDO(); + + jobDO.setId( bean.getId() ); + jobDO.setName( bean.getName() ); + jobDO.setHandlerParam( bean.getHandlerParam() ); + jobDO.setCronExpression( bean.getCronExpression() ); + jobDO.setRetryCount( bean.getRetryCount() ); + jobDO.setRetryInterval( bean.getRetryInterval() ); + jobDO.setMonitorTimeout( bean.getMonitorTimeout() ); + + return jobDO; + } + + @Override + public JobRespVO convert(JobDO bean) { + if ( bean == null ) { + return null; + } + + JobRespVO jobRespVO = new JobRespVO(); + + jobRespVO.setName( bean.getName() ); + jobRespVO.setHandlerParam( bean.getHandlerParam() ); + jobRespVO.setCronExpression( bean.getCronExpression() ); + jobRespVO.setRetryCount( bean.getRetryCount() ); + jobRespVO.setRetryInterval( bean.getRetryInterval() ); + jobRespVO.setMonitorTimeout( bean.getMonitorTimeout() ); + jobRespVO.setId( bean.getId() ); + jobRespVO.setStatus( bean.getStatus() ); + jobRespVO.setHandlerName( bean.getHandlerName() ); + jobRespVO.setCreateTime( bean.getCreateTime() ); + + return jobRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( JobDO jobDO : list ) { + list1.add( convert( jobDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( JobDO jobDO : list ) { + list1.add( jobDOToJobExcelVO( jobDO ) ); + } + + return list1; + } + + protected JobExcelVO jobDOToJobExcelVO(JobDO jobDO) { + if ( jobDO == null ) { + return null; + } + + JobExcelVO jobExcelVO = new JobExcelVO(); + + jobExcelVO.setId( jobDO.getId() ); + jobExcelVO.setName( jobDO.getName() ); + jobExcelVO.setStatus( jobDO.getStatus() ); + jobExcelVO.setHandlerName( jobDO.getHandlerName() ); + jobExcelVO.setHandlerParam( jobDO.getHandlerParam() ); + jobExcelVO.setCronExpression( jobDO.getCronExpression() ); + jobExcelVO.setMonitorTimeout( jobDO.getMonitorTimeout() ); + jobExcelVO.setCreateTime( jobDO.getCreateTime() ); + + return jobExcelVO; + } +} diff --git a/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/job/JobLogConvertImpl.java b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/job/JobLogConvertImpl.java new file mode 100644 index 0000000..c68b7a7 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/job/JobLogConvertImpl.java @@ -0,0 +1,104 @@ +package com.jojubanking.boot.module.infra.convert.job; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.job.vo.log.JobLogRespVO; +import com.jojubanking.boot.module.infra.dal.dataobject.job.JobLogDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:31:57+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class JobLogConvertImpl implements JobLogConvert { + + @Override + public JobLogRespVO convert(JobLogDO bean) { + if ( bean == null ) { + return null; + } + + JobLogRespVO jobLogRespVO = new JobLogRespVO(); + + jobLogRespVO.setJobId( bean.getJobId() ); + jobLogRespVO.setHandlerName( bean.getHandlerName() ); + jobLogRespVO.setHandlerParam( bean.getHandlerParam() ); + jobLogRespVO.setExecuteIndex( bean.getExecuteIndex() ); + jobLogRespVO.setBeginTime( bean.getBeginTime() ); + jobLogRespVO.setEndTime( bean.getEndTime() ); + jobLogRespVO.setDuration( bean.getDuration() ); + jobLogRespVO.setStatus( bean.getStatus() ); + jobLogRespVO.setResult( bean.getResult() ); + jobLogRespVO.setId( bean.getId() ); + jobLogRespVO.setCreateTime( bean.getCreateTime() ); + + return jobLogRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( JobLogDO jobLogDO : list ) { + list1.add( convert( jobLogDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( JobLogDO jobLogDO : list ) { + list1.add( jobLogDOToJobLogExcelVO( jobLogDO ) ); + } + + return list1; + } + + protected JobLogExcelVO jobLogDOToJobLogExcelVO(JobLogDO jobLogDO) { + if ( jobLogDO == null ) { + return null; + } + + JobLogExcelVO jobLogExcelVO = new JobLogExcelVO(); + + jobLogExcelVO.setId( jobLogDO.getId() ); + jobLogExcelVO.setJobId( jobLogDO.getJobId() ); + jobLogExcelVO.setHandlerName( jobLogDO.getHandlerName() ); + jobLogExcelVO.setHandlerParam( jobLogDO.getHandlerParam() ); + jobLogExcelVO.setExecuteIndex( jobLogDO.getExecuteIndex() ); + jobLogExcelVO.setBeginTime( jobLogDO.getBeginTime() ); + jobLogExcelVO.setEndTime( jobLogDO.getEndTime() ); + jobLogExcelVO.setDuration( jobLogDO.getDuration() ); + jobLogExcelVO.setStatus( jobLogDO.getStatus() ); + jobLogExcelVO.setResult( jobLogDO.getResult() ); + jobLogExcelVO.setCreateTime( jobLogDO.getCreateTime() ); + + return jobLogExcelVO; + } +} diff --git a/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/logger/ApiAccessLogConvertImpl.java b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/logger/ApiAccessLogConvertImpl.java new file mode 100644 index 0000000..7056498 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/logger/ApiAccessLogConvertImpl.java @@ -0,0 +1,140 @@ +package com.jojubanking.boot.module.infra.convert.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogRespVO; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiAccessLogDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:31:57+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class ApiAccessLogConvertImpl implements ApiAccessLogConvert { + + @Override + public ApiAccessLogRespVO convert(ApiAccessLogDO bean) { + if ( bean == null ) { + return null; + } + + ApiAccessLogRespVO apiAccessLogRespVO = new ApiAccessLogRespVO(); + + apiAccessLogRespVO.setTraceId( bean.getTraceId() ); + apiAccessLogRespVO.setUserId( bean.getUserId() ); + apiAccessLogRespVO.setUserType( bean.getUserType() ); + apiAccessLogRespVO.setApplicationName( bean.getApplicationName() ); + apiAccessLogRespVO.setRequestMethod( bean.getRequestMethod() ); + apiAccessLogRespVO.setRequestUrl( bean.getRequestUrl() ); + apiAccessLogRespVO.setRequestParams( bean.getRequestParams() ); + apiAccessLogRespVO.setUserIp( bean.getUserIp() ); + apiAccessLogRespVO.setUserAgent( bean.getUserAgent() ); + apiAccessLogRespVO.setBeginTime( bean.getBeginTime() ); + apiAccessLogRespVO.setEndTime( bean.getEndTime() ); + apiAccessLogRespVO.setDuration( bean.getDuration() ); + apiAccessLogRespVO.setResultCode( bean.getResultCode() ); + apiAccessLogRespVO.setResultMsg( bean.getResultMsg() ); + apiAccessLogRespVO.setId( bean.getId() ); + apiAccessLogRespVO.setCreateTime( bean.getCreateTime() ); + + return apiAccessLogRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ApiAccessLogDO apiAccessLogDO : list ) { + list1.add( convert( apiAccessLogDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ApiAccessLogDO apiAccessLogDO : list ) { + list1.add( apiAccessLogDOToApiAccessLogExcelVO( apiAccessLogDO ) ); + } + + return list1; + } + + @Override + public ApiAccessLogDO convert(ApiAccessLogCreateReqDTO bean) { + if ( bean == null ) { + return null; + } + + ApiAccessLogDO apiAccessLogDO = new ApiAccessLogDO(); + + apiAccessLogDO.setTraceId( bean.getTraceId() ); + apiAccessLogDO.setUserId( bean.getUserId() ); + apiAccessLogDO.setUserType( bean.getUserType() ); + apiAccessLogDO.setApplicationName( bean.getApplicationName() ); + apiAccessLogDO.setRequestMethod( bean.getRequestMethod() ); + apiAccessLogDO.setRequestUrl( bean.getRequestUrl() ); + apiAccessLogDO.setRequestParams( bean.getRequestParams() ); + apiAccessLogDO.setUserIp( bean.getUserIp() ); + apiAccessLogDO.setUserAgent( bean.getUserAgent() ); + apiAccessLogDO.setBeginTime( bean.getBeginTime() ); + apiAccessLogDO.setEndTime( bean.getEndTime() ); + apiAccessLogDO.setDuration( bean.getDuration() ); + apiAccessLogDO.setResultCode( bean.getResultCode() ); + apiAccessLogDO.setResultMsg( bean.getResultMsg() ); + + return apiAccessLogDO; + } + + protected ApiAccessLogExcelVO apiAccessLogDOToApiAccessLogExcelVO(ApiAccessLogDO apiAccessLogDO) { + if ( apiAccessLogDO == null ) { + return null; + } + + ApiAccessLogExcelVO apiAccessLogExcelVO = new ApiAccessLogExcelVO(); + + apiAccessLogExcelVO.setId( apiAccessLogDO.getId() ); + apiAccessLogExcelVO.setTraceId( apiAccessLogDO.getTraceId() ); + apiAccessLogExcelVO.setUserId( apiAccessLogDO.getUserId() ); + apiAccessLogExcelVO.setUserType( apiAccessLogDO.getUserType() ); + apiAccessLogExcelVO.setApplicationName( apiAccessLogDO.getApplicationName() ); + apiAccessLogExcelVO.setRequestMethod( apiAccessLogDO.getRequestMethod() ); + apiAccessLogExcelVO.setRequestUrl( apiAccessLogDO.getRequestUrl() ); + apiAccessLogExcelVO.setRequestParams( apiAccessLogDO.getRequestParams() ); + apiAccessLogExcelVO.setUserIp( apiAccessLogDO.getUserIp() ); + apiAccessLogExcelVO.setUserAgent( apiAccessLogDO.getUserAgent() ); + apiAccessLogExcelVO.setBeginTime( apiAccessLogDO.getBeginTime() ); + apiAccessLogExcelVO.setEndTime( apiAccessLogDO.getEndTime() ); + apiAccessLogExcelVO.setDuration( apiAccessLogDO.getDuration() ); + apiAccessLogExcelVO.setResultCode( apiAccessLogDO.getResultCode() ); + apiAccessLogExcelVO.setResultMsg( apiAccessLogDO.getResultMsg() ); + + return apiAccessLogExcelVO; + } +} diff --git a/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/logger/ApiErrorLogConvertImpl.java b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/logger/ApiErrorLogConvertImpl.java new file mode 100644 index 0000000..4cb3e20 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/logger/ApiErrorLogConvertImpl.java @@ -0,0 +1,170 @@ +package com.jojubanking.boot.module.infra.convert.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogRespVO; +import com.jojubanking.boot.module.infra.dal.dataobject.logger.ApiErrorLogDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:31:57+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class ApiErrorLogConvertImpl implements ApiErrorLogConvert { + + @Override + public ApiErrorLogRespVO convert(ApiErrorLogDO bean) { + if ( bean == null ) { + return null; + } + + ApiErrorLogRespVO apiErrorLogRespVO = new ApiErrorLogRespVO(); + + apiErrorLogRespVO.setTraceId( bean.getTraceId() ); + if ( bean.getUserId() != null ) { + apiErrorLogRespVO.setUserId( bean.getUserId().intValue() ); + } + apiErrorLogRespVO.setUserType( bean.getUserType() ); + apiErrorLogRespVO.setApplicationName( bean.getApplicationName() ); + apiErrorLogRespVO.setRequestMethod( bean.getRequestMethod() ); + apiErrorLogRespVO.setRequestUrl( bean.getRequestUrl() ); + apiErrorLogRespVO.setRequestParams( bean.getRequestParams() ); + apiErrorLogRespVO.setUserIp( bean.getUserIp() ); + apiErrorLogRespVO.setUserAgent( bean.getUserAgent() ); + apiErrorLogRespVO.setExceptionTime( bean.getExceptionTime() ); + apiErrorLogRespVO.setExceptionName( bean.getExceptionName() ); + apiErrorLogRespVO.setExceptionMessage( bean.getExceptionMessage() ); + apiErrorLogRespVO.setExceptionRootCauseMessage( bean.getExceptionRootCauseMessage() ); + apiErrorLogRespVO.setExceptionStackTrace( bean.getExceptionStackTrace() ); + apiErrorLogRespVO.setExceptionClassName( bean.getExceptionClassName() ); + apiErrorLogRespVO.setExceptionFileName( bean.getExceptionFileName() ); + apiErrorLogRespVO.setExceptionMethodName( bean.getExceptionMethodName() ); + apiErrorLogRespVO.setExceptionLineNumber( bean.getExceptionLineNumber() ); + apiErrorLogRespVO.setProcessStatus( bean.getProcessStatus() ); + if ( bean.getId() != null ) { + apiErrorLogRespVO.setId( bean.getId().intValue() ); + } + apiErrorLogRespVO.setCreateTime( bean.getCreateTime() ); + apiErrorLogRespVO.setProcessTime( bean.getProcessTime() ); + if ( bean.getProcessUserId() != null ) { + apiErrorLogRespVO.setProcessUserId( bean.getProcessUserId().intValue() ); + } + + return apiErrorLogRespVO; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( apiErrorLogDOListToApiErrorLogRespVOList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ApiErrorLogDO apiErrorLogDO : list ) { + list1.add( apiErrorLogDOToApiErrorLogExcelVO( apiErrorLogDO ) ); + } + + return list1; + } + + @Override + public ApiErrorLogDO convert(ApiErrorLogCreateReqDTO bean) { + if ( bean == null ) { + return null; + } + + ApiErrorLogDO apiErrorLogDO = new ApiErrorLogDO(); + + apiErrorLogDO.setUserId( bean.getUserId() ); + apiErrorLogDO.setTraceId( bean.getTraceId() ); + apiErrorLogDO.setUserType( bean.getUserType() ); + apiErrorLogDO.setApplicationName( bean.getApplicationName() ); + apiErrorLogDO.setRequestMethod( bean.getRequestMethod() ); + apiErrorLogDO.setRequestUrl( bean.getRequestUrl() ); + apiErrorLogDO.setRequestParams( bean.getRequestParams() ); + apiErrorLogDO.setUserIp( bean.getUserIp() ); + apiErrorLogDO.setUserAgent( bean.getUserAgent() ); + apiErrorLogDO.setExceptionTime( bean.getExceptionTime() ); + apiErrorLogDO.setExceptionName( bean.getExceptionName() ); + apiErrorLogDO.setExceptionMessage( bean.getExceptionMessage() ); + apiErrorLogDO.setExceptionRootCauseMessage( bean.getExceptionRootCauseMessage() ); + apiErrorLogDO.setExceptionStackTrace( bean.getExceptionStackTrace() ); + apiErrorLogDO.setExceptionClassName( bean.getExceptionClassName() ); + apiErrorLogDO.setExceptionFileName( bean.getExceptionFileName() ); + apiErrorLogDO.setExceptionMethodName( bean.getExceptionMethodName() ); + apiErrorLogDO.setExceptionLineNumber( bean.getExceptionLineNumber() ); + + return apiErrorLogDO; + } + + protected List apiErrorLogDOListToApiErrorLogRespVOList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ApiErrorLogDO apiErrorLogDO : list ) { + list1.add( convert( apiErrorLogDO ) ); + } + + return list1; + } + + protected ApiErrorLogExcelVO apiErrorLogDOToApiErrorLogExcelVO(ApiErrorLogDO apiErrorLogDO) { + if ( apiErrorLogDO == null ) { + return null; + } + + ApiErrorLogExcelVO apiErrorLogExcelVO = new ApiErrorLogExcelVO(); + + if ( apiErrorLogDO.getId() != null ) { + apiErrorLogExcelVO.setId( apiErrorLogDO.getId().intValue() ); + } + apiErrorLogExcelVO.setTraceId( apiErrorLogDO.getTraceId() ); + if ( apiErrorLogDO.getUserId() != null ) { + apiErrorLogExcelVO.setUserId( apiErrorLogDO.getUserId().intValue() ); + } + apiErrorLogExcelVO.setUserType( apiErrorLogDO.getUserType() ); + apiErrorLogExcelVO.setApplicationName( apiErrorLogDO.getApplicationName() ); + apiErrorLogExcelVO.setRequestMethod( apiErrorLogDO.getRequestMethod() ); + apiErrorLogExcelVO.setRequestUrl( apiErrorLogDO.getRequestUrl() ); + apiErrorLogExcelVO.setRequestParams( apiErrorLogDO.getRequestParams() ); + apiErrorLogExcelVO.setUserIp( apiErrorLogDO.getUserIp() ); + apiErrorLogExcelVO.setUserAgent( apiErrorLogDO.getUserAgent() ); + apiErrorLogExcelVO.setExceptionTime( apiErrorLogDO.getExceptionTime() ); + apiErrorLogExcelVO.setExceptionName( apiErrorLogDO.getExceptionName() ); + apiErrorLogExcelVO.setExceptionMessage( apiErrorLogDO.getExceptionMessage() ); + apiErrorLogExcelVO.setExceptionRootCauseMessage( apiErrorLogDO.getExceptionRootCauseMessage() ); + apiErrorLogExcelVO.setExceptionStackTrace( apiErrorLogDO.getExceptionStackTrace() ); + apiErrorLogExcelVO.setExceptionClassName( apiErrorLogDO.getExceptionClassName() ); + apiErrorLogExcelVO.setExceptionFileName( apiErrorLogDO.getExceptionFileName() ); + apiErrorLogExcelVO.setExceptionMethodName( apiErrorLogDO.getExceptionMethodName() ); + apiErrorLogExcelVO.setExceptionLineNumber( apiErrorLogDO.getExceptionLineNumber() ); + apiErrorLogExcelVO.setCreateTime( apiErrorLogDO.getCreateTime() ); + apiErrorLogExcelVO.setProcessStatus( apiErrorLogDO.getProcessStatus() ); + apiErrorLogExcelVO.setProcessTime( apiErrorLogDO.getProcessTime() ); + if ( apiErrorLogDO.getProcessUserId() != null ) { + apiErrorLogExcelVO.setProcessUserId( apiErrorLogDO.getProcessUserId().intValue() ); + } + + return apiErrorLogExcelVO; + } +} diff --git a/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/redis/RedisConvertImpl.java b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/redis/RedisConvertImpl.java new file mode 100644 index 0000000..acb33ca --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/redis/RedisConvertImpl.java @@ -0,0 +1,56 @@ +package com.jojubanking.boot.module.infra.convert.redis; + +import com.jojubanking.boot.framework.redis.core.RedisKeyDefine; +import com.jojubanking.boot.framework.redis.core.RedisKeyDefine.KeyTypeEnum; +import com.jojubanking.boot.framework.redis.core.RedisKeyDefine.TimeoutTypeEnum; +import com.jojubanking.boot.module.infra.controller.admin.redis.vo.RedisKeyDefineRespVO; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:31:57+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class RedisConvertImpl implements RedisConvert { + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( RedisKeyDefine redisKeyDefine : list ) { + list1.add( redisKeyDefineToRedisKeyDefineRespVO( redisKeyDefine ) ); + } + + return list1; + } + + protected RedisKeyDefineRespVO redisKeyDefineToRedisKeyDefineRespVO(RedisKeyDefine redisKeyDefine) { + if ( redisKeyDefine == null ) { + return null; + } + + String keyTemplate = null; + KeyTypeEnum keyType = null; + Class valueType = null; + TimeoutTypeEnum timeoutType = null; + Duration timeout = null; + String memo = null; + + keyTemplate = redisKeyDefine.getKeyTemplate(); + keyType = redisKeyDefine.getKeyType(); + valueType = redisKeyDefine.getValueType(); + timeoutType = redisKeyDefine.getTimeoutType(); + timeout = redisKeyDefine.getTimeout(); + memo = redisKeyDefine.getMemo(); + + RedisKeyDefineRespVO redisKeyDefineRespVO = new RedisKeyDefineRespVO( keyTemplate, keyType, valueType, timeoutType, timeout, memo ); + + return redisKeyDefineRespVO; + } +} diff --git a/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/test/TestDemoConvertImpl.java b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/test/TestDemoConvertImpl.java new file mode 100644 index 0000000..4a72bc0 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/generated-sources/annotations/com/jojubanking/boot/module/infra/convert/test/TestDemoConvertImpl.java @@ -0,0 +1,133 @@ +package com.jojubanking.boot.module.infra.convert.test; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoCreateReqVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoExcelVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoRespVO; +import com.jojubanking.boot.module.infra.controller.admin.test.vo.TestDemoUpdateReqVO; +import com.jojubanking.boot.module.infra.dal.dataobject.test.TestDemoDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:31:57+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class TestDemoConvertImpl implements TestDemoConvert { + + @Override + public TestDemoDO convert(TestDemoCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + TestDemoDO testDemoDO = new TestDemoDO(); + + testDemoDO.setName( bean.getName() ); + testDemoDO.setStatus( bean.getStatus() ); + testDemoDO.setType( bean.getType() ); + testDemoDO.setCategory( bean.getCategory() ); + testDemoDO.setRemark( bean.getRemark() ); + + return testDemoDO; + } + + @Override + public TestDemoDO convert(TestDemoUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + TestDemoDO testDemoDO = new TestDemoDO(); + + testDemoDO.setId( bean.getId() ); + testDemoDO.setName( bean.getName() ); + testDemoDO.setStatus( bean.getStatus() ); + testDemoDO.setType( bean.getType() ); + testDemoDO.setCategory( bean.getCategory() ); + testDemoDO.setRemark( bean.getRemark() ); + + return testDemoDO; + } + + @Override + public TestDemoRespVO convert(TestDemoDO bean) { + if ( bean == null ) { + return null; + } + + TestDemoRespVO testDemoRespVO = new TestDemoRespVO(); + + testDemoRespVO.setName( bean.getName() ); + testDemoRespVO.setStatus( bean.getStatus() ); + testDemoRespVO.setType( bean.getType() ); + testDemoRespVO.setCategory( bean.getCategory() ); + testDemoRespVO.setRemark( bean.getRemark() ); + testDemoRespVO.setId( bean.getId() ); + testDemoRespVO.setCreateTime( bean.getCreateTime() ); + + return testDemoRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( TestDemoDO testDemoDO : list ) { + list1.add( convert( testDemoDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( TestDemoDO testDemoDO : list ) { + list1.add( testDemoDOToTestDemoExcelVO( testDemoDO ) ); + } + + return list1; + } + + protected TestDemoExcelVO testDemoDOToTestDemoExcelVO(TestDemoDO testDemoDO) { + if ( testDemoDO == null ) { + return null; + } + + TestDemoExcelVO testDemoExcelVO = new TestDemoExcelVO(); + + testDemoExcelVO.setId( testDemoDO.getId() ); + testDemoExcelVO.setName( testDemoDO.getName() ); + testDemoExcelVO.setStatus( testDemoDO.getStatus() ); + testDemoExcelVO.setType( testDemoDO.getType() ); + testDemoExcelVO.setCategory( testDemoDO.getCategory() ); + testDemoExcelVO.setRemark( testDemoDO.getRemark() ); + testDemoExcelVO.setCreateTime( testDemoDO.getCreateTime() ); + + return testDemoExcelVO; + } +} diff --git a/joju-module-infra/joju-module-infra-biz/target/joju-module-infra-biz-2.0.0-beta.jar b/joju-module-infra/joju-module-infra-biz/target/joju-module-infra-biz-2.0.0-beta.jar new file mode 100644 index 0000000..ebf3199 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/joju-module-infra-biz-2.0.0-beta.jar differ diff --git a/joju-module-infra/joju-module-infra-biz/target/maven-archiver/pom.properties b/joju-module-infra/joju-module-infra-biz/target/maven-archiver/pom.properties new file mode 100644 index 0000000..6e0ea4c --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:47 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-module-infra-biz diff --git a/joju-module-infra/joju-module-infra-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-module-infra/joju-module-infra-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..57a77e7 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,179 @@ +com\jojubanking\boot\module\infra\service\test\TestDemoServiceImpl.class +com\jojubanking\boot\module\infra\dal\mysql\job\JobMapper.class +com\jojubanking\boot\module\infra\dal\dataobject\file\FileDO.class +com\jojubanking\boot\module\infra\service\job\JobLogService.class +com\jojubanking\boot\module\infra\controller\admin\file\vo\config\FileConfigPageReqVO.class +com\jojubanking\boot\module\infra\controller\admin\redis\vo\RedisMonitorRespVO$RedisMonitorRespVOBuilder.class +com\jojubanking\boot\module\infra\controller\admin\codegen\vo\CodegenCreateListReqVO.class +com\jojubanking\boot\module\infra\dal\dataobject\test\TestDemoDO$TestDemoDOBuilder.class +com\jojubanking\boot\module\infra\controller\admin\logger\vo\apiaccesslog\ApiAccessLogExcelVO.class +com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigUpdateReqVO.class +com\jojubanking\boot\module\infra\dal\mysql\logger\ApiAccessLogMapper.class +com\jojubanking\boot\module\infra\controller\admin\file\FileController.class +com\jojubanking\boot\module\infra\controller\admin\logger\vo\apiaccesslog\ApiAccessLogRespVO.class +com\jojubanking\boot\module\infra\dal\mysql\file\FileMapper.class +com\jojubanking\boot\module\infra\convert\test\TestDemoConvertImpl.class +com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoUpdateReqVO.class +com\jojubanking\boot\module\infra\controller\admin\redis\vo\RedisKeyValueRespVO.class +com\jojubanking\boot\module\infra\convert\job\JobConvertImpl.class +com\jojubanking\boot\module\infra\convert\file\FileConfigConvertImpl.class +com\jojubanking\boot\module\infra\convert\logger\ApiAccessLogConvertImpl.class +com\jojubanking\boot\module\infra\controller\admin\codegen\CodegenController.class +com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigPageReqVO.class +com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoPageReqVO.class +com\jojubanking\boot\module\infra\convert\config\ConfigConvert.class +com\jojubanking\boot\module\infra\dal\dataobject\file\FileConfigDO.class +com\jojubanking\boot\module\infra\service\config\ConfigServiceImpl.class +com\jojubanking\boot\module\infra\controller\admin\job\vo\log\JobLogExportReqVO.class +com\jojubanking\boot\module\infra\controller\admin\file\vo\config\FileConfigRespVO.class +com\jojubanking\boot\module\infra\controller\admin\redis\vo\RedisKeyDefineRespVO$RedisKeyDefineRespVOBuilder.class +com\jojubanking\boot\module\infra\dal\dataobject\codegen\CodegenTableDO.class +com\jojubanking\boot\module\infra\convert\test\TestDemoConvert.class +com\jojubanking\boot\module\infra\controller\admin\db\DataSourceConfigController.class +com\jojubanking\boot\module\infra\controller\admin\job\vo\log\JobLogExcelVO.class +com\jojubanking\boot\module\infra\service\logger\ApiAccessLogService.class +com\jojubanking\boot\module\infra\controller\admin\codegen\vo\table\CodegenTableRespVO.class +com\jojubanking\boot\module\infra\dal\mysql\file\FileContentMapper.class +com\jojubanking\boot\module\infra\service\job\JobServiceImpl.class +com\jojubanking\boot\module\infra\controller\admin\redis\vo\RedisMonitorRespVO.class +com\jojubanking\boot\module\infra\controller\admin\job\vo\log\JobLogBaseVO.class +com\jojubanking\boot\module\infra\convert\db\DataSourceConfigConvert.class +com\jojubanking\boot\module\infra\convert\job\JobLogConvert.class +com\jojubanking\boot\module\infra\service\db\DataSourceConfigService.class +com\jojubanking\boot\module\infra\dal\mysql\file\FileConfigMapper.class +com\jojubanking\boot\module\infra\convert\db\DataSourceConfigConvertImpl.class +com\jojubanking\boot\module\infra\enums\codegen\CodegenTemplateTypeEnum.class +com\jojubanking\boot\module\infra\dal\mysql\codegen\CodegenColumnMapper.class +com\jojubanking\boot\module\infra\controller\admin\logger\vo\apiaccesslog\ApiAccessLogBaseVO.class +com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoBaseVO.class +com\jojubanking\boot\module\infra\dal\dataobject\job\JobLogDO.class +com\jojubanking\boot\module\infra\service\codegen\inner\CodegenEngine.class +com\jojubanking\boot\module\infra\service\file\FileConfigServiceImpl.class +com\jojubanking\boot\module\infra\service\test\TestDemoService.class +com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoExcelVO.class +com\jojubanking\boot\module\infra\controller\admin\redis\vo\RedisKeyDefineRespVO.class +com\jojubanking\boot\module\infra\dal\dataobject\job\JobDO$JobDOBuilder.class +com\jojubanking\boot\module\infra\controller\admin\file\vo\config\FileConfigBaseVO.class +com\jojubanking\boot\module\infra\controller\admin\redis\vo\RedisMonitorRespVO$CommandStat$CommandStatBuilder.class +com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobExcelVO.class +com\jojubanking\boot\module\infra\convert\codegen\CodegenConvertImpl.class +com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigExcelVO.class +com\jojubanking\boot\module\infra\enums\job\JobStatusEnum.class +com\jojubanking\boot\module\infra\service\db\DatabaseTableService.class +com\jojubanking\boot\module\infra\controller\admin\codegen\vo\table\CodegenTableBaseVO.class +com\jojubanking\boot\module\infra\dal\dataobject\file\FileContentDO.class +com\jojubanking\boot\module\infra\dal\mysql\job\JobLogMapper.class +com\jojubanking\boot\module\infra\convert\config\ConfigConvertImpl.class +com\jojubanking\boot\module\infra\dal\mysql\db\DataSourceConfigMapper.class +com\jojubanking\boot\module\infra\controller\admin\file\vo\file\UploadRespVO.class +com\jojubanking\boot\module\infra\convert\logger\ApiAccessLogConvert.class +com\jojubanking\boot\module\infra\service\codegen\inner\CodegenBuilder.class +com\jojubanking\boot\module\infra\mq\message\config\ConfigRefreshMessage.class +com\jojubanking\boot\module\infra\service\codegen\CodegenServiceImpl.class +com\jojubanking\boot\module\infra\controller\admin\file\vo\config\FileConfigCreateReqVO.class +com\jojubanking\boot\module\infra\controller\admin\codegen\vo\table\DatabaseTableRespVO.class +com\jojubanking\boot\module\infra\service\logger\ApiErrorLogServiceImpl.class +com\jojubanking\boot\module\infra\service\file\FileServiceImpl.class +com\jojubanking\boot\module\infra\framework\codegen\config\CodegenProperties.class +com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobUpdateReqVO.class +com\jojubanking\boot\module\infra\service\logger\ApiErrorLogService.class +com\jojubanking\boot\module\infra\controller\admin\job\JobLogController.class +com\jojubanking\boot\module\infra\controller\admin\db\vo\DataSourceConfigUpdateReqVO.class +com\jojubanking\boot\module\infra\convert\logger\ApiErrorLogConvertImpl.class +com\jojubanking\boot\module\infra\convert\file\FileConfigConvert.class +com\jojubanking\boot\module\infra\controller\admin\logger\vo\apierrorlog\ApiErrorLogExportReqVO.class +com\jojubanking\boot\module\infra\dal\mysql\logger\ApiErrorLogMapper.class +com\jojubanking\boot\module\infra\controller\admin\logger\vo\apierrorlog\ApiErrorLogExcelVO.class +com\jojubanking\boot\module\infra\controller\admin\job\vo\log\JobLogPageReqVO.class +com\jojubanking\boot\module\infra\enums\codegen\CodegenColumnHtmlTypeEnum.class +com\jojubanking\boot\module\infra\controller\admin\codegen\vo\CodegenUpdateReqVO$Column.class +com\jojubanking\boot\module\infra\api\logger\ApiAccessLogApiImpl.class +com\jojubanking\boot\module\infra\service\job\JobLogServiceImpl.class +com\jojubanking\boot\module\infra\dal\dataobject\logger\ApiErrorLogDO$ApiErrorLogDOBuilder.class +com\jojubanking\boot\module\infra\dal\dataobject\logger\ApiErrorLogDO.class +com\jojubanking\boot\module\infra\dal\dataobject\file\FileConfigDO$FileConfigDOBuilder.class +com\jojubanking\boot\module\infra\controller\admin\redis\RedisController.class +com\jojubanking\boot\module\infra\dal\dataobject\config\ConfigDO.class +com\jojubanking\boot\module\infra\enums\codegen\CodegenSceneEnum.class +com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoRespVO.class +com\jojubanking\boot\module\infra\controller\admin\codegen\vo\CodegenPreviewRespVO.class +com\jojubanking\boot\module\infra\controller\admin\test\TestDemoController.class +com\jojubanking\boot\module\infra\service\file\FileConfigServiceImpl$1.class +com\jojubanking\boot\module\infra\controller\admin\codegen\vo\table\CodegenTablePageReqVO.class +com\jojubanking\boot\module\infra\mq\consumer\file\FileConfigRefreshConsumer.class +com\jojubanking\boot\module\infra\enums\job\JobLogStatusEnum.class +com\jojubanking\boot\module\infra\controller\admin\file\vo\file\FileRespVO.class +com\jojubanking\boot\module\infra\controller\admin\redis\vo\RedisMonitorRespVO$CommandStat.class +com\jojubanking\boot\module\infra\dal\dataobject\logger\ApiAccessLogDO$ApiAccessLogDOBuilder.class +com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoCreateReqVO.class +com\jojubanking\boot\module\infra\controller\admin\logger\vo\apiaccesslog\ApiAccessLogPageReqVO.class +com\jojubanking\boot\module\infra\controller\admin\codegen\vo\CodegenUpdateReqVO$Table.class +com\jojubanking\boot\module\infra\controller\admin\logger\vo\apierrorlog\ApiErrorLogBaseVO.class +com\jojubanking\boot\module\infra\convert\codegen\CodegenConvert.class +com\jojubanking\boot\module\infra\controller\admin\file\vo\file\FilePageReqVO.class +com\jojubanking\boot\module\infra\mq\producer\file\FileConfigProducer.class +com\jojubanking\boot\module\infra\controller\admin\file\FileConfigController.class +com\jojubanking\boot\module\infra\service\db\DataSourceConfigServiceImpl.class +com\jojubanking\boot\module\infra\dal\dataobject\test\TestDemoDO.class +com\jojubanking\boot\module\infra\service\codegen\CodegenService.class +com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobRespVO.class +com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigBaseVO.class +com\jojubanking\boot\module\infra\framework\codegen\config\CodegenConfiguration.class +com\jojubanking\boot\module\infra\convert\job\JobConvert.class +com\jojubanking\boot\module\infra\dal\mysql\test\TestDemoMapper.class +com\jojubanking\boot\module\infra\framework\security\config\SecurityConfiguration$1.class +com\jojubanking\boot\module\infra\dal\dataobject\file\FileDO$FileDOBuilder.class +com\jojubanking\boot\module\infra\dal\mysql\config\ConfigMapper.class +com\jojubanking\boot\module\infra\api\file\FileApiImpl.class +com\jojubanking\boot\module\infra\controller\admin\codegen\vo\column\CodegenColumnBaseVO.class +com\jojubanking\boot\module\infra\controller\admin\codegen\vo\CodegenUpdateReqVO.class +com\jojubanking\boot\module\infra\enums\config\ConfigTypeEnum.class +com\jojubanking\boot\module\infra\enums\codegen\CodegenColumnListConditionEnum.class +com\jojubanking\boot\module\infra\controller\admin\db\vo\DataSourceConfigBaseVO.class +com\jojubanking\boot\module\infra\controller\admin\job\vo\log\JobLogRespVO.class +com\jojubanking\boot\module\infra\dal\dataobject\file\FileContentDO$FileContentDOBuilder.class +com\jojubanking\boot\module\infra\service\file\FileConfigService.class +com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoExportReqVO.class +com\jojubanking\boot\module\infra\dal\dataobject\db\DataSourceConfigDO.class +com\jojubanking\boot\module\infra\controller\admin\logger\vo\apiaccesslog\ApiAccessLogExportReqVO.class +com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigExportReqVO.class +com\jojubanking\boot\module\infra\convert\file\FileConvert.class +com\jojubanking\boot\module\infra\controller\admin\codegen\vo\CodegenDetailRespVO.class +com\jojubanking\boot\module\infra\controller\admin\db\DatabaseDocController.class +com\jojubanking\boot\module\infra\convert\job\JobLogConvertImpl.class +com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobBaseVO.class +com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigRespVO.class +com\jojubanking\boot\module\infra\controller\admin\logger\vo\apierrorlog\ApiErrorLogPageReqVO.class +com\jojubanking\boot\module\infra\service\config\ConfigService.class +com\jojubanking\boot\module\infra\controller\admin\db\vo\DataSourceConfigCreateReqVO.class +com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobCreateReqVO.class +com\jojubanking\boot\module\infra\convert\redis\RedisConvertImpl.class +com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigCreateReqVO.class +com\jojubanking\boot\module\infra\dal\mysql\file\FileContentDAOImpl.class +com\jojubanking\boot\module\infra\controller\admin\job\JobController.class +com\jojubanking\boot\module\infra\dal\dataobject\codegen\CodegenColumnDO.class +com\jojubanking\boot\module\infra\dal\dataobject\job\JobDO.class +com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobPageReqVO.class +com\jojubanking\boot\module\infra\dal\mysql\codegen\CodegenTableMapper.class +com\jojubanking\boot\module\infra\service\file\FileService.class +com\jojubanking\boot\module\infra\convert\file\FileConvertImpl.class +com\jojubanking\boot\module\infra\controller\admin\logger\ApiAccessLogController.class +com\jojubanking\boot\module\infra\dal\dataobject\logger\ApiAccessLogDO.class +com\jojubanking\boot\module\infra\framework\security\config\SecurityConfiguration.class +com\jojubanking\boot\module\infra\controller\admin\file\vo\config\FileConfigUpdateReqVO.class +com\jojubanking\boot\module\infra\convert\redis\RedisConvert.class +com\jojubanking\boot\module\infra\enums\logger\ApiErrorLogProcessStatusEnum.class +com\jojubanking\boot\module\infra\controller\admin\codegen\vo\column\CodegenColumnRespVO.class +com\jojubanking\boot\module\infra\dal\dataobject\job\JobLogDO$JobLogDOBuilder.class +com\jojubanking\boot\module\infra\mq\message\file\FileConfigRefreshMessage.class +com\jojubanking\boot\module\infra\service\job\JobService.class +com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobExportReqVO.class +com\jojubanking\boot\module\infra\controller\admin\logger\vo\apierrorlog\ApiErrorLogRespVO.class +com\jojubanking\boot\module\infra\service\db\DatabaseTableServiceImpl.class +com\jojubanking\boot\module\infra\controller\admin\logger\ApiErrorLogController.class +com\jojubanking\boot\module\infra\api\logger\ApiErrorLogApiImpl.class +com\jojubanking\boot\module\infra\controller\admin\config\ConfigController.class +com\jojubanking\boot\module\infra\convert\logger\ApiErrorLogConvert.class +com\jojubanking\boot\module\infra\mq\producer\config\ConfigProducer.class +com\jojubanking\boot\module\infra\controller\admin\db\vo\DataSourceConfigRespVO.class +com\jojubanking\boot\module\infra\service\logger\ApiAccessLogServiceImpl.class diff --git a/joju-module-infra/joju-module-infra-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-module-infra/joju-module-infra-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..fdece84 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,161 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\logger\vo\apierrorlog\ApiErrorLogExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\test\TestDemoController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\codegen\vo\CodegenDetailRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\logger\ApiErrorLogController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\db\DatabaseTableService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\db\DatabaseDocController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\enums\codegen\CodegenColumnListConditionEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\vo\log\JobLogExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\convert\job\JobConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\mq\producer\config\ConfigProducer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\convert\config\ConfigConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\convert\db\DataSourceConfigConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\dataobject\file\FileDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\codegen\vo\CodegenUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\logger\ApiAccessLogController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\logger\vo\apiaccesslog\ApiAccessLogBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\dataobject\job\JobDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\logger\vo\apiaccesslog\ApiAccessLogRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\app\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\dataobject\file\FileConfigDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\convert\redis\RedisConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\framework\security\core\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\mq\message\config\ConfigRefreshMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\dataobject\config\ConfigDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\test\TestDemoServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\db\DataSourceConfigMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\enums\codegen\CodegenTemplateTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\codegen\CodegenController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\file\FileService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\enums\config\ConfigTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\file\vo\config\FileConfigPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\codegen\vo\column\CodegenColumnBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\convert\codegen\CodegenConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\logger\vo\apiaccesslog\ApiAccessLogExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\logger\vo\apierrorlog\ApiErrorLogExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\codegen\vo\CodegenCreateListReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\logger\vo\apierrorlog\ApiErrorLogBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\codegen\CodegenService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\JobController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\file\vo\file\FilePageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\mq\message\file\FileConfigRefreshMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\vo\log\JobLogBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\job\JobService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\convert\job\JobLogConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\file\FileConfigServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\dataobject\file\FileContentDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\config\ConfigMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\vo\log\JobLogExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\logger\ApiErrorLogServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\codegen\vo\CodegenPreviewRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\codegen\CodegenTableMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\file\FileConfigController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\dataobject\logger\ApiErrorLogDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\file\vo\file\FileRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\mq\consumer\file\FileConfigRefreshConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\job\JobLogServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\api\logger\ApiAccessLogApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\enums\codegen\CodegenSceneEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\enums\job\JobLogStatusEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\job\JobLogMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\dataobject\logger\ApiAccessLogDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\enums\job\JobStatusEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\logger\vo\apierrorlog\ApiErrorLogPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\enums\codegen\CodegenColumnHtmlTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\dataobject\codegen\CodegenColumnDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\framework\codegen\config\CodegenConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\file\FileConfigService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\codegen\vo\table\DatabaseTableRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\convert\file\FileConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\logger\ApiAccessLogService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\logger\vo\apiaccesslog\ApiAccessLogExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\convert\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\api\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\file\vo\config\FileConfigUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\config\ConfigServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\vo\log\JobLogPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\logger\ApiAccessLogServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\logger\vo\apierrorlog\ApiErrorLogRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\redis\vo\RedisKeyValueRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\framework\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\file\FileContentMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\redis\RedisController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\codegen\CodegenColumnMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\db\vo\DataSourceConfigUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\job\JobServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\codegen\vo\table\CodegenTableRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\redis\vo\RedisKeyDefineRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\codegen\inner\CodegenEngine.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\codegen\vo\table\CodegenTableBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\job\JobMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\framework\security\config\SecurityConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\test\TestDemoMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\api\logger\ApiErrorLogApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\logger\ApiErrorLogService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\logger\ApiErrorLogMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\job\JobLogService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\dataobject\db\DataSourceConfigDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\db\vo\DataSourceConfigCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\config\ConfigService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\file\vo\file\UploadRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\convert\logger\ApiAccessLogConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\db\DatabaseTableServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\dataobject\codegen\CodegenTableDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\enums\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\db\vo\DataSourceConfigBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\file\FileMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\file\vo\config\FileConfigCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\db\DataSourceConfigServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\db\DataSourceConfigController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\vo\log\JobLogRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\convert\logger\ApiErrorLogConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\dataobject\job\JobLogDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\file\FileContentDAOImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\db\DataSourceConfigService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\file\vo\config\FileConfigBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\file\vo\config\FileConfigRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\redis\vo\RedisMonitorRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\JobLogController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\logger\ApiAccessLogMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\config\ConfigController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\dataobject\test\TestDemoDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\framework\codegen\config\CodegenProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\logger\vo\apiaccesslog\ApiAccessLogPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\job\vo\job\JobBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\file\FileController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\codegen\vo\table\CodegenTablePageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\framework\codegen\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\test\vo\TestDemoCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\mq\producer\file\FileConfigProducer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\convert\test\TestDemoConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\convert\file\FileConfigConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\codegen\vo\column\CodegenColumnRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\test\TestDemoService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\codegen\CodegenServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\config\vo\ConfigRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\file\FileServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\enums\logger\ApiErrorLogProcessStatusEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\api\file\FileApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\service\codegen\inner\CodegenBuilder.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\controller\admin\db\vo\DataSourceConfigRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-infra\joju-module-infra-biz\src\main\java\com\jojubanking\boot\module\infra\dal\mysql\file\FileConfigMapper.java diff --git a/joju-module-infra/joju-module-infra-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/joju-module-infra/joju-module-infra-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..dbdeefc --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1,11 @@ +com\jojubanking\boot\module\infra\service\logger\ApiErrorLogServiceImplTest.class +com\jojubanking\boot\module\infra\service\file\FileConfigServiceImplTest$EmptyFileClientConfig.class +com\jojubanking\boot\module\infra\service\job\JobLogServiceTest.class +com\jojubanking\boot\module\infra\service\DefaultDatabaseQueryTest.class +com\jojubanking\boot\module\infra\service\job\JobServiceTest.class +com\jojubanking\boot\module\infra\service\config\ConfigServiceTest.class +com\jojubanking\boot\module\infra\service\db\DataSourceConfigServiceImplTest.class +com\jojubanking\boot\module\infra\service\test\TestDemoServiceImplTest.class +com\jojubanking\boot\module\infra\service\logger\ApiAccessLogServiceImplTest.class +com\jojubanking\boot\module\infra\service\file\FileConfigServiceImplTest.class +com\jojubanking\boot\module\infra\service\file\FileServiceTest.class diff --git a/joju-module-infra/joju-module-infra-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/joju-module-infra/joju-module-infra-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..0d9cb8b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1,10 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-infra\joju-module-infra-biz\src\test\java\com\jojubanking\boot\module\infra\service\config\ConfigServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-infra\joju-module-infra-biz\src\test\java\com\jojubanking\boot\module\infra\service\job\JobLogServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-infra\joju-module-infra-biz\src\test\java\com\jojubanking\boot\module\infra\service\logger\ApiAccessLogServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-infra\joju-module-infra-biz\src\test\java\com\jojubanking\boot\module\infra\service\db\DataSourceConfigServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-infra\joju-module-infra-biz\src\test\java\com\jojubanking\boot\module\infra\service\logger\ApiErrorLogServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-infra\joju-module-infra-biz\src\test\java\com\jojubanking\boot\module\infra\service\file\FileServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-infra\joju-module-infra-biz\src\test\java\com\jojubanking\boot\module\infra\service\file\FileConfigServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-infra\joju-module-infra-biz\src\test\java\com\jojubanking\boot\module\infra\service\job\JobServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-infra\joju-module-infra-biz\src\test\java\com\jojubanking\boot\module\infra\service\DefaultDatabaseQueryTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-infra\joju-module-infra-biz\src\test\java\com\jojubanking\boot\module\infra\service\test\TestDemoServiceImplTest.java diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/application-unit-test.yaml b/joju-module-infra/joju-module-infra-biz/target/test-classes/application-unit-test.yaml new file mode 100644 index 0000000..196f352 --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/test-classes/application-unit-test.yaml @@ -0,0 +1,50 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + sql: + init: + schema-locations: classpath:/sql/create_tables.sql + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + +mybatis-plus: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + type-aliases-package: ${joju.info.base-package}.module.*.dal.dataobject + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +joju: + info: + base-package: com.jojubanking.boot diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/DefaultDatabaseQueryTest.class b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/DefaultDatabaseQueryTest.class new file mode 100644 index 0000000..fe15249 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/DefaultDatabaseQueryTest.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/config/ConfigServiceTest.class b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/config/ConfigServiceTest.class new file mode 100644 index 0000000..9e19be7 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/config/ConfigServiceTest.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/db/DataSourceConfigServiceImplTest.class b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/db/DataSourceConfigServiceImplTest.class new file mode 100644 index 0000000..0aeedf7 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/db/DataSourceConfigServiceImplTest.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImplTest$EmptyFileClientConfig.class b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImplTest$EmptyFileClientConfig.class new file mode 100644 index 0000000..cd792ef Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImplTest$EmptyFileClientConfig.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImplTest.class b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImplTest.class new file mode 100644 index 0000000..2a3afe7 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/file/FileConfigServiceImplTest.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/file/FileServiceTest.class b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/file/FileServiceTest.class new file mode 100644 index 0000000..e7829b7 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/file/FileServiceTest.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/job/JobLogServiceTest.class b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/job/JobLogServiceTest.class new file mode 100644 index 0000000..9967e89 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/job/JobLogServiceTest.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/job/JobServiceTest.class b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/job/JobServiceTest.class new file mode 100644 index 0000000..fac63ce Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/job/JobServiceTest.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogServiceImplTest.class b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogServiceImplTest.class new file mode 100644 index 0000000..d438cdb Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/logger/ApiAccessLogServiceImplTest.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogServiceImplTest.class b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogServiceImplTest.class new file mode 100644 index 0000000..7a4adaa Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/logger/ApiErrorLogServiceImplTest.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/test/TestDemoServiceImplTest.class b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/test/TestDemoServiceImplTest.class new file mode 100644 index 0000000..837c141 Binary files /dev/null and b/joju-module-infra/joju-module-infra-biz/target/test-classes/com/jojubanking/boot/module/infra/service/test/TestDemoServiceImplTest.class differ diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/logback.xml b/joju-module-infra/joju-module-infra-biz/target/test-classes/logback.xml new file mode 100644 index 0000000..daf756b --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/test-classes/logback.xml @@ -0,0 +1,4 @@ + + + + diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/sql/clean.sql b/joju-module-infra/joju-module-infra-biz/target/test-classes/sql/clean.sql new file mode 100644 index 0000000..eb05d3d --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/test-classes/sql/clean.sql @@ -0,0 +1,12 @@ +DELETE FROM "infra_config"; +DELETE FROM "infra_file"; +DELETE FROM "infra_job"; +DELETE FROM "infra_job_log"; +DELETE FROM "infra_api_access_log"; +DELETE FROM "infra_api_error_log"; +DELETE FROM "infra_api_access_log"; +DELETE FROM "infra_file"; +DELETE FROM "infra_api_error_log"; +DELETE FROM "infra_test_demo"; +DELETE FROM "infra_file_config"; +DELETE FROM "infra_data_source_config"; diff --git a/joju-module-infra/joju-module-infra-biz/target/test-classes/sql/create_tables.sql b/joju-module-infra/joju-module-infra-biz/target/test-classes/sql/create_tables.sql new file mode 100644 index 0000000..c60230a --- /dev/null +++ b/joju-module-infra/joju-module-infra-biz/target/test-classes/sql/create_tables.sql @@ -0,0 +1,184 @@ + +CREATE TABLE IF NOT EXISTS "infra_config" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "category" varchar(50) NOT NULL, + "type" tinyint NOT NULL, + "name" varchar(100) NOT NULL DEFAULT '', + "config_key" varchar(100) NOT NULL DEFAULT '', + "value" varchar(500) NOT NULL DEFAULT '', + "visible" bit NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '参数配置表'; + +CREATE TABLE IF NOT EXISTS "infra_file_config" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "storage" tinyint NOT NULL, + "remark" varchar(255), + "master" bit(1) NOT NULL, + "config" varchar(4096) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '文件配置表'; + +CREATE TABLE IF NOT EXISTS "infra_file" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "config_id" bigint NOT NULL, + "path" varchar(512), + "url" varchar(1024), + "type" varchar(63) DEFAULT NULL, + "size" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '文件表'; + +CREATE TABLE IF NOT EXISTS "infra_job" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '任务编号', + "name" varchar(32) NOT NULL COMMENT '任务名称', + "status" tinyint(4) NOT NULL COMMENT '任务状态', + "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', + "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', + "cron_expression" varchar(32) NOT NULL COMMENT 'CRON 表达式', + "retry_count" int(11) NOT NULL DEFAULT '0' COMMENT '重试次数', + "retry_interval" int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔', + "monitor_timeout" int(11) NOT NULL DEFAULT '0' COMMENT '监控超时时间', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY ("id") +) COMMENT='定时任务表'; + +CREATE TABLE IF NOT EXISTS "infra_job_log" ( + "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号', + "job_id" bigint(20) NOT NULL COMMENT '任务编号', + "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', + "handler_param" varchar(255) DEFAULT NULL COMMENT '处理器的参数', + "execute_index" tinyint(4) NOT NULL DEFAULT '1' COMMENT '第几次执行', + "begin_time" datetime NOT NULL COMMENT '开始执行时间', + "end_time" datetime DEFAULT NULL COMMENT '结束执行时间', + "duration" int(11) DEFAULT NULL COMMENT '执行时长', + "status" tinyint(4) NOT NULL COMMENT '任务状态', + "result" varchar(4000) DEFAULT '' COMMENT '结果数据', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit(1) NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY ("id") +)COMMENT='定时任务日志表'; + +CREATE TABLE IF NOT EXISTS "inf_file" ( + "id" varchar(188) NOT NULL, + "type" varchar(63) DEFAULT NULL, + "content" blob NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") + ) COMMENT '文件表'; + +CREATE TABLE IF NOT EXISTS "infra_api_access_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null default '', + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null default '', + "request_url" varchar(255) not null default '', + "request_params" varchar(8000) not null default '', + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "begin_time" timestamp not null, + "end_time" timestamp not null, + "duration" integer not null, + "result_code" integer not null default '0', + "result_msg" varchar(512) default '', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") + ) COMMENT 'API 访问日志表'; + +CREATE TABLE IF NOT EXISTS "infra_api_error_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null, + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null, + "request_url" varchar(255) not null, + "request_params" varchar(8000) not null, + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "exception_time" timestamp not null, + "exception_name" varchar(128) not null default '', + "exception_message" clob not null, + "exception_root_cause_message" clob not null, + "exception_stack_trace" clob not null, + "exception_class_name" varchar(512) not null, + "exception_file_name" varchar(512) not null, + "exception_method_name" varchar(512) not null, + "exception_line_number" integer not null, + "process_status" tinyint not null, + "process_time" timestamp default null, + "process_user_id" bigint default '0', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) COMMENT '系统异常日志'; + +CREATE TABLE IF NOT EXISTS "infra_test_demo" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(100) NOT NULL, + "status" tinyint NOT NULL, + "type" tinyint NOT NULL, + "category" tinyint NOT NULL, + "remark" varchar(500), + "creator" varchar(64) DEFAULT '''', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '''', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典类型表'; + +CREATE TABLE IF NOT EXISTS "infra_data_source_config" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(100) NOT NULL, + "url" varchar(1024) NOT NULL, + "username" varchar(255) NOT NULL, + "password" varchar(255) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '数据源配置表'; diff --git a/joju-module-infra/joju-module-infra.iml b/joju-module-infra/joju-module-infra.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-module-infra/joju-module-infra.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-module-infra/pom.xml b/joju-module-infra/pom.xml new file mode 100644 index 0000000..1f68b6d --- /dev/null +++ b/joju-module-infra/pom.xml @@ -0,0 +1,25 @@ + + + + jojuboot + com.jojubanking.boot + ${revision} + + 4.0.0 + + joju-module-infra-api + joju-module-infra-biz + + joju-module-infra + pom + + ${project.artifactId} + + infra 模块,主要提供两块能力: + 1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等 + 2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等 + + + diff --git a/joju-module-pay/joju-module-pay-api/joju-module-pay-api.iml b/joju-module-pay/joju-module-pay-api/joju-module-pay-api.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-module-pay/joju-module-pay-api/joju-module-pay-api.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-module-pay/joju-module-pay-api/pom.xml b/joju-module-pay/joju-module-pay-api/pom.xml new file mode 100644 index 0000000..94ac891 --- /dev/null +++ b/joju-module-pay/joju-module-pay-api/pom.xml @@ -0,0 +1,26 @@ + + + + com.jojubanking.boot + joju-module-pay + ${revision} + + 4.0.0 + joju-module-pay-api + jar + + ${project.artifactId} + + pay 模块 API,暴露给其它模块调用 + + + + + com.jojubanking.boot + joju-common + + + + diff --git a/joju-module-pay/joju-module-pay-api/src/main/java/com/jojubanking/boot/module/pay/enums/DictTypeConstants.java b/joju-module-pay/joju-module-pay-api/src/main/java/com/jojubanking/boot/module/pay/enums/DictTypeConstants.java new file mode 100644 index 0000000..b7b3a9f --- /dev/null +++ b/joju-module-pay/joju-module-pay-api/src/main/java/com/jojubanking/boot/module/pay/enums/DictTypeConstants.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.pay.enums; + +/** + * Pay 字典类型的枚举类 + * + * @author TW + */ +public interface DictTypeConstants { + + String ORDER_STATUS = "pay_order_status"; // 支付-订单-订单状态 + String ORDER_NOTIFY_STATUS = "pay_order_notify_status"; // 支付-订单-订单回调商户状态 + + String ORDER_REFUND_STATUS = "pay_order_refund_status"; // 支付-订单-订单退款状态 + String REFUND_ORDER_STATUS = "pay_refund_order_status"; // 支付-退款订单-退款状态 + String REFUND_ORDER_TYPE = "pay_refund_order_type"; // 支付-退款订单-退款类别 + +} diff --git a/joju-module-pay/joju-module-pay-api/src/main/java/com/jojubanking/boot/module/pay/enums/ErrorCodeConstants.java b/joju-module-pay/joju-module-pay-api/src/main/java/com/jojubanking/boot/module/pay/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..98ece89 --- /dev/null +++ b/joju-module-pay/joju-module-pay-api/src/main/java/com/jojubanking/boot/module/pay/enums/ErrorCodeConstants.java @@ -0,0 +1,64 @@ +package com.jojubanking.boot.module.pay.enums; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; + +/** + * Pay 错误码 Core 枚举类 + * + * pay 系统,使用 1-007-000-000 段 + */ +public interface ErrorCodeConstants { + + /** + * ========== APP 模块 1-007-000-000 ========== + */ + ErrorCode PAY_APP_NOT_FOUND = new ErrorCode(1007000000, "App 不存在"); + ErrorCode PAY_APP_IS_DISABLE = new ErrorCode(1007000002, "App 已经被禁用"); + ErrorCode PAY_APP_EXIST_TRANSACTION_ORDER_CANT_DELETE = new ErrorCode(1007000003, "支付应用存在交易中的订单,无法删除"); + + /** + * ========== CHANNEL 模块 1-007-001-000 ========== + */ + ErrorCode PAY_CHANNEL_NOT_FOUND = new ErrorCode(1007001000, "支付渠道的配置不存在"); + ErrorCode PAY_CHANNEL_IS_DISABLE = new ErrorCode(1007001001, "支付渠道已经禁用"); + ErrorCode PAY_CHANNEL_CLIENT_NOT_FOUND = new ErrorCode(1007001002, "支付渠道的客户端不存在"); + ErrorCode CHANNEL_NOT_EXISTS = new ErrorCode(1007001003, "支付渠道不存在"); + ErrorCode CHANNEL_EXIST_SAME_CHANNEL_ERROR = new ErrorCode(1007001005, "已存在相同的渠道"); + ErrorCode CHANNEL_WECHAT_VERSION_2_MCH_KEY_IS_NULL = new ErrorCode(1007001006,"微信渠道v2版本中商户密钥不可为空"); + ErrorCode CHANNEL_WECHAT_VERSION_3_PRIVATE_KEY_IS_NULL = new ErrorCode(1007001007,"微信渠道v3版本apiclient_key.pem不可为空"); + ErrorCode CHANNEL_WECHAT_VERSION_3_CERT_KEY_IS_NULL = new ErrorCode(1007001008,"微信渠道v3版本中apiclient_cert.pem不可为空"); + ErrorCode PAY_CHANNEL_NOTIFY_VERIFY_FAILED = new ErrorCode(1007001009, "渠道通知校验失败"); + /** + * ========== ORDER 模块 1-007-002-000 ========== + */ + ErrorCode PAY_ORDER_NOT_FOUND = new ErrorCode(1007002000, "支付订单不存在"); + ErrorCode PAY_ORDER_STATUS_IS_NOT_WAITING = new ErrorCode(1007002001, "支付订单不处于待支付"); + ErrorCode PAY_ORDER_STATUS_IS_NOT_SUCCESS = new ErrorCode(1007002002, "支付订单不处于已支付"); + ErrorCode PAY_ORDER_ERROR_USER = new ErrorCode(1007002003, "支付订单用户不正确"); + + /** + * ========== ORDER 模块(拓展单) 1-007-003-000 ========== + */ + ErrorCode PAY_ORDER_EXTENSION_NOT_FOUND = new ErrorCode(1007003000, "支付交易拓展单不存在"); + ErrorCode PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING = new ErrorCode(1007003001, "支付交易拓展单不处于待支付"); + ErrorCode PAY_ORDER_EXTENSION_STATUS_IS_NOT_SUCCESS = new ErrorCode(1007003002, "支付订单不处于已支付"); + + // ========== 支付模块(退款) 1-007-006-000 ========== + ErrorCode PAY_REFUND_AMOUNT_EXCEED = new ErrorCode(1007006000, "退款金额超过订单可退款金额"); + ErrorCode PAY_REFUND_ALL_REFUNDED = new ErrorCode(1007006001, "订单已经全额退款"); + ErrorCode PAY_REFUND_CHN_ORDER_NO_IS_NULL = new ErrorCode(1007006002, "该订单的渠道订单为空"); + ErrorCode PAY_REFUND_SUCCEED = new ErrorCode(1007006003, "已经退款成功"); + ErrorCode PAY_REFUND_NOT_FOUND = new ErrorCode(1007006004, "支付退款单不存在"); + + + /** + * ========== 支付商户信息 1-007-004-000 ========== + */ + ErrorCode PAY_MERCHANT_NOT_EXISTS = new ErrorCode(1007004000, "支付商户信息不存在"); + ErrorCode PAY_MERCHANT_EXIST_APP_CANT_DELETE = new ErrorCode(1007004001, "支付商户存在支付应用,无法删除"); + + + + + +} diff --git a/joju-module-pay/joju-module-pay-api/src/main/java/com/jojubanking/boot/module/pay/package-info.java b/joju-module-pay/joju-module-pay-api/src/main/java/com/jojubanking/boot/module/pay/package-info.java new file mode 100644 index 0000000..58f2213 --- /dev/null +++ b/joju-module-pay/joju-module-pay-api/src/main/java/com/jojubanking/boot/module/pay/package-info.java @@ -0,0 +1 @@ +package com.jojubanking.boot.module.pay; diff --git a/joju-module-pay/joju-module-pay-api/target/classes/com/jojubanking/boot/module/pay/enums/DictTypeConstants.class b/joju-module-pay/joju-module-pay-api/target/classes/com/jojubanking/boot/module/pay/enums/DictTypeConstants.class new file mode 100644 index 0000000..8e316d1 Binary files /dev/null and b/joju-module-pay/joju-module-pay-api/target/classes/com/jojubanking/boot/module/pay/enums/DictTypeConstants.class differ diff --git a/joju-module-pay/joju-module-pay-api/target/classes/com/jojubanking/boot/module/pay/enums/ErrorCodeConstants.class b/joju-module-pay/joju-module-pay-api/target/classes/com/jojubanking/boot/module/pay/enums/ErrorCodeConstants.class new file mode 100644 index 0000000..df2ac70 Binary files /dev/null and b/joju-module-pay/joju-module-pay-api/target/classes/com/jojubanking/boot/module/pay/enums/ErrorCodeConstants.class differ diff --git a/joju-module-pay/joju-module-pay-api/target/joju-module-pay-api-2.0.0-beta.jar b/joju-module-pay/joju-module-pay-api/target/joju-module-pay-api-2.0.0-beta.jar new file mode 100644 index 0000000..ea9e7fd Binary files /dev/null and b/joju-module-pay/joju-module-pay-api/target/joju-module-pay-api-2.0.0-beta.jar differ diff --git a/joju-module-pay/joju-module-pay-api/target/maven-archiver/pom.properties b/joju-module-pay/joju-module-pay-api/target/maven-archiver/pom.properties new file mode 100644 index 0000000..a556d47 --- /dev/null +++ b/joju-module-pay/joju-module-pay-api/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:28:44 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-module-pay-api diff --git a/joju-module-pay/joju-module-pay-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-module-pay/joju-module-pay-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..cf42b5d --- /dev/null +++ b/joju-module-pay/joju-module-pay-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,2 @@ +com\jojubanking\boot\module\pay\enums\DictTypeConstants.class +com\jojubanking\boot\module\pay\enums\ErrorCodeConstants.class diff --git a/joju-module-pay/joju-module-pay-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-module-pay/joju-module-pay-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..756deae --- /dev/null +++ b/joju-module-pay/joju-module-pay-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,3 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-api\src\main\java\com\jojubanking\boot\module\pay\enums\ErrorCodeConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-api\src\main\java\com\jojubanking\boot\module\pay\enums\DictTypeConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-api\src\main\java\com\jojubanking\boot\module\pay\package-info.java diff --git a/joju-module-pay/joju-module-pay-biz/joju-module-pay-biz.iml b/joju-module-pay/joju-module-pay-biz/joju-module-pay-biz.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/joju-module-pay-biz.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-module-pay/joju-module-pay-biz/pom.xml b/joju-module-pay/joju-module-pay-biz/pom.xml new file mode 100644 index 0000000..6a18930 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/pom.xml @@ -0,0 +1,85 @@ + + + + com.jojubanking.boot + joju-module-pay + ${revision} + + 4.0.0 + joju-module-pay-biz + jar + + ${project.artifactId} + + pay 模块,我们放支付业务,提供业务的支付能力。 + 例如说:商户、应用、支付、退款等等 + + + + + com.jojubanking.boot + joju-module-pay-api + ${revision} + + + + + com.jojubanking.boot + joju-spring-boot-starter-biz-operatelog + + + com.jojubanking.boot + joju-spring-boot-starter-biz-pay + + + com.jojubanking.boot + joju-spring-boot-starter-biz-tenant + + + + + com.jojubanking.boot + joju-spring-boot-starter-security + + + + + com.jojubanking.boot + joju-spring-boot-starter-mybatis + + + + com.jojubanking.boot + joju-spring-boot-starter-redis + + + + + com.jojubanking.boot + joju-spring-boot-starter-job + + + + + com.jojubanking.boot + joju-spring-boot-starter-mq + + + + + com.jojubanking.boot + joju-spring-boot-starter-test + test + + + + + com.jojubanking.boot + joju-spring-boot-starter-excel + + + + + diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/PayAppController.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/PayAppController.java new file mode 100644 index 0000000..71e5158 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/PayAppController.java @@ -0,0 +1,163 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.*; +import com.jojubanking.boot.module.pay.convert.app.PayAppConvert; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import com.jojubanking.boot.module.pay.service.merchant.PayAppService; +import com.jojubanking.boot.module.pay.service.merchant.PayChannelService; +import com.jojubanking.boot.module.pay.service.merchant.PayMerchantService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.*; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Slf4j +@Api(tags = "管理后台 - 支付应用信息") +@RestController +@RequestMapping("/pay/app") +@Validated +public class PayAppController { + + @Resource + private PayAppService appService; + @Resource + private PayChannelService channelService; + @Resource + private PayMerchantService merchantService; + + @PostMapping("/create") + @ApiOperation("创建支付应用信息") + @PreAuthorize("@ss.hasPermission('pay:app:create')") + public CommonResult createApp(@Valid @RequestBody PayAppCreateReqVO createReqVO) { + return success(appService.createApp(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新支付应用信息") + @PreAuthorize("@ss.hasPermission('pay:app:update')") + public CommonResult updateApp(@Valid @RequestBody PayAppUpdateReqVO updateReqVO) { + appService.updateApp(updateReqVO); + return success(true); + } + + @PutMapping("/update-status") + @ApiOperation("更新支付应用状态") + @PreAuthorize("@ss.hasPermission('pay:app:update')") + public CommonResult updateAppStatus(@Valid @RequestBody PayAppUpdateStatusReqVO updateReqVO) { + appService.updateAppStatus(updateReqVO.getId(), updateReqVO.getStatus()); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除支付应用信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('pay:app:delete')") + public CommonResult deleteApp(@RequestParam("id") Long id) { + appService.deleteApp(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得支付应用信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('pay:app:query')") + public CommonResult getApp(@RequestParam("id") Long id) { + PayAppDO app = appService.getApp(id); + return success(PayAppConvert.INSTANCE.convert(app)); + } + + @GetMapping("/list") + @ApiOperation("获得支付应用信息列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('pay:app:query')") + public CommonResult> getAppList(@RequestParam("ids") Collection ids) { + List list = appService.getAppList(ids); + return success(PayAppConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得支付应用信息分页") + @PreAuthorize("@ss.hasPermission('pay:app:query')") + public CommonResult> getAppPage(@Valid PayAppPageReqVO pageVO) { + // 得到应用分页列表 + PageResult pageResult = appService.getAppPage(pageVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(new PageResult<>(pageResult.getTotal())); + } + + // 得到所有的应用编号,查出所有的渠道 + Collection payAppIds = CollectionUtils.convertList(pageResult.getList(), PayAppDO::getId); + List channels = channelService.getChannelListByAppIds(payAppIds); + // TODO @aquan:可以基于 appId 简历一个 multiMap。这样下面,直接 get 到之后,CollUtil buildSet 即可 + Iterator iterator = channels.iterator(); + + // 得到所有的商户信息 + Collection merchantIds = CollectionUtils.convertList(pageResult.getList(), PayAppDO::getMerchantId); + Map deptMap = merchantService.getMerchantMap(merchantIds); + + // 利用反射将渠道数据复制到返回的数据结构中去 + List appList = new ArrayList<>(pageResult.getList().size()); + pageResult.getList().forEach(app -> { + // 写入应用信息的数据 + PayAppPageItemRespVO respVO = PayAppConvert.INSTANCE.pageConvert(app); + // 写入商户的数据 + respVO.setPayMerchant(PayAppConvert.INSTANCE.convert(deptMap.get(app.getMerchantId()))); + // 写入支付渠道信息的数据 + Set channelCodes = new HashSet<>(PayChannelEnum.values().length); + while (iterator.hasNext()) { + PayChannelDO channelDO = iterator.next(); + if (channelDO.getAppId().equals(app.getId())) { + channelCodes.add(channelDO.getCode()); + iterator.remove(); + } + } + respVO.setChannelCodes(channelCodes); + appList.add(respVO); + }); + + return success(new PageResult<>(appList, pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @ApiOperation("导出支付应用信息 Excel") + @PreAuthorize("@ss.hasPermission('pay:app:export')") + @OperateLog(type = EXPORT) + public void exportAppExcel(@Valid PayAppExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = appService.getAppList(exportReqVO); + // 导出 Excel + List datas = PayAppConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "支付应用信息.xls", "数据", PayAppExcelVO.class, datas); + } + + @GetMapping("/list-merchant-id") + @ApiOperation("根据商户 ID 查询支付应用信息") + @ApiImplicitParam(name = "merchantId", value = "商户ID", required = true, example = "1", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('pay:merchant:query')") + public CommonResult> getMerchantListByName(@RequestParam Long merchantId) { + List appListDO = appService.getListByMerchantId(merchantId); + return success(PayAppConvert.INSTANCE.convertList(appListDO)); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/PayChannelController.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/PayChannelController.java new file mode 100644 index 0000000..c5a151f --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/PayChannelController.java @@ -0,0 +1,124 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant; + +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.*; +import com.jojubanking.boot.module.pay.convert.channel.PayChannelConvert; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import com.jojubanking.boot.module.pay.service.merchant.PayChannelService; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 支付渠道") +@RestController +@RequestMapping("/pay/channel") +@Validated +public class PayChannelController { + + @Resource + private PayChannelService channelService; + + @PostMapping("/create") + @ApiOperation("创建支付渠道 ") + @PreAuthorize("@ss.hasPermission('pay:channel:create')") + public CommonResult createChannel(@Valid @RequestBody PayChannelCreateReqVO createReqVO) { + return success(channelService.createChannel(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新支付渠道 ") + @PreAuthorize("@ss.hasPermission('pay:channel:update')") + public CommonResult updateChannel(@Valid @RequestBody PayChannelUpdateReqVO updateReqVO) { + channelService.updateChannel(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除支付渠道 ") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('pay:channel:delete')") + public CommonResult deleteChannel(@RequestParam("id") Long id) { + channelService.deleteChannel(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得支付渠道 ") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('pay:channel:query')") + public CommonResult getChannel(@RequestParam("id") Long id) { + PayChannelDO channel = channelService.getChannel(id); + return success(PayChannelConvert.INSTANCE.convert(channel)); + } + + @GetMapping("/list") + @ApiOperation("获得支付渠道列表") + @ApiImplicitParam(name = "ids", value = "编号列表", + required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('pay:channel:query')") + public CommonResult> getChannelList(@RequestParam("ids") Collection ids) { + List list = channelService.getChannelList(ids); + return success(PayChannelConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得支付渠道分页") + @PreAuthorize("@ss.hasPermission('pay:channel:query')") + public CommonResult> getChannelPage(@Valid PayChannelPageReqVO pageVO) { + PageResult pageResult = channelService.getChannelPage(pageVO); + return success(PayChannelConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出支付渠道Excel") + @PreAuthorize("@ss.hasPermission('pay:channel:export')") + @OperateLog(type = EXPORT) + public void exportChannelExcel(@Valid PayChannelExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = channelService.getChannelList(exportReqVO); + // 导出 Excel + List datas = PayChannelConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "支付渠道.xls", "数据", PayChannelExcelVO.class, datas); + } + + @GetMapping("/get-channel") + @ApiOperation("根据条件查询微信支付渠道") + @ApiImplicitParams({ + @ApiImplicitParam(name = "merchantId", value = "商户编号", + required = true, example = "1", dataTypeClass = Long.class), + @ApiImplicitParam(name = "appId", value = "应用编号", + required = true, example = "1", dataTypeClass = Long.class), + @ApiImplicitParam(name = "code", value = "支付渠道编码", + required = true, example = "wx_pub", dataTypeClass = String.class) + }) + @PreAuthorize("@ss.hasPermission('pay:channel:query')") + public CommonResult getChannel( + @RequestParam Long merchantId, @RequestParam Long appId, @RequestParam String code) { + // 獲取渠道 + PayChannelDO channel = channelService.getChannelByConditions(merchantId, appId, code); + if (channel == null) { + return success(new PayChannelRespVO()); + } + // 拼凑数据 + PayChannelRespVO respVo = PayChannelConvert.INSTANCE.convert(channel); + return success(respVo); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/PayMerchantController.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/PayMerchantController.java new file mode 100644 index 0000000..addbd55 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/PayMerchantController.java @@ -0,0 +1,116 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant; + +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.*; +import com.jojubanking.boot.module.pay.convert.merchant.PayMerchantConvert; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import com.jojubanking.boot.module.pay.service.merchant.PayMerchantService; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "支付商户信息") +@RestController +@RequestMapping("/pay/merchant") +@Validated +public class PayMerchantController { + + @Resource + private PayMerchantService merchantService; + + @PostMapping("/create") + @ApiOperation("创建支付商户信息") + @PreAuthorize("@ss.hasPermission('pay:merchant:create')") + public CommonResult createMerchant(@Valid @RequestBody PayMerchantCreateReqVO createReqVO) { + return success(merchantService.createMerchant(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新支付商户信息") + @PreAuthorize("@ss.hasPermission('pay:merchant:update')") + public CommonResult updateMerchant(@Valid @RequestBody PayMerchantUpdateReqVO updateReqVO) { + merchantService.updateMerchant(updateReqVO); + return success(true); + } + + @PutMapping("/update-status") + @ApiOperation("修改支付商户状态") + @PreAuthorize("@ss.hasPermission('pay:merchant:update')") + public CommonResult updateMerchantStatus(@Valid @RequestBody PayMerchantUpdateStatusReqVO reqVO) { + merchantService.updateMerchantStatus(reqVO.getId(), reqVO.getStatus()); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除支付商户信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('pay:merchant:delete')") + public CommonResult deleteMerchant(@RequestParam("id") Long id) { + merchantService.deleteMerchant(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得支付商户信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('pay:merchant:query')") + public CommonResult getMerchant(@RequestParam("id") Long id) { + PayMerchantDO merchant = merchantService.getMerchant(id); + return success(PayMerchantConvert.INSTANCE.convert(merchant)); + } + + @GetMapping("/list-by-name") + @ApiOperation("根据商户名称获得支付商户信息列表") + @ApiImplicitParam(name = "name", value = "商户名称", example = "芋道", dataTypeClass = String.class) + @PreAuthorize("@ss.hasPermission('pay:merchant:query')") + public CommonResult> getMerchantListByName(@RequestParam(required = false) String name) { + List merchantListDO = merchantService.getMerchantListByName(name); + return success(PayMerchantConvert.INSTANCE.convertList(merchantListDO)); + } + + @GetMapping("/list") + @ApiOperation("获得支付商户信息列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('pay:merchant:query')") + public CommonResult> getMerchantList(@RequestParam("ids") Collection ids) { + List list = merchantService.getMerchantList(ids); + return success(PayMerchantConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得支付商户信息分页") + @PreAuthorize("@ss.hasPermission('pay:merchant:query')") + public CommonResult> getMerchantPage(@Valid PayMerchantPageReqVO pageVO) { + PageResult pageResult = merchantService.getMerchantPage(pageVO); + return success(PayMerchantConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出支付商户信息 Excel") + @PreAuthorize("@ss.hasPermission('pay:merchant:export')") + @OperateLog(type = EXPORT) + public void exportMerchantExcel(@Valid PayMerchantExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = merchantService.getMerchantList(exportReqVO); + // 导出 Excel + List datas = PayMerchantConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "支付商户信息.xls", "数据", PayMerchantExcelVO.class, datas); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppBaseVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppBaseVO.java new file mode 100644 index 0000000..65fc34b --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppBaseVO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app; + +import lombok.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 支付应用信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class PayAppBaseVO { + + @ApiModelProperty(value = "应用名", required = true) + @NotNull(message = "应用名不能为空") + private String name; + + @ApiModelProperty(value = "开启状态", required = true) + @NotNull(message = "开启状态不能为空") + private Integer status; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "支付结果的回调地址", required = true) + @NotNull(message = "支付结果的回调地址不能为空") + private String payNotifyUrl; + + @ApiModelProperty(value = "退款结果的回调地址", required = true) + @NotNull(message = "退款结果的回调地址不能为空") + private String refundNotifyUrl; + + @ApiModelProperty(value = "商户编号", required = true) + @NotNull(message = "商户编号不能为空") + private Long merchantId; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppCreateReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppCreateReqVO.java new file mode 100644 index 0000000..947b417 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppCreateReqVO.java @@ -0,0 +1,12 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app; + +import lombok.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 支付应用信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayAppCreateReqVO extends PayAppBaseVO { + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppExcelVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppExcelVO.java new file mode 100644 index 0000000..ed1ed28 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppExcelVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 支付应用信息 Excel VO + * + * @author 芋艿 + */ +@Data +public class PayAppExcelVO { + + @ExcelProperty("应用编号") + private Long id; + + @ExcelProperty("应用名") + private String name; + + @ExcelProperty("开启状态") + private Integer status; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("支付结果的回调地址") + private String payNotifyUrl; + + @ExcelProperty("退款结果的回调地址") + private String refundNotifyUrl; + + @ExcelProperty("商户编号") + private Long merchantId; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppExportReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppExportReqVO.java new file mode 100644 index 0000000..b56ebb6 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppExportReqVO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 支付应用信息 Excel 导出 Request VO", description = "参数和 PayAppPageReqVO 是一致的") +@Data +public class PayAppExportReqVO { + + @ApiModelProperty(value = "应用名") + private String name; + + @ApiModelProperty(value = "开启状态") + private Integer status; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "支付结果的回调地址") + private String payNotifyUrl; + + @ApiModelProperty(value = "退款结果的回调地址") + private String refundNotifyUrl; + + @ApiModelProperty(value = "商户名称") + private String merchantName; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageItemRespVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageItemRespVO.java new file mode 100644 index 0000000..9f7767d --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageItemRespVO.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; +import java.util.Set; + +@ApiModel(value = "管理后台 - 支付应用信息分页查询 Response VO", description = "相比于支付信息,还会多出应用渠道的开关信息") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayAppPageItemRespVO extends PayAppBaseVO { + + @ApiModelProperty(value = "应用编号", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + + /** + * 所属商户 + */ + private PayMerchant payMerchant; + + @ApiModel("商户") + @Data + public static class PayMerchant { + + @ApiModelProperty(value = "商户编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "商户名称", required = true, example = "研发部") + private String name; + + } + + @ApiModelProperty(value = "渠道编码集合", required = true, example = "alipay_pc,alipay_wap...") + private Set channelCodes; + + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageReqVO.java new file mode 100644 index 0000000..022a586 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageReqVO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 支付应用信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayAppPageReqVO extends PageParam { + + @ApiModelProperty(value = "应用名") + private String name; + + @ApiModelProperty(value = "开启状态") + private Integer status; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "支付结果的回调地址") + private String payNotifyUrl; + + @ApiModelProperty(value = "退款结果的回调地址") + private String refundNotifyUrl; + + @ApiModelProperty(value = "商户名称") + private String merchantName; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppRespVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppRespVO.java new file mode 100644 index 0000000..c8a4d71 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 支付应用信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayAppRespVO extends PayAppBaseVO { + + @ApiModelProperty(value = "应用编号", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppUpdateReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppUpdateReqVO.java new file mode 100644 index 0000000..bc036bc --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppUpdateReqVO.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app; + +import lombok.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 支付应用信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayAppUpdateReqVO extends PayAppBaseVO { + + @ApiModelProperty(value = "应用编号", required = true) + @NotNull(message = "应用编号不能为空") + private Long id; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppUpdateStatusReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppUpdateStatusReqVO.java new file mode 100644 index 0000000..457f103 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppUpdateStatusReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 应用更新状态 Request VO") +@Data +public class PayAppUpdateStatusReqVO { + + @ApiModelProperty(value = "商户编号", required = true, example = "1024") + @NotNull(message = "商户编号不能为空") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") + private Integer status; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelBaseVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelBaseVO.java new file mode 100644 index 0000000..46c91d6 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelBaseVO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel; + +import lombok.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 支付渠道 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class PayChannelBaseVO { + + @ApiModelProperty(value = "渠道编码", required = true) + @NotNull(message = "渠道编码不能为空") + private String code; + + @ApiModelProperty(value = "开启状态", required = true) + @NotNull(message = "开启状态不能为空") + private Integer status; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "渠道费率,单位:百分比", required = true) + @NotNull(message = "渠道费率,单位:百分比不能为空") + private Double feeRate; + + @ApiModelProperty(value = "商户编号", required = true) + @NotNull(message = "商户编号不能为空") + private Long merchantId; + + @ApiModelProperty(value = "应用编号", required = true) + @NotNull(message = "应用编号不能为空") + private Long appId; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelCreateReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelCreateReqVO.java new file mode 100644 index 0000000..b2ac958 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelCreateReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotBlank; + +@ApiModel("管理后台 - 支付渠道 创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayChannelCreateReqVO extends PayChannelBaseVO { + + @ApiModelProperty(value = "渠道配置的 json 字符串") + @NotBlank(message = "渠道配置不能为空") + private String config; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelExcelVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelExcelVO.java new file mode 100644 index 0000000..0b538d6 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelExcelVO.java @@ -0,0 +1,49 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 支付渠道 Excel VO + * + * @author 芋艿 + */ +@Data +public class PayChannelExcelVO { + + @ExcelProperty("商户编号") + private Long id; + + @ExcelProperty("渠道编码") + private String code; + + @ExcelProperty("开启状态") + private Integer status; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("渠道费率,单位:百分比") + private Double feeRate; + + @ExcelProperty("商户编号") + private Long merchantId; + + @ExcelProperty("应用编号") + private Long appId; + + /** + * todo @芋艿 mapStruct 存在转换问题 + * java: Can't map property "PayClientConfig payChannelDO.config" to "String payChannelExcelVO.config". + * Consider to declare/implement a mapping method: "String map(PayClientConfig value)". + */ + /// @ExcelProperty("支付渠道配置") + /// private String config; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelExportReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelExportReqVO.java new file mode 100644 index 0000000..04ae41d --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelExportReqVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 支付渠道 Excel 导出 Request VO", description = "参数和 PayChannelPageReqVO 是一致的") +@Data +public class PayChannelExportReqVO { + + @ApiModelProperty(value = "渠道编码") + private String code; + + @ApiModelProperty(value = "开启状态") + private Integer status; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "渠道费率,单位:百分比") + private Double feeRate; + + @ApiModelProperty(value = "商户编号") + private Long merchantId; + + @ApiModelProperty(value = "应用编号") + private Long appId; + + @ApiModelProperty(value = "支付渠道配置") + private String config; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelPageReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelPageReqVO.java new file mode 100644 index 0000000..c13d556 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelPageReqVO.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 支付渠道 分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayChannelPageReqVO extends PageParam { + + @ApiModelProperty(value = "渠道编码") + private String code; + + @ApiModelProperty(value = "开启状态") + private Integer status; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "渠道费率,单位:百分比") + private Double feeRate; + + @ApiModelProperty(value = "商户编号") + private Long merchantId; + + @ApiModelProperty(value = "应用编号") + private Long appId; + + @ApiModelProperty(value = "支付渠道配置") + private String config; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelRespVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelRespVO.java new file mode 100644 index 0000000..9370b4f --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelRespVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 支付渠道 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayChannelRespVO extends PayChannelBaseVO { + + @ApiModelProperty(value = "商户编号", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + + @ApiModelProperty(value = "配置", required = true) + private String config; +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelUpdateReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelUpdateReqVO.java new file mode 100644 index 0000000..93e2102 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel; + +import lombok.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 支付渠道 更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayChannelUpdateReqVO extends PayChannelBaseVO { + + @ApiModelProperty(value = "商户编号", required = true) + @NotNull(message = "商户编号不能为空") + private Long id; + + @ApiModelProperty(value = "渠道配置的json字符串") + @NotBlank(message = "渠道配置不能为空") + private String config; +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantBaseVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantBaseVO.java new file mode 100644 index 0000000..5a60cee --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantBaseVO.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 支付商户信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class PayMerchantBaseVO { + + @ApiModelProperty(value = "商户全称", required = true) + @NotNull(message = "商户全称不能为空") + private String name; + + @ApiModelProperty(value = "商户简称", required = true) + @NotNull(message = "商户简称不能为空") + private String shortName; + + @ApiModelProperty(value = "开启状态", required = true) + @NotNull(message = "开启状态不能为空") + private Integer status; + + @ApiModelProperty(value = "备注") + private String remark; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantCreateReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantCreateReqVO.java new file mode 100644 index 0000000..0c8a661 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantCreateReqVO.java @@ -0,0 +1,12 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant; + +import lombok.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 支付商户信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayMerchantCreateReqVO extends PayMerchantBaseVO { + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExcelVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExcelVO.java new file mode 100644 index 0000000..1891db0 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExcelVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 支付商户信息 Excel VO + * + * @author 芋艿 + */ +@Data +public class PayMerchantExcelVO { + + @ExcelProperty("商户编号") + private Long id; + + @ExcelProperty("商户号") + private String no; + + @ExcelProperty("商户全称") + private String name; + + @ExcelProperty("商户简称") + private String shortName; + + @ExcelProperty(value = "开启状态",converter = DictConvert.class) + @DictFormat("sys_common_status") + private Integer status; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExportReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExportReqVO.java new file mode 100644 index 0000000..991fcb3 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExportReqVO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 支付商户信息 Excel 导出 Request VO", description = "参数和 PayMerchantPageReqVO 是一致的") +@Data +public class PayMerchantExportReqVO { + + @ApiModelProperty(value = "商户号") + private String no; + + @ApiModelProperty(value = "商户全称") + private String name; + + @ApiModelProperty(value = "商户简称") + private String shortName; + + @ApiModelProperty(value = "开启状态") + private Integer status; + + @ApiModelProperty(value = "备注") + private String remark; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantPageReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantPageReqVO.java new file mode 100644 index 0000000..ad6fcab --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantPageReqVO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 支付商户信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayMerchantPageReqVO extends PageParam { + + @ApiModelProperty(value = "商户号") + private String no; + + @ApiModelProperty(value = "商户全称") + private String name; + + @ApiModelProperty(value = "商户简称") + private String shortName; + + @ApiModelProperty(value = "开启状态") + private Integer status; + + @ApiModelProperty(value = "备注") + private String remark; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantRespVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantRespVO.java new file mode 100644 index 0000000..1fa624c --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantRespVO.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 支付商户信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayMerchantRespVO extends PayMerchantBaseVO { + + @ApiModelProperty(value = "商户编号", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + + @ApiModelProperty(value = "商户号", required = true, example = "M233666999") + private String no; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateReqVO.java new file mode 100644 index 0000000..15f6e7b --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateReqVO.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant; + +import lombok.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 支付商户信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayMerchantUpdateReqVO extends PayMerchantBaseVO { + + @ApiModelProperty(value = "商户编号", required = true) + @NotNull(message = "商户编号不能为空") + private Long id; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateStatusReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateStatusReqVO.java new file mode 100644 index 0000000..5e82229 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateStatusReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 商户更新状态 Request VO") +@Data +public class PayMerchantUpdateStatusReqVO { + + @ApiModelProperty(value = "商户编号", required = true, example = "1024") + @NotNull(message = "商户编号不能为空") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") + private Integer status; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/PayOrderController.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/PayOrderController.java new file mode 100644 index 0000000..b4cb094 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/PayOrderController.java @@ -0,0 +1,158 @@ +package com.jojubanking.boot.module.pay.controller.admin.order; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.*; +import com.jojubanking.boot.module.pay.convert.order.PayOrderConvert; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderExtensionDO; +import com.jojubanking.boot.module.pay.service.merchant.PayAppService; +import com.jojubanking.boot.module.pay.service.merchant.PayMerchantService; +import com.jojubanking.boot.module.pay.service.order.PayOrderExtensionService; +import com.jojubanking.boot.module.pay.service.order.PayOrderService; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 支付订单") +@RestController +@RequestMapping("/pay/order") +@Validated +public class PayOrderController { + + @Resource + private PayOrderService orderService; + @Resource + private PayOrderExtensionService orderExtensionService; + @Resource + private PayMerchantService merchantService; + @Resource + private PayAppService appService; + + @GetMapping("/get") + @ApiOperation("获得支付订单") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('pay:order:query')") + public CommonResult getOrder(@RequestParam("id") Long id) { + PayOrderDO order = orderService.getOrder(id); + if (ObjectUtil.isNull(order)) { + return success(new PayOrderDetailsRespVO()); + } + + PayMerchantDO merchantDO = merchantService.getMerchant(order.getMerchantId()); + PayAppDO appDO = appService.getApp(order.getAppId()); + PayChannelEnum channelEnum = PayChannelEnum.getByCode(order.getChannelCode()); + + // TODO @aquan:文案,都是前端 format; + PayOrderDetailsRespVO respVO = PayOrderConvert.INSTANCE.orderDetailConvert(order); + respVO.setMerchantName(ObjectUtil.isNotNull(merchantDO) ? merchantDO.getName() : "未知商户"); + respVO.setAppName(ObjectUtil.isNotNull(appDO) ? appDO.getName() : "未知应用"); + respVO.setChannelCodeName(ObjectUtil.isNotNull(channelEnum) ? channelEnum.getName() : "未知渠道"); + + PayOrderExtensionDO extensionDO = orderExtensionService.getOrderExtension(order.getSuccessExtensionId()); + if (ObjectUtil.isNotNull(extensionDO)) { + respVO.setPayOrderExtension(PayOrderConvert.INSTANCE.orderDetailExtensionConvert(extensionDO)); + } + + return success(respVO); + } + + @GetMapping("/page") + @ApiOperation("获得支付订单分页") + @PreAuthorize("@ss.hasPermission('pay:order:query')") + public CommonResult> getOrderPage(@Valid PayOrderPageReqVO pageVO) { + PageResult pageResult = orderService.getOrderPage(pageVO); + if (CollectionUtil.isEmpty(pageResult.getList())) { + return success(new PageResult<>(pageResult.getTotal())); + } + + // 处理商户ID数据 + Map merchantMap = merchantService.getMerchantMap( + CollectionUtils.convertList(pageResult.getList(), PayOrderDO::getMerchantId)); + // 处理应用ID数据 + Map appMap = appService.getAppMap( + CollectionUtils.convertList(pageResult.getList(), PayOrderDO::getAppId)); + + List pageList = new ArrayList<>(pageResult.getList().size()); + pageResult.getList().forEach(c -> { + PayMerchantDO merchantDO = merchantMap.get(c.getMerchantId()); + PayAppDO appDO = appMap.get(c.getAppId()); + PayChannelEnum channelEnum = PayChannelEnum.getByCode(c.getChannelCode()); + + PayOrderPageItemRespVO orderItem = PayOrderConvert.INSTANCE.pageConvertItemPage(c); + orderItem.setMerchantName(ObjectUtil.isNotNull(merchantDO) ? merchantDO.getName() : "未知商户"); + orderItem.setAppName(ObjectUtil.isNotNull(appDO) ? appDO.getName() : "未知应用"); + orderItem.setChannelCodeName(ObjectUtil.isNotNull(channelEnum) ? channelEnum.getName() : "未知渠道"); + pageList.add(orderItem); + }); + return success(new PageResult<>(pageList, pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @ApiOperation("导出支付订单Excel") + @PreAuthorize("@ss.hasPermission('pay:order:export')") + @OperateLog(type = EXPORT) + public void exportOrderExcel(@Valid PayOrderExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + + List list = orderService.getOrderList(exportReqVO); + if (CollectionUtil.isEmpty(list)) { + ExcelUtils.write(response, "支付订单.xls", "数据", + PayOrderExcelVO.class, new ArrayList<>()); + } + + // 处理商户ID数据 + Map merchantMap = merchantService.getMerchantMap( + CollectionUtils.convertList(list, PayOrderDO::getMerchantId)); + // 处理应用ID数据 + Map appMap = appService.getAppMap( + CollectionUtils.convertList(list, PayOrderDO::getAppId)); + // 处理扩展订单数据 + Map orderExtensionMap = orderExtensionService + .getOrderExtensionMap(CollectionUtils.convertList(list, PayOrderDO::getSuccessExtensionId)); + + List excelDatum = new ArrayList<>(list.size()); + list.forEach(c -> { + PayMerchantDO merchantDO = merchantMap.get(c.getMerchantId()); + PayAppDO appDO = appMap.get(c.getAppId()); + PayChannelEnum channelEnum = PayChannelEnum.getByCode(c.getChannelCode()); + PayOrderExtensionDO orderExtensionDO = orderExtensionMap.get(c.getSuccessExtensionId()); + + PayOrderExcelVO excelItem = PayOrderConvert.INSTANCE.excelConvert(c); + excelItem.setMerchantName(ObjectUtil.isNotNull(merchantDO) ? merchantDO.getName() : "未知商户"); + excelItem.setAppName(ObjectUtil.isNotNull(appDO) ? appDO.getName() : "未知应用"); + excelItem.setChannelCodeName(ObjectUtil.isNotNull(channelEnum) ? channelEnum.getName() : "未知渠道"); + excelItem.setNo(ObjectUtil.isNotNull(orderExtensionDO) ? orderExtensionDO.getNo() : ""); + excelDatum.add(excelItem); + }); + + // 导出 Excel + ExcelUtils.write(response, "支付订单.xls", "数据", PayOrderExcelVO.class, excelDatum); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderBaseVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderBaseVO.java new file mode 100644 index 0000000..7b6880c --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderBaseVO.java @@ -0,0 +1,107 @@ +package com.jojubanking.boot.module.pay.controller.admin.order.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * 支付订单 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + * + * @author aquan + */ +@Data +public class PayOrderBaseVO { + + @ApiModelProperty(value = "商户编号", required = true) + @NotNull(message = "商户编号不能为空") + private Long merchantId; + + @ApiModelProperty(value = "应用编号", required = true) + @NotNull(message = "应用编号不能为空") + private Long appId; + + @ApiModelProperty(value = "渠道编号") + private Long channelId; + + @ApiModelProperty(value = "渠道编码") + private String channelCode; + + @ApiModelProperty(value = "商户订单编号", required = true) + @NotNull(message = "商户订单编号不能为空") + private String merchantOrderId; + + @ApiModelProperty(value = "商品标题", required = true) + @NotNull(message = "商品标题不能为空") + private String subject; + + @ApiModelProperty(value = "商品描述", required = true) + @NotNull(message = "商品描述不能为空") + private String body; + + @ApiModelProperty(value = "异步通知地址", required = true) + @NotNull(message = "异步通知地址不能为空") + private String notifyUrl; + + @ApiModelProperty(value = "通知商户支付结果的回调状态", required = true) + @NotNull(message = "通知商户支付结果的回调状态不能为空") + private Integer notifyStatus; + + @ApiModelProperty(value = "支付金额,单位:分", required = true) + @NotNull(message = "支付金额,单位:分不能为空") + private Long amount; + + @ApiModelProperty(value = "渠道手续费,单位:百分比") + private Double channelFeeRate; + + @ApiModelProperty(value = "渠道手续金额,单位:分") + private Long channelFeeAmount; + + @ApiModelProperty(value = "支付状态", required = true) + @NotNull(message = "支付状态不能为空") + private Integer status; + + @ApiModelProperty(value = "用户 IP", required = true) + @NotNull(message = "用户 IP不能为空") + private String userIp; + + @ApiModelProperty(value = "订单失效时间", required = true) + @NotNull(message = "订单失效时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date expireTime; + + @ApiModelProperty(value = "订单支付成功时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date successTime; + + @ApiModelProperty(value = "订单支付通知时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date notifyTime; + + @ApiModelProperty(value = "支付成功的订单拓展单编号") + private Long successExtensionId; + + @ApiModelProperty(value = "退款状态", required = true) + @NotNull(message = "退款状态不能为空") + private Integer refundStatus; + + @ApiModelProperty(value = "退款次数", required = true) + @NotNull(message = "退款次数不能为空") + private Integer refundTimes; + + @ApiModelProperty(value = "退款总金额,单位:分", required = true) + @NotNull(message = "退款总金额,单位:分不能为空") + private Long refundAmount; + + @ApiModelProperty(value = "渠道用户编号") + private String channelUserId; + + @ApiModelProperty(value = "渠道订单号") + private String channelOrderNo; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.java new file mode 100644 index 0000000..404ff5f --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.module.pay.controller.admin.order.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 支付订单详细信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayOrderDetailsRespVO extends PayOrderBaseVO { + + @ApiModelProperty(value = "支付订单编号") + private Long id; + + @ApiModelProperty(value = "商户名称") + private String merchantName; + + @ApiModelProperty(value = "应用名称") + private String appName; + + @ApiModelProperty(value = "渠道编号名称") + private String channelCodeName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + /** + * 支付订单扩展 + */ + private PayOrderExtension payOrderExtension; + + @Data + @ApiModel("支付订单扩展") + public static class PayOrderExtension { + + @ApiModelProperty(value = "支付订单号") + private String no; + + @ApiModelProperty(value = "支付异步通知的内容") + private String channelNotifyData; + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderExcelVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderExcelVO.java new file mode 100644 index 0000000..9d12414 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderExcelVO.java @@ -0,0 +1,91 @@ +package com.jojubanking.boot.module.pay.controller.admin.order.vo; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.pay.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 支付订单Excel VO + * + * @author aquan + */ +@Data +public class PayOrderExcelVO { + + @ExcelProperty("支付订单编号") + private Long id; + + @ExcelProperty(value = "商户名称") + private String merchantName; + + @ExcelProperty(value = "应用名称") + private String appName; + + @ExcelProperty("商品标题") + private String subject; + + @ExcelProperty("商户订单编号") + private String merchantOrderId; + + @ExcelProperty("渠道订单号") + private String channelOrderNo; + + @ExcelProperty(value = "支付订单号") + private String no; + + @ExcelProperty("支付金额,单位:元") + private String amount; + + @ExcelProperty("渠道手续金额,单位:元") + private String channelFeeAmount; + + @ExcelProperty("渠道手续费,单位:百分比") + private String channelFeeRate; + + @DictFormat(DictTypeConstants.ORDER_STATUS) + @ExcelProperty(value = "支付状态", converter = DictConvert.class) + private Integer status; + + @DictFormat(DictTypeConstants.ORDER_NOTIFY_STATUS) + @ExcelProperty(value = "通知商户支付结果的回调状态", converter = DictConvert.class) + private Integer notifyStatus; + + @ExcelProperty("异步通知地址") + private String notifyUrl; + + @ExcelProperty("创建时间") + private Date createTime; + + @ExcelProperty("订单支付成功时间") + private Date successTime; + + @ExcelProperty("订单失效时间") + private Date expireTime; + + @ExcelProperty("订单支付通知时间") + private Date notifyTime; + + @ExcelProperty(value = "渠道编号名称") + private String channelCodeName; + + @ExcelProperty("用户 IP") + private String userIp; + + @DictFormat(DictTypeConstants.ORDER_REFUND_STATUS) + @ExcelProperty(value = "退款状态", converter = DictConvert.class) + private Integer refundStatus; + + @ExcelProperty("退款次数") + private Integer refundTimes; + + @ExcelProperty("退款总金额,单位:元") + private String refundAmount; + + @ExcelProperty("商品描述") + private String body; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderExportReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderExportReqVO.java new file mode 100644 index 0000000..097e464 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderExportReqVO.java @@ -0,0 +1,92 @@ +package com.jojubanking.boot.module.pay.controller.admin.order.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 支付订单 Excel 导出 Request VO", description = "参数和 PayOrderPageReqVO 是一致的") +@Data +public class PayOrderExportReqVO { + + @ApiModelProperty(value = "商户编号") + private Long merchantId; + + @ApiModelProperty(value = "应用编号") + private Long appId; + + @ApiModelProperty(value = "渠道编号") + private Long channelId; + + @ApiModelProperty(value = "渠道编码") + private String channelCode; + + @ApiModelProperty(value = "商户订单编号") + private String merchantOrderId; + + @ApiModelProperty(value = "商品标题") + private String subject; + + @ApiModelProperty(value = "商品描述") + private String body; + + @ApiModelProperty(value = "异步通知地址") + private String notifyUrl; + + @ApiModelProperty(value = "通知商户支付结果的回调状态") + private Integer notifyStatus; + + @ApiModelProperty(value = "支付金额,单位:分") + private Long amount; + + @ApiModelProperty(value = "渠道手续费,单位:百分比") + private Double channelFeeRate; + + @ApiModelProperty(value = "渠道手续金额,单位:分") + private Long channelFeeAmount; + + @ApiModelProperty(value = "支付状态") + private Integer status; + + @ApiModelProperty(value = "用户 IP") + private String userIp; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "订单失效时间") + private Date[] expireTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始订单支付成功时间") + private Date[] successTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始订单支付通知时间") + private Date[] notifyTime; + + @ApiModelProperty(value = "支付成功的订单拓展单编号") + private Long successExtensionId; + + @ApiModelProperty(value = "退款状态") + private Integer refundStatus; + + @ApiModelProperty(value = "退款次数") + private Integer refundTimes; + + @ApiModelProperty(value = "退款总金额,单位:分") + private Long refundAmount; + + @ApiModelProperty(value = "渠道用户编号") + private String channelUserId; + + @ApiModelProperty(value = "渠道订单号") + private String channelOrderNo; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.java new file mode 100644 index 0000000..9cbd227 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.pay.controller.admin.order.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 支付订单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayOrderPageItemRespVO extends PayOrderBaseVO { + + @ApiModelProperty(value = "支付订单编号", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + + @ApiModelProperty(value = "商户名称") + private String merchantName; + + @ApiModelProperty(value = "应用名称") + private String appName; + + @ApiModelProperty(value = "渠道名称") + private String channelCodeName; + + @ApiModelProperty(value = "支付订单号") + private String no; + + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderPageReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderPageReqVO.java new file mode 100644 index 0000000..eaddb73 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderPageReqVO.java @@ -0,0 +1,97 @@ +package com.jojubanking.boot.module.pay.controller.admin.order.vo; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 支付订单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayOrderPageReqVO extends PageParam { + + @ApiModelProperty(value = "商户编号") + private Long merchantId; + + @ApiModelProperty(value = "应用编号") + private Long appId; + + @ApiModelProperty(value = "渠道编号") + private Long channelId; + + @ApiModelProperty(value = "渠道编码") + private String channelCode; + + @ApiModelProperty(value = "商户订单编号") + private String merchantOrderId; + + @ApiModelProperty(value = "商品标题") + private String subject; + + @ApiModelProperty(value = "商品描述") + private String body; + + @ApiModelProperty(value = "异步通知地址") + private String notifyUrl; + + @ApiModelProperty(value = "通知商户支付结果的回调状态") + private Integer notifyStatus; + + @ApiModelProperty(value = "支付金额,单位:分") + private Long amount; + + @ApiModelProperty(value = "渠道手续费,单位:百分比") + private Double channelFeeRate; + + @ApiModelProperty(value = "渠道手续金额,单位:分") + private Long channelFeeAmount; + + @ApiModelProperty(value = "支付状态") + private Integer status; + + @ApiModelProperty(value = "用户 IP") + private String userIp; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "订单失效时间") + private Date[] expireTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "订单支付成功时间") + private Date[] successTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "订单支付通知时间") + private Date[] notifyTime; + + @ApiModelProperty(value = "支付成功的订单拓展单编号") + private Long successExtensionId; + + @ApiModelProperty(value = "退款状态") + private Integer refundStatus; + + @ApiModelProperty(value = "退款次数") + private Integer refundTimes; + + @ApiModelProperty(value = "退款总金额,单位:分") + private Long refundAmount; + + @ApiModelProperty(value = "渠道用户编号") + private String channelUserId; + + @ApiModelProperty(value = "渠道订单号") + private String channelOrderNo; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderRespVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderRespVO.java new file mode 100644 index 0000000..5585338 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderRespVO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.pay.controller.admin.order.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 支付订单 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayOrderRespVO extends PayOrderBaseVO { + + @ApiModelProperty(value = "支付订单编号", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/PayRefundController.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/PayRefundController.java new file mode 100644 index 0000000..05e6cdc --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/PayRefundController.java @@ -0,0 +1,156 @@ +package com.jojubanking.boot.module.pay.controller.admin.refund; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.*; +import com.jojubanking.boot.module.pay.convert.refund.PayRefundConvert; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.dal.dataobject.refund.PayRefundDO; +import com.jojubanking.boot.module.pay.service.merchant.PayAppService; +import com.jojubanking.boot.module.pay.service.merchant.PayMerchantService; +import com.jojubanking.boot.module.pay.service.order.PayOrderService; +import com.jojubanking.boot.module.pay.service.refund.PayRefundService; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 退款订单") +@RestController +@RequestMapping("/pay/refund") +@Validated +public class PayRefundController { + + @Resource + private PayRefundService refundService; + @Resource + private PayMerchantService merchantService; + @Resource + private PayAppService appService; + @Resource + private PayOrderService orderService; + + @GetMapping("/get") + @ApiOperation("获得退款订单") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('pay:refund:query')") + public CommonResult getRefund(@RequestParam("id") Long id) { + PayRefundDO refund = refundService.getRefund(id); + if (ObjectUtil.isNull(refund)) { + return success(new PayRefundDetailsRespVO()); + } + + PayMerchantDO merchantDO = merchantService.getMerchant(refund.getMerchantId()); + PayAppDO appDO = appService.getApp(refund.getAppId()); + PayChannelEnum channelEnum = PayChannelEnum.getByCode(refund.getChannelCode()); + PayOrderDO orderDO = orderService.getOrder(refund.getOrderId()); + + PayRefundDetailsRespVO refundDetail = PayRefundConvert.INSTANCE.refundDetailConvert(refund); + refundDetail.setMerchantName(ObjectUtil.isNotNull(merchantDO) ? merchantDO.getName() : "未知商户"); + refundDetail.setAppName(ObjectUtil.isNotNull(appDO) ? appDO.getName() : "未知应用"); + refundDetail.setChannelCodeName(ObjectUtil.isNotNull(channelEnum) ? channelEnum.getName() : "未知渠道"); + refundDetail.setSubject(orderDO.getSubject()); + + return success(refundDetail); + } + + @GetMapping("/page") + @ApiOperation("获得退款订单分页") + @PreAuthorize("@ss.hasPermission('pay:refund:query')") + public CommonResult> getRefundPage(@Valid PayRefundPageReqVO pageVO) { + PageResult pageResult = refundService.getRefundPage(pageVO); + if (CollectionUtil.isEmpty(pageResult.getList())) { + return success(new PageResult<>(pageResult.getTotal())); + } + + // 处理商户ID数据 + Map merchantMap = merchantService.getMerchantMap( + CollectionUtils.convertList(pageResult.getList(), PayRefundDO::getMerchantId)); + // 处理应用ID数据 + Map appMap = appService.getAppMap( + CollectionUtils.convertList(pageResult.getList(), PayRefundDO::getAppId)); + List list = new ArrayList<>(pageResult.getList().size()); + pageResult.getList().forEach(c -> { + PayMerchantDO merchantDO = merchantMap.get(c.getMerchantId()); + PayAppDO appDO = appMap.get(c.getAppId()); + PayChannelEnum channelEnum = PayChannelEnum.getByCode(c.getChannelCode()); + + PayRefundPageItemRespVO item = PayRefundConvert.INSTANCE.pageItemConvert(c); + + item.setMerchantName(ObjectUtil.isNotNull(merchantDO) ? merchantDO.getName() : "未知商户"); + item.setAppName(ObjectUtil.isNotNull(appDO) ? appDO.getName() : "未知应用"); + item.setChannelCodeName(ObjectUtil.isNotNull(channelEnum) ? channelEnum.getName() : "未知渠道"); + list.add(item); + }); + + return success(new PageResult<>(list, pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @ApiOperation("导出退款订单 Excel") + @PreAuthorize("@ss.hasPermission('pay:refund:export')") + @OperateLog(type = EXPORT) + public void exportRefundExcel(@Valid PayRefundExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + + List list = refundService.getRefundList(exportReqVO); + if (CollectionUtil.isEmpty(list)) { + ExcelUtils.write(response, "退款订单.xls", "数据", + PayRefundExcelVO.class, new ArrayList<>()); + } + + // 处理商户ID数据 + Map merchantMap = merchantService.getMerchantMap( + CollectionUtils.convertList(list, PayRefundDO::getMerchantId)); + // 处理应用ID数据 + Map appMap = appService.getAppMap( + CollectionUtils.convertList(list, PayRefundDO::getAppId)); + + List excelDatum = new ArrayList<>(list.size()); + // 处理商品名称数据 + Map orderMap = orderService.getOrderSubjectMap( + CollectionUtils.convertList(list, PayRefundDO::getOrderId)); + + list.forEach(c -> { + PayMerchantDO merchantDO = merchantMap.get(c.getMerchantId()); + PayAppDO appDO = appMap.get(c.getAppId()); + PayChannelEnum channelEnum = PayChannelEnum.getByCode(c.getChannelCode()); + + PayRefundExcelVO excelItem = PayRefundConvert.INSTANCE.excelConvert(c); + excelItem.setMerchantName(ObjectUtil.isNotNull(merchantDO) ? merchantDO.getName() : "未知商户"); + excelItem.setAppName(ObjectUtil.isNotNull(appDO) ? appDO.getName() : "未知应用"); + excelItem.setChannelCodeName(ObjectUtil.isNotNull(channelEnum) ? channelEnum.getName() : "未知渠道"); + excelItem.setSubject(orderMap.get(c.getOrderId()).getSubject()); + + excelDatum.add(excelItem); + }); + + // 导出 Excel + ExcelUtils.write(response, "退款订单.xls", "数据", PayRefundExcelVO.class, excelDatum); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundBaseVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundBaseVO.java new file mode 100644 index 0000000..39f8e32 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundBaseVO.java @@ -0,0 +1,110 @@ +package com.jojubanking.boot.module.pay.controller.admin.refund.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 退款订单 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class PayRefundBaseVO { + + @ApiModelProperty(value = "商户编号", required = true) + @NotNull(message = "商户编号不能为空") + private Long merchantId; + + @ApiModelProperty(value = "应用编号", required = true) + @NotNull(message = "应用编号不能为空") + private Long appId; + + @ApiModelProperty(value = "渠道编号", required = true) + @NotNull(message = "渠道编号不能为空") + private Long channelId; + + @ApiModelProperty(value = "渠道编码", required = true) + @NotNull(message = "渠道编码不能为空") + private String channelCode; + + @ApiModelProperty(value = "支付订单编号 pay_order 表id", required = true) + @NotNull(message = "支付订单编号 pay_order 表id不能为空") + private Long orderId; + + @ApiModelProperty(value = "交易订单号 pay_extension 表no 字段", required = true) + @NotNull(message = "交易订单号 pay_extension 表no 字段不能为空") + private String tradeNo; + + @ApiModelProperty(value = "商户订单编号(商户系统生成)", required = true) + @NotNull(message = "商户订单编号(商户系统生成)不能为空") + private String merchantOrderId; + + @ApiModelProperty(value = "商户退款订单号(商户系统生成)", required = true) + @NotNull(message = "商户退款订单号(商户系统生成)不能为空") + private String merchantRefundNo; + + @ApiModelProperty(value = "异步通知商户地址", required = true) + @NotNull(message = "异步通知商户地址不能为空") + private String notifyUrl; + + @ApiModelProperty(value = "通知商户退款结果的回调状态", required = true) + @NotNull(message = "通知商户退款结果的回调状态不能为空") + private Integer notifyStatus; + + @ApiModelProperty(value = "退款状态", required = true) + @NotNull(message = "退款状态不能为空") + private Integer status; + + @ApiModelProperty(value = "退款类型(部分退款,全部退款)", required = true) + @NotNull(message = "退款类型(部分退款,全部退款)不能为空") + private Integer type; + + @ApiModelProperty(value = "支付金额,单位分", required = true) + @NotNull(message = "支付金额,单位分不能为空") + private Long payAmount; + + @ApiModelProperty(value = "退款金额,单位分", required = true) + @NotNull(message = "退款金额,单位分不能为空") + private Long refundAmount; + + @ApiModelProperty(value = "退款原因", required = true) + @NotNull(message = "退款原因不能为空") + private String reason; + + @ApiModelProperty(value = "用户 IP") + private String userIp; + + @ApiModelProperty(value = "渠道订单号,pay_order 中的channel_order_no 对应", required = true) + @NotNull(message = "渠道订单号,pay_order 中的channel_order_no 对应不能为空") + private String channelOrderNo; + + @ApiModelProperty(value = "渠道退款单号,渠道返回") + private String channelRefundNo; + + @ApiModelProperty(value = "渠道调用报错时,错误码") + private String channelErrorCode; + + @ApiModelProperty(value = "渠道调用报错时,错误信息") + private String channelErrorMsg; + + @ApiModelProperty(value = "支付渠道的额外参数") + private String channelExtras; + + @ApiModelProperty(value = "退款失效时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date expireTime; + + @ApiModelProperty(value = "退款成功时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date successTime; + + @ApiModelProperty(value = "退款通知时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date notifyTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundCreateReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundCreateReqVO.java new file mode 100644 index 0000000..5e77a60 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundCreateReqVO.java @@ -0,0 +1,12 @@ +package com.jojubanking.boot.module.pay.controller.admin.refund.vo; + +import lombok.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 退款订单创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayRefundCreateReqVO extends PayRefundBaseVO { + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.java new file mode 100644 index 0000000..a97744a --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.pay.controller.admin.refund.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +@ApiModel("管理后台 - 退款订单详情 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayRefundDetailsRespVO extends PayRefundBaseVO { + + @ApiModelProperty(value = "支付退款编号", required = true) + private Long id; + + @ApiModelProperty(value = "商户名称") + private String merchantName; + + @ApiModelProperty(value = "应用名称") + private String appName; + + @ApiModelProperty(value = "渠道编号名称") + private String channelCodeName; + + @NotNull(message = "商品标题不能为空") + private String subject; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundExcelVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundExcelVO.java new file mode 100644 index 0000000..b9b810b --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundExcelVO.java @@ -0,0 +1,88 @@ +package com.jojubanking.boot.module.pay.controller.admin.refund.vo; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.pay.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 退款订单 Excel VO + * + * @author aquan + */ +@Data +public class PayRefundExcelVO { + + @ExcelProperty("支付退款编号") + private Long id; + + @ExcelProperty("商品名称") + private String subject; + + @ExcelProperty(value = "商户名称") + private String merchantName; + + @ExcelProperty(value = "应用名称") + private String appName; + + @ExcelProperty(value = "渠道编号名称") + private String channelCodeName; + + @ExcelProperty("交易订单号") + private String tradeNo; + + @ExcelProperty("商户订单编号") + private String merchantOrderId; + + @ExcelProperty("商户退款订单号") + private String merchantRefundNo; + + @ExcelProperty("异步通知商户地址") + private String notifyUrl; + + @DictFormat(DictTypeConstants.ORDER_NOTIFY_STATUS) + @ExcelProperty(value = "商户退款结果回调状态", converter = DictConvert.class) + private Integer notifyStatus; + + @DictFormat(DictTypeConstants.REFUND_ORDER_STATUS) + @ExcelProperty(value = "退款状态", converter = DictConvert.class) + private Integer status; + + @DictFormat(DictTypeConstants.REFUND_ORDER_TYPE) + @ExcelProperty(value = "退款类型", converter = DictConvert.class) + private Integer type; + + @ExcelProperty("支付金额,单位:元") + private String payAmount; + + @ExcelProperty("退款金额,单位:元") + private String refundAmount; + + @ExcelProperty("退款原因") + private String reason; + + @ExcelProperty("用户付款 IP") + private String userIp; + + @ExcelProperty("渠道订单号") + private String channelOrderNo; + + @ExcelProperty("渠道退款单号") + private String channelRefundNo; + + @ExcelProperty("创建时间") + private Date createTime; + + @ExcelProperty("退款成功时间") + private Date successTime; + + @ExcelProperty("退款通知时间") + private Date notifyTime; + + @ExcelProperty("退款失效时间") + private Date expireTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.java new file mode 100644 index 0000000..d019093 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.java @@ -0,0 +1,95 @@ +package com.jojubanking.boot.module.pay.controller.admin.refund.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 退款订单 Excel 导出 Request VO", description = "参数和 PayRefundPageReqVO 是一致的") +@Data +public class PayRefundExportReqVO { + + @ApiModelProperty(value = "商户编号") + private Long merchantId; + + @ApiModelProperty(value = "应用编号") + private Long appId; + + @ApiModelProperty(value = "渠道编号") + private Long channelId; + + @ApiModelProperty(value = "渠道编码") + private String channelCode; + + @ApiModelProperty(value = "支付订单编号 pay_order 表id") + private Long orderId; + + @ApiModelProperty(value = "交易订单号 pay_extension 表no 字段") + private String tradeNo; + + @ApiModelProperty(value = "商户订单编号(商户系统生成)") + private String merchantOrderId; + + @ApiModelProperty(value = "商户退款订单号(商户系统生成)") + private String merchantRefundNo; + + @ApiModelProperty(value = "异步通知商户地址") + private String notifyUrl; + + @ApiModelProperty(value = "通知商户退款结果的回调状态") + private Integer notifyStatus; + + @ApiModelProperty(value = "退款状态") + private Integer status; + + @ApiModelProperty(value = "退款类型(部分退款,全部退款)") + private Integer type; + + @ApiModelProperty(value = "支付金额,单位分") + private Long payAmount; + + @ApiModelProperty(value = "退款金额,单位分") + private Long refundAmount; + + @ApiModelProperty(value = "退款原因") + private String reason; + + @ApiModelProperty(value = "用户 IP") + private String userIp; + + @ApiModelProperty(value = "渠道订单号,pay_order 中的channel_order_no 对应") + private String channelOrderNo; + + @ApiModelProperty(value = "渠道退款单号,渠道返回") + private String channelRefundNo; + + @ApiModelProperty(value = "渠道调用报错时,错误码") + private String channelErrorCode; + + @ApiModelProperty(value = "渠道调用报错时,错误信息") + private String channelErrorMsg; + + @ApiModelProperty(value = "支付渠道的额外参数") + private String channelExtras; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "退款失效时间") + private Date[] expireTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "退款成功时间") + private Date[] successTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "退款通知时间") + private Date[] notifyTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.java new file mode 100644 index 0000000..ebf79fc --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.pay.controller.admin.refund.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 退款订单分页查询 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayRefundPageItemRespVO extends PayRefundBaseVO { + + @ApiModelProperty(value = "支付订单编号", required = true) + private Long id; + + @ApiModelProperty(value = "商户名称") + private String merchantName; + + @ApiModelProperty(value = "应用名称") + private String appName; + + @ApiModelProperty(value = "渠道名称") + private String channelCodeName; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.java new file mode 100644 index 0000000..d13cb29 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.pay.controller.admin.refund.vo; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 退款订单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayRefundPageReqVO extends PageParam { + + @ApiModelProperty(value = "商户编号") + private Long merchantId; + + @ApiModelProperty(value = "应用编号") + private Long appId; + + @ApiModelProperty(value = "渠道编号") + private Long channelId; + + @ApiModelProperty(value = "渠道编码") + private String channelCode; + + @ApiModelProperty(value = "支付订单编号 pay_order 表id") + private Long orderId; + + @ApiModelProperty(value = "交易订单号 pay_extension 表no 字段") + private String tradeNo; + + @ApiModelProperty(value = "商户订单编号(商户系统生成)") + private String merchantOrderId; + + @ApiModelProperty(value = "商户退款订单号(商户系统生成)") + private String merchantRefundNo; + + @ApiModelProperty(value = "异步通知商户地址") + private String notifyUrl; + + @ApiModelProperty(value = "通知商户退款结果的回调状态") + private Integer notifyStatus; + + @ApiModelProperty(value = "退款状态") + private Integer status; + + @ApiModelProperty(value = "退款类型(部分退款,全部退款)") + private Integer type; + + @ApiModelProperty(value = "支付金额,单位分") + private Long payAmount; + + @ApiModelProperty(value = "退款金额,单位分") + private Long refundAmount; + + @ApiModelProperty(value = "退款原因") + private String reason; + + @ApiModelProperty(value = "用户 IP") + private String userIp; + + @ApiModelProperty(value = "渠道订单号,pay_order 中的channel_order_no 对应") + private String channelOrderNo; + + @ApiModelProperty(value = "渠道退款单号,渠道返回") + private String channelRefundNo; + + @ApiModelProperty(value = "渠道调用报错时,错误码") + private String channelErrorCode; + + @ApiModelProperty(value = "渠道调用报错时,错误信息") + private String channelErrorMsg; + + @ApiModelProperty(value = "支付渠道的额外参数") + private String channelExtras; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "退款失效时间") + private Date[] expireTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "退款成功时间") + private Date[] successTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "退款通知时间") + private Date[] notifyTime; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundRespVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundRespVO.java new file mode 100644 index 0000000..2863015 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundRespVO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.pay.controller.admin.refund.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 退款订单 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayRefundRespVO extends PayRefundBaseVO { + + @ApiModelProperty(value = "支付退款编号", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundUpdateReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundUpdateReqVO.java new file mode 100644 index 0000000..7ac5723 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundUpdateReqVO.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.pay.controller.admin.refund.vo; + +import lombok.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 退款订单更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class PayRefundUpdateReqVO extends PayRefundBaseVO { + + @ApiModelProperty(value = "支付退款编号", required = true) + @NotNull(message = "支付退款编号不能为空") + private Long id; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/order/AppPayOrderController.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/order/AppPayOrderController.java new file mode 100644 index 0000000..608b2e2 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/order/AppPayOrderController.java @@ -0,0 +1,122 @@ +package com.jojubanking.boot.module.pay.controller.app.order; + +import cn.hutool.core.bean.BeanUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.pay.core.client.PayClient; +import com.jojubanking.boot.framework.pay.core.client.PayClientFactory; +import com.jojubanking.boot.framework.pay.core.client.dto.PayNotifyDataDTO; +import com.jojubanking.boot.module.pay.controller.app.order.vo.AppPayOrderSubmitReqVO; +import com.jojubanking.boot.module.pay.controller.app.order.vo.AppPayOrderSubmitRespVO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.service.order.PayOrderService; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderSubmitReqDTO; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderSubmitRespDTO; +import com.jojubanking.boot.module.pay.service.refund.PayRefundService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.common.util.servlet.ServletUtils.getClientIP; +import static com.jojubanking.boot.module.pay.enums.ErrorCodeConstants.*; + +@Api(tags = "用户 APP - 支付订单") +@RestController +@RequestMapping("/pay/order") +@Validated +@Slf4j +public class AppPayOrderController { + + @Resource + private PayOrderService orderService; + @Resource + private PayRefundService refundService; + + @Resource + private PayClientFactory payClientFactory; + + @PostMapping("/submit") + @ApiOperation("提交支付订单") +// @PreAuthenticated // TODO 暂时不加登陆验证,前端暂时没做好 + public CommonResult submitPayOrder(@RequestBody AppPayOrderSubmitReqVO reqVO) { + // 获得订单 + PayOrderDO payOrder = orderService.getOrder(reqVO.getId()); + + // 提交支付 + PayOrderSubmitReqDTO reqDTO = new PayOrderSubmitReqDTO(); + BeanUtil.copyProperties(reqVO, reqDTO, false); + reqDTO.setUserIp(getClientIP()); + reqDTO.setAppId(payOrder.getAppId()); + PayOrderSubmitRespDTO respDTO = orderService.submitPayOrder(reqDTO); + + // 拼接返回 + return success(AppPayOrderSubmitRespVO.builder().invokeResponse(respDTO.getInvokeResponse()).build()); + } + + // ========== 支付渠道的回调 ========== + // TODO @芋艿:是不是放到 notify 模块更合适 + //TODO TW 换成了统一的地址了 /notify/{channelId},测试通过可以删除 + @PostMapping("/notify/wx-pub/{channelId}") + @ApiOperation("通知微信公众号支付的结果") + public String notifyWxPayOrder(@PathVariable("channelId") Long channelId, + @RequestBody String xmlData) throws Exception { + orderService.notifyPayOrder(channelId, PayNotifyDataDTO.builder().body(xmlData).build()); + return "success"; + } + + /** + * 统一的跳转页面, 支付宝跳转参数说明 + * https://opendocs.alipay.com/open/203/105285#%E5%89%8D%E5%8F%B0%E5%9B%9E%E8%B7%B3%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E + * @param channelId 渠道id + * @return 返回跳转页面 + */ + @GetMapping(value = "/return/{channelId}") + @ApiOperation("渠道统一的支付成功返回地址") + public String returnAliPayOrder(@PathVariable("channelId") Long channelId, @RequestParam Map params){ + //TODO 可以根据渠道和 app_id 返回不同的页面 + log.info("app_id is {}", params.get("app_id")); + return String.format("渠道[%s]支付成功", channelId); + } + + /** + * 统一的渠道支付回调,支付宝的退款回调 + * + * @param channelId 渠道编号 + * @param params form 参数 + * @param originData http request body + * @return 成功返回 "success" + */ + @PostMapping(value = "/notify/{channelId}") + @ApiOperation("渠道统一的支付成功,或退款成功 通知url") + public String notifyChannelPay(@PathVariable("channelId") Long channelId, + @RequestParam Map params, + @RequestBody String originData) throws Exception { + // 校验支付渠道是否存在 + PayClient payClient = payClientFactory.getPayClient(channelId); + if (payClient == null) { + log.error("[notifyPayOrder][渠道编号({}) 找不到对应的支付客户端]", channelId); + throw exception(PAY_CHANNEL_CLIENT_NOT_FOUND); + } + + // 校验通知数据是否合法 + PayNotifyDataDTO notifyData = PayNotifyDataDTO.builder().params(params).body(originData).build(); + payClient.verifyNotifyData(notifyData); + + // 如果是退款,则发起退款通知 + if (payClient.isRefundNotify(notifyData)) { + refundService.notifyPayRefund(channelId, PayNotifyDataDTO.builder().params(params).body(originData).build()); + return "success"; + } + + // 如果非退款,则发起支付通知 + orderService.notifyPayOrder(channelId, PayNotifyDataDTO.builder().params(params).body(originData).build()); + return "success"; + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java new file mode 100644 index 0000000..57593c3 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.pay.controller.app.order.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Map; + +@ApiModel("用户 APP - 支付订单提交 Request VO") +@Data +@Accessors(chain = true) +public class AppPayOrderSubmitReqVO { + + @ApiModelProperty(value = "支付单编号", required = true, example = "1024") + @NotNull(message = "支付单编号不能为空") + private Long id; + + @ApiModelProperty(value = "支付渠道", required = true, example = "wx_pub") + @NotEmpty(message = "支付渠道不能为空") + private String channelCode; + + @ApiModelProperty(value = "支付渠道的额外参数", notes = "例如说,微信公众号需要传递 openid 参数") + private Map channelExtras; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java new file mode 100644 index 0000000..2cdb450 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.pay.controller.app.order.vo; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@ApiModel("用户 APP - 支付订单提交 Response VO") +@Data +@Accessors(chain = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AppPayOrderSubmitRespVO { + + /** + * 调用支付渠道的响应结果 + */ + private Object invokeResponse; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/package-info.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/package-info.java new file mode 100644 index 0000000..993902b --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/package-info.java @@ -0,0 +1 @@ +package com.jojubanking.boot.module.pay.controller.app; diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/refund/AppPayRefundController.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/refund/AppPayRefundController.java new file mode 100644 index 0000000..3d079b7 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/refund/AppPayRefundController.java @@ -0,0 +1,47 @@ +package com.jojubanking.boot.module.pay.controller.app.refund; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.module.pay.controller.app.refund.vo.AppPayRefundReqVO; +import com.jojubanking.boot.module.pay.controller.app.refund.vo.AppPayRefundRespVO; +import com.jojubanking.boot.module.pay.convert.refund.PayRefundConvert; +import com.jojubanking.boot.module.pay.service.order.dto.PayRefundReqDTO; +import com.jojubanking.boot.module.pay.service.refund.PayRefundService; +import com.jojubanking.boot.module.pay.util.PaySeqUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.common.util.servlet.ServletUtils.getClientIP; + +@Api(tags = "用户 APP - 退款订单") +@RestController +@RequestMapping("/pay/refund") +@Validated +@Slf4j +public class AppPayRefundController { + + @Resource + private PayRefundService refundService; + + @PostMapping("/refund") + @ApiOperation("提交退款订单") + public CommonResult submitRefundOrder(@RequestBody AppPayRefundReqVO reqVO){ + PayRefundReqDTO req = PayRefundConvert.INSTANCE.convert(reqVO); + req.setUserIp(getClientIP()); + // TODO 测试暂时模拟生成商户退款订单 + if(StrUtil.isEmpty(reqVO.getMerchantRefundId())) { + req.setMerchantRefundId(PaySeqUtils.genMerchantRefundNo()); + } + return success(PayRefundConvert.INSTANCE.convert(refundService.submitRefundOrder(req))); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundReqVO.java new file mode 100644 index 0000000..981806f --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundReqVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.pay.controller.app.refund.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@ApiModel("用户 APP - 退款订单 Req VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AppPayRefundReqVO { + + @ApiModelProperty(value = "支付订单编号自增", required = true, example = "10") + @NotNull(message = "支付订单编号自增") + private Long payOrderId; + + @ApiModelProperty(value = "退款金额", required = true, example = "1") + @NotNull(message = "退款金额") + private Long amount; + + @ApiModelProperty(value = "退款原因", required = true, example = "不喜欢") + @NotEmpty(message = "退款原因") + private String reason; + + @ApiModelProperty(value = "商户退款订单号", required = true, example = "MR202111180000000001") + //TODO 测试暂时模拟生成 + //@NotEmpty(message = "商户退款订单号") + private String merchantRefundId; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundRespVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundRespVO.java new file mode 100644 index 0000000..452e4b5 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundRespVO.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.pay.controller.app.refund.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@ApiModel("用户 APP - 提交退款订单 Response VO") +@Data +@Accessors(chain = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AppPayRefundRespVO { + + @ApiModelProperty(value = "退款订单编号", required = true, example = "10") + private Long refundId; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/package-info.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/package-info.java new file mode 100644 index 0000000..19c7444 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/controller/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 RESTful API 给前端: + * 1. admin 包:提供给管理后台 joju-ui-admin 前端项目 + * 2. app 包:提供给用户 APP joju-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 + */ +package com.jojubanking.boot.module.pay.controller; diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/app/PayAppConvert.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/app/PayAppConvert.java new file mode 100644 index 0000000..e9d5c6c --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/app/PayAppConvert.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.pay.convert.app; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.*; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 支付应用信息 Convert + * + * @author 芋艿 + */ +@Mapper +public interface PayAppConvert { + + PayAppConvert INSTANCE = Mappers.getMapper(PayAppConvert.class); + + PayAppPageItemRespVO pageConvert (PayAppDO bean); + + PayAppPageItemRespVO.PayMerchant convert(PayMerchantDO bean); + + PayAppDO convert(PayAppCreateReqVO bean); + + PayAppDO convert(PayAppUpdateReqVO bean); + + PayAppRespVO convert(PayAppDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/channel/PayChannelConvert.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/channel/PayChannelConvert.java new file mode 100644 index 0000000..5c4581e --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/channel/PayChannelConvert.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.pay.convert.channel; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelExcelVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelRespVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelUpdateReqVO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface PayChannelConvert { + + PayChannelConvert INSTANCE = Mappers.getMapper(PayChannelConvert.class); + + @Mapping(target = "config",ignore = true) + PayChannelDO convert(PayChannelCreateReqVO bean); + + @Mapping(target = "config",ignore = true) + PayChannelDO convert(PayChannelUpdateReqVO bean); + + @Mapping(target = "config",expression = "java(com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString(bean.getConfig()))") + PayChannelRespVO convert(PayChannelDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/merchant/PayMerchantConvert.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/merchant/PayMerchantConvert.java new file mode 100644 index 0000000..6e8adb2 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/merchant/PayMerchantConvert.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.pay.convert.merchant; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExcelVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantRespVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantUpdateReqVO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface PayMerchantConvert { + + PayMerchantConvert INSTANCE = Mappers.getMapper(PayMerchantConvert.class); + + PayMerchantDO convert(PayMerchantCreateReqVO bean); + + PayMerchantDO convert(PayMerchantUpdateReqVO bean); + + PayMerchantRespVO convert(PayMerchantDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/order/PayOrderConvert.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/order/PayOrderConvert.java new file mode 100644 index 0000000..ac0b2ec --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/order/PayOrderConvert.java @@ -0,0 +1,95 @@ +package com.jojubanking.boot.module.pay.convert.order; + +import com.jojubanking.boot.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderDetailsRespVO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderExcelVO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderPageItemRespVO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderRespVO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderExtensionDO; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderCreateReqDTO; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderSubmitReqDTO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; + +/** + * 支付订单 Convert + * + * @author aquan + */ +@Mapper +public interface PayOrderConvert { + + PayOrderConvert INSTANCE = Mappers.getMapper(PayOrderConvert.class); + + PayOrderRespVO convert(PayOrderDO bean); + + PayOrderDetailsRespVO orderDetailConvert(PayOrderDO bean); + + PayOrderDetailsRespVO.PayOrderExtension orderDetailExtensionConvert(PayOrderExtensionDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + /** + * 订单DO转自定义分页对象 + * + * @param bean 订单DO + * @return 分页对象 + */ + PayOrderPageItemRespVO pageConvertItemPage(PayOrderDO bean); + + default PayOrderExcelVO excelConvert(PayOrderDO bean) { + if (bean == null) { + return null; + } + + PayOrderExcelVO payOrderExcelVO = new PayOrderExcelVO(); + + payOrderExcelVO.setId(bean.getId()); + payOrderExcelVO.setSubject(bean.getSubject()); + payOrderExcelVO.setMerchantOrderId(bean.getMerchantOrderId()); + payOrderExcelVO.setChannelOrderNo(bean.getChannelOrderNo()); + payOrderExcelVO.setStatus(bean.getStatus()); + payOrderExcelVO.setNotifyStatus(bean.getNotifyStatus()); + payOrderExcelVO.setNotifyUrl(bean.getNotifyUrl()); + payOrderExcelVO.setCreateTime(bean.getCreateTime()); + payOrderExcelVO.setSuccessTime(bean.getSuccessTime()); + payOrderExcelVO.setExpireTime(bean.getExpireTime()); + payOrderExcelVO.setNotifyTime(bean.getNotifyTime()); + payOrderExcelVO.setUserIp(bean.getUserIp()); + payOrderExcelVO.setRefundStatus(bean.getRefundStatus()); + payOrderExcelVO.setRefundTimes(bean.getRefundTimes()); + payOrderExcelVO.setBody(bean.getBody()); + + BigDecimal multiple = new BigDecimal(100); + + payOrderExcelVO.setAmount(BigDecimal.valueOf(bean.getAmount()) + .divide(multiple, 2, RoundingMode.HALF_UP).toString()); + + payOrderExcelVO.setChannelFeeAmount(BigDecimal.valueOf(bean.getChannelFeeAmount()) + .divide(multiple, 2, RoundingMode.HALF_UP).toString()); + payOrderExcelVO.setChannelFeeRate(java.math.BigDecimal.valueOf(bean.getChannelFeeRate()) + .multiply(multiple).toString()); + payOrderExcelVO.setRefundAmount(BigDecimal.valueOf(bean.getRefundAmount()) + .divide(multiple, 2, RoundingMode.HALF_UP).toString()); + + return payOrderExcelVO; + } + + + PayOrderDO convert(PayOrderCreateReqDTO bean); + + PayOrderExtensionDO convert(PayOrderSubmitReqDTO bean); + + PayOrderUnifiedReqDTO convert2(PayOrderSubmitReqDTO bean); + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/package-info.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/package-info.java new file mode 100644 index 0000000..2b6d27c --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 POJO 类的实体转换 + * + * 目前使用 MapStruct 框架 + */ +package com.jojubanking.boot.module.pay.convert; diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/refund/PayRefundConvert.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/refund/PayRefundConvert.java new file mode 100644 index 0000000..b31b452 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/refund/PayRefundConvert.java @@ -0,0 +1,109 @@ +package com.jojubanking.boot.module.pay.convert.refund; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.*; +import com.jojubanking.boot.module.pay.controller.app.refund.vo.AppPayRefundReqVO; +import com.jojubanking.boot.module.pay.controller.app.refund.vo.AppPayRefundRespVO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.dal.dataobject.refund.PayRefundDO; +import com.jojubanking.boot.module.pay.service.order.dto.PayRefundReqDTO; +import com.jojubanking.boot.module.pay.service.order.dto.PayRefundRespDTO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; + +/** + * 退款订单 Convert + * + * @author aquan + */ +@Mapper +public interface PayRefundConvert { + + PayRefundConvert INSTANCE = Mappers.getMapper(PayRefundConvert.class); + + PayRefundDO convert(PayRefundCreateReqVO bean); + + PayRefundDO convert(PayRefundUpdateReqVO bean); + + PayRefundRespVO convert(PayRefundDO bean); + + /** + * 退款订单 DO 转 退款详情订单 VO + * + * @param bean 退款订单 DO + * @return 退款详情订单 VO + */ + PayRefundDetailsRespVO refundDetailConvert(PayRefundDO bean); + + /** + * 退款订单DO 转 分页退款条目VO + * + * @param bean 退款订单DO + * @return 分页退款条目VO + */ + PayRefundPageItemRespVO pageItemConvert(PayRefundDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + /** + * 退款订单DO 转 导出excel VO + * + * @param bean 退款订单DO + * @return 导出 excel VO + */ + default PayRefundExcelVO excelConvert(PayRefundDO bean) { + if (bean == null) { + return null; + } + + PayRefundExcelVO payRefundExcelVO = new PayRefundExcelVO(); + + payRefundExcelVO.setId(bean.getId()); + payRefundExcelVO.setTradeNo(bean.getTradeNo()); + payRefundExcelVO.setMerchantOrderId(bean.getMerchantOrderId()); + payRefundExcelVO.setMerchantRefundNo(bean.getMerchantRefundNo()); + payRefundExcelVO.setNotifyUrl(bean.getNotifyUrl()); + payRefundExcelVO.setNotifyStatus(bean.getNotifyStatus()); + payRefundExcelVO.setStatus(bean.getStatus()); + payRefundExcelVO.setType(bean.getType()); + payRefundExcelVO.setReason(bean.getReason()); + payRefundExcelVO.setUserIp(bean.getUserIp()); + payRefundExcelVO.setChannelOrderNo(bean.getChannelOrderNo()); + payRefundExcelVO.setChannelRefundNo(bean.getChannelRefundNo()); + payRefundExcelVO.setExpireTime(bean.getExpireTime()); + payRefundExcelVO.setSuccessTime(bean.getSuccessTime()); + payRefundExcelVO.setNotifyTime(bean.getNotifyTime()); + payRefundExcelVO.setCreateTime(bean.getCreateTime()); + + BigDecimal multiple = new BigDecimal(100); + payRefundExcelVO.setPayAmount(BigDecimal.valueOf(bean.getPayAmount()) + .divide(multiple, 2, RoundingMode.HALF_UP).toString()); + payRefundExcelVO.setRefundAmount(BigDecimal.valueOf(bean.getRefundAmount()) + .divide(multiple, 2, RoundingMode.HALF_UP).toString()); + + return payRefundExcelVO; + } + + //TODO 太多需要处理了, 暂时不用 + @Mappings(value = { + @Mapping(source = "amount", target = "payAmount"), + @Mapping(source = "id", target = "orderId"), + @Mapping(target = "status",ignore = true) + }) + PayRefundDO convert(PayOrderDO orderDO); + + PayRefundReqDTO convert(AppPayRefundReqVO bean); + + AppPayRefundRespVO convert(PayRefundRespDTO bean); + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md new file mode 100644 index 0000000..e034650 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayAppDO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayAppDO.java new file mode 100644 index 0000000..ee6cbc8 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayAppDO.java @@ -0,0 +1,64 @@ +package com.jojubanking.boot.module.pay.dal.dataobject.merchant; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 支付应用 DO + * 一个商户下,可能会有多个支付应用。例如说,京东有京东商城、京东到家等等 + * 不过一般来说,一个商户,只有一个应用哈~ + * + * 即 PayMerchantDO : PayAppDO = 1 : n + * + * @author TW + */ +@TableName("pay_app") +@KeySequence("pay_app_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PayAppDO extends BaseDO { + + /** + * 应用编号,数据库自增 + */ + @TableId + private Long id; + /** + * 应用名 + */ + private String name; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 支付结果的回调地址 + */ + private String payNotifyUrl; + /** + * 退款结果的回调地址 + */ + private String refundNotifyUrl; + + /** + * 商户编号 + * + * 关联 {@link PayMerchantDO#getId()} + */ + private Long merchantId; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayChannelDO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayChannelDO.java new file mode 100644 index 0000000..59575ab --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayChannelDO.java @@ -0,0 +1,74 @@ +package com.jojubanking.boot.module.pay.dal.dataobject.merchant; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.pay.core.client.PayClientConfig; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +/** + * 支付渠道 DO + * 一个应用下,会有多种支付渠道,例如说微信支付、支付宝支付等等 + * + * 即 PayAppDO : PayChannelDO = 1 : n + * + * @author TW + */ +@TableName(value = "pay_channel", autoResultMap = true) +@KeySequence("pay_channel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PayChannelDO extends BaseDO { + + /** + * 渠道编号,数据库自增 + */ + private Long id; + /** + * 渠道编码 + * + * 枚举 {@link PayChannelEnum} + */ + private String code; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 渠道费率,单位:百分比 + */ + private Double feeRate; + /** + * 备注 + */ + private String remark; + + /** + * 商户编号 + * + * 关联 {@link PayMerchantDO#getId()} + */ + private Long merchantId; + /** + * 应用编号 + * + * 关联 {@link PayAppDO#getId()} + */ + private Long appId; + /** + * 支付渠道配置 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private PayClientConfig config; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayMerchantDO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayMerchantDO.java new file mode 100644 index 0000000..58b8085 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayMerchantDO.java @@ -0,0 +1,54 @@ +package com.jojubanking.boot.module.pay.dal.dataobject.merchant; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.*; +import lombok.*; + +/** + * 支付商户信息 DO + * 目前暂时没有特别的用途,主要为未来多商户提供基础。 + * + * @author TW + */ +@TableName("pay_merchant") +@KeySequence("pay_merchant_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PayMerchantDO extends BaseDO { + + /** + * 商户编号,数据库自增 + */ + @TableId + private Long id; + /** + * 商户号 + * 例如说,M233666999 + * 只有新增时插入,不允许修改 + */ + private String no; + /** + * 商户全称 + */ + private String name; + /** + * 商户简称 + */ + private String shortName; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyLogDO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyLogDO.java new file mode 100644 index 0000000..75f6e5e --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyLogDO.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.module.pay.dal.dataobject.notify; + +import com.jojubanking.boot.module.pay.enums.notify.PayNotifyStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 商户支付、退款等的通知 Log + * 每次通知时,都会在该表中,记录一次 Log,方便排查问题 + * + * @author TW + */ +@TableName("pay_notify_log") +@KeySequence("pay_notify_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PayNotifyLogDO extends BaseDO { + + /** + * 日志编号,自增 + */ + private Long id; + /** + * 通知任务编号 + * + * 关联 {@link PayNotifyTaskDO#getId()} + */ + private Long taskId; + /** + * 第几次被通知 + * + * 对应到 {@link PayNotifyTaskDO#getNotifyTimes()} + */ + private Integer notifyTimes; + /** + * HTTP 响应结果 + */ + private String response; + /** + * 支付通知状态 + * + * 外键 {@link PayNotifyStatusEnum} + */ + private Integer status; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java new file mode 100644 index 0000000..0d85e1c --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyTaskDO.java @@ -0,0 +1,101 @@ +package com.jojubanking.boot.module.pay.dal.dataobject.notify; + +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.dal.dataobject.refund.PayRefundDO; +import com.jojubanking.boot.module.pay.enums.notify.PayNotifyStatusEnum; +import com.jojubanking.boot.module.pay.enums.notify.PayNotifyTypeEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 商户支付、退款等的通知 + * 在支付系统收到支付渠道的支付、退款的结果后,需要不断的通知到业务系统,直到成功。 + * + * @author TW + */ +@TableName("pay_notify_task") +@KeySequence("pay_notify_task_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class PayNotifyTaskDO extends BaseDO { + + /** + * 通知频率,单位为秒。 + * + * 算上首次的通知,实际是一共 1 + 8 = 9 次。 + */ + public static final Integer[] NOTIFY_FREQUENCY = new Integer[]{ + 15, 15, 30, 180, + 1800, 1800, 1800, 3600 + }; + + /** + * 编号,自增 + */ + private Long id; + /** + * 商户编号 + * + * 关联 {@link PayMerchantDO#getId()} + */ + private Long merchantId; + /** + * 应用编号 + * + * 关联 {@link PayAppDO#getId()} + */ + private Long appId; + /** + * 通知类型 + * + * 外键 {@link PayNotifyTypeEnum} + */ + private Integer type; + /** + * 数据编号,根据不同 type 进行关联: + * + * 1. {@link PayNotifyTypeEnum#ORDER} 时,关联 {@link PayOrderDO#getId()} + * 2. {@link PayNotifyTypeEnum#REFUND} 时,关联 {@link PayRefundDO#getId()} + */ + private Long dataId; + /** + * 商户订单编号 + */ + private String merchantOrderId; + /** + * 通知状态 + * + * 外键 {@link PayNotifyStatusEnum} + */ + private Integer status; + /** + * 下一次通知时间 + */ + private Date nextNotifyTime; + /** + * 最后一次执行时间 + */ + private Date lastExecuteTime; + /** + * 当前通知次数 + */ + private Integer notifyTimes; + /** + * 最大可通知次数 + */ + private Integer maxNotifyTimes; + /** + * 通知地址 + */ + private String notifyUrl; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderDO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderDO.java new file mode 100644 index 0000000..47571a1 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderDO.java @@ -0,0 +1,166 @@ +package com.jojubanking.boot.module.pay.dal.dataobject.order; + +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import com.jojubanking.boot.module.pay.enums.order.PayOrderNotifyStatusEnum; +import com.jojubanking.boot.module.pay.enums.refund.PayRefundTypeEnum; +import com.jojubanking.boot.module.pay.enums.order.PayOrderStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 支付订单 DO + * + * @author TW + */ +@TableName("pay_order") +@KeySequence("pay_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class PayOrderDO extends BaseDO { + + /** + * 订单编号,数据库自增 + */ + private Long id; + /** + * 商户编号 + * + * 关联 {@link PayMerchantDO#getId()} + */ + private Long merchantId; + /** + * 应用编号 + * + * 关联 {@link PayAppDO#getId()} + */ + private Long appId; + /** + * 渠道编号 + * + * 关联 {@link PayChannelDO#getId()} + */ + private Long channelId; + /** + * 渠道编码 + * + * 枚举 {@link PayChannelEnum} + */ + private String channelCode; + + // ========== 商户相关字段 ========== + + /** + * 商户订单编号 + * 例如说,内部系统 A 的订单号。需要保证每个 PayMerchantDO 唯一 + */ + private String merchantOrderId; + /** + * 商品标题 + */ + private String subject; + /** + * 商品描述信息 + */ + private String body; + /** + * 异步通知地址 + */ + private String notifyUrl; + /** + * 通知商户支付结果的回调状态 + * + * 枚举 {@link PayOrderNotifyStatusEnum} + */ + private Integer notifyStatus; +// /** +// * 商户拓展参数 +// */ +// private Map merchantExtras; + + // ========== 订单相关字段 ========== + + /** + * 支付金额,单位:分 + */ + private Long amount; + /** + * 渠道手续费,单位:百分比 + * + * 冗余 {@link PayChannelDO#getFeeRate()} + */ + private Double channelFeeRate; + /** + * 渠道手续金额,单位:分 + */ + private Long channelFeeAmount; + /** + * 支付状态 + * + * 枚举 {@link PayOrderStatusEnum} + */ + private Integer status; + /** + * 用户 IP + */ + private String userIp; + /** + * 订单失效时间 + */ + private Date expireTime; + /** + * 订单支付成功时间 + */ + private Date successTime; + /** + * 订单支付通知时间,即支付渠道的通知时间 + */ + private Date notifyTime; + /** + * 支付成功的订单拓展单编号 + * + * 关联 {@link PayOrderDO#getId()} + */ + private Long successExtensionId; + + // ========== 退款相关字段 ========== + /** + * 退款状态 + * + * 枚举 {@link PayRefundTypeEnum} + */ + private Integer refundStatus; + /** + * 退款次数 + */ + private Integer refundTimes; + /** + * 退款总金额,单位:分 + */ + private Long refundAmount; + + // ========== 渠道相关字段 ========== + /** + * 渠道用户编号 + * + * 例如说,微信 openid、支付宝账号 + */ + private String channelUserId; + /** + * 渠道订单号 + */ + private String channelOrderNo; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderExtensionDO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderExtensionDO.java new file mode 100644 index 0000000..69c01f4 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderExtensionDO.java @@ -0,0 +1,86 @@ +package com.jojubanking.boot.module.pay.dal.dataobject.order; + +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import com.jojubanking.boot.module.pay.enums.order.PayOrderStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; +import lombok.experimental.Accessors; + +import java.util.Map; + +/** + * 支付订单拓展 DO + * + * + * @author TW + */ +@TableName(value = "pay_order_extension",autoResultMap = true) +@KeySequence("pay_order_extension_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class PayOrderExtensionDO extends BaseDO { + + /** + * 订单拓展编号,数据库自增 + */ + private Long id; + /** + * 支付订单号,根据规则生成 + * 调用支付渠道时,使用该字段作为对接的订单号。 + * 1. 调用微信支付 https://api.mch.weixin.qq.com/pay/unifiedorder 时,使用该字段作为 out_trade_no + * 2. 调用支付宝 https://opendocs.alipay.com/apis 时,使用该字段作为 out_trade_no + * + * 例如说,P202110132239124200055 + */ + private String no; + /** + * 订单号 + * + * 关联 {@link PayOrderDO#getId()} + */ + private Long orderId; + /** + * 渠道编号 + * + * 关联 {@link PayChannelDO#getId()} + */ + private Long channelId; + /** + * 渠道编码 + */ + private String channelCode; + /** + * 用户 IP + */ + private String userIp; + /** + * 支付状态 + * + * 枚举 {@link PayOrderStatusEnum} + * 注意,只包含上述枚举的 WAITING 和 SUCCESS + */ + private Integer status; + /** + * 支付渠道的额外参数 + * + * 参见 https://www.pingxx.com/api/支付渠道%20extra%20参数说明.html + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map channelExtras; + /** + * 支付渠道异步通知的内容 + * + * 在支持成功后,会记录回调的数据 + */ + private String channelNotifyData; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/refund/PayRefundDO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/refund/PayRefundDO.java new file mode 100644 index 0000000..60b678d --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/dataobject/refund/PayRefundDO.java @@ -0,0 +1,201 @@ +package com.jojubanking.boot.module.pay.dal.dataobject.refund; + +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.enums.refund.PayRefundStatusEnum; +import com.jojubanking.boot.module.pay.enums.refund.PayRefundTypeEnum; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 支付退款单 DO + * 一个支付订单,可以拥有多个支付退款单 + * + * 即 PayOrderDO : PayRefundDO = 1 : n + * + * @author TW + */ +@TableName("pay_refund") +@KeySequence("pay_refund_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class PayRefundDO extends BaseDO { + + /** + * 退款单编号,数据库自增 + */ + @TableId + private Long id; + + /** + * 商户编号 + * + * 关联 {@link PayMerchantDO#getId()} + */ + private Long merchantId; + /** + * 应用编号 + * + * 关联 {@link PayAppDO#getId()} + */ + private Long appId; + /** + * 渠道编号 + * + * 关联 {@link PayChannelDO#getId()} + */ + private Long channelId; + /** + * 商户编码 + * + * 枚举 {@link PayChannelEnum} + */ + private String channelCode; + /** + * 订单编号 + * + * 关联 {@link PayOrderDO#getId()} + */ + private Long orderId; + + /** + * 交易订单号,根据规则生成 + * 调用支付渠道时,使用该字段作为对接的订单号。 + * 1. 调用微信支付 https://api.mch.weixin.qq.com/v3/refund/domestic/refunds 时,使用该字段作为 out_trade_no + * 2. 调用支付宝 https://opendocs.alipay.com/apis 时,使用该字段作为 out_trade_no + * 这里对应 pay_extension 里面的 no + * 例如说,P202110132239124200055 + */ + private String tradeNo; + + + // ========== 商户相关字段 ========== + /** + * 商户订单编号 + */ + private String merchantOrderId; + + /** + * 商户退款订单号, 由商户系统产生, 由他们保证唯一,不能为空,通知商户时会传该字段。 + * 例如说,内部系统 A 的退款订单号。需要保证每个 PayMerchantDO 唯一 + * 个商户退款订单,对应一条退款请求记录。可多次提交。 渠道保持幂等 + * 使用商户退款单,作为退款请求号 + * https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_9.shtml 中的 out_refund_no + * https://opendocs.alipay.com/apis alipay.trade.refund 中的 out_request_no + * 退款请求号。 + * 标识一次退款请求,需要保证在交易号下唯一,如需部分退款,则此参数必传。 + * 注:针对同一次退款请求,如果调用接口失败或异常了,重试时需要保证退款请求号不能变更, + * 防止该笔交易重复退款。支付宝会保证同样的退款请求号多次请求只会退一次。 + * 退款单请求号,根据规则生成 + * 例如说,R202109181134287570000 + */ + // TODO @jason:merchantRefundNo =》merchantRefundOId + private String merchantRefundNo; + + /** + * 异步通知地址 + */ + private String notifyUrl; + + /** + * 通知商户退款结果的回调状态 + * TODO 0 未发送 1 已发送 + */ + private Integer notifyStatus; + + // ========== 退款相关字段 ========== + /** + * 退款状态 + * + * 枚举 {@link PayRefundStatusEnum} + */ + private Integer status; + + /** + * 退款类型(部分退款,全部退款) + * + * 枚举 {@link PayRefundTypeEnum} + */ + private Integer type; + /** + * 支付金额,单位:分 + */ + private Long payAmount; + /** + * 退款金额,单位:分 + */ + private Long refundAmount; + + /** + * 退款原因 + */ + private String reason; + + /** + * 用户 IP + */ + private String userIp; + + // ========== 渠道相关字段 ========== + /** + * 渠道订单号,pay_order 中的channel_order_no 对应 + */ + private String channelOrderNo; + /** + * 微信中的 refund_id + * https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_9.shtml + * 支付宝没有 + * 渠道退款单号,渠道返回 + */ + private String channelRefundNo; + + /** + * 调用渠道的错误码 + */ + private String channelErrorCode; + + /** + * 调用渠道报错时,错误信息 + */ + private String channelErrorMsg; + + + /** + * 支付渠道的额外参数 + * 参见 https://www.pingxx.com/api/Refunds%20退款概述.html + */ + private String channelExtras; + + + /** + * TODO + * 退款失效时间 + */ + private Date expireTime; + /** + * 退款成功时间 + */ + private Date successTime; + /** + * 退款通知时间 + */ + private Date notifyTime; + + + + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayAppMapper.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayAppMapper.java new file mode 100644 index 0000000..1f63016 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayAppMapper.java @@ -0,0 +1,53 @@ +package com.jojubanking.boot.module.pay.dal.mysql.merchant; + +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppPageReqVO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.QueryWrapperX; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface PayAppMapper extends BaseMapperX { + + default PageResult selectPage(PayAppPageReqVO reqVO, Collection merchantIds) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("remark", reqVO.getRemark()) + .eqIfPresent("pay_notify_url", reqVO.getPayNotifyUrl()) + .eqIfPresent("refund_notify_url", reqVO.getRefundNotifyUrl()) + .inIfPresent("merchant_id", merchantIds) + .betweenIfPresent("create_time", reqVO.getCreateTime()) + .orderByDesc("id")); + } + + default List selectList(PayAppExportReqVO reqVO, Collection merchantIds) { + return selectList(new QueryWrapperX() + .likeIfPresent("name", reqVO.getName()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("remark", reqVO.getRemark()) + .eqIfPresent("pay_notify_url", reqVO.getPayNotifyUrl()) + .eqIfPresent("refund_notify_url", reqVO.getRefundNotifyUrl()) + .inIfPresent("merchant_id", merchantIds) + .betweenIfPresent("create_time", reqVO.getCreateTime()) + .orderByDesc("id")); + } + + default List getListByMerchantId(Long merchantId) { + return selectList(new LambdaQueryWrapper() + .select(PayAppDO::getId, PayAppDO::getName) + .eq(PayAppDO::getMerchantId, merchantId)); + } + + // TODO @aquan:方法名补充 ByMerchantId + default Long selectCount(Long merchantId) { + return selectCount(new LambdaQueryWrapper().eq(PayAppDO::getMerchantId, merchantId)); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayChannelMapper.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayChannelMapper.java new file mode 100644 index 0000000..a2ad8c7 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayChannelMapper.java @@ -0,0 +1,94 @@ +package com.jojubanking.boot.module.pay.dal.mysql.merchant; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.QueryWrapperX; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelPageReqVO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +@Mapper +public interface PayChannelMapper extends BaseMapperX { + + default PayChannelDO selectByAppIdAndCode(Long appId, String code) { + return selectOne(PayChannelDO::getAppId, appId, PayChannelDO::getCode, code); + } + + @Select("SELECT COUNT(*) FROM pay_channel WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + + default PageResult selectPage(PayChannelPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .eqIfPresent("code", reqVO.getCode()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("remark", reqVO.getRemark()) + .eqIfPresent("fee_rate", reqVO.getFeeRate()) + .eqIfPresent("merchant_id", reqVO.getMerchantId()) + .eqIfPresent("app_id", reqVO.getAppId()) + .betweenIfPresent("create_time", reqVO.getCreateTime()) + .orderByDesc("id")); + } + + default List selectList(PayChannelExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .eqIfPresent("code", reqVO.getCode()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("remark", reqVO.getRemark()) + .eqIfPresent("fee_rate", reqVO.getFeeRate()) + .eqIfPresent("merchant_id", reqVO.getMerchantId()) + .eqIfPresent("app_id", reqVO.getAppId()) + .betweenIfPresent("create_time", reqVO.getCreateTime()) + .orderByDesc("id")); + } + + /** + * 根据条件获取渠道数量 + * + * @param merchantId 商户编号 + * @param appid 应用编号 + * @param code 渠道编码 + * @return 数量 + */ + default Integer selectCount(Long merchantId, Long appid, String code) { + return this.selectCount(new QueryWrapper().lambda() + .eq(PayChannelDO::getMerchantId, merchantId) + .eq(PayChannelDO::getAppId, appid) + .eq(PayChannelDO::getCode, code)).intValue(); + } + + /** + * 根据条件获取渠道 + * + * @param merchantId 商户编号 + * @param appid 应用编号 // TODO @aquan:appid =》appId + * @param code 渠道编码 + * @return 数量 + */ + default PayChannelDO selectOne(Long merchantId, Long appid, String code) { + return this.selectOne((new QueryWrapper().lambda() + .eq(PayChannelDO::getMerchantId, merchantId) + .eq(PayChannelDO::getAppId, appid) + .eq(PayChannelDO::getCode, code) + )); + } + + // TODO @aquan:select 命名 + /** + * 根据支付应用ID集合获得支付渠道列表 + * + * @param appIds 应用编号集合 + * @return 支付渠道列表 + */ + default List getChannelListByAppIds(Collection appIds){ + return this.selectList(new QueryWrapper().lambda() + .in(PayChannelDO::getAppId, appIds)); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayMerchantMapper.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayMerchantMapper.java new file mode 100644 index 0000000..077c265 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayMerchantMapper.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.module.pay.dal.mysql.merchant; + +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantPageReqVO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.QueryWrapperX; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface PayMerchantMapper extends BaseMapperX { + + default PageResult selectPage(PayMerchantPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("no", reqVO.getNo()) + .likeIfPresent("name", reqVO.getName()) + .likeIfPresent("short_name", reqVO.getShortName()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("remark", reqVO.getRemark()) + .betweenIfPresent("create_time", reqVO.getCreateTime()) + .orderByDesc("id")); + } + + default List selectList(PayMerchantExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .likeIfPresent("no", reqVO.getNo()) + .likeIfPresent("name", reqVO.getName()) + .likeIfPresent("short_name", reqVO.getShortName()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("remark", reqVO.getRemark()) + .betweenIfPresent("create_time", reqVO.getCreateTime()) + .orderByDesc("id")); + } + + /** + * 根据商户名称模糊查询商户集合 + * + * @param merchantName 商户名称 + * @return 商户集合 + */ + default List getMerchantListByName(String merchantName) { + return this.selectList(new QueryWrapperX() + .likeIfPresent("name", merchantName)); + } +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/notify/PayNotifyLogCoreMapper.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/notify/PayNotifyLogCoreMapper.java new file mode 100644 index 0000000..38b77c8 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/notify/PayNotifyLogCoreMapper.java @@ -0,0 +1,9 @@ +package com.jojubanking.boot.module.pay.dal.mysql.notify; + +import com.jojubanking.boot.module.pay.dal.dataobject.notify.PayNotifyLogDO; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PayNotifyLogCoreMapper extends BaseMapperX { +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.java new file mode 100644 index 0000000..8f47ff4 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.pay.dal.mysql.notify; + +import com.jojubanking.boot.module.pay.dal.dataobject.notify.PayNotifyTaskDO; +import com.jojubanking.boot.module.pay.enums.notify.PayNotifyStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface PayNotifyTaskCoreMapper extends BaseMapperX { + + /** + * 获得需要通知的 PayNotifyTaskDO 记录。需要满足如下条件: + * + * 1. status 非成功 + * 2. nextNotifyTime 小于当前时间 + * + * @return PayTransactionNotifyTaskDO 数组 + */ + default List selectListByNotify() { + return selectList(new QueryWrapper() + .in("status", PayNotifyStatusEnum.WAITING.getStatus(), PayNotifyStatusEnum.REQUEST_SUCCESS.getStatus(), + PayNotifyStatusEnum.REQUEST_FAILURE.getStatus()) + .le("next_notify_time", new Date())); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/order/PayOrderExtensionMapper.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/order/PayOrderExtensionMapper.java new file mode 100644 index 0000000..b0eb19d --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/order/PayOrderExtensionMapper.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.pay.dal.mysql.order; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderExtensionDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PayOrderExtensionMapper extends BaseMapperX { + + default PayOrderExtensionDO selectByNo(String no) { + return selectOne(PayOrderExtensionDO::getNo, no); + } + + default int updateByIdAndStatus(Long id, Integer status, PayOrderExtensionDO update) { + return update(update, new LambdaQueryWrapper() + .eq(PayOrderExtensionDO::getId, id).eq(PayOrderExtensionDO::getStatus, status)); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/order/PayOrderMapper.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/order/PayOrderMapper.java new file mode 100644 index 0000000..ea37507 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/order/PayOrderMapper.java @@ -0,0 +1,78 @@ +package com.jojubanking.boot.module.pay.dal.mysql.order; + +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderPageReqVO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.QueryWrapperX; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface PayOrderMapper extends BaseMapperX { + + default PageResult selectPage(PayOrderPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .eqIfPresent("merchant_id", reqVO.getMerchantId()) + .eqIfPresent("app_id", reqVO.getAppId()) + .eqIfPresent("channel_id", reqVO.getChannelId()) + .eqIfPresent("channel_code", reqVO.getChannelCode()) + .likeIfPresent("merchant_order_id", reqVO.getMerchantOrderId()) + .eqIfPresent("notify_status", reqVO.getNotifyStatus()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("refund_status", reqVO.getRefundStatus()) + .likeIfPresent("channel_order_no", reqVO.getChannelOrderNo()) + .betweenIfPresent("create_time", reqVO.getCreateTime()) + .orderByDesc("id")); + } + + default List selectList(PayOrderExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .eqIfPresent("merchant_id", reqVO.getMerchantId()) + .eqIfPresent("app_id", reqVO.getAppId()) + .eqIfPresent("channel_id", reqVO.getChannelId()) + .eqIfPresent("channel_code", reqVO.getChannelCode()) + .likeIfPresent("merchant_order_id", reqVO.getMerchantOrderId()) + .eqIfPresent("notify_status", reqVO.getNotifyStatus()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("refund_status", reqVO.getRefundStatus()) + .likeIfPresent("channel_order_no", reqVO.getChannelOrderNo()) + .betweenIfPresent("create_time", reqVO.getCreateTime()) + .orderByDesc("id")); + } + + default List findByIdListQueryOrderSubject(Collection idList) { + return selectList(new LambdaQueryWrapper() + .select(PayOrderDO::getId, PayOrderDO::getSubject) + .in(PayOrderDO::getId, idList)); + } + + /** + * 查询符合的订单数量 + * + * @param appId 应用编号 + * @param status 订单状态 + * @return 条数 + */ + default Long selectCount(Long appId, Integer status) { + return selectCount(new LambdaQueryWrapper() + .eq(PayOrderDO::getAppId, appId) + .in(PayOrderDO::getStatus, status)); + } + + default PayOrderDO selectByAppIdAndMerchantOrderId(Long appId, String merchantOrderId) { + return selectOne(new QueryWrapper().eq("app_id", appId) + .eq("merchant_order_id", merchantOrderId)); + } + + default int updateByIdAndStatus(Long id, Integer status, PayOrderDO update) { + return update(update, new QueryWrapper() + .eq("id", id).eq("status", status)); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/refund/PayRefundMapper.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/refund/PayRefundMapper.java new file mode 100644 index 0000000..dc8236d --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/mysql/refund/PayRefundMapper.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.module.pay.dal.mysql.refund; + +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.QueryWrapperX; +import com.jojubanking.boot.module.pay.dal.dataobject.refund.PayRefundDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface PayRefundMapper extends BaseMapperX { + + default PageResult selectPage(PayRefundPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .eqIfPresent("merchant_id", reqVO.getMerchantId()) + .eqIfPresent("app_id", reqVO.getAppId()) + .eqIfPresent("channel_code", reqVO.getChannelCode()) + .likeIfPresent("merchant_refund_no", reqVO.getMerchantRefundNo()) + .eqIfPresent("type", reqVO.getType()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("notify_status", reqVO.getNotifyStatus()) + .betweenIfPresent("create_time", reqVO.getCreateTime()) + .orderByDesc("id")); + } + + default List selectList(PayRefundExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .eqIfPresent("merchant_id", reqVO.getMerchantId()) + .eqIfPresent("app_id", reqVO.getAppId()) + .eqIfPresent("channel_code", reqVO.getChannelCode()) + .likeIfPresent("merchant_refund_no", reqVO.getMerchantRefundNo()) + .eqIfPresent("type", reqVO.getType()) + .eqIfPresent("status", reqVO.getStatus()) + .eqIfPresent("notify_status", reqVO.getNotifyStatus()) + .betweenIfPresent("create_time", reqVO.getCreateTime()) + .orderByDesc("id")); + } + + default Long selectCount(Long appId, Integer status) { + + return selectCount(new LambdaQueryWrapper() + .eq(PayRefundDO::getAppId, appId) + .eq(PayRefundDO::getStatus, status)); + } + + default PayRefundDO selectByReqNo(String reqNo) { + return selectOne("req_no", reqNo); + } + + default PayRefundDO selectByTradeNoAndMerchantRefundNo(String tradeNo, String merchantRefundNo){ + return selectOne("trade_no", tradeNo, "merchant_refund_no", merchantRefundNo); + } +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/redis/RedisKeyConstants.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/redis/RedisKeyConstants.java new file mode 100644 index 0000000..00b1e45 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/redis/RedisKeyConstants.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.pay.dal.redis; + +import com.jojubanking.boot.framework.redis.core.RedisKeyDefine; +import org.redisson.api.RLock; + +/** + * 支付 Redis Key 枚举类 + * + * @author TW + */ +public interface RedisKeyConstants { + + RedisKeyDefine PAY_NOTIFY_LOCK = new RedisKeyDefine("通知任务的分布式锁", + "pay_notify:lock:", // 参数来自 DefaultLockKeyBuilder 类 + RedisKeyDefine.KeyTypeEnum.HASH, RLock.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); // Redisson 的 Lock 锁,使用 Hash 数据结构 + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.java new file mode 100644 index 0000000..3a86f95 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.pay.dal.redis.notify; + +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; + +import static com.jojubanking.boot.module.pay.dal.redis.RedisKeyConstants.PAY_NOTIFY_LOCK; + +/** + * 支付通知的锁 Redis DAO + * + * @author TW + */ +@Repository +public class PayNotifyLockRedisDAO { + + @Resource + private RedissonClient redissonClient; + + public void lock(Long id, Long timeoutMillis, Runnable runnable) { + String lockKey = formatKey(id); + RLock lock = redissonClient.getLock(lockKey); + try { + lock.lock(timeoutMillis, TimeUnit.MILLISECONDS); + // 执行逻辑 + runnable.run(); + } finally { + lock.unlock(); + } + } + + private static String formatKey(Long id) { + return String.format(PAY_NOTIFY_LOCK.getKeyTemplate(), id); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/notify/PayNotifyStatusEnum.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/notify/PayNotifyStatusEnum.java new file mode 100644 index 0000000..2c88088 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/notify/PayNotifyStatusEnum.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.pay.enums.notify; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 支付通知状态枚举 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum PayNotifyStatusEnum { + + WAITING(1, "等待通知"), + SUCCESS(2, "通知成功"), + FAILURE(3, "通知失败"), // 多次尝试,彻底失败 + REQUEST_SUCCESS(4, "请求成功,但是结果失败"), + REQUEST_FAILURE(5, "请求失败"), + + ; + + /** + * 状态 + */ + private final Integer status; + /** + * 名字 + */ + private final String name; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/notify/PayNotifyTypeEnum.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/notify/PayNotifyTypeEnum.java new file mode 100644 index 0000000..b536b59 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/notify/PayNotifyTypeEnum.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.pay.enums.notify; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 支付通知类型 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum PayNotifyTypeEnum { + + ORDER(1, "支付单"), + REFUND(2, "退款单"), + ; + + /** + * 类型 + */ + private final Integer type; + /** + * 名字 + */ + private final String name; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/order/PayOrderNotifyStatusEnum.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/order/PayOrderNotifyStatusEnum.java new file mode 100644 index 0000000..8c16046 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/order/PayOrderNotifyStatusEnum.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.pay.enums.order; + +import com.jojubanking.boot.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 支付订单的通知状态枚举 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum PayOrderNotifyStatusEnum implements IntArrayValuable { + + NO(0, "未通知"), + SUCCESS(10, "通知成功"), + FAILURE(20, "通知失败") + ; + + private final Integer status; + private final String name; + + @Override + public int[] array() { + return new int[0]; + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/order/PayOrderStatusEnum.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/order/PayOrderStatusEnum.java new file mode 100644 index 0000000..65f5002 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/order/PayOrderStatusEnum.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.pay.enums.order; + +import com.jojubanking.boot.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 支付订单的状态枚举 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum PayOrderStatusEnum implements IntArrayValuable { + + WAITING(0, "未支付"), + SUCCESS(10, "支付成功"), + CLOSED(20, "支付关闭"), // 未付款交易超时关闭,或支付完成后全额退款 TODO TW:需要优化下 + ; + + private final Integer status; + private final String name; + + @Override + public int[] array() { + return new int[0]; + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/refund/PayRefundStatusEnum.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/refund/PayRefundStatusEnum.java new file mode 100644 index 0000000..108d7e2 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/refund/PayRefundStatusEnum.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.pay.enums.refund; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum PayRefundStatusEnum { + + CREATE(0, "退款订单生成"), + SUCCESS(1, "退款成功"), + FAILURE(2, "退款失败"), + CLOSE(99, "退款关闭"); + + private final Integer status; + private final String name; +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/refund/PayRefundTypeEnum.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/refund/PayRefundTypeEnum.java new file mode 100644 index 0000000..9f2dab1 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/enums/refund/PayRefundTypeEnum.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.pay.enums.refund; + +import com.jojubanking.boot.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 支付订单的退款状态枚举 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum PayRefundTypeEnum implements IntArrayValuable { + + NO(0, "未退款"), + SOME(10, "部分退款"), + ALL(20, "全部退款") + ; + + private final Integer status; + private final String name; + + @Override + public int[] array() { + return new int[0]; + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/framework/job/config/PayJobConfiguration.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/framework/job/config/PayJobConfiguration.java new file mode 100644 index 0000000..7f86e30 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/framework/job/config/PayJobConfiguration.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.pay.framework.job.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +public class PayJobConfiguration { + + public static final String NOTIFY_THREAD_POOL_TASK_EXECUTOR = "NOTIFY_THREAD_POOL_TASK_EXECUTOR"; + + @Bean(NOTIFY_THREAD_POOL_TASK_EXECUTOR) + public ThreadPoolTaskExecutor notifyThreadPoolTaskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(8); // 设置核心线程数 + executor.setMaxPoolSize(16); // 设置最大线程数 + executor.setKeepAliveSeconds(60); // 设置空闲时间 + executor.setQueueCapacity(100); // 设置队列大小 + executor.setThreadNamePrefix("notify-task-"); // 配置线程池的前缀 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + // 进行加载 + executor.initialize(); + return executor; + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/framework/job/core/package-info.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/framework/job/core/package-info.java new file mode 100644 index 0000000..566a4cc --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/framework/job/core/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.jojubanking.boot.module.pay.framework.job.core; diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/framework/package-info.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/framework/package-info.java new file mode 100644 index 0000000..6190d2f --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 pay 模块的 framework 封装 + * + * @author TW + */ +package com.jojubanking.boot.module.pay.framework; diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/job/notify/PayNotifyJob.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/job/notify/PayNotifyJob.java new file mode 100644 index 0000000..e8cea05 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/job/notify/PayNotifyJob.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.pay.job.notify; + +import com.jojubanking.boot.framework.quartz.core.handler.JobHandler; +import com.jojubanking.boot.module.pay.service.notify.PayNotifyService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 支付通知 Job + * 通过不断扫描待通知的 PayNotifyTaskDO 记录,回调业务线的回调接口 + * + * @author TW + */ +@Component +@Slf4j +public class PayNotifyJob implements JobHandler { + + @Resource + private PayNotifyService payNotifyCoreService; + + @Override + public String execute(String param) throws Exception { + int notifyCount = payNotifyCoreService.executeNotify(); + return String.format("执行支付通知 %s 个", notifyCount); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/job/package-info.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/job/package-info.java new file mode 100644 index 0000000..a3b9848 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/job/package-info.java @@ -0,0 +1 @@ +package com.jojubanking.boot.module.pay.job; diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/package-info.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/package-info.java new file mode 100644 index 0000000..76c4a3a --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/package-info.java @@ -0,0 +1,10 @@ +/** + * pay 模块,我们放支付业务,提供业务的支付能力。 + * 例如说:商户、应用、支付、退款等等 + * + * 1. Controller URL:以 /member/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 member_ 开头,方便在数据库中区分 + * + * 注意,由于 Pay 模块和 Trade 模块,容易重名,所以类名都加载 Pay 的前缀~ + */ +package com.jojubanking.boot.module.pay; diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayAppService.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayAppService.java new file mode 100644 index 0000000..5cc7a37 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayAppService.java @@ -0,0 +1,116 @@ +package com.jojubanking.boot.module.pay.service.merchant; + +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppPageReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppUpdateReqVO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 支付应用信息 Service 接口 + * + * @author 芋艿 + */ +public interface PayAppService { + + /** + * 创建支付应用信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createApp(@Valid PayAppCreateReqVO createReqVO); + + /** + * 更新支付应用信息 + * + * @param updateReqVO 更新信息 + */ + void updateApp(@Valid PayAppUpdateReqVO updateReqVO); + + /** + * 删除支付应用信息 + * + * @param id 编号 + */ + void deleteApp(Long id); + + /** + * 获得支付应用信息 + * + * @param id 编号 + * @return 支付应用信息 + */ + PayAppDO getApp(Long id); + + /** + * 获得支付应用信息列表 + * + * @param ids 编号 + * @return 支付应用信息列表 + */ + List getAppList(Collection ids); + + /** + * 获得支付应用信息分页 + * + * @param pageReqVO 分页查询 + * @return 支付应用信息分页 + */ + PageResult getAppPage(PayAppPageReqVO pageReqVO); + + /** + * 获得支付应用信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 支付应用信息列表 + */ + List getAppList(PayAppExportReqVO exportReqVO); + + /** + * 修改应用信息状态 + * + * @param id 应用编号 + * @param status 状态{@link com.jojubanking.boot.framework.common.enums.CommonStatusEnum} + */ + void updateAppStatus(Long id, Integer status); + + /** + * 根据商户 ID 获得支付应用信息列表, + * + * @param merchantId 商户 ID + * @return 支付应用信息列表 + */ + List getListByMerchantId(Long merchantId); + + /** + * 获得指定编号的商户 Map + * + * @param appIdList 应用编号集合 + * @return 商户 Map + */ + default Map getAppMap(Collection appIdList) { + List list = this.getAppList(appIdList); + return CollectionUtils.convertMap(list, PayAppDO::getId); + } + + + /** + * 支付应用的合法性 + * + * 如果不合法,抛出 {@link ServiceException} 业务异常 + * + * @param id 应用编号 + * @return 应用信息 + */ + PayAppDO validPayApp(Long id); + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayAppServiceImpl.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayAppServiceImpl.java new file mode 100644 index 0000000..6b9a715 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayAppServiceImpl.java @@ -0,0 +1,189 @@ +package com.jojubanking.boot.module.pay.service.merchant; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppPageReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppUpdateReqVO; +import com.jojubanking.boot.module.pay.convert.app.PayAppConvert; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import com.jojubanking.boot.module.pay.dal.mysql.merchant.PayAppMapper; +import com.jojubanking.boot.module.pay.dal.mysql.merchant.PayMerchantMapper; +import com.jojubanking.boot.module.pay.dal.mysql.order.PayOrderMapper; +import com.jojubanking.boot.module.pay.dal.mysql.refund.PayRefundMapper; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.pay.enums.ErrorCodeConstants; +import com.jojubanking.boot.module.pay.enums.order.PayOrderStatusEnum; +import com.jojubanking.boot.module.pay.enums.refund.PayRefundStatusEnum; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.*; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertSet; +import static com.jojubanking.boot.module.pay.enums.ErrorCodeConstants.*; + +/** + * 支付应用信息 Service 实现类 + * + * @author aquan + */ +@Service +@Validated +public class PayAppServiceImpl implements PayAppService { + + @Resource + private PayAppMapper appMapper; + // TODO @aquan:使用对方的 Service。模块与模块之间,避免直接调用对方的 mapper + @Resource + private PayMerchantMapper merchantMapper; + @Resource + private PayOrderMapper orderMapper; + @Resource + private PayRefundMapper refundMapper; + + @Override + public Long createApp(PayAppCreateReqVO createReqVO) { + // 插入 + PayAppDO app = PayAppConvert.INSTANCE.convert(createReqVO); + appMapper.insert(app); + // 返回 + return app.getId(); + } + + @Override + public void updateApp(PayAppUpdateReqVO updateReqVO) { + // 校验存在 + this.validateAppExists(updateReqVO.getId()); + // 更新 + PayAppDO updateObj = PayAppConvert.INSTANCE.convert(updateReqVO); + appMapper.updateById(updateObj); + } + + @Override + public void deleteApp(Long id) { + // 校验存在 + this.validateAppExists(id); + this.validateOrderTransactionExist(id); + + // 删除 + appMapper.deleteById(id); + } + + private void validateAppExists(Long id) { + if (appMapper.selectById(id) == null) { + throw exception(PAY_APP_NOT_FOUND); + } + } + + @Override + public PayAppDO getApp(Long id) { + return appMapper.selectById(id); + } + + @Override + public List getAppList(Collection ids) { + return appMapper.selectBatchIds(ids); + } + + @Override + public PageResult getAppPage(PayAppPageReqVO pageReqVO) { + Set merchantIdList = this.getMerchantCondition(pageReqVO.getMerchantName()); + if (StrUtil.isNotBlank(pageReqVO.getMerchantName()) && CollectionUtil.isEmpty(merchantIdList)) { + return new PageResult<>(); + } + return appMapper.selectPage(pageReqVO, merchantIdList); + } + + @Override + public List getAppList(PayAppExportReqVO exportReqVO) { + Set merchantIdList = this.getMerchantCondition(exportReqVO.getMerchantName()); + if (StrUtil.isNotBlank(exportReqVO.getMerchantName()) && CollectionUtil.isEmpty(merchantIdList)) { + return new ArrayList<>(); + } + return appMapper.selectList(exportReqVO, merchantIdList); + } + + /** + * 获取商户编号集合,根据商户名称模糊查询得到所有的商户编号集合 + * + * @param merchantName 商户名称 + * @return 商户编号集合 + */ + private Set getMerchantCondition(String merchantName) { + if (StrUtil.isBlank(merchantName)) { + return Collections.emptySet(); + } + return convertSet(merchantMapper.getMerchantListByName(merchantName), PayMerchantDO::getId); + } + + @Override + public void updateAppStatus(Long id, Integer status) { + // 校验商户存在 + this.checkAppExists(id); + // 更新状态 + PayAppDO app = new PayAppDO(); + app.setId(id); + app.setStatus(status); + appMapper.updateById(app); + } + + @Override + public List getListByMerchantId(Long merchantId) { + return appMapper.getListByMerchantId(merchantId); + } + + /** + * 检查商户是否存在 + * + * @param id 商户编号 + */ + @VisibleForTesting + public void checkAppExists(Long id) { + if (id == null) { + return; + } + PayAppDO payApp = appMapper.selectById(id); + if (payApp == null) { + throw exception(PAY_APP_NOT_FOUND); + } + } + + /** + * 验证是否存在交易中或者退款中等处理中状态的订单 + * + * @param appId 应用 ID + */ + private void validateOrderTransactionExist(Long appId) { + // 查看交易订单 + if (orderMapper.selectCount(appId, PayOrderStatusEnum.WAITING.getStatus()) > 0) { + throw exception(PAY_APP_EXIST_TRANSACTION_ORDER_CANT_DELETE); + } + // 查看退款订单 + if (refundMapper.selectCount(appId, PayRefundStatusEnum.CREATE.getStatus()) > 0) { + throw exception(PAY_APP_EXIST_TRANSACTION_ORDER_CANT_DELETE); + } + } + + @Override + public PayAppDO validPayApp(Long id) { + PayAppDO app = appMapper.selectById(id); + // 校验是否存在 + if (app == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_APP_NOT_FOUND); + } + // 校验是否禁用 + if (CommonStatusEnum.DISABLE.getStatus().equals(app.getStatus())) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_APP_IS_DISABLE); + } + return app; + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayChannelService.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayChannelService.java new file mode 100644 index 0000000..0bc82d4 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayChannelService.java @@ -0,0 +1,133 @@ +package com.jojubanking.boot.module.pay.service.merchant; + +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelPageReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelUpdateReqVO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 支付渠道 Service 接口 + * + * @author aquan + */ +public interface PayChannelService { + + /** + * 初始化支付客户端 + */ + void initPayClients(); + + /** + * 创建支付渠道 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createChannel(@Valid PayChannelCreateReqVO createReqVO); + + /** + * 更新支付渠道 + * + * @param updateReqVO 更新信息 + */ + void updateChannel(@Valid PayChannelUpdateReqVO updateReqVO); + + /** + * 删除支付渠道 + * + * @param id 编号 + */ + void deleteChannel(Long id); + + /** + * 获得支付渠道 + * + * @param id 编号 + * @return 支付渠道 + */ + PayChannelDO getChannel(Long id); + + /** + * 获得支付渠道列表 + * + * @param ids 编号 + * @return 支付渠道 + * 列表 + */ + List getChannelList(Collection ids); + + /** + * 获得支付渠道分页 + * + * @param pageReqVO 分页查询 + * @return 支付渠道 + * 分页 + */ + PageResult getChannelPage(PayChannelPageReqVO pageReqVO); + + /** + * 获得支付渠道 + * 列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 支付渠道列表 + */ + List getChannelList(PayChannelExportReqVO exportReqVO); + + /** + * 根据支付应用ID集合获得支付渠道列表 + * + * @param appIds 应用编号集合 + * @return 支付渠道列表 + */ + List getChannelListByAppIds(Collection appIds); + + /** + * 根据条件获取渠道数量 + * + * @param merchantId 商户编号 + * @param appid 应用编号 + * @param code 渠道编码 + * @return 数量 + */ + Integer getChannelCountByConditions(Long merchantId, Long appid, String code); + + /** + * 根据条件获取渠道 + * + * @param merchantId 商户编号 + * @param appid 应用编号 + * @param code 渠道编码 + * @return 数量 + */ + PayChannelDO getChannelByConditions(Long merchantId, Long appid, String code); + + /** + * 支付渠道的合法性 + * + * 如果不合法,抛出 {@link ServiceException} 业务异常 + * + * @param id 渠道编号 + * @return 渠道信息 + */ + PayChannelDO validPayChannel(Long id); + + /** + * 支付渠道的合法性 + * + * 如果不合法,抛出 {@link ServiceException} 业务异常 + * + * @param appId 应用编号 + * @param code 支付渠道 + * @return 渠道信息 + */ + PayChannelDO validPayChannel(Long appId, String code); + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayChannelServiceImpl.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayChannelServiceImpl.java new file mode 100644 index 0000000..63b9af0 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayChannelServiceImpl.java @@ -0,0 +1,260 @@ +package com.jojubanking.boot.module.pay.service.merchant; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.pay.core.client.PayClientConfig; +import com.jojubanking.boot.framework.pay.core.client.PayClientFactory; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.jojubanking.boot.framework.tenant.core.aop.TenantIgnore; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelPageReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelUpdateReqVO; +import com.jojubanking.boot.module.pay.convert.channel.PayChannelConvert; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import com.jojubanking.boot.module.pay.dal.mysql.merchant.PayChannelMapper; +import com.jojubanking.boot.module.pay.enums.ErrorCodeConstants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.pay.enums.ErrorCodeConstants.CHANNEL_EXIST_SAME_CHANNEL_ERROR; +import static com.jojubanking.boot.module.pay.enums.ErrorCodeConstants.CHANNEL_NOT_EXISTS; + +/** + * 支付渠道 Service 实现类 + * + * @author aquan + */ +@Service +@Slf4j +@Validated +public class PayChannelServiceImpl implements PayChannelService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Resource + private PayClientFactory payClientFactory; + + @Resource + private PayChannelMapper channelMapper; + + @Resource + private Validator validator; + + @Resource + @Lazy // 注入自己,所以延迟加载 + private PayChannelService self; + + @Override + @PostConstruct + @TenantIgnore // 忽略自动化租户,全局初始化本地缓存 + public void initPayClients() { + // 获取支付渠道,如果有更新 + List payChannels = loadPayChannelIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(payChannels)) { + return; + } + + // 创建或更新支付 Client + payChannels.forEach(payChannel -> payClientFactory.createOrUpdatePayClient(payChannel.getId(), + payChannel.getCode(), payChannel.getConfig())); + + // 写入缓存 + maxUpdateTime = CollectionUtils.getMaxValue(payChannels, PayChannelDO::getUpdateTime); + log.info("[initPayClients][初始化 PayChannel 数量为 {}]", payChannels.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + self.initPayClients(); + } + + /** + * 如果支付渠道发生变化,从数据库中获取最新的全量支付渠道。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前支付渠道的最大更新时间 + * @return 支付渠道列表 + */ + private List loadPayChannelIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadPayChannelIfUpdate][首次加载全量支付渠道]"); + } else { // 判断数据库中是否有更新的支付渠道 + if (channelMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { + return null; + } + log.info("[loadPayChannelIfUpdate][增量加载全量支付渠道]"); + } + // 第二步,如果有更新,则从数据库加载所有支付渠道 + return channelMapper.selectList(); + } + + @Override + public Long createChannel(PayChannelCreateReqVO reqVO) { + // 断言是否有重复的 + PayChannelDO channelDO = this.getChannelByConditions(reqVO.getMerchantId(), reqVO.getAppId(), reqVO.getCode()); + if (ObjectUtil.isNotNull(channelDO)) { + throw exception(CHANNEL_EXIST_SAME_CHANNEL_ERROR); + } + + // 新增渠道 + PayChannelDO channel = PayChannelConvert.INSTANCE.convert(reqVO); + settingConfigAndCheckParam(channel, reqVO.getConfig()); + channelMapper.insert(channel); + // TODO TW:缺少刷新本地缓存的机制 + return channel.getId(); + } + + @Override + public void updateChannel(PayChannelUpdateReqVO updateReqVO) { + // 校验存在 + this.validateChannelExists(updateReqVO.getId()); + // 更新 + PayChannelDO channel = PayChannelConvert.INSTANCE.convert(updateReqVO); + settingConfigAndCheckParam(channel, updateReqVO.getConfig()); + channelMapper.updateById(channel); + // TODO TW:缺少刷新本地缓存的机制 + } + + @Override + public void deleteChannel(Long id) { + // 校验存在 + this.validateChannelExists(id); + // 删除 + channelMapper.deleteById(id); + // TODO TW:缺少刷新本地缓存的机制 + } + + private void validateChannelExists(Long id) { + if (channelMapper.selectById(id) == null) { + throw exception(CHANNEL_NOT_EXISTS); + } + } + + @Override + public PayChannelDO getChannel(Long id) { + return channelMapper.selectById(id); + } + + @Override + public List getChannelList(Collection ids) { + return channelMapper.selectBatchIds(ids); + } + + @Override + public PageResult getChannelPage(PayChannelPageReqVO pageReqVO) { + return channelMapper.selectPage(pageReqVO); + } + + @Override + public List getChannelList(PayChannelExportReqVO exportReqVO) { + return channelMapper.selectList(exportReqVO); + } + + /** + * 根据支付应用ID集合获得支付渠道列表 + * + * @param appIds 应用编号集合 + * @return 支付渠道列表 + */ + @Override + public List getChannelListByAppIds(Collection appIds) { + return channelMapper.getChannelListByAppIds(appIds); + } + + + /** + * 根据条件获取渠道数量 + * + * @param merchantId 商户编号 + * @param appid 应用编号 + * @param code 渠道编码 + * @return 数量 + */ + @Override + public Integer getChannelCountByConditions(Long merchantId, Long appid, String code) { + return this.channelMapper.selectCount(merchantId, appid, code); + } + + /** + * 根据条件获取渠道 + * + * @param merchantId 商户编号 + * @param appid 应用编号 + * @param code 渠道编码 + * @return 数量 + */ + @Override + public PayChannelDO getChannelByConditions(Long merchantId, Long appid, String code) { + return this.channelMapper.selectOne(merchantId, appid, code); + } + + /** + * 设置渠道配置以及参数校验 + * + * @param channel 渠道 + * @param configStr 配置 + */ + private void settingConfigAndCheckParam(PayChannelDO channel, String configStr) { + // 得到这个渠道是微信的还是支付宝的 + Class payClass = PayChannelEnum.getByCode(channel.getCode()).getConfigClass(); + if (ObjectUtil.isNull(payClass)) { + throw exception(CHANNEL_NOT_EXISTS); + } + // TODO @芋艿:不要使用 hutool 的 json 工具,用项目的 + PayClientConfig config = JSONUtil.toBean(configStr, payClass); + + // 验证参数 + config.validate(validator); + channel.setConfig(config); + } + + @Override + public PayChannelDO validPayChannel(Long id) { + PayChannelDO channel = channelMapper.selectById(id); + this.validPayChannel(channel); + return channel; + } + + @Override + public PayChannelDO validPayChannel(Long appId, String code) { + PayChannelDO channel = channelMapper.selectByAppIdAndCode(appId, code); + this.validPayChannel(channel); + return channel; + } + + private void validPayChannel(PayChannelDO channel) { + if (channel == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_NOT_FOUND); + } + if (CommonStatusEnum.DISABLE.getStatus().equals(channel.getStatus())) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_IS_DISABLE); + } + } +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayMerchantService.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayMerchantService.java new file mode 100644 index 0000000..305ce46 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayMerchantService.java @@ -0,0 +1,104 @@ +package com.jojubanking.boot.module.pay.service.merchant; + +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantPageReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantUpdateReqVO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 支付商户信息 Service 接口 + * + * @author aquan + */ +public interface PayMerchantService { + + /** + * 创建支付商户信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMerchant(@Valid PayMerchantCreateReqVO createReqVO); + + /** + * 更新支付商户信息 + * + * @param updateReqVO 更新信息 + */ + void updateMerchant(@Valid PayMerchantUpdateReqVO updateReqVO); + + /** + * 删除支付商户信息 + * + * @param id 编号 + */ + void deleteMerchant(Long id); + + /** + * 获得支付商户信息 + * + * @param id 编号 + * @return 支付商户信息 + */ + PayMerchantDO getMerchant(Long id); + + /** + * 获得支付商户信息列表 + * + * @param ids 编号 + * @return 支付商户信息列表 + */ + List getMerchantList(Collection ids); + + /** + * 获得支付商户信息分页 + * + * @param pageReqVO 分页查询 + * @return 支付商户信息分页 + */ + PageResult getMerchantPage(PayMerchantPageReqVO pageReqVO); + + /** + * 获得支付商户信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 支付商户信息列表 + */ + List getMerchantList(PayMerchantExportReqVO exportReqVO); + + /** + * 修改商户状态 + * + * @param id 商户编号 + * @param status 状态 + */ + void updateMerchantStatus(Long id, Integer status); + + /** + * 根据商户名称模糊查询商户集合 + * + * @param merchantName 商户名称 + * @return 商户集合 + */ + List getMerchantListByName(String merchantName); + + /** + * 获得指定编号的商户 Map + * + * @param merchantIds 商户编号数组 + * @return 商户 Map + */ + default Map getMerchantMap(Collection merchantIds) { + List list = this.getMerchantList(merchantIds); + return CollectionUtils.convertMap(list, PayMerchantDO::getId); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayMerchantServiceImpl.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayMerchantServiceImpl.java new file mode 100644 index 0000000..041da72 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/merchant/PayMerchantServiceImpl.java @@ -0,0 +1,148 @@ +package com.jojubanking.boot.module.pay.service.merchant; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantPageReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantUpdateReqVO; +import com.jojubanking.boot.module.pay.convert.merchant.PayMerchantConvert; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import com.jojubanking.boot.module.pay.dal.mysql.merchant.PayAppMapper; +import com.jojubanking.boot.module.pay.dal.mysql.merchant.PayMerchantMapper; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.List; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.pay.enums.ErrorCodeConstants.*; + +/** + * 支付商户信息 Service 实现类 + * + * @author aquan + */ +@Service +@Validated +public class PayMerchantServiceImpl implements PayMerchantService { + + @Resource + private PayMerchantMapper merchantMapper; + + @Resource + private PayAppMapper appMapper; + + @Override + public Long createMerchant(PayMerchantCreateReqVO createReqVO) { + // 插入 + PayMerchantDO merchant = PayMerchantConvert.INSTANCE.convert(createReqVO); + merchant.setNo(this.generateMerchantNo()); + merchantMapper.insert(merchant); + // 返回 + return merchant.getId(); + } + + @Override + public void updateMerchant(PayMerchantUpdateReqVO updateReqVO) { + // 校验存在 + this.validateMerchantExists(updateReqVO.getId()); + // 更新 + PayMerchantDO updateObj = PayMerchantConvert.INSTANCE.convert(updateReqVO); + merchantMapper.updateById(updateObj); + } + + @Override + public void deleteMerchant(Long id) { + // 校验 + this.validateMerchantExists(id); + this.validateAppExists(id); + // 删除 + merchantMapper.deleteById(id); + } + + @Override + public PayMerchantDO getMerchant(Long id) { + return merchantMapper.selectById(id); + } + + @Override + public List getMerchantList(Collection ids) { + return merchantMapper.selectBatchIds(ids); + } + + @Override + public PageResult getMerchantPage(PayMerchantPageReqVO pageReqVO) { + return merchantMapper.selectPage(pageReqVO); + } + + @Override + public List getMerchantList(PayMerchantExportReqVO exportReqVO) { + return merchantMapper.selectList(exportReqVO); + } + + @Override + public void updateMerchantStatus(Long id, Integer status) { + // 校验商户存在 + this.checkMerchantExists(id); + // 更新状态 + PayMerchantDO merchant = new PayMerchantDO(); + merchant.setId(id); + merchant.setStatus(status); + merchantMapper.updateById(merchant); + } + + @Override + public List getMerchantListByName(String merchantName) { + return this.merchantMapper.getMerchantListByName(merchantName); + } + + @VisibleForTesting + public void checkMerchantExists(Long id) { + if (id == null) { + return; + } + PayMerchantDO merchant = merchantMapper.selectById(id); + if (merchant == null) { + throw exception(PAY_MERCHANT_NOT_EXISTS); + } + } + + /** + * 校验商户是否存在 + * + * @param id 商户 ID + */ + private void validateMerchantExists(Long id) { + if (ObjectUtil.isNull(merchantMapper.selectById(id))) { + throw exception(PAY_MERCHANT_NOT_EXISTS); + } + } + + /** + * 校验商户是否还存在支付应用 + * + * @param id 商户ID + */ + private void validateAppExists(Long id) { + if (appMapper.selectCount(id) > 0) { + throw exception(PAY_MERCHANT_EXIST_APP_CANT_DELETE); + } + } + + // TODO @芋艿:后续增加下合适的算法 + /** + * 根据年月日时分秒毫秒生成商户号 + * + * @return 商户号 + */ + private String generateMerchantNo() { + return "M" + DateUtil.format(LocalDateTime.now(), "yyyyMMddHHmmssSSS"); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/PayNotifyService.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/PayNotifyService.java new file mode 100644 index 0000000..24133be --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/PayNotifyService.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.pay.service.notify; + +import com.jojubanking.boot.module.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; + +import javax.validation.Valid; + +/** + * 支付通知 Service 接口 + * + * @author TW + */ +public interface PayNotifyService { + + /** + * 创建支付通知任务 + * + * @param reqDTO 任务信息 + */ + void createPayNotifyTask(@Valid PayNotifyTaskCreateReqDTO reqDTO); + + /** + * 执行支付通知 + * + * 注意,该方法提供给定时任务调用。目前是 joju-server 进行调用 + * @return 通知数量 + */ + int executeNotify() throws InterruptedException; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/PayNotifyServiceImpl.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/PayNotifyServiceImpl.java new file mode 100644 index 0000000..c71769c --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/PayNotifyServiceImpl.java @@ -0,0 +1,260 @@ +package com.jojubanking.boot.module.pay.service.notify; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.http.HttpUtil; +import com.jojubanking.boot.module.pay.dal.dataobject.notify.PayNotifyLogDO; +import com.jojubanking.boot.module.pay.dal.dataobject.notify.PayNotifyTaskDO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.dal.dataobject.refund.PayRefundDO; +import com.jojubanking.boot.module.pay.dal.mysql.notify.PayNotifyLogCoreMapper; +import com.jojubanking.boot.module.pay.dal.mysql.notify.PayNotifyTaskCoreMapper; +import com.jojubanking.boot.module.pay.dal.redis.notify.PayNotifyLockRedisDAO; +import com.jojubanking.boot.module.pay.enums.notify.PayNotifyStatusEnum; +import com.jojubanking.boot.module.pay.enums.notify.PayNotifyTypeEnum; +import com.jojubanking.boot.module.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; +import com.jojubanking.boot.module.pay.service.notify.vo.PayNotifyOrderReqVO; +import com.jojubanking.boot.module.pay.service.notify.vo.PayRefundOrderReqVO; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.module.pay.service.order.PayOrderService; +import com.jojubanking.boot.module.pay.service.refund.PayRefundService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import static com.jojubanking.boot.module.pay.framework.job.config.PayJobConfiguration.NOTIFY_THREAD_POOL_TASK_EXECUTOR; + +/** + * 支付通知 Core Service 实现类 + * + * @author TW + */ +@Service +@Valid +@Slf4j +public class PayNotifyServiceImpl implements PayNotifyService { + + /** + * 通知超时时间,单位:秒 + */ + public static final int NOTIFY_TIMEOUT = 120; + /** + * {@link #NOTIFY_TIMEOUT} 的毫秒 + */ + public static final long NOTIFY_TIMEOUT_MILLIS = 120 * DateUtils.SECOND_MILLIS; + + @Resource + @Lazy // 循环依赖,避免报错 + private PayOrderService orderService; + @Resource + @Lazy // 循环依赖,避免报错 + private PayRefundService refundService; + + @Resource + private PayNotifyTaskCoreMapper payNotifyTaskCoreMapper; + @Resource + private PayNotifyLogCoreMapper payNotifyLogCoreMapper; + + @Resource(name = NOTIFY_THREAD_POOL_TASK_EXECUTOR) + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + + @Resource + private PayNotifyLockRedisDAO payNotifyLockCoreRedisDAO; + + @Resource + @Lazy // 循环依赖(自己依赖自己),避免报错 + private PayNotifyServiceImpl self; + + @Override + public void createPayNotifyTask(PayNotifyTaskCreateReqDTO reqDTO) { + PayNotifyTaskDO task = new PayNotifyTaskDO(); + task.setType(reqDTO.getType()).setDataId(reqDTO.getDataId()); + task.setStatus(PayNotifyStatusEnum.WAITING.getStatus()).setNextNotifyTime(new Date()) + .setNotifyTimes(0).setMaxNotifyTimes(PayNotifyTaskDO.NOTIFY_FREQUENCY.length + 1); + // 补充 merchantId + appId + notifyUrl 字段 + if (Objects.equals(task.getType(), PayNotifyTypeEnum.ORDER.getType())) { + PayOrderDO order = orderService.getOrder(task.getDataId()); // 不进行非空判断,有问题直接异常 + task.setMerchantId(order.getMerchantId()).setAppId(order.getAppId()). + setMerchantOrderId(order.getMerchantOrderId()).setNotifyUrl(order.getNotifyUrl()); + } else if (Objects.equals(task.getType(), PayNotifyTypeEnum.REFUND.getType())) { + PayRefundDO refundDO = refundService.getRefund(task.getDataId()); + task.setMerchantId(refundDO.getMerchantId()).setAppId(refundDO.getAppId()) + .setMerchantOrderId(refundDO.getMerchantOrderId()).setNotifyUrl(refundDO.getNotifyUrl()); + } + + // 执行插入 + payNotifyTaskCoreMapper.insert(task); + + // 异步直接发起任务。虽然会有定时任务扫描,但是会导致延迟 + self.executeNotifyAsync(task); + } + + @Override + public int executeNotify() throws InterruptedException { + // 获得需要通知的任务 + List tasks = payNotifyTaskCoreMapper.selectListByNotify(); + if (CollUtil.isEmpty(tasks)) { + return 0; + } + + // 遍历,逐个通知 + CountDownLatch latch = new CountDownLatch(tasks.size()); + tasks.forEach(task -> threadPoolTaskExecutor.execute(() -> { + try { + executeNotifySync(task); + } finally { + latch.countDown(); + } + })); + // 等待完成 + awaitExecuteNotify(latch); + // 返回执行完成的任务数(成功 + 失败) + return tasks.size(); + } + + /** + * 等待全部支付通知的完成 + * 每 1 秒会打印一次剩余任务数量 + * + * @param latch Latch + * @throws InterruptedException 如果被打断 + */ + private void awaitExecuteNotify(CountDownLatch latch) throws InterruptedException { + long size = latch.getCount(); + for (int i = 0; i < NOTIFY_TIMEOUT; i++) { + if (latch.await(1L, TimeUnit.SECONDS)) { + return; + } + log.info("[awaitExecuteNotify][任务处理中, 总任务数({}) 剩余任务数({})]", size, latch.getCount()); + } + log.error("[awaitExecuteNotify][任务未处理完,总任务数({}) 剩余任务数({})]", size, latch.getCount()); + } + + /** + * 异步执行单个支付通知 + * + * @param task 通知任务 + */ + @Async + public void executeNotifyAsync(PayNotifyTaskDO task) { + self.executeNotifySync(task); // 使用 self,避免事务不发起 + } + + /** + * 同步执行单个支付通知 + * + * @param task 通知任务 + */ + public void executeNotifySync(PayNotifyTaskDO task) { + // 分布式锁,避免并发问题 + payNotifyLockCoreRedisDAO.lock(task.getId(), NOTIFY_TIMEOUT_MILLIS, () -> { + // 校验,当前任务是否已经被通知过 + // 虽然已经通过分布式加锁,但是可能同时满足通知的条件,然后都去获得锁。此时,第一个执行完后,第二个还是能拿到锁,然后会再执行一次。 + PayNotifyTaskDO dbTask = payNotifyTaskCoreMapper.selectById(task.getId()); + if (DateUtils.afterNow(dbTask.getNextNotifyTime())) { + log.info("[executeNotify][dbTask({}) 任务被忽略,原因是未到达下次通知时间,可能是因为并发执行了]", JsonUtils.toJsonString(dbTask)); + return; + } + + // 执行通知 + executeNotify(dbTask); + }); + } + + @Transactional + public void executeNotify(PayNotifyTaskDO task) { + // 发起回调 + CommonResult invokeResult = null; + Throwable invokeException = null; + try { + invokeResult = executeNotifyInvoke(task); + } catch (Throwable e) { + invokeException = e; + } + + // 处理 + Integer newStatus = this.processNotifyResult(task, invokeResult, invokeException); + + // 记录 PayNotifyLog 日志 + String response = invokeException != null ? ExceptionUtil.getRootCauseMessage(invokeException) : JsonUtils.toJsonString(invokeResult); + payNotifyLogCoreMapper.insert(PayNotifyLogDO.builder().taskId(task.getId()) + .notifyTimes(task.getNotifyTimes() + 1).status(newStatus).response(response).build()); + } + + /** + * 执行单个支付任务的 HTTP 调用 + * + * @param task 通知任务 + * @return HTTP 响应 + */ + private CommonResult executeNotifyInvoke(PayNotifyTaskDO task) { + // 拼接参数 + Object request; + if (Objects.equals(task.getType(), PayNotifyTypeEnum.ORDER.getType())) { + request = PayNotifyOrderReqVO.builder().merchantOrderId(task.getMerchantOrderId()) + .payOrderId(task.getDataId()).build(); + } else if (Objects.equals(task.getType(), PayNotifyTypeEnum.REFUND.getType())) { + request = PayRefundOrderReqVO.builder().merchantOrderId(task.getMerchantOrderId()) + .payRefundId(task.getDataId()).build(); + } else { + throw new RuntimeException("未知的通知任务类型:" + JsonUtils.toJsonString(task)); + } + // 请求地址 + String response = HttpUtil.post(task.getNotifyUrl(), JsonUtils.toJsonString(request), + (int) NOTIFY_TIMEOUT_MILLIS); + // 解析结果 + return JsonUtils.parseObject(response, CommonResult.class); + } + + /** + * 处理并更新通知结果 + * + * @param task 通知任务 + * @param invokeResult 通知结果 + * @param invokeException 通知异常 + * @return 最终任务的状态 + */ + private Integer processNotifyResult(PayNotifyTaskDO task, CommonResult invokeResult, Throwable invokeException) { + // 设置通用的更新 PayNotifyTaskDO 的字段 + PayNotifyTaskDO updateTask = new PayNotifyTaskDO() + .setId(task.getId()) + .setLastExecuteTime(new Date()) + .setNotifyTimes(task.getNotifyTimes() + 1); + + // 情况一:调用成功 + if (invokeResult != null && invokeResult.isSuccess()) { + updateTask.setStatus(PayNotifyStatusEnum.SUCCESS.getStatus()); + return updateTask.getStatus(); + } + // 情况二:调用失败、调用异常 + // 2.1 超过最大回调次数 + if (updateTask.getNotifyTimes() >= PayNotifyTaskDO.NOTIFY_FREQUENCY.length) { + updateTask.setStatus(PayNotifyStatusEnum.FAILURE.getStatus()); + return updateTask.getStatus(); + } + // 2.2 未超过最大回调次数 + updateTask.setNextNotifyTime(DateUtils.addDate(Calendar.SECOND, PayNotifyTaskDO.NOTIFY_FREQUENCY[updateTask.getNotifyTimes()])); + updateTask.setStatus(invokeException != null ? PayNotifyStatusEnum.REQUEST_FAILURE.getStatus() + : PayNotifyStatusEnum.REQUEST_SUCCESS.getStatus()); + return updateTask.getStatus(); + } + + private void processNotifySuccess(PayNotifyTaskDO task, PayNotifyTaskDO updateTask) { + payNotifyTaskCoreMapper.updateById(updateTask); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.java new file mode 100644 index 0000000..8eda3b8 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.pay.service.notify.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +/** + * 支付通知创建 DTO + * + * @author TW + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PayNotifyTaskCreateReqDTO { + + /** + * 类型 + */ + @NotNull(message = "类型不能为空") + private Integer type; + /** + * 数据编号 + */ + @NotNull(message = "数据编号不能为空") + private Long dataId; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/vo/PayNotifyOrderReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/vo/PayNotifyOrderReqVO.java new file mode 100644 index 0000000..d97e45a --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/vo/PayNotifyOrderReqVO.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.pay.service.notify.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@ApiModel(value = "支付单的通知 Request VO", description = "业务方接入支付回调时,使用该 VO 对象") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PayNotifyOrderReqVO { + + @ApiModelProperty(value = "商户订单编号", required = true, example = "10") + @NotEmpty(message = "商户订单号不能为空") + private String merchantOrderId; + + @ApiModelProperty(value = "支付订单编号", required = true, example = "20") + @NotNull(message = "支付订单编号不能为空") + private Long payOrderId; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/vo/PayRefundOrderReqVO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/vo/PayRefundOrderReqVO.java new file mode 100644 index 0000000..edee15b --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/vo/PayRefundOrderReqVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.pay.service.notify.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@ApiModel(value = "退款单的通知 Request VO", description = "业务方接入退款回调时,使用该 VO 对象") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PayRefundOrderReqVO { + + @ApiModelProperty(value = "商户退款单编号", required = true, example = "10") + @NotEmpty(message = "商户退款单编号不能为空") + private String merchantOrderId; + + @ApiModelProperty(value = "支付退款编号", required = true, example = "20") + @NotNull(message = "支付退款编号不能为空") + private Long payRefundId; + + @ApiModelProperty(value = "退款状态(成功,失败)", required = true, example = "10") + private Integer status; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/vo/package-info.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/vo/package-info.java new file mode 100644 index 0000000..0c090d8 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/notify/vo/package-info.java @@ -0,0 +1,6 @@ +/** + * 这里的 VO 包有点特殊,是提供给接入支付模块的业务,提供回调接口时,可以直接使用 VO + * + * 例如说,支付单的回调,使用 TODO TW:想下怎么优化下 + */ +package com.jojubanking.boot.module.pay.service.notify.vo; diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/PayOrderExtensionService.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/PayOrderExtensionService.java new file mode 100644 index 0000000..554c4b0 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/PayOrderExtensionService.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.module.pay.service.order; + +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderExtensionDO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 支付订单 Service 接口 + * + * @author aquan + */ +public interface PayOrderExtensionService { + + /** + * 获得支付订单 + * + * @param id 编号 + * @return 支付订单 + */ + PayOrderExtensionDO getOrderExtension(Long id); + + /** + * 获得支付订单 + * 列表 + * + * @param ids 编号 + * @return 支付订单 + * 列表 + */ + List getOrderExtensionList(Collection ids); + + /** + * 根据订单成功的 扩展订单ID 查询所有的扩展订单转 成 map 返回 + * + * @param successExtensionIdList 订单 ID 集合 + * @return 订单扩展 map 集合 + */ + default Map getOrderExtensionMap(Collection successExtensionIdList) { + List list = getOrderExtensionList(successExtensionIdList); + return CollectionUtils.convertMap(list, PayOrderExtensionDO::getId); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/PayOrderExtensionServiceImpl.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/PayOrderExtensionServiceImpl.java new file mode 100644 index 0000000..05640e7 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/PayOrderExtensionServiceImpl.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.pay.service.order; + +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderExtensionDO; +import com.jojubanking.boot.module.pay.dal.mysql.order.PayOrderExtensionMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +/** + * 支付订单 Service 实现类 + * + * @author aquan + */ +@Service +@Validated +public class PayOrderExtensionServiceImpl implements PayOrderExtensionService { + + @Resource + private PayOrderExtensionMapper orderExtensionMapper; + + @Override + public PayOrderExtensionDO getOrderExtension(Long id) { + return orderExtensionMapper.selectById(id); + } + + @Override + public List getOrderExtensionList(Collection ids) { + return orderExtensionMapper.selectBatchIds(ids); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/PayOrderService.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/PayOrderService.java new file mode 100644 index 0000000..54cde0f --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/PayOrderService.java @@ -0,0 +1,97 @@ +package com.jojubanking.boot.module.pay.service.order; + +import com.jojubanking.boot.framework.pay.core.client.dto.PayNotifyDataDTO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderPageReqVO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderCreateReqDTO; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderSubmitReqDTO; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderSubmitRespDTO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 支付订单 Service 接口 + * + * @author aquan + */ +public interface PayOrderService { + + /** + * 获得支付订单 + * + * @param id 编号 + * @return 支付订单 + */ + PayOrderDO getOrder(Long id); + + /** + * 获得支付订单 + * 分页 + * + * @param pageReqVO 分页查询 + * @return 支付订单 + * 分页 + */ + PageResult getOrderPage(PayOrderPageReqVO pageReqVO); + + /** + * 获得支付订单 + * 列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 支付订单 + * 列表 + */ + List getOrderList(PayOrderExportReqVO exportReqVO); + + /** + * 根据 ID 集合获取只包含商品名称的订单集合 + * + * @param idList 订单 ID 集合 + * @return 只包含商品名称的订单集合 + */ + List getOrderSubjectList(Collection idList); + + /** + * 根据订单 ID 集合获取订单商品名称Map集合 + * + * @param idList 订单 ID 集合 + * @return 订单商品 map 集合 + */ + default Map getOrderSubjectMap(Collection idList) { + List list = getOrderSubjectList(idList); + return CollectionUtils.convertMap(list, PayOrderDO::getId); + } + + /** + * 创建支付单 + * + * @param reqDTO 创建请求 + * @return 支付单编号 + */ + Long createPayOrder(@Valid PayOrderCreateReqDTO reqDTO); + + /** + * 提交支付 + * 此时,会发起支付渠道的调用 + * + * @param reqDTO 提交请求 + * @return 提交结果 + */ + PayOrderSubmitRespDTO submitPayOrder(@Valid PayOrderSubmitReqDTO reqDTO); + + /** + * 通知支付单成功 + * + * @param channelId 渠道编号 + * @param notifyData 通知数据 + */ + void notifyPayOrder(Long channelId, PayNotifyDataDTO notifyData) throws Exception; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/PayOrderServiceImpl.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/PayOrderServiceImpl.java new file mode 100644 index 0000000..601221c --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/PayOrderServiceImpl.java @@ -0,0 +1,273 @@ +package com.jojubanking.boot.module.pay.service.order; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.pay.config.PayProperties; +import com.jojubanking.boot.framework.pay.core.client.PayClient; +import com.jojubanking.boot.framework.pay.core.client.PayClientFactory; +import com.jojubanking.boot.framework.pay.core.client.dto.PayNotifyDataDTO; +import com.jojubanking.boot.framework.pay.core.client.dto.PayOrderNotifyRespDTO; +import com.jojubanking.boot.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderPageReqVO; +import com.jojubanking.boot.module.pay.convert.order.PayOrderConvert; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderExtensionDO; +import com.jojubanking.boot.module.pay.dal.mysql.order.PayOrderExtensionMapper; +import com.jojubanking.boot.module.pay.dal.mysql.order.PayOrderMapper; +import com.jojubanking.boot.module.pay.enums.ErrorCodeConstants; +import com.jojubanking.boot.module.pay.enums.notify.PayNotifyTypeEnum; +import com.jojubanking.boot.module.pay.enums.order.PayOrderNotifyStatusEnum; +import com.jojubanking.boot.module.pay.enums.order.PayOrderStatusEnum; +import com.jojubanking.boot.module.pay.service.merchant.PayAppService; +import com.jojubanking.boot.module.pay.service.merchant.PayChannelService; +import com.jojubanking.boot.module.pay.service.notify.PayNotifyService; +import com.jojubanking.boot.module.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderCreateReqDTO; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderSubmitReqDTO; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderSubmitRespDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 支付订单 Service 实现类 + * + * @author aquan + */ +@Service +@Validated +@Slf4j +public class PayOrderServiceImpl implements PayOrderService { + + @Resource + private PayProperties payProperties; + + @Resource + private PayClientFactory payClientFactory; + + @Resource + private PayOrderMapper orderMapper; + @Resource + private PayOrderExtensionMapper orderExtensionMapper; + + @Resource + private PayAppService appService; + @Resource + private PayChannelService channelService; + @Resource + private PayNotifyService notifyService; + + @Override + public PayOrderDO getOrder(Long id) { + return orderMapper.selectById(id); + } + + @Override + public PageResult getOrderPage(PayOrderPageReqVO pageReqVO) { + return orderMapper.selectPage(pageReqVO); + } + + @Override + public List getOrderList(PayOrderExportReqVO exportReqVO) { + return orderMapper.selectList(exportReqVO); + } + + // TODO @艿艿:需要优化。不确定这个方法的作用 + @Override + public List getOrderSubjectList(Collection idList) { + return orderMapper.findByIdListQueryOrderSubject(idList); + } + + @Override + public Long createPayOrder(PayOrderCreateReqDTO reqDTO) { + // 校验 App + PayAppDO app = appService.validPayApp(reqDTO.getAppId()); + + // 查询对应的支付交易单是否已经存在。如果是,则直接返回 + PayOrderDO order = orderMapper.selectByAppIdAndMerchantOrderId( + reqDTO.getAppId(), reqDTO.getMerchantOrderId()); + if (order != null) { + log.warn("[createPayOrder][appId({}) merchantOrderId({}) 已经存在对应的支付单({})]", order.getAppId(), + order.getMerchantOrderId(), JsonUtils.toJsonString(order)); // 理论来说,不会出现这个情况 + return app.getId(); + } + + // 创建支付交易单 + order = PayOrderConvert.INSTANCE.convert(reqDTO) + .setMerchantId(app.getMerchantId()).setAppId(app.getId()); + // 商户相关字段 + order.setNotifyUrl(app.getPayNotifyUrl()) + .setNotifyStatus(PayOrderNotifyStatusEnum.NO.getStatus()); + // 订单相关字段 + order.setStatus(PayOrderStatusEnum.WAITING.getStatus()); + // 退款相关字段 + // todo @芋艿 创建支付的订单的退款状态枚举是不是有问题,应该是 PayRefundTypeEnum 吧 您这填写的是 PayOrderNotifyStatusEnum 回调状态枚举 + order.setRefundStatus(PayOrderNotifyStatusEnum.NO.getStatus()) + .setRefundTimes(0).setRefundAmount(0L); + orderMapper.insert(order); + // 最终返回 + return order.getId(); + } + + @Override + public PayOrderSubmitRespDTO submitPayOrder(PayOrderSubmitReqDTO reqDTO) { + // 校验 App + appService.validPayApp(reqDTO.getAppId()); + // 校验支付渠道是否有效 + PayChannelDO channel = channelService.validPayChannel(reqDTO.getAppId(), reqDTO.getChannelCode()); + // 校验支付客户端是否正确初始化 + PayClient client = payClientFactory.getPayClient(channel.getId()); + if (client == null) { + log.error("[submitPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_CLIENT_NOT_FOUND); + } + + // 获得 PayOrderDO ,并校验其是否存在 + PayOrderDO order = orderMapper.selectById(reqDTO.getId()); + if (order == null || !Objects.equals(order.getAppId(), reqDTO.getAppId())) { // 是否存在 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_NOT_FOUND); + } + if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING); + } + + // 插入 PayOrderExtensionDO + PayOrderExtensionDO orderExtension = PayOrderConvert.INSTANCE.convert(reqDTO) + .setOrderId(order.getId()).setNo(generateOrderExtensionNo()) + .setChannelId(channel.getId()).setChannelCode(channel.getCode()) + .setStatus(PayOrderStatusEnum.WAITING.getStatus()); + orderExtensionMapper.insert(orderExtension); + + // 调用三方接口 + PayOrderUnifiedReqDTO unifiedOrderReqDTO = PayOrderConvert.INSTANCE.convert2(reqDTO); + // 商户相关字段 + //TODO jason @芋艿 是否加一个属性 如tradeNo 支付订单号, 用这个merchantOrderId让人迷糊 + unifiedOrderReqDTO.setMerchantOrderId(orderExtension.getNo()) // 注意,此处使用的是 PayOrderExtensionDO.no 属性! + .setSubject(order.getSubject()).setBody(order.getBody()) + .setNotifyUrl(genChannelPayNotifyUrl(channel)) + .setReturnUrl(genChannelReturnUrl(channel)); + // 订单相关字段 + unifiedOrderReqDTO.setAmount(order.getAmount()).setExpireTime(order.getExpireTime()); + CommonResult unifiedOrderResult = client.unifiedOrder(unifiedOrderReqDTO); + unifiedOrderResult.checkError(); + + // TODO 轮询三方接口,是否已经支付的任务 + // 返回成功 + return new PayOrderSubmitRespDTO().setExtensionId(orderExtension.getId()) + .setInvokeResponse(unifiedOrderResult.getData()); + } + + /** + * 根据支付渠道的编码,生成支付渠道的返回地址 + * @param channel 支付渠道 + * @return 支付成功返回的地址。 配置地址 + "/" + channel id + */ + private String genChannelReturnUrl(PayChannelDO channel) { + return payProperties.getPayReturnUrl() + "/" + channel.getId(); + } + + /** + * 根据支付渠道的编码,生成支付渠道的回调地址 + * + * @param channel 支付渠道 + * @return 支付渠道的回调地址 配置地址 + "/" + channel id + */ + private String genChannelPayNotifyUrl(PayChannelDO channel) { + //去掉channel code, 似乎没啥用, 用统一的回调地址 + return payProperties.getPayNotifyUrl() + "/" + channel.getId(); + } + + private String generateOrderExtensionNo() { +// wx +// 2014 +// 10 +// 27 +// 20 +// 09 +// 39 +// 5522657 +// a690389285100 + // 目前的算法 + // 时间序列,年月日时分秒 14 位 + // 纯随机,6 位 TODO TW:此处估计是会有问题的,后续在调整 + return DateUtil.format(new Date(), "yyyyMMddHHmmss") + // 时间序列 + RandomUtil.randomInt(100000, 999999) // 随机。为什么是这个范围,因为偷懒 + ; + } + + @Override + @Transactional + public void notifyPayOrder(Long channelId, PayNotifyDataDTO notifyData) throws Exception { + // TODO TW,记录回调日志 + log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData.getBody()); + + // 校验支付渠道是否有效 + PayChannelDO channel = channelService.validPayChannel(channelId); + // 校验支付客户端是否正确初始化 + PayClient client = payClientFactory.getPayClient(channel.getId()); + if (client == null) { + log.error("[notifyPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_CLIENT_NOT_FOUND); + } + + // 解析支付结果 + PayOrderNotifyRespDTO notifyRespDTO = client.parseOrderNotify(notifyData); + + // TODO TW,先最严格的校验。即使调用方重复调用,实际哪个订单已经被重复回调的支付,也返回 false 。也没问题,因为实际已经回调成功了。 + // 1.1 查询 PayOrderExtensionDO + PayOrderExtensionDO orderExtension = orderExtensionMapper.selectByNo(notifyRespDTO.getOrderExtensionNo()); + if (orderExtension == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_NOT_FOUND); + } + if (!PayOrderStatusEnum.WAITING.getStatus().equals(orderExtension.getStatus())) { // 校验状态,必须是待支付 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); + } + // 1.2 更新 PayOrderExtensionDO + //TODO 支付宝交易超时 TRADE_FINISHED 需要更新交易关闭 + int updateCounts = orderExtensionMapper.updateByIdAndStatus(orderExtension.getId(), + PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId()) + .status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(notifyData.getBody()).build()); + if (updateCounts == 0) { // 校验状态,必须是待支付 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); + } + log.info("[notifyPayOrder][支付拓展单({}) 更新为已支付]", orderExtension.getId()); + + // 2.1 判断 PayOrderDO 是否处于待支付 + PayOrderDO order = orderMapper.selectById(orderExtension.getOrderId()); + if (order == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_NOT_FOUND); + } + if (!PayOrderStatusEnum.WAITING.getStatus().equals(order.getStatus())) { // 校验状态,必须是待支付 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING); + } + // 2.2 更新 PayOrderDO + updateCounts = orderMapper.updateByIdAndStatus(order.getId(), PayOrderStatusEnum.WAITING.getStatus(), + PayOrderDO.builder().status(PayOrderStatusEnum.SUCCESS.getStatus()).channelId(channelId).channelCode(channel.getCode()) + .successTime(notifyRespDTO.getSuccessTime()).successExtensionId(orderExtension.getId()) + .channelOrderNo(notifyRespDTO.getChannelOrderNo()).channelUserId(notifyRespDTO.getChannelUserId()) + .notifyTime(new Date()).build()); + if (updateCounts == 0) { // 校验状态,必须是待支付 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_WAITING); + } + log.info("[notifyPayOrder][支付订单({}) 更新为已支付]", order.getId()); + + // 3. 插入支付通知记录 + notifyService.createPayNotifyTask(PayNotifyTaskCreateReqDTO.builder() + .type(PayNotifyTypeEnum.ORDER.getType()).dataId(order.getId()).build()); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayOrderCreateReqDTO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayOrderCreateReqDTO.java new file mode 100644 index 0000000..e1508eb --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayOrderCreateReqDTO.java @@ -0,0 +1,64 @@ +package com.jojubanking.boot.module.pay.service.order.dto; + +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + * 支付单创建 Request DTO + */ +@Data +public class PayOrderCreateReqDTO implements Serializable { + + /** + * 应用编号 + */ + @NotNull(message = "应用编号不能为空") + private Long appId; + /** + * 用户 IP + */ + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + // ========== 商户相关字段 ========== + + /** + * 商户订单编号 + */ + @NotEmpty(message = "商户订单编号不能为空") + private String merchantOrderId; + /** + * 商品标题 + */ + @NotEmpty(message = "商品标题不能为空") + @Length(max = 32, message = "商品标题不能超过 32") + private String subject; + /** + * 商品描述 + */ + @NotEmpty(message = "商品描述信息不能为空") + @Length(max = 128, message = "商品描述信息长度不能超过128") + private String body; + + // ========== 订单相关字段 ========== + + /** + * 支付金额,单位:分 + */ + @NotNull(message = "支付金额不能为空") + @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零") + private Integer amount; + + /** + * 支付过期时间 + */ + @NotNull(message = "支付过期时间不能为空") + private Date expireTime; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayOrderSubmitReqDTO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayOrderSubmitReqDTO.java new file mode 100644 index 0000000..9a154b0 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayOrderSubmitReqDTO.java @@ -0,0 +1,47 @@ +package com.jojubanking.boot.module.pay.service.order.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Map; + +/** + * 支付单提交 Request DTO + */ +@Data +@Accessors(chain = true) +public class PayOrderSubmitReqDTO implements Serializable { + + /** + * 应用编号 + */ + @NotNull(message = "应用编号不能为空") + private Long appId; + + /** + * 支付单编号 + */ + @NotNull(message = "支付单编号不能为空") + private Long id; + + /** + * 支付渠道 + */ + @NotEmpty(message = "支付渠道不能为空") + private String channelCode; + + /** + * 用户 IP + */ + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + /** + * 支付渠道的额外参数 + */ + private Map channelExtras; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayOrderSubmitRespDTO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayOrderSubmitRespDTO.java new file mode 100644 index 0000000..22672c4 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayOrderSubmitRespDTO.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.pay.service.order.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 支付单提交 Response DTO + */ +@Data +@Accessors(chain = true) +public class PayOrderSubmitRespDTO implements Serializable { + + /** + * 支付拓展单的编号 + */ + private Long extensionId; + + /** + * 调用支付渠道的响应结果 + */ + private Object invokeResponse; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayRefundReqDTO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayRefundReqDTO.java new file mode 100644 index 0000000..97171c1 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayRefundReqDTO.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.module.pay.service.order.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 退款申请单 Request DTO + */ +@Data +@Accessors(chain = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PayRefundReqDTO { + + /** + * 支付订单编号 + */ + @NotNull(message = "支付订单编号不能为空") + private Long payOrderId; + + /** + * 退款金额 + */ + @NotNull(message = "退款金额不能为空") + @DecimalMin(value = "0", inclusive = false, message = "退款金额必须大于零") + private Long amount; + + /** + * 退款原因 + */ + private String reason; + + /** + * 商户退款订单号 + */ + @NotEmpty(message = "商户退款订单号不能为空") + private String merchantRefundId; + + /** + * 用户 IP + */ + private String userIp; +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayRefundRespDTO.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayRefundRespDTO.java new file mode 100644 index 0000000..4d2f96a --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/order/dto/PayRefundRespDTO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.pay.service.order.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 退款申请单 Response DTO + */ +@Data +@Accessors(chain = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PayRefundRespDTO { + + /** + * 支付退款单编号,自增 + */ + private Long refundId; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/package-info.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/package-info.java new file mode 100644 index 0000000..3155faf --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/package-info.java @@ -0,0 +1 @@ +package com.jojubanking.boot.module.pay.service; diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/refund/PayRefundService.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/refund/PayRefundService.java new file mode 100644 index 0000000..5a36abb --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/refund/PayRefundService.java @@ -0,0 +1,61 @@ +package com.jojubanking.boot.module.pay.service.refund; + +import com.jojubanking.boot.framework.pay.core.client.dto.PayNotifyDataDTO; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.pay.dal.dataobject.refund.PayRefundDO; +import com.jojubanking.boot.module.pay.service.order.dto.PayRefundReqDTO; +import com.jojubanking.boot.module.pay.service.order.dto.PayRefundRespDTO; + +import java.util.List; + +/** + * 退款订单 Service 接口 + * + * @author aquan + */ +public interface PayRefundService { + + /** + * 获得退款订单 + * + * @param id 编号 + * @return 退款订单 + */ + PayRefundDO getRefund(Long id); + + /** + * 获得退款订单分页 + * + * @param pageReqVO 分页查询 + * @return 退款订单分页 + */ + PageResult getRefundPage(PayRefundPageReqVO pageReqVO); + + /** + * 获得退款订单列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 退款订单列表 + */ + List getRefundList(PayRefundExportReqVO exportReqVO); + + /** + * 提交退款申请 + * + * @param reqDTO 退款申请信息 + * @return 退款申请返回信息 + */ + PayRefundRespDTO submitRefundOrder(PayRefundReqDTO reqDTO); + + /** + * 渠道的退款通知 + * + * @param channelId 渠道编号 + * @param notifyData 通知数据 + * @throws Exception 退款通知异常 + */ + void notifyPayRefund(Long channelId, PayNotifyDataDTO notifyData) throws Exception; + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/refund/PayRefundServiceImpl.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/refund/PayRefundServiceImpl.java new file mode 100644 index 0000000..9549c4f --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/service/refund/PayRefundServiceImpl.java @@ -0,0 +1,261 @@ +package com.jojubanking.boot.module.pay.service.refund; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.pay.core.client.PayClient; +import com.jojubanking.boot.framework.pay.core.client.PayClientFactory; +import com.jojubanking.boot.framework.pay.core.client.PayCommonResult; +import com.jojubanking.boot.framework.pay.core.client.dto.PayNotifyDataDTO; +import com.jojubanking.boot.framework.pay.core.client.dto.PayRefundNotifyDTO; +import com.jojubanking.boot.framework.pay.core.client.dto.PayRefundUnifiedReqDTO; +import com.jojubanking.boot.framework.pay.core.client.dto.PayRefundUnifiedRespDTO; +import com.jojubanking.boot.framework.pay.core.enums.PayNotifyRefundStatusEnum; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderExtensionDO; +import com.jojubanking.boot.module.pay.dal.dataobject.refund.PayRefundDO; +import com.jojubanking.boot.module.pay.dal.mysql.order.PayOrderMapper; +import com.jojubanking.boot.module.pay.dal.mysql.refund.PayRefundMapper; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.pay.enums.ErrorCodeConstants; +import com.jojubanking.boot.module.pay.enums.notify.PayNotifyTypeEnum; +import com.jojubanking.boot.module.pay.enums.order.PayOrderNotifyStatusEnum; +import com.jojubanking.boot.module.pay.enums.order.PayOrderStatusEnum; +import com.jojubanking.boot.module.pay.enums.refund.PayRefundStatusEnum; +import com.jojubanking.boot.module.pay.enums.refund.PayRefundTypeEnum; +import com.jojubanking.boot.module.pay.service.merchant.PayAppService; +import com.jojubanking.boot.module.pay.service.merchant.PayChannelService; +import com.jojubanking.boot.module.pay.service.notify.PayNotifyService; +import com.jojubanking.boot.module.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; +import com.jojubanking.boot.module.pay.service.order.PayOrderExtensionService; +import com.jojubanking.boot.module.pay.service.order.PayOrderService; +import com.jojubanking.boot.module.pay.service.order.dto.PayRefundReqDTO; +import com.jojubanking.boot.module.pay.service.order.dto.PayRefundRespDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 退款订单 Service 实现类 + * + * @author aquan + */ +@Service +@Slf4j +@Validated +public class PayRefundServiceImpl implements PayRefundService { + + @Resource + private PayClientFactory payClientFactory; + + @Resource + private PayRefundMapper refundMapper; + @Resource + private PayOrderMapper orderMapper; // TODO @jason:需要改成不直接操作 db; + + @Resource + private PayOrderService orderService; + @Resource + private PayOrderExtensionService orderExtensionService; + @Resource + private PayAppService appService; + @Resource + private PayChannelService channelService; + @Resource + private PayNotifyService notifyService; + + @Override + public PayRefundDO getRefund(Long id) { + return refundMapper.selectById(id); + } + + @Override + public PageResult getRefundPage(PayRefundPageReqVO pageReqVO) { + return refundMapper.selectPage(pageReqVO); + } + + @Override + public List getRefundList(PayRefundExportReqVO exportReqVO) { + return refundMapper.selectList(exportReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public PayRefundRespDTO submitRefundOrder(PayRefundReqDTO req) { + // 获得 PayOrderDO + PayOrderDO order = orderService.getOrder(req.getPayOrderId()); + // 校验订单是否存在 + if (Objects.isNull(order) ) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_NOT_FOUND); + } + // 校验 App + PayAppDO app = appService.validPayApp(order.getAppId()); + // 校验支付渠道是否有效 + PayChannelDO channel = channelService.validPayChannel(order.getChannelId()); + // 校验支付客户端是否正确初始化 + PayClient client = payClientFactory.getPayClient(channel.getId()); + if (client == null) { + log.error("[refund][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_CLIENT_NOT_FOUND); + } + + // 校验退款的条件 + validatePayRefund(req, order); + // 退款类型 + PayRefundTypeEnum refundType = PayRefundTypeEnum.SOME; + if (Objects.equals(req.getAmount(), order.getAmount())) { + refundType = PayRefundTypeEnum.ALL; + } + PayOrderExtensionDO orderExtensionDO = orderExtensionService.getOrderExtension(order.getSuccessExtensionId()); + PayRefundDO payRefundDO = refundMapper.selectByTradeNoAndMerchantRefundNo(orderExtensionDO.getNo(), req.getMerchantRefundId()); + if(Objects.nonNull(payRefundDO)){ + // 退款订单已经提交过。 + //TODO 校验相同退款单的金额 + // TODO @jason:咱要不封装一个 ObjectUtils.equalsAny + if (Objects.equals(PayRefundStatusEnum.SUCCESS.getStatus(), payRefundDO.getStatus()) + || Objects.equals(PayRefundStatusEnum.CLOSE.getStatus(), payRefundDO.getStatus())) { + //已成功退款 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_SUCCEED); + } + //可以重复提交,保证 退款请求号 一致,由渠道保证幂等 + } else { + // 成功,插入退款单 状态为生成.没有和渠道交互 + // TODO @jason:搞到 convert 里。一些额外的自动,手动 set 下; + payRefundDO = PayRefundDO.builder().channelOrderNo(order.getChannelOrderNo()) + .appId(order.getAppId()) + .channelOrderNo(order.getChannelOrderNo()) + .channelCode(order.getChannelCode()) + .channelId(order.getChannelId()) + .merchantId(order.getMerchantId()) + .orderId(order.getId()) + .merchantRefundNo(req.getMerchantRefundId()) + .notifyUrl(app.getRefundNotifyUrl()) + .payAmount(order.getAmount()) + .refundAmount(req.getAmount()) + .userIp(req.getUserIp()) + .merchantOrderId(order.getMerchantOrderId()) + .tradeNo(orderExtensionDO.getNo()) + .status(PayRefundStatusEnum.CREATE.getStatus()) + .reason(req.getReason()) + .notifyStatus(PayOrderNotifyStatusEnum.NO.getStatus()) + .type(refundType.getStatus()) + .build(); + refundMapper.insert(payRefundDO); + } + // TODO @jason:搞到 convert 里。一些额外的自动,手动 set 下; + PayRefundUnifiedReqDTO unifiedReqDTO = new PayRefundUnifiedReqDTO(); + unifiedReqDTO.setUserIp(req.getUserIp()) + .setAmount(req.getAmount()) + .setChannelOrderNo(order.getChannelOrderNo()) + .setPayTradeNo(orderExtensionDO.getNo()) + .setMerchantRefundId(req.getMerchantRefundId()) + .setReason(req.getReason()); + // 向渠道发起退款申请 + PayCommonResult refundUnifiedResult = client.unifiedRefund(unifiedReqDTO); + // 检查是否失败,失败抛出业务异常。 + // TODO 渠道的异常记录。 + // TODO @jason:可以先打个 warn log 哈; + refundUnifiedResult.checkError(); + // 成功在 退款回调中处理 + return PayRefundRespDTO.builder().refundId(payRefundDO.getId()).build(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void notifyPayRefund(Long channelId, PayNotifyDataDTO notifyData) { + log.info("[notifyPayRefund][channelId({}) 回调数据({})]", channelId, notifyData.getBody()); + // 校验支付渠道是否有效 + PayChannelDO channel = channelService.validPayChannel(channelId); + // 校验支付客户端是否正确初始化 + PayClient client = payClientFactory.getPayClient(channel.getId()); + if (client == null) { + log.error("[notifyPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_CHANNEL_CLIENT_NOT_FOUND); + } + // 解析渠道退款通知数据, 统一处理 + PayRefundNotifyDTO refundNotify = client.parseRefundNotify(notifyData); + if (Objects.equals(PayNotifyRefundStatusEnum.SUCCESS,refundNotify.getStatus())){ + payRefundSuccess(refundNotify); + } else { + //TODO 支付异常, 支付宝似乎没有支付异常的通知。 + // TODO @jason:那这里可以考虑打个 error logger @芋艿 微信是否存在支付异常通知 + } + } + + private void payRefundSuccess(PayRefundNotifyDTO refundNotify) { + // 校验退款单存在 + PayRefundDO refundDO = refundMapper.selectByTradeNoAndMerchantRefundNo(refundNotify.getTradeNo(), refundNotify.getReqNo()); + if (refundDO == null) { + log.error("[payRefundSuccess][不存在 seqNo 为{} 的支付退款单]", refundNotify.getReqNo()); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_NOT_FOUND); + } + + // 得到已退金额 + PayOrderDO payOrderDO = orderService.getOrder(refundDO.getOrderId()); + Long refundedAmount = payOrderDO.getRefundAmount(); + + PayOrderStatusEnum orderStatus = PayOrderStatusEnum.SUCCESS; + if(Objects.equals(payOrderDO.getAmount(), refundedAmount+ refundDO.getRefundAmount())){ + //支付金额 = 已退金额 + 本次退款金额。 + orderStatus = PayOrderStatusEnum.CLOSED; + } + // 更新支付订单 + PayOrderDO updateOrderDO = new PayOrderDO(); + updateOrderDO.setId(refundDO.getOrderId()) + .setRefundAmount(refundedAmount + refundDO.getRefundAmount()) + .setStatus(orderStatus.getStatus()) + .setRefundTimes(payOrderDO.getRefundTimes() + 1) + .setRefundStatus(refundDO.getType()); + orderMapper.updateById(updateOrderDO); + + // 更新退款订单 + PayRefundDO updateRefundDO = new PayRefundDO(); + updateRefundDO.setId(refundDO.getId()) + .setSuccessTime(refundNotify.getRefundSuccessTime()) + .setChannelRefundNo(refundNotify.getChannelOrderNo()) + .setTradeNo(refundNotify.getTradeNo()) + .setNotifyTime(new Date()) + .setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); + refundMapper.updateById(updateRefundDO); + + // 插入退款通知记录 + // TODO 通知商户成功或者失败. 现在通知似乎没有实现, 只是回调 + notifyService.createPayNotifyTask(PayNotifyTaskCreateReqDTO.builder() + .type(PayNotifyTypeEnum.REFUND.getType()).dataId(refundDO.getId()).build()); + } + + /** + * 校验是否进行退款 + * @param req 退款申请信息 + * @param order 原始支付订单信息 + */ + private void validatePayRefund(PayRefundReqDTO req, PayOrderDO order) { + // 校验状态,必须是支付状态 + if (!PayOrderStatusEnum.SUCCESS.getStatus().equals(order.getStatus())) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_ORDER_STATUS_IS_NOT_SUCCESS); + } + // 是否已经全额退款 + if (PayRefundTypeEnum.ALL.getStatus().equals(order.getRefundStatus())) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_ALL_REFUNDED); + } + // 校验金额 退款金额不能大于 原定的金额 + if (req.getAmount() + order.getRefundAmount() > order.getAmount()){ + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_AMOUNT_EXCEED); + } + // 校验渠道订单号 + if (StrUtil.isEmpty(order.getChannelOrderNo())) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.PAY_REFUND_CHN_ORDER_NO_IS_NULL); + } + //TODO 退款的期限 退款次数的控制 + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/util/PaySeqUtils.java b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/util/PaySeqUtils.java new file mode 100644 index 0000000..040da74 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/main/java/com/jojubanking/boot/module/pay/util/PaySeqUtils.java @@ -0,0 +1,52 @@ +package com.jojubanking.boot.module.pay.util; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; + +import java.util.Date; +import java.util.concurrent.atomic.AtomicLong; + +/** + * 支付相关编号的生产 + */ +// TODO @jason:需要改造,基于 db; +public class PaySeqUtils { + + private static final AtomicLong REFUND_REQ_NO_SEQ = new AtomicLong(0L); + + private static final AtomicLong MER_REFUND_NO_SEQ = new AtomicLong(0L); + + private static final AtomicLong MER_ORDER_NO_SEQ = new AtomicLong(0L); + + /** + * 生成商户退款单号,用于测试,应该由商户系统生成 + * @return 商户退款单 + */ + public static String genMerchantRefundNo() { + return String.format("%s%s%04d", "MR", + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN), + (int) MER_REFUND_NO_SEQ.getAndIncrement() % 10000); + } + + /** + * 生成退款请求号 + * @return 退款请求号 + */ + public static String genRefundReqNo() { + return String.format("%s%s%04d", "RR", + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN), + (int) REFUND_REQ_NO_SEQ.getAndIncrement() % 10000); + } + + /** + * 生成商户订单编号号 用于测试,应该由商户系统生成 + * @return 商户订单编号 + */ + public static String genMerchantOrderNo() { + return String.format("%s%s%04d", "MO", + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN), + (int) MER_ORDER_NO_SEQ.getAndIncrement() % 10000); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/dal/dataobject/merchant/PayChannelDOTest.java b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/dal/dataobject/merchant/PayChannelDOTest.java new file mode 100644 index 0000000..3af1191 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/dal/dataobject/merchant/PayChannelDOTest.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.pay.dal.dataobject.merchant; + +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.pay.core.client.impl.wx.WXPayClientConfig; +import org.junit.jupiter.api.Test; + +public class PayChannelDOTest { + + @Test + public void testSerialization() { + PayChannelDO payChannelDO = new PayChannelDO(); + // 创建配置 + WXPayClientConfig config = new WXPayClientConfig(); + config.setAppId("wx041349c6f39b268b"); + config.setMchId("1545083881"); + config.setApiVersion(WXPayClientConfig.API_VERSION_V2); + config.setMchKey("0alL64UDQdlCwiKZ73ib7ypaIjMns06p"); + payChannelDO.setConfig(config); + + // 序列化 + String text = JsonUtils.toJsonString(payChannelDO); + System.out.println(text); + + // 反序列化 + payChannelDO = JsonUtils.parseObject(text, PayChannelDO.class); + System.out.println(payChannelDO.getConfig().getClass()); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/dal/mysql/merchant/PayChannelMapperIntegrationTest.java b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/dal/mysql/merchant/PayChannelMapperIntegrationTest.java new file mode 100644 index 0000000..d5b1dcc --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/dal/mysql/merchant/PayChannelMapperIntegrationTest.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.pay.dal.mysql.merchant; + +import cn.hutool.core.io.IoUtil; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; +import com.jojubanking.boot.framework.pay.core.client.impl.wx.WXPayClientConfig; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.jojubanking.boot.module.pay.test.BaseDbIntegrationTest; +import org.junit.jupiter.api.Test; + +import javax.annotation.Resource; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.List; + +@Resource +public class PayChannelMapperIntegrationTest extends BaseDbIntegrationTest { + + @Resource + private PayChannelMapper payChannelMapper; + + /** + * 插入 {@link PayChannelEnum#WX_PUB} 初始配置 + */ + @Test + public void testInsertWxPub() throws FileNotFoundException { + PayChannelDO payChannelDO = new PayChannelDO(); + payChannelDO.setCode(PayChannelEnum.WX_PUB.getCode()); + payChannelDO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + payChannelDO.setFeeRate(1D); + payChannelDO.setMerchantId(1L); + payChannelDO.setAppId(6L); + // 配置 + WXPayClientConfig config = new WXPayClientConfig(); + config.setAppId("wx041349c6f39b268b"); + config.setMchId("1545083881"); + config.setApiVersion(WXPayClientConfig.API_VERSION_V2); + config.setMchKey("0alL64UDQdlCwiKZ73ib7ypaIjMns06p"); + config.setPrivateKeyContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_key.pem"))); + config.setPrivateCertContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_cert.pem"))); + config.setApiV3Key("joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase"); + payChannelDO.setConfig(config); + // 执行插入 + payChannelMapper.insert(payChannelDO); + } + + // TODO @ouyang:Zfb 改成 AlipayQr + /** + * 插入 {@link PayChannelEnum#ALIPAY_QR} 初始配置 + */ + @Test + public void testInsertZfb() { + PayChannelDO payChannelDO = new PayChannelDO(); + payChannelDO.setCode(PayChannelEnum.ALIPAY_QR.getCode()); + payChannelDO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + payChannelDO.setFeeRate(1D); + payChannelDO.setMerchantId(1L); + payChannelDO.setAppId(6L); + // 配置 + AlipayPayClientConfig config = new AlipayPayClientConfig(); + config.setAppId("2021000118634035"); + config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX); + config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT); + config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8="); + config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB"); + // 创建客户端 + payChannelDO.setConfig(config); + // 执行插入 + payChannelMapper.insert(payChannelDO); + } + + /** + * 查询所有支付配置,看看是否都是 ok 的 + */ + @Test + public void testSelectList() { + List payChannels = payChannelMapper.selectList(); + System.out.println(payChannels.size()); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/service/order/PayOrderServiceIntegrationTest.java b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/service/order/PayOrderServiceIntegrationTest.java new file mode 100644 index 0000000..d94fbf2 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/service/order/PayOrderServiceIntegrationTest.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.module.pay.service.order; + +import com.jojubanking.boot.module.pay.service.merchant.PayAppServiceImpl; +import com.jojubanking.boot.module.pay.service.merchant.PayChannelServiceImpl; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderCreateReqDTO; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderSubmitReqDTO; +import com.jojubanking.boot.module.pay.test.BaseDbIntegrationTest; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.pay.config.JojuPayAutoConfiguration; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.time.Duration; + +@Import({PayOrderServiceImpl.class, PayAppServiceImpl.class, + PayChannelServiceImpl.class, JojuPayAutoConfiguration.class}) +public class PayOrderServiceIntegrationTest extends BaseDbIntegrationTest { + + @Resource + private PayOrderService payOrderService; + + @Test + public void testCreatePayOrder() { + // 构造请求 + PayOrderCreateReqDTO reqDTO = new PayOrderCreateReqDTO(); + reqDTO.setAppId(6L); + reqDTO.setUserIp("127.0.0.1"); + reqDTO.setMerchantOrderId(String.valueOf(System.currentTimeMillis())); + reqDTO.setSubject("标题"); + reqDTO.setBody("内容"); + reqDTO.setAmount(100); + reqDTO.setExpireTime(DateUtils.addTime(Duration.ofDays(1))); + // 发起请求 + payOrderService.createPayOrder(reqDTO); + } + + @Test + public void testSubmitPayOrder() { + // 构造请求 + PayOrderSubmitReqDTO reqDTO = new PayOrderSubmitReqDTO(); + reqDTO.setId(10L); + reqDTO.setAppId(6L); + reqDTO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); + reqDTO.setUserIp("127.0.0.1"); + // 发起请求 + payOrderService.submitPayOrder(reqDTO); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/service/package-info.java b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/service/package-info.java new file mode 100644 index 0000000..3155faf --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/service/package-info.java @@ -0,0 +1 @@ +package com.jojubanking.boot.module.pay.service; diff --git a/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/test/BaseDbAndRedisIntegrationTest.java b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/test/BaseDbAndRedisIntegrationTest.java new file mode 100644 index 0000000..4f98c24 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/test/BaseDbAndRedisIntegrationTest.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.pay.test; + +import com.jojubanking.boot.framework.datasource.config.JojuDataSourceAutoConfiguration; +import com.jojubanking.boot.framework.mybatis.config.JojuMybatisAutoConfiguration; +import com.jojubanking.boot.framework.redis.config.JojuRedisAutoConfiguration; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisIntegrationTest.Application.class) +@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 +public class BaseDbAndRedisIntegrationTest { + + @Import({ + // DB 配置类 + DynamicDataSourceAutoConfiguration.class, // Dynamic Datasource 配置类 + JojuDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + // MyBatis 配置类 + JojuMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + + // Redis 配置类 + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + JojuRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/test/BaseDbIntegrationTest.java b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/test/BaseDbIntegrationTest.java new file mode 100644 index 0000000..34920bf --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/test/BaseDbIntegrationTest.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.pay.test; + +import com.jojubanking.boot.framework.datasource.config.JojuDataSourceAutoConfiguration; +import com.jojubanking.boot.framework.mybatis.config.JojuMybatisAutoConfiguration; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbIntegrationTest.Application.class) +@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 +public class BaseDbIntegrationTest { + + @Import({ + // DB 配置类 + DynamicDataSourceAutoConfiguration.class, // Dynamic Datasource 配置类 + JojuDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + // MyBatis 配置类 + JojuMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + }) + public static class Application { + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/test/BaseRedisIntegrationTest.java b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/test/BaseRedisIntegrationTest.java new file mode 100644 index 0000000..265db86 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test-integration/java/cn/joju/fx/module/pay/test/BaseRedisIntegrationTest.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.pay.test; + +import com.jojubanking.boot.framework.redis.config.JojuRedisAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisIntegrationTest.Application.class) +@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 +public class BaseRedisIntegrationTest { + + @Import({ + // Redis 配置类 + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + JojuRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/test-integration/resources/application-integration-test.yaml b/joju-module-pay/joju-module-pay-biz/src/test-integration/resources/application-integration-test.yaml new file mode 100644 index 0000000..6964a88 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test-integration/resources/application-integration-test.yaml @@ -0,0 +1,93 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + autoconfigure: + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 + datasource: + druid: # Druid 【监控】相关的全局配置 + web-stat-filter: + enabled: true + dynamic: # 多数据源配置 + druid: # Druid 【连接池】相关的全局配置 + initial-size: 5 # 初始连接数 + min-idle: 10 # 最小连接池数量 + max-active: 20 # 最大连接池数量 + max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒 + time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒 + min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒 + max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒 + validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效 + test-while-idle: true + test-on-borrow: false + test-on-return: false + primary: master + datasource: + master: + name: ruoyi-vue-pro + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT + driver-class-name: com.mysql.jdbc.Driver + username: root + password: 123456 + slave: # 模拟从库,可根据自己需要修改 + name: ruoyi-vue-pro + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT + driver-class-name: com.mysql.jdbc.Driver + username: root + password: 123456 + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 6379 # 端口 + database: 0 # 数据库索引 + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 +mybatis-plus: + configuration: + map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志 + global-config: + db-config: + id-type: AUTO # 自增 ID + logic-delete-value: 1 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) + mapper-locations: classpath*:mapper/*.xml + type-aliases-package: ${joju.info.base-package}.module.*.dal.dataobject + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 +resilience4j: + ratelimiter: + instances: + backendA: + limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50 + limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500 + timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s + register-health-indicator: true # 是否注册到健康监测 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +joju: + info: + version: 1.0.0 + base-package: com.jojubanking.boot.module + pay: + pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify + refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify diff --git a/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/merchant/PayAppServiceTest.java b/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/merchant/PayAppServiceTest.java new file mode 100644 index 0000000..1b8ea8a --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/merchant/PayAppServiceTest.java @@ -0,0 +1,238 @@ +package com.jojubanking.boot.module.pay.service.merchant; + +import cn.hutool.core.util.RandomUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppPageReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppUpdateReqVO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import com.jojubanking.boot.module.pay.dal.mysql.merchant.PayAppMapper; +import com.jojubanking.boot.module.pay.dal.mysql.merchant.PayMerchantMapper; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomLongId; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.module.pay.enums.ErrorCodeConstants.PAY_APP_NOT_FOUND; +import static org.junit.jupiter.api.Assertions.*; + +@Import(PayAppServiceImpl.class) +public class PayAppServiceTest extends BaseDbUnitTest { + + @Resource + private PayAppServiceImpl appService; + + @Resource + private PayAppMapper appMapper; + + @MockBean(name = "payMerchantMapper") + private PayMerchantMapper payMerchantMapper; + + @Test + public void testCreateApp_success() { + // 准备参数 + PayAppCreateReqVO reqVO = randomPojo(PayAppCreateReqVO.class, o -> + o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus()))); + + // 调用 + Long appId = appService.createApp(reqVO); + // 断言 + assertNotNull(appId); + // 校验记录的属性是否正确 + PayAppDO app = appMapper.selectById(appId); + assertPojoEquals(reqVO, app); + } + + @Test + public void testUpdateApp_success() { + // mock 数据 + PayAppDO dbApp = randomPojo(PayAppDO.class, o -> + o.setStatus(CommonStatusEnum.DISABLE.getStatus())); + appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据 + // 准备参数 + PayAppUpdateReqVO reqVO = randomPojo(PayAppUpdateReqVO.class, o -> { + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setId(dbApp.getId()); // 设置更新的 ID + }); + + // 调用 + appService.updateApp(reqVO); + // 校验是否更新正确 + PayAppDO app = appMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, app); + } + + @Test + public void testUpdateApp_notExists() { + // 准备参数 + PayAppUpdateReqVO reqVO = randomPojo(PayAppUpdateReqVO.class, o -> + o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus()))); + // 调用, 并断言异常 + assertServiceException(() -> appService.updateApp(reqVO), PAY_APP_NOT_FOUND); + } + + @Test + public void testDeleteApp_success() { + // mock 数据 + PayAppDO dbApp = randomPojo(PayAppDO.class, o -> + o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus()))); + appMapper.insert(dbApp);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbApp.getId(); + + // 调用 + appService.deleteApp(id); + // 校验数据不存在了 + assertNull(appMapper.selectById(id)); + } + + @Test + public void testDeleteApp_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> appService.deleteApp(id), PAY_APP_NOT_FOUND); + } + + @Test + public void testGetAppPage() { + Long merchantId = 1L; + Long mismatchMerchantId = 2L; + + // mock 数据 + PayAppDO dbApp = randomPojo(PayAppDO.class, o -> { // 等会查询到 + o.setName("灿灿姐的杂货铺"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setRemark("敏敏姐的小卖铺"); + o.setPayNotifyUrl("https://www.hc.com"); + o.setRefundNotifyUrl("https://www.xm.com"); + o.setMerchantId(merchantId); + o.setCreateTime(buildTime(2021,11,20)); + }); + + // mock 数据 + PayMerchantDO dbMerchant = randomPojo(PayMerchantDO.class, o -> { // 等会查询到 + o.setId(merchantId); + o.setNo("M1008611"); + o.setName("灿哥的杂货铺"); + o.setShortName("灿灿子"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setRemark("灿哥的杂货铺"); + o.setCreateTime(buildTime(2021,11,3)); + }); + + Mockito.when(payMerchantMapper.getMerchantListByName(dbMerchant.getName())) + .thenReturn(Collections.singletonList(dbMerchant)); + + appMapper.insert(dbApp); + // 测试 name 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setName("敏敏姐的杂货铺"))); + // 测试 status 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 remark 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setRemark("灿灿姐的小卖部"))); + // 测试 payNotifyUrl 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setPayNotifyUrl("xm.com"))); + // 测试 refundNotifyUrl 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setRefundNotifyUrl("hc.com"))); + // 测试 merchantId 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setMerchantId(mismatchMerchantId))); + // 测试 createTime 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setCreateTime(buildTime(2021,12,21)))); + // 准备参数 + PayAppPageReqVO reqVO = new PayAppPageReqVO(); + reqVO.setName("灿灿姐的杂货铺"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setRemark("敏敏姐的小卖铺"); + reqVO.setPayNotifyUrl("https://www.hc.com"); + reqVO.setRefundNotifyUrl("https://www.xm.com"); + reqVO.setMerchantName(dbMerchant.getName()); + reqVO.setCreateTime((new Date[]{buildTime(2021,11,19),buildTime(2021,11,21)})); + + // 调用 + PageResult pageResult = appService.getAppPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbApp, pageResult.getList().get(0)); + } + + @Test // TODO 请修改 null 为需要的值 + public void testGetAppList() { + Long merchantId = 1L; + Long mismatchMerchantId = 2L; + + // mock 数据 + PayAppDO dbApp = randomPojo(PayAppDO.class, o -> { // 等会查询到 + o.setName("灿灿姐的杂货铺"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setRemark("敏敏姐的小卖铺"); + o.setPayNotifyUrl("https://www.hc.com"); + o.setRefundNotifyUrl("https://www.xm.com"); + o.setMerchantId(merchantId); + o.setCreateTime(buildTime(2021,11,20)); + }); + + // mock 数据 + PayMerchantDO dbMerchant = randomPojo(PayMerchantDO.class, o -> { // 等会查询到 + o.setId(merchantId); + o.setNo("M1008611"); + o.setName("灿哥的杂货铺"); + o.setShortName("灿灿子"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setRemark("灿哥的杂货铺"); + o.setCreateTime(buildTime(2021,11,3)); + }); + + Mockito.when(payMerchantMapper.getMerchantListByName(dbMerchant.getName())) + .thenReturn(Collections.singletonList(dbMerchant)); + + appMapper.insert(dbApp); + // 测试 name 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setName("敏敏姐的杂货铺"))); + // 测试 status 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 remark 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setRemark("灿灿姐的小卖部"))); + // 测试 payNotifyUrl 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setPayNotifyUrl("xm.com"))); + // 测试 refundNotifyUrl 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setRefundNotifyUrl("hc.com"))); + // 测试 merchantId 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setMerchantId(mismatchMerchantId))); + // 测试 createTime 不匹配 + appMapper.insert(cloneIgnoreId(dbApp, o -> o.setCreateTime(buildTime(2021,12,21)))); + // 准备参数 + PayAppExportReqVO reqVO = new PayAppExportReqVO(); + reqVO.setName("灿灿姐的杂货铺"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setRemark("敏敏姐的小卖铺"); + reqVO.setPayNotifyUrl("https://www.hc.com"); + reqVO.setRefundNotifyUrl("https://www.xm.com"); + reqVO.setMerchantName(dbMerchant.getName()); + reqVO.setCreateTime((new Date[]{buildTime(2021,11,19),buildTime(2021,11,21)})); + + // 调用 + List list = appService.getAppList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbApp, list.get(0)); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/merchant/PayChannelServiceTest.java b/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/merchant/PayChannelServiceTest.java new file mode 100644 index 0000000..c732c57 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/merchant/PayChannelServiceTest.java @@ -0,0 +1,399 @@ +package com.jojubanking.boot.module.pay.service.merchant; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.pay.core.client.PayClientFactory; +import com.jojubanking.boot.framework.pay.core.client.impl.alipay.AlipayPayClientConfig; +import com.jojubanking.boot.framework.pay.core.client.impl.wx.WXPayClientConfig; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelPageReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelUpdateReqVO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import com.jojubanking.boot.module.pay.dal.mysql.merchant.PayChannelMapper; +import com.alibaba.fastjson.JSON; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomLongId; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.module.pay.enums.ErrorCodeConstants.CHANNEL_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; + +@Import({PayChannelServiceImpl.class}) +public class PayChannelServiceTest extends BaseDbUnitTest { + + @Resource + private PayChannelServiceImpl channelService; + + @Resource + private PayChannelMapper channelMapper; + + @MockBean + private PayClientFactory payClientFactory; + @MockBean + private Validator validator; + + @Test + public void testCreateWechatVersion2Channel_success() { + // 准备参数 + + WXPayClientConfig v2Config = getV2Config(); + PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> { + o.setCode(PayChannelEnum.WX_PUB.getCode()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setConfig(JSON.toJSONString(v2Config)); + }); + + // 调用 + Long channelId = channelService.createChannel(reqVO); + // 断言 + assertNotNull(channelId); + // 校验记录的属性是否正确 + PayChannelDO channel = channelMapper.selectById(channelId); + assertPojoEquals(reqVO, channel, "config"); + // 关于config 对象应该拿出来重新对比 + assertPojoEquals(v2Config, channel.getConfig()); + } + + @Test + public void testCreateWechatVersion3Channel_success() { + // 准备参数 + WXPayClientConfig v3Config = getV3Config(); + PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> { + o.setCode(PayChannelEnum.WX_PUB.getCode()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setConfig(JSON.toJSONString(v3Config)); + }); + + // 调用 + Long channelId = channelService.createChannel(reqVO); + // 断言 + assertNotNull(channelId); + // 校验记录的属性是否正确 + PayChannelDO channel = channelMapper.selectById(channelId); + assertPojoEquals(reqVO, channel, "config"); + // 关于config 对象应该拿出来重新对比 + assertPojoEquals(v3Config, channel.getConfig()); + } + + @Test + public void testCreateAliPayPublicKeyChannel_success() { + // 准备参数 + + AlipayPayClientConfig payClientConfig = getPublicKeyConfig(); + PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> { + o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setConfig(JSON.toJSONString(payClientConfig)); + }); + + // 调用 + Long channelId = channelService.createChannel(reqVO); + // 断言 + assertNotNull(channelId); + // 校验记录的属性是否正确 + PayChannelDO channel = channelMapper.selectById(channelId); + assertPojoEquals(reqVO, channel, "config"); + // 关于config 对象应该拿出来重新对比 + assertPojoEquals(payClientConfig, channel.getConfig()); + + } + + @Test + public void testCreateAliPayCertificateChannel_success() { + // 准备参数 + + AlipayPayClientConfig payClientConfig = getCertificateConfig(); + PayChannelCreateReqVO reqVO = randomPojo(PayChannelCreateReqVO.class, o -> { + o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setConfig(JSON.toJSONString(payClientConfig)); + }); + + // 调用 + Long channelId = channelService.createChannel(reqVO); + // 断言 + assertNotNull(channelId); + // 校验记录的属性是否正确 + PayChannelDO channel = channelMapper.selectById(channelId); + assertPojoEquals(reqVO, channel, "config"); + // 关于config 对象应该拿出来重新对比 + assertPojoEquals(payClientConfig, channel.getConfig()); + } + + @Test + public void testUpdateChannel_success() { + // mock 数据 + AlipayPayClientConfig payClientConfig = getCertificateConfig(); + PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { + o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setConfig(payClientConfig); + }); + channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据 + // 准备参数 + AlipayPayClientConfig payClientPublicKeyConfig = getPublicKeyConfig(); + PayChannelUpdateReqVO reqVO = randomPojo(PayChannelUpdateReqVO.class, o -> { + o.setCode(dbChannel.getCode()); + o.setStatus(dbChannel.getStatus()); + o.setConfig(JSON.toJSONString(payClientPublicKeyConfig)); + o.setId(dbChannel.getId()); // 设置更新的 ID + }); + + // 调用 + channelService.updateChannel(reqVO); + // 校验是否更新正确 + PayChannelDO channel = channelMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, channel, "config"); + assertPojoEquals(payClientPublicKeyConfig, channel.getConfig()); + } + + @Test + public void testUpdateChannel_notExists() { + // 准备参数 + AlipayPayClientConfig payClientPublicKeyConfig = getPublicKeyConfig(); + PayChannelUpdateReqVO reqVO = randomPojo(PayChannelUpdateReqVO.class, o -> { + o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setConfig(JSON.toJSONString(payClientPublicKeyConfig)); + }); + + // 调用, 并断言异常 + assertServiceException(() -> channelService.updateChannel(reqVO), CHANNEL_NOT_EXISTS); + } + + @Test + public void testDeleteChannel_success() { + // mock 数据 + AlipayPayClientConfig payClientConfig = getCertificateConfig(); + PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { + o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setConfig(payClientConfig); + }); + channelMapper.insert(dbChannel);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbChannel.getId(); + + // 调用 + channelService.deleteChannel(id); + // 校验数据不存在了 + assertNull(channelMapper.selectById(id)); + } + + @Test + public void testDeleteChannel_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> channelService.deleteChannel(id), CHANNEL_NOT_EXISTS); + } + + @Test // TODO 请修改 null 为需要的值 + public void testGetChannelPage() { + // mock 数据 + AlipayPayClientConfig payClientConfig = getCertificateConfig(); + PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { // 等会查询到 + o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setRemark("灿灿子的支付渠道"); + o.setFeeRate(0.03); + o.setMerchantId(1L); + o.setAppId(1L); + o.setConfig(payClientConfig); + o.setCreateTime(buildTime(2021,11,20)); + }); + channelMapper.insert(dbChannel); + // 执行拷贝的时候会出现异常,所以在插入后要重置为null 后续在写入新的 + dbChannel.setConfig(null); + // 测试 code 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o -> { + o.setConfig(payClientConfig); + o.setCode(PayChannelEnum.WX_PUB.getCode()); + })); + // 测试 status 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o -> { + o.setConfig(payClientConfig); + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); + })); + // 测试 remark 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o ->{ + o.setConfig(payClientConfig); + o.setRemark("敏敏子的渠道"); + })); + // 测试 feeRate 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o -> { + o.setConfig(payClientConfig); + o.setFeeRate(1.23); + })); + // 测试 merchantId 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o -> { + o.setConfig(payClientConfig); + o.setMerchantId(2L); + })); + // 测试 appId 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o -> { + o.setConfig(payClientConfig); + o.setAppId(2L); + })); + // 测试 createTime 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o -> { + o.setConfig(payClientConfig); + o.setCreateTime(buildTime(2021, 10, 20)); + })); + // 准备参数 + PayChannelPageReqVO reqVO = new PayChannelPageReqVO(); + reqVO.setCode(PayChannelEnum.ALIPAY_APP.getCode()); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setRemark("灿灿子的支付渠道"); + reqVO.setFeeRate(0.03); + reqVO.setMerchantId(1L); + reqVO.setAppId(1L); + reqVO.setConfig(JSON.toJSONString(payClientConfig)); + reqVO.setCreateTime((new Date[]{buildTime(2021,11,19),buildTime(2021,11,21)})); + + // 调用 + PageResult pageResult = channelService.getChannelPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbChannel, pageResult.getList().get(0), "config"); + assertPojoEquals(payClientConfig, pageResult.getList().get(0).getConfig()); + + } + + @Test + public void testGetChannelList() { + // mock 数据 + AlipayPayClientConfig payClientConfig = getCertificateConfig(); + PayChannelDO dbChannel = randomPojo(PayChannelDO.class, o -> { // 等会查询到 + o.setCode(PayChannelEnum.ALIPAY_APP.getCode()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setRemark("灿灿子的支付渠道"); + o.setFeeRate(0.03); + o.setMerchantId(1L); + o.setAppId(1L); + o.setConfig(payClientConfig); + o.setCreateTime(buildTime(2021,11,20)); + }); + channelMapper.insert(dbChannel); + // 执行拷贝的时候会出现异常,所以在插入后要重置为null 后续在写入新的 + dbChannel.setConfig(null); + // 测试 code 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o -> { + o.setConfig(payClientConfig); + o.setCode(PayChannelEnum.WX_PUB.getCode()); + })); + // 测试 status 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o -> { + o.setConfig(payClientConfig); + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); + })); + // 测试 remark 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o ->{ + o.setConfig(payClientConfig); + o.setRemark("敏敏子的渠道"); + })); + // 测试 feeRate 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o -> { + o.setConfig(payClientConfig); + o.setFeeRate(1.23); + })); + // 测试 merchantId 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o -> { + o.setConfig(payClientConfig); + o.setMerchantId(2L); + })); + // 测试 appId 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o -> { + o.setConfig(payClientConfig); + o.setAppId(2L); + })); + // 测试 createTime 不匹配 + channelMapper.insert(cloneIgnoreId(dbChannel, o -> { + o.setConfig(payClientConfig); + o.setCreateTime(buildTime(2021, 10, 20)); + })); + // 准备参数 + PayChannelExportReqVO reqVO = new PayChannelExportReqVO(); + reqVO.setCode(PayChannelEnum.ALIPAY_APP.getCode()); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setRemark("灿灿子的支付渠道"); + reqVO.setFeeRate(0.03); + reqVO.setMerchantId(1L); + reqVO.setAppId(1L); + reqVO.setConfig(JSON.toJSONString(payClientConfig)); + reqVO.setCreateTime((new Date[]{buildTime(2021,11,19),buildTime(2021,11,21)})); + + // 调用 + List list = channelService.getChannelList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbChannel, list.get(0), "config"); + assertPojoEquals(payClientConfig, list.get(0).getConfig()); + } + + public WXPayClientConfig getV2Config() { + return new WXPayClientConfig() + .setAppId("APP00001") + .setMchId("MCH00001") + .setApiVersion(WXPayClientConfig.API_VERSION_V2) + .setMchKey("dsa1d5s6a1d6sa16d1sa56d15a61das6") + .setApiV3Key("") + .setPrivateCertContent("") + .setPrivateKeyContent(""); + } + + public WXPayClientConfig getV3Config() { + return new WXPayClientConfig() + .setAppId("APP00001") + .setMchId("MCH00001") + .setApiVersion(WXPayClientConfig.API_VERSION_V3) + .setMchKey("") + .setApiV3Key("sdadasdsadadsa") + .setPrivateKeyContent("dsa445das415d15asd16ad156as") + .setPrivateCertContent("dsadasd45asd4s5a"); + + } + + public AlipayPayClientConfig getPublicKeyConfig() { + return new AlipayPayClientConfig() + .setServerUrl(AlipayPayClientConfig.SERVER_URL_PROD) + .setAppId("APP00001") + .setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT) + .setMode(AlipayPayClientConfig.MODE_PUBLIC_KEY) + .setPrivateKey("13131321312") + .setAlipayPublicKey("13321321321") + .setAppCertContent("") + .setAlipayPublicCertContent("") + .setRootCertContent(""); + } + + public AlipayPayClientConfig getCertificateConfig() { + return new AlipayPayClientConfig() + .setServerUrl(AlipayPayClientConfig.SERVER_URL_PROD) + .setAppId("APP00001") + .setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT) + .setMode(AlipayPayClientConfig.MODE_CERTIFICATE) + .setPrivateKey("") + .setAlipayPublicKey("") + .setAppCertContent("13321321321sda") + .setAlipayPublicCertContent("13321321321aqeqw") + .setRootCertContent("13321321321dsad"); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/merchant/PayMerchantServiceTest.java b/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/merchant/PayMerchantServiceTest.java new file mode 100644 index 0000000..ad5c942 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/merchant/PayMerchantServiceTest.java @@ -0,0 +1,191 @@ +package com.jojubanking.boot.module.pay.service.merchant; + +import cn.hutool.core.util.RandomUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantPageReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantUpdateReqVO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import com.jojubanking.boot.module.pay.dal.mysql.merchant.PayMerchantMapper; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomLongId; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.module.pay.enums.ErrorCodeConstants.PAY_MERCHANT_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; + +/** +* {@link PayMerchantServiceImpl} 的单元测试类 +* +* @author aquan +*/ +@Import(PayMerchantServiceImpl.class) +public class PayMerchantServiceTest extends BaseDbUnitTest { + + @Resource + private PayMerchantServiceImpl merchantService; + + @Resource + private PayMerchantMapper merchantMapper; + + @Test + public void testCreateMerchant_success() { + // 准备参数 + PayMerchantCreateReqVO reqVO = randomPojo(PayMerchantCreateReqVO.class,o -> + o.setStatus(RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())); + + // 调用 + Long merchantId = merchantService.createMerchant(reqVO); + // 断言 + assertNotNull(merchantId); + // 校验记录的属性是否正确 + PayMerchantDO merchant = merchantMapper.selectById(merchantId); + assertPojoEquals(reqVO, merchant); + } + + @Test + public void testUpdateMerchant_success() { + // mock 数据 + PayMerchantDO dbMerchant = randomPojo(PayMerchantDO.class, o -> + o.setStatus(CommonStatusEnum.ENABLE.getStatus())); + merchantMapper.insert(dbMerchant);// @Sql: 先插入出一条存在的数据 + // 准备参数 + PayMerchantUpdateReqVO reqVO = randomPojo(PayMerchantUpdateReqVO.class, o -> { + o.setId(dbMerchant.getId()); // 设置更新的 ID + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); + }); + + // 调用 + merchantService.updateMerchant(reqVO); + // 校验是否更新正确 + PayMerchantDO merchant = merchantMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, merchant); + } + + @Test + public void testUpdateMerchant_notExists() { + // 准备参数 + PayMerchantUpdateReqVO reqVO = randomPojo(PayMerchantUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> merchantService.updateMerchant(reqVO), PAY_MERCHANT_NOT_EXISTS); + } + + @Test + public void testDeleteMerchant_success() { + // mock 数据 + PayMerchantDO dbMerchant = randomPojo(PayMerchantDO.class, + o-> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); + merchantMapper.insert(dbMerchant);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbMerchant.getId(); + + // 调用 + merchantService.deleteMerchant(id); + // 校验数据不存在了 + assertNull(merchantMapper.selectById(id)); + } + + @Test + public void testDeleteMerchant_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> merchantService.deleteMerchant(id), PAY_MERCHANT_NOT_EXISTS); + } + + @Test + public void testGetMerchantPage() { + // mock 数据 + PayMerchantDO dbMerchant = randomPojo(PayMerchantDO.class, o -> { // 等会查询到 + o.setNo("M1008611"); + o.setName("灿哥的杂货铺"); + o.setShortName("灿灿子"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setRemark("灿哥的杂货铺"); + o.setCreateTime(buildTime(2021,11,3)); + }); + merchantMapper.insert(dbMerchant); + // 测试 no 不匹配 + merchantMapper.insert(cloneIgnoreId(dbMerchant, o -> o.setNo("M200000"))); + // 测试 name 不匹配 + merchantMapper.insert(cloneIgnoreId(dbMerchant, o -> o.setName("斌哥的杂货铺"))); + // 测试 shortName 不匹配 + merchantMapper.insert(cloneIgnoreId(dbMerchant, o -> o.setShortName("斌斌子"))); + // 测试 status 不匹配 + merchantMapper.insert(cloneIgnoreId(dbMerchant, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 remark 不匹配 + merchantMapper.insert(cloneIgnoreId(dbMerchant, o -> o.setRemark("斌哥的杂货铺"))); + // 测试 createTime 不匹配 + merchantMapper.insert(cloneIgnoreId(dbMerchant, o -> o.setCreateTime(buildTime(2022,12,4)))); + // 准备参数 + PayMerchantPageReqVO reqVO = new PayMerchantPageReqVO(); + reqVO.setNo("M1008611"); + reqVO.setName("灿哥的杂货铺"); + reqVO.setShortName("灿灿子"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setRemark("灿哥的杂货铺"); + reqVO.setCreateTime((new Date[]{buildTime(2021,11,2),buildTime(2021,11,4)})); + + // 调用 + PageResult pageResult = merchantService.getMerchantPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbMerchant, pageResult.getList().get(0)); + } + + @Test + public void testGetMerchantList() { + // mock 数据 + PayMerchantDO dbMerchant = randomPojo(PayMerchantDO.class, o -> { // 等会查询到 + o.setNo("M1008611"); + o.setName("灿哥的杂货铺"); + o.setShortName("灿灿子"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setRemark("灿哥的杂货铺"); + o.setCreateTime(buildTime(2021,11,3)); + }); + merchantMapper.insert(dbMerchant); + // 测试 no 不匹配 + merchantMapper.insert(cloneIgnoreId(dbMerchant, o -> o.setNo("M200000"))); + // 测试 name 不匹配 + merchantMapper.insert(cloneIgnoreId(dbMerchant, o -> o.setName("斌哥的杂货铺"))); + // 测试 shortName 不匹配 + merchantMapper.insert(cloneIgnoreId(dbMerchant, o -> o.setShortName("斌斌子"))); + // 测试 status 不匹配 + merchantMapper.insert(cloneIgnoreId(dbMerchant, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 remark 不匹配 + merchantMapper.insert(cloneIgnoreId(dbMerchant, o -> o.setRemark("斌哥的杂货铺"))); + // 测试 createTime 不匹配 + merchantMapper.insert(cloneIgnoreId(dbMerchant, o -> o.setCreateTime(buildTime(2022,12,4)))); + // 准备参数 + PayMerchantExportReqVO reqVO = new PayMerchantExportReqVO(); + reqVO.setNo("M1008611"); + reqVO.setName("灿哥的杂货铺"); + reqVO.setShortName("灿灿子"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setRemark("灿哥的杂货铺"); + reqVO.setCreateTime((new Date[]{buildTime(2021,11,2),buildTime(2021,11,4)})); + + // 调用 + List list = merchantService.getMerchantList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbMerchant, list.get(0)); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/order/PayOrderServiceTest.java b/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/order/PayOrderServiceTest.java new file mode 100644 index 0000000..cd1ef27 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/order/PayOrderServiceTest.java @@ -0,0 +1,210 @@ +package com.jojubanking.boot.module.pay.service.order; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.pay.config.PayProperties; +import com.jojubanking.boot.framework.pay.core.client.PayClientFactory; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderPageReqVO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.dal.mysql.order.PayOrderMapper; +import com.jojubanking.boot.module.pay.enums.order.PayOrderNotifyStatusEnum; +import com.jojubanking.boot.module.pay.enums.order.PayOrderStatusEnum; +import com.jojubanking.boot.module.pay.enums.refund.PayRefundTypeEnum; +import com.jojubanking.boot.module.pay.service.merchant.PayAppService; +import com.jojubanking.boot.module.pay.service.merchant.PayChannelService; +import com.jojubanking.boot.module.pay.service.notify.PayNotifyService; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * {@link PayOrderServiceImpl} 的单元测试类 + * + * @author 芋艿 + */ +@Import({PayOrderServiceImpl.class}) +public class PayOrderServiceTest extends BaseDbUnitTest { + + @Resource + private PayOrderServiceImpl orderService; + + @Resource + private PayOrderMapper orderMapper; + + @MockBean + private PayClientFactory payClientFactory; + @MockBean + private PayProperties properties; + @MockBean + private PayAppService appService; + @MockBean + private PayChannelService channelService; + @MockBean + private PayNotifyService notifyService; + + public String generateNo() { + return DateUtil.format(new Date(), "yyyyMMddHHmmss") + RandomUtil.randomInt(100000, 999999); + } + + @Test + public void testGetOrderPage() { + + String merchantOrderId = generateNo(); + String channelOrderId = generateNo(); + + // mock 数据 + PayOrderDO dbOrder = randomPojo(PayOrderDO.class, o -> { // 等会查询到 + o.setMerchantId(1L); + o.setAppId(1L); + o.setChannelId(1L); + o.setChannelCode(PayChannelEnum.WX_PUB.getCode()); + o.setMerchantOrderId(merchantOrderId); + o.setSubject("灿灿子的炸弹猫"); + o.setBody("斌斌子送给灿灿子的炸弹猫"); + o.setNotifyUrl("https://hc.com/lbh"); + o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); + o.setAmount(10000L); + o.setChannelFeeRate(0.01); + o.setChannelFeeAmount(1L); + o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); + o.setUserIp("127.0.0.1"); + o.setCreateTime(DateUtils.buildTime(2018, 1, 1, 10, 1, 0)); + o.setExpireTime(DateUtils.buildTime(2018, 1, 1, 10, 30, 0)); + o.setSuccessTime(DateUtils.buildTime(2018, 1, 1, 10, 10, 2)); + o.setNotifyTime(DateUtils.buildTime(2018, 1, 1, 10, 10, 15)); + o.setSuccessExtensionId(1L); + o.setRefundStatus(PayRefundTypeEnum.NO.getStatus()); + o.setRefundTimes(0); + o.setRefundAmount(0L); + o.setChannelUserId("1008611"); + o.setChannelOrderNo(channelOrderId); + o.setUpdateTime(DateUtils.buildTime(2018, 1, 1, 10, 10, 15)); + }); + orderMapper.insert(dbOrder); + // 测试 merchantId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setMerchantId(2L))); + // 测试 appId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setAppId(2L))); + // 测试 channelId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setChannelId(2L))); + // 测试 channelCode 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setChannelCode(PayChannelEnum.ALIPAY_APP.getCode()))); + // 测试 merchantOrderId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setMerchantOrderId(generateNo()))); + // 测试 notifyStatus 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setNotifyStatus(PayOrderNotifyStatusEnum.FAILURE.getStatus()))); + // 测试 status 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setStatus(PayOrderStatusEnum.CLOSED.getStatus()))); + // 测试 refundStatus 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setRefundStatus(PayRefundTypeEnum.ALL.getStatus()))); + // 测试 createTime 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setCreateTime(DateUtils.buildTime(2019, 1, 1, 10, 10, + 1)))); + // 准备参数 + PayOrderPageReqVO reqVO = new PayOrderPageReqVO(); + reqVO.setMerchantId(1L); + reqVO.setAppId(1L); + reqVO.setChannelId(1L); + reqVO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); + reqVO.setMerchantOrderId(merchantOrderId); + reqVO.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); + reqVO.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); + reqVO.setRefundStatus(PayRefundTypeEnum.NO.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2018, 1, 1, 10, 1, 0),buildTime(2018, 1, 1, 10, 1, 0)})); + // 调用 + PageResult pageResult = orderService.getOrderPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbOrder, pageResult.getList().get(0)); + // assertEquals(0, dbOrder.getUpdateTime().compareTo(pageResult.getList().get(0).getUpdateTime())); + } + + @Test + public void testGetOrderList() { + // mock 数据 + String merchantOrderId = generateNo(); + String channelOrderId = generateNo(); + PayOrderDO dbOrder = randomPojo(PayOrderDO.class, o -> { // 等会查询到 + o.setMerchantId(1L); + o.setAppId(1L); + o.setChannelId(1L); + o.setChannelCode(PayChannelEnum.WX_PUB.getCode()); + o.setMerchantOrderId(merchantOrderId); + o.setSubject("灿灿子的炸弹猫"); + o.setBody("斌斌子送给灿灿子的炸弹猫"); + o.setNotifyUrl("https://hc.com/lbh"); + o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); + o.setAmount(10000L); + o.setChannelFeeRate(0.01); + o.setChannelFeeAmount(1L); + o.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); + o.setUserIp("127.0.0.1"); + o.setCreateTime(DateUtils.buildTime(2018, 1, 1, 10, 1, 0)); + o.setExpireTime(DateUtils.buildTime(2018, 1, 1, 10, 30, 0)); + o.setSuccessTime(DateUtils.buildTime(2018, 1, 1, 10, 10, 2)); + o.setNotifyTime(DateUtils.buildTime(2018, 1, 1, 10, 10, 15)); + o.setSuccessExtensionId(1L); + o.setRefundStatus(PayRefundTypeEnum.NO.getStatus()); + o.setRefundTimes(0); + o.setRefundAmount(0L); + o.setChannelUserId("1008611"); + o.setChannelOrderNo(channelOrderId); + o.setUpdateTime(DateUtils.buildTime(2018, 1, 1, 10, 10, 15)); + + }); + orderMapper.insert(dbOrder); + // 测试 merchantId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setMerchantId(2L))); + // 测试 appId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setAppId(2L))); + // 测试 channelId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setChannelId(2L))); + // 测试 channelCode 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setChannelCode(PayChannelEnum.ALIPAY_APP.getCode()))); + // 测试 merchantOrderId 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setMerchantOrderId(generateNo()))); + // 测试 notifyStatus 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setNotifyStatus(PayOrderNotifyStatusEnum.FAILURE.getStatus()))); + // 测试 status 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setStatus(PayOrderStatusEnum.CLOSED.getStatus()))); + // 测试 refundStatus 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setRefundStatus(PayRefundTypeEnum.ALL.getStatus()))); + // 测试 createTime 不匹配 + orderMapper.insert(cloneIgnoreId(dbOrder, o -> o.setCreateTime(DateUtils.buildTime(2019, 1, 1, 10, 10, + 1)))); + // 准备参数 + PayOrderExportReqVO reqVO = new PayOrderExportReqVO(); + reqVO.setMerchantId(1L); + reqVO.setAppId(1L); + reqVO.setChannelId(1L); + reqVO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); + reqVO.setMerchantOrderId(merchantOrderId); + reqVO.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); + reqVO.setStatus(PayOrderStatusEnum.SUCCESS.getStatus()); + reqVO.setRefundStatus(PayRefundTypeEnum.NO.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2018, 1, 1, 10, 1, 0),buildTime(2018, 1, 1, 10, 1, 0)})); + + // 调用 + List list = orderService.getOrderList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbOrder, list.get(0)); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/refund/PayRefundServiceTest.java b/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/refund/PayRefundServiceTest.java new file mode 100644 index 0000000..75a63fe --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test/java/com/jojubanking/boot/module/pay/service/refund/PayRefundServiceTest.java @@ -0,0 +1,194 @@ +package com.jojubanking.boot.module.pay.service.refund; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.pay.core.client.PayClientFactory; +import com.jojubanking.boot.framework.pay.core.enums.PayChannelEnum; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; +import com.jojubanking.boot.module.pay.dal.dataobject.refund.PayRefundDO; +import com.jojubanking.boot.module.pay.dal.mysql.refund.PayRefundMapper; +import com.jojubanking.boot.module.pay.enums.order.PayOrderNotifyStatusEnum; +import com.jojubanking.boot.module.pay.enums.refund.PayRefundStatusEnum; +import com.jojubanking.boot.module.pay.enums.refund.PayRefundTypeEnum; +import com.jojubanking.boot.module.pay.service.merchant.PayAppService; +import com.jojubanking.boot.module.pay.service.merchant.PayChannelService; +import com.jojubanking.boot.module.pay.service.notify.PayNotifyService; +import com.jojubanking.boot.module.pay.service.order.PayOrderExtensionService; +import com.jojubanking.boot.module.pay.service.order.PayOrderService; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Import(PayRefundServiceImpl.class) +public class PayRefundServiceTest extends BaseDbUnitTest { + + @Resource + private PayRefundServiceImpl refundService; + + @Resource + private PayRefundMapper refundMapper; + + @MockBean + private PayClientFactory payClientFactory; + @MockBean + private PayOrderService orderService; + @MockBean + private PayOrderExtensionService orderExtensionService; + @MockBean + private PayAppService appService; + @MockBean + private PayChannelService channelService; + @MockBean + private PayNotifyService notifyService; + + @Test + public void testGetRefundPage() { + // mock 数据 + PayRefundDO dbRefund = randomPojo(PayRefundDO.class, o -> { // 等会查询到 + o.setMerchantId(1L); + o.setAppId(1L); + o.setChannelId(1L); + o.setChannelCode(PayChannelEnum.WX_PUB.getCode()); + o.setOrderId(1L); + o.setTradeNo("OT0000001"); + o.setMerchantOrderId("MOT0000001"); + o.setMerchantRefundNo("MRF0000001"); + o.setNotifyUrl("https://www.cancanzi.com"); + o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); + o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); + o.setType(PayRefundTypeEnum.SOME.getStatus()); + o.setPayAmount(100L); + o.setRefundAmount(500L); + o.setReason("就是想退款了,你有意见吗"); + o.setUserIp("127.0.0.1"); + o.setChannelOrderNo("CH0000001"); + o.setChannelRefundNo("CHR0000001"); + o.setChannelErrorCode(""); + o.setChannelErrorMsg(""); + o.setChannelExtras(""); + o.setExpireTime(DateUtils.buildTime(2021, 1, 1, 10, 10, 30)); + o.setSuccessTime(DateUtils.buildTime(2021, 1, 1, 10, 10, 15)); + o.setNotifyTime(DateUtils.buildTime(2021, 1, 1, 10, 10, 20)); + o.setCreateTime(DateUtils.buildTime(2021, 1, 1, 10, 10, 10)); + o.setUpdateTime(DateUtils.buildTime(2021, 1, 1, 10, 10, 35)); + }); + refundMapper.insert(dbRefund); + // 测试 merchantId 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setMerchantId(2L))); + // 测试 appId 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setAppId(2L))); + // 测试 channelCode 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setChannelCode(PayChannelEnum.ALIPAY_APP.getCode()))); + // 测试 merchantRefundNo 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setMerchantRefundNo("MRF1111112"))); + // 测试 notifyStatus 不匹配 + refundMapper.insert( + cloneIgnoreId(dbRefund, o -> o.setNotifyStatus(PayOrderNotifyStatusEnum.FAILURE.getStatus()))); + // 测试 status 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setStatus(PayRefundStatusEnum.CLOSE.getStatus()))); + // 测试 type 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setType(PayRefundTypeEnum.ALL.getStatus()))); + // 测试 createTime 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> + o.setCreateTime(DateUtils.buildTime(2022, 1, 1, 10, 10, 10)))); + // 准备参数 + PayRefundPageReqVO reqVO = new PayRefundPageReqVO(); + reqVO.setMerchantId(1L); + reqVO.setAppId(1L); + reqVO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); + reqVO.setMerchantRefundNo("MRF0000001"); + reqVO.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); + reqVO.setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); + reqVO.setType(PayRefundTypeEnum.SOME.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2021, 1, 1, 10, 10, 10),buildTime(2021, 1, 1, 10, 10, 12)})); + + // 调用 + PageResult pageResult = refundService.getRefundPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbRefund, pageResult.getList().get(0)); + } + + @Test + public void testGetRefundList() { + // mock 数据 + PayRefundDO dbRefund = randomPojo(PayRefundDO.class, o -> { // 等会查询到 + o.setMerchantId(1L); + o.setAppId(1L); + o.setChannelId(1L); + o.setChannelCode(PayChannelEnum.WX_PUB.getCode()); + o.setOrderId(1L); + o.setTradeNo("OT0000001"); + o.setMerchantOrderId("MOT0000001"); + o.setMerchantRefundNo("MRF0000001"); + o.setNotifyUrl("https://www.cancanzi.com"); + o.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); + o.setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); + o.setType(PayRefundTypeEnum.SOME.getStatus()); + o.setPayAmount(100L); + o.setRefundAmount(500L); + o.setReason("就是想退款了,你有意见吗"); + o.setUserIp("127.0.0.1"); + o.setChannelOrderNo("CH0000001"); + o.setChannelRefundNo("CHR0000001"); + o.setChannelErrorCode(""); + o.setChannelErrorMsg(""); + o.setChannelExtras(""); + o.setExpireTime(DateUtils.buildTime(2021, 1, 1, 10, 10, 30)); + o.setSuccessTime(DateUtils.buildTime(2021, 1, 1, 10, 10, 15)); + o.setNotifyTime(DateUtils.buildTime(2021, 1, 1, 10, 10, 20)); + o.setCreateTime(DateUtils.buildTime(2021, 1, 1, 10, 10, 10)); + o.setUpdateTime(DateUtils.buildTime(2021, 1, 1, 10, 10, 35)); + }); + refundMapper.insert(dbRefund); + // 测试 merchantId 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setMerchantId(2L))); + // 测试 appId 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setAppId(2L))); + // 测试 channelCode 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setChannelCode(PayChannelEnum.ALIPAY_APP.getCode()))); + // 测试 merchantRefundNo 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setMerchantRefundNo("MRF1111112"))); + // 测试 notifyStatus 不匹配 + refundMapper.insert( + cloneIgnoreId(dbRefund, o -> o.setNotifyStatus(PayOrderNotifyStatusEnum.FAILURE.getStatus()))); + // 测试 status 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setStatus(PayRefundStatusEnum.CLOSE.getStatus()))); + // 测试 type 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> o.setType(PayRefundTypeEnum.ALL.getStatus()))); + // 测试 createTime 不匹配 + refundMapper.insert(cloneIgnoreId(dbRefund, o -> + o.setCreateTime(DateUtils.buildTime(2022, 1, 1, 10, 10, 10)))); + + // 准备参数 + PayRefundExportReqVO reqVO = new PayRefundExportReqVO(); + reqVO.setMerchantId(1L); + reqVO.setAppId(1L); + reqVO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); + reqVO.setMerchantRefundNo("MRF0000001"); + reqVO.setNotifyStatus(PayOrderNotifyStatusEnum.SUCCESS.getStatus()); + reqVO.setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); + reqVO.setType(PayRefundTypeEnum.SOME.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2021, 1, 1, 10, 10, 10),buildTime(2021, 1, 1, 10, 10, 12)})); + + // 调用 + List list = refundService.getRefundList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbRefund, list.get(0)); + } + +} diff --git a/joju-module-pay/joju-module-pay-biz/src/test/resources/application-unit-test.yaml b/joju-module-pay/joju-module-pay-biz/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000..54e0f3e --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test/resources/application-unit-test.yaml @@ -0,0 +1,49 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + sql: + init: + schema-locations: classpath:/sql/create_tables.sql + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +joju: + info: + base-package: com.jojubanking.boot.module diff --git a/joju-module-pay/joju-module-pay-biz/src/test/resources/logback.xml b/joju-module-pay/joju-module-pay-biz/src/test/resources/logback.xml new file mode 100644 index 0000000..daf756b --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test/resources/logback.xml @@ -0,0 +1,4 @@ + + + + diff --git a/joju-module-pay/joju-module-pay-biz/src/test/resources/sql/clean.sql b/joju-module-pay/joju-module-pay-biz/src/test/resources/sql/clean.sql new file mode 100644 index 0000000..7430b6b --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test/resources/sql/clean.sql @@ -0,0 +1,5 @@ +DELETE FROM pay_merchant; +DELETE FROM pay_app; +DELETE FROM pay_channel; +DELETE FROM pay_order; +DELETE FROM pay_refund; diff --git a/joju-module-pay/joju-module-pay-biz/src/test/resources/sql/create_tables.sql b/joju-module-pay/joju-module-pay-biz/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000..890fb77 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/src/test/resources/sql/create_tables.sql @@ -0,0 +1,114 @@ +CREATE TABLE IF NOT EXISTS "pay_merchant" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "no" varchar(32) NOT NULL, + "name" varchar(64) NOT NULL, + "short_name" varchar(64) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '支付商户信息'; + +CREATE TABLE IF NOT EXISTS "pay_app" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(64) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + `pay_notify_url` varchar(1024) NOT NULL, + `refund_notify_url` varchar(1024) NOT NULL, + `merchant_id` bigint(20) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '支付应用信息'; + +CREATE TABLE IF NOT EXISTS "pay_channel" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(32) NOT NULL, + "status" tinyint(4) NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "fee_rate" double NOT NULL DEFAULT 0, + "merchant_id" bigint(20) NOT NULL, + "app_id" bigint(20) NOT NULL, + "config" varchar(10240) NOT NULL, + "creator" varchar(64) NULL DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) NULL DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '支付渠道'; + +CREATE TABLE IF NOT EXISTS `pay_order` ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `merchant_id` bigint(20) NOT NULL, + `app_id` bigint(20) NOT NULL, + `channel_id` bigint(20) DEFAULT NULL, + `channel_code` varchar(32) DEFAULT NULL, + `merchant_order_id` varchar(64) NOT NULL, + `subject` varchar(32) NOT NULL, + `body` varchar(128) NOT NULL, + `notify_url` varchar(1024) NOT NULL, + `notify_status` tinyint(4) NOT NULL, + `amount` bigint(20) NOT NULL, + `channel_fee_rate` double DEFAULT 0, + `channel_fee_amount` bigint(20) DEFAULT 0, + `status` tinyint(4) NOT NULL, + `user_ip` varchar(50) NOT NULL, + `expire_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `success_time` datetime(0) DEFAULT CURRENT_TIMESTAMP, + `notify_time` datetime(0) DEFAULT CURRENT_TIMESTAMP, + `success_extension_id` bigint(20) DEFAULT NULL COMMENT '支付成功的订单拓展单编号', + `refund_status` tinyint(4) NOT NULL, + `refund_times` tinyint(4) NOT NULL, + `refund_amount` bigint(20) NOT NULL, + `channel_user_id` varchar(255) DEFAULT NULL, + `channel_order_no` varchar(64) DEFAULT NULL, + `creator` varchar(64) DEFAULT '', + `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '支付订单'; + +CREATE TABLE IF NOT EXISTS `pay_refund` ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `merchant_id` bigint(20) NOT NULL, + `app_id` bigint(20) NOT NULL, + `channel_id` bigint(20) NOT NULL, + `channel_code` varchar(32) NOT NULL, + `order_id` bigint(20) NOT NULL, + `trade_no` varchar(64) NOT NULL, + `merchant_order_id` varchar(64) NOT NULL, + `merchant_refund_no` varchar(64) NOT NULL, + `notify_url` varchar(1024) NOT NULL, + `notify_status` tinyint(4) NOT NULL, + `status` tinyint(4) NOT NULL, + `type` tinyint(4) NOT NULL, + `pay_amount` bigint(20) NOT NULL, + `refund_amount` bigint(20) NOT NULL, + `reason` varchar(256) NOT NULL, + `user_ip` varchar(50) NULL DEFAULT NULL, + `channel_order_no` varchar(64) NOT NULL, + `channel_refund_no` varchar(64) NULL DEFAULT NULL, + `channel_error_code` varchar(128) NULL DEFAULT NULL, + `channel_error_msg` varchar(256) NULL DEFAULT NULL, + `channel_extras` varchar(1024) NULL DEFAULT NULL, + `expire_time` datetime(0) NULL DEFAULT NULL, + `success_time` datetime(0) NULL DEFAULT NULL, + `notify_time` datetime(0) NULL DEFAULT NULL, + `creator` varchar(64) NULL DEFAULT '', + `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) NULL DEFAULT '', + `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '退款订单'; diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/PayAppController.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/PayAppController.class new file mode 100644 index 0000000..1f018ce Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/PayAppController.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/PayChannelController.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/PayChannelController.class new file mode 100644 index 0000000..780492e Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/PayChannelController.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/PayMerchantController.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/PayMerchantController.class new file mode 100644 index 0000000..d3aea85 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/PayMerchantController.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppBaseVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppBaseVO.class new file mode 100644 index 0000000..a8a6fdd Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppBaseVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppCreateReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppCreateReqVO.class new file mode 100644 index 0000000..30a5fca Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppCreateReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppExcelVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppExcelVO.class new file mode 100644 index 0000000..3f70a62 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppExcelVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppExportReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppExportReqVO.class new file mode 100644 index 0000000..71e1d69 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppExportReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageItemRespVO$PayMerchant.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageItemRespVO$PayMerchant.class new file mode 100644 index 0000000..a2729b2 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageItemRespVO$PayMerchant.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageItemRespVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageItemRespVO.class new file mode 100644 index 0000000..e72867b Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageItemRespVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageReqVO.class new file mode 100644 index 0000000..60a99ba Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppPageReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppRespVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppRespVO.class new file mode 100644 index 0000000..ed16c4a Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppRespVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppUpdateReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppUpdateReqVO.class new file mode 100644 index 0000000..7678815 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppUpdateReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppUpdateStatusReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppUpdateStatusReqVO.class new file mode 100644 index 0000000..5d0da5f Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/app/PayAppUpdateStatusReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelBaseVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelBaseVO.class new file mode 100644 index 0000000..f61765f Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelBaseVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelCreateReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelCreateReqVO.class new file mode 100644 index 0000000..68c6f36 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelCreateReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelExcelVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelExcelVO.class new file mode 100644 index 0000000..3d1f327 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelExcelVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelExportReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelExportReqVO.class new file mode 100644 index 0000000..f861225 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelExportReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelPageReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelPageReqVO.class new file mode 100644 index 0000000..0aee13f Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelPageReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelRespVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelRespVO.class new file mode 100644 index 0000000..3f98bd5 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelRespVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelUpdateReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelUpdateReqVO.class new file mode 100644 index 0000000..62a863e Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/channel/PayChannelUpdateReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantBaseVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantBaseVO.class new file mode 100644 index 0000000..fee605a Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantBaseVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantCreateReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantCreateReqVO.class new file mode 100644 index 0000000..5e85502 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantCreateReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExcelVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExcelVO.class new file mode 100644 index 0000000..048c1d8 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExcelVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExportReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExportReqVO.class new file mode 100644 index 0000000..681c45c Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantExportReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantPageReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantPageReqVO.class new file mode 100644 index 0000000..df67e1d Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantPageReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantRespVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantRespVO.class new file mode 100644 index 0000000..ec2b9b0 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantRespVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateReqVO.class new file mode 100644 index 0000000..4d47397 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateStatusReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateStatusReqVO.class new file mode 100644 index 0000000..bacd25e Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/merchant/vo/merchant/PayMerchantUpdateStatusReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/PayOrderController.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/PayOrderController.class new file mode 100644 index 0000000..558ebf6 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/PayOrderController.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderBaseVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderBaseVO.class new file mode 100644 index 0000000..2e5c288 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderBaseVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO$PayOrderExtension.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO$PayOrderExtension.class new file mode 100644 index 0000000..268785b Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO$PayOrderExtension.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.class new file mode 100644 index 0000000..49ce83d Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderDetailsRespVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderExcelVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderExcelVO.class new file mode 100644 index 0000000..b08b46c Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderExcelVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderExportReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderExportReqVO.class new file mode 100644 index 0000000..266e6d4 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderExportReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.class new file mode 100644 index 0000000..fb991e7 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderPageItemRespVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderPageReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderPageReqVO.class new file mode 100644 index 0000000..27fbfa3 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderPageReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderRespVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderRespVO.class new file mode 100644 index 0000000..91c394f Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/order/vo/PayOrderRespVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/PayRefundController.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/PayRefundController.class new file mode 100644 index 0000000..324300c Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/PayRefundController.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundBaseVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundBaseVO.class new file mode 100644 index 0000000..674b29f Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundBaseVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundCreateReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundCreateReqVO.class new file mode 100644 index 0000000..108f053 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundCreateReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.class new file mode 100644 index 0000000..dd3e669 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundExcelVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundExcelVO.class new file mode 100644 index 0000000..8eb4d3b Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundExcelVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.class new file mode 100644 index 0000000..1435bd9 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.class new file mode 100644 index 0000000..d212ed7 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.class new file mode 100644 index 0000000..0ae4e49 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundRespVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundRespVO.class new file mode 100644 index 0000000..1d62779 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundRespVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundUpdateReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundUpdateReqVO.class new file mode 100644 index 0000000..f4c3fd9 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/admin/refund/vo/PayRefundUpdateReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/order/AppPayOrderController.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/order/AppPayOrderController.class new file mode 100644 index 0000000..bfd4ace Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/order/AppPayOrderController.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.class new file mode 100644 index 0000000..6aa02a2 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO$AppPayOrderSubmitRespVOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO$AppPayOrderSubmitRespVOBuilder.class new file mode 100644 index 0000000..6e53772 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO$AppPayOrderSubmitRespVOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.class new file mode 100644 index 0000000..0fabd66 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/order/vo/AppPayOrderSubmitRespVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/refund/AppPayRefundController.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/refund/AppPayRefundController.class new file mode 100644 index 0000000..eb33c14 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/refund/AppPayRefundController.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundReqVO.class new file mode 100644 index 0000000..bde53fc Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundRespVO$AppPayRefundRespVOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundRespVO$AppPayRefundRespVOBuilder.class new file mode 100644 index 0000000..5315706 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundRespVO$AppPayRefundRespVOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundRespVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundRespVO.class new file mode 100644 index 0000000..244b1ea Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/controller/app/refund/vo/AppPayRefundRespVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/app/PayAppConvert.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/app/PayAppConvert.class new file mode 100644 index 0000000..5b6e707 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/app/PayAppConvert.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/app/PayAppConvertImpl.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/app/PayAppConvertImpl.class new file mode 100644 index 0000000..5231df1 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/app/PayAppConvertImpl.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/channel/PayChannelConvert.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/channel/PayChannelConvert.class new file mode 100644 index 0000000..2596ea1 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/channel/PayChannelConvert.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/channel/PayChannelConvertImpl.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/channel/PayChannelConvertImpl.class new file mode 100644 index 0000000..cd34a03 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/channel/PayChannelConvertImpl.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/merchant/PayMerchantConvert.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/merchant/PayMerchantConvert.class new file mode 100644 index 0000000..acc63bc Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/merchant/PayMerchantConvert.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/merchant/PayMerchantConvertImpl.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/merchant/PayMerchantConvertImpl.class new file mode 100644 index 0000000..8138f58 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/merchant/PayMerchantConvertImpl.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/order/PayOrderConvert.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/order/PayOrderConvert.class new file mode 100644 index 0000000..620c38d Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/order/PayOrderConvert.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/order/PayOrderConvertImpl.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/order/PayOrderConvertImpl.class new file mode 100644 index 0000000..78f3c99 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/order/PayOrderConvertImpl.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/refund/PayRefundConvert.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/refund/PayRefundConvert.class new file mode 100644 index 0000000..b6bd008 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/refund/PayRefundConvert.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/refund/PayRefundConvertImpl.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/refund/PayRefundConvertImpl.class new file mode 100644 index 0000000..ff2bd5d Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/convert/refund/PayRefundConvertImpl.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayAppDO$PayAppDOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayAppDO$PayAppDOBuilder.class new file mode 100644 index 0000000..48ca1f7 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayAppDO$PayAppDOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayAppDO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayAppDO.class new file mode 100644 index 0000000..ea78dc2 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayAppDO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayChannelDO$PayChannelDOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayChannelDO$PayChannelDOBuilder.class new file mode 100644 index 0000000..405379f Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayChannelDO$PayChannelDOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayChannelDO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayChannelDO.class new file mode 100644 index 0000000..163a91b Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayChannelDO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayMerchantDO$PayMerchantDOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayMerchantDO$PayMerchantDOBuilder.class new file mode 100644 index 0000000..e35ddfa Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayMerchantDO$PayMerchantDOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayMerchantDO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayMerchantDO.class new file mode 100644 index 0000000..462497e Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/merchant/PayMerchantDO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyLogDO$PayNotifyLogDOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyLogDO$PayNotifyLogDOBuilder.class new file mode 100644 index 0000000..df0eb0f Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyLogDO$PayNotifyLogDOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyLogDO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyLogDO.class new file mode 100644 index 0000000..c93777f Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyLogDO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyTaskDO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyTaskDO.class new file mode 100644 index 0000000..43b318f Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/notify/PayNotifyTaskDO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderDO$PayOrderDOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderDO$PayOrderDOBuilder.class new file mode 100644 index 0000000..4b9ac1f Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderDO$PayOrderDOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderDO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderDO.class new file mode 100644 index 0000000..b801738 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderDO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderExtensionDO$PayOrderExtensionDOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderExtensionDO$PayOrderExtensionDOBuilder.class new file mode 100644 index 0000000..69f0c98 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderExtensionDO$PayOrderExtensionDOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderExtensionDO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderExtensionDO.class new file mode 100644 index 0000000..11e3647 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/order/PayOrderExtensionDO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/refund/PayRefundDO$PayRefundDOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/refund/PayRefundDO$PayRefundDOBuilder.class new file mode 100644 index 0000000..9922476 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/refund/PayRefundDO$PayRefundDOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/refund/PayRefundDO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/refund/PayRefundDO.class new file mode 100644 index 0000000..ea8569a Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/dataobject/refund/PayRefundDO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayAppMapper.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayAppMapper.class new file mode 100644 index 0000000..5fbf48e Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayAppMapper.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayChannelMapper.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayChannelMapper.class new file mode 100644 index 0000000..c79c3ac Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayChannelMapper.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayMerchantMapper.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayMerchantMapper.class new file mode 100644 index 0000000..63b25ed Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/merchant/PayMerchantMapper.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/notify/PayNotifyLogCoreMapper.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/notify/PayNotifyLogCoreMapper.class new file mode 100644 index 0000000..7d8c5a5 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/notify/PayNotifyLogCoreMapper.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.class new file mode 100644 index 0000000..6d4e4e7 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/notify/PayNotifyTaskCoreMapper.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/order/PayOrderExtensionMapper.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/order/PayOrderExtensionMapper.class new file mode 100644 index 0000000..56d23ed Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/order/PayOrderExtensionMapper.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/order/PayOrderMapper.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/order/PayOrderMapper.class new file mode 100644 index 0000000..98bb819 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/order/PayOrderMapper.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/refund/PayRefundMapper.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/refund/PayRefundMapper.class new file mode 100644 index 0000000..0f1ad04 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/mysql/refund/PayRefundMapper.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/redis/RedisKeyConstants.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/redis/RedisKeyConstants.class new file mode 100644 index 0000000..05e3eaf Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/redis/RedisKeyConstants.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.class new file mode 100644 index 0000000..63c8c2e Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/dal/redis/notify/PayNotifyLockRedisDAO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/notify/PayNotifyStatusEnum.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/notify/PayNotifyStatusEnum.class new file mode 100644 index 0000000..066b398 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/notify/PayNotifyStatusEnum.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/notify/PayNotifyTypeEnum.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/notify/PayNotifyTypeEnum.class new file mode 100644 index 0000000..0ce03ca Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/notify/PayNotifyTypeEnum.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/order/PayOrderNotifyStatusEnum.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/order/PayOrderNotifyStatusEnum.class new file mode 100644 index 0000000..10bed0d Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/order/PayOrderNotifyStatusEnum.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/order/PayOrderStatusEnum.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/order/PayOrderStatusEnum.class new file mode 100644 index 0000000..4f6cc8c Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/order/PayOrderStatusEnum.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/refund/PayRefundStatusEnum.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/refund/PayRefundStatusEnum.class new file mode 100644 index 0000000..f654189 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/refund/PayRefundStatusEnum.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/refund/PayRefundTypeEnum.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/refund/PayRefundTypeEnum.class new file mode 100644 index 0000000..b069bc7 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/enums/refund/PayRefundTypeEnum.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/framework/job/config/PayJobConfiguration.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/framework/job/config/PayJobConfiguration.class new file mode 100644 index 0000000..3a8dd5a Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/framework/job/config/PayJobConfiguration.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/job/notify/PayNotifyJob.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/job/notify/PayNotifyJob.class new file mode 100644 index 0000000..aa1444b Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/job/notify/PayNotifyJob.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayAppService.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayAppService.class new file mode 100644 index 0000000..cadee8e Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayAppService.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayAppServiceImpl.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayAppServiceImpl.class new file mode 100644 index 0000000..13adcbf Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayAppServiceImpl.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayChannelService.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayChannelService.class new file mode 100644 index 0000000..6a13937 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayChannelService.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayChannelServiceImpl.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayChannelServiceImpl.class new file mode 100644 index 0000000..b9d4b27 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayChannelServiceImpl.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayMerchantService.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayMerchantService.class new file mode 100644 index 0000000..48e8912 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayMerchantService.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayMerchantServiceImpl.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayMerchantServiceImpl.class new file mode 100644 index 0000000..ce70d15 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/merchant/PayMerchantServiceImpl.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/PayNotifyService.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/PayNotifyService.class new file mode 100644 index 0000000..002bbdb Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/PayNotifyService.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/PayNotifyServiceImpl.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/PayNotifyServiceImpl.class new file mode 100644 index 0000000..bc001a3 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/PayNotifyServiceImpl.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/dto/PayNotifyTaskCreateReqDTO$PayNotifyTaskCreateReqDTOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/dto/PayNotifyTaskCreateReqDTO$PayNotifyTaskCreateReqDTOBuilder.class new file mode 100644 index 0000000..b04524b Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/dto/PayNotifyTaskCreateReqDTO$PayNotifyTaskCreateReqDTOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.class new file mode 100644 index 0000000..38fe9ff Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/dto/PayNotifyTaskCreateReqDTO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/vo/PayNotifyOrderReqVO$PayNotifyOrderReqVOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/vo/PayNotifyOrderReqVO$PayNotifyOrderReqVOBuilder.class new file mode 100644 index 0000000..b58f34c Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/vo/PayNotifyOrderReqVO$PayNotifyOrderReqVOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/vo/PayNotifyOrderReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/vo/PayNotifyOrderReqVO.class new file mode 100644 index 0000000..83a2fed Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/vo/PayNotifyOrderReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/vo/PayRefundOrderReqVO$PayRefundOrderReqVOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/vo/PayRefundOrderReqVO$PayRefundOrderReqVOBuilder.class new file mode 100644 index 0000000..4870689 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/vo/PayRefundOrderReqVO$PayRefundOrderReqVOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/vo/PayRefundOrderReqVO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/vo/PayRefundOrderReqVO.class new file mode 100644 index 0000000..cc91da9 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/notify/vo/PayRefundOrderReqVO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/PayOrderExtensionService.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/PayOrderExtensionService.class new file mode 100644 index 0000000..5371b7c Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/PayOrderExtensionService.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/PayOrderExtensionServiceImpl.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/PayOrderExtensionServiceImpl.class new file mode 100644 index 0000000..3ce9330 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/PayOrderExtensionServiceImpl.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/PayOrderService.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/PayOrderService.class new file mode 100644 index 0000000..500520f Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/PayOrderService.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/PayOrderServiceImpl.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/PayOrderServiceImpl.class new file mode 100644 index 0000000..ec5f04b Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/PayOrderServiceImpl.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayOrderCreateReqDTO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayOrderCreateReqDTO.class new file mode 100644 index 0000000..5799557 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayOrderCreateReqDTO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayOrderSubmitReqDTO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayOrderSubmitReqDTO.class new file mode 100644 index 0000000..7dd29c1 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayOrderSubmitReqDTO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayOrderSubmitRespDTO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayOrderSubmitRespDTO.class new file mode 100644 index 0000000..9804550 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayOrderSubmitRespDTO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayRefundReqDTO$PayRefundReqDTOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayRefundReqDTO$PayRefundReqDTOBuilder.class new file mode 100644 index 0000000..1302bbf Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayRefundReqDTO$PayRefundReqDTOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayRefundReqDTO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayRefundReqDTO.class new file mode 100644 index 0000000..6a285b2 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayRefundReqDTO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayRefundRespDTO$PayRefundRespDTOBuilder.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayRefundRespDTO$PayRefundRespDTOBuilder.class new file mode 100644 index 0000000..ef73495 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayRefundRespDTO$PayRefundRespDTOBuilder.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayRefundRespDTO.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayRefundRespDTO.class new file mode 100644 index 0000000..f34dfd8 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/order/dto/PayRefundRespDTO.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/refund/PayRefundService.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/refund/PayRefundService.class new file mode 100644 index 0000000..4069c42 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/refund/PayRefundService.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/refund/PayRefundServiceImpl.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/refund/PayRefundServiceImpl.class new file mode 100644 index 0000000..098d7f6 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/service/refund/PayRefundServiceImpl.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/util/PaySeqUtils.class b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/util/PaySeqUtils.class new file mode 100644 index 0000000..50d0dc3 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/classes/com/jojubanking/boot/module/pay/util/PaySeqUtils.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/app/PayAppConvertImpl.java b/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/app/PayAppConvertImpl.java new file mode 100644 index 0000000..216d411 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/app/PayAppConvertImpl.java @@ -0,0 +1,174 @@ +package com.jojubanking.boot.module.pay.convert.app; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppExcelVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppPageItemRespVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppPageItemRespVO.PayMerchant; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppRespVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.app.PayAppUpdateReqVO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayAppDO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:33+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class PayAppConvertImpl implements PayAppConvert { + + @Override + public PayAppPageItemRespVO pageConvert(PayAppDO bean) { + if ( bean == null ) { + return null; + } + + PayAppPageItemRespVO payAppPageItemRespVO = new PayAppPageItemRespVO(); + + payAppPageItemRespVO.setName( bean.getName() ); + payAppPageItemRespVO.setStatus( bean.getStatus() ); + payAppPageItemRespVO.setRemark( bean.getRemark() ); + payAppPageItemRespVO.setPayNotifyUrl( bean.getPayNotifyUrl() ); + payAppPageItemRespVO.setRefundNotifyUrl( bean.getRefundNotifyUrl() ); + payAppPageItemRespVO.setMerchantId( bean.getMerchantId() ); + payAppPageItemRespVO.setId( bean.getId() ); + payAppPageItemRespVO.setCreateTime( bean.getCreateTime() ); + + return payAppPageItemRespVO; + } + + @Override + public PayMerchant convert(PayMerchantDO bean) { + if ( bean == null ) { + return null; + } + + PayMerchant payMerchant = new PayMerchant(); + + payMerchant.setId( bean.getId() ); + payMerchant.setName( bean.getName() ); + + return payMerchant; + } + + @Override + public PayAppDO convert(PayAppCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + PayAppDO payAppDO = new PayAppDO(); + + payAppDO.setName( bean.getName() ); + payAppDO.setStatus( bean.getStatus() ); + payAppDO.setRemark( bean.getRemark() ); + payAppDO.setPayNotifyUrl( bean.getPayNotifyUrl() ); + payAppDO.setRefundNotifyUrl( bean.getRefundNotifyUrl() ); + payAppDO.setMerchantId( bean.getMerchantId() ); + + return payAppDO; + } + + @Override + public PayAppDO convert(PayAppUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + PayAppDO payAppDO = new PayAppDO(); + + payAppDO.setId( bean.getId() ); + payAppDO.setName( bean.getName() ); + payAppDO.setStatus( bean.getStatus() ); + payAppDO.setRemark( bean.getRemark() ); + payAppDO.setPayNotifyUrl( bean.getPayNotifyUrl() ); + payAppDO.setRefundNotifyUrl( bean.getRefundNotifyUrl() ); + payAppDO.setMerchantId( bean.getMerchantId() ); + + return payAppDO; + } + + @Override + public PayAppRespVO convert(PayAppDO bean) { + if ( bean == null ) { + return null; + } + + PayAppRespVO payAppRespVO = new PayAppRespVO(); + + payAppRespVO.setName( bean.getName() ); + payAppRespVO.setStatus( bean.getStatus() ); + payAppRespVO.setRemark( bean.getRemark() ); + payAppRespVO.setPayNotifyUrl( bean.getPayNotifyUrl() ); + payAppRespVO.setRefundNotifyUrl( bean.getRefundNotifyUrl() ); + payAppRespVO.setMerchantId( bean.getMerchantId() ); + payAppRespVO.setId( bean.getId() ); + payAppRespVO.setCreateTime( bean.getCreateTime() ); + + return payAppRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PayAppDO payAppDO : list ) { + list1.add( convert( payAppDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PayAppDO payAppDO : list ) { + list1.add( payAppDOToPayAppExcelVO( payAppDO ) ); + } + + return list1; + } + + protected PayAppExcelVO payAppDOToPayAppExcelVO(PayAppDO payAppDO) { + if ( payAppDO == null ) { + return null; + } + + PayAppExcelVO payAppExcelVO = new PayAppExcelVO(); + + payAppExcelVO.setId( payAppDO.getId() ); + payAppExcelVO.setName( payAppDO.getName() ); + payAppExcelVO.setStatus( payAppDO.getStatus() ); + payAppExcelVO.setRemark( payAppDO.getRemark() ); + payAppExcelVO.setPayNotifyUrl( payAppDO.getPayNotifyUrl() ); + payAppExcelVO.setRefundNotifyUrl( payAppDO.getRefundNotifyUrl() ); + payAppExcelVO.setMerchantId( payAppDO.getMerchantId() ); + payAppExcelVO.setCreateTime( payAppDO.getCreateTime() ); + + return payAppExcelVO; + } +} diff --git a/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/channel/PayChannelConvertImpl.java b/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/channel/PayChannelConvertImpl.java new file mode 100644 index 0000000..cd7295e --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/channel/PayChannelConvertImpl.java @@ -0,0 +1,139 @@ +package com.jojubanking.boot.module.pay.convert.channel; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelExcelVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelRespVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.channel.PayChannelUpdateReqVO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayChannelDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:33+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class PayChannelConvertImpl implements PayChannelConvert { + + @Override + public PayChannelDO convert(PayChannelCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + PayChannelDO payChannelDO = new PayChannelDO(); + + payChannelDO.setCode( bean.getCode() ); + payChannelDO.setStatus( bean.getStatus() ); + payChannelDO.setFeeRate( bean.getFeeRate() ); + payChannelDO.setRemark( bean.getRemark() ); + payChannelDO.setMerchantId( bean.getMerchantId() ); + payChannelDO.setAppId( bean.getAppId() ); + + return payChannelDO; + } + + @Override + public PayChannelDO convert(PayChannelUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + PayChannelDO payChannelDO = new PayChannelDO(); + + payChannelDO.setId( bean.getId() ); + payChannelDO.setCode( bean.getCode() ); + payChannelDO.setStatus( bean.getStatus() ); + payChannelDO.setFeeRate( bean.getFeeRate() ); + payChannelDO.setRemark( bean.getRemark() ); + payChannelDO.setMerchantId( bean.getMerchantId() ); + payChannelDO.setAppId( bean.getAppId() ); + + return payChannelDO; + } + + @Override + public PayChannelRespVO convert(PayChannelDO bean) { + if ( bean == null ) { + return null; + } + + PayChannelRespVO payChannelRespVO = new PayChannelRespVO(); + + payChannelRespVO.setCode( bean.getCode() ); + payChannelRespVO.setStatus( bean.getStatus() ); + payChannelRespVO.setRemark( bean.getRemark() ); + payChannelRespVO.setFeeRate( bean.getFeeRate() ); + payChannelRespVO.setMerchantId( bean.getMerchantId() ); + payChannelRespVO.setAppId( bean.getAppId() ); + payChannelRespVO.setId( bean.getId() ); + payChannelRespVO.setCreateTime( bean.getCreateTime() ); + + payChannelRespVO.setConfig( com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString(bean.getConfig()) ); + + return payChannelRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PayChannelDO payChannelDO : list ) { + list1.add( convert( payChannelDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PayChannelDO payChannelDO : list ) { + list1.add( payChannelDOToPayChannelExcelVO( payChannelDO ) ); + } + + return list1; + } + + protected PayChannelExcelVO payChannelDOToPayChannelExcelVO(PayChannelDO payChannelDO) { + if ( payChannelDO == null ) { + return null; + } + + PayChannelExcelVO payChannelExcelVO = new PayChannelExcelVO(); + + payChannelExcelVO.setId( payChannelDO.getId() ); + payChannelExcelVO.setCode( payChannelDO.getCode() ); + payChannelExcelVO.setStatus( payChannelDO.getStatus() ); + payChannelExcelVO.setRemark( payChannelDO.getRemark() ); + payChannelExcelVO.setFeeRate( payChannelDO.getFeeRate() ); + payChannelExcelVO.setMerchantId( payChannelDO.getMerchantId() ); + payChannelExcelVO.setAppId( payChannelDO.getAppId() ); + payChannelExcelVO.setCreateTime( payChannelDO.getCreateTime() ); + + return payChannelExcelVO; + } +} diff --git a/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/merchant/PayMerchantConvertImpl.java b/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/merchant/PayMerchantConvertImpl.java new file mode 100644 index 0000000..50ab7dd --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/merchant/PayMerchantConvertImpl.java @@ -0,0 +1,131 @@ +package com.jojubanking.boot.module.pay.convert.merchant; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantExcelVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantRespVO; +import com.jojubanking.boot.module.pay.controller.admin.merchant.vo.merchant.PayMerchantUpdateReqVO; +import com.jojubanking.boot.module.pay.dal.dataobject.merchant.PayMerchantDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:33+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class PayMerchantConvertImpl implements PayMerchantConvert { + + @Override + public PayMerchantDO convert(PayMerchantCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + PayMerchantDO payMerchantDO = new PayMerchantDO(); + + payMerchantDO.setName( bean.getName() ); + payMerchantDO.setShortName( bean.getShortName() ); + payMerchantDO.setStatus( bean.getStatus() ); + payMerchantDO.setRemark( bean.getRemark() ); + + return payMerchantDO; + } + + @Override + public PayMerchantDO convert(PayMerchantUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + PayMerchantDO payMerchantDO = new PayMerchantDO(); + + payMerchantDO.setId( bean.getId() ); + payMerchantDO.setName( bean.getName() ); + payMerchantDO.setShortName( bean.getShortName() ); + payMerchantDO.setStatus( bean.getStatus() ); + payMerchantDO.setRemark( bean.getRemark() ); + + return payMerchantDO; + } + + @Override + public PayMerchantRespVO convert(PayMerchantDO bean) { + if ( bean == null ) { + return null; + } + + PayMerchantRespVO payMerchantRespVO = new PayMerchantRespVO(); + + payMerchantRespVO.setName( bean.getName() ); + payMerchantRespVO.setShortName( bean.getShortName() ); + payMerchantRespVO.setStatus( bean.getStatus() ); + payMerchantRespVO.setRemark( bean.getRemark() ); + payMerchantRespVO.setId( bean.getId() ); + payMerchantRespVO.setCreateTime( bean.getCreateTime() ); + payMerchantRespVO.setNo( bean.getNo() ); + + return payMerchantRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PayMerchantDO payMerchantDO : list ) { + list1.add( convert( payMerchantDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PayMerchantDO payMerchantDO : list ) { + list1.add( payMerchantDOToPayMerchantExcelVO( payMerchantDO ) ); + } + + return list1; + } + + protected PayMerchantExcelVO payMerchantDOToPayMerchantExcelVO(PayMerchantDO payMerchantDO) { + if ( payMerchantDO == null ) { + return null; + } + + PayMerchantExcelVO payMerchantExcelVO = new PayMerchantExcelVO(); + + payMerchantExcelVO.setId( payMerchantDO.getId() ); + payMerchantExcelVO.setNo( payMerchantDO.getNo() ); + payMerchantExcelVO.setName( payMerchantDO.getName() ); + payMerchantExcelVO.setShortName( payMerchantDO.getShortName() ); + payMerchantExcelVO.setStatus( payMerchantDO.getStatus() ); + payMerchantExcelVO.setRemark( payMerchantDO.getRemark() ); + payMerchantExcelVO.setCreateTime( payMerchantDO.getCreateTime() ); + + return payMerchantExcelVO; + } +} diff --git a/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/order/PayOrderConvertImpl.java b/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/order/PayOrderConvertImpl.java new file mode 100644 index 0000000..47a368c --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/order/PayOrderConvertImpl.java @@ -0,0 +1,250 @@ +package com.jojubanking.boot.module.pay.convert.order; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderDetailsRespVO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderDetailsRespVO.PayOrderExtension; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderExcelVO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderPageItemRespVO; +import com.jojubanking.boot.module.pay.controller.admin.order.vo.PayOrderRespVO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderExtensionDO; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderCreateReqDTO; +import com.jojubanking.boot.module.pay.service.order.dto.PayOrderSubmitReqDTO; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:33+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class PayOrderConvertImpl implements PayOrderConvert { + + @Override + public PayOrderRespVO convert(PayOrderDO bean) { + if ( bean == null ) { + return null; + } + + PayOrderRespVO payOrderRespVO = new PayOrderRespVO(); + + payOrderRespVO.setMerchantId( bean.getMerchantId() ); + payOrderRespVO.setAppId( bean.getAppId() ); + payOrderRespVO.setChannelId( bean.getChannelId() ); + payOrderRespVO.setChannelCode( bean.getChannelCode() ); + payOrderRespVO.setMerchantOrderId( bean.getMerchantOrderId() ); + payOrderRespVO.setSubject( bean.getSubject() ); + payOrderRespVO.setBody( bean.getBody() ); + payOrderRespVO.setNotifyUrl( bean.getNotifyUrl() ); + payOrderRespVO.setNotifyStatus( bean.getNotifyStatus() ); + payOrderRespVO.setAmount( bean.getAmount() ); + payOrderRespVO.setChannelFeeRate( bean.getChannelFeeRate() ); + payOrderRespVO.setChannelFeeAmount( bean.getChannelFeeAmount() ); + payOrderRespVO.setStatus( bean.getStatus() ); + payOrderRespVO.setUserIp( bean.getUserIp() ); + payOrderRespVO.setExpireTime( bean.getExpireTime() ); + payOrderRespVO.setSuccessTime( bean.getSuccessTime() ); + payOrderRespVO.setNotifyTime( bean.getNotifyTime() ); + payOrderRespVO.setSuccessExtensionId( bean.getSuccessExtensionId() ); + payOrderRespVO.setRefundStatus( bean.getRefundStatus() ); + payOrderRespVO.setRefundTimes( bean.getRefundTimes() ); + payOrderRespVO.setRefundAmount( bean.getRefundAmount() ); + payOrderRespVO.setChannelUserId( bean.getChannelUserId() ); + payOrderRespVO.setChannelOrderNo( bean.getChannelOrderNo() ); + payOrderRespVO.setId( bean.getId() ); + payOrderRespVO.setCreateTime( bean.getCreateTime() ); + + return payOrderRespVO; + } + + @Override + public PayOrderDetailsRespVO orderDetailConvert(PayOrderDO bean) { + if ( bean == null ) { + return null; + } + + PayOrderDetailsRespVO payOrderDetailsRespVO = new PayOrderDetailsRespVO(); + + payOrderDetailsRespVO.setMerchantId( bean.getMerchantId() ); + payOrderDetailsRespVO.setAppId( bean.getAppId() ); + payOrderDetailsRespVO.setChannelId( bean.getChannelId() ); + payOrderDetailsRespVO.setChannelCode( bean.getChannelCode() ); + payOrderDetailsRespVO.setMerchantOrderId( bean.getMerchantOrderId() ); + payOrderDetailsRespVO.setSubject( bean.getSubject() ); + payOrderDetailsRespVO.setBody( bean.getBody() ); + payOrderDetailsRespVO.setNotifyUrl( bean.getNotifyUrl() ); + payOrderDetailsRespVO.setNotifyStatus( bean.getNotifyStatus() ); + payOrderDetailsRespVO.setAmount( bean.getAmount() ); + payOrderDetailsRespVO.setChannelFeeRate( bean.getChannelFeeRate() ); + payOrderDetailsRespVO.setChannelFeeAmount( bean.getChannelFeeAmount() ); + payOrderDetailsRespVO.setStatus( bean.getStatus() ); + payOrderDetailsRespVO.setUserIp( bean.getUserIp() ); + payOrderDetailsRespVO.setExpireTime( bean.getExpireTime() ); + payOrderDetailsRespVO.setSuccessTime( bean.getSuccessTime() ); + payOrderDetailsRespVO.setNotifyTime( bean.getNotifyTime() ); + payOrderDetailsRespVO.setSuccessExtensionId( bean.getSuccessExtensionId() ); + payOrderDetailsRespVO.setRefundStatus( bean.getRefundStatus() ); + payOrderDetailsRespVO.setRefundTimes( bean.getRefundTimes() ); + payOrderDetailsRespVO.setRefundAmount( bean.getRefundAmount() ); + payOrderDetailsRespVO.setChannelUserId( bean.getChannelUserId() ); + payOrderDetailsRespVO.setChannelOrderNo( bean.getChannelOrderNo() ); + payOrderDetailsRespVO.setId( bean.getId() ); + payOrderDetailsRespVO.setCreateTime( bean.getCreateTime() ); + + return payOrderDetailsRespVO; + } + + @Override + public PayOrderExtension orderDetailExtensionConvert(PayOrderExtensionDO bean) { + if ( bean == null ) { + return null; + } + + PayOrderExtension payOrderExtension = new PayOrderExtension(); + + payOrderExtension.setNo( bean.getNo() ); + payOrderExtension.setChannelNotifyData( bean.getChannelNotifyData() ); + + return payOrderExtension; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PayOrderDO payOrderDO : list ) { + list1.add( convert( payOrderDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PayOrderDO payOrderDO : list ) { + list1.add( excelConvert( payOrderDO ) ); + } + + return list1; + } + + @Override + public PayOrderPageItemRespVO pageConvertItemPage(PayOrderDO bean) { + if ( bean == null ) { + return null; + } + + PayOrderPageItemRespVO payOrderPageItemRespVO = new PayOrderPageItemRespVO(); + + payOrderPageItemRespVO.setMerchantId( bean.getMerchantId() ); + payOrderPageItemRespVO.setAppId( bean.getAppId() ); + payOrderPageItemRespVO.setChannelId( bean.getChannelId() ); + payOrderPageItemRespVO.setChannelCode( bean.getChannelCode() ); + payOrderPageItemRespVO.setMerchantOrderId( bean.getMerchantOrderId() ); + payOrderPageItemRespVO.setSubject( bean.getSubject() ); + payOrderPageItemRespVO.setBody( bean.getBody() ); + payOrderPageItemRespVO.setNotifyUrl( bean.getNotifyUrl() ); + payOrderPageItemRespVO.setNotifyStatus( bean.getNotifyStatus() ); + payOrderPageItemRespVO.setAmount( bean.getAmount() ); + payOrderPageItemRespVO.setChannelFeeRate( bean.getChannelFeeRate() ); + payOrderPageItemRespVO.setChannelFeeAmount( bean.getChannelFeeAmount() ); + payOrderPageItemRespVO.setStatus( bean.getStatus() ); + payOrderPageItemRespVO.setUserIp( bean.getUserIp() ); + payOrderPageItemRespVO.setExpireTime( bean.getExpireTime() ); + payOrderPageItemRespVO.setSuccessTime( bean.getSuccessTime() ); + payOrderPageItemRespVO.setNotifyTime( bean.getNotifyTime() ); + payOrderPageItemRespVO.setSuccessExtensionId( bean.getSuccessExtensionId() ); + payOrderPageItemRespVO.setRefundStatus( bean.getRefundStatus() ); + payOrderPageItemRespVO.setRefundTimes( bean.getRefundTimes() ); + payOrderPageItemRespVO.setRefundAmount( bean.getRefundAmount() ); + payOrderPageItemRespVO.setChannelUserId( bean.getChannelUserId() ); + payOrderPageItemRespVO.setChannelOrderNo( bean.getChannelOrderNo() ); + payOrderPageItemRespVO.setId( bean.getId() ); + payOrderPageItemRespVO.setCreateTime( bean.getCreateTime() ); + + return payOrderPageItemRespVO; + } + + @Override + public PayOrderDO convert(PayOrderCreateReqDTO bean) { + if ( bean == null ) { + return null; + } + + PayOrderDO payOrderDO = new PayOrderDO(); + + payOrderDO.setAppId( bean.getAppId() ); + payOrderDO.setMerchantOrderId( bean.getMerchantOrderId() ); + payOrderDO.setSubject( bean.getSubject() ); + payOrderDO.setBody( bean.getBody() ); + if ( bean.getAmount() != null ) { + payOrderDO.setAmount( bean.getAmount().longValue() ); + } + payOrderDO.setUserIp( bean.getUserIp() ); + payOrderDO.setExpireTime( bean.getExpireTime() ); + + return payOrderDO; + } + + @Override + public PayOrderExtensionDO convert(PayOrderSubmitReqDTO bean) { + if ( bean == null ) { + return null; + } + + PayOrderExtensionDO payOrderExtensionDO = new PayOrderExtensionDO(); + + payOrderExtensionDO.setId( bean.getId() ); + payOrderExtensionDO.setChannelCode( bean.getChannelCode() ); + payOrderExtensionDO.setUserIp( bean.getUserIp() ); + Map map = bean.getChannelExtras(); + if ( map != null ) { + payOrderExtensionDO.setChannelExtras( new HashMap( map ) ); + } + + return payOrderExtensionDO; + } + + @Override + public PayOrderUnifiedReqDTO convert2(PayOrderSubmitReqDTO bean) { + if ( bean == null ) { + return null; + } + + PayOrderUnifiedReqDTO payOrderUnifiedReqDTO = new PayOrderUnifiedReqDTO(); + + payOrderUnifiedReqDTO.setUserIp( bean.getUserIp() ); + Map map = bean.getChannelExtras(); + if ( map != null ) { + payOrderUnifiedReqDTO.setChannelExtras( new HashMap( map ) ); + } + + return payOrderUnifiedReqDTO; + } +} diff --git a/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/refund/PayRefundConvertImpl.java b/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/refund/PayRefundConvertImpl.java new file mode 100644 index 0000000..1ce5e11 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/generated-sources/annotations/com/jojubanking/boot/module/pay/convert/refund/PayRefundConvertImpl.java @@ -0,0 +1,318 @@ +package com.jojubanking.boot.module.pay.convert.refund; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundCreateReqVO; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundDetailsRespVO; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundExcelVO; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundPageItemRespVO; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundRespVO; +import com.jojubanking.boot.module.pay.controller.admin.refund.vo.PayRefundUpdateReqVO; +import com.jojubanking.boot.module.pay.controller.app.refund.vo.AppPayRefundReqVO; +import com.jojubanking.boot.module.pay.controller.app.refund.vo.AppPayRefundRespVO; +import com.jojubanking.boot.module.pay.dal.dataobject.order.PayOrderDO; +import com.jojubanking.boot.module.pay.dal.dataobject.refund.PayRefundDO; +import com.jojubanking.boot.module.pay.service.order.dto.PayRefundReqDTO; +import com.jojubanking.boot.module.pay.service.order.dto.PayRefundRespDTO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:33+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class PayRefundConvertImpl implements PayRefundConvert { + + @Override + public PayRefundDO convert(PayRefundCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + PayRefundDO payRefundDO = new PayRefundDO(); + + payRefundDO.setMerchantId( bean.getMerchantId() ); + payRefundDO.setAppId( bean.getAppId() ); + payRefundDO.setChannelId( bean.getChannelId() ); + payRefundDO.setChannelCode( bean.getChannelCode() ); + payRefundDO.setOrderId( bean.getOrderId() ); + payRefundDO.setTradeNo( bean.getTradeNo() ); + payRefundDO.setMerchantOrderId( bean.getMerchantOrderId() ); + payRefundDO.setMerchantRefundNo( bean.getMerchantRefundNo() ); + payRefundDO.setNotifyUrl( bean.getNotifyUrl() ); + payRefundDO.setNotifyStatus( bean.getNotifyStatus() ); + payRefundDO.setStatus( bean.getStatus() ); + payRefundDO.setType( bean.getType() ); + payRefundDO.setPayAmount( bean.getPayAmount() ); + payRefundDO.setRefundAmount( bean.getRefundAmount() ); + payRefundDO.setReason( bean.getReason() ); + payRefundDO.setUserIp( bean.getUserIp() ); + payRefundDO.setChannelOrderNo( bean.getChannelOrderNo() ); + payRefundDO.setChannelRefundNo( bean.getChannelRefundNo() ); + payRefundDO.setChannelErrorCode( bean.getChannelErrorCode() ); + payRefundDO.setChannelErrorMsg( bean.getChannelErrorMsg() ); + payRefundDO.setChannelExtras( bean.getChannelExtras() ); + payRefundDO.setExpireTime( bean.getExpireTime() ); + payRefundDO.setSuccessTime( bean.getSuccessTime() ); + payRefundDO.setNotifyTime( bean.getNotifyTime() ); + + return payRefundDO; + } + + @Override + public PayRefundDO convert(PayRefundUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + PayRefundDO payRefundDO = new PayRefundDO(); + + payRefundDO.setId( bean.getId() ); + payRefundDO.setMerchantId( bean.getMerchantId() ); + payRefundDO.setAppId( bean.getAppId() ); + payRefundDO.setChannelId( bean.getChannelId() ); + payRefundDO.setChannelCode( bean.getChannelCode() ); + payRefundDO.setOrderId( bean.getOrderId() ); + payRefundDO.setTradeNo( bean.getTradeNo() ); + payRefundDO.setMerchantOrderId( bean.getMerchantOrderId() ); + payRefundDO.setMerchantRefundNo( bean.getMerchantRefundNo() ); + payRefundDO.setNotifyUrl( bean.getNotifyUrl() ); + payRefundDO.setNotifyStatus( bean.getNotifyStatus() ); + payRefundDO.setStatus( bean.getStatus() ); + payRefundDO.setType( bean.getType() ); + payRefundDO.setPayAmount( bean.getPayAmount() ); + payRefundDO.setRefundAmount( bean.getRefundAmount() ); + payRefundDO.setReason( bean.getReason() ); + payRefundDO.setUserIp( bean.getUserIp() ); + payRefundDO.setChannelOrderNo( bean.getChannelOrderNo() ); + payRefundDO.setChannelRefundNo( bean.getChannelRefundNo() ); + payRefundDO.setChannelErrorCode( bean.getChannelErrorCode() ); + payRefundDO.setChannelErrorMsg( bean.getChannelErrorMsg() ); + payRefundDO.setChannelExtras( bean.getChannelExtras() ); + payRefundDO.setExpireTime( bean.getExpireTime() ); + payRefundDO.setSuccessTime( bean.getSuccessTime() ); + payRefundDO.setNotifyTime( bean.getNotifyTime() ); + + return payRefundDO; + } + + @Override + public PayRefundRespVO convert(PayRefundDO bean) { + if ( bean == null ) { + return null; + } + + PayRefundRespVO payRefundRespVO = new PayRefundRespVO(); + + payRefundRespVO.setMerchantId( bean.getMerchantId() ); + payRefundRespVO.setAppId( bean.getAppId() ); + payRefundRespVO.setChannelId( bean.getChannelId() ); + payRefundRespVO.setChannelCode( bean.getChannelCode() ); + payRefundRespVO.setOrderId( bean.getOrderId() ); + payRefundRespVO.setTradeNo( bean.getTradeNo() ); + payRefundRespVO.setMerchantOrderId( bean.getMerchantOrderId() ); + payRefundRespVO.setMerchantRefundNo( bean.getMerchantRefundNo() ); + payRefundRespVO.setNotifyUrl( bean.getNotifyUrl() ); + payRefundRespVO.setNotifyStatus( bean.getNotifyStatus() ); + payRefundRespVO.setStatus( bean.getStatus() ); + payRefundRespVO.setType( bean.getType() ); + payRefundRespVO.setPayAmount( bean.getPayAmount() ); + payRefundRespVO.setRefundAmount( bean.getRefundAmount() ); + payRefundRespVO.setReason( bean.getReason() ); + payRefundRespVO.setUserIp( bean.getUserIp() ); + payRefundRespVO.setChannelOrderNo( bean.getChannelOrderNo() ); + payRefundRespVO.setChannelRefundNo( bean.getChannelRefundNo() ); + payRefundRespVO.setChannelErrorCode( bean.getChannelErrorCode() ); + payRefundRespVO.setChannelErrorMsg( bean.getChannelErrorMsg() ); + payRefundRespVO.setChannelExtras( bean.getChannelExtras() ); + payRefundRespVO.setExpireTime( bean.getExpireTime() ); + payRefundRespVO.setSuccessTime( bean.getSuccessTime() ); + payRefundRespVO.setNotifyTime( bean.getNotifyTime() ); + payRefundRespVO.setId( bean.getId() ); + payRefundRespVO.setCreateTime( bean.getCreateTime() ); + + return payRefundRespVO; + } + + @Override + public PayRefundDetailsRespVO refundDetailConvert(PayRefundDO bean) { + if ( bean == null ) { + return null; + } + + PayRefundDetailsRespVO payRefundDetailsRespVO = new PayRefundDetailsRespVO(); + + payRefundDetailsRespVO.setMerchantId( bean.getMerchantId() ); + payRefundDetailsRespVO.setAppId( bean.getAppId() ); + payRefundDetailsRespVO.setChannelId( bean.getChannelId() ); + payRefundDetailsRespVO.setChannelCode( bean.getChannelCode() ); + payRefundDetailsRespVO.setOrderId( bean.getOrderId() ); + payRefundDetailsRespVO.setTradeNo( bean.getTradeNo() ); + payRefundDetailsRespVO.setMerchantOrderId( bean.getMerchantOrderId() ); + payRefundDetailsRespVO.setMerchantRefundNo( bean.getMerchantRefundNo() ); + payRefundDetailsRespVO.setNotifyUrl( bean.getNotifyUrl() ); + payRefundDetailsRespVO.setNotifyStatus( bean.getNotifyStatus() ); + payRefundDetailsRespVO.setStatus( bean.getStatus() ); + payRefundDetailsRespVO.setType( bean.getType() ); + payRefundDetailsRespVO.setPayAmount( bean.getPayAmount() ); + payRefundDetailsRespVO.setRefundAmount( bean.getRefundAmount() ); + payRefundDetailsRespVO.setReason( bean.getReason() ); + payRefundDetailsRespVO.setUserIp( bean.getUserIp() ); + payRefundDetailsRespVO.setChannelOrderNo( bean.getChannelOrderNo() ); + payRefundDetailsRespVO.setChannelRefundNo( bean.getChannelRefundNo() ); + payRefundDetailsRespVO.setChannelErrorCode( bean.getChannelErrorCode() ); + payRefundDetailsRespVO.setChannelErrorMsg( bean.getChannelErrorMsg() ); + payRefundDetailsRespVO.setChannelExtras( bean.getChannelExtras() ); + payRefundDetailsRespVO.setExpireTime( bean.getExpireTime() ); + payRefundDetailsRespVO.setSuccessTime( bean.getSuccessTime() ); + payRefundDetailsRespVO.setNotifyTime( bean.getNotifyTime() ); + payRefundDetailsRespVO.setId( bean.getId() ); + payRefundDetailsRespVO.setCreateTime( bean.getCreateTime() ); + payRefundDetailsRespVO.setUpdateTime( bean.getUpdateTime() ); + + return payRefundDetailsRespVO; + } + + @Override + public PayRefundPageItemRespVO pageItemConvert(PayRefundDO bean) { + if ( bean == null ) { + return null; + } + + PayRefundPageItemRespVO payRefundPageItemRespVO = new PayRefundPageItemRespVO(); + + payRefundPageItemRespVO.setMerchantId( bean.getMerchantId() ); + payRefundPageItemRespVO.setAppId( bean.getAppId() ); + payRefundPageItemRespVO.setChannelId( bean.getChannelId() ); + payRefundPageItemRespVO.setChannelCode( bean.getChannelCode() ); + payRefundPageItemRespVO.setOrderId( bean.getOrderId() ); + payRefundPageItemRespVO.setTradeNo( bean.getTradeNo() ); + payRefundPageItemRespVO.setMerchantOrderId( bean.getMerchantOrderId() ); + payRefundPageItemRespVO.setMerchantRefundNo( bean.getMerchantRefundNo() ); + payRefundPageItemRespVO.setNotifyUrl( bean.getNotifyUrl() ); + payRefundPageItemRespVO.setNotifyStatus( bean.getNotifyStatus() ); + payRefundPageItemRespVO.setStatus( bean.getStatus() ); + payRefundPageItemRespVO.setType( bean.getType() ); + payRefundPageItemRespVO.setPayAmount( bean.getPayAmount() ); + payRefundPageItemRespVO.setRefundAmount( bean.getRefundAmount() ); + payRefundPageItemRespVO.setReason( bean.getReason() ); + payRefundPageItemRespVO.setUserIp( bean.getUserIp() ); + payRefundPageItemRespVO.setChannelOrderNo( bean.getChannelOrderNo() ); + payRefundPageItemRespVO.setChannelRefundNo( bean.getChannelRefundNo() ); + payRefundPageItemRespVO.setChannelErrorCode( bean.getChannelErrorCode() ); + payRefundPageItemRespVO.setChannelErrorMsg( bean.getChannelErrorMsg() ); + payRefundPageItemRespVO.setChannelExtras( bean.getChannelExtras() ); + payRefundPageItemRespVO.setExpireTime( bean.getExpireTime() ); + payRefundPageItemRespVO.setSuccessTime( bean.getSuccessTime() ); + payRefundPageItemRespVO.setNotifyTime( bean.getNotifyTime() ); + payRefundPageItemRespVO.setId( bean.getId() ); + payRefundPageItemRespVO.setCreateTime( bean.getCreateTime() ); + + return payRefundPageItemRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PayRefundDO payRefundDO : list ) { + list1.add( convert( payRefundDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PayRefundDO payRefundDO : list ) { + list1.add( excelConvert( payRefundDO ) ); + } + + return list1; + } + + @Override + public PayRefundDO convert(PayOrderDO orderDO) { + if ( orderDO == null ) { + return null; + } + + PayRefundDO payRefundDO = new PayRefundDO(); + + payRefundDO.setPayAmount( orderDO.getAmount() ); + payRefundDO.setOrderId( orderDO.getId() ); + payRefundDO.setCreateTime( orderDO.getCreateTime() ); + payRefundDO.setUpdateTime( orderDO.getUpdateTime() ); + payRefundDO.setCreator( orderDO.getCreator() ); + payRefundDO.setUpdater( orderDO.getUpdater() ); + payRefundDO.setDeleted( orderDO.getDeleted() ); + payRefundDO.setId( orderDO.getId() ); + payRefundDO.setMerchantId( orderDO.getMerchantId() ); + payRefundDO.setAppId( orderDO.getAppId() ); + payRefundDO.setChannelId( orderDO.getChannelId() ); + payRefundDO.setChannelCode( orderDO.getChannelCode() ); + payRefundDO.setMerchantOrderId( orderDO.getMerchantOrderId() ); + payRefundDO.setNotifyUrl( orderDO.getNotifyUrl() ); + payRefundDO.setNotifyStatus( orderDO.getNotifyStatus() ); + payRefundDO.setRefundAmount( orderDO.getRefundAmount() ); + payRefundDO.setUserIp( orderDO.getUserIp() ); + payRefundDO.setChannelOrderNo( orderDO.getChannelOrderNo() ); + payRefundDO.setExpireTime( orderDO.getExpireTime() ); + payRefundDO.setSuccessTime( orderDO.getSuccessTime() ); + payRefundDO.setNotifyTime( orderDO.getNotifyTime() ); + + return payRefundDO; + } + + @Override + public PayRefundReqDTO convert(AppPayRefundReqVO bean) { + if ( bean == null ) { + return null; + } + + PayRefundReqDTO payRefundReqDTO = new PayRefundReqDTO(); + + payRefundReqDTO.setPayOrderId( bean.getPayOrderId() ); + payRefundReqDTO.setAmount( bean.getAmount() ); + payRefundReqDTO.setReason( bean.getReason() ); + payRefundReqDTO.setMerchantRefundId( bean.getMerchantRefundId() ); + + return payRefundReqDTO; + } + + @Override + public AppPayRefundRespVO convert(PayRefundRespDTO bean) { + if ( bean == null ) { + return null; + } + + AppPayRefundRespVO appPayRefundRespVO = new AppPayRefundRespVO(); + + appPayRefundRespVO.setRefundId( bean.getRefundId() ); + + return appPayRefundRespVO; + } +} diff --git a/joju-module-pay/joju-module-pay-biz/target/joju-module-pay-biz-2.0.0-beta.jar b/joju-module-pay/joju-module-pay-biz/target/joju-module-pay-biz-2.0.0-beta.jar new file mode 100644 index 0000000..85b463d Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/joju-module-pay-biz-2.0.0-beta.jar differ diff --git a/joju-module-pay/joju-module-pay-biz/target/maven-archiver/pom.properties b/joju-module-pay/joju-module-pay-biz/target/maven-archiver/pom.properties new file mode 100644 index 0000000..91ca2f3 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:28:48 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-module-pay-biz diff --git a/joju-module-pay/joju-module-pay-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-module-pay/joju-module-pay-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..fc0892e --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,126 @@ +com\jojubanking\boot\module\pay\service\notify\PayNotifyService.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantExportReqVO.class +com\jojubanking\boot\module\pay\service\merchant\PayAppServiceImpl.class +com\jojubanking\boot\module\pay\dal\mysql\refund\PayRefundMapper.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppCreateReqVO.class +com\jojubanking\boot\module\pay\enums\order\PayOrderNotifyStatusEnum.class +com\jojubanking\boot\module\pay\dal\dataobject\merchant\PayAppDO.class +com\jojubanking\boot\module\pay\service\order\PayOrderServiceImpl.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppExcelVO.class +com\jojubanking\boot\module\pay\service\order\PayOrderExtensionService.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantExcelVO.class +com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderExcelVO.class +com\jojubanking\boot\module\pay\dal\dataobject\order\PayOrderExtensionDO.class +com\jojubanking\boot\module\pay\service\order\dto\PayRefundRespDTO.class +com\jojubanking\boot\module\pay\service\order\dto\PayOrderCreateReqDTO.class +com\jojubanking\boot\module\pay\service\notify\vo\PayNotifyOrderReqVO.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppRespVO.class +com\jojubanking\boot\module\pay\convert\channel\PayChannelConvertImpl.class +com\jojubanking\boot\module\pay\dal\mysql\merchant\PayChannelMapper.class +com\jojubanking\boot\module\pay\dal\redis\RedisKeyConstants.class +com\jojubanking\boot\module\pay\controller\app\order\vo\AppPayOrderSubmitReqVO.class +com\jojubanking\boot\module\pay\dal\dataobject\notify\PayNotifyTaskDO.class +com\jojubanking\boot\module\pay\convert\order\PayOrderConvert.class +com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderDetailsRespVO$PayOrderExtension.class +com\jojubanking\boot\module\pay\dal\dataobject\notify\PayNotifyLogDO$PayNotifyLogDOBuilder.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelCreateReqVO.class +com\jojubanking\boot\module\pay\service\order\dto\PayOrderSubmitRespDTO.class +com\jojubanking\boot\module\pay\dal\mysql\order\PayOrderExtensionMapper.class +com\jojubanking\boot\module\pay\service\merchant\PayAppService.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppPageItemRespVO.class +com\jojubanking\boot\module\pay\service\order\dto\PayRefundRespDTO$PayRefundRespDTOBuilder.class +com\jojubanking\boot\module\pay\dal\dataobject\merchant\PayAppDO$PayAppDOBuilder.class +com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundBaseVO.class +com\jojubanking\boot\module\pay\job\notify\PayNotifyJob.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelPageReqVO.class +com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundDetailsRespVO.class +com\jojubanking\boot\module\pay\service\order\PayOrderExtensionServiceImpl.class +com\jojubanking\boot\module\pay\service\refund\PayRefundService.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelBaseVO.class +com\jojubanking\boot\module\pay\dal\dataobject\refund\PayRefundDO$PayRefundDOBuilder.class +com\jojubanking\boot\module\pay\service\merchant\PayMerchantServiceImpl.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelUpdateReqVO.class +com\jojubanking\boot\module\pay\convert\app\PayAppConvert.class +com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundCreateReqVO.class +com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundRespVO.class +com\jojubanking\boot\module\pay\service\notify\vo\PayRefundOrderReqVO$PayRefundOrderReqVOBuilder.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantCreateReqVO.class +com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundPageItemRespVO.class +com\jojubanking\boot\module\pay\controller\admin\order\PayOrderController.class +com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundExcelVO.class +com\jojubanking\boot\module\pay\controller\app\order\AppPayOrderController.class +com\jojubanking\boot\module\pay\service\merchant\PayChannelService.class +com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundExportReqVO.class +com\jojubanking\boot\module\pay\dal\dataobject\merchant\PayMerchantDO.class +com\jojubanking\boot\module\pay\framework\job\config\PayJobConfiguration.class +com\jojubanking\boot\module\pay\service\notify\PayNotifyServiceImpl.class +com\jojubanking\boot\module\pay\service\order\dto\PayRefundReqDTO.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantRespVO.class +com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderExportReqVO.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppUpdateStatusReqVO.class +com\jojubanking\boot\module\pay\enums\notify\PayNotifyTypeEnum.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppBaseVO.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantUpdateReqVO.class +com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderBaseVO.class +com\jojubanking\boot\module\pay\dal\dataobject\notify\PayNotifyLogDO.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantPageReqVO.class +com\jojubanking\boot\module\pay\dal\dataobject\order\PayOrderExtensionDO$PayOrderExtensionDOBuilder.class +com\jojubanking\boot\module\pay\controller\admin\refund\PayRefundController.class +com\jojubanking\boot\module\pay\convert\merchant\PayMerchantConvert.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppExportReqVO.class +com\jojubanking\boot\module\pay\controller\app\order\vo\AppPayOrderSubmitRespVO$AppPayOrderSubmitRespVOBuilder.class +com\jojubanking\boot\module\pay\dal\dataobject\merchant\PayChannelDO.class +com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderPageReqVO.class +com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundUpdateReqVO.class +com\jojubanking\boot\module\pay\dal\dataobject\order\PayOrderDO.class +com\jojubanking\boot\module\pay\service\order\dto\PayRefundReqDTO$PayRefundReqDTOBuilder.class +com\jojubanking\boot\module\pay\service\notify\dto\PayNotifyTaskCreateReqDTO.class +com\jojubanking\boot\module\pay\convert\refund\PayRefundConvertImpl.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppPageItemRespVO$PayMerchant.class +com\jojubanking\boot\module\pay\service\order\dto\PayOrderSubmitReqDTO.class +com\jojubanking\boot\module\pay\service\notify\dto\PayNotifyTaskCreateReqDTO$PayNotifyTaskCreateReqDTOBuilder.class +com\jojubanking\boot\module\pay\dal\redis\notify\PayNotifyLockRedisDAO.class +com\jojubanking\boot\module\pay\dal\mysql\notify\PayNotifyLogCoreMapper.class +com\jojubanking\boot\module\pay\service\notify\vo\PayRefundOrderReqVO.class +com\jojubanking\boot\module\pay\dal\mysql\order\PayOrderMapper.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelExcelVO.class +com\jojubanking\boot\module\pay\controller\admin\merchant\PayMerchantController.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelExportReqVO.class +com\jojubanking\boot\module\pay\service\merchant\PayMerchantService.class +com\jojubanking\boot\module\pay\controller\app\order\vo\AppPayOrderSubmitRespVO.class +com\jojubanking\boot\module\pay\controller\admin\merchant\PayChannelController.class +com\jojubanking\boot\module\pay\enums\refund\PayRefundStatusEnum.class +com\jojubanking\boot\module\pay\util\PaySeqUtils.class +com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundPageReqVO.class +com\jojubanking\boot\module\pay\convert\channel\PayChannelConvert.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppPageReqVO.class +com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderPageItemRespVO.class +com\jojubanking\boot\module\pay\dal\mysql\notify\PayNotifyTaskCoreMapper.class +com\jojubanking\boot\module\pay\enums\refund\PayRefundTypeEnum.class +com\jojubanking\boot\module\pay\convert\refund\PayRefundConvert.class +com\jojubanking\boot\module\pay\service\refund\PayRefundServiceImpl.class +com\jojubanking\boot\module\pay\controller\app\refund\vo\AppPayRefundReqVO.class +com\jojubanking\boot\module\pay\dal\dataobject\merchant\PayChannelDO$PayChannelDOBuilder.class +com\jojubanking\boot\module\pay\convert\app\PayAppConvertImpl.class +com\jojubanking\boot\module\pay\controller\app\refund\vo\AppPayRefundRespVO.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantBaseVO.class +com\jojubanking\boot\module\pay\convert\merchant\PayMerchantConvertImpl.class +com\jojubanking\boot\module\pay\dal\dataobject\order\PayOrderDO$PayOrderDOBuilder.class +com\jojubanking\boot\module\pay\service\merchant\PayChannelServiceImpl.class +com\jojubanking\boot\module\pay\enums\order\PayOrderStatusEnum.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelRespVO.class +com\jojubanking\boot\module\pay\controller\admin\merchant\PayAppController.class +com\jojubanking\boot\module\pay\controller\app\refund\AppPayRefundController.class +com\jojubanking\boot\module\pay\service\order\PayOrderService.class +com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderRespVO.class +com\jojubanking\boot\module\pay\dal\dataobject\merchant\PayMerchantDO$PayMerchantDOBuilder.class +com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderDetailsRespVO.class +com\jojubanking\boot\module\pay\convert\order\PayOrderConvertImpl.class +com\jojubanking\boot\module\pay\enums\notify\PayNotifyStatusEnum.class +com\jojubanking\boot\module\pay\dal\mysql\merchant\PayAppMapper.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppUpdateReqVO.class +com\jojubanking\boot\module\pay\service\notify\vo\PayNotifyOrderReqVO$PayNotifyOrderReqVOBuilder.class +com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantUpdateStatusReqVO.class +com\jojubanking\boot\module\pay\dal\dataobject\refund\PayRefundDO.class +com\jojubanking\boot\module\pay\dal\mysql\merchant\PayMerchantMapper.class +com\jojubanking\boot\module\pay\controller\app\refund\vo\AppPayRefundRespVO$AppPayRefundRespVOBuilder.class diff --git a/joju-module-pay/joju-module-pay-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-module-pay/joju-module-pay-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..1e205d9 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,114 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\refund\PayRefundServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\app\order\vo\AppPayOrderSubmitRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\dataobject\notify\PayNotifyLogDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\enums\refund\PayRefundStatusEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\PayChannelController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\enums\order\PayOrderNotifyStatusEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\order\PayOrderService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\framework\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\convert\merchant\PayMerchantConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\redis\notify\PayNotifyLockRedisDAO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantUpdateStatusReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\order\dto\PayOrderCreateReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\PayAppController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\refund\PayRefundController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\notify\PayNotifyServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\app\refund\vo\AppPayRefundRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\refund\PayRefundService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\convert\channel\PayChannelConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\merchant\PayMerchantService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\enums\order\PayOrderStatusEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppPageItemRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\app\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\merchant\PayAppServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\dataobject\order\PayOrderDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\dataobject\order\PayOrderExtensionDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\order\PayOrderController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\app\refund\AppPayRefundController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\notify\vo\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\PayMerchantController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\mysql\merchant\PayMerchantMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\enums\notify\PayNotifyTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\framework\job\config\PayJobConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\dataobject\merchant\PayChannelDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\enums\notify\PayNotifyStatusEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\order\dto\PayRefundReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\order\PayOrderExtensionServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\convert\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\mysql\notify\PayNotifyLogCoreMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\merchant\PayChannelService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\app\order\vo\AppPayOrderSubmitReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\app\order\AppPayOrderController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\convert\order\PayOrderConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\util\PaySeqUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderDetailsRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\notify\dto\PayNotifyTaskCreateReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\framework\job\core\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\dataobject\refund\PayRefundDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundPageItemRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\notify\vo\PayNotifyOrderReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\job\notify\PayNotifyJob.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\notify\vo\PayRefundOrderReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\order\dto\PayOrderSubmitRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\mysql\order\PayOrderExtensionMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\merchant\PayMerchantServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\mysql\merchant\PayAppMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\merchant\PayAppService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\order\dto\PayOrderSubmitReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\job\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\dataobject\merchant\PayAppDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\app\refund\vo\AppPayRefundReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\order\PayOrderServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\order\dto\PayRefundRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\order\PayOrderExtensionService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\merchant\PayMerchantRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\redis\RedisKeyConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\order\vo\PayOrderPageItemRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\convert\app\PayAppConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\app\PayAppUpdateStatusReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\mysql\notify\PayNotifyTaskCoreMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\mysql\refund\PayRefundMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundDetailsRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\refund\vo\PayRefundCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\mysql\merchant\PayChannelMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\mysql\order\PayOrderMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\notify\PayNotifyService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\enums\refund\PayRefundTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\dataobject\notify\PayNotifyTaskDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\controller\admin\merchant\vo\channel\PayChannelRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\convert\refund\PayRefundConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\dal\dataobject\merchant\PayMerchantDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-pay\joju-module-pay-biz\src\main\java\com\jojubanking\boot\module\pay\service\merchant\PayChannelServiceImpl.java diff --git a/joju-module-pay/joju-module-pay-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/joju-module-pay/joju-module-pay-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..47339da --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1,5 @@ +com\jojubanking\boot\module\pay\service\merchant\PayAppServiceTest.class +com\jojubanking\boot\module\pay\service\merchant\PayMerchantServiceTest.class +com\jojubanking\boot\module\pay\service\order\PayOrderServiceTest.class +com\jojubanking\boot\module\pay\service\merchant\PayChannelServiceTest.class +com\jojubanking\boot\module\pay\service\refund\PayRefundServiceTest.class diff --git a/joju-module-pay/joju-module-pay-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/joju-module-pay/joju-module-pay-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..b02ed5f --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1,5 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-pay\joju-module-pay-biz\src\test\java\com\jojubanking\boot\module\pay\service\merchant\PayMerchantServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-pay\joju-module-pay-biz\src\test\java\com\jojubanking\boot\module\pay\service\merchant\PayChannelServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-pay\joju-module-pay-biz\src\test\java\com\jojubanking\boot\module\pay\service\refund\PayRefundServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-pay\joju-module-pay-biz\src\test\java\com\jojubanking\boot\module\pay\service\order\PayOrderServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-pay\joju-module-pay-biz\src\test\java\com\jojubanking\boot\module\pay\service\merchant\PayAppServiceTest.java diff --git a/joju-module-pay/joju-module-pay-biz/target/test-classes/application-unit-test.yaml b/joju-module-pay/joju-module-pay-biz/target/test-classes/application-unit-test.yaml new file mode 100644 index 0000000..54e0f3e --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/test-classes/application-unit-test.yaml @@ -0,0 +1,49 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + sql: + init: + schema-locations: classpath:/sql/create_tables.sql + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +joju: + info: + base-package: com.jojubanking.boot.module diff --git a/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/merchant/PayAppServiceTest.class b/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/merchant/PayAppServiceTest.class new file mode 100644 index 0000000..9887570 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/merchant/PayAppServiceTest.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/merchant/PayChannelServiceTest.class b/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/merchant/PayChannelServiceTest.class new file mode 100644 index 0000000..b268ca1 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/merchant/PayChannelServiceTest.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/merchant/PayMerchantServiceTest.class b/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/merchant/PayMerchantServiceTest.class new file mode 100644 index 0000000..b33e3fc Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/merchant/PayMerchantServiceTest.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/order/PayOrderServiceTest.class b/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/order/PayOrderServiceTest.class new file mode 100644 index 0000000..16d5b02 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/order/PayOrderServiceTest.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/refund/PayRefundServiceTest.class b/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/refund/PayRefundServiceTest.class new file mode 100644 index 0000000..683c712 Binary files /dev/null and b/joju-module-pay/joju-module-pay-biz/target/test-classes/com/jojubanking/boot/module/pay/service/refund/PayRefundServiceTest.class differ diff --git a/joju-module-pay/joju-module-pay-biz/target/test-classes/logback.xml b/joju-module-pay/joju-module-pay-biz/target/test-classes/logback.xml new file mode 100644 index 0000000..daf756b --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/test-classes/logback.xml @@ -0,0 +1,4 @@ + + + + diff --git a/joju-module-pay/joju-module-pay-biz/target/test-classes/sql/clean.sql b/joju-module-pay/joju-module-pay-biz/target/test-classes/sql/clean.sql new file mode 100644 index 0000000..7430b6b --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/test-classes/sql/clean.sql @@ -0,0 +1,5 @@ +DELETE FROM pay_merchant; +DELETE FROM pay_app; +DELETE FROM pay_channel; +DELETE FROM pay_order; +DELETE FROM pay_refund; diff --git a/joju-module-pay/joju-module-pay-biz/target/test-classes/sql/create_tables.sql b/joju-module-pay/joju-module-pay-biz/target/test-classes/sql/create_tables.sql new file mode 100644 index 0000000..890fb77 --- /dev/null +++ b/joju-module-pay/joju-module-pay-biz/target/test-classes/sql/create_tables.sql @@ -0,0 +1,114 @@ +CREATE TABLE IF NOT EXISTS "pay_merchant" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "no" varchar(32) NOT NULL, + "name" varchar(64) NOT NULL, + "short_name" varchar(64) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '支付商户信息'; + +CREATE TABLE IF NOT EXISTS "pay_app" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(64) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + `pay_notify_url` varchar(1024) NOT NULL, + `refund_notify_url` varchar(1024) NOT NULL, + `merchant_id` bigint(20) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '支付应用信息'; + +CREATE TABLE IF NOT EXISTS "pay_channel" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(32) NOT NULL, + "status" tinyint(4) NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "fee_rate" double NOT NULL DEFAULT 0, + "merchant_id" bigint(20) NOT NULL, + "app_id" bigint(20) NOT NULL, + "config" varchar(10240) NOT NULL, + "creator" varchar(64) NULL DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) NULL DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '支付渠道'; + +CREATE TABLE IF NOT EXISTS `pay_order` ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `merchant_id` bigint(20) NOT NULL, + `app_id` bigint(20) NOT NULL, + `channel_id` bigint(20) DEFAULT NULL, + `channel_code` varchar(32) DEFAULT NULL, + `merchant_order_id` varchar(64) NOT NULL, + `subject` varchar(32) NOT NULL, + `body` varchar(128) NOT NULL, + `notify_url` varchar(1024) NOT NULL, + `notify_status` tinyint(4) NOT NULL, + `amount` bigint(20) NOT NULL, + `channel_fee_rate` double DEFAULT 0, + `channel_fee_amount` bigint(20) DEFAULT 0, + `status` tinyint(4) NOT NULL, + `user_ip` varchar(50) NOT NULL, + `expire_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `success_time` datetime(0) DEFAULT CURRENT_TIMESTAMP, + `notify_time` datetime(0) DEFAULT CURRENT_TIMESTAMP, + `success_extension_id` bigint(20) DEFAULT NULL COMMENT '支付成功的订单拓展单编号', + `refund_status` tinyint(4) NOT NULL, + `refund_times` tinyint(4) NOT NULL, + `refund_amount` bigint(20) NOT NULL, + `channel_user_id` varchar(255) DEFAULT NULL, + `channel_order_no` varchar(64) DEFAULT NULL, + `creator` varchar(64) DEFAULT '', + `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '支付订单'; + +CREATE TABLE IF NOT EXISTS `pay_refund` ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `merchant_id` bigint(20) NOT NULL, + `app_id` bigint(20) NOT NULL, + `channel_id` bigint(20) NOT NULL, + `channel_code` varchar(32) NOT NULL, + `order_id` bigint(20) NOT NULL, + `trade_no` varchar(64) NOT NULL, + `merchant_order_id` varchar(64) NOT NULL, + `merchant_refund_no` varchar(64) NOT NULL, + `notify_url` varchar(1024) NOT NULL, + `notify_status` tinyint(4) NOT NULL, + `status` tinyint(4) NOT NULL, + `type` tinyint(4) NOT NULL, + `pay_amount` bigint(20) NOT NULL, + `refund_amount` bigint(20) NOT NULL, + `reason` varchar(256) NOT NULL, + `user_ip` varchar(50) NULL DEFAULT NULL, + `channel_order_no` varchar(64) NOT NULL, + `channel_refund_no` varchar(64) NULL DEFAULT NULL, + `channel_error_code` varchar(128) NULL DEFAULT NULL, + `channel_error_msg` varchar(256) NULL DEFAULT NULL, + `channel_extras` varchar(1024) NULL DEFAULT NULL, + `expire_time` datetime(0) NULL DEFAULT NULL, + `success_time` datetime(0) NULL DEFAULT NULL, + `notify_time` datetime(0) NULL DEFAULT NULL, + `creator` varchar(64) NULL DEFAULT '', + `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) NULL DEFAULT '', + `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT = '退款订单'; diff --git a/joju-module-pay/joju-module-pay.iml b/joju-module-pay/joju-module-pay.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-module-pay/joju-module-pay.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-module-pay/pom.xml b/joju-module-pay/pom.xml new file mode 100644 index 0000000..3549fab --- /dev/null +++ b/joju-module-pay/pom.xml @@ -0,0 +1,25 @@ + + + + jojuboot + com.jojubanking.boot + ${revision} + + 4.0.0 + joju-module-pay + pom + + joju-module-pay-api + joju-module-pay-biz + + + ${project.artifactId} + + pay 模块,我们放支付业务,提供业务的支付能力。 + 例如说:商户、应用、支付、退款等等 + + + + diff --git a/joju-module-system/joju-module-system-api/joju-module-system-api.iml b/joju-module-system/joju-module-system-api/joju-module-system-api.iml new file mode 100644 index 0000000..74f3f13 --- /dev/null +++ b/joju-module-system/joju-module-system-api/joju-module-system-api.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-module-system/joju-module-system-api/pom.xml b/joju-module-system/joju-module-system-api/pom.xml new file mode 100644 index 0000000..30f32de --- /dev/null +++ b/joju-module-system/joju-module-system-api/pom.xml @@ -0,0 +1,34 @@ + + + + com.jojubanking.boot + joju-module-system + ${revision} + + 4.0.0 + joju-module-system-api + jar + + ${project.artifactId} + + system 模块 API,暴露给其它模块调用 + + + + + com.jojubanking.boot + joju-common + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + + diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dept/DeptApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dept/DeptApi.java new file mode 100644 index 0000000..65b5469 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dept/DeptApi.java @@ -0,0 +1,54 @@ +package com.jojubanking.boot.module.system.api.dept; + +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.system.api.dept.dto.DeptRespDTO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 部门 API 接口 + * + * @author TW + */ +public interface DeptApi { + + /** + * 获得部门信息 + * + * @param id 部门编号 + * @return 部门信息 + */ + DeptRespDTO getDept(Long id); + + /** + * 获得部门信息数组 + * + * @param ids 部门编号数组 + * @return 部门信息数组 + */ + List getDepts(Collection ids); + + /** + * 校验部门们是否有效。如下情况,视为无效: + * 1. 部门编号不存在 + * 2. 部门被禁用 + * + * @param ids 角色编号数组 + */ + void validDepts(Collection ids); + + /** + * 获得指定编号的部门 Map + * + * @param ids 部门编号数组 + * @return 部门 Map + */ + default Map getDeptMap(Set ids) { + List list = getDepts(ids); + return CollectionUtils.convertMap(list, DeptRespDTO::getId); + } + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dept/PostApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dept/PostApi.java new file mode 100644 index 0000000..ce7b29f --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dept/PostApi.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.api.dept; + +import java.util.Collection; + +/** + * 岗位 API 接口 + * + * @author TW + */ +public interface PostApi { + + /** + * 校验岗位们是否有效。如下情况,视为无效: + * 1. 岗位编号不存在 + * 2. 岗位被禁用 + * + * @param ids 岗位编号数组 + */ + void validPosts(Collection ids); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dept/dto/DeptRespDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dept/dto/DeptRespDTO.java new file mode 100644 index 0000000..bd4a3e5 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dept/dto/DeptRespDTO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.system.api.dept.dto; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import lombok.Data; + +/** + * 部门 Response DTO + * + * @author TW + */ +@Data +public class DeptRespDTO { + + /** + * 部门编号 + */ + private Long id; + /** + * 部门名称 + */ + private String name; + /** + * 父部门编号 + */ + private Long parentId; + /** + * 负责人的用户编号 + */ + private Long leaderUserId; + /** + * 部门状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dict/DictDataApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dict/DictDataApi.java new file mode 100644 index 0000000..fa006ce --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dict/DictDataApi.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.api.dict; + +import com.jojubanking.boot.module.system.api.dict.dto.DictDataRespDTO; + +import java.util.Collection; + +/** + * 字典数据 API 接口 + * + * @author TW + */ +public interface DictDataApi { + + /** + * 校验字典数据们是否有效。如下情况,视为无效: + * 1. 字典数据不存在 + * 2. 字典数据被禁用 + * + * @param dictType 字典类型 + * @param values 字典数据值的数组 + */ + void validDictDatas(String dictType, Collection values); + + /** + * 获得指定的字典数据,从缓存中 + * + * @param type 字典类型 + * @param value 字典数据值 + * @return 字典数据 + */ + DictDataRespDTO getDictData(String type, String value); + + /** + * 解析获得指定的字典数据,从缓存中 + * + * @param type 字典类型 + * @param label 字典数据标签 + * @return 字典数据 + */ + DictDataRespDTO parseDictData(String type, String label); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dict/dto/DictDataRespDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dict/dto/DictDataRespDTO.java new file mode 100644 index 0000000..c24472e --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/dict/dto/DictDataRespDTO.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.api.dict.dto; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import lombok.Data; + +/** + * 字典数据 Response DTO + * + * @author TW + */ +@Data +public class DictDataRespDTO { + + /** + * 字典标签 + */ + private String label; + /** + * 字典值 + */ + private String value; + /** + * 字典类型 + */ + private String dictType; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/errorcode/ErrorCodeApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/errorcode/ErrorCodeApi.java new file mode 100644 index 0000000..417f893 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/errorcode/ErrorCodeApi.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.api.errorcode; + +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeRespDTO; + +import javax.validation.Valid; +import java.util.Date; +import java.util.List; + +/** + * 错误码 Api 接口 + * + * @author TW + */ +public interface ErrorCodeApi { + + /** + * 自动创建错误码 + * + * @param autoGenerateDTOs 错误码信息 + */ + void autoGenerateErrorCodes(@Valid List autoGenerateDTOs); + + /** + * 增量获得错误码数组 + * + * 如果 minUpdateTime 为空时,则获取所有错误码 + * + * @param applicationName 应用名 + * @param minUpdateTime 最小更新时间 + * @return 错误码数组 + */ + List getErrorCodeList(String applicationName, Date minUpdateTime); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/errorcode/dto/ErrorCodeAutoGenerateReqDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/errorcode/dto/ErrorCodeAutoGenerateReqDTO.java new file mode 100644 index 0000000..11e572f --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/errorcode/dto/ErrorCodeAutoGenerateReqDTO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.api.errorcode.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 错误码自动生成 DTO + * + * @author dylan + */ +@Data +@Accessors(chain = true) +public class ErrorCodeAutoGenerateReqDTO { + + /** + * 应用名 + */ + @NotNull(message = "应用名不能为空") + private String applicationName; + /** + * 错误码编码 + */ + @NotNull(message = "错误码编码不能为空") + private Integer code; + /** + * 错误码错误提示 + */ + @NotEmpty(message = "错误码错误提示不能为空") + private String message; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/errorcode/dto/ErrorCodeRespDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/errorcode/dto/ErrorCodeRespDTO.java new file mode 100644 index 0000000..2177fcb --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/errorcode/dto/ErrorCodeRespDTO.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.system.api.errorcode.dto; + +import lombok.Data; + +import java.util.Date; + +/** + * 错误码的 Response DTO + * + * @author TW + */ +@Data +public class ErrorCodeRespDTO { + + /** + * 错误码编码 + */ + private Integer code; + /** + * 错误码错误提示 + */ + private String message; + /** + * 更新时间 + */ + private Date updateTime; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/logger/LoginLogApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/logger/LoginLogApi.java new file mode 100644 index 0000000..aee764e --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/logger/LoginLogApi.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.api.logger; + +import com.jojubanking.boot.module.system.api.logger.dto.LoginLogCreateReqDTO; + +import javax.validation.Valid; + +/** + * 登录日志的 API 接口 + * + * @author TW + */ +public interface LoginLogApi { + + /** + * 创建登录日志 + * + * @param reqDTO 日志信息 + */ + void createLoginLog(@Valid LoginLogCreateReqDTO reqDTO); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/logger/OperateLogApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/logger/OperateLogApi.java new file mode 100644 index 0000000..fe5a5ca --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/logger/OperateLogApi.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.api.logger; + +import com.jojubanking.boot.module.system.api.logger.dto.OperateLogCreateReqDTO; + +import javax.validation.Valid; + +/** + * 操作日志 API 接口 + * + * @author TW + */ +public interface OperateLogApi { + + /** + * 创建操作日志 + * + * @param createReqDTO 请求 + */ + void createOperateLog(@Valid OperateLogCreateReqDTO createReqDTO); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/logger/dto/LoginLogCreateReqDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/logger/dto/LoginLogCreateReqDTO.java new file mode 100644 index 0000000..05761a9 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/logger/dto/LoginLogCreateReqDTO.java @@ -0,0 +1,62 @@ +package com.jojubanking.boot.module.system.api.logger.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 登录日志创建 Request DTO + * + * @author TW + */ +@Data +public class LoginLogCreateReqDTO { + + /** + * 日志类型 + */ + @NotNull(message = "日志类型不能为空") + private Integer logType; + /** + * 链路追踪编号 + */ + private String traceId; + + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + */ + @NotNull(message = "用户类型不能为空") + private Integer userType; + /** + * 用户账号 + */ + @NotBlank(message = "用户账号不能为空") + @Size(max = 30, message = "用户账号长度不能超过30个字符") + private String username; + + /** + * 登录结果 + */ + @NotNull(message = "登录结果不能为空") + private Integer result; + + /** + * 用户 IP + */ + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + /** + * 浏览器 UserAgent + * + * 允许空,原因:Job 过期登出时,是无法传递 UserAgent 的 + */ + private String userAgent; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/logger/dto/OperateLogCreateReqDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/logger/dto/OperateLogCreateReqDTO.java new file mode 100644 index 0000000..1d3706d --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/logger/dto/OperateLogCreateReqDTO.java @@ -0,0 +1,123 @@ +package com.jojubanking.boot.module.system.api.logger.dto; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.Map; + +/** + * 操作日志创建 Request DTO + */ +@Data +public class OperateLogCreateReqDTO { + + /** + * 链路追踪编号 + */ + private String traceId; + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 用户类型 + */ + @NotNull(message = "用户类型不能为空") + private Integer userType; + + /** + * 操作模块 + */ + @NotEmpty(message = "操作模块不能为空") + private String module; + + /** + * 操作名 + */ + @NotEmpty(message = "操作名") + private String name; + + /** + * 操作分类 + */ + @NotNull(message = "操作分类不能为空") + private Integer type; + + /** + * 操作明细 + */ + private String content; + + /** + * 拓展字段 + */ + private Map exts; + + /** + * 请求方法名 + */ + @NotEmpty(message = "请求方法名不能为空") + private String requestMethod; + + /** + * 请求地址 + */ + @NotEmpty(message = "请求地址不能为空") + private String requestUrl; + + /** + * 用户 IP + */ + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + /** + * 浏览器 UserAgent + */ + @NotEmpty(message = "浏览器 UserAgent 不能为空") + private String userAgent; + + /** + * Java 方法名 + */ + @NotEmpty(message = "Java 方法名不能为空") + private String javaMethod; + + /** + * Java 方法的参数 + */ + private String javaMethodArgs; + + /** + * 开始时间 + */ + @NotNull(message = "开始时间不能为空") + private Date startTime; + + /** + * 执行时长,单位:毫秒 + */ + @NotNull(message = "执行时长不能为空") + private Integer duration; + + /** + * 结果码 + */ + @NotNull(message = "结果码不能为空") + private Integer resultCode; + + /** + * 结果提示 + */ + private String resultMsg; + + /** + * 结果数据 + */ + private String resultData; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/oauth2/OAuth2TokenApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/oauth2/OAuth2TokenApi.java new file mode 100644 index 0000000..bc9a542 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/oauth2/OAuth2TokenApi.java @@ -0,0 +1,49 @@ +package com.jojubanking.boot.module.system.api.oauth2; + +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO; +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; + +import javax.validation.Valid; + +/** + * OAuth2.0 Token API 接口 + * + * @author TW + */ +public interface OAuth2TokenApi { + + /** + * 创建访问令牌 + * + * @param reqDTO 访问令牌的创建信息 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenRespDTO createAccessToken(@Valid OAuth2AccessTokenCreateReqDTO reqDTO); + + /** + * 校验访问令牌 + * + * @param accessToken 访问令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenCheckRespDTO checkAccessToken(String accessToken); + + /** + * 移除访问令牌 + * + * @param accessToken 访问令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenRespDTO removeAccessToken(String accessToken); + + /** + * 刷新访问令牌 + * + * @param refreshToken 刷新令牌 + * @param clientId 客户端编号 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenRespDTO refreshAccessToken(String refreshToken, String clientId); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java new file mode 100644 index 0000000..c86806a --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.api.oauth2.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * OAuth2.0 访问令牌的校验 Response DTO + * + * @author TW + */ +@Data +public class OAuth2AccessTokenCheckRespDTO implements Serializable { + + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 租户编号 + */ + private Long tenantId; + /** + * 授权范围的数组 + */ + private List scopes; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java new file mode 100644 index 0000000..9a82dd3 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.api.oauth2.dto; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.validation.InEnum; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * OAuth2.0 访问令牌创建 Request DTO + * + * @author TW + */ +@Data +public class OAuth2AccessTokenCreateReqDTO implements Serializable { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 用户类型 + */ + @NotNull(message = "用户类型不能为空") + @InEnum(value = UserTypeEnum.class, message = "用户类型必须是 {value}") + private Integer userType; + /** + * 客户端编号 + */ + @NotNull(message = "客户端编号不能为空") + private String clientId; + /** + * 授权范围 + */ + private List scopes; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java new file mode 100644 index 0000000..8a362d4 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.api.oauth2.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * OAuth2.0 访问令牌的信息 Response DTO + * + * @author TW + */ +@Data +@Accessors(chain = true) +public class OAuth2AccessTokenRespDTO implements Serializable { + + /** + * 访问令牌 + */ + private String accessToken; + /** + * 刷新令牌 + */ + private String refreshToken; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + */ + private Integer userType; + /** + * 过期时间 + */ + private Date expiresTime; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/package-info.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/package-info.java new file mode 100644 index 0000000..324ecb7 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/package-info.java @@ -0,0 +1,4 @@ +/** + * System API 包,定义暴露给其它模块的 API + */ +package com.jojubanking.boot.module.system.api; diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/permission/PermissionApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/permission/PermissionApi.java new file mode 100644 index 0000000..222414e --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/permission/PermissionApi.java @@ -0,0 +1,49 @@ +package com.jojubanking.boot.module.system.api.permission; + +import com.jojubanking.boot.module.system.api.permission.dto.DeptDataPermissionRespDTO; + +import java.util.Collection; +import java.util.Set; + +/** + * 权限 API 接口 + * + * @author TW + */ +public interface PermissionApi { + + /** + * 获得拥有多个角色的用户编号集合 + * + * @param roleIds 角色编号集合 + * @return 用户编号集合 + */ + Set getUserRoleIdListByRoleIds(Collection roleIds); + + /** + * 判断是否有权限,任一一个即可 + * + * @param userId 用户编号 + * @param permissions 权限 + * @return 是否 + */ + boolean hasAnyPermissions(Long userId, String... permissions); + + /** + * 判断是否有角色,任一一个即可 + * + * @param userId 用户编号 + * @param roles 角色数组 + * @return 是否 + */ + boolean hasAnyRoles(Long userId, String... roles); + + /** + * 获得登陆用户的部门数据权限 + * + * @param userId 用户编号 + * @return 部门数据权限 + */ + DeptDataPermissionRespDTO getDeptDataPermission(Long userId); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/permission/RoleApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/permission/RoleApi.java new file mode 100644 index 0000000..8c772cd --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/permission/RoleApi.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.api.permission; + +import java.util.Collection; + +/** + * 角色 API 接口 + * + * @author TW + */ +public interface RoleApi { + + /** + * 校验角色们是否有效。如下情况,视为无效: + * 1. 角色编号不存在 + * 2. 角色被禁用 + * + * @param ids 角色编号数组 + */ + void validRoles(Collection ids); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/permission/dto/DeptDataPermissionRespDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/permission/dto/DeptDataPermissionRespDTO.java new file mode 100644 index 0000000..9aaee27 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/permission/dto/DeptDataPermissionRespDTO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.system.api.permission.dto; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.HashSet; +import java.util.Set; + +/** + * 部门的数据权限 Response DTO + * + * @author TW + */ +@Data +@Accessors(chain = true) +public class DeptDataPermissionRespDTO { + + /** + * 是否可查看全部数据 + */ + private Boolean all; + /** + * 是否可查看自己的数据 + */ + private Boolean self; + /** + * 可查看的部门编号数组 + */ + private Set deptIds; + + public DeptDataPermissionRespDTO() { + this.all = false; + this.self = false; + this.deptIds = new HashSet<>(); + } + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sensitiveword/SensitiveWordApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sensitiveword/SensitiveWordApi.java new file mode 100644 index 0000000..4ca9ef5 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sensitiveword/SensitiveWordApi.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.system.api.sensitiveword; + +import java.util.List; + +/** + * 敏感词 API 接口 + * + * @author 永不言败 + */ +public interface SensitiveWordApi { + + /** + * 获得文本所包含的不合法的敏感词数组 + * + * @param text 文本 + * @param tags 标签数组 + * @return 不合法的敏感词数组 + */ + List validateText(String text, List tags); + + /** + * 判断文本是否包含敏感词 + * + * @param text 文本 + * @param tags 表述数组 + * @return 是否包含 + */ + boolean isTextValid(String text, List tags); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/SmsCodeApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/SmsCodeApi.java new file mode 100644 index 0000000..a85a74c --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/SmsCodeApi.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.api.sms; + +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeCheckReqDTO; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeUseReqDTO; + +import javax.validation.Valid; + +/** + * 短信验证码 API 接口 + * + * @author TW + */ +public interface SmsCodeApi { + + /** + * 创建短信验证码,并进行发送 + * + * @param reqDTO 发送请求 + */ + void sendSmsCode(@Valid SmsCodeSendReqDTO reqDTO); + + /** + * 验证短信验证码,并进行使用 + * 如果正确,则将验证码标记成已使用 + * 如果错误,则抛出 {@link ServiceException} 异常 + * + * @param reqDTO 使用请求 + */ + void useSmsCode(@Valid SmsCodeUseReqDTO reqDTO); + + /** + * 检查验证码是否有效 + * + * @param reqDTO 校验请求 + */ + void checkSmsCode(@Valid SmsCodeCheckReqDTO reqDTO); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/SmsSendApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/SmsSendApi.java new file mode 100644 index 0000000..eeb25b2 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/SmsSendApi.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.api.sms; + +import com.jojubanking.boot.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; + +import javax.validation.Valid; + +/** + * 短信发送 API 接口 + * + * @author TW + */ +public interface SmsSendApi { + + /** + * 发送单条短信给 Admin 用户 + * + * 在 mobile 为空时,使用 userId 加载对应 Admin 的手机号 + * + * @param reqDTO 发送请求 + * @return 发送日志编号 + */ + Long sendSingleSmsToAdmin(@Valid SmsSendSingleToUserReqDTO reqDTO); + + /** + * 发送单条短信给 Member 用户 + * + * 在 mobile 为空时,使用 userId 加载对应 Member 的手机号 + * + * @param reqDTO 发送请求 + * @return 发送日志编号 + */ + Long sendSingleSmsToMember(@Valid SmsSendSingleToUserReqDTO reqDTO); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeCheckReqDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeCheckReqDTO.java new file mode 100644 index 0000000..0dc8a1a --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeCheckReqDTO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.system.api.sms.dto.code; + +import com.jojubanking.boot.framework.common.validation.InEnum; +import com.jojubanking.boot.framework.common.validation.Mobile; +import com.jojubanking.boot.module.system.enums.sms.SmsSceneEnum; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 短信验证码的校验 Request DTO + * + * @author TW + */ +@Data +public class SmsCodeCheckReqDTO { + + /** + * 手机号 + */ + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + /** + * 发送场景 + */ + @NotNull(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + /** + * 验证码 + */ + @NotEmpty(message = "验证码") + private String code; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java new file mode 100644 index 0000000..8f8b2b0 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeSendReqDTO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.api.sms.dto.code; + +import com.jojubanking.boot.framework.common.validation.InEnum; +import com.jojubanking.boot.framework.common.validation.Mobile; +import com.jojubanking.boot.module.system.enums.sms.SmsSceneEnum; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 短信验证码的发送 Request DTO + * + * @author TW + */ +@Data +@Accessors(chain = true) +public class SmsCodeSendReqDTO { + + /** + * 手机号 + */ + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + /** + * 发送场景 + */ + @NotNull(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + /** + * 发送 IP + */ + @NotEmpty(message = "发送 IP 不能为空") + private String createIp; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java new file mode 100644 index 0000000..0bc2b7e --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeUseReqDTO.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.api.sms.dto.code; + +import com.jojubanking.boot.framework.common.validation.InEnum; +import com.jojubanking.boot.framework.common.validation.Mobile; +import com.jojubanking.boot.module.system.enums.sms.SmsSceneEnum; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 短信验证码的使用 Request DTO + * + * @author TW + */ +@Data +public class SmsCodeUseReqDTO { + + /** + * 手机号 + */ + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + /** + * 发送场景 + */ + @NotNull(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + /** + * 验证码 + */ + @NotEmpty(message = "验证码") + private String code; + /** + * 使用 IP + */ + @NotEmpty(message = "使用 IP 不能为空") + private String usedIp; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java new file mode 100644 index 0000000..4b2fcb0 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.api.sms.dto.send; + +import com.jojubanking.boot.framework.common.validation.Mobile; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import java.util.Map; + +/** + * 短信发送给 Admin 或者 Member 用户 + * + * @author TW + */ +@Data +public class SmsSendSingleToUserReqDTO { + + /** + * 用户编号 + */ + private Long userId; + /** + * 手机号 + */ + @Mobile + private String mobile; + /** + * 短信模板编号 + */ + @NotEmpty(message = "短信模板编号不能为空") + private String templateCode; + /** + * 短信模板参数 + */ + private Map templateParams; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/social/SocialUserApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/social/SocialUserApi.java new file mode 100644 index 0000000..8d2d97f --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/social/SocialUserApi.java @@ -0,0 +1,53 @@ +package com.jojubanking.boot.module.system.api.social; + +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserUnbindReqDTO; +import com.jojubanking.boot.module.system.enums.social.SocialTypeEnum; + +import javax.validation.Valid; + +/** + * 社交用户的 API 接口 + * + * @author TW + */ +public interface SocialUserApi { + + /** + * 获得社交平台的授权 URL + * + * @param type 社交平台的类型 {@link SocialTypeEnum} + * @param redirectUri 重定向 URL + * @return 社交平台的授权 URL + */ + String getAuthorizeUrl(Integer type, String redirectUri); + + /** + * 绑定社交用户 + * + * @param reqDTO 绑定信息 + */ + void bindSocialUser(@Valid SocialUserBindReqDTO reqDTO); + + /** + * 取消绑定社交用户 + * + * @param reqDTO 解绑 + */ + void unbindSocialUser(@Valid SocialUserUnbindReqDTO reqDTO); + + /** + * 获得社交用户的绑定用户编号 + * 注意,返回的是 MemberUser 或者 AdminUser 的 id 编号! + * 在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常 + * + * @param userType 用户类型 + * @param type 社交平台的类型 + * @param code 授权码 + * @param state state + * @return 绑定用户编号 + */ + Long getBindUserId(Integer userType, Integer type, String code, String state); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/social/dto/SocialUserBindReqDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/social/dto/SocialUserBindReqDTO.java new file mode 100644 index 0000000..0d0e2a0 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/social/dto/SocialUserBindReqDTO.java @@ -0,0 +1,54 @@ +package com.jojubanking.boot.module.system.api.social.dto; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.validation.InEnum; +import com.jojubanking.boot.module.system.enums.social.SocialTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 取消绑定社交用户 Request DTO + * + * @author TW + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class SocialUserBindReqDTO { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 用户类型 + */ + @InEnum(UserTypeEnum.class) + @NotNull(message = "用户类型不能为空") + private Integer userType; + + /** + * 社交平台的类型 + */ + @InEnum(SocialTypeEnum.class) + @NotNull(message = "社交平台的类型不能为空") + private Integer type; + /** + * 授权码 + */ + @NotEmpty(message = "授权码不能为空") + private String code; + /** + * state + */ + @NotNull(message = "state 不能为空") + private String state; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/social/dto/SocialUserUnbindReqDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/social/dto/SocialUserUnbindReqDTO.java new file mode 100644 index 0000000..2ba4216 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/social/dto/SocialUserUnbindReqDTO.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.system.api.social.dto; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.validation.InEnum; +import com.jojubanking.boot.module.system.enums.social.SocialTypeEnum; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 社交绑定 Request DTO,使用 code 授权码 + * + * @author TW + */ +@Data +public class SocialUserUnbindReqDTO { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + /** + * 用户类型 + */ + @InEnum(UserTypeEnum.class) + @NotNull(message = "用户类型不能为空") + private Integer userType; + + /** + * 社交平台的类型 + */ + @InEnum(SocialTypeEnum.class) + @NotNull(message = "社交平台的类型不能为空") + private Integer type; + + /** + * 社交平台的 unionId + */ + @NotEmpty(message = "社交平台的 unionId 不能为空") + private String unionId; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/tenant/TenantApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/tenant/TenantApi.java new file mode 100644 index 0000000..9631eca --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/tenant/TenantApi.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.system.api.tenant; + +import java.util.List; + +/** + * 多租户的 API 接口 + * + * @author TW + */ +public interface TenantApi { + + /** + * 获得所有租户 + * + * @return 租户编号数组 + */ + List getTenantIds(); + + /** + * 校验租户是否合法 + * + * @param id 租户编号 + */ + void validTenant(Long id); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/user/AdminUserApi.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/user/AdminUserApi.java new file mode 100644 index 0000000..84f7a26 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/user/AdminUserApi.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.api.user; + +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.system.api.user.dto.AdminUserRespDTO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Admin 用户 API 接口 + * + * @author TW + */ +public interface AdminUserApi { + + /** + * 通过用户 ID 查询用户 + * + * @param id 用户ID + * @return 用户对象信息 + */ + AdminUserRespDTO getUser(Long id); + + /** + * 通过用户 ID 查询用户们 + * + * @param ids 用户 ID 们 + * @return 用户对象信息 + */ + List getUsers(Collection ids); + + /** + * 获得指定部门的用户数组 + * + * @param deptIds 部门数组 + * @return 用户数组 + */ + List getUsersByDeptIds(Collection deptIds); + + /** + * 获得指定岗位的用户数组 + * + * @param postIds 岗位数组 + * @return 用户数组 + */ + List getUsersByPostIds(Collection postIds); + + /** + * 获得用户 Map + * + * @param ids 用户编号数组 + * @return 用户 Map + */ + default Map getUserMap(Collection ids) { + List users = getUsers(ids); + return CollectionUtils.convertMap(users, AdminUserRespDTO::getId); + } + + /** + * 校验用户们是否有效。如下情况,视为无效: + * 1. 用户编号不存在 + * 2. 用户被禁用 + * + * @param ids 用户编号数组 + */ + void validUsers(Set ids); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/user/dto/AdminUserRespDTO.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/user/dto/AdminUserRespDTO.java new file mode 100644 index 0000000..116101b --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/api/user/dto/AdminUserRespDTO.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.system.api.user.dto; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import lombok.Data; + +import java.util.Set; + +/** + * Admin 用户 Response DTO + * + * @author TW + */ +@Data +public class AdminUserRespDTO { + + /** + * 用户ID + */ + private Long id; + /** + * 用户昵称 + */ + private String nickname; + /** + * 帐号状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + + /** + * 部门ID + */ + private Long deptId; + /** + * 岗位编号数组 + */ + private Set postIds; + /** + * 手机号码 + */ + private String mobile; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/DictTypeConstants.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/DictTypeConstants.java new file mode 100644 index 0000000..af1eafe --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/DictTypeConstants.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.enums; + +/** + * System 字典类型的枚举类 + * + * @author TW + */ +public interface DictTypeConstants { + + String USER_TYPE = "user_type"; // 用户类型 + String COMMON_STATUS = "common_status"; // 系统状态 + + String FEE_FLAG = "fee_flag"; // 缴费标识 + String ITEM_TYPE = "item_type"; // 缴费标识 + + // ========== SYSTEM 模块 ========== + + String USER_SEX = "system_user_sex"; // 用户性别 + + String OPERATE_TYPE = "system_operate_type"; // 操作类型 + + String LOGIN_TYPE = "system_login_type"; // 登录日志的类型 + String LOGIN_RESULT = "system_login_result"; // 登录结果 + + String ERROR_CODE_TYPE = "system_error_code_type"; // 错误码的类型枚举 + + String SMS_CHANNEL_CODE = "system_sms_channel_code"; // 短信渠道编码 + String SMS_TEMPLATE_TYPE = "system_sms_template_type"; // 短信模板类型 + String SMS_SEND_STATUS = "system_sms_send_status"; // 短信发送状态 + String SMS_RECEIVE_STATUS = "system_sms_receive_status"; // 短信接收状态 + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/ErrorCodeConstants.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..e59fe8a --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/ErrorCodeConstants.java @@ -0,0 +1,211 @@ +package com.jojubanking.boot.module.system.enums; + +import com.jojubanking.boot.framework.common.exception.ErrorCode; + +/** + * System 错误码枚举类 + * + * system 系统,使用 1-002-000-000 段 + */ +public interface ErrorCodeConstants { + + // ========== AUTH 模块 1002000000 ========== + ErrorCode AUTH_LOGIN_BAD_CREDENTIALS = new ErrorCode(1002000000, "登录失败,账号密码不正确"); + ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1002000001, "登录失败,账号被禁用"); + ErrorCode AUTH_LOGIN_CAPTCHA_NOT_FOUND = new ErrorCode(1002000003, "验证码不存在"); + ErrorCode AUTH_LOGIN_CAPTCHA_CODE_ERROR = new ErrorCode(1002000004, "验证码不正确"); + ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1002000005, "未绑定账号,需要进行绑定"); + ErrorCode AUTH_TOKEN_EXPIRED = new ErrorCode(1002000006, "Token 已经过期"); + ErrorCode AUTH_MOBILE_NOT_EXISTS = new ErrorCode(1002000007, "手机号不存在"); + + // ========== 菜单模块 1002001000 ========== + ErrorCode MENU_NAME_DUPLICATE = new ErrorCode(1002001000, "已经存在该名字的菜单"); + ErrorCode MENU_PARENT_NOT_EXISTS = new ErrorCode(1002001001, "父菜单不存在"); + ErrorCode MENU_PARENT_ERROR = new ErrorCode(1002001002, "不能设置自己为父菜单"); + ErrorCode MENU_NOT_EXISTS = new ErrorCode(1002001003, "菜单不存在"); + ErrorCode MENU_EXISTS_CHILDREN = new ErrorCode(1002001004, "存在子菜单,无法删除"); + ErrorCode MENU_PARENT_NOT_DIR_OR_MENU = new ErrorCode(1002001005, "父菜单的类型必须是目录或者菜单"); + + // ========== 角色模块 1002002000 ========== + ErrorCode ROLE_NOT_EXISTS = new ErrorCode(1002002000, "角色不存在"); + ErrorCode ROLE_NAME_DUPLICATE = new ErrorCode(1002002001, "已经存在名为【{}】的角色"); + ErrorCode ROLE_CODE_DUPLICATE = new ErrorCode(1002002002, "已经存在编码为【{}】的角色"); + ErrorCode ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE = new ErrorCode(1002002003, "不能操作类型为系统内置的角色"); + ErrorCode ROLE_IS_DISABLE = new ErrorCode(1002002004, "名字为【{}】的角色已被禁用"); + ErrorCode ROLE_ADMIN_CODE_ERROR = new ErrorCode(1002002005, "编码【{}】不能使用"); + + // ========== 用户模块 1002003000 ========== + ErrorCode USER_USERNAME_EXISTS = new ErrorCode(1002003000, "用户账号已经存在"); + ErrorCode USER_MOBILE_EXISTS = new ErrorCode(1002003001, "手机号已经存在"); + ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1002003002, "邮箱已经存在"); + ErrorCode USER_NOT_EXISTS = new ErrorCode(1002003003, "用户不存在"); + ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1002003004, "导入用户数据不能为空!"); + ErrorCode USER_PASSWORD_FAILED = new ErrorCode(1002003005, "用户密码校验失败"); + ErrorCode USER_IS_DISABLE = new ErrorCode(1002003006, "名字为【{}】的用户已被禁用"); + ErrorCode USER_COUNT_MAX = new ErrorCode(1002003008, "创建用户失败,原因:超过租户最大租户配额({})!"); + + // ========== 部门模块 1002004000 ========== + ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1002004000, "已经存在该名字的部门"); + ErrorCode DEPT_PARENT_NOT_EXITS = new ErrorCode(1002004001,"父级部门不存在"); + ErrorCode DEPT_NOT_FOUND = new ErrorCode(1002004002, "当前部门不存在"); + ErrorCode DEPT_EXITS_CHILDREN = new ErrorCode(1002004003, "存在子部门,无法删除"); + ErrorCode DEPT_PARENT_ERROR = new ErrorCode(1002004004, "不能设置自己为父部门"); + ErrorCode DEPT_EXISTS_USER = new ErrorCode(1002004005, "部门中存在员工,无法删除"); + ErrorCode DEPT_NOT_ENABLE = new ErrorCode(1002004006, "部门不处于开启状态,不允许选择"); + ErrorCode DEPT_PARENT_IS_CHILD = new ErrorCode(1002004007, "不能设置自己的子部门为父部门"); + + // ========== 岗位模块 1002005000 ========== + ErrorCode POST_NOT_FOUND = new ErrorCode(1002005000, "当前岗位不存在"); + ErrorCode POST_NOT_ENABLE = new ErrorCode(1002005001, "岗位({}) 不处于开启状态,不允许选择"); + ErrorCode POST_NAME_DUPLICATE = new ErrorCode(1002005002, "已经存在该名字的岗位"); + ErrorCode POST_CODE_DUPLICATE = new ErrorCode(1002005003, "已经存在该标识的岗位"); + + // ========== 字典类型 1002006000 ========== + ErrorCode DICT_TYPE_NOT_EXISTS = new ErrorCode(1002006001, "当前字典类型不存在"); + ErrorCode DICT_TYPE_NOT_ENABLE = new ErrorCode(1002006002, "字典类型不处于开启状态,不允许选择"); + ErrorCode DICT_TYPE_NAME_DUPLICATE = new ErrorCode(1002006003, "已经存在该名字的字典类型"); + ErrorCode DICT_TYPE_TYPE_DUPLICATE = new ErrorCode(1002006004, "已经存在该类型的字典类型"); + ErrorCode DICT_TYPE_HAS_CHILDREN = new ErrorCode(1002006005, "无法删除,该字典类型还有字典数据"); + + // ========== 字典数据 1002007000 ========== + ErrorCode DICT_DATA_NOT_EXISTS = new ErrorCode(1002007001, "当前字典数据不存在"); + ErrorCode DICT_DATA_NOT_ENABLE = new ErrorCode(1002007002, "字典数据({})不处于开启状态,不允许选择"); + ErrorCode DICT_DATA_VALUE_DUPLICATE = new ErrorCode(1002007003, "已经存在该值的字典数据"); + + // ========== 通知公告 1002008000 ========== + ErrorCode NOTICE_NOT_FOUND = new ErrorCode(1002008001, "当前通知公告不存在"); + + // ========== 短信渠道 1002011000 ========== + ErrorCode SMS_CHANNEL_NOT_EXISTS = new ErrorCode(1002011000, "短信渠道不存在"); + ErrorCode SMS_CHANNEL_DISABLE = new ErrorCode(1002011001, "短信渠道不处于开启状态,不允许选择"); + ErrorCode SMS_CHANNEL_HAS_CHILDREN = new ErrorCode(1002011002, "无法删除,该短信渠道还有短信模板"); + + // ========== 短信模板 1002012000 ========== + ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(1002012000, "短信模板不存在"); + ErrorCode SMS_TEMPLATE_CODE_DUPLICATE = new ErrorCode(1002012001, "已经存在编码为【{}】的短信模板"); + + // ========== 短信发送 1002013000 ========== + ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002013000, "手机号不存在"); + ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002013001, "模板参数({})缺失"); + ErrorCode SMS_SEND_TEMPLATE_NOT_EXISTS = new ErrorCode(1002013002, "短信模板不存在"); + + // ========== 短信验证码 1002014000 ========== + ErrorCode SMS_CODE_NOT_FOUND = new ErrorCode(1002014000, "验证码不存在"); + ErrorCode SMS_CODE_EXPIRED = new ErrorCode(1002014001, "验证码已过期"); + ErrorCode SMS_CODE_USED = new ErrorCode(1002014002, "验证码已使用"); + ErrorCode SMS_CODE_NOT_CORRECT = new ErrorCode(1002014003, "验证码不正确"); + ErrorCode SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY = new ErrorCode(1002014004, "超过每日短信发送数量"); + ErrorCode SMS_CODE_SEND_TOO_FAST = new ErrorCode(1002014005, "短信发送过于频率"); + ErrorCode SMS_CODE_IS_EXISTS = new ErrorCode(1002014006, "手机号已被使用"); + ErrorCode SMS_CODE_IS_UNUSED = new ErrorCode(1002014007, "验证码未被使用"); + + // ========== 租户信息 1002015000 ========== + ErrorCode TENANT_NOT_EXISTS = new ErrorCode(1002015000, "租户不存在"); + ErrorCode TENANT_DISABLE = new ErrorCode(1002015001, "名字为【{}】的租户已被禁用"); + ErrorCode TENANT_EXPIRE = new ErrorCode(1002015002, "名字为【{}】的租户已过期"); + ErrorCode TENANT_CAN_NOT_UPDATE_SYSTEM = new ErrorCode(1002015003, "系统租户不能进行修改、删除等操作!"); + + // ========== 租户套餐 1002016000 ========== + ErrorCode TENANT_PACKAGE_NOT_EXISTS = new ErrorCode(1002016000, "租户套餐不存在"); + ErrorCode TENANT_PACKAGE_USED = new ErrorCode(1002016001, "租户正在使用该套餐,请给租户重新设置套餐后再尝试删除"); + ErrorCode TENANT_PACKAGE_DISABLE = new ErrorCode(1002016002, "名字为【{}】的租户套餐已被禁用"); + + // ========== 错误码模块 1002017000 ========== + ErrorCode ERROR_CODE_NOT_EXISTS = new ErrorCode(1002017000, "错误码不存在"); + ErrorCode ERROR_CODE_DUPLICATE = new ErrorCode(1002017001, "已经存在编码为【{}】的错误码"); + + // ========== 社交用户 1002018000 ========== + ErrorCode SOCIAL_USER_AUTH_FAILURE = new ErrorCode(1002018000, "社交授权失败,原因是:{}"); + ErrorCode SOCIAL_USER_UNBIND_NOT_SELF = new ErrorCode(1002018001, "社交解绑失败,非当前用户绑定"); + ErrorCode SOCIAL_USER_NOT_FOUND = new ErrorCode(1002018002, "社交授权失败,找不到对应的用户"); + + // ========== 系统敏感词 1002019000 ========= + ErrorCode SENSITIVE_WORD_NOT_EXISTS = new ErrorCode(1002019000, "系统敏感词在所有标签中都不存在"); + ErrorCode SENSITIVE_WORD_EXISTS = new ErrorCode(1002019001, "系统敏感词已在标签中存在"); + + // ========== OAuth2 客户端 1002020000 ========= + ErrorCode OAUTH2_CLIENT_NOT_EXISTS = new ErrorCode(1002020000, "OAuth2 客户端不存在"); + ErrorCode OAUTH2_CLIENT_EXISTS = new ErrorCode(1002020001, "OAuth2 客户端编号已存在"); + ErrorCode OAUTH2_CLIENT_DISABLE = new ErrorCode(1002020002, "OAuth2 客户端已禁用"); + ErrorCode OAUTH2_CLIENT_AUTHORIZED_GRANT_TYPE_NOT_EXISTS = new ErrorCode(1002020003, "不支持该授权类型"); + ErrorCode OAUTH2_CLIENT_SCOPE_OVER = new ErrorCode(1002020004, "授权范围过大"); + ErrorCode OAUTH2_CLIENT_REDIRECT_URI_NOT_MATCH = new ErrorCode(1002020005, "无效 redirect_uri: {}"); + ErrorCode OAUTH2_CLIENT_CLIENT_SECRET_ERROR = new ErrorCode(1002020006, "无效 client_secret: {}"); + + // ========== OAuth2 授权 1002021000 ========= + ErrorCode OAUTH2_GRANT_CLIENT_ID_MISMATCH = new ErrorCode(1002021000, "client_id 不匹配"); + ErrorCode OAUTH2_GRANT_REDIRECT_URI_MISMATCH = new ErrorCode(1002021001, "redirect_uri 不匹配"); + ErrorCode OAUTH2_GRANT_STATE_MISMATCH = new ErrorCode(1002021002, "state 不匹配"); + ErrorCode OAUTH2_GRANT_CODE_NOT_EXISTS = new ErrorCode(1002021003, "code 不存在"); + + // ========== OAuth2 授权 1002022000 ========= + ErrorCode OAUTH2_CODE_NOT_EXISTS = new ErrorCode(1002022000, "code 不存在"); + ErrorCode OAUTH2_CODE_EXPIRE = new ErrorCode(1002022000, "code 已过期"); + + // =========== 公众号 1002023000 ======================== + ErrorCode USER_INFO_NOT_EXISTS = new ErrorCode(1002023000, "用户信息不存在"); + ErrorCode CAROUSEL_NOT_EXISTS = new ErrorCode(1002023001, "轮播图不存在"); + ErrorCode INFORMATION_NOT_EXISTS = new ErrorCode(1002023002, "指南信息不存在"); + ErrorCode WQ_NOT_EXISTS = new ErrorCode(1002023003, "问卷调查不存在"); + ErrorCode WQWT_NOT_EXISTS = new ErrorCode(1002023004, "问卷调查问题不存在"); + ErrorCode HOSPITAL_NOT_EXISTS = new ErrorCode(1002023005, "医院信息不存在"); + ErrorCode WQDA_NOT_EXISTS = new ErrorCode(1002023006, "问卷调查答案不存在"); + ErrorCode KS_TYPE_NOT_EXISTS = new ErrorCode(1002023007, "科室类别不存在"); + ErrorCode KS_INFO_NOT_EXISTS = new ErrorCode(1002023008, "科室信息不存在"); + ErrorCode DOCTOR_NOT_EXISTS = new ErrorCode(1002023009, "医生信息不存在"); + ErrorCode WQDA_VIEW_NOT_EXISTS = new ErrorCode(1002023010, "VIEW不存在"); + ErrorCode BUILDING_NOT_EXISTS = new ErrorCode(1002023011, "楼层导视不存在"); + ErrorCode LABEL_NOT_EXISTS = new ErrorCode(1002023012, "导视不存在"); + ErrorCode LABEL_EXISTS = new ErrorCode(1002023013, "导视已经存在"); + ErrorCode DZ_QUESTION_NOT_EXISTS = new ErrorCode(1002023014, "导诊管理不存在"); + ErrorCode DZ_TYPE_NOT_EXISTS = new ErrorCode(1002023015, "导诊类型不存在"); + + + // ========== 部门模块 1002004000 ========== + ErrorCode BUILDING_NAME_DUPLICATE = new ErrorCode(1002024000, "已经存在该名字的大楼"); + ErrorCode BUILDING_PARENT_NOT_EXITS = new ErrorCode(1002024001,"父级大楼不存在"); + ErrorCode BUILDING_NOT_FOUND = new ErrorCode(1002024002, "当前大楼不存在"); + ErrorCode BUILDING_EXITS_CHILDREN = new ErrorCode(1002024003, "存在子楼层,无法删除"); + ErrorCode BUILDING_PARENT_ERROR = new ErrorCode(1002024004, "不能设置自己为父大楼"); + ErrorCode BUILDING_EXISTS_USER = new ErrorCode(1002024005, "大楼中存在员工,无法删除"); + ErrorCode BUILDING_NOT_ENABLE = new ErrorCode(1002024006, "大楼不处于开启状态,不允许选择"); + ErrorCode BUILDING_PARENT_IS_CHILD = new ErrorCode(1002024007, "不能设置自己的子楼层为父大楼"); + ErrorCode BUILDING_PARENT_MUST_0 = new ErrorCode(1002024008, "不能设置楼层中楼层"); + ErrorCode USE_COUNT_NOT_EXISTS = new ErrorCode(1002024009, "统计不存在"); + ErrorCode MZJF_NOT_EXISTS = new ErrorCode(1002024010, "门诊缴费不存在"); + ErrorCode RESERVE8_NOT_EXISTS = new ErrorCode(1002024011, "预约挂号不存在"); + + //下园体检 + ErrorCode DEPT_XQ_NOT_EXISTS = new ErrorCode(1002025001, "部门不存在"); + ErrorCode USERS_XQ_NOT_EXISTS = new ErrorCode(1002025002, "用户信息不存在"); + ErrorCode STUDENT_NOT_EXISTS = new ErrorCode(1002025003, "学生信息不存在"); + ErrorCode XYRW_NOT_EXISTS = new ErrorCode(1002025004, "批次信息不存在"); + ErrorCode XY_MAIN_NOT_EXISTS = new ErrorCode(1002025005, "体检信息不存在"); + ErrorCode XY_MAIN_NATIONID_EXISTS = new ErrorCode(1002025008, "身份证重复"); + ErrorCode XY_MAIN_FEE_EXISTS = new ErrorCode(1002025009, "已有缴费信息"); + + ErrorCode ITEM_NOT_EXISTS = new ErrorCode(1002025006, "检查项目不存在"); + ErrorCode CHILDITEM_NOT_EXISTS = new ErrorCode(1002025007, "检查项目子不存在"); + ErrorCode TJ_ORDER_NOT_EXISTS = new ErrorCode(1002025010, "检查项目订单不存在"); + ErrorCode TJ_SYSTEM_ERROR = new ErrorCode(1002025011, "体检系统异常"); + + ErrorCode TJ_SYSTEM_CARDNO_ERROR = new ErrorCode(1002025012, "卡号不存在"); + ErrorCode TJ_SYSTEM_CREATEUSR_ERROR = new ErrorCode(1002025012, "建档失败"); + + ErrorCode ORDER_NOT_EXISTS = new ErrorCode(1002028012, "找不到订单"); + + ErrorCode USER_STUDENT_EXISTS = new ErrorCode(1002029001, "学生已经存在"); + + ErrorCode XYTJJG_NOT_EXISTS = new ErrorCode(1002029002, "HIS项目不存在"); + + ErrorCode ORDER_VIEW_NOT_EXISTS = new ErrorCode(1002029003, "订单不存在"); + ErrorCode MZDM_NOT_EXISTS = new ErrorCode(1002029004, "民族代码不存在"); + ErrorCode TJR_STUDENT_EXISTS = new ErrorCode(1002029005, "体检人已经存在"); + + ErrorCode REFUND_APPLY_NOT_EXISTS = new ErrorCode(1002030001, "申请不存在"); + ErrorCode REFUND_APPLY_SYSTEM_CARDNO_ERROR = new ErrorCode(1002025012, "卡号重复"); + ErrorCode REFUND_APPLY_SYSTEM_IDCARDIMG_ERROR = new ErrorCode(1002025013, "请上传身份证"); + ErrorCode REFUND_APPLY_SYSTEM_BANKCARDIMG_ERROR = new ErrorCode(1002025014, "请上传银行卡"); + ErrorCode REFUND_APPLY_SYSTEM_CHILDIMG_ERROR = new ErrorCode(1002025015, "请上传儿童证件"); + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/ErrorCodeConstants_手动操作.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/ErrorCodeConstants_手动操作.java new file mode 100644 index 0000000..4837245 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/ErrorCodeConstants_手动操作.java @@ -0,0 +1,3 @@ +// TODO 待办:请将下面的错误码复制到 joju-module-system-api 模块的 ErrorCodeConstants 类中。注意,请给“TODO 补充编号”设置一个错误码编号!!! +// ========== 用户信息 TODO 补充编号 ========== +//ErrorCode USER_INFO_NOT_EXISTS = new ErrorCode(TODO 补充编号, "用户信息不存在"); diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/common/SexEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/common/SexEnum.java new file mode 100644 index 0000000..14915d8 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/common/SexEnum.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.enums.common; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 性别的枚举值 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum SexEnum { + + /** 男 */ + MALE(1), + /** 女 */ + FEMALE(2), + /* 未知 */ + UNKNOWN(3); + + /** + * 性别 + */ + private final Integer sex; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/dept/DeptIdEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/dept/DeptIdEnum.java new file mode 100644 index 0000000..3ba8fdb --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/dept/DeptIdEnum.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.system.enums.dept; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 部门编号枚举 + */ +@Getter +@AllArgsConstructor +public enum DeptIdEnum { + + /** + * 根节点 + */ + ROOT(0L); + + private final Long id; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/errorcode/ErrorCodeTypeEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/errorcode/ErrorCodeTypeEnum.java new file mode 100644 index 0000000..e5b7caf --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/errorcode/ErrorCodeTypeEnum.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.enums.errorcode; + +import com.jojubanking.boot.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 错误码的类型枚举 + * + * @author dylan + */ +@AllArgsConstructor +@Getter +public enum ErrorCodeTypeEnum implements IntArrayValuable { + + /** + * 自动生成 + */ + AUTO_GENERATION(1), + /** + * 手动编辑 + */ + MANUAL_OPERATION(2); + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ErrorCodeTypeEnum::getType).toArray(); + + /** + * 类型 + */ + private final Integer type; + + @Override + public int[] array() { + return ARRAYS; + } + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/logger/LoginLogTypeEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/logger/LoginLogTypeEnum.java new file mode 100644 index 0000000..2273373 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/logger/LoginLogTypeEnum.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.enums.logger; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 登录日志的类型枚举 + */ +@Getter +@AllArgsConstructor +public enum LoginLogTypeEnum { + + LOGIN_USERNAME(100), // 使用账号登录 + LOGIN_SOCIAL(101), // 使用社交登录 + LOGIN_MOBILE(103), // 使用手机登陆 + LOGIN_SMS(104), // 使用短信登陆 + + LOGOUT_SELF(200), // 自己主动登出 + LOGOUT_DELETE(202), // 强制退出 + ; + + /** + * 日志类型 + */ + private final Integer type; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/logger/LoginResultEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/logger/LoginResultEnum.java new file mode 100644 index 0000000..0a470b2 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/logger/LoginResultEnum.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.system.enums.logger; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 登录结果的枚举类 + */ +@Getter +@AllArgsConstructor +public enum LoginResultEnum { + + SUCCESS(0), // 成功 + BAD_CREDENTIALS(10), // 账号或密码不正确 + USER_DISABLED(20), // 用户被禁用 + CAPTCHA_NOT_FOUND(30), // 图片验证码不存在 + CAPTCHA_CODE_ERROR(31), // 图片验证码不正确 + + ; + + /** + * 结果 + */ + private final Integer result; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/notice/NoticeTypeEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/notice/NoticeTypeEnum.java new file mode 100644 index 0000000..5efc06c --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/notice/NoticeTypeEnum.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system.enums.notice; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 通知类型 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum NoticeTypeEnum { + + NOTICE(1), + ANNOUNCEMENT(2); + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/oauth2/OAuth2ClientConstants.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/oauth2/OAuth2ClientConstants.java new file mode 100644 index 0000000..10b13b6 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/oauth2/OAuth2ClientConstants.java @@ -0,0 +1,12 @@ +package com.jojubanking.boot.module.system.enums.oauth2; + +/** + * OAuth2.0 客户端的通用枚举 + * + * @author TW + */ +public interface OAuth2ClientConstants { + + String CLIENT_ID_DEFAULT = "default"; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/oauth2/OAuth2GrantTypeEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/oauth2/OAuth2GrantTypeEnum.java new file mode 100644 index 0000000..0131cf9 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/oauth2/OAuth2GrantTypeEnum.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.enums.oauth2; + +import cn.hutool.core.util.ArrayUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * OAuth2 授权类型(模式)的枚举 + * + * @author TW + */ +@AllArgsConstructor +@Getter +public enum OAuth2GrantTypeEnum { + + PASSWORD("password"), // 密码模式 + AUTHORIZATION_CODE("authorization_code"), // 授权码模式 + IMPLICIT("implicit"), // 简化模式 + CLIENT_CREDENTIALS("client_credentials"), // 客户端模式 + REFRESH_TOKEN("refresh_token"), // 刷新模式 + ; + + private final String grantType; + + public static OAuth2GrantTypeEnum getByGranType(String grantType) { + return ArrayUtil.firstMatch(o -> o.getGrantType().equals(grantType), values()); + } + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/DataScopeEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/DataScopeEnum.java new file mode 100644 index 0000000..a08c72a --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/DataScopeEnum.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 数据范围枚举类 + * + * 用于实现数据级别的权限 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum DataScopeEnum { + + ALL(1), // 全部数据权限 + + DEPT_CUSTOM(2), // 指定部门数据权限 + DEPT_ONLY(3), // 部门数据权限 + DEPT_AND_CHILD(4), // 部门及以下数据权限 + + SELF(5); // 仅本人数据权限 + + /** + * 范围 + */ + private final Integer scope; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/MenuIdEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/MenuIdEnum.java new file mode 100644 index 0000000..ffc6b36 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/MenuIdEnum.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Menu 编号枚举 + */ +@Getter +@AllArgsConstructor +public enum MenuIdEnum { + + /** + * 根节点 + */ + ROOT(0L); + + private final Long id; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/MenuTypeEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/MenuTypeEnum.java new file mode 100644 index 0000000..63ed8d0 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/MenuTypeEnum.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 菜单类型枚举类 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum MenuTypeEnum { + + DIR(1), // 目录 + MENU(2), // 菜单 + BUTTON(3) // 按钮 + ; + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/RoleCodeEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/RoleCodeEnum.java new file mode 100644 index 0000000..933c001 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/RoleCodeEnum.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.enums.permission; + +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 角色标识枚举 + */ +@Getter +@AllArgsConstructor +public enum RoleCodeEnum { + + SUPER_ADMIN("super_admin", "超级管理员"), + TENANT_ADMIN("tenant_admin", "租户管理员"), + ; + + /** + * 角色编码 + */ + private final String code; + /** + * 名字 + */ + private final String name; + + public static boolean isSuperAdmin(String code) { + return ObjectUtils.equalsAny(code, SUPER_ADMIN.getCode()); + } + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/RoleTypeEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/RoleTypeEnum.java new file mode 100644 index 0000000..6145c06 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/permission/RoleTypeEnum.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum RoleTypeEnum { + + /** + * 内置角色 + */ + SYSTEM(1), + /** + * 自定义角色 + */ + CUSTOM(2); + + private final Integer type; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/sms/SmsReceiveStatusEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/sms/SmsReceiveStatusEnum.java new file mode 100644 index 0000000..7b5fa56 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/sms/SmsReceiveStatusEnum.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信的接收状态枚举 + * + * @author TW + * @date 2021/2/1 13:39 + */ +@Getter +@AllArgsConstructor +public enum SmsReceiveStatusEnum { + + INIT(0), // 初始化 + SUCCESS(10), // 接收成功 + FAILURE(20), // 接收失败 + ; + + private final int status; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/sms/SmsSceneEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/sms/SmsSceneEnum.java new file mode 100644 index 0000000..84a5236 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/sms/SmsSceneEnum.java @@ -0,0 +1,50 @@ +package com.jojubanking.boot.module.system.enums.sms; + +import cn.hutool.core.util.ArrayUtil; +import com.jojubanking.boot.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 用户短信验证码发送场景的枚举 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum SmsSceneEnum implements IntArrayValuable { + + MEMBER_LOGIN(1, "user-sms-login", "会员用户 - 手机号登陆"), + MEMBER_UPDATE_MOBILE(2, "user-sms-reset-password", "会员用户 - 修改手机"), + MEMBER_FORGET_PASSWORD(3, "user-sms-update-mobile", "会员用户 - 忘记密码"), + + ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录"); + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SmsSceneEnum::getScene).toArray(); + + /** + * 验证场景的编号 + */ + private final Integer scene; + /** + * 模版编码 + */ + private final String templateCode; + /** + * 描述 + */ + private final String description; + + @Override + public int[] array() { + return ARRAYS; + } + + public static SmsSceneEnum getCodeByScene(Integer scene) { + return ArrayUtil.firstMatch(sceneEnum -> sceneEnum.getScene().equals(scene), + values()); + } + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/sms/SmsSendStatusEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/sms/SmsSendStatusEnum.java new file mode 100644 index 0000000..02825ab --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/sms/SmsSendStatusEnum.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信的发送状态枚举 + * + * @author zzf + * @date 2021/2/1 13:39 + */ +@Getter +@AllArgsConstructor +public enum SmsSendStatusEnum { + + INIT(0), // 初始化 + SUCCESS(10), // 发送成功 + FAILURE(20), // 发送失败 + IGNORE(30), // 忽略,即不发送 + ; + + private final int status; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/sms/SmsTemplateTypeEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/sms/SmsTemplateTypeEnum.java new file mode 100644 index 0000000..8984adb --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/sms/SmsTemplateTypeEnum.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.system.enums.sms; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 短信的模板类型枚举 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum SmsTemplateTypeEnum { + + VERIFICATION_CODE(1), // 验证码 + NOTICE(2), // 通知 + PROMOTION(3), // 营销 + ; + + /** + * 类型 + */ + private final int type; + +} diff --git a/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/social/SocialTypeEnum.java b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/social/SocialTypeEnum.java new file mode 100644 index 0000000..153dd69 --- /dev/null +++ b/joju-module-system/joju-module-system-api/src/main/java/com/jojubanking/boot/module/system/enums/social/SocialTypeEnum.java @@ -0,0 +1,72 @@ +package com.jojubanking.boot.module.system.enums.social; + +import cn.hutool.core.util.ArrayUtil; +import com.jojubanking.boot.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 社交平台的类型枚举 + * + * @author TW + */ +@Getter +@AllArgsConstructor +public enum SocialTypeEnum implements IntArrayValuable { + + /** + * Gitee + * 文档链接:https://gitee.com/api/v5/oauth_doc#/ + */ + GITEE(10, "GITEE"), + /** + * 钉钉 + * 文档链接:https://developers.dingtalk.com/document/app/obtain-identity-credentials + */ + DINGTALK(20, "DINGTALK"), + + /** + * 企业微信 + * 文档链接:https://xkcoding.com/2019/08/06/use-justauth-integration-wechat-enterprise.html + */ + WECHAT_ENTERPRISE(30, "WECHAT_ENTERPRISE"), + /** + * 微信公众平台 - 移动端 H5 + * 文档链接:https://www.cnblogs.com/juewuzhe/p/11905461.html + */ + WECHAT_MP(31, "WECHAT_MP"), + /** + * 微信开放平台 - 网站应用 PC 端扫码授权登录 + * 文档链接:https://justauth.wiki/guide/oauth/wechat_open/#_2-申请开发者资质认证 + */ + WECHAT_OPEN(32, "WECHAT_OPEN"), + /** + * 微信小程序 + * 文档链接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html + */ + WECHAT_MINI_APP(34, "WECHAT_MINI_APP"), + ; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SocialTypeEnum::getType).toArray(); + + /** + * 类型 + */ + private final Integer type; + /** + * 类型的标识 + */ + private final String source; + + @Override + public int[] array() { + return ARRAYS; + } + + public static SocialTypeEnum valueOfType(Integer type) { + return ArrayUtil.firstMatch(o -> o.getType().equals(type), values()); + } + +} diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dept/DeptApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dept/DeptApi.class new file mode 100644 index 0000000..8cde812 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dept/DeptApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dept/PostApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dept/PostApi.class new file mode 100644 index 0000000..87e0cb3 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dept/PostApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dept/dto/DeptRespDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dept/dto/DeptRespDTO.class new file mode 100644 index 0000000..a150103 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dept/dto/DeptRespDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dict/DictDataApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dict/DictDataApi.class new file mode 100644 index 0000000..95655c9 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dict/DictDataApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dict/dto/DictDataRespDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dict/dto/DictDataRespDTO.class new file mode 100644 index 0000000..8819ab6 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/dict/dto/DictDataRespDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/errorcode/ErrorCodeApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/errorcode/ErrorCodeApi.class new file mode 100644 index 0000000..de0cdde Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/errorcode/ErrorCodeApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/errorcode/dto/ErrorCodeAutoGenerateReqDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/errorcode/dto/ErrorCodeAutoGenerateReqDTO.class new file mode 100644 index 0000000..ef4afa7 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/errorcode/dto/ErrorCodeAutoGenerateReqDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/errorcode/dto/ErrorCodeRespDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/errorcode/dto/ErrorCodeRespDTO.class new file mode 100644 index 0000000..b48b6de Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/errorcode/dto/ErrorCodeRespDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/logger/LoginLogApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/logger/LoginLogApi.class new file mode 100644 index 0000000..87c09ca Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/logger/LoginLogApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/logger/OperateLogApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/logger/OperateLogApi.class new file mode 100644 index 0000000..7b04d47 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/logger/OperateLogApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/logger/dto/LoginLogCreateReqDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/logger/dto/LoginLogCreateReqDTO.class new file mode 100644 index 0000000..6680bce Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/logger/dto/LoginLogCreateReqDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/logger/dto/OperateLogCreateReqDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/logger/dto/OperateLogCreateReqDTO.class new file mode 100644 index 0000000..2b84ebf Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/logger/dto/OperateLogCreateReqDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/oauth2/OAuth2TokenApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/oauth2/OAuth2TokenApi.class new file mode 100644 index 0000000..8962773 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/oauth2/OAuth2TokenApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.class new file mode 100644 index 0000000..d590955 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenCheckRespDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.class new file mode 100644 index 0000000..a2808f8 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenCreateReqDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.class new file mode 100644 index 0000000..21792fc Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/oauth2/dto/OAuth2AccessTokenRespDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/permission/PermissionApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/permission/PermissionApi.class new file mode 100644 index 0000000..7ed2216 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/permission/PermissionApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/permission/RoleApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/permission/RoleApi.class new file mode 100644 index 0000000..0841de3 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/permission/RoleApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/permission/dto/DeptDataPermissionRespDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/permission/dto/DeptDataPermissionRespDTO.class new file mode 100644 index 0000000..e92831e Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/permission/dto/DeptDataPermissionRespDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sensitiveword/SensitiveWordApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sensitiveword/SensitiveWordApi.class new file mode 100644 index 0000000..27f4d95 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sensitiveword/SensitiveWordApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/SmsCodeApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/SmsCodeApi.class new file mode 100644 index 0000000..14911a4 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/SmsCodeApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/SmsSendApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/SmsSendApi.class new file mode 100644 index 0000000..af85f4b Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/SmsSendApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeCheckReqDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeCheckReqDTO.class new file mode 100644 index 0000000..a87b365 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeCheckReqDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeSendReqDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeSendReqDTO.class new file mode 100644 index 0000000..1e3651c Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeSendReqDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeUseReqDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeUseReqDTO.class new file mode 100644 index 0000000..666153e Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/dto/code/SmsCodeUseReqDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.class new file mode 100644 index 0000000..7a16707 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/sms/dto/send/SmsSendSingleToUserReqDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/social/SocialUserApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/social/SocialUserApi.class new file mode 100644 index 0000000..b81d1b8 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/social/SocialUserApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/social/dto/SocialUserBindReqDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/social/dto/SocialUserBindReqDTO.class new file mode 100644 index 0000000..70bc0f3 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/social/dto/SocialUserBindReqDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/social/dto/SocialUserUnbindReqDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/social/dto/SocialUserUnbindReqDTO.class new file mode 100644 index 0000000..3daab9f Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/social/dto/SocialUserUnbindReqDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/tenant/TenantApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/tenant/TenantApi.class new file mode 100644 index 0000000..0fb0518 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/tenant/TenantApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/user/AdminUserApi.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/user/AdminUserApi.class new file mode 100644 index 0000000..f34c3ab Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/user/AdminUserApi.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/user/dto/AdminUserRespDTO.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/user/dto/AdminUserRespDTO.class new file mode 100644 index 0000000..1f27d82 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/api/user/dto/AdminUserRespDTO.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/DictTypeConstants.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/DictTypeConstants.class new file mode 100644 index 0000000..90e6e9f Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/DictTypeConstants.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/ErrorCodeConstants.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/ErrorCodeConstants.class new file mode 100644 index 0000000..3a76b14 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/ErrorCodeConstants.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/common/SexEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/common/SexEnum.class new file mode 100644 index 0000000..c62ac99 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/common/SexEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/dept/DeptIdEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/dept/DeptIdEnum.class new file mode 100644 index 0000000..64a9f4a Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/dept/DeptIdEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/errorcode/ErrorCodeTypeEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/errorcode/ErrorCodeTypeEnum.class new file mode 100644 index 0000000..f2d64b0 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/errorcode/ErrorCodeTypeEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/logger/LoginLogTypeEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/logger/LoginLogTypeEnum.class new file mode 100644 index 0000000..d88d812 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/logger/LoginLogTypeEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/logger/LoginResultEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/logger/LoginResultEnum.class new file mode 100644 index 0000000..8b48538 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/logger/LoginResultEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/notice/NoticeTypeEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/notice/NoticeTypeEnum.class new file mode 100644 index 0000000..9a12cd9 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/notice/NoticeTypeEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/oauth2/OAuth2ClientConstants.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/oauth2/OAuth2ClientConstants.class new file mode 100644 index 0000000..9cccac7 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/oauth2/OAuth2ClientConstants.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/oauth2/OAuth2GrantTypeEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/oauth2/OAuth2GrantTypeEnum.class new file mode 100644 index 0000000..775e10b Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/oauth2/OAuth2GrantTypeEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/DataScopeEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/DataScopeEnum.class new file mode 100644 index 0000000..2b07c23 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/DataScopeEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/MenuIdEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/MenuIdEnum.class new file mode 100644 index 0000000..4d3d738 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/MenuIdEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/MenuTypeEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/MenuTypeEnum.class new file mode 100644 index 0000000..34ac11a Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/MenuTypeEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/RoleCodeEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/RoleCodeEnum.class new file mode 100644 index 0000000..2988b9c Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/RoleCodeEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/RoleTypeEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/RoleTypeEnum.class new file mode 100644 index 0000000..e746494 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/permission/RoleTypeEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/sms/SmsReceiveStatusEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/sms/SmsReceiveStatusEnum.class new file mode 100644 index 0000000..d29a6e6 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/sms/SmsReceiveStatusEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/sms/SmsSceneEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/sms/SmsSceneEnum.class new file mode 100644 index 0000000..9a1f661 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/sms/SmsSceneEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/sms/SmsSendStatusEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/sms/SmsSendStatusEnum.class new file mode 100644 index 0000000..161822a Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/sms/SmsSendStatusEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/sms/SmsTemplateTypeEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/sms/SmsTemplateTypeEnum.class new file mode 100644 index 0000000..461bd7f Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/sms/SmsTemplateTypeEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/social/SocialTypeEnum.class b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/social/SocialTypeEnum.class new file mode 100644 index 0000000..7877867 Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/classes/com/jojubanking/boot/module/system/enums/social/SocialTypeEnum.class differ diff --git a/joju-module-system/joju-module-system-api/target/joju-module-system-api-2.0.0-beta.jar b/joju-module-system/joju-module-system-api/target/joju-module-system-api-2.0.0-beta.jar new file mode 100644 index 0000000..5eea06d Binary files /dev/null and b/joju-module-system/joju-module-system-api/target/joju-module-system-api-2.0.0-beta.jar differ diff --git a/joju-module-system/joju-module-system-api/target/maven-archiver/pom.properties b/joju-module-system/joju-module-system-api/target/maven-archiver/pom.properties new file mode 100644 index 0000000..8a86500 --- /dev/null +++ b/joju-module-system/joju-module-system-api/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:07:24 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-module-system-api diff --git a/joju-module-system/joju-module-system-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-module-system/joju-module-system-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..f460215 --- /dev/null +++ b/joju-module-system/joju-module-system-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,52 @@ +com\jojubanking\boot\module\system\api\dict\DictDataApi.class +com\jojubanking\boot\module\system\api\user\dto\AdminUserRespDTO.class +com\jojubanking\boot\module\system\enums\notice\NoticeTypeEnum.class +com\jojubanking\boot\module\system\api\permission\RoleApi.class +com\jojubanking\boot\module\system\api\social\SocialUserApi.class +com\jojubanking\boot\module\system\enums\DictTypeConstants.class +com\jojubanking\boot\module\system\api\oauth2\dto\OAuth2AccessTokenCheckRespDTO.class +com\jojubanking\boot\module\system\api\sms\dto\code\SmsCodeSendReqDTO.class +com\jojubanking\boot\module\system\enums\sms\SmsSendStatusEnum.class +com\jojubanking\boot\module\system\api\permission\PermissionApi.class +com\jojubanking\boot\module\system\enums\ErrorCodeConstants.class +com\jojubanking\boot\module\system\api\logger\dto\OperateLogCreateReqDTO.class +com\jojubanking\boot\module\system\enums\permission\RoleCodeEnum.class +com\jojubanking\boot\module\system\api\permission\dto\DeptDataPermissionRespDTO.class +com\jojubanking\boot\module\system\api\dict\dto\DictDataRespDTO.class +com\jojubanking\boot\module\system\api\sms\dto\code\SmsCodeCheckReqDTO.class +com\jojubanking\boot\module\system\api\logger\LoginLogApi.class +com\jojubanking\boot\module\system\enums\logger\LoginLogTypeEnum.class +com\jojubanking\boot\module\system\enums\oauth2\OAuth2ClientConstants.class +com\jojubanking\boot\module\system\api\oauth2\dto\OAuth2AccessTokenCreateReqDTO.class +com\jojubanking\boot\module\system\api\sms\SmsCodeApi.class +com\jojubanking\boot\module\system\api\user\AdminUserApi.class +com\jojubanking\boot\module\system\api\dept\dto\DeptRespDTO.class +com\jojubanking\boot\module\system\enums\sms\SmsSceneEnum.class +com\jojubanking\boot\module\system\api\social\dto\SocialUserBindReqDTO.class +com\jojubanking\boot\module\system\api\social\dto\SocialUserUnbindReqDTO.class +com\jojubanking\boot\module\system\enums\errorcode\ErrorCodeTypeEnum.class +com\jojubanking\boot\module\system\api\dept\PostApi.class +com\jojubanking\boot\module\system\api\oauth2\dto\OAuth2AccessTokenRespDTO.class +com\jojubanking\boot\module\system\enums\permission\MenuIdEnum.class +com\jojubanking\boot\module\system\api\sms\dto\code\SmsCodeUseReqDTO.class +com\jojubanking\boot\module\system\api\sms\SmsSendApi.class +com\jojubanking\boot\module\system\enums\oauth2\OAuth2GrantTypeEnum.class +com\jojubanking\boot\module\system\enums\common\SexEnum.class +com\jojubanking\boot\module\system\enums\permission\RoleTypeEnum.class +com\jojubanking\boot\module\system\api\logger\dto\LoginLogCreateReqDTO.class +com\jojubanking\boot\module\system\enums\sms\SmsReceiveStatusEnum.class +com\jojubanking\boot\module\system\api\sms\dto\send\SmsSendSingleToUserReqDTO.class +com\jojubanking\boot\module\system\enums\social\SocialTypeEnum.class +com\jojubanking\boot\module\system\api\tenant\TenantApi.class +com\jojubanking\boot\module\system\api\errorcode\ErrorCodeApi.class +com\jojubanking\boot\module\system\api\errorcode\dto\ErrorCodeAutoGenerateReqDTO.class +com\jojubanking\boot\module\system\api\logger\OperateLogApi.class +com\jojubanking\boot\module\system\enums\sms\SmsTemplateTypeEnum.class +com\jojubanking\boot\module\system\enums\permission\MenuTypeEnum.class +com\jojubanking\boot\module\system\api\dept\DeptApi.class +com\jojubanking\boot\module\system\enums\permission\DataScopeEnum.class +com\jojubanking\boot\module\system\api\errorcode\dto\ErrorCodeRespDTO.class +com\jojubanking\boot\module\system\enums\dept\DeptIdEnum.class +com\jojubanking\boot\module\system\api\oauth2\OAuth2TokenApi.class +com\jojubanking\boot\module\system\api\sensitiveword\SensitiveWordApi.class +com\jojubanking\boot\module\system\enums\logger\LoginResultEnum.class diff --git a/joju-module-system/joju-module-system-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-module-system/joju-module-system-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..4a3cdc7 --- /dev/null +++ b/joju-module-system/joju-module-system-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,54 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\permission\MenuTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\permission\MenuIdEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\errorcode\ErrorCodeApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\logger\LoginLogTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\logger\dto\LoginLogCreateReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\ErrorCodeConstants_手动操作.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\DictTypeConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\oauth2\OAuth2TokenApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\social\dto\SocialUserUnbindReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\permission\DataScopeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\sms\SmsSendStatusEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\oauth2\dto\OAuth2AccessTokenCreateReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\ErrorCodeConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\tenant\TenantApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\sms\SmsCodeApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\permission\RoleCodeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\dept\PostApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\logger\dto\OperateLogCreateReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\oauth2\dto\OAuth2AccessTokenCheckRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\common\SexEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\dept\DeptApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\errorcode\dto\ErrorCodeAutoGenerateReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\permission\PermissionApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\sms\dto\code\SmsCodeUseReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\permission\dto\DeptDataPermissionRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\sms\SmsSceneEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\dict\DictDataApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\logger\LoginResultEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\sms\dto\code\SmsCodeSendReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\errorcode\ErrorCodeTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\oauth2\OAuth2GrantTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\user\dto\AdminUserRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\dept\DeptIdEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\logger\LoginLogApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\user\AdminUserApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\notice\NoticeTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\sensitiveword\SensitiveWordApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\sms\dto\code\SmsCodeCheckReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\oauth2\OAuth2ClientConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\social\SocialTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\sms\SmsSendApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\sms\SmsTemplateTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\sms\SmsReceiveStatusEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\dict\dto\DictDataRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\enums\permission\RoleTypeEnum.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\social\dto\SocialUserBindReqDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\logger\OperateLogApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\permission\RoleApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\oauth2\dto\OAuth2AccessTokenRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\errorcode\dto\ErrorCodeRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\social\SocialUserApi.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\dept\dto\DeptRespDTO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-api\src\main\java\com\jojubanking\boot\module\system\api\sms\dto\send\SmsSendSingleToUserReqDTO.java diff --git a/joju-module-system/joju-module-system-biz/joju-module-system-biz.iml b/joju-module-system/joju-module-system-biz/joju-module-system-biz.iml new file mode 100644 index 0000000..4769643 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/joju-module-system-biz.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/joju-module-system/joju-module-system-biz/lib/aspose-cells-8.5.2.jar b/joju-module-system/joju-module-system-biz/lib/aspose-cells-8.5.2.jar new file mode 100644 index 0000000..d0e1aca Binary files /dev/null and b/joju-module-system/joju-module-system-biz/lib/aspose-cells-8.5.2.jar differ diff --git a/joju-module-system/joju-module-system-biz/lib/aspose-words-15.8.0.jar b/joju-module-system/joju-module-system-biz/lib/aspose-words-15.8.0.jar new file mode 100644 index 0000000..c0e699f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/lib/aspose-words-15.8.0.jar differ diff --git a/joju-module-system/joju-module-system-biz/lib/excel-license.xml b/joju-module-system/joju-module-system-biz/lib/excel-license.xml new file mode 100644 index 0000000..2a69d76 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/lib/excel-license.xml @@ -0,0 +1,13 @@ + + + + Aspose.Total for Java + Aspose.Words for Java + + Enterprise + 20991231 + 20991231 + 8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7 + + sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU= + \ No newline at end of file diff --git a/joju-module-system/joju-module-system-biz/lib/word-license.xml b/joju-module-system/joju-module-system-biz/lib/word-license.xml new file mode 100644 index 0000000..2cbce45 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/lib/word-license.xml @@ -0,0 +1,15 @@ + + + + Aspose.Total for Java + Aspose.Words for Java + + Enterprise + 20991231 + 20991231 + 8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7 + + + sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU= + + diff --git a/joju-module-system/joju-module-system-biz/pom.xml b/joju-module-system/joju-module-system-biz/pom.xml new file mode 100644 index 0000000..4481055 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/pom.xml @@ -0,0 +1,144 @@ + + + + com.jojubanking.boot + joju-module-system + ${revision} + + 4.0.0 + joju-module-system-biz + jar + + ${project.artifactId} + + system 模块下,我们放通用业务,支撑上层的核心业务。 + 例如说:用户、部门、权限、数据字典等等 + + + + + com.jojubanking.boot + joju-module-system-api + ${revision} + + + com.jojubanking.boot + joju-module-infra-api + ${revision} + + + + + + net.coobird + thumbnailator + + 0.4.14 + + + com.aspose + aspose-cells + 8.5.2 + + + + + + + com.jojubanking.boot + joju-spring-boot-starter-biz-operatelog + + + com.jojubanking.boot + joju-spring-boot-starter-biz-sms + + + com.jojubanking.boot + joju-spring-boot-starter-biz-dict + + + com.jojubanking.boot + joju-spring-boot-starter-biz-data-permission + + + com.jojubanking.boot + joju-spring-boot-starter-biz-social + + + com.jojubanking.boot + joju-spring-boot-starter-biz-tenant + + + + + com.jojubanking.boot + joju-spring-boot-starter-security + + + + + com.jojubanking.boot + joju-spring-boot-starter-mybatis + + + + com.jojubanking.boot + joju-spring-boot-starter-redis + + + com.jojubanking.boot + joju-spring-boot-starter-protection + + + + + com.jojubanking.boot + joju-spring-boot-starter-job + + + + + com.jojubanking.boot + joju-spring-boot-starter-mq + + + + + com.jojubanking.boot + joju-spring-boot-starter-test + test + + + + + com.jojubanking.boot + joju-spring-boot-starter-excel + + + com.github.binarywang + weixin-java-mp + 3.4.0 + + + + com.google.zxing + javase + 3.5.0 + + + + com.microsoft.sqlserver + mssql-jdbc + 12.4.2.jre8 + + + com.jojubanking.boot + joju-module-infra-biz + 2.0.0-beta + compile + + + + diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/WebLog.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/WebLog.java new file mode 100644 index 0000000..5a48766 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/WebLog.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system; + +import java.lang.annotation.*; + +/** + * @author T.W + * @site xxx + * @date 2021/9/8 + * @time 下午9:19 + * @discription + **/ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +@Documented +public @interface WebLog { + /** + * 日志描述信息 + * + * @return + */ + String description() default ""; + +} \ No newline at end of file diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/WebLogAspect.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/WebLogAspect.java new file mode 100644 index 0000000..35f9fa2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/WebLogAspect.java @@ -0,0 +1,127 @@ +package com.jojubanking.boot.module.system; + +//import com.google.gson.Gson; + +import com.alibaba.fastjson.JSON; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; + +/** + * @author T.W + * @site xxx + * @date 2021/9/8 + * @time 下午9:19 + * @discription + **/ +@Aspect +@Component +//@Profile({"dev", "test"}) +public class WebLogAspect { + + private final static Logger logger = LoggerFactory.getLogger(WebLogAspect.class); + /** 换行符 */ + private static final String LINE_SEPARATOR = System.lineSeparator(); + + /** 以自定义 @WebLog 注解为切点 */ + @Pointcut("@annotation(com.jojubanking.boot.module.system.WebLog)") + public void webLog() {} + + /** + * 在切点之前织入 + * @param joinPoint + * @throws Throwable + */ + @Before("webLog()") + public void doBefore(JoinPoint joinPoint) throws Throwable { + // 开始打印请求日志 + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletRequest request = attributes.getRequest(); + + // 获取 @WebLog 注解的描述信息 + String methodDescription = getAspectLogDescription(joinPoint); + + // 打印请求相关参数 + logger.info("========================================== Start =========================================="); + // 打印请求 url + logger.info("URL : {}", request.getRequestURL().toString()); + // 打印描述信息 + logger.info("Description : {}", methodDescription); + // 打印 Http method + logger.info("HTTP Method : {}", request.getMethod()); + // 打印调用 controller 的全路径以及执行方法 + logger.info("Class Method : {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName()); + // 打印请求的 IP + logger.info("IP : {}", request.getRemoteAddr()); + // 打印请求入参 + if(methodDescription.equals("loginUserInfo") || methodDescription.equals("quitUserInfo")){ + + }else{ + logger.info("Request Args : {}", JSON.toJSON(joinPoint.getArgs())); + } + } + + /** + * 在切点之后织入 + * @throws Throwable + */ + @After("webLog()") + public void doAfter() throws Throwable { + // 接口结束后换行,方便分割查看 + logger.info("=========================================== End ===========================================" + LINE_SEPARATOR); + } + + /** + * 环绕 + * @param proceedingJoinPoint + * @return + * @throws Throwable + */ + @Around("webLog()") + public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { + long startTime = System.currentTimeMillis(); + Object result = proceedingJoinPoint.proceed(); + // 打印出参 + logger.info("Response Args : {}", JSON.toJSON(result)); + // 执行耗时 + logger.info("Time-Consuming : {} ms", System.currentTimeMillis() - startTime); + return result; + } + + + /** + * 获取切面注解的描述 + * + * @param joinPoint 切点 + * @return 描述信息 + * @throws Exception + */ + public String getAspectLogDescription(JoinPoint joinPoint) + throws Exception { + String targetName = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + Object[] arguments = joinPoint.getArgs(); + Class targetClass = Class.forName(targetName); + Method[] methods = targetClass.getMethods(); + StringBuilder description = new StringBuilder(""); + for (Method method : methods) { + if (method.getName().equals(methodName)) { + Class[] clazzs = method.getParameterTypes(); + if (clazzs.length == arguments.length) { + description.append(method.getAnnotation(WebLog.class).description()); + break; + } + } + } + return description.toString(); + } + +} \ No newline at end of file diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/dept/DeptApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/dept/DeptApiImpl.java new file mode 100644 index 0000000..3492bc8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/dept/DeptApiImpl.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.system.api.dept; + +import com.jojubanking.boot.module.system.api.dept.dto.DeptRespDTO; +import com.jojubanking.boot.module.system.convert.dept.DeptConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.service.dept.DeptService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +/** + * 部门 API 实现类 + * + * @author TW + */ +@Service +public class DeptApiImpl implements DeptApi { + + @Resource + private DeptService deptService; + + @Override + public DeptRespDTO getDept(Long id) { + DeptDO dept = deptService.getDept(id); + return DeptConvert.INSTANCE.convert03(dept); + } + + @Override + public List getDepts(Collection ids) { + List depts = deptService.getDepts(ids); + return DeptConvert.INSTANCE.convertList03(depts); + } + + @Override + public void validDepts(Collection ids) { + deptService.validDepts(ids); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/dept/PostApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/dept/PostApiImpl.java new file mode 100644 index 0000000..627eae0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/dept/PostApiImpl.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.api.dept; + +import com.jojubanking.boot.module.system.service.dept.PostService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; + +/** + * 岗位 API 实现类 + * + * @author TW + */ +@Service +public class PostApiImpl implements PostApi { + + @Resource + private PostService postService; + + @Override + public void validPosts(Collection ids) { + postService.validPosts(ids); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/dict/DictDataApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/dict/DictDataApiImpl.java new file mode 100644 index 0000000..c584d6a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/dict/DictDataApiImpl.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.api.dict; + +import com.jojubanking.boot.module.system.api.dict.dto.DictDataRespDTO; +import com.jojubanking.boot.module.system.convert.dict.DictDataConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictDataDO; +import com.jojubanking.boot.module.system.service.dict.DictDataService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; + +/** + * 字典数据 API 实现类 + * + * @author TW + */ +@Service +public class DictDataApiImpl implements DictDataApi { + + @Resource + private DictDataService dictDataService; + + @Override + public void validDictDatas(String dictType, Collection values) { + dictDataService.validDictDatas(dictType, values); + } + + @Override + public DictDataRespDTO getDictData(String dictType, String value) { + DictDataDO dictData = dictDataService.getDictData(dictType, value); + return DictDataConvert.INSTANCE.convert02(dictData); + } + + @Override + public DictDataRespDTO parseDictData(String dictType, String label) { + DictDataDO dictData = dictDataService.parseDictData(dictType, label); + return DictDataConvert.INSTANCE.convert02(dictData); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/errorcode/ErrorCodeApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/errorcode/ErrorCodeApiImpl.java new file mode 100644 index 0000000..9873b5c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/errorcode/ErrorCodeApiImpl.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.api.errorcode; + +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeRespDTO; +import com.jojubanking.boot.module.system.service.errorcode.ErrorCodeService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + * 错误码 Api 实现类 + * + * @author TW + */ +@Service +public class ErrorCodeApiImpl implements ErrorCodeApi { + + @Resource + private ErrorCodeService errorCodeService; + + @Override + public void autoGenerateErrorCodes(List autoGenerateDTOs) { + errorCodeService.autoGenerateErrorCodes(autoGenerateDTOs); + } + + @Override + public List getErrorCodeList(String applicationName, Date minUpdateTime) { + return errorCodeService.getErrorCodeList(applicationName, minUpdateTime); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/logger/LoginLogApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/logger/LoginLogApiImpl.java new file mode 100644 index 0000000..88983f7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/logger/LoginLogApiImpl.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.api.logger; + +import com.jojubanking.boot.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.jojubanking.boot.module.system.service.logger.LoginLogService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 登录日志的 API 实现类 + * + * @author TW + */ +@Service +@Validated +public class LoginLogApiImpl implements LoginLogApi { + + @Resource + private LoginLogService loginLogService; + + @Override + public void createLoginLog(LoginLogCreateReqDTO reqDTO) { + loginLogService.createLoginLog(reqDTO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/logger/OperateLogApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/logger/OperateLogApiImpl.java new file mode 100644 index 0000000..2675c83 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/logger/OperateLogApiImpl.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.api.logger; + +import com.jojubanking.boot.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.jojubanking.boot.module.system.service.logger.OperateLogService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 操作日志 API 实现类 + * + * @author TW + */ +@Service +@Validated +public class OperateLogApiImpl implements OperateLogApi { + + @Resource + private OperateLogService operateLogService; + + @Override + public void createOperateLog(OperateLogCreateReqDTO createReqDTO) { + operateLogService.createOperateLog(createReqDTO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/oauth2/OAuth2TokenApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/oauth2/OAuth2TokenApiImpl.java new file mode 100644 index 0000000..1dc55f8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/oauth2/OAuth2TokenApiImpl.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.module.system.api.oauth2; + +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO; +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; +import com.jojubanking.boot.module.system.convert.auth.OAuth2TokenConvert; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2TokenService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * OAuth2.0 Token API 实现类 + * + * @author TW + */ +@Service +public class OAuth2TokenApiImpl implements OAuth2TokenApi { + + @Resource + private OAuth2TokenService oauth2TokenService; + + @Override + public OAuth2AccessTokenRespDTO createAccessToken(OAuth2AccessTokenCreateReqDTO reqDTO) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken( + reqDTO.getUserId(), reqDTO.getUserType(), reqDTO.getClientId(), reqDTO.getScopes()); + return OAuth2TokenConvert.INSTANCE.convert2(accessTokenDO); + } + + @Override + public OAuth2AccessTokenCheckRespDTO checkAccessToken(String accessToken) { + return OAuth2TokenConvert.INSTANCE.convert(oauth2TokenService.checkAccessToken(accessToken)); + } + + @Override + public OAuth2AccessTokenRespDTO removeAccessToken(String accessToken) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.removeAccessToken(accessToken); + return OAuth2TokenConvert.INSTANCE.convert2(accessTokenDO); + } + + @Override + public OAuth2AccessTokenRespDTO refreshAccessToken(String refreshToken, String clientId) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, clientId); + return OAuth2TokenConvert.INSTANCE.convert2(accessTokenDO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/permission/PermissionApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/permission/PermissionApiImpl.java new file mode 100644 index 0000000..cca170b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/permission/PermissionApiImpl.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.api.permission; + +import com.jojubanking.boot.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.jojubanking.boot.module.system.service.permission.PermissionService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Set; + +/** + * 权限 API 实现类 + * + * @author TW + */ +@Service +public class PermissionApiImpl implements PermissionApi { + + @Resource + private PermissionService permissionService; + + @Override + public Set getUserRoleIdListByRoleIds(Collection roleIds) { + return permissionService.getUserRoleIdListByRoleIds(roleIds); + } + + @Override + public boolean hasAnyPermissions(Long userId, String... permissions) { + return permissionService.hasAnyPermissions(userId, permissions); + } + + @Override + public boolean hasAnyRoles(Long userId, String... roles) { + return permissionService.hasAnyRoles(userId, roles); + } + + @Override + public DeptDataPermissionRespDTO getDeptDataPermission(Long userId) { + return permissionService.getDeptDataPermission(userId); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/permission/RoleApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/permission/RoleApiImpl.java new file mode 100644 index 0000000..e45963f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/permission/RoleApiImpl.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.api.permission; + +import com.jojubanking.boot.module.system.service.permission.RoleService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; + +/** + * 角色 API 实现类 + * + * @author TW + */ +@Service +public class RoleApiImpl implements RoleApi { + + @Resource + private RoleService roleService; + + @Override + public void validRoles(Collection ids) { + roleService.validRoles(ids); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/sensitiveword/SensitiveWordApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/sensitiveword/SensitiveWordApiImpl.java new file mode 100644 index 0000000..a5e57dc --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/sensitiveword/SensitiveWordApiImpl.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.api.sensitiveword; + +import com.jojubanking.boot.module.system.service.sensitiveword.SensitiveWordService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 敏感词 API 实现类 + * + * @author 永不言败 + */ +@Service +public class SensitiveWordApiImpl implements SensitiveWordApi { + + @Resource + private SensitiveWordService sensitiveWordService; + + @Override + public List validateText(String text, List tags) { + return sensitiveWordService.validateText(text, tags); + } + + @Override + public boolean isTextValid(String text, List tags) { + return sensitiveWordService.isTextValid(text, tags); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/sms/SmsCodeApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/sms/SmsCodeApiImpl.java new file mode 100644 index 0000000..175e8cf --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/sms/SmsCodeApiImpl.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.api.sms; + +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeCheckReqDTO; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeUseReqDTO; +import com.jojubanking.boot.module.system.service.sms.SmsCodeService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 短信验证码 API 实现类 + * + * @author TW + */ +@Service +@Validated +public class SmsCodeApiImpl implements SmsCodeApi { + + @Resource + private SmsCodeService smsCodeService; + + @Override + public void sendSmsCode(SmsCodeSendReqDTO reqDTO) { + smsCodeService.sendSmsCode(reqDTO); + } + + @Override + public void useSmsCode(SmsCodeUseReqDTO reqDTO) { + smsCodeService.useSmsCode(reqDTO); + } + + @Override + public void checkSmsCode(SmsCodeCheckReqDTO reqDTO) { + smsCodeService.checkSmsCode(reqDTO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/sms/SmsSendApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/sms/SmsSendApiImpl.java new file mode 100644 index 0000000..84cba94 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/sms/SmsSendApiImpl.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.api.sms; + +import com.jojubanking.boot.module.system.api.sms.dto.send.SmsSendSingleToUserReqDTO; +import com.jojubanking.boot.module.system.service.sms.SmsSendService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 短信发送 API 接口 + * + * @author TW + */ +@Service +@Validated +public class SmsSendApiImpl implements SmsSendApi { + + @Resource + private SmsSendService smsSendService; + + @Override + public Long sendSingleSmsToAdmin(SmsSendSingleToUserReqDTO reqDTO) { + return smsSendService.sendSingleSmsToAdmin(reqDTO.getMobile(), reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + + @Override + public Long sendSingleSmsToMember(SmsSendSingleToUserReqDTO reqDTO) { + return smsSendService.sendSingleSmsToMember(reqDTO.getMobile(), reqDTO.getUserId(), + reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/social/SocialUserApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/social/SocialUserApiImpl.java new file mode 100644 index 0000000..2313cac --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/social/SocialUserApiImpl.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.system.api.social; + +import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserUnbindReqDTO; +import com.jojubanking.boot.module.system.service.social.SocialUserService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 社交用户的 API 实现类 + * + * @author TW + */ +@Service +@Validated +public class SocialUserApiImpl implements SocialUserApi { + + @Resource + private SocialUserService socialUserService; + + @Override + public String getAuthorizeUrl(Integer type, String redirectUri) { + return socialUserService.getAuthorizeUrl(type, redirectUri); + } + + @Override + public void bindSocialUser(SocialUserBindReqDTO reqDTO) { + socialUserService.bindSocialUser(reqDTO); + } + + @Override + public void unbindSocialUser(SocialUserUnbindReqDTO reqDTO) { + socialUserService.unbindSocialUser(reqDTO.getUserId(), reqDTO.getUserType(), + reqDTO.getType(), reqDTO.getUnionId()); + } + + @Override + public Long getBindUserId(Integer userType, Integer type, String code, String state) { + return socialUserService.getBindUserId(userType, type, code, state); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/tenant/TenantApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/tenant/TenantApiImpl.java new file mode 100644 index 0000000..0e5fe54 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/tenant/TenantApiImpl.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.system.api.tenant; + +import com.jojubanking.boot.module.system.service.tenant.TenantService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 多租户的 API 实现类 + * + * @author TW + */ +@Service +public class TenantApiImpl implements TenantApi { + + @Resource + private TenantService tenantService; + + @Override + public List getTenantIds() { + return tenantService.getTenantIds(); + } + + @Override + public void validTenant(Long id) { + tenantService.validTenant(id); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/user/AdminUserApiImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/user/AdminUserApiImpl.java new file mode 100644 index 0000000..5bd8916 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/api/user/AdminUserApiImpl.java @@ -0,0 +1,54 @@ +package com.jojubanking.boot.module.system.api.user; + +import com.jojubanking.boot.module.system.api.user.dto.AdminUserRespDTO; +import com.jojubanking.boot.module.system.convert.user.UserConvert; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * Admin 用户 API 实现类 + * + * @author TW + */ +@Service +public class AdminUserApiImpl implements AdminUserApi { + + @Resource + private AdminUserService userService; + + @Override + public AdminUserRespDTO getUser(Long id) { + AdminUserDO user = userService.getUser(id); + return UserConvert.INSTANCE.convert4(user); + } + + @Override + public List getUsers(Collection ids) { + List users = userService.getUsers(ids); + return UserConvert.INSTANCE.convertList4(users); + } + + @Override + public List getUsersByDeptIds(Collection deptIds) { + List users = userService.getUsersByDeptIds(deptIds); + return UserConvert.INSTANCE.convertList4(users); + } + + @Override + public List getUsersByPostIds(Collection postIds) { + List users = userService.getUsersByPostIds(postIds); + return UserConvert.INSTANCE.convertList4(users); + } + + @Override + public void validUsers(Set ids) { + userService.validUsers(ids); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/AuthController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/AuthController.http new file mode 100644 index 0000000..c271563 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/AuthController.http @@ -0,0 +1,32 @@ +### 请求 /login 接口 => 成功 +POST {{baseUrl}}/system/auth/login +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "username": "admin", + "password": "admin123", + "uuid": "3acd87a09a4f48fb9118333780e94883", + "code": "1024" +} + +### 请求 /login 接口 => 成功(无验证码) +POST {{baseUrl}}/system/auth/login +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "username": "admin", + "password": "admin123" +} + +### 请求 /get-permission-info 接口 => 成功 +GET {{baseUrl}}/system/auth/get-permission-info +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### 请求 /list-menus 接口 => 成功 +GET {{baseUrl}}/system/list-menus +Authorization: Bearer {{token}} +#Authorization: Bearer a6aa7714a2e44c95aaa8a2c5adc2a67a +tenant-id: {{adminTenentId}} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/AuthController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/AuthController.java new file mode 100644 index 0000000..fe7448f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/AuthController.java @@ -0,0 +1,165 @@ +package com.jojubanking.boot.module.system.controller.admin.auth; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.collection.SetUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.framework.security.config.SecurityProperties; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.*; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.*; +import com.jojubanking.boot.module.system.convert.auth.AuthConvert; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.enums.logger.LoginLogTypeEnum; +import com.jojubanking.boot.module.system.enums.permission.MenuTypeEnum; +import com.jojubanking.boot.module.system.service.auth.AdminAuthService; +import com.jojubanking.boot.module.system.service.permission.PermissionService; +import com.jojubanking.boot.module.system.service.permission.RoleService; +import com.jojubanking.boot.module.system.service.social.SocialUserService; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; +import java.util.Set; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils.obtainAuthorization; +import static java.util.Collections.singleton; + +@Api(tags = "管理后台 - 认证") +@RestController +@RequestMapping("/system/auth") +@Validated +@Slf4j +public class AuthController { + + @Resource + private AdminAuthService authService; + @Resource + private AdminUserService userService; + @Resource + private RoleService roleService; + @Resource + private PermissionService permissionService; + @Resource + private SocialUserService socialUserService; + + @Resource + private SecurityProperties securityProperties; + + @PostMapping("/login") + @PermitAll + @ApiOperation("使用账号密码登录") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult login(@RequestBody @Valid AuthLoginReqVO reqVO) { + return success(authService.login(reqVO)); + } + + @PostMapping("/logout") + @PermitAll + @ApiOperation("登出系统") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult logout(HttpServletRequest request) { + String token = obtainAuthorization(request, securityProperties.getTokenHeader()); + if (StrUtil.isNotBlank(token)) { + authService.logout(token, LoginLogTypeEnum.LOGOUT_SELF.getType()); + } + return success(true); + } + + @PostMapping("/refresh-token") + @PermitAll + @ApiOperation("刷新令牌") + @ApiImplicitParam(name = "refreshToken", value = "刷新令牌", required = true, dataTypeClass = String.class) + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult refreshToken(@RequestParam("refreshToken") String refreshToken) { + return success(authService.refreshToken(refreshToken)); + } + + @GetMapping("/get-permission-info") + @ApiOperation("获取登录用户的权限信息") + public CommonResult getPermissionInfo() { + // 获得用户信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + if (user == null) { + return null; + } + // 获得角色列表 + Set roleIds = permissionService.getUserRoleIdsFromCache(getLoginUserId(), singleton(CommonStatusEnum.ENABLE.getStatus())); + List roleList = roleService.getRolesFromCache(roleIds); + // 获得菜单列表 + List menuList = permissionService.getRoleMenuListFromCache(roleIds, + SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()), + singleton(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的 + // 拼接结果返回 + return success(AuthConvert.INSTANCE.convert(user, roleList, menuList)); + } + + @GetMapping("/list-menus") + @ApiOperation("获得登录用户的菜单列表") + public CommonResult> getMenus() { + // 获得角色列表 + Set roleIds = permissionService.getUserRoleIdsFromCache(getLoginUserId(), singleton(CommonStatusEnum.ENABLE.getStatus())); + // 获得用户拥有的菜单列表 + List menuList = permissionService.getRoleMenuListFromCache(roleIds, + SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), // 只要目录和菜单类型 + singleton(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的 + // 转换成 Tree 结构返回 + return success(AuthConvert.INSTANCE.buildMenuTree(menuList)); + } + + // ========== 短信登录相关 ========== + + @PostMapping("/sms-login") + @PermitAll + @ApiOperation("使用短信验证码登录") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult smsLogin(@RequestBody @Valid AuthSmsLoginReqVO reqVO) { + return success(authService.smsLogin(reqVO)); + } + + @PostMapping("/send-sms-code") + @PermitAll + @ApiOperation(value = "发送手机验证码") + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult sendLoginSmsCode(@RequestBody @Valid AuthSmsSendReqVO reqVO) { + authService.sendSmsCode(reqVO); + return success(true); + } + + // ========== 社交登录相关 ========== + + @GetMapping("/social-auth-redirect") + @PermitAll + @ApiOperation("社交授权的跳转") + @ApiImplicitParams({ + @ApiImplicitParam(name = "type", value = "社交类型", required = true, dataTypeClass = Integer.class), + @ApiImplicitParam(name = "redirectUri", value = "回调路径", dataTypeClass = String.class) + }) + public CommonResult socialLogin(@RequestParam("type") Integer type, + @RequestParam("redirectUri") String redirectUri) { + return CommonResult.success(socialUserService.getAuthorizeUrl(type, redirectUri)); + } + + @PostMapping("/social-login") + @PermitAll + @ApiOperation(value = "社交快捷登录,使用 code 授权码", notes = "适合未登录的用户,但是社交账号已绑定用户") +// @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult socialQuickLogin(@RequestBody @Valid AuthSocialLoginReqVO reqVO) { + return success(authService.socialLogin(reqVO)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginReqVO.java new file mode 100644 index 0000000..787bd8f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginReqVO.java @@ -0,0 +1,75 @@ +package com.jojubanking.boot.module.system.controller.admin.auth.vo; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.validation.InEnum; +import com.jojubanking.boot.module.system.enums.social.SocialTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; + +@ApiModel(value = "管理后台 - 账号密码登录 Request VO", description = "如果登录并绑定社交用户,需要传递 social 开头的参数") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Accessors(chain = true) +public class AuthLoginReqVO { + + @ApiModelProperty(value = "账号", required = true, example = "jojuyuanma") + @NotEmpty(message = "登录账号不能为空") + @Length(min = 4, max = 16, message = "账号长度为 4-16 位") + @Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母") + private String username; + + @ApiModelProperty(value = "密码", required = true, example = "buzhidao") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + + // ========== 图片验证码相关 ========== + + @ApiModelProperty(value = "验证码", required = true, example = "1024", notes = "验证码开启时,需要传递") + @NotEmpty(message = "验证码不能为空", groups = CodeEnableGroup.class) + private String code; + + @ApiModelProperty(value = "验证码的唯一标识", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62", notes = "验证码开启时,需要传递") + @NotEmpty(message = "唯一标识不能为空", groups = CodeEnableGroup.class) + private String uuid; + + // ========== 绑定社交登录时,需要传递如下参数 ========== + + @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") + @InEnum(SocialTypeEnum.class) + private Integer socialType; + + @ApiModelProperty(value = "授权码", required = true, example = "1024") + private String socialCode; + + @ApiModelProperty(value = "state", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") + private String socialState; + + /** + * 开启验证码的 Group + */ + public interface CodeEnableGroup {} + + @AssertTrue(message = "授权码不能为空") + public boolean isSocialCodeValid() { + return socialType == null || StrUtil.isNotEmpty(socialCode); + } + + @AssertTrue(message = "授权 state 不能为空") + public boolean isSocialState() { + return socialType == null || StrUtil.isNotEmpty(socialState); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginRespVO.java new file mode 100644 index 0000000..a745bab --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginRespVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.auth.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@ApiModel("管理后台 - 登录 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthLoginRespVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + private Long userId; + + @ApiModelProperty(value = "访问令牌", required = true, example = "happy") + private String accessToken; + + @ApiModelProperty(value = "刷新令牌", required = true, example = "nice") + private String refreshToken; + + @ApiModelProperty(value = "过期时间", required = true) + private Date expiresTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthMenuRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthMenuRespVO.java new file mode 100644 index 0000000..d890a26 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthMenuRespVO.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.module.system.controller.admin.auth.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@ApiModel("管理后台 - 登录用户的菜单信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthMenuRespVO { + + @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") + private Long id; + + @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") + private Long parentId; + + @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") + private String name; + + @ApiModelProperty(value = "路由地址", example = "post", notes = "仅菜单类型为菜单或者目录时,才需要传") + private String path; + + @ApiModelProperty(value = "组件路径", example = "system/post/index", notes = "仅菜单类型为菜单时,才需要传") + private String component; + + @ApiModelProperty(value = "菜单图标", example = "/menu/list", notes = "仅菜单类型为菜单或者目录时,才需要传") + private String icon; + + @ApiModelProperty(value = "是否可见", required = true, example = "false") + private Boolean visible; + + @ApiModelProperty(value = "是否缓存", required = true, example = "false") + private Boolean keepAlive; + + /** + * 子路由 + */ + private List children; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java new file mode 100644 index 0000000..1ae26eb --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.module.system.controller.admin.auth.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Set; + +@ApiModel(value = "管理后台 - 登录用户的权限信息 Response VO", description = "额外包括用户信息和角色列表") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthPermissionInfoRespVO { + + @ApiModelProperty(value = "用户信息", required = true) + private UserVO user; + + @ApiModelProperty(value = "角色标识数组", required = true) + private Set roles; + + @ApiModelProperty(value = "操作权限数组", required = true) + private Set permissions; + + @ApiModel("用户信息 VO") + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class UserVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "用户昵称", required = true, example = "TW") + private String nickname; + + @ApiModelProperty(value = "用户头像", required = true, example = "http://www.iocoder.cn/xx.jpg") + private String avatar; + + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO.java new file mode 100644 index 0000000..75a8156 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.controller.admin.auth.vo; + +import com.jojubanking.boot.framework.common.validation.Mobile; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; + +@ApiModel("管理后台 - 短信验证码的登录 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthSmsLoginReqVO { + + @ApiModelProperty(value = "手机号", required = true, example = "jojuyuanma") + @NotEmpty(message = "手机号不能为空") + @Mobile + private String mobile; + + @ApiModelProperty(value = "短信验证码", required = true, example = "1024") + @NotEmpty(message = "验证码不能为空") + private String code; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.java new file mode 100644 index 0000000..1672536 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.controller.admin.auth.vo; + +import com.jojubanking.boot.framework.common.validation.InEnum; +import com.jojubanking.boot.framework.common.validation.Mobile; +import com.jojubanking.boot.module.system.enums.sms.SmsSceneEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 发送手机验证码 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthSmsSendReqVO { + + @ApiModelProperty(value = "手机号", required = true, example = "jojuyuanma") + @NotEmpty(message = "手机号不能为空") + @Mobile + private String mobile; + + @ApiModelProperty(value = "短信场景", required = true, example = "1") + @NotNull(message = "发送场景不能为空") + @InEnum(SmsSceneEnum.class) + private Integer scene; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO.java new file mode 100644 index 0000000..58a41c1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.controller.admin.auth.vo; + +import com.jojubanking.boot.framework.common.validation.InEnum; +import com.jojubanking.boot.module.system.enums.social.SocialTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 社交绑定登录 Request VO,使用 code 授权码 + 账号密码") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthSocialLoginReqVO { + + @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值") + @InEnum(SocialTypeEnum.class) + @NotNull(message = "社交平台的类型不能为空") + private Integer type; + + @ApiModelProperty(value = "授权码", required = true, example = "1024") + @NotEmpty(message = "授权码不能为空") + private String code; + + @ApiModelProperty(value = "state", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") + @NotEmpty(message = "state 不能为空") + private String state; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/BuildingController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/BuildingController.java new file mode 100644 index 0000000..568b2e0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/BuildingController.java @@ -0,0 +1,126 @@ +package com.jojubanking.boot.module.system.controller.admin.building; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptRespVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; +import com.jojubanking.boot.module.system.convert.dept.DeptConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.building.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.building.BuildingDO; +import com.jojubanking.boot.module.system.convert.building.BuildingConvert; +import com.jojubanking.boot.module.system.service.building.BuildingService; + +@Api(tags = "管理后台 - 楼层导视") +@RestController +@RequestMapping("/system/building") +@Validated +public class BuildingController { + + @Resource + private BuildingService buildingService; + + @PostMapping("/create") + @ApiOperation("创建楼层导视") + @PreAuthorize("@ss.hasPermission('system:building:create')") + public CommonResult createBuilding(@Valid @RequestBody BuildingCreateReqVO createReqVO) { + return success(buildingService.createBuilding(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新楼层导视") + @PreAuthorize("@ss.hasPermission('system:building:update')") + public CommonResult updateBuilding(@Valid @RequestBody BuildingUpdateReqVO updateReqVO) { + buildingService.updateBuilding(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除楼层导视") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:building:delete')") + public CommonResult deleteBuilding(@RequestParam("id") Long id) { + buildingService.deleteBuilding(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得楼层导视") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:building:query')") + public CommonResult getBuilding(@RequestParam("id") Long id) { + BuildingDO building = buildingService.getBuilding(id); + return success(BuildingConvert.INSTANCE.convert(building)); + } + + @GetMapping("/list") + @ApiOperation("获得楼层导视列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:building:query')") + public CommonResult> getBuildingList(@RequestParam("ids") Collection ids) { + List list = buildingService.getBuildingList(ids); + return success(BuildingConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/list01") + @ApiOperation("获得楼层导视列表01") + @PreAuthorize("@ss.hasPermission('system:building:query')") + public CommonResult> listDepts(BuildingListReqVO reqVO) { + List list = buildingService.getSimpleBuildings(reqVO); + list.sort(Comparator.comparing(BuildingDO::getFid)); + return success(BuildingConvert.INSTANCE.convertList(list)); + } + @GetMapping("/list-all-simple") + @ApiOperation(value = "获取楼层精简信息列表", notes = "只包含被开启的,主要用于前端的下拉选项") + public CommonResult> getSimpleBuildings() { + // 获得部门列表,只要开启状态的 + BuildingListReqVO reqVO = new BuildingListReqVO(); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + List list = buildingService.getSimpleBuildings(reqVO); + // 排序后,返回给前端 + list.sort(Comparator.comparing(BuildingDO::getFid)); + return success(BuildingConvert.INSTANCE.convertList03(list)); + } + + @GetMapping("/page") + @ApiOperation("获得楼层导视分页") + @PreAuthorize("@ss.hasPermission('system:building:query')") + public CommonResult> getBuildingPage(@Valid BuildingPageReqVO pageVO) { + PageResult pageResult = buildingService.getBuildingPage(pageVO); + return success(BuildingConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出楼层导视 Excel") + @PreAuthorize("@ss.hasPermission('system:building:export')") + @OperateLog(type = EXPORT) + public void exportBuildingExcel(@Valid BuildingExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = buildingService.getBuildingList(exportReqVO); + // 导出 Excel + List datas = BuildingConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "楼层导视.xls", "数据", BuildingExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingBaseVO.java new file mode 100644 index 0000000..85a7a42 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingBaseVO.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.system.controller.admin.building.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 楼层导视 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class BuildingBaseVO { + + @ApiModelProperty(value = "大楼名称", required = true) + @NotNull(message = "大楼名称不能为空") + private String name; + + @ApiModelProperty(value = "父大楼id", required = true) + private Long parentId; + + @ApiModelProperty(value = "大楼状态(0正常 1停用)", required = true) + @NotNull(message = "大楼状态(0正常 1停用)不能为空") + private Integer status; + + @ApiModelProperty(value = "楼层id") + @NotNull(message = "楼层id不能为空") + private Integer fid; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingCreateReqVO.java new file mode 100644 index 0000000..d576cc5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.building.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 楼层导视创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BuildingCreateReqVO extends BuildingBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingExcelVO.java new file mode 100644 index 0000000..ac58962 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingExcelVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.controller.admin.building.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 楼层导视 Excel VO + * + * @author admin + */ +@Data +public class BuildingExcelVO { + + @ExcelProperty("大楼id") + private Long id; + + @ExcelProperty("大楼名称") + private String name; + + @ExcelProperty("父大楼id") + private Long parentId; + + @ExcelProperty("大楼状态(0正常 1停用)") + private Integer status; + + @ExcelProperty("楼层id") + private Integer fid; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingExportReqVO.java new file mode 100644 index 0000000..1e0b896 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingExportReqVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.building.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 楼层导视 Excel 导出 Request VO", description = "参数和 BuildingPageReqVO 是一致的") +@Data +public class BuildingExportReqVO { + + @ApiModelProperty(value = "大楼名称") + private String name; + + @ApiModelProperty(value = "父大楼id") + private Long parentId; + + @ApiModelProperty(value = "大楼状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty(value = "楼层id") + private Integer fid; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingListReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingListReqVO.java new file mode 100644 index 0000000..1e1aaed --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingListReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.building.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class BuildingListReqVO { + @ApiModelProperty(value = "大楼名称", example = "门诊", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "大楼状态", example = "1", notes = "参见 枚举类") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingPageReqVO.java new file mode 100644 index 0000000..856765b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingPageReqVO.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.controller.admin.building.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 楼层导视分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BuildingPageReqVO extends PageParam { + + @ApiModelProperty(value = "大楼名称") + private String name; + + @ApiModelProperty(value = "父大楼id") + private Long parentId; + + @ApiModelProperty(value = "大楼状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty(value = "楼层id") + private Integer fid; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingRespVO.java new file mode 100644 index 0000000..439ef06 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.building.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 楼层导视 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BuildingRespVO extends BuildingBaseVO { + + @ApiModelProperty(value = "大楼id", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingSimpleRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingSimpleRespVO.java new file mode 100644 index 0000000..1c38e95 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingSimpleRespVO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.controller.admin.building.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("管理后台 - 部门精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BuildingSimpleRespVO { + @ApiModelProperty(value = "大楼编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "大楼名称", required = true, example = "芋道") + private String name; + + @ApiModelProperty(value = "父大楼 ID", required = true, example = "1024") + private Long parentId; +} + + diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingUpdateReqVO.java new file mode 100644 index 0000000..0c4d74c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.building.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 楼层导视更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BuildingUpdateReqVO extends BuildingBaseVO { + + @ApiModelProperty(value = "大楼id", required = true) + @NotNull(message = "大楼id不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/CarouselController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/CarouselController.java new file mode 100644 index 0000000..6907868 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/CarouselController.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.controller.admin.carousel; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.carousel.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.carousel.CarouselDO; +import com.jojubanking.boot.module.system.convert.carousel.CarouselConvert; +import com.jojubanking.boot.module.system.service.carousel.CarouselService; + +@Api(tags = "管理后台 - 轮播图") +@RestController +@RequestMapping("/system/carousel") +@Validated +public class CarouselController { + + @Resource + private CarouselService carouselService; + + @PostMapping("/create") + @ApiOperation("创建轮播图") + @PreAuthorize("@ss.hasPermission('system:carousel:create')") + public CommonResult createCarousel(@Valid @RequestBody CarouselCreateReqVO createReqVO) { + return success(carouselService.createCarousel(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新轮播图") + @PreAuthorize("@ss.hasPermission('system:carousel:update')") + public CommonResult updateCarousel(@Valid @RequestBody CarouselUpdateReqVO updateReqVO) { + carouselService.updateCarousel(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除轮播图") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:carousel:delete')") + public CommonResult deleteCarousel(@RequestParam("id") Integer id) { + carouselService.deleteCarousel(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得轮播图") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:carousel:query')") + public CommonResult getCarousel(@RequestParam("id") Integer id) { + CarouselDO carousel = carouselService.getCarousel(id); + return success(CarouselConvert.INSTANCE.convert(carousel)); + } + + @GetMapping("/list") + @ApiOperation("获得轮播图列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:carousel:query')") + public CommonResult> getCarouselList(@RequestParam("ids") Collection ids) { + List list = carouselService.getCarouselList(ids); + return success(CarouselConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得轮播图分页") + @PreAuthorize("@ss.hasPermission('system:carousel:query')") + public CommonResult> getCarouselPage(@Valid CarouselPageReqVO pageVO) { + PageResult pageResult = carouselService.getCarouselPage(pageVO); + return success(CarouselConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出轮播图 Excel") + @PreAuthorize("@ss.hasPermission('system:carousel:export')") + @OperateLog(type = EXPORT) + public void exportCarouselExcel(@Valid CarouselExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = carouselService.getCarouselList(exportReqVO); + // 导出 Excel + List datas = CarouselConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "轮播图.xls", "数据", CarouselExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselBaseVO.java new file mode 100644 index 0000000..ec2acca --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselBaseVO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.controller.admin.carousel.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 轮播图 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class CarouselBaseVO { + + @ApiModelProperty(value = "轮播图标题") + private String title; + + @ApiModelProperty(value = "轮播图") + private String img; + + @ApiModelProperty(value = "分类(1、首页轮播图 2、体检轮播图)") + private Integer type; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselCreateReqVO.java new file mode 100644 index 0000000..05b9715 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.carousel.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 轮播图创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CarouselCreateReqVO extends CarouselBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselExcelVO.java new file mode 100644 index 0000000..0cca588 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselExcelVO.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.controller.admin.carousel.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 轮播图 Excel VO + * + * @author admin + */ +@Data +public class CarouselExcelVO { + + @ExcelProperty("用户ID") + private Integer id; + + @ExcelProperty("轮播图标题") + private String title; + + @ExcelProperty("轮播图") + private String img; + + @ExcelProperty("分类(1、首页轮播图 2、体检轮播图)") + private Integer type; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselExportReqVO.java new file mode 100644 index 0000000..88aee4a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselExportReqVO.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.system.controller.admin.carousel.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 轮播图 Excel 导出 Request VO", description = "参数和 CarouselPageReqVO 是一致的") +@Data +public class CarouselExportReqVO { + + @ApiModelProperty(value = "轮播图标题") + private String title; + + @ApiModelProperty(value = "轮播图") + private String img; + + @ApiModelProperty(value = "分类(1、首页轮播图 2、体检轮播图)") + private Integer type; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselPageReqVO.java new file mode 100644 index 0000000..5dfc1ff --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselPageReqVO.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.system.controller.admin.carousel.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 轮播图分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CarouselPageReqVO extends PageParam { + + @ApiModelProperty(value = "轮播图标题") + private String title; + + @ApiModelProperty(value = "轮播图") + private String img; + + @ApiModelProperty(value = "分类(1、首页轮播图 2、体检轮播图)") + private Integer type; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselRespVO.java new file mode 100644 index 0000000..241e11b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselRespVO.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.system.controller.admin.carousel.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 轮播图 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CarouselRespVO extends CarouselBaseVO { + + @ApiModelProperty(value = "用户ID", required = true) + private Integer id; + + @ApiModelProperty(value = "轮播图标题") + private String title; + + @ApiModelProperty(value = "轮播图") + private String img; + + @ApiModelProperty(value = "分类(1、首页轮播图 2、体检轮播图)") + private Integer type; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselUpdateReqVO.java new file mode 100644 index 0000000..5ae8099 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.carousel.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 轮播图更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CarouselUpdateReqVO extends CarouselBaseVO { + + @ApiModelProperty(value = "用户ID", required = true) + @NotNull(message = "用户ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/ChilditemController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/ChilditemController.java new file mode 100644 index 0000000..b1f5625 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/ChilditemController.java @@ -0,0 +1,122 @@ +package com.jojubanking.boot.module.system.controller.admin.childitem; + +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; +import com.jojubanking.boot.module.system.service.item.ItemService; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.text.DecimalFormat; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.childitem.ChilditemDO; +import com.jojubanking.boot.module.system.convert.childitem.ChilditemConvert; +import com.jojubanking.boot.module.system.service.childitem.ChilditemService; + +@Api(tags = "管理后台 - 检查项目子") +@RestController +@RequestMapping("/system/childitem") +@Validated +public class ChilditemController { + + @Resource + private ChilditemService childitemService; + @Resource + private ItemService itemService; + + @PostMapping("/create") + @ApiOperation("创建检查项目子") + @PreAuthorize("@ss.hasPermission('system:childitem:create')") + public CommonResult createChilditem(@Valid @RequestBody ChilditemCreateReqVO createReqVO) { + DecimalFormat df = new DecimalFormat("#"); + Double number = Double.parseDouble(createReqVO.getItemprice())*100; + createReqVO.setItemprice(df.format(number)); + + if(createReqVO.getItemflag() == 2){ + //临床 + createReqVO.setZxks(itemService.getLCzxks(createReqVO.getItemname()).get("zxks").toString()); + createReqVO.setZxksname(itemService.getLCzxks(createReqVO.getItemname()).get("zxksname").toString()); + }else{ + //小项目 + createReqVO.setZxks(itemService.getSFXMMzxks(createReqVO.getItemname()).get("zxks").toString()); + createReqVO.setZxksname(itemService.getSFXMMzxks(createReqVO.getItemname()).get("zxksname").toString()); + } + //开单科室固定的 + createReqVO.setKdks("1071"); + createReqVO.setKdksname("健康管理科"); + + return success(childitemService.createChilditem(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新检查项目子") + @PreAuthorize("@ss.hasPermission('system:childitem:update')") + public CommonResult updateChilditem(@Valid @RequestBody ChilditemUpdateReqVO updateReqVO) { + childitemService.updateChilditem(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除检查项目子") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:childitem:delete')") + public CommonResult deleteChilditem(@RequestParam("id") Long id) { + childitemService.deleteChilditem(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得检查项目子") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:childitem:query')") + public CommonResult getChilditem(@RequestParam("id") Long id) { + ChilditemDO childitem = childitemService.getChilditem(id); + return success(ChilditemConvert.INSTANCE.convert(childitem)); + } + + @GetMapping("/list") + @ApiOperation("获得检查项目子列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:childitem:query')") + public CommonResult> getChilditemList(@RequestParam("ids") Collection ids) { + List list = childitemService.getChilditemList(ids); + return success(ChilditemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得检查项目子分页") + @PreAuthorize("@ss.hasPermission('system:childitem:query')") + public CommonResult> getChilditemPage(@Valid ChilditemPageReqVO pageVO) { + PageResult pageResult = childitemService.getChilditemPage(pageVO); + return success(ChilditemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出检查项目子 Excel") + @PreAuthorize("@ss.hasPermission('system:childitem:export')") + @OperateLog(type = EXPORT) + public void exportChilditemExcel(@Valid ChilditemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = childitemService.getChilditemList(exportReqVO); + // 导出 Excel + List datas = ChilditemConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检查项目子.xls", "数据", ChilditemExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemBaseVO.java new file mode 100644 index 0000000..15e2e1d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemBaseVO.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.system.controller.admin.childitem.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 检查项目子 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ChilditemBaseVO { + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包", required = true) + @NotNull(message = "套餐代码 目前只有一个基础包不能为空") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )", required = true) + @NotNull(message = "标识(1小项目 2临床 )不能为空") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码", required = true) + @NotNull(message = "项目代码不能为空") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "代价 单位分") + private String itemprice; + + @ApiModelProperty(value = "执行科室") + private String zxks; + + @ApiModelProperty(value = "执行科室名称") + private String zxksname; + + @ApiModelProperty(value = "开单科室") + private String kdks; + + @ApiModelProperty(value = "开单科室名称") + private String kdksname; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemCreateReqVO.java new file mode 100644 index 0000000..d59522c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.childitem.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 检查项目子创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ChilditemCreateReqVO extends ChilditemBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemExcelVO.java new file mode 100644 index 0000000..c5da62e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemExcelVO.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.system.controller.admin.childitem.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 检查项目子 Excel VO + * + * @author admin + */ +@Data +public class ChilditemExcelVO { + + @ExcelProperty("ID") + private Long id; + + @ExcelProperty("套餐代码 目前只有一个基础包") + private String packageno; + + @ExcelProperty("标识(1小项目 2临床 )") + private Integer itemflag; + + @ExcelProperty("项目代码") + private String itemno; + + @ExcelProperty("项目名称") + private String itemname; + + @ExcelProperty("代价 单位分") + private String itemprice; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemExportReqVO.java new file mode 100644 index 0000000..cadc0fe --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemExportReqVO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.controller.admin.childitem.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 检查项目子 Excel 导出 Request VO", description = "参数和 ChilditemPageReqVO 是一致的") +@Data +public class ChilditemExportReqVO { + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "代价 单位分") + private String itemprice; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemPageReqVO.java new file mode 100644 index 0000000..37b308e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemPageReqVO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.controller.admin.childitem.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 检查项目子分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ChilditemPageReqVO extends PageParam { + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "代价 单位分") + private String itemprice; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemRespVO.java new file mode 100644 index 0000000..a1d9a77 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.childitem.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 检查项目子 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ChilditemRespVO extends ChilditemBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemUpdateReqVO.java new file mode 100644 index 0000000..c6aff78 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.childitem.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 检查项目子更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ChilditemUpdateReqVO extends ChilditemBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/common/CaptchaController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/common/CaptchaController.http new file mode 100644 index 0000000..2033fac --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/common/CaptchaController.http @@ -0,0 +1,3 @@ +### 请求 /captcha/get-image 接口 => 成功 +GET {{baseUrl}}/system/captcha/get-image +tenant-id: {{adminTenentId}} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/common/CaptchaController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/common/CaptchaController.java new file mode 100644 index 0000000..a6d4d8e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/common/CaptchaController.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.controller.admin.common; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.module.system.controller.admin.common.vo.CaptchaImageRespVO; +import com.jojubanking.boot.module.system.service.common.CaptchaService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - 验证码") +@RestController +@RequestMapping("/system/captcha") +public class CaptchaController { + + @Resource + private CaptchaService captchaService; + + @GetMapping("/get-image") + @PermitAll + @ApiOperation("生成图片验证码") + public CommonResult getCaptchaImage() { + return success(captchaService.getCaptchaImage()); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/common/vo/CaptchaImageRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/common/vo/CaptchaImageRespVO.java new file mode 100644 index 0000000..a44e9e6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/common/vo/CaptchaImageRespVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.controller.admin.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +@ApiModel("管理后台 - 验证码图片 Response VO") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class CaptchaImageRespVO { + + @ApiModelProperty(value = "是否开启", required = true, example = "true", notes = "如果为 false,则关闭验证码功能") + private Boolean enable; + + @ApiModelProperty(value = "uuid", example = "1b3b7d00-83a8-4638-9e37-d67011855968", + notes = "enable = true 时,非空!通过该 uuid 作为该验证码的标识") + private String uuid; + + @ApiModelProperty(value = "图片", notes = "enable = true 时,非空!验证码的图片内容,使用 Base64 编码") + private String img; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/DeptController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/DeptController.java new file mode 100644 index 0000000..79d1736 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/DeptController.java @@ -0,0 +1,87 @@ +package com.jojubanking.boot.module.system.controller.admin.dept; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.*; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.*; +import com.jojubanking.boot.module.system.convert.dept.DeptConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.service.dept.DeptService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Comparator; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - 部门") +@RestController +@RequestMapping("/system/dept") +@Validated +public class DeptController { + + @Resource + private DeptService deptService; + + @PostMapping("create") + @ApiOperation("创建部门") + @PreAuthorize("@ss.hasPermission('system:dept:create')") + public CommonResult createDept(@Valid @RequestBody DeptCreateReqVO reqVO) { + Long deptId = deptService.createDept(reqVO); + return success(deptId); + } + + @PutMapping("update") + @ApiOperation("更新部门") + @PreAuthorize("@ss.hasPermission('system:dept:update')") + public CommonResult updateDept(@Valid @RequestBody DeptUpdateReqVO reqVO) { + deptService.updateDept(reqVO); + return success(true); + } + + @DeleteMapping("delete") + @ApiOperation("删除部门") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:dept:delete')") + public CommonResult deleteDept(@RequestParam("id") Long id) { + deptService.deleteDept(id); + return success(true); + } + + @GetMapping("/list") + @ApiOperation("获取部门列表") + @PreAuthorize("@ss.hasPermission('system:dept:query')") + public CommonResult> listDepts(DeptListReqVO reqVO) { + List list = deptService.getSimpleDepts(reqVO); + list.sort(Comparator.comparing(DeptDO::getSort)); + return success(DeptConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获取部门精简信息列表", notes = "只包含被开启的部门,主要用于前端的下拉选项") + public CommonResult> getSimpleDepts() { + // 获得部门列表,只要开启状态的 + DeptListReqVO reqVO = new DeptListReqVO(); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + List list = deptService.getSimpleDepts(reqVO); + // 排序后,返回给前端 + list.sort(Comparator.comparing(DeptDO::getSort)); + return success(DeptConvert.INSTANCE.convertList02(list)); + } + + @GetMapping("/get") + @ApiOperation("获得部门信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:dept:query')") + public CommonResult getDept(@RequestParam("id") Long id) { + return success(DeptConvert.INSTANCE.convert(deptService.getDept(id))); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/PostController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/PostController.java new file mode 100644 index 0000000..bef1273 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/PostController.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.controller.admin.dept; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.*; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.*; +import com.jojubanking.boot.module.system.convert.dept.PostConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import com.jojubanking.boot.module.system.service.dept.PostService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 岗位") +@RestController +@RequestMapping("/system/post") +@Validated +public class PostController { + + @Resource + private PostService postService; + + @PostMapping("/create") + @ApiOperation("创建岗位") + @PreAuthorize("@ss.hasPermission('system:post:create')") + public CommonResult createPost(@Valid @RequestBody PostCreateReqVO reqVO) { + Long postId = postService.createPost(reqVO); + return success(postId); + } + + @PutMapping("/update") + @ApiOperation("修改岗位") + @PreAuthorize("@ss.hasPermission('system:post:update')") + public CommonResult updatePost(@Valid @RequestBody PostUpdateReqVO reqVO) { + postService.updatePost(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除岗位") + @PreAuthorize("@ss.hasPermission('system:post:delete')") + public CommonResult deletePost(@RequestParam("id") Long id) { + postService.deletePost(id); + return success(true); + } + + @GetMapping(value = "/get") + @ApiOperation("获得岗位信息") + @ApiImplicitParam(name = "id", value = "岗位编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:post:query')") + public CommonResult getPost(@RequestParam("id") Long id) { + return success(PostConvert.INSTANCE.convert(postService.getPost(id))); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获取岗位精简信息列表", notes = "只包含被开启的岗位,主要用于前端的下拉选项") + public CommonResult> getSimplePosts() { + // 获得岗位列表,只要开启状态的 + List list = postService.getPosts(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); + // 排序后,返回给前端 + list.sort(Comparator.comparing(PostDO::getSort)); + return success(PostConvert.INSTANCE.convertList02(list)); + } + + @GetMapping("/page") + @ApiOperation("获得岗位分页列表") + @PreAuthorize("@ss.hasPermission('system:post:query')") + public CommonResult> getPostPage(@Validated PostPageReqVO reqVO) { + return success(PostConvert.INSTANCE.convertPage(postService.getPostPage(reqVO))); + } + + @GetMapping("/export") + @ApiOperation("岗位管理") + @PreAuthorize("@ss.hasPermission('system:post:export')") + @OperateLog(type = EXPORT) + public void export(HttpServletResponse response, @Validated PostExportReqVO reqVO) throws IOException { + List posts = postService.getPosts(reqVO); + List data = PostConvert.INSTANCE.convertList03(posts); + // 输出 + ExcelUtils.write(response, "岗位数据.xls", "岗位列表", PostExcelVO.class, data); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptBaseVO.java new file mode 100644 index 0000000..3832b56 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptBaseVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 部门 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DeptBaseVO { + + @ApiModelProperty(value = "部门名称", required = true) + @NotNull(message = "部门名称不能为空") + private String name; + + @ApiModelProperty(value = "父部门id", required = true) + @NotNull(message = "父部门id不能为空") + private Long parentId; + + @ApiModelProperty(value = "显示顺序", required = true) + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "负责人") + private Long leaderUserId; + + @ApiModelProperty(value = "联系电话") + private String phone; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "部门状态(0正常 1停用)", required = true) + @NotNull(message = "部门状态(0正常 1停用)不能为空") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptCreateReqVO.java new file mode 100644 index 0000000..536f399 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 部门创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeptCreateReqVO extends DeptBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptExcelVO.java new file mode 100644 index 0000000..977e0c1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptExcelVO.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 部门 Excel VO + * + * @author admin + */ +@Data +public class DeptExcelVO { + + @ExcelProperty("部门id") + private Long id; + + @ExcelProperty("部门名称") + private String name; + + @ExcelProperty("父部门id") + private Long parentId; + + @ExcelProperty("显示顺序") + private Integer sort; + + @ExcelProperty("负责人") + private Long leaderUserId; + + @ExcelProperty("联系电话") + private String phone; + + @ExcelProperty("邮箱") + private String email; + + @ExcelProperty("部门状态(0正常 1停用)") + private Integer status; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptExportReqVO.java new file mode 100644 index 0000000..2256923 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptExportReqVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 部门 Excel 导出 Request VO", description = "参数和 DeptPageReqVO 是一致的") +@Data +public class DeptExportReqVO { + + @ApiModelProperty(value = "部门名称") + private String name; + + @ApiModelProperty(value = "父部门id") + private Long parentId; + + @ApiModelProperty(value = "显示顺序") + private Integer sort; + + @ApiModelProperty(value = "负责人") + private Long leaderUserId; + + @ApiModelProperty(value = "联系电话") + private String phone; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "部门状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptPageReqVO.java new file mode 100644 index 0000000..c159565 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptPageReqVO.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 部门分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeptPageReqVO extends PageParam { + + @ApiModelProperty(value = "部门名称") + private String name; + + @ApiModelProperty(value = "父部门id") + private Long parentId; + + @ApiModelProperty(value = "显示顺序") + private Integer sort; + + @ApiModelProperty(value = "负责人") + private Long leaderUserId; + + @ApiModelProperty(value = "联系电话") + private String phone; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "部门状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptRespVO.java new file mode 100644 index 0000000..5b7e8ec --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 部门 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeptRespVO extends DeptBaseVO { + + @ApiModelProperty(value = "部门id", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptUpdateReqVO.java new file mode 100644 index 0000000..8fcacde --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 部门更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeptUpdateReqVO extends DeptBaseVO { + + @ApiModelProperty(value = "部门id", required = true) + @NotNull(message = "部门id不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptBaseVO.java new file mode 100644 index 0000000..54d2cb9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptBaseVO.java @@ -0,0 +1,47 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.dept; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 部门 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DeptBaseVO { + + @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") + @NotBlank(message = "部门名称不能为空") + @Size(max = 30, message = "部门名称长度不能超过30个字符") + private String name; + + @ApiModelProperty(value = "父菜单 ID", example = "1024") + private Long parentId; + + @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "负责人的用户编号", example = "2048") + private Long leaderUserId; + + @ApiModelProperty(value = "联系电话", example = "15601691000") + @Size(max = 11, message = "联系电话长度不能超过11个字符") + private String phone; + + @ApiModelProperty(value = "邮箱", example = "joju@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过50个字符") + private String email; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") +// @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptCreateReqVO.java new file mode 100644 index 0000000..7c57b89 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptCreateReqVO.java @@ -0,0 +1,13 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.dept; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("管理后台 - 部门创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeptCreateReqVO extends DeptBaseVO { +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java new file mode 100644 index 0000000..12a2de7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptListReqVO.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.dept; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("管理后台 - 部门列表 Request VO") +@Data +public class DeptListReqVO { + + @ApiModelProperty(value = "部门名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptRespVO.java new file mode 100644 index 0000000..34c3269 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptRespVO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.dept; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@ApiModel("管理后台 - 部门信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DeptRespVO extends DeptBaseVO { + + @ApiModelProperty(value = "部门编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java new file mode 100644 index 0000000..2fb10fe --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.dept; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("管理后台 - 部门精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DeptSimpleRespVO { + + @ApiModelProperty(value = "部门编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "部门名称", required = true, example = "芋道") + private String name; + + @ApiModelProperty(value = "父部门 ID", required = true, example = "1024") + private Long parentId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptUpdateReqVO.java new file mode 100644 index 0000000..acaa210 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptUpdateReqVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.dept; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 部门更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DeptUpdateReqVO extends DeptBaseVO { + + @ApiModelProperty(value = "部门编号", required = true, example = "1024") + @NotNull(message = "部门编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostBaseVO.java new file mode 100644 index 0000000..9e8f7f1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostBaseVO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.post; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 岗位 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class PostBaseVO { + + @ApiModelProperty(value = "岗位名称", required = true, example = "小博主") + @NotBlank(message = "岗位名称不能为空") + @Size(max = 50, message = "岗位名称长度不能超过50个字符") + private String name; + + @ApiModelProperty(value = "岗位编码", required = true, example = "joju") + @NotBlank(message = "岗位编码不能为空") + @Size(max = 64, message = "岗位编码长度不能超过64个字符") + private String code; + + @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "备注", example = "快乐的备注") + private String remark; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostCreateReqVO.java new file mode 100644 index 0000000..c6c3ee7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostCreateReqVO.java @@ -0,0 +1,11 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("管理后台 - 岗位创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class PostCreateReqVO extends PostBaseVO { +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostExcelVO.java new file mode 100644 index 0000000..6aae7f5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostExcelVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.post; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 岗位 Excel 导出响应 VO + */ +@Data +public class PostExcelVO { + + @ExcelProperty("岗位序号") + private Long id; + + @ExcelProperty("岗位编码") + private String code; + + @ExcelProperty("岗位名称") + private String name; + + @ExcelProperty("岗位排序") + private Integer sort; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private String status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostExportReqVO.java new file mode 100644 index 0000000..b148f65 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostExportReqVO.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value = "管理后台 - 岗位导出 Request VO", description = "参数和 PostExcelVO 是一致的") +@Data +public class PostExportReqVO { + + @ApiModelProperty(value = "岗位编码", example = "joju", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostListReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostListReqVO.java new file mode 100644 index 0000000..91094b3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostListReqVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("管理后台 - 岗位列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class PostListReqVO extends PostBaseVO { + + @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostPageReqVO.java new file mode 100644 index 0000000..89f7930 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostPageReqVO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.post; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("管理后台 - 岗位分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class PostPageReqVO extends PageParam { + + @ApiModelProperty(value = "岗位编码", example = "joju", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostRespVO.java new file mode 100644 index 0000000..72f2918 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostRespVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@ApiModel("管理后台 - 岗位信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class PostRespVO extends PostBaseVO { + + @ApiModelProperty(value = "岗位序号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.java new file mode 100644 index 0000000..8964d60 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("管理后台 - 岗位精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PostSimpleRespVO { + + @ApiModelProperty(value = "岗位编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "岗位名称", required = true, example = "芋道") + private String name; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostUpdateReqVO.java new file mode 100644 index 0000000..36250c2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostUpdateReqVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.dept.vo.post; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 岗位更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class PostUpdateReqVO extends PostBaseVO { + + @ApiModelProperty(value = "岗位编号", required = true, example = "1024") + @NotNull(message = "岗位编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/DeptXqController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/DeptXqController.java new file mode 100644 index 0000000..706d002 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/DeptXqController.java @@ -0,0 +1,126 @@ +package com.jojubanking.boot.module.system.controller.admin.deptxq; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptRespVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; +import com.jojubanking.boot.module.system.convert.dept.DeptConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.deptxq.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.deptxq.DeptXqDO; +import com.jojubanking.boot.module.system.convert.deptxq.DeptXqConvert; +import com.jojubanking.boot.module.system.service.deptxq.DeptXqService; + +@Api(tags = "管理后台 - 部门") +@RestController +@RequestMapping("/system/dept-xq") +@Validated +public class DeptXqController { + + @Resource + private DeptXqService deptXqService; + + @PostMapping("/create") + @ApiOperation("创建部门") + @PreAuthorize("@ss.hasPermission('system:dept-xq:create')") + public CommonResult createDeptXq(@Valid @RequestBody DeptXqCreateReqVO createReqVO) { + return success(deptXqService.createDeptXq(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新部门") + @PreAuthorize("@ss.hasPermission('system:dept-xq:update')") + public CommonResult updateDeptXq(@Valid @RequestBody DeptXqUpdateReqVO updateReqVO) { + deptXqService.updateDeptXq(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除部门") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:dept-xq:delete')") + public CommonResult deleteDeptXq(@RequestParam("id") Long id) { + deptXqService.deleteDeptXq(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得部门") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:dept-xq:query')") + public CommonResult getDeptXq(@RequestParam("id") Long id) { + DeptXqDO deptXq = deptXqService.getDeptXq(id); + return success(DeptXqConvert.INSTANCE.convert(deptXq)); + } + +// @GetMapping("/list") +// @ApiOperation("获得部门列表") +// @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) +// @PreAuthorize("@ss.hasPermission('system:dept-xq:query')") +// public CommonResult> getDeptXqList(@RequestParam("ids") Collection ids) { +// List list = deptXqService.getDeptXqList(ids); +// return success(DeptXqConvert.INSTANCE.convertList(list)); +// } + + @GetMapping("/page") + @ApiOperation("获得部门分页") + @PreAuthorize("@ss.hasPermission('system:dept-xq:query')") + public CommonResult> getDeptXqPage(@Valid DeptXqPageReqVO pageVO) { + PageResult pageResult = deptXqService.getDeptXqPage(pageVO); + return success(DeptXqConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出部门 Excel") + @PreAuthorize("@ss.hasPermission('system:dept-xq:export')") + @OperateLog(type = EXPORT) + public void exportDeptXqExcel(@Valid DeptXqExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deptXqService.getDeptXqList(exportReqVO); + // 导出 Excel + List datas = DeptXqConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "部门.xls", "数据", DeptXqExcelVO.class, datas); + } + + @GetMapping("/list") + @ApiOperation("获取部门列表") + @PreAuthorize("@ss.hasPermission('system:dept-xq:query')") + public CommonResult> listDepts(DeptXqListReqVO reqVO) { + List list = deptXqService.getSimpleXqDepts(reqVO); + list.sort(Comparator.comparing(DeptXqDO::getSort)); + return success(DeptXqConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获取部门精简信息列表", notes = "只包含被开启的部门,主要用于前端的下拉选项") + public CommonResult> getSimpleDepts() { + // 获得部门列表,只要开启状态的 + DeptXqListReqVO reqVO = new DeptXqListReqVO(); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + List list = deptXqService.getSimpleXqDepts(reqVO); + // 排序后,返回给前端 + list.sort(Comparator.comparing(DeptXqDO::getSort)); + return success(DeptXqConvert.INSTANCE.convertList03(list)); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqBaseVO.java new file mode 100644 index 0000000..27bf99d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqBaseVO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.controller.admin.deptxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 部门 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DeptXqBaseVO { + + @ApiModelProperty(value = "部门名称", required = true) + @NotNull(message = "部门名称不能为空") + private String name; + + @ApiModelProperty(value = "父部门id", required = true) + private Long parentId; + + @ApiModelProperty(value = "显示顺序", required = true) + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "负责人") + private String leaderUserId; + + @ApiModelProperty(value = "联系电话") + private String phone; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "部门状态(0正常 1停用)", required = true) + @NotNull(message = "部门状态(0正常 1停用)不能为空") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqCreateReqVO.java new file mode 100644 index 0000000..3b19730 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.deptxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 部门创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeptXqCreateReqVO extends DeptXqBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqExcelVO.java new file mode 100644 index 0000000..d55b9ae --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqExcelVO.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.system.controller.admin.deptxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 部门 Excel VO + * + * @author admin + */ +@Data +public class DeptXqExcelVO { + + @ExcelProperty("部门id") + private Long id; + + @ExcelProperty("部门名称") + private String name; + + @ExcelProperty("父部门id") + private Long parentId; + + @ExcelProperty("显示顺序") + private Integer sort; + + @ExcelProperty("负责人") + private String leaderUserId; + + @ExcelProperty("联系电话") + private String phone; + + @ExcelProperty("邮箱") + private String email; + + @ExcelProperty("部门状态(0正常 1停用)") + private Integer status; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqExportReqVO.java new file mode 100644 index 0000000..1847753 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqExportReqVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.controller.admin.deptxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 部门 Excel 导出 Request VO", description = "参数和 DeptXqPageReqVO 是一致的") +@Data +public class DeptXqExportReqVO { + + @ApiModelProperty(value = "部门名称") + private String name; + + @ApiModelProperty(value = "父部门id") + private Long parentId; + + @ApiModelProperty(value = "显示顺序") + private Integer sort; + + @ApiModelProperty(value = "负责人") + private String leaderUserId; + + @ApiModelProperty(value = "联系电话") + private String phone; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "部门状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqListReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqListReqVO.java new file mode 100644 index 0000000..4b05857 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqListReqVO.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.system.controller.admin.deptxq.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("管理后台 - 部门列表 Request VO") +@Data +public class DeptXqListReqVO { + + @ApiModelProperty(value = "部门名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqPageReqVO.java new file mode 100644 index 0000000..0501337 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqPageReqVO.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.controller.admin.deptxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 部门分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeptXqPageReqVO extends PageParam { + + @ApiModelProperty(value = "部门名称") + private String name; + + @ApiModelProperty(value = "父部门id") + private Long parentId; + + @ApiModelProperty(value = "显示顺序") + private Integer sort; + + @ApiModelProperty(value = "负责人") + private String leaderUserId; + + @ApiModelProperty(value = "联系电话") + private String phone; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "部门状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqRespVO.java new file mode 100644 index 0000000..0acc564 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.deptxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 部门 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeptXqRespVO extends DeptXqBaseVO { + + @ApiModelProperty(value = "部门id", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqSimpleRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqSimpleRespVO.java new file mode 100644 index 0000000..b93de1a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqSimpleRespVO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.controller.admin.deptxq.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("管理后台 - 部门精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DeptXqSimpleRespVO { + + @ApiModelProperty(value = "部门编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "部门名称", required = true, example = "芋道") + private String name; + + @ApiModelProperty(value = "父部门 ID", required = true, example = "1024") + private Long parentId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqUpdateReqVO.java new file mode 100644 index 0000000..7d1f8e9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.deptxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 部门更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeptXqUpdateReqVO extends DeptXqBaseVO { + + @ApiModelProperty(value = "部门id", required = true) + @NotNull(message = "部门id不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/DictDataController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/DictDataController.http new file mode 100644 index 0000000..f524315 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/DictDataController.http @@ -0,0 +1,4 @@ +### 请求 /menu/list 接口 => 成功 +GET {{baseUrl}}/system/dict-data/list-all-simple +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/DictDataController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/DictDataController.java new file mode 100644 index 0000000..bd96a5b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/DictDataController.java @@ -0,0 +1,96 @@ +package com.jojubanking.boot.module.system.controller.admin.dict; + +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.*; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictDataDO; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.*; +import com.jojubanking.boot.module.system.convert.dict.DictDataConvert; +import com.jojubanking.boot.module.system.service.dict.DictDataService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 字典数据") +@RestController +@RequestMapping("/system/dict-data") +@Validated +public class DictDataController { + + @Resource + private DictDataService dictDataService; + + @PostMapping("/create") + @ApiOperation("新增字典数据") + @PreAuthorize("@ss.hasPermission('system:dict:create')") + public CommonResult createDictData(@Valid @RequestBody DictDataCreateReqVO reqVO) { + Long dictDataId = dictDataService.createDictData(reqVO); + return success(dictDataId); + } + + @PutMapping("update") + @ApiOperation("修改字典数据") + @PreAuthorize("@ss.hasPermission('system:dict:update')") + public CommonResult updateDictData(@Valid @RequestBody DictDataUpdateReqVO reqVO) { + dictDataService.updateDictData(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除字典数据") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:dict:delete')") + public CommonResult deleteDictData(Long id) { + dictDataService.deleteDictData(id); + return success(true); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获得全部字典数据列表", notes = "一般用于管理后台缓存字典数据在本地") + // 无需添加权限认证,因为前端全局都需要 + public CommonResult> getSimpleDictDatas() { + List list = dictDataService.getDictDatas(); + return success(DictDataConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("/获得字典类型的分页列表") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult> getDictTypePage(@Valid DictDataPageReqVO reqVO) { + return success(DictDataConvert.INSTANCE.convertPage(dictDataService.getDictDataPage(reqVO))); + } + + @GetMapping(value = "/get") + @ApiOperation("/查询字典数据详细") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult getDictData(@RequestParam("id") Long id) { + return success(DictDataConvert.INSTANCE.convert(dictDataService.getDictData(id))); + } + + @GetMapping("/export") + @ApiOperation("导出字典数据") + @PreAuthorize("@ss.hasPermission('system:dict:export')") + @OperateLog(type = EXPORT) + public void export(HttpServletResponse response, @Valid DictDataExportReqVO reqVO) throws IOException { + List list = dictDataService.getDictDatas(reqVO); + List data = DictDataConvert.INSTANCE.convertList02(list); + // 输出 + ExcelUtils.write(response, "字典数据.xls", "数据列表", DictDataExcelVO.class, data); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/DictTypeController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/DictTypeController.java new file mode 100644 index 0000000..44c9ea7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/DictTypeController.java @@ -0,0 +1,96 @@ +package com.jojubanking.boot.module.system.controller.admin.dict; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.*; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.*; +import com.jojubanking.boot.module.system.convert.dict.DictTypeConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictTypeDO; +import com.jojubanking.boot.module.system.service.dict.DictTypeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 字典类型") +@RestController +@RequestMapping("/system/dict-type") +@Validated +public class DictTypeController { + + @Resource + private DictTypeService dictTypeService; + + @PostMapping("/create") + @ApiOperation("创建字典类型") + @PreAuthorize("@ss.hasPermission('system:dict:create')") + public CommonResult createDictType(@Valid @RequestBody DictTypeCreateReqVO reqVO) { + Long dictTypeId = dictTypeService.createDictType(reqVO); + return success(dictTypeId); + } + + @PutMapping("/update") + @ApiOperation("修改字典类型") + @PreAuthorize("@ss.hasPermission('system:dict:update')") + public CommonResult updateDictType(@Valid @RequestBody DictTypeUpdateReqVO reqVO) { + dictTypeService.updateDictType(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除字典类型") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:dict:delete')") + public CommonResult deleteDictType(Long id) { + dictTypeService.deleteDictType(id); + return success(true); + } + + @ApiOperation("/获得字典类型的分页列表") + @GetMapping("/page") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult> pageDictTypes(@Valid DictTypePageReqVO reqVO) { + return success(DictTypeConvert.INSTANCE.convertPage(dictTypeService.getDictTypePage(reqVO))); + } + + @ApiOperation("/查询字典类型详细") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @GetMapping(value = "/get") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult getDictType(@RequestParam("id") Long id) { + return success(DictTypeConvert.INSTANCE.convert(dictTypeService.getDictType(id))); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获得全部字典类型列表", notes = "包括开启 + 禁用的字典类型,主要用于前端的下拉选项") + // 无需添加权限认证,因为前端全局都需要 + public CommonResult> listSimpleDictTypes() { + List list = dictTypeService.getDictTypeList(); + return success(DictTypeConvert.INSTANCE.convertList(list)); + } + + @ApiOperation("导出数据类型") + @GetMapping("/export") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + @OperateLog(type = EXPORT) + public void export(HttpServletResponse response, @Valid DictTypeExportReqVO reqVO) throws IOException { + List list = dictTypeService.getDictTypeList(reqVO); + List data = DictTypeConvert.INSTANCE.convertList02(list); + // 输出 + ExcelUtils.write(response, "字典类型.xls", "类型列表", DictTypeExcelVO.class, data); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java new file mode 100644 index 0000000..715e57c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java @@ -0,0 +1,49 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.data; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 字典数据 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DictDataBaseVO { + + @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "字典标签", required = true, example = "芋道") + @NotBlank(message = "字典标签不能为空") + @Size(max = 100, message = "字典标签长度不能超过100个字符") + private String label; + + @ApiModelProperty(value = "字典值", required = true, example = "iocoder") + @NotBlank(message = "字典键值不能为空") + @Size(max = 100, message = "字典键值长度不能超过100个字符") + private String value; + + @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") + @NotBlank(message = "字典类型不能为空") + @Size(max = 100, message = "字典类型长度不能超过100个字符") + private String dictType; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") +// @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + + @ApiModelProperty(value = "颜色类型", example = "default", notes = "default、primary、success、info、warning、danger") + private String colorType; + @ApiModelProperty(value = "css 样式", example = "btn-visible") + private String cssClass; + + @ApiModelProperty(value = "备注", example = "我是一个角色") + private String remark; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataCreateReqVO.java new file mode 100644 index 0000000..d384609 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataCreateReqVO.java @@ -0,0 +1,12 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.data; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("管理后台 - 字典数据创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictDataCreateReqVO extends DictDataBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataExcelVO.java new file mode 100644 index 0000000..1c8582d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataExcelVO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.data; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 字典数据 Excel 导出响应 VO + */ +@Data +public class DictDataExcelVO { + + @ExcelProperty("字典编码") + private Long id; + + @ExcelProperty("字典排序") + private Integer sort; + + @ExcelProperty("字典标签") + private String label; + + @ExcelProperty("字典键值") + private String value; + + @ExcelProperty("字典类型") + private String dictType; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.java new file mode 100644 index 0000000..3e67904 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Size; + +@ApiModel("管理后台 - 字典类型导出 Request VO") +@Data +public class DictDataExportReqVO { + + @ApiModelProperty(value = "字典标签", example = "芋道") + @Size(max = 100, message = "字典标签长度不能超过100个字符") + private String label; + + @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String dictType; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java new file mode 100644 index 0000000..743ad83 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.data; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.Size; + +@ApiModel("管理后台 - 字典类型分页列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictDataPageReqVO extends PageParam { + + @ApiModelProperty(value = "字典标签", example = "芋道") + @Size(max = 100, message = "字典标签长度不能超过100个字符") + private String label; + + @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String dictType; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataRespVO.java new file mode 100644 index 0000000..3994d41 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataRespVO.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@ApiModel("管理后台 - 字典数据信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class DictDataRespVO extends DictDataBaseVO { + + @ApiModelProperty(value = "字典数据编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.java new file mode 100644 index 0000000..875ba30 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("管理后台 - 数据字典精简 Response VO") +@Data +public class DictDataSimpleRespVO { + + @ApiModelProperty(value = "字典类型", required = true, example = "gender") + private String dictType; + + @ApiModelProperty(value = "字典键值", required = true, example = "1") + private String value; + + @ApiModelProperty(value = "字典标签", required = true, example = "男") + private String label; + + @ApiModelProperty(value = "颜色类型", example = "default", notes = "default、primary、success、info、warning、danger") + private String colorType; + @ApiModelProperty(value = "css 样式", example = "btn-visible") + private String cssClass; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataUpdateReqVO.java new file mode 100644 index 0000000..f896d50 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataUpdateReqVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.data; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 字典数据更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictDataUpdateReqVO extends DictDataBaseVO { + + @ApiModelProperty(value = "字典数据编号", required = true, example = "1024") + @NotNull(message = "字典数据编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeBaseVO.java new file mode 100644 index 0000000..8f0c9ab --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeBaseVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.type; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 字典类型 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DictTypeBaseVO { + + @ApiModelProperty(value = "字典名称", required = true, example = "性别") + @NotBlank(message = "字典名称不能为空") + @Size(max = 100, message = "字典类型名称长度不能超过100个字符") + private String name; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") + @NotNull(message = "状态不能为空") + private Integer status; + + @ApiModelProperty(value = "备注", example = "快乐的备注") + private String remark; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeCreateReqVO.java new file mode 100644 index 0000000..93b2710 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeCreateReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.type; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +@ApiModel("管理后台 - 字典类型创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictTypeCreateReqVO extends DictTypeBaseVO { + + @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") + @NotNull(message = "字典类型不能为空") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String type; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.java new file mode 100644 index 0000000..fdb8be6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.type; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 字典类型 Excel 导出响应 VO + */ +@Data +public class DictTypeExcelVO { + + @ExcelProperty("字典主键") + private Long id; + + @ExcelProperty("字典名称") + private String name; + + @ExcelProperty("字典类型") + private String type; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.java new file mode 100644 index 0000000..1ece0cc --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.type; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 字典类型分页列表 Request VO") +@Data +public class DictTypeExportReqVO { + + @ApiModelProperty(value = "字典类型名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") + private String type; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java new file mode 100644 index 0000000..2234a00 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.type; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.Size; +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 字典类型分页列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictTypePageReqVO extends PageParam { + + @ApiModelProperty(value = "字典类型名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "字典类型", example = "sys_common_sex", notes = "模糊匹配") + @Size(max = 100, message = "字典类型类型长度不能超过100个字符") + private String type; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeRespVO.java new file mode 100644 index 0000000..7d3ebfd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeRespVO.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.type; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@ApiModel("管理后台 - 字典类型信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class DictTypeRespVO extends DictTypeBaseVO { + + @ApiModelProperty(value = "字典类型编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") + private String type; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.java new file mode 100644 index 0000000..016d21e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.type; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("管理后台 - 字典类型精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DictTypeSimpleRespVO { + + @ApiModelProperty(value = "字典类型编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "字典类型名称", required = true, example = "芋道") + private String name; + + @ApiModelProperty(value = "字典类型", required = true, example = "sys_common_sex") + private String type; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeUpdateReqVO.java new file mode 100644 index 0000000..842147f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeUpdateReqVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.dict.vo.type; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 字典类型更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class DictTypeUpdateReqVO extends DictTypeBaseVO { + + @ApiModelProperty(value = "字典类型编号", required = true, example = "1024") + @NotNull(message = "字典类型编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/DoctorController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/DoctorController.java new file mode 100644 index 0000000..8247eac --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/DoctorController.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.controller.admin.doctor; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.doctor.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.doctor.DoctorDO; +import com.jojubanking.boot.module.system.convert.doctor.DoctorConvert; +import com.jojubanking.boot.module.system.service.doctor.DoctorService; + +@Api(tags = "管理后台 - 医生信息") +@RestController +@RequestMapping("/system/doctor") +@Validated +public class DoctorController { + + @Resource + private DoctorService doctorService; + + @PostMapping("/create") + @ApiOperation("创建医生信息") + @PreAuthorize("@ss.hasPermission('system:doctor:create')") + public CommonResult createDoctor(@Valid @RequestBody DoctorCreateReqVO createReqVO) { + return success(doctorService.createDoctor(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新医生信息") + @PreAuthorize("@ss.hasPermission('system:doctor:update')") + public CommonResult updateDoctor(@Valid @RequestBody DoctorUpdateReqVO updateReqVO) { + doctorService.updateDoctor(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除医生信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:doctor:delete')") + public CommonResult deleteDoctor(@RequestParam("id") Integer id) { + doctorService.deleteDoctor(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得医生信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:doctor:query')") + public CommonResult getDoctor(@RequestParam("id") Integer id) { + DoctorDO doctor = doctorService.getDoctor(id); + return success(DoctorConvert.INSTANCE.convert(doctor)); + } + + @GetMapping("/list") + @ApiOperation("获得医生信息列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:doctor:query')") + public CommonResult> getDoctorList(@RequestParam("ids") Collection ids) { + List list = doctorService.getDoctorList(ids); + return success(DoctorConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得医生信息分页") + @PreAuthorize("@ss.hasPermission('system:doctor:query')") + public CommonResult> getDoctorPage(@Valid DoctorPageReqVO pageVO) { + PageResult pageResult = doctorService.getDoctorPage(pageVO); + return success(DoctorConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出医生信息 Excel") + @PreAuthorize("@ss.hasPermission('system:doctor:export')") + @OperateLog(type = EXPORT) + public void exportDoctorExcel(@Valid DoctorExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = doctorService.getDoctorList(exportReqVO); + // 导出 Excel + List datas = DoctorConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "医生信息.xls", "数据", DoctorExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorBaseVO.java new file mode 100644 index 0000000..91f7b1f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorBaseVO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.controller.admin.doctor.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 医生信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DoctorBaseVO { + + @ApiModelProperty(value = "sort") + private Integer sort; + + @ApiModelProperty(value = "医生姓名") + private String name; + + @ApiModelProperty(value = "医生头像") + private String img; + + @ApiModelProperty(value = "科室id") + private Integer mid; + + @ApiModelProperty(value = "个人简介") + private String info; + + @ApiModelProperty(value = "个人擅长") + private String grsc; + + @ApiModelProperty(value = "坐诊时间") + private String zztime; + + @ApiModelProperty(value = "荣誉称号") + private String label; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorCreateReqVO.java new file mode 100644 index 0000000..a1dbd4b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.doctor.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 医生信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DoctorCreateReqVO extends DoctorBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorExcelVO.java new file mode 100644 index 0000000..4047389 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorExcelVO.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.system.controller.admin.doctor.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 医生信息 Excel VO + * + * @author admin + */ +@Data +public class DoctorExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("医生姓名") + private String name; + + @ExcelProperty("医生头像") + private String img; + + @ExcelProperty("科室id") + private Integer mid; + + @ExcelProperty("个人简介") + private String info; + + @ExcelProperty("个人擅长") + private String grsc; + + @ExcelProperty("坐诊时间") + private String zztime; + + @ExcelProperty("荣誉称号") + private String label; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorExportReqVO.java new file mode 100644 index 0000000..bd4cac1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorExportReqVO.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.system.controller.admin.doctor.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 医生信息 Excel 导出 Request VO", description = "参数和 DoctorPageReqVO 是一致的") +@Data +public class DoctorExportReqVO { + + @ApiModelProperty(value = "医生姓名") + private String name; + + @ApiModelProperty(value = "医生头像") + private String img; + + @ApiModelProperty(value = "科室id") + private Integer mid; + + @ApiModelProperty(value = "个人简介") + private String info; + + @ApiModelProperty(value = "个人擅长") + private String grsc; + + @ApiModelProperty(value = "坐诊时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] zztime; + + @ApiModelProperty(value = "荣誉称号") + private String label; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorPageReqVO.java new file mode 100644 index 0000000..6e6ecd2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorPageReqVO.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.module.system.controller.admin.doctor.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 医生信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DoctorPageReqVO extends PageParam { + + @ApiModelProperty(value = "医生姓名") + private String name; + + @ApiModelProperty(value = "医生头像") + private String img; + + @ApiModelProperty(value = "科室id") + private Integer mid; + + @ApiModelProperty(value = "个人简介") + private String info; + + @ApiModelProperty(value = "个人擅长") + private String grsc; + + @ApiModelProperty(value = "坐诊时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] zztime; + + @ApiModelProperty(value = "荣誉称号") + private String label; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorRespVO.java new file mode 100644 index 0000000..7278384 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.doctor.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 医生信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DoctorRespVO extends DoctorBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorUpdateReqVO.java new file mode 100644 index 0000000..e46ac59 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.doctor.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 医生信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DoctorUpdateReqVO extends DoctorBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/DzQuestionController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/DzQuestionController.java new file mode 100644 index 0000000..0d45a22 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/DzQuestionController.java @@ -0,0 +1,101 @@ +package com.jojubanking.boot.module.system.controller.admin.dzquestion; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.dzquestion.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.dzquestion.DzQuestionDO; +import com.jojubanking.boot.module.system.convert.dzquestion.DzQuestionConvert; +import com.jojubanking.boot.module.system.service.dzquestion.DzQuestionService; + +@Api(tags = "管理后台 - 导诊管理") +@RestController +@RequestMapping("/system/dz-question") +@Validated +public class DzQuestionController { + + @Resource + private DzQuestionService dzQuestionService; + + @PostMapping("/create") + @ApiOperation("创建导诊管理") + @PreAuthorize("@ss.hasPermission('system:dz-question:create')") + public CommonResult createDzQuestion(@Valid @RequestBody DzQuestionCreateReqVO createReqVO) { + return success(dzQuestionService.createDzQuestion(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新导诊管理") + @PreAuthorize("@ss.hasPermission('system:dz-question:update')") + public CommonResult updateDzQuestion(@Valid @RequestBody DzQuestionUpdateReqVO updateReqVO) { + dzQuestionService.updateDzQuestion(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除导诊管理") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:dz-question:delete')") + public CommonResult deleteDzQuestion(@RequestParam("id") Integer id) { + dzQuestionService.deleteDzQuestion(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得导诊管理") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:dz-question:query')") + public CommonResult getDzQuestion(@RequestParam("id") Integer id) { + DzQuestionDO dzQuestion = dzQuestionService.getDzQuestion(id); + return success(DzQuestionConvert.INSTANCE.convert(dzQuestion)); + } + + @GetMapping("/list") + @ApiOperation("获得导诊管理列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:dz-question:query')") + public CommonResult> getDzQuestionList(@RequestParam("ids") Collection ids) { + List list = dzQuestionService.getDzQuestionList(ids); + return success(DzQuestionConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得导诊管理分页") + @PreAuthorize("@ss.hasPermission('system:dz-question:query')") + public CommonResult> getDzQuestionPage(@Valid DzQuestionPageReqVO pageVO) { + PageResult pageResult = dzQuestionService.getDzQuestionPage(pageVO); + return success(DzQuestionConvert.INSTANCE.convertPage(pageResult)); + } + + + @GetMapping("/export-excel") + @ApiOperation("导出导诊管理 Excel") + @PreAuthorize("@ss.hasPermission('system:dz-question:export')") + @OperateLog(type = EXPORT) + public void exportDzQuestionExcel(@Valid DzQuestionExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = dzQuestionService.getDzQuestionList(exportReqVO); + // 导出 Excel + List datas = DzQuestionConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "导诊管理.xls", "数据", DzQuestionExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionBaseVO.java new file mode 100644 index 0000000..f9c7c1d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionBaseVO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.controller.admin.dzquestion.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 导诊管理 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DzQuestionBaseVO { + + @ApiModelProperty(value = "问题") + private String question; + + @ApiModelProperty(value = "科室名称") + private String departmentName; + + @ApiModelProperty(value = "科室id") + private String departmentNo; + + @ApiModelProperty(value = "身体部位标识") + private String bodyAreaType; + + @ApiModelProperty(value = "身体部位名称") + private String bodyArerName; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题类型名称") + private String questionTypeName; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionCreateReqVO.java new file mode 100644 index 0000000..0abc652 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.dzquestion.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 导诊管理创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DzQuestionCreateReqVO extends DzQuestionBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionExcelVO.java new file mode 100644 index 0000000..daf1b2e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionExcelVO.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.system.controller.admin.dzquestion.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 导诊管理 Excel VO + * + * @author admin + */ +@Data +public class DzQuestionExcelVO { + + @ExcelProperty("id") + private Integer id; + + @ExcelProperty("问题") + private String question; + + @ExcelProperty("科室名称") + private String departmentName; + + @ExcelProperty("科室id") + private String departmentNo; + + @ExcelProperty("身体部位标识") + private String bodyAreaType; + + @ExcelProperty("身体部位名称") + private String bodyArerName; + + @ExcelProperty("问题类型") + private String questionType; + + @ExcelProperty("问题类型名称") + private String questionTypeName; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionExportReqVO.java new file mode 100644 index 0000000..6c945cd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionExportReqVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.controller.admin.dzquestion.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 导诊管理 Excel 导出 Request VO", description = "参数和 DzQuestionPageReqVO 是一致的") +@Data +public class DzQuestionExportReqVO { + + @ApiModelProperty(value = "问题") + private String question; + + @ApiModelProperty(value = "科室名称") + private String departmentName; + + @ApiModelProperty(value = "科室id") + private String departmentNo; + + @ApiModelProperty(value = "身体部位标识") + private String bodyAreaType; + + @ApiModelProperty(value = "身体部位名称") + private String bodyArerName; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题类型名称") + private String questionTypeName; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionPageReqVO.java new file mode 100644 index 0000000..e1e24c3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionPageReqVO.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.controller.admin.dzquestion.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 导诊管理分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DzQuestionPageReqVO extends PageParam { + + @ApiModelProperty(value = "问题") + private String question; + + @ApiModelProperty(value = "科室名称") + private String departmentName; + + @ApiModelProperty(value = "科室id") + private String departmentNo; + + @ApiModelProperty(value = "身体部位标识") + private String bodyAreaType; + + @ApiModelProperty(value = "身体部位名称") + private String bodyArerName; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题类型名称") + private String questionTypeName; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionRespVO.java new file mode 100644 index 0000000..c8ec17f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.dzquestion.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 导诊管理 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DzQuestionRespVO extends DzQuestionBaseVO { + + @ApiModelProperty(value = "id", required = true) + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionUpdateReqVO.java new file mode 100644 index 0000000..fe601c7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.dzquestion.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 导诊管理更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DzQuestionUpdateReqVO extends DzQuestionBaseVO { + + @ApiModelProperty(value = "id", required = true) + @NotNull(message = "id不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/DzTypeController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/DzTypeController.java new file mode 100644 index 0000000..751fed0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/DzTypeController.java @@ -0,0 +1,116 @@ +package com.jojubanking.boot.module.system.controller.admin.dztype; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.dztype.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.dztype.DzTypeDO; +import com.jojubanking.boot.module.system.convert.dztype.DzTypeConvert; +import com.jojubanking.boot.module.system.service.dztype.DzTypeService; + +@Api(tags = "管理后台 - 导诊类型") +@RestController +@RequestMapping("/system/dz-type") +@Validated +public class DzTypeController { + + @Resource + private DzTypeService dzTypeService; + + @PostMapping("/create") + @ApiOperation("创建导诊类型") + @PreAuthorize("@ss.hasPermission('system:dz-type:create')") + public CommonResult createDzType(@Valid @RequestBody DzTypeCreateReqVO createReqVO) { + return success(dzTypeService.createDzType(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新导诊类型") + @PreAuthorize("@ss.hasPermission('system:dz-type:update')") + public CommonResult updateDzType(@Valid @RequestBody DzTypeUpdateReqVO updateReqVO) { + dzTypeService.updateDzType(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除导诊类型") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:dz-type:delete')") + public CommonResult deleteDzType(@RequestParam("id") Integer id) { + dzTypeService.deleteDzType(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得导诊类型") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:dz-type:query')") + public CommonResult getDzType(@RequestParam("id") Integer id) { + DzTypeDO dzType = dzTypeService.getDzType(id); + return success(DzTypeConvert.INSTANCE.convert(dzType)); + } + + @GetMapping("/list") + @ApiOperation("获得导诊类型列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:dz-type:query')") + public CommonResult> getDzTypeList(@RequestParam("ids") Collection ids) { + List list = dzTypeService.getDzTypeList(ids); + return success(DzTypeConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得导诊类型分页") + @PreAuthorize("@ss.hasPermission('system:dz-type:query')") + public CommonResult> getDzTypePage(@Valid DzTypePageReqVO pageVO) { + PageResult pageResult = dzTypeService.getDzTypePage(pageVO); + return success(DzTypeConvert.INSTANCE.convertPage(pageResult)); + } + @GetMapping("/pagegroup") + @ApiOperation("获得导诊类型分页") +// @PreAuthorize("@ss.hasPermission('system:dz-type:query')") + public CommonResult> getDzTypePageGroup(@Valid DzTypePageReqVO pageVO) { + PageResult pageResult = dzTypeService.getDzTypePageGroup(pageVO); + return success(DzTypeConvert.INSTANCE.convertPage(pageResult)); + } + + + @GetMapping("/typegroup") + @ApiOperation("获得导诊类型分页") +// @PreAuthorize("@ss.hasPermission('system:dz-type:query')") + public CommonResult> getDzTypeGroup(@Valid DzTypePageReqVO pageVO) { + PageResult pageResult = dzTypeService.getDzTypeGroup(pageVO); + return success(DzTypeConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出导诊类型 Excel") + @PreAuthorize("@ss.hasPermission('system:dz-type:export')") + @OperateLog(type = EXPORT) + public void exportDzTypeExcel(@Valid DzTypeExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = dzTypeService.getDzTypeList(exportReqVO); + // 导出 Excel + List datas = DzTypeConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "导诊类型.xls", "数据", DzTypeExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeBaseVO.java new file mode 100644 index 0000000..45e5118 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeBaseVO.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.controller.admin.dztype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 导诊类型 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DzTypeBaseVO { + + @ApiModelProperty(value = "身体部位标识") + private String bodyAreaType; + + @ApiModelProperty(value = "身体部位名称") + private String bodyAreaName; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题类型名称") + private String questionTypeName; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeCreateReqVO.java new file mode 100644 index 0000000..993f174 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.dztype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 导诊类型创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DzTypeCreateReqVO extends DzTypeBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeExcelVO.java new file mode 100644 index 0000000..d49c153 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeExcelVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.controller.admin.dztype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 导诊类型 Excel VO + * + * @author admin + */ +@Data +public class DzTypeExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("身体部位标识") + private String bodyAreaType; + + @ExcelProperty("身体部位名称") + private String bodyAreaName; + + @ExcelProperty("问题类型") + private String questionType; + + @ExcelProperty("问题类型名称") + private String questionTypeName; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeExportReqVO.java new file mode 100644 index 0000000..5f33234 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeExportReqVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.dztype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 导诊类型 Excel 导出 Request VO", description = "参数和 DzTypePageReqVO 是一致的") +@Data +public class DzTypeExportReqVO { + + @ApiModelProperty(value = "身体部位标识") + private String bodyAreaType; + + @ApiModelProperty(value = "身体部位名称") + private String bodyAreaName; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题类型名称") + private String questionTypeName; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypePageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypePageReqVO.java new file mode 100644 index 0000000..f406a62 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypePageReqVO.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.controller.admin.dztype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 导诊类型分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DzTypePageReqVO extends PageParam { + + @ApiModelProperty(value = "身体部位标识") + private String bodyAreaType; + + @ApiModelProperty(value = "身体部位名称") + private String bodyAreaName; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题类型名称") + private String questionTypeName; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeRespVO.java new file mode 100644 index 0000000..1583857 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.dztype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 导诊类型 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DzTypeRespVO extends DzTypeBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeUpdateReqVO.java new file mode 100644 index 0000000..af8e4a4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.dztype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 导诊类型更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DzTypeUpdateReqVO extends DzTypeBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/ErrorCodeController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/ErrorCodeController.http new file mode 100644 index 0000000..06b8723 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/ErrorCodeController.http @@ -0,0 +1,13 @@ +### 创建错误码 +POST {{baseUrl}}/inra/error-code/create +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "code": 200, + "message": "成功", + "group": "test", + "type": 1 +} + diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/ErrorCodeController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/ErrorCodeController.java new file mode 100644 index 0000000..5d5e972 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/ErrorCodeController.java @@ -0,0 +1,90 @@ +package com.jojubanking.boot.module.system.controller.admin.errorcode; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.*; +import com.jojubanking.boot.module.system.convert.errorcode.ErrorCodeConvert; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.errorcode.ErrorCodeDO; +import com.jojubanking.boot.module.system.service.errorcode.ErrorCodeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 错误码") +@RestController +@RequestMapping("/system/error-code") +@Validated +public class ErrorCodeController { + + @Resource + private ErrorCodeService errorCodeService; + + @PostMapping("/create") + @ApiOperation("创建错误码") + @PreAuthorize("@ss.hasPermission('system:error-code:create')") + public CommonResult createErrorCode(@Valid @RequestBody ErrorCodeCreateReqVO createReqVO) { + return success(errorCodeService.createErrorCode(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新错误码") + @PreAuthorize("@ss.hasPermission('system:error-code:update')") + public CommonResult updateErrorCode(@Valid @RequestBody ErrorCodeUpdateReqVO updateReqVO) { + errorCodeService.updateErrorCode(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除错误码") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:error-code:delete')") + public CommonResult deleteErrorCode(@RequestParam("id") Long id) { + errorCodeService.deleteErrorCode(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得错误码") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:error-code:query')") + public CommonResult getErrorCode(@RequestParam("id") Long id) { + ErrorCodeDO errorCode = errorCodeService.getErrorCode(id); + return success(ErrorCodeConvert.INSTANCE.convert(errorCode)); + } + + @GetMapping("/page") + @ApiOperation("获得错误码分页") + @PreAuthorize("@ss.hasPermission('system:error-code:query')") + public CommonResult> getErrorCodePage(@Valid ErrorCodePageReqVO pageVO) { + PageResult pageResult = errorCodeService.getErrorCodePage(pageVO); + return success(ErrorCodeConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出错误码 Excel") + @PreAuthorize("@ss.hasPermission('system:error-code:export')") + @OperateLog(type = EXPORT) + public void exportErrorCodeExcel(@Valid ErrorCodeExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = errorCodeService.getErrorCodeList(exportReqVO); + // 导出 Excel + List datas = ErrorCodeConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "错误码.xls", "数据", ErrorCodeExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeBaseVO.java new file mode 100644 index 0000000..e38ea55 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeBaseVO.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.system.controller.admin.errorcode.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 错误码 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ErrorCodeBaseVO { + + @ApiModelProperty(value = "应用名", required = true, example = "dashboard") + @NotNull(message = "应用名不能为空") + private String applicationName; + + @ApiModelProperty(value = "错误码编码", required = true, example = "1234") + @NotNull(message = "错误码编码不能为空") + private Integer code; + + @ApiModelProperty(value = "错误码错误提示", required = true, example = "帅气") + @NotNull(message = "错误码错误提示不能为空") + private String message; + + @ApiModelProperty(value = "备注", example = "哈哈哈") + private String memo; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeCreateReqVO.java new file mode 100644 index 0000000..1c5723e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeCreateReqVO.java @@ -0,0 +1,15 @@ +package com.jojubanking.boot.module.system.controller.admin.errorcode.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.experimental.Accessors; + +@ApiModel("管理后台 - 错误码创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ErrorCodeCreateReqVO extends ErrorCodeBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeExcelVO.java new file mode 100644 index 0000000..aec585f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeExcelVO.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.system.controller.admin.errorcode.vo; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +//import com.jojubanking.boot.adminserver.modules.infra.enums.InfDictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 错误码 Excel VO + * + * @author TW + */ +@Data +public class ErrorCodeExcelVO { + + @ExcelProperty("错误码编号") + private Long id; + + @ExcelProperty(value = "错误码类型", converter = DictConvert.class) + @DictFormat("inf_error_code_type") // TODO TW:得思考下杂解决枚举值 + private Integer type; + + @ExcelProperty("应用名") + private String applicationName; + + @ExcelProperty("错误码编码") + private Integer code; + + @ExcelProperty("错误码错误提示") + private String message; + + @ExcelProperty("备注") + private String memo; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeExportReqVO.java new file mode 100644 index 0000000..3cdf294 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeExportReqVO.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.controller.admin.errorcode.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 错误码 Excel 导出 Request VO", description = "参数和 InfErrorCodePageReqVO 是一致的") +@Data +public class ErrorCodeExportReqVO { + + @ApiModelProperty(value = "错误码类型", example = "1") + private Integer type; + + @ApiModelProperty(value = "应用名", example = "dashboard") + private String applicationName; + + @ApiModelProperty(value = "错误码编码", example = "1234") + private Integer code; + + @ApiModelProperty(value = "错误码错误提示", example = "帅气") + private String message; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.java new file mode 100644 index 0000000..5901111 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.system.controller.admin.errorcode.vo; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 错误码分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ErrorCodePageReqVO extends PageParam { + + @ApiModelProperty(value = "错误码类型", example = "1", notes = "参见 ErrorCodeTypeEnum 枚举类") + private Integer type; + + @ApiModelProperty(value = "应用名", example = "dashboard") + private String applicationName; + + @ApiModelProperty(value = "错误码编码", example = "1234") + private Integer code; + + @ApiModelProperty(value = "错误码错误提示", example = "帅气") + private String message; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.java new file mode 100644 index 0000000..18770ad --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.system.controller.admin.errorcode.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 错误码 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ErrorCodeRespVO extends ErrorCodeBaseVO { + + @ApiModelProperty(value = "错误码编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "错误码类型", required = true, example = "1", notes = "参见 ErrorCodeTypeEnum 枚举类") + private Integer type; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeUpdateReqVO.java new file mode 100644 index 0000000..cd0254a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeUpdateReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.errorcode.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 错误码更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ErrorCodeUpdateReqVO extends ErrorCodeBaseVO { + + @ApiModelProperty(value = "错误码编号", required = true, example = "1024") + @NotNull(message = "错误码编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/HospitalController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/HospitalController.java new file mode 100644 index 0000000..8d8aec0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/HospitalController.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.controller.admin.hospital; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.hospital.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.hospital.HospitalDO; +import com.jojubanking.boot.module.system.convert.hospital.HospitalConvert; +import com.jojubanking.boot.module.system.service.hospital.HospitalService; + +@Api(tags = "管理后台 - 医院信息") +@RestController +@RequestMapping("/system/hospital") +@Validated +public class HospitalController { + + @Resource + private HospitalService hospitalService; + + @PostMapping("/create") + @ApiOperation("创建医院信息") + @PreAuthorize("@ss.hasPermission('system:hospital:create')") + public CommonResult createHospital(@Valid @RequestBody HospitalCreateReqVO createReqVO) { + return success(hospitalService.createHospital(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新医院信息") + @PreAuthorize("@ss.hasPermission('system:hospital:update')") + public CommonResult updateHospital(@Valid @RequestBody HospitalUpdateReqVO updateReqVO) { + hospitalService.updateHospital(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除医院信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:hospital:delete')") + public CommonResult deleteHospital(@RequestParam("id") Integer id) { + hospitalService.deleteHospital(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得医院信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:hospital:query')") + public CommonResult getHospital(@RequestParam("id") Integer id) { + HospitalDO hospital = hospitalService.getHospital(id); + return success(HospitalConvert.INSTANCE.convert(hospital)); + } + + @GetMapping("/list") + @ApiOperation("获得医院信息列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:hospital:query')") + public CommonResult> getHospitalList(@RequestParam("ids") Collection ids) { + List list = hospitalService.getHospitalList(ids); + return success(HospitalConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得医院信息分页") + @PreAuthorize("@ss.hasPermission('system:hospital:query')") + public CommonResult> getHospitalPage(@Valid HospitalPageReqVO pageVO) { + PageResult pageResult = hospitalService.getHospitalPage(pageVO); + return success(HospitalConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出医院信息 Excel") + @PreAuthorize("@ss.hasPermission('system:hospital:export')") + @OperateLog(type = EXPORT) + public void exportHospitalExcel(@Valid HospitalExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = hospitalService.getHospitalList(exportReqVO); + // 导出 Excel + List datas = HospitalConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "医院信息.xls", "数据", HospitalExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalBaseVO.java new file mode 100644 index 0000000..2f90598 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalBaseVO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.controller.admin.hospital.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 医院信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class HospitalBaseVO { + + @ApiModelProperty(value = "医院名称") + private String name; + + @ApiModelProperty(value = "logo") + private String logo; + + @ApiModelProperty(value = "标签") + private String label; + + @ApiModelProperty(value = "联系电话") + private String tel; + + @ApiModelProperty(value = "地址") + private String address; + + @ApiModelProperty(value = "描述") + private String content; + + @ApiModelProperty(value = "封面图") + private String img; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalCreateReqVO.java new file mode 100644 index 0000000..00b1000 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.hospital.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 医院信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class HospitalCreateReqVO extends HospitalBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalExcelVO.java new file mode 100644 index 0000000..91ec308 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalExcelVO.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.system.controller.admin.hospital.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 医院信息 Excel VO + * + * @author admin + */ +@Data +public class HospitalExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("医院名称") + private String name; + + @ExcelProperty("logo") + private String logo; + + @ExcelProperty("标签") + private String label; + + @ExcelProperty("联系电话") + private String tel; + + @ExcelProperty("地址") + private String address; + + @ExcelProperty("描述") + private String content; + + @ExcelProperty("封面图") + private String img; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalExportReqVO.java new file mode 100644 index 0000000..08a3ec9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalExportReqVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.controller.admin.hospital.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 医院信息 Excel 导出 Request VO", description = "参数和 HospitalPageReqVO 是一致的") +@Data +public class HospitalExportReqVO { + + @ApiModelProperty(value = "医院名称") + private String name; + + @ApiModelProperty(value = "logo") + private String logo; + + @ApiModelProperty(value = "标签") + private String label; + + @ApiModelProperty(value = "联系电话") + private String tel; + + @ApiModelProperty(value = "地址") + private String address; + + @ApiModelProperty(value = "描述") + private String content; + + @ApiModelProperty(value = "封面图") + private String img; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalPageReqVO.java new file mode 100644 index 0000000..fc52a0b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalPageReqVO.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.controller.admin.hospital.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 医院信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class HospitalPageReqVO extends PageParam { + + @ApiModelProperty(value = "医院名称") + private String name; + + @ApiModelProperty(value = "logo") + private String logo; + + @ApiModelProperty(value = "标签") + private String label; + + @ApiModelProperty(value = "联系电话") + private String tel; + + @ApiModelProperty(value = "地址") + private String address; + + @ApiModelProperty(value = "描述") + private String content; + + @ApiModelProperty(value = "封面图") + private String img; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalRespVO.java new file mode 100644 index 0000000..579e0a7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.hospital.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 医院信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class HospitalRespVO extends HospitalBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalUpdateReqVO.java new file mode 100644 index 0000000..1e36bea --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.hospital.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 医院信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class HospitalUpdateReqVO extends HospitalBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/InformationController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/InformationController.java new file mode 100644 index 0000000..d71db01 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/InformationController.java @@ -0,0 +1,106 @@ +package com.jojubanking.boot.module.system.controller.admin.information; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.information.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.information.InformationDO; +import com.jojubanking.boot.module.system.convert.information.InformationConvert; +import com.jojubanking.boot.module.system.service.information.InformationService; + +@Api(tags = "管理后台 - 指南信息") +@RestController +@RequestMapping("/system/information") +@Validated +public class InformationController { + + @Resource + private InformationService informationService; + + @PostMapping("/create") + @ApiOperation("创建指南信息") + @OperateLog + @PreAuthorize("@ss.hasPermission('system:information:create')") + public CommonResult createInformation(@Valid @RequestBody InformationCreateReqVO createReqVO) { + return success(informationService.createInformation(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新指南信息") + @OperateLog + @PreAuthorize("@ss.hasPermission('system:information:update')") + public CommonResult updateInformation(@Valid @RequestBody InformationUpdateReqVO updateReqVO) { + informationService.updateInformation(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除指南信息") + @OperateLog + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:information:delete')") + public CommonResult deleteInformation(@RequestParam("id") Integer id) { + informationService.deleteInformation(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得指南信息") + @OperateLog + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:information:query')") + public CommonResult getInformation(@RequestParam("id") Integer id) { + InformationDO information = informationService.getInformation(id); + return success(InformationConvert.INSTANCE.convert(information)); + } + + @GetMapping("/list") + @ApiOperation("获得指南信息列表") + @OperateLog + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:information:query')") + public CommonResult> getInformationList(@RequestParam("ids") Collection ids) { + List list = informationService.getInformationList(ids); + return success(InformationConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得指南信息分页") + @OperateLog + @PreAuthorize("@ss.hasPermission('system:information:query')") + public CommonResult> getInformationPage(@Valid InformationPageReqVO pageVO) { + PageResult pageResult = informationService.getInformationPage(pageVO); + return success(InformationConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出指南信息 Excel") + @PreAuthorize("@ss.hasPermission('system:information:export')") + @OperateLog(type = EXPORT) + public void exportInformationExcel(@Valid InformationExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = informationService.getInformationList(exportReqVO); + // 导出 Excel + List datas = InformationConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "指南信息.xls", "数据", InformationExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationBaseVO.java new file mode 100644 index 0000000..f0d3a72 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationBaseVO.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.controller.admin.information.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 指南信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class InformationBaseVO { + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "封面图") + private String img; + + @ApiModelProperty(value = "内容") + private String content; + + @ApiModelProperty(value = "类型(1、健康指南 2、就医指南 3、医院动态)") + private Integer type; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationCreateReqVO.java new file mode 100644 index 0000000..14b52c1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.information.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 指南信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InformationCreateReqVO extends InformationBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationExcelVO.java new file mode 100644 index 0000000..05edfcc --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationExcelVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.controller.admin.information.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 指南信息 Excel VO + * + * @author admin + */ +@Data +public class InformationExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("标题") + private String title; + + @ExcelProperty("封面图") + private String img; + + @ExcelProperty("内容") + private String content; + + @ExcelProperty("类型(1、健康指南 2、就医指南 3、医院动态)") + private Integer type; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationExportReqVO.java new file mode 100644 index 0000000..c9cfed8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationExportReqVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.information.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 指南信息 Excel 导出 Request VO", description = "参数和 InformationPageReqVO 是一致的") +@Data +public class InformationExportReqVO { + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "封面图") + private String img; + + @ApiModelProperty(value = "内容") + private String content; + + @ApiModelProperty(value = "类型(1、健康指南 2、就医指南 3、医院动态)") + private Integer type; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationPageReqVO.java new file mode 100644 index 0000000..d2c4b76 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationPageReqVO.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.controller.admin.information.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 指南信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InformationPageReqVO extends PageParam { + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "封面图") + private String img; + + @ApiModelProperty(value = "内容") + private String content; + + @ApiModelProperty(value = "类型(1、健康指南 2、就医指南 3、医院动态)") + private Integer type; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationRespVO.java new file mode 100644 index 0000000..d5e23db --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.information.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 指南信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InformationRespVO extends InformationBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationUpdateReqVO.java new file mode 100644 index 0000000..938ce5d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.information.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 指南信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class InformationUpdateReqVO extends InformationBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/ItemController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/ItemController.java new file mode 100644 index 0000000..1b11603 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/ItemController.java @@ -0,0 +1,119 @@ +package com.jojubanking.boot.module.system.controller.admin.item; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.text.DecimalFormat; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.item.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; +import com.jojubanking.boot.module.system.convert.item.ItemConvert; +import com.jojubanking.boot.module.system.service.item.ItemService; + +@Api(tags = "管理后台 - 检查项目") +@RestController +@RequestMapping("/system/item") +@Validated +public class ItemController { + + @Resource + private ItemService itemService; + + @PostMapping("/create") + @ApiOperation("创建检查项目") + @PreAuthorize("@ss.hasPermission('system:item:create')") + public CommonResult createItem(@Valid @RequestBody ItemCreateReqVO createReqVO) { + DecimalFormat df = new DecimalFormat("#"); + Double number = Double.parseDouble(createReqVO.getItemprice())*100; + createReqVO.setItemprice(df.format(number)); + + if(createReqVO.getItemflag() == 2){ + //临床 + createReqVO.setZxks(itemService.getLCzxks(createReqVO.getItemname()).get("zxks").toString()); + createReqVO.setZxksname(itemService.getLCzxks(createReqVO.getItemname()).get("zxksname").toString()); + }else{ + //小项目 + createReqVO.setZxks(itemService.getSFXMMzxks(createReqVO.getItemname()).get("zxks").toString()); + createReqVO.setZxksname(itemService.getSFXMMzxks(createReqVO.getItemname()).get("zxksname").toString()); + } + + //开单科室固定的 + createReqVO.setKdks("1071"); + createReqVO.setKdksname("健康管理科"); + + return success(itemService.createItem(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新检查项目") + @PreAuthorize("@ss.hasPermission('system:item:update')") + public CommonResult updateItem(@Valid @RequestBody ItemUpdateReqVO updateReqVO) { + itemService.updateItem(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除检查项目") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:item:delete')") + public CommonResult deleteItem(@RequestParam("id") Long id) { + itemService.deleteItem(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得检查项目") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:item:query')") + public CommonResult getItem(@RequestParam("id") Long id) { + ItemDO item = itemService.getItem(id); + return success(ItemConvert.INSTANCE.convert(item)); + } + + @GetMapping("/list") + @ApiOperation("获得检查项目列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:item:query')") + public CommonResult> getItemList(@RequestParam("ids") Collection ids) { + List list = itemService.getItemList(ids); + return success(ItemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得检查项目分页") + @PreAuthorize("@ss.hasPermission('system:item:query')") + public CommonResult> getItemPage(@Valid ItemPageReqVO pageVO) { + PageResult pageResult = itemService.getItemPage(pageVO); + return success(ItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出检查项目 Excel") + @PreAuthorize("@ss.hasPermission('system:item:export')") + @OperateLog(type = EXPORT) + public void exportItemExcel(@Valid ItemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = itemService.getItemList(exportReqVO); + // 导出 Excel + List datas = ItemConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检查项目.xls", "数据", ItemExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemBaseVO.java new file mode 100644 index 0000000..c7cba62 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemBaseVO.java @@ -0,0 +1,52 @@ +package com.jojubanking.boot.module.system.controller.admin.item.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 检查项目 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class ItemBaseVO { + + @ApiModelProperty(value = "套餐标识(0非套餐 1套餐 )", required = true) + @NotNull(message = "套餐标识(0非套餐 1套餐 )不能为空") + private Integer packageflag; + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包", required = true) + @NotNull(message = "套餐代码 目前只有一个基础包不能为空") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )", required = true) + @NotNull(message = "标识(1小项目 2临床 )不能为空") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码", required = true) + @NotNull(message = "项目代码不能为空") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "代价 单位分") + private String itemprice; + + @ApiModelProperty(value = "是否显示(0 显示 1不显示)") + private Integer showflag; + + @ApiModelProperty(value = "执行科室") + private String zxks; + + @ApiModelProperty(value = "执行科室名称") + private String zxksname; + + @ApiModelProperty(value = "开单科室") + private String kdks; + + @ApiModelProperty(value = "开单科室名称") + private String kdksname; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemCreateReqVO.java new file mode 100644 index 0000000..fb3bf3a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.item.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 检查项目创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemCreateReqVO extends ItemBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemExcelVO.java new file mode 100644 index 0000000..fc0a85e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemExcelVO.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.system.controller.admin.item.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 检查项目 Excel VO + * + * @author admin + */ +@Data +public class ItemExcelVO { + + @ExcelProperty("ID") + private Long id; + + @ExcelProperty("套餐标识(0非套餐 1套餐 )") + private Integer packageflag; + + @ExcelProperty("套餐代码 目前只有一个基础包") + private String packageno; + + @ExcelProperty("标识(1小项目 2临床 )") + private Integer itemflag; + + @ExcelProperty("项目代码") + private String itemno; + + @ExcelProperty("项目名称") + private String itemname; + + @ExcelProperty("代价 单位分") + private String itemprice; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemExportReqVO.java new file mode 100644 index 0000000..bbec27c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemExportReqVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.controller.admin.item.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 检查项目 Excel 导出 Request VO", description = "参数和 ItemPageReqVO 是一致的") +@Data +public class ItemExportReqVO { + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "套餐标识(0非套餐 1套餐 )") + private Integer packageflag; + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "代价 单位分") + private String itemprice; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemPageReqVO.java new file mode 100644 index 0000000..8cc3598 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemPageReqVO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.controller.admin.item.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 检查项目分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemPageReqVO extends PageParam { + + @ApiModelProperty(value = "套餐标识(0非套餐 1套餐 )") + private Integer packageflag; + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "代价 单位分") + private String itemprice; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemRespVO.java new file mode 100644 index 0000000..f66a12a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemRespVO.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.system.controller.admin.item.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 检查项目 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemRespVO extends ItemBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Long id; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemUpdateReqVO.java new file mode 100644 index 0000000..d3931e0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemUpdateReqVO.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.system.controller.admin.item.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 检查项目更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemUpdateReqVO extends ItemBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Long id; + + @ApiModelProperty(value = "sort", required = true) + @NotNull(message = "排序序号不能为空") + private Integer sort; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/KsInfoController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/KsInfoController.java new file mode 100644 index 0000000..0428ed7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/KsInfoController.java @@ -0,0 +1,108 @@ +package com.jojubanking.boot.module.system.controller.admin.ksinfo; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.ksinfo.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.ksinfo.KsInfoDO; +import com.jojubanking.boot.module.system.convert.ksinfo.KsInfoConvert; +import com.jojubanking.boot.module.system.service.ksinfo.KsInfoService; + +@Api(tags = "管理后台 - 科室信息") +@RestController +@RequestMapping("/system/ks-info") +@Validated +public class KsInfoController { + + @Resource + private KsInfoService ksInfoService; + + @PostMapping("/create") + @ApiOperation("创建科室信息") + @PreAuthorize("@ss.hasPermission('system:ks-info:create')") + public CommonResult createKsInfo(@Valid @RequestBody KsInfoCreateReqVO createReqVO) { + return success(ksInfoService.createKsInfo(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新科室信息") + @PreAuthorize("@ss.hasPermission('system:ks-info:update')") + public CommonResult updateKsInfo(@Valid @RequestBody KsInfoUpdateReqVO updateReqVO) { + ksInfoService.updateKsInfo(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除科室信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:ks-info:delete')") + public CommonResult deleteKsInfo(@RequestParam("id") Integer id) { + ksInfoService.deleteKsInfo(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得科室信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:ks-info:query')") + public CommonResult getKsInfo(@RequestParam("id") Integer id) { + KsInfoDO ksInfo = ksInfoService.getKsInfo(id); + return success(KsInfoConvert.INSTANCE.convert(ksInfo)); + } + + @GetMapping("/list") + @ApiOperation("获得科室信息列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:ks-info:query')") + public CommonResult> getKsInfoList(@RequestParam("ids") Collection ids) { + List list = ksInfoService.getKsInfoList(ids); + return success(KsInfoConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得科室信息分页") + @PreAuthorize("@ss.hasPermission('system:ks-info:query')") + public CommonResult> getKsInfoPage(@Valid KsInfoPageReqVO pageVO) { + PageResult pageResult = ksInfoService.getKsInfoPage(pageVO); + return success(KsInfoConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/dzinfo") + @ApiOperation("获得科室信息分页") + @PreAuthorize("@ss.hasPermission('system:ks-info:query')") + public CommonResult> getDzInfoPage(@Valid KsInfoPageReqVO pageVO) { + PageResult pageResult = ksInfoService.getDzInfoPage(pageVO); + return success(KsInfoConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出科室信息 Excel") + @PreAuthorize("@ss.hasPermission('system:ks-info:export')") + @OperateLog(type = EXPORT) + public void exportKsInfoExcel(@Valid KsInfoExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = ksInfoService.getKsInfoList(exportReqVO); + // 导出 Excel + List datas = KsInfoConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "科室信息.xls", "数据", KsInfoExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoBaseVO.java new file mode 100644 index 0000000..da8a331 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoBaseVO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.controller.admin.ksinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 科室信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class KsInfoBaseVO { + + @ApiModelProperty(value = "科室名称") + private String name; + + @ApiModelProperty(value = "科室分类") + private Integer tid; + + @ApiModelProperty(value = "详细介绍") + private String info; + + @ApiModelProperty(value = "分布位置") + private String address; + + @ApiModelProperty(value = "封面图") + private String img; + + @ApiModelProperty(value = "科室编码") + private String departcode; + + @ApiModelProperty(value = "科室类别") + private String departtype; + + @ApiModelProperty(value = "更新类别") + private String uptype; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoCreateReqVO.java new file mode 100644 index 0000000..0c29f8b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.ksinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 科室信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class KsInfoCreateReqVO extends KsInfoBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoExcelVO.java new file mode 100644 index 0000000..903acb4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoExcelVO.java @@ -0,0 +1,47 @@ +package com.jojubanking.boot.module.system.controller.admin.ksinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 科室信息 Excel VO + * + * @author admin + */ +@Data +public class KsInfoExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("科室名称") + private String name; + + @ExcelProperty("科室分类") + private Integer tid; + + @ExcelProperty("详细介绍") + private String info; + + @ExcelProperty("分布位置") + private String address; + + @ExcelProperty("封面图") + private String img; + + @ExcelProperty("科室编码") + private String departcode; + + @ExcelProperty("科室类别") + private String departtype; + + @ExcelProperty("更新类别") + private String uptype; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoExportReqVO.java new file mode 100644 index 0000000..6369d59 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoExportReqVO.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.module.system.controller.admin.ksinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 科室信息 Excel 导出 Request VO", description = "参数和 KsInfoPageReqVO 是一致的") +@Data +public class KsInfoExportReqVO { + + @ApiModelProperty(value = "科室名称") + private String name; + + @ApiModelProperty(value = "科室分类") + private Integer tid; + + @ApiModelProperty(value = "详细介绍") + private String info; + + @ApiModelProperty(value = "分布位置") + private String address; + + @ApiModelProperty(value = "封面图") + private String img; + + @ApiModelProperty(value = "科室编码") + private String departcode; + + @ApiModelProperty(value = "科室类别") + private String departtype; + + @ApiModelProperty(value = "更新类别") + private String uptype; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoPageReqVO.java new file mode 100644 index 0000000..23ee5f6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoPageReqVO.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.system.controller.admin.ksinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 科室信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class KsInfoPageReqVO extends PageParam { + + @ApiModelProperty(value = "科室名称") + private String name; + + @ApiModelProperty(value = "科室分类") + private Integer tid; + + @ApiModelProperty(value = "详细介绍") + private String info; + + @ApiModelProperty(value = "分布位置") + private String address; + + @ApiModelProperty(value = "封面图") + private String img; + + @ApiModelProperty(value = "科室编码") + private String departcode; + + @ApiModelProperty(value = "科室类别") + private String departtype; + + @ApiModelProperty(value = "更新类别") + private String uptype; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoRespVO.java new file mode 100644 index 0000000..619c0c8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.ksinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 科室信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class KsInfoRespVO extends KsInfoBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoUpdateReqVO.java new file mode 100644 index 0000000..a64d488 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.ksinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 科室信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class KsInfoUpdateReqVO extends KsInfoBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/KsTypeController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/KsTypeController.java new file mode 100644 index 0000000..dbaeee3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/KsTypeController.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.controller.admin.kstype; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.kstype.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.kstype.KsTypeDO; +import com.jojubanking.boot.module.system.convert.kstype.KsTypeConvert; +import com.jojubanking.boot.module.system.service.kstype.KsTypeService; + +@Api(tags = "管理后台 - 科室类别") +@RestController +@RequestMapping("/system/ks-type") +@Validated +public class KsTypeController { + + @Resource + private KsTypeService ksTypeService; + + @PostMapping("/create") + @ApiOperation("创建科室类别") + @PreAuthorize("@ss.hasPermission('system:ks-type:create')") + public CommonResult createKsType(@Valid @RequestBody KsTypeCreateReqVO createReqVO) { + return success(ksTypeService.createKsType(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新科室类别") + @PreAuthorize("@ss.hasPermission('system:ks-type:update')") + public CommonResult updateKsType(@Valid @RequestBody KsTypeUpdateReqVO updateReqVO) { + ksTypeService.updateKsType(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除科室类别") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:ks-type:delete')") + public CommonResult deleteKsType(@RequestParam("id") Integer id) { + ksTypeService.deleteKsType(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得科室类别") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:ks-type:query')") + public CommonResult getKsType(@RequestParam("id") Integer id) { + KsTypeDO ksType = ksTypeService.getKsType(id); + return success(KsTypeConvert.INSTANCE.convert(ksType)); + } + + @GetMapping("/list") + @ApiOperation("获得科室类别列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:ks-type:query')") + public CommonResult> getKsTypeList(@RequestParam("ids") Collection ids) { + List list = ksTypeService.getKsTypeList(ids); + return success(KsTypeConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得科室类别分页") + @PreAuthorize("@ss.hasPermission('system:ks-type:query')") + public CommonResult> getKsTypePage(@Valid KsTypePageReqVO pageVO) { + PageResult pageResult = ksTypeService.getKsTypePage(pageVO); + return success(KsTypeConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出科室类别 Excel") + @PreAuthorize("@ss.hasPermission('system:ks-type:export')") + @OperateLog(type = EXPORT) + public void exportKsTypeExcel(@Valid KsTypeExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = ksTypeService.getKsTypeList(exportReqVO); + // 导出 Excel + List datas = KsTypeConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "科室类别.xls", "数据", KsTypeExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeBaseVO.java new file mode 100644 index 0000000..9c79d73 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeBaseVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.kstype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 科室类别 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class KsTypeBaseVO { + + @ApiModelProperty(value = "分类名称") + private String name; + + @ApiModelProperty(value = "sort") + private Integer sort; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeCreateReqVO.java new file mode 100644 index 0000000..9312f76 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.kstype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 科室类别创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class KsTypeCreateReqVO extends KsTypeBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeExcelVO.java new file mode 100644 index 0000000..bee4a79 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeExcelVO.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.system.controller.admin.kstype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 科室类别 Excel VO + * + * @author admin + */ +@Data +public class KsTypeExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("分类名称") + private String name; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeExportReqVO.java new file mode 100644 index 0000000..798bec3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeExportReqVO.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.system.controller.admin.kstype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 科室类别 Excel 导出 Request VO", description = "参数和 KsTypePageReqVO 是一致的") +@Data +public class KsTypeExportReqVO { + + @ApiModelProperty(value = "分类名称") + private String name; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypePageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypePageReqVO.java new file mode 100644 index 0000000..2dd92e1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypePageReqVO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.controller.admin.kstype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 科室类别分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class KsTypePageReqVO extends PageParam { + + @ApiModelProperty(value = "分类名称") + private String name; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeRespVO.java new file mode 100644 index 0000000..044c57d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeRespVO.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.system.controller.admin.kstype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 科室类别 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class KsTypeRespVO extends KsTypeBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeUpdateReqVO.java new file mode 100644 index 0000000..f25695a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.kstype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 科室类别更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class KsTypeUpdateReqVO extends KsTypeBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/LabelController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/LabelController.java new file mode 100644 index 0000000..50e5ce4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/LabelController.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.controller.admin.label; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.label.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.label.LabelDO; +import com.jojubanking.boot.module.system.convert.label.LabelConvert; +import com.jojubanking.boot.module.system.service.label.LabelService; + +@Api(tags = "管理后台 - 信息") +@RestController +@RequestMapping("/system/label") +@Validated +public class LabelController { + + @Resource + private LabelService labelService; + + @PostMapping("/create") + @ApiOperation("创建信息") + @PreAuthorize("@ss.hasPermission('system:label:create')") + public CommonResult createLabel(@Valid @RequestBody LabelCreateReqVO createReqVO) { + return success(labelService.createLabel(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新信息") + @PreAuthorize("@ss.hasPermission('system:label:update')") + public CommonResult updateLabel(@Valid @RequestBody LabelUpdateReqVO updateReqVO) { + labelService.updateLabel(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:label:delete')") + public CommonResult deleteLabel(@RequestParam("id") Integer id) { + labelService.deleteLabel(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:label:query')") + public CommonResult getLabel(@RequestParam("id") Integer id) { + LabelDO label = labelService.getLabel(id); + return success(LabelConvert.INSTANCE.convert(label)); + } + + @GetMapping("/list") + @ApiOperation("获得信息列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:label:query')") + public CommonResult> getLabelList(@RequestParam("ids") Collection ids) { + List list = labelService.getLabelList(ids); + return success(LabelConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得信息分页") + @PreAuthorize("@ss.hasPermission('system:label:query')") + public CommonResult> getLabelPage(@Valid LabelPageReqVO pageVO) { + PageResult pageResult = labelService.getLabelPage(pageVO); + return success(LabelConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出信息 Excel") + @PreAuthorize("@ss.hasPermission('system:label:export')") + @OperateLog(type = EXPORT) + public void exportLabelExcel(@Valid LabelExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = labelService.getLabelList(exportReqVO); + // 导出 Excel + List datas = LabelConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "信息.xls", "数据", LabelExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelBaseVO.java new file mode 100644 index 0000000..a04d69f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelBaseVO.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.controller.admin.label.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class LabelBaseVO { + + @ApiModelProperty(value = "导视名称") + private String name; + + @ApiModelProperty(value = "导视详情") + private String info; + + @ApiModelProperty(value = "楼层id") + private Integer fid; + + @ApiModelProperty(value = "大楼id") + private Integer bid; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelCreateReqVO.java new file mode 100644 index 0000000..98536fd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.label.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LabelCreateReqVO extends LabelBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelExcelVO.java new file mode 100644 index 0000000..c4bf33a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelExcelVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.controller.admin.label.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 信息 Excel VO + * + * @author admin + */ +@Data +public class LabelExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("导视名称") + private String name; + + @ExcelProperty("导视详情") + private String info; + + @ExcelProperty("楼层id") + private Integer fid; + + @ExcelProperty("大楼id") + private Integer bid; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelExportReqVO.java new file mode 100644 index 0000000..0a31891 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelExportReqVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.label.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 信息 Excel 导出 Request VO", description = "参数和 LabelPageReqVO 是一致的") +@Data +public class LabelExportReqVO { + + @ApiModelProperty(value = "导视名称") + private String name; + + @ApiModelProperty(value = "导视详情") + private String info; + + @ApiModelProperty(value = "楼层id") + private Integer fid; + + @ApiModelProperty(value = "大楼id") + private Integer bid; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelPageReqVO.java new file mode 100644 index 0000000..6946f41 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelPageReqVO.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.controller.admin.label.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LabelPageReqVO extends PageParam { + + @ApiModelProperty(value = "导视名称") + private String name; + + @ApiModelProperty(value = "导视详情") + private String info; + + @ApiModelProperty(value = "楼层id") + private Integer fid; + + @ApiModelProperty(value = "大楼id") + private Integer bid; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelRespVO.java new file mode 100644 index 0000000..7840cb8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.label.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LabelRespVO extends LabelBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelUpdateReqVO.java new file mode 100644 index 0000000..7804b89 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.label.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LabelUpdateReqVO extends LabelBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/LoginLogController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/LoginLogController.java new file mode 100644 index 0000000..fd3f0ef --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/LoginLogController.java @@ -0,0 +1,59 @@ +package com.jojubanking.boot.module.system.controller.admin.logger; + +import com.jojubanking.boot.module.system.dal.dataobject.logger.LoginLogDO; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogExcelVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogRespVO; +import com.jojubanking.boot.module.system.convert.logger.LoginLogConvert; +import com.jojubanking.boot.module.system.service.logger.LoginLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 登录日志") +@RestController +@RequestMapping("/system/login-log") +@Validated +public class LoginLogController { + + @Resource + private LoginLogService loginLogService; + + @GetMapping("/page") + @ApiOperation("获得登录日志分页列表") + @PreAuthorize("@ss.hasPermission('system:login-log:query')") + public CommonResult> getLoginLogPage(@Valid LoginLogPageReqVO reqVO) { + PageResult page = loginLogService.getLoginLogPage(reqVO); + return CommonResult.success(LoginLogConvert.INSTANCE.convertPage(page)); + } + + @GetMapping("/export") + @ApiOperation("导出登录日志 Excel") + @PreAuthorize("@ss.hasPermission('system:login-log:export')") + @OperateLog(type = EXPORT) + public void exportLoginLog(HttpServletResponse response, @Valid LoginLogExportReqVO reqVO) throws IOException { + List list = loginLogService.getLoginLogList(reqVO); + // 拼接数据 + List data = LoginLogConvert.INSTANCE.convertList(list); + // 输出 + ExcelUtils.write(response, "登录日志.xls", "数据列表", LoginLogExcelVO.class, data); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/OperateLogController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/OperateLogController.http new file mode 100644 index 0000000..f667482 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/OperateLogController.http @@ -0,0 +1,4 @@ +### 请求 /system/operate-log/demo 接口 => 成功 +GET {{baseUrl}}/system/operate-log/demo +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/OperateLogController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/OperateLogController.java new file mode 100644 index 0000000..d7a696a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/OperateLogController.java @@ -0,0 +1,85 @@ +package com.jojubanking.boot.module.system.controller.admin.logger; + +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogExcelVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO; +import com.jojubanking.boot.module.system.convert.logger.OperateLogConvert; +import com.jojubanking.boot.module.system.dal.dataobject.logger.OperateLogDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.service.logger.OperateLogService; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.common.util.collection.MapUtils; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 操作日志") +@RestController +@RequestMapping("/system/operate-log") +@Validated +public class OperateLogController { + + @Resource + private OperateLogService operateLogService; + @Resource + private AdminUserService userService; + + @GetMapping("/page") + @ApiOperation("查看操作日志分页列表") + @PreAuthorize("@ss.hasPermission('system:operate-log:query')") + public CommonResult> pageOperateLog(@Valid OperateLogPageReqVO reqVO) { + PageResult pageResult = operateLogService.getOperateLogPage(reqVO); + + // 获得拼接需要的数据 + Collection userIds = CollectionUtils.convertList(pageResult.getList(), OperateLogDO::getUserId); + Map userMap = userService.getUserMap(userIds); + // 拼接数据 + List list = new ArrayList<>(pageResult.getList().size()); + pageResult.getList().forEach(operateLog -> { + OperateLogRespVO respVO = OperateLogConvert.INSTANCE.convert(operateLog); + list.add(respVO); + // 拼接用户信息 + MapUtils.findAndThen(userMap, operateLog.getUserId(), user -> respVO.setUserNickname(user.getNickname())); + }); + return success(new PageResult<>(list, pageResult.getTotal())); + } + + @ApiOperation("导出操作日志") + @GetMapping("/export") + @PreAuthorize("@ss.hasPermission('system:operate-log:export')") + @OperateLog(type = EXPORT) + public void exportOperateLog(HttpServletResponse response, @Valid OperateLogExportReqVO reqVO) throws IOException { + List list = operateLogService.getOperateLogs(reqVO); + + // 获得拼接需要的数据 + Collection userIds = CollectionUtils.convertList(list, OperateLogDO::getUserId); + Map userMap = userService.getUserMap(userIds); + // 拼接数据 + List excelDataList = OperateLogConvert.INSTANCE.convertList(list, userMap); + // 输出 + ExcelUtils.write(response, "操作日志.xls", "数据列表", OperateLogExcelVO.class, excelDataList); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.java new file mode 100644 index 0000000..3be6ce0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 登录日志 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class LoginLogBaseVO { + + @ApiModelProperty(value = "日志类型", required = true, example = "1", notes = "参见 LoginLogTypeEnum 枚举类") + @NotNull(message = "日志类型不能为空") + private Integer logType; + + @ApiModelProperty(value = "链路追踪编号", example = "89aca178-a370-411c-ae02-3f0d672be4ab") + @NotEmpty(message = "链路追踪编号不能为空") + private String traceId; + + @ApiModelProperty(value = "用户账号", required = true, example = "joju") + @NotBlank(message = "用户账号不能为空") + @Size(max = 30, message = "用户账号长度不能超过30个字符") + private String username; + + @ApiModelProperty(value = "登录结果", required = true, example = "1", notes = "参见 LoginResultEnum 枚举类") + @NotNull(message = "登录结果不能为空") + private Integer result; + + @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + @ApiModelProperty(value = "浏览器 UserAgent", example = "Mozilla/5.0") + private String userAgent; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.java new file mode 100644 index 0000000..d00e804 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 登录日志 Excel 导出响应 VO + */ +@Data +public class LoginLogExcelVO { + + @ExcelProperty("日志主键") + private Long id; + + @ExcelProperty("用户账号") + private String username; + + @ExcelProperty(value = "日志类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.LOGIN_TYPE) + private Integer logType; + + @ExcelProperty(value = "登录结果", converter = DictConvert.class) + @DictFormat(DictTypeConstants.LOGIN_RESULT) + private Integer result; + + @ExcelProperty("登录 IP") + private String userIp; + + @ExcelProperty("浏览器 UA") + private String userAgent; + + @ExcelProperty("登录时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogExportReqVO.java new file mode 100644 index 0000000..d3611e6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogExportReqVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 登录日志分页列表 Request VO") +@Data +public class LoginLogExportReqVO { + + @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模拟匹配") + private String userIp; + + @ApiModelProperty(value = "用户账号", example = "芋道", notes = "模拟匹配") + private String username; + + @ApiModelProperty(value = "操作状态", example = "true") + private Boolean status; + + @ApiModelProperty(value = "登录时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.java new file mode 100644 index 0000000..3211b8b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 登录日志分页列表 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class LoginLogPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户 IP", example = "127.0.0.1", notes = "模拟匹配") + private String userIp; + + @ApiModelProperty(value = "用户账号", example = "芋道", notes = "模拟匹配") + private String username; + + @ApiModelProperty(value = "操作状态", example = "true") + private Boolean status; + + @ApiModelProperty(value = "登录时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.java new file mode 100644 index 0000000..650e0a8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +@ApiModel("管理后台 - 登录日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LoginLogRespVO extends LoginLogBaseVO { + + @ApiModelProperty(value = "日志编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "用户编号", example = "666") + private Long userId; + + @ApiModelProperty(value = "用户类型", required = true, example = "2", notes = "参见 UserTypeEnum 枚举") + @NotNull(message = "用户类型不能为空") + private Integer userType; + + @ApiModelProperty(value = "登录时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.java new file mode 100644 index 0000000..61e6a39 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.java @@ -0,0 +1,85 @@ +package com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.Map; + +/** + * 操作日志 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class OperateLogBaseVO { + + @ApiModelProperty(value = "链路追踪编号", required = true, example = "89aca178-a370-411c-ae02-3f0d672be4ab") + @NotEmpty(message = "链路追踪编号不能为空") + private String traceId; + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + @NotNull(message = "用户编号不能为空") + private Long userId; + + @ApiModelProperty(value = "操作模块", required = true, example = "订单") + @NotEmpty(message = "操作模块不能为空") + private String module; + + @ApiModelProperty(value = "操作名", required = true, example = "创建订单") + @NotEmpty(message = "操作名") + private String name; + + @ApiModelProperty(value = "操作分类", required = true, example = "1", notes = "参见 OperateLogTypeEnum 枚举类") + @NotNull(message = "操作分类不能为空") + private Integer type; + + @ApiModelProperty(value = "操作明细", example = "修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。") + private String content; + + @ApiModelProperty(value = "拓展字段", example = "{'orderId': 1}") + private Map exts; + + @ApiModelProperty(value = "请求方法名", required = true, example = "GET") + @NotEmpty(message = "请求方法名不能为空") + private String requestMethod; + + @ApiModelProperty(value = "请求地址", required = true, example = "/xxx/yyy") + @NotEmpty(message = "请求地址不能为空") + private String requestUrl; + + @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + @ApiModelProperty(value = "浏览器 UserAgent", required = true, example = "Mozilla/5.0") + @NotEmpty(message = "浏览器 UserAgent 不能为空") + private String userAgent; + + @ApiModelProperty(value = "Java 方法名", required = true, example = "com.jojubanking.boot.adminserver.UserController.save(...)") + @NotEmpty(message = "Java 方法名不能为空") + private String javaMethod; + + @ApiModelProperty(value = "Java 方法的参数") + private String javaMethodArgs; + + @ApiModelProperty(value = "开始时间", required = true) + @NotNull(message = "开始时间不能为空") + private Date startTime; + + @ApiModelProperty(value = "执行时长,单位:毫秒", required = true) + @NotNull(message = "执行时长不能为空") + private Integer duration; + + @ApiModelProperty(value = "结果码", required = true) + @NotNull(message = "结果码不能为空") + private Integer resultCode; + + @ApiModelProperty(value = "结果提示") + private String resultMsg; + + @ApiModelProperty(value = "结果数据") + private String resultData; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.java new file mode 100644 index 0000000..b5762c7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 操作日志 Excel 导出响应 VO + */ +@Data +public class OperateLogExcelVO { + + @ExcelProperty("日志编号") + private Long id; + + @ExcelProperty("操作模块") + private String module; + + @ExcelProperty("操作名") + private String name; + + @ExcelProperty(value = "操作类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.OPERATE_TYPE) + private String type; + + @ExcelProperty("操作人") + private String userNickname; + + @ExcelProperty(value = "操作结果") // 成功 or 失败 + private String successStr; + + @ExcelProperty("操作日志") + private Date startTime; + + @ExcelProperty("执行时长") + private Integer duration; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.java new file mode 100644 index 0000000..b5f9e35 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 操作日志分页列表 Request VO") +@Data +public class OperateLogExportReqVO { + + @ApiModelProperty(value = "操作模块", example = "订单", notes = "模拟匹配") + private String module; + + @ApiModelProperty(value = "用户昵称", example = "芋道", notes = "模拟匹配") + private String userNickname; + + @ApiModelProperty(value = "操作分类", example = "1", notes = "参见 OperateLogTypeEnum 枚举类") + private Integer type; + + @ApiModelProperty(value = "操作状态", example = "true") + private Boolean success; + + @ApiModelProperty(value = "开始时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] startTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java new file mode 100644 index 0000000..c229a80 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 操作日志分页列表 Request VO") +@Data +public class OperateLogPageReqVO extends PageParam { + + @ApiModelProperty(value = "操作模块", example = "订单", notes = "模拟匹配") + private String module; + + @ApiModelProperty(value = "用户昵称", example = "芋道", notes = "模拟匹配") + private String userNickname; + + @ApiModelProperty(value = "操作分类", example = "1", notes = "参见 OperateLogTypeEnum 枚举类") + private Integer type; + + @ApiModelProperty(value = "操作状态", example = "true") + private Boolean success; + + @ApiModelProperty(value = "开始时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] startTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java new file mode 100644 index 0000000..e390b4e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("管理后台 - 操作日志 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OperateLogRespVO extends OperateLogBaseVO { + + @ApiModelProperty(value = "日志编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") + private String userNickname; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/MzdmController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/MzdmController.java new file mode 100644 index 0000000..89e899a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/MzdmController.java @@ -0,0 +1,116 @@ +package com.jojubanking.boot.module.system.controller.admin.mzdm; + +import com.jojubanking.boot.module.system.controller.admin.xytjjg.vo.XytjjgExcelVO; +import com.jojubanking.boot.module.system.controller.admin.xytjjg.vo.XytjjgExportReqVO; +import com.jojubanking.boot.module.system.convert.xytjjg.XytjjgConvert; +import com.jojubanking.boot.module.system.dal.dataobject.xytjjg.XytjjgDO; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.mzdm.MzdmDO; +import com.jojubanking.boot.module.system.convert.mzdm.MzdmConvert; +import com.jojubanking.boot.module.system.service.mzdm.MzdmService; + +@Api(tags = "管理后台 - 民族代码") +@RestController +@RequestMapping("/system/mzdm") +@Validated +public class MzdmController { + + @Resource + private MzdmService mzdmService; + + @PostMapping("/create") + @ApiOperation("创建民族代码") + @PreAuthorize("@ss.hasPermission('system:mzdm:create')") + public CommonResult createMzdm(@Valid @RequestBody MzdmCreateReqVO createReqVO) { + return success(mzdmService.createMzdm(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新民族代码") + @PreAuthorize("@ss.hasPermission('system:mzdm:update')") + public CommonResult updateMzdm(@Valid @RequestBody MzdmUpdateReqVO updateReqVO) { + mzdmService.updateMzdm(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除民族代码") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:mzdm:delete')") + public CommonResult deleteMzdm(@RequestParam("id") Long id) { + mzdmService.deleteMzdm(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得民族代码") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:mzdm:query')") + public CommonResult getMzdm(@RequestParam("id") Long id) { + MzdmDO mzdm = mzdmService.getMzdm(id); + return success(MzdmConvert.INSTANCE.convert(mzdm)); + } + + @GetMapping("/list") + @ApiOperation("获得民族代码列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:mzdm:query')") + public CommonResult> getMzdmList(@RequestParam("ids") Collection ids) { + List list = mzdmService.getMzdmList(ids); + return success(MzdmConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得民族代码分页") + @PreAuthorize("@ss.hasPermission('system:mzdm:query')") + public CommonResult> getMzdmPage(@Valid MzdmPageReqVO pageVO) { + PageResult pageResult = mzdmService.getMzdmPage(pageVO); + return success(MzdmConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出民族代码 Excel") + @PreAuthorize("@ss.hasPermission('system:mzdm:export')") + @OperateLog(type = EXPORT) + public void exportMzdmExcel(@Valid MzdmExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = mzdmService.getMzdmList(exportReqVO); + // 导出 Excel + List datas = MzdmConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "民族代码.xls", "数据", MzdmExcelVO.class, datas); + } + + @GetMapping("/getall") + @ApiOperation("导出民族代码 Excel") + @PreAuthorize("@ss.hasPermission('system:mzdm:export')") + public CommonResult> getall(@RequestParam("value") String value ) { + + MzdmExportReqVO exportReqVO = new MzdmExportReqVO(); + List list = mzdmService.getMzdmList01(exportReqVO); + // 导出 Excel + List datas = MzdmConvert.INSTANCE.convertList02(list); + return success(datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmBaseVO.java new file mode 100644 index 0000000..d8d5fc0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmBaseVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.controller.admin.mzdm.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 民族代码 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class MzdmBaseVO { + + @ApiModelProperty(value = "民族代码", required = true) + @NotNull(message = "民族代码不能为空") + private Integer mzdm; + + @ApiModelProperty(value = "民族名称", required = true) + @NotNull(message = "民族名称不能为空") + private String name; + + @ApiModelProperty(value = "拼音", required = true) + @NotNull(message = "拼音不能为空") + private String py; + + @ApiModelProperty(value = "wb", required = true) + @NotNull(message = "wb不能为空") + private String wb; + + @ApiModelProperty(value = "备注") + private String memo; + + @ApiModelProperty(value = "gjbzbbh") + private String gjbzbbh; + + @ApiModelProperty(value = "jlzt") + private String jlzt; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmCreateReqVO.java new file mode 100644 index 0000000..f89f76b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.mzdm.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 民族代码创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MzdmCreateReqVO extends MzdmBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmExcelVO.java new file mode 100644 index 0000000..bceb5e8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmExcelVO.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.system.controller.admin.mzdm.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 民族代码 Excel VO + * + * @author admin + */ +@Data +public class MzdmExcelVO { + + @ExcelProperty("ID") + private Long id; + + @ExcelProperty("民族代码") + private Integer mzdm; + + @ExcelProperty("民族名称") + private String name; + + @ExcelProperty("拼音") + private String py; + + @ExcelProperty("wb") + private String wb; + + @ExcelProperty("备注") + private String memo; + + @ExcelProperty("gjbzbbh") + private String gjbzbbh; + + @ExcelProperty("jlzt") + private String jlzt; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmExportReqVO.java new file mode 100644 index 0000000..38ae378 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmExportReqVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.controller.admin.mzdm.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 民族代码 Excel 导出 Request VO", description = "参数和 MzdmPageReqVO 是一致的") +@Data +public class MzdmExportReqVO { + + @ApiModelProperty(value = "民族代码") + private Integer mzdm; + + @ApiModelProperty(value = "民族名称") + private String name; + + @ApiModelProperty(value = "拼音") + private String py; + + @ApiModelProperty(value = "wb") + private String wb; + + @ApiModelProperty(value = "备注") + private String memo; + + @ApiModelProperty(value = "gjbzbbh") + private String gjbzbbh; + + @ApiModelProperty(value = "jlzt") + private String jlzt; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmPageReqVO.java new file mode 100644 index 0000000..b394f73 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmPageReqVO.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.controller.admin.mzdm.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 民族代码分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MzdmPageReqVO extends PageParam { + + @ApiModelProperty(value = "民族代码") + private Integer mzdm; + + @ApiModelProperty(value = "民族名称") + private String name; + + @ApiModelProperty(value = "拼音") + private String py; + + @ApiModelProperty(value = "wb") + private String wb; + + @ApiModelProperty(value = "备注") + private String memo; + + @ApiModelProperty(value = "gjbzbbh") + private String gjbzbbh; + + @ApiModelProperty(value = "jlzt") + private String jlzt; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmRespVO.java new file mode 100644 index 0000000..f9a9c46 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.mzdm.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 民族代码 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MzdmRespVO extends MzdmBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmUpdateReqVO.java new file mode 100644 index 0000000..96d714e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.mzdm.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 民族代码更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MzdmUpdateReqVO extends MzdmBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/MzjfController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/MzjfController.java new file mode 100644 index 0000000..e8bc928 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/MzjfController.java @@ -0,0 +1,101 @@ +package com.jojubanking.boot.module.system.controller.admin.mzjf; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.text.ParseException; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.mzjf.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.mzjf.MzjfDO; +import com.jojubanking.boot.module.system.convert.mzjf.MzjfConvert; +import com.jojubanking.boot.module.system.service.mzjf.MzjfService; + +@Api(tags = "管理后台 - 门诊缴费") +@RestController +@RequestMapping("/system/mzjf") +@Validated +public class MzjfController { + + @Resource + private MzjfService mzjfService; + + @PostMapping("/create") + @ApiOperation("创建门诊缴费") + @PreAuthorize("@ss.hasPermission('system:mzjf:create')") + public CommonResult createMzjf(@Valid @RequestBody MzjfCreateReqVO createReqVO) { + return success(mzjfService.createMzjf(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新门诊缴费") + @PreAuthorize("@ss.hasPermission('system:mzjf:update')") + public CommonResult updateMzjf(@Valid @RequestBody MzjfUpdateReqVO updateReqVO) { + mzjfService.updateMzjf(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除门诊缴费") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:mzjf:delete')") + public CommonResult deleteMzjf(@RequestParam("id") Integer id) { + mzjfService.deleteMzjf(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得门诊缴费") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:mzjf:query')") + public CommonResult getMzjf(@RequestParam("id") Integer id) { + MzjfDO mzjf = mzjfService.getMzjf(id); + return success(MzjfConvert.INSTANCE.convert(mzjf)); + } + + @GetMapping("/list") + @ApiOperation("获得门诊缴费列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:mzjf:query')") + public CommonResult> getMzjfList(@RequestParam("ids") Collection ids) { + List list = mzjfService.getMzjfList(ids); + return success(MzjfConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得门诊缴费分页") + @PreAuthorize("@ss.hasPermission('system:mzjf:query')") + public CommonResult> getMzjfPage(@Valid MzjfPageReqVO pageVO) throws ParseException { + PageResult pageResult = mzjfService.getMzjfPage(pageVO); + return success(MzjfConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出门诊缴费 Excel") + @PreAuthorize("@ss.hasPermission('system:mzjf:export')") + @OperateLog(type = EXPORT) + public void exportMzjfExcel(@Valid MzjfExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = mzjfService.getMzjfList(exportReqVO); + // 导出 Excel + List datas = MzjfConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "门诊缴费.xls", "数据", MzjfExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfBaseVO.java new file mode 100644 index 0000000..ba66eed --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfBaseVO.java @@ -0,0 +1,164 @@ +package com.jojubanking.boot.module.system.controller.admin.mzjf.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 门诊缴费 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class MzjfBaseVO { + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "就诊卡id") + private Integer cardId; + + @ApiModelProperty(value = "ID") + private String patientid; + + @ApiModelProperty(value = "证件类型") + private String idtype; + + @ApiModelProperty(value = "操作类型") + private Integer locktype; + + @ApiModelProperty(value = "检查项目名称") + private String creatitemname; + + @ApiModelProperty(value = "预约时间") + private String appointmenttime; + + @ApiModelProperty(value = "创建时间") + private String creatdate; + + @ApiModelProperty(value = "查询方式") + private Integer querytype; + + @ApiModelProperty(value = "订单ID") + private String orderno; + + @ApiModelProperty(value = "单据ID") + private String flowno; + + @ApiModelProperty(value = "开单科室编号") + private String setdepartcode; + + @ApiModelProperty(value = "开单科室名称") + private String setdepartname; + + @ApiModelProperty(value = "执行科室编号") + private String dodepartcode; + + @ApiModelProperty(value = "执行科室名称") + private String dodepartname; + + @ApiModelProperty(value = "单据类别") + private String billtype; + + @ApiModelProperty(value = "单据名称") + private String billname; + + @ApiModelProperty(value = "单据描述") + private String billdes; + + @ApiModelProperty(value = "开单时间") + private String billtime; + + @ApiModelProperty(value = "项目总金额") + private String billmoney; + + @ApiModelProperty(value = "医生代码") + private String doctorcode; + + @ApiModelProperty(value = "医生名称") + private String doctorname; + + @ApiModelProperty(value = "自费金额") + private String sincemoney; + + @ApiModelProperty(value = "公费金额") + private String fairmoney; + + @ApiModelProperty(value = "开单流水") + private String serialno; + + @ApiModelProperty(value = "申请单号") + private String appointno; + + @ApiModelProperty(value = "就诊流水号") + private String serialflowno; + + @ApiModelProperty(value = "就诊类别") + private String jzlb; + + @ApiModelProperty(value = "病种类别代码") + private String bzdm; + + @ApiModelProperty(value = "更新时间") + private String updatedate; + + @ApiModelProperty(value = "账单信息") + private String billsmsg; + + @ApiModelProperty(value = "支付签名") + private String paynature; + + @ApiModelProperty(value = "支付类别") + private String paytype; + + @ApiModelProperty(value = "支付ID") + private String powertranid; + + @ApiModelProperty(value = "支付卡号") + private String powertrancard; + + @ApiModelProperty(value = "终端ID") + private String terminalid; + + @ApiModelProperty(value = "参考号") + private String referno; + + @ApiModelProperty(value = "支付金额") + private String zfamount; + + @ApiModelProperty(value = "医保金额") + private String ybzhamount; + + @ApiModelProperty(value = "医保余额") + private String ybtcamount; + + @ApiModelProperty(value = "医保信息") + private String yboutmsg; + + @ApiModelProperty(value = "his参考号") + private String hisopernum; + + @ApiModelProperty(value = "工行ID") + private String icbcorderid; + + @ApiModelProperty(value = "工行支付时间") + private String icbcpaytime; + + @ApiModelProperty(value = "标志") + private String appFlag; + + @ApiModelProperty(value = "开单状态") + private Integer appStatus; + + @ApiModelProperty(value = "提交时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date ctime; + + @ApiModelProperty(value = "修改时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date utime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfCreateReqVO.java new file mode 100644 index 0000000..f37c2ed --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.mzjf.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 门诊缴费创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MzjfCreateReqVO extends MzjfBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfExcelVO.java new file mode 100644 index 0000000..f2aa41a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfExcelVO.java @@ -0,0 +1,164 @@ +package com.jojubanking.boot.module.system.controller.admin.mzjf.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 门诊缴费 Excel VO + * + * @author admin + */ +@Data +public class MzjfExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("用户ID") + private Integer userId; + + @ExcelProperty("就诊卡id") + private Integer cardId; + + @ExcelProperty("ID") + private String patientid; + + @ExcelProperty("证件类型") + private String idtype; + + @ExcelProperty("操作类型") + private Integer locktype; + + @ExcelProperty("检查项目名称") + private String creatitemname; + + @ExcelProperty("预约时间") + private String appointmenttime; + + @ExcelProperty("创建时间") + private String creatdate; + + @ExcelProperty("查询方式") + private Integer querytype; + + @ExcelProperty("订单ID") + private String orderno; + + @ExcelProperty("单据ID") + private String flowno; + + @ExcelProperty("开单科室编号") + private String setdepartcode; + + @ExcelProperty("开单科室名称") + private String setdepartname; + + @ExcelProperty("执行科室编号") + private String dodepartcode; + + @ExcelProperty("执行科室名称") + private String dodepartname; + + @ExcelProperty("单据类别") + private String billtype; + + @ExcelProperty("单据名称") + private String billname; + + @ExcelProperty("单据描述") + private String billdes; + + @ExcelProperty("开单时间") + private String billtime; + + @ExcelProperty("项目总金额") + private String billmoney; + + @ExcelProperty("医生代码") + private String doctorcode; + + @ExcelProperty("医生名称") + private String doctorname; + + @ExcelProperty("自费金额") + private String sincemoney; + + @ExcelProperty("公费金额") + private String fairmoney; + + @ExcelProperty("开单流水") + private String serialno; + + @ExcelProperty("申请单号") + private String appointno; + + @ExcelProperty("就诊流水号") + private String serialflowno; + + @ExcelProperty("就诊类别") + private String jzlb; + + @ExcelProperty("病种类别代码") + private String bzdm; + + @ExcelProperty("更新时间") + private String updatedate; + + @ExcelProperty("账单信息") + private String billsmsg; + + @ExcelProperty("支付签名") + private String paynature; + + @ExcelProperty("支付类别") + private String paytype; + + @ExcelProperty("支付ID") + private String powertranid; + + @ExcelProperty("支付卡号") + private String powertrancard; + + @ExcelProperty("终端ID") + private String terminalid; + + @ExcelProperty("参考号") + private String referno; + + @ExcelProperty("支付金额") + private String zfamount; + + @ExcelProperty("医保金额") + private String ybzhamount; + + @ExcelProperty("医保余额") + private String ybtcamount; + + @ExcelProperty("医保信息") + private String yboutmsg; + + @ExcelProperty("his参考号") + private String hisopernum; + + @ExcelProperty("工行ID") + private String icbcorderid; + + @ExcelProperty("工行支付时间") + private String icbcpaytime; + + @ExcelProperty("标志") + private String appFlag; + + @ExcelProperty("开单状态") + private Integer appStatus; + + @ExcelProperty("提交时间") + private Date ctime; + + @ExcelProperty("修改时间") + private Date utime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfExportReqVO.java new file mode 100644 index 0000000..5819712 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfExportReqVO.java @@ -0,0 +1,166 @@ +package com.jojubanking.boot.module.system.controller.admin.mzjf.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 门诊缴费 Excel 导出 Request VO", description = "参数和 MzjfPageReqVO 是一致的") +@Data +public class MzjfExportReqVO { + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "就诊卡id") + private Integer cardId; + + @ApiModelProperty(value = "ID") + private String patientid; + + @ApiModelProperty(value = "证件类型") + private String idtype; + + @ApiModelProperty(value = "操作类型") + private Integer locktype; + + @ApiModelProperty(value = "检查项目名称") + private String creatitemname; + + @ApiModelProperty(value = "预约时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] appointmenttime; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] creatdate; + + @ApiModelProperty(value = "查询方式") + private Integer querytype; + + @ApiModelProperty(value = "订单ID") + private String orderno; + + @ApiModelProperty(value = "单据ID") + private String flowno; + + @ApiModelProperty(value = "开单科室编号") + private String setdepartcode; + + @ApiModelProperty(value = "开单科室名称") + private String setdepartname; + + @ApiModelProperty(value = "执行科室编号") + private String dodepartcode; + + @ApiModelProperty(value = "执行科室名称") + private String dodepartname; + + @ApiModelProperty(value = "单据类别") + private String billtype; + + @ApiModelProperty(value = "单据名称") + private String billname; + + @ApiModelProperty(value = "单据描述") + private String billdes; + + @ApiModelProperty(value = "开单时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] billtime; + + @ApiModelProperty(value = "项目总金额") + private String billmoney; + + @ApiModelProperty(value = "医生代码") + private String doctorcode; + + @ApiModelProperty(value = "医生名称") + private String doctorname; + + @ApiModelProperty(value = "自费金额") + private String sincemoney; + + @ApiModelProperty(value = "公费金额") + private String fairmoney; + + @ApiModelProperty(value = "开单流水") + private String serialno; + + @ApiModelProperty(value = "申请单号") + private String appointno; + + @ApiModelProperty(value = "就诊流水号") + private String serialflowno; + + @ApiModelProperty(value = "就诊类别") + private String jzlb; + + @ApiModelProperty(value = "病种类别代码") + private String bzdm; + + @ApiModelProperty(value = "更新时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] updatedate; + + @ApiModelProperty(value = "账单信息") + private String billsmsg; + + @ApiModelProperty(value = "支付签名") + private String paynature; + + @ApiModelProperty(value = "支付类别") + private String paytype; + + @ApiModelProperty(value = "支付ID") + private String powertranid; + + @ApiModelProperty(value = "支付卡号") + private String powertrancard; + + @ApiModelProperty(value = "终端ID") + private String terminalid; + + @ApiModelProperty(value = "参考号") + private String referno; + + @ApiModelProperty(value = "支付金额") + private String zfamount; + + @ApiModelProperty(value = "医保金额") + private String ybzhamount; + + @ApiModelProperty(value = "医保余额") + private String ybtcamount; + + @ApiModelProperty(value = "医保信息") + private String yboutmsg; + + @ApiModelProperty(value = "his参考号") + private String hisopernum; + + @ApiModelProperty(value = "工行ID") + private String icbcorderid; + + @ApiModelProperty(value = "工行支付时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] icbcpaytime; + + @ApiModelProperty(value = "标志") + private String appFlag; + + @ApiModelProperty(value = "开单状态") + private Integer appStatus; + + @ApiModelProperty(value = "提交时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] ctime; + + @ApiModelProperty(value = "修改时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] utime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfPageReqVO.java new file mode 100644 index 0000000..59a6538 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfPageReqVO.java @@ -0,0 +1,171 @@ +package com.jojubanking.boot.module.system.controller.admin.mzjf.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 门诊缴费分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MzjfPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "就诊卡id") + private Integer cardId; + + @ApiModelProperty(value = "ID") + private String patientid; + + @ApiModelProperty(value = "证件类型") + private String idtype; + + @ApiModelProperty(value = "操作类型") + private Integer locktype; + + @ApiModelProperty(value = "检查项目名称") + private String creatitemname; + + @ApiModelProperty(value = "预约时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] appointmenttime; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] creatdate; + + @ApiModelProperty(value = "查询方式") + private Integer querytype; + + @ApiModelProperty(value = "订单ID") + private String orderno; + + @ApiModelProperty(value = "单据ID") + private String flowno; + + @ApiModelProperty(value = "开单科室编号") + private String setdepartcode; + + @ApiModelProperty(value = "开单科室名称") + private String setdepartname; + + @ApiModelProperty(value = "执行科室编号") + private String dodepartcode; + + @ApiModelProperty(value = "执行科室名称") + private String dodepartname; + + @ApiModelProperty(value = "单据类别") + private String billtype; + + @ApiModelProperty(value = "单据名称") + private String billname; + + @ApiModelProperty(value = "单据描述") + private String billdes; + + @ApiModelProperty(value = "开单时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] billtime; + + @ApiModelProperty(value = "项目总金额") + private String billmoney; + + @ApiModelProperty(value = "医生代码") + private String doctorcode; + + @ApiModelProperty(value = "医生名称") + private String doctorname; + + @ApiModelProperty(value = "自费金额") + private String sincemoney; + + @ApiModelProperty(value = "公费金额") + private String fairmoney; + + @ApiModelProperty(value = "开单流水") + private String serialno; + + @ApiModelProperty(value = "申请单号") + private String appointno; + + @ApiModelProperty(value = "就诊流水号") + private String serialflowno; + + @ApiModelProperty(value = "就诊类别") + private String jzlb; + + @ApiModelProperty(value = "病种类别代码") + private String bzdm; + + @ApiModelProperty(value = "更新时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] updatedate; + + @ApiModelProperty(value = "账单信息") + private String billsmsg; + + @ApiModelProperty(value = "支付签名") + private String paynature; + + @ApiModelProperty(value = "支付类别") + private String paytype; + + @ApiModelProperty(value = "支付ID") + private String powertranid; + + @ApiModelProperty(value = "支付卡号") + private String powertrancard; + + @ApiModelProperty(value = "终端ID") + private String terminalid; + + @ApiModelProperty(value = "参考号") + private String referno; + + @ApiModelProperty(value = "支付金额") + private String zfamount; + + @ApiModelProperty(value = "医保金额") + private String ybzhamount; + + @ApiModelProperty(value = "医保余额") + private String ybtcamount; + + @ApiModelProperty(value = "医保信息") + private String yboutmsg; + + @ApiModelProperty(value = "his参考号") + private String hisopernum; + + @ApiModelProperty(value = "工行ID") + private String icbcorderid; + + @ApiModelProperty(value = "工行支付时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] icbcpaytime; + + @ApiModelProperty(value = "标志") + private String appFlag; + + @ApiModelProperty(value = "开单状态") + private Integer appStatus; + + @ApiModelProperty(value = "提交时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] ctime; + + @ApiModelProperty(value = "修改时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] utime; + + private String startDate; + private String endDate; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfRespVO.java new file mode 100644 index 0000000..e8c8dd1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfRespVO.java @@ -0,0 +1,16 @@ +package com.jojubanking.boot.module.system.controller.admin.mzjf.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 门诊缴费 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MzjfRespVO extends MzjfBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfUpdateReqVO.java new file mode 100644 index 0000000..6568895 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.mzjf.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 门诊缴费更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MzjfUpdateReqVO extends MzjfBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/NoticeController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/NoticeController.java new file mode 100644 index 0000000..a8706c9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/NoticeController.java @@ -0,0 +1,72 @@ +package com.jojubanking.boot.module.system.controller.admin.notice; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeRespVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; +import com.jojubanking.boot.module.system.convert.notice.NoticeConvert; +import com.jojubanking.boot.module.system.service.notice.NoticeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - 通知公告") +@RestController +@RequestMapping("/system/notice") +@Validated +public class NoticeController { + + @Resource + private NoticeService noticeService; + + @PostMapping("/create") + @ApiOperation("创建通知公告") + @PreAuthorize("@ss.hasPermission('system:notice:create')") + public CommonResult createNotice(@Valid @RequestBody NoticeCreateReqVO reqVO) { + Long noticeId = noticeService.createNotice(reqVO); + return success(noticeId); + } + + @PutMapping("/update") + @ApiOperation("修改通知公告") + @PreAuthorize("@ss.hasPermission('system:notice:update')") + public CommonResult updateNotice(@Valid @RequestBody NoticeUpdateReqVO reqVO) { + noticeService.updateNotice(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除通知公告") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:notice:delete')") + public CommonResult deleteNotice(@RequestParam("id") Long id) { + noticeService.deleteNotice(id); + return success(true); + } + + @GetMapping("/page") + @ApiOperation("获取通知公告列表") + @PreAuthorize("@ss.hasPermission('system:notice:query')") + public CommonResult> pageNotices(@Validated NoticePageReqVO reqVO) { + return success(NoticeConvert.INSTANCE.convertPage(noticeService.pageNotices(reqVO))); + } + + @GetMapping("/get") + @ApiOperation("获得通知公告") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:notice:query')") + public CommonResult getNotice(@RequestParam("id") Long id) { + return success(NoticeConvert.INSTANCE.convert(noticeService.getNotice(id))); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeBaseVO.java new file mode 100644 index 0000000..8888f96 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeBaseVO.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.controller.admin.notice.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 通知公告 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class NoticeBaseVO { + + @ApiModelProperty(value = "公告标题", required = true, example = "小博主") + @NotBlank(message = "公告标题不能为空") + @Size(max = 50, message = "公告标题不能超过50个字符") + private String title; + + @ApiModelProperty(value = "公告类型", required = true, example = "小博主") + @NotNull(message = "公告类型不能为空") + private Integer type; + + @ApiModelProperty(value = "公告内容", required = true, example = "半生编码") + private String content; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeCreateReqVO.java new file mode 100644 index 0000000..8c39352 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeCreateReqVO.java @@ -0,0 +1,11 @@ +package com.jojubanking.boot.module.system.controller.admin.notice.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("管理后台 - 通知公告创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticeCreateReqVO extends NoticeBaseVO { +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticePageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticePageReqVO.java new file mode 100644 index 0000000..581bba0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticePageReqVO.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.system.controller.admin.notice.vo; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("管理后台 - 通知公告分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticePageReqVO extends PageParam { + + @ApiModelProperty(value = "通知公告名称", example = "芋道", notes = "模糊匹配") + private String title; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeRespVO.java new file mode 100644 index 0000000..2976156 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeRespVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.notice.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@ApiModel("管理后台 - 通知公告信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticeRespVO extends NoticeBaseVO { + + @ApiModelProperty(value = "通知公告序号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeUpdateReqVO.java new file mode 100644 index 0000000..4606592 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeUpdateReqVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.notice.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 岗位公告更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticeUpdateReqVO extends NoticeBaseVO { + + @ApiModelProperty(value = "岗位公告编号", required = true, example = "1024") + @NotNull(message = "岗位公告编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2ClientController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2ClientController.http new file mode 100644 index 0000000..3edfe2f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2ClientController.http @@ -0,0 +1,23 @@ +### 请求 /login 接口 => 成功 +POST {{baseUrl}}/system/oauth2-client/create +Content-Type: application/json +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +{ + "id": "1", + "secret": "admin123", + "name": "TW", + "logo": "https://www.iocoder.cn/images/favicon.ico", + "description": "我是描述", + "status": 0, + "accessTokenValiditySeconds": 180, + "refreshTokenValiditySeconds": 8640, + "redirectUris": ["https://www.iocoder.cn"], + "autoApprove": true, + "authorizedGrantTypes": ["password"], + "scopes": ["user_info"], + "authorities": ["system:user:query"], + "resource_ids": ["1024"], + "additionalInformation": "{}" +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2ClientController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2ClientController.java new file mode 100644 index 0000000..feb688e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2ClientController.java @@ -0,0 +1,74 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientUpdateReqVO; +import com.jojubanking.boot.module.system.convert.auth.OAuth2ClientConvert; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2ClientService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - OAuth2 客户端") +@RestController +@RequestMapping("/system/oauth2-client") +@Validated +public class OAuth2ClientController { + + @Resource + private OAuth2ClientService oAuth2ClientService; + + @PostMapping("/create") + @ApiOperation("创建 OAuth2 客户端") + @PreAuthorize("@ss.hasPermission('system:oauth2-client:create')") + public CommonResult createOAuth2Client(@Valid @RequestBody OAuth2ClientCreateReqVO createReqVO) { + return success(oAuth2ClientService.createOAuth2Client(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新 OAuth2 客户端") + @PreAuthorize("@ss.hasPermission('system:oauth2-client:update')") + public CommonResult updateOAuth2Client(@Valid @RequestBody OAuth2ClientUpdateReqVO updateReqVO) { + oAuth2ClientService.updateOAuth2Client(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除 OAuth2 客户端") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:oauth2-client:delete')") + public CommonResult deleteOAuth2Client(@RequestParam("id") Long id) { + oAuth2ClientService.deleteOAuth2Client(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得 OAuth2 客户端") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:oauth2-client:query')") + public CommonResult getOAuth2Client(@RequestParam("id") Long id) { + OAuth2ClientDO oAuth2Client = oAuth2ClientService.getOAuth2Client(id); + return success(OAuth2ClientConvert.INSTANCE.convert(oAuth2Client)); + } + + @GetMapping("/page") + @ApiOperation("获得OAuth2 客户端分页") + @PreAuthorize("@ss.hasPermission('system:oauth2-client:query')") + public CommonResult> getOAuth2ClientPage(@Valid OAuth2ClientPageReqVO pageVO) { + PageResult pageResult = oAuth2ClientService.getOAuth2ClientPage(pageVO); + return success(OAuth2ClientConvert.INSTANCE.convertPage(pageResult)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenController.http new file mode 100644 index 0000000..725a5d4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenController.http @@ -0,0 +1,54 @@ +### 请求 /system/oauth2/authorize 接口 => 成功 +GET {{baseUrl}}/system/oauth2/authorize?clientId=default +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### 请求 /system/oauth2/authorize + token 接口 => 成功 +POST {{baseUrl}}/system/oauth2/authorize +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +response_type=token&client_id=default&scope={"user.read": true}&redirect_uri=https://www.iocoder.cn&auto_approve=true + +### 请求 /system/oauth2/authorize + code 接口 => 成功 +POST {{baseUrl}}/system/oauth2/authorize +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +response_type=code&client_id=default&scope={"user.read": true}&redirect_uri=https://www.iocoder.cn&auto_approve=false + +### 请求 /system/oauth2/token + code 接口 => 成功 +POST {{baseUrl}}/system/oauth2/token +Content-Type: application/x-www-form-urlencoded +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} + +grant_type=authorization_code&redirect_uri=https://www.iocoder.cn&code=189956c07a174588a97157eabef2f93a + +### 请求 /system/oauth2/token + password 接口 => 成功 +POST {{baseUrl}}/system/oauth2/token +Content-Type: application/x-www-form-urlencoded +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} + +grant_type=password&username=admin&password=admin123&scope=user.read + +### 请求 /system/oauth2/token + refresh_token 接口 => 成功 +POST {{baseUrl}}/system/oauth2/token +Content-Type: application/x-www-form-urlencoded +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} + +grant_type=refresh_token&refresh_token=00895465d6994f72a9d926ceeed0f588 + +### 请求 /system/oauth2/token + DELETE 接口 => 成功 +DELETE {{baseUrl}}/system/oauth2/token?token=ca8a188f464441d6949c51493a2b7596 +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} + +### 请求 /system/oauth2/check-token 接口 => 成功 +POST {{baseUrl}}/system/oauth2/check-token?token=620d307c5b4148df8a98dd6c6c547106 +Authorization: Basic ZGVmYXVsdDphZG1pbjEyMw== +tenant-id: {{adminTenentId}} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenController.java new file mode 100644 index 0000000..35f85ce --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenController.java @@ -0,0 +1,302 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.http.HttpUtils; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAccessTokenRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAuthorizeInfoRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open.OAuth2OpenCheckTokenRespVO; +import com.jojubanking.boot.module.system.convert.oauth2.OAuth2OpenConvert; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.jojubanking.boot.module.system.enums.oauth2.OAuth2GrantTypeEnum; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2ApproveService; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2ClientService; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2GrantService; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2TokenService; +import com.jojubanking.boot.module.system.util.oauth2.OAuth2Utils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletRequest; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertList; +import static com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 提供给外部应用调用为主 + * + * 一般来说,管理后台的 /system-api/* 是不直接提供给外部应用使用,主要是外部应用能够访问的数据与接口是有限的,而管理后台的 RBAC 无法很好的控制。 + * 参考大量的开放平台,都是独立的一套 OpenAPI,对应到【本系统】就是在 Controller 下新建 open 包,实现 /open-api/* 接口,然后通过 scope 进行控制。 + * 另外,一个公司如果有多个管理后台,它们 client_id 产生的 access token 相互之间是无法互通的,即无法访问它们系统的 API 接口,直到两个 client_id 产生信任授权。 + * + * 考虑到【本系统】暂时不想做的过于复杂,默认只有获取到 access token 之后,可以访问【本系统】管理后台的 /system-api/* 所有接口,除非手动添加 scope 控制。 + * scope 的使用示例,可见 {@link OAuth2UserController} 类 + * + * @author TW + */ +@Api(tags = "管理后台 - OAuth2.0 授权") +@RestController +@RequestMapping("/system/oauth2") +@Validated +@Slf4j +public class OAuth2OpenController { + + @Resource + private OAuth2GrantService oauth2GrantService; + @Resource + private OAuth2ClientService oauth2ClientService; + @Resource + private OAuth2ApproveService oauth2ApproveService; + @Resource + private OAuth2TokenService oauth2TokenService; + + /** + * 对应 Spring Security OAuth 的 TokenEndpoint 类的 postAccessToken 方法 + * + * 授权码 authorization_code 模式时:code + redirectUri + state 参数 + * 密码 password 模式时:username + password + scope 参数 + * 刷新 refresh_token 模式时:refreshToken 参数 + * 客户端 client_credentials 模式:scope 参数 + * 简化 implicit 模式时:不支持 + * + * 注意,默认需要传递 client_id + client_secret 参数 + */ + @PostMapping("/token") + @PermitAll + @ApiOperation(value = "获得访问令牌", notes = "适合 code 授权码模式,或者 implicit 简化模式;在 sso.vue 单点登录界面被【获取】调用") + @ApiImplicitParams({ + @ApiImplicitParam(name = "grant_type", required = true, value = "授权类型", example = "code", dataTypeClass = String.class), + @ApiImplicitParam(name = "code", value = "授权范围", example = "userinfo.read", dataTypeClass = String.class), + @ApiImplicitParam(name = "redirect_uri", value = "重定向 URI", example = "https://www.iocoder.cn", dataTypeClass = String.class), + @ApiImplicitParam(name = "state", value = "状态", example = "1", dataTypeClass = String.class), + @ApiImplicitParam(name = "username", example = "tudou", dataTypeClass = String.class), + @ApiImplicitParam(name = "password", example = "cai", dataTypeClass = String.class), // 多个使用空格分隔 + @ApiImplicitParam(name = "scope", example = "user_info", dataTypeClass = String.class), + @ApiImplicitParam(name = "refresh_token", example = "123424233", dataTypeClass = String.class), + }) + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult postAccessToken(HttpServletRequest request, + @RequestParam("grant_type") String grantType, + @RequestParam(value = "code", required = false) String code, // 授权码模式 + @RequestParam(value = "redirect_uri", required = false) String redirectUri, // 授权码模式 + @RequestParam(value = "state", required = false) String state, // 授权码模式 + @RequestParam(value = "username", required = false) String username, // 密码模式 + @RequestParam(value = "password", required = false) String password, // 密码模式 + @RequestParam(value = "scope", required = false) String scope, // 密码模式 + @RequestParam(value = "refresh_token", required = false) String refreshToken) { // 刷新模式 + List scopes = OAuth2Utils.buildScopes(scope); + // 授权类型 + OAuth2GrantTypeEnum grantTypeEnum = OAuth2GrantTypeEnum.getByGranType(grantType); + if (grantTypeEnum == null) { + throw exception0(BAD_REQUEST.getCode(), StrUtil.format("未知授权类型({})", grantType)); + } + if (grantTypeEnum == OAuth2GrantTypeEnum.IMPLICIT) { + throw exception0(BAD_REQUEST.getCode(), "Token 接口不支持 implicit 授权模式"); + } + + // 校验客户端 + String[] clientIdAndSecret = obtainBasicAuthorization(request); + OAuth2ClientDO client = oauth2ClientService.validOAuthClientFromCache(clientIdAndSecret[0], clientIdAndSecret[1], + grantType, scopes, redirectUri); + + // 根据授权模式,获取访问令牌 + OAuth2AccessTokenDO accessTokenDO; + switch (grantTypeEnum) { + case AUTHORIZATION_CODE: + accessTokenDO = oauth2GrantService.grantAuthorizationCodeForAccessToken(client.getClientId(), code, redirectUri, state); + break; + case PASSWORD: + accessTokenDO = oauth2GrantService.grantPassword(username, password, client.getClientId(), scopes); + break; + case CLIENT_CREDENTIALS: + accessTokenDO = oauth2GrantService.grantClientCredentials(client.getClientId(), scopes); + break; + case REFRESH_TOKEN: + accessTokenDO = oauth2GrantService.grantRefreshToken(refreshToken, client.getClientId()); + break; + default: + throw new IllegalArgumentException("未知授权类型:" + grantType); + } + Assert.notNull(accessTokenDO, "访问令牌不能为空"); // 防御性检查 + return success(OAuth2OpenConvert.INSTANCE.convert(accessTokenDO)); + } + + @DeleteMapping("/token") + @PermitAll + @ApiOperation(value = "删除访问令牌") + @ApiImplicitParam(name = "token", required = true, value = "访问令牌", example = "biu", dataTypeClass = String.class) + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult revokeToken(HttpServletRequest request, + @RequestParam("token") String token) { + // 校验客户端 + String[] clientIdAndSecret = obtainBasicAuthorization(request); + OAuth2ClientDO client = oauth2ClientService.validOAuthClientFromCache(clientIdAndSecret[0], clientIdAndSecret[1], + null, null, null); + + // 删除访问令牌 + return success(oauth2GrantService.revokeToken(client.getClientId(), token)); + } + + /** + * 对应 Spring Security OAuth 的 CheckTokenEndpoint 类的 checkToken 方法 + */ + @PostMapping("/check-token") + @PermitAll + @ApiOperation(value = "校验访问令牌") + @ApiImplicitParam(name = "token", required = true, value = "访问令牌", example = "biu", dataTypeClass = String.class) + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult checkToken(HttpServletRequest request, + @RequestParam("token") String token) { + // 校验客户端 + String[] clientIdAndSecret = obtainBasicAuthorization(request); + oauth2ClientService.validOAuthClientFromCache(clientIdAndSecret[0], clientIdAndSecret[1], + null, null, null); + + // 校验令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.checkAccessToken(token); + Assert.notNull(accessTokenDO, "访问令牌不能为空"); // 防御性检查 + return success(OAuth2OpenConvert.INSTANCE.convert2(accessTokenDO)); + } + + /** + * 对应 Spring Security OAuth 的 AuthorizationEndpoint 类的 authorize 方法 + */ + @GetMapping("/authorize") + @ApiOperation(value = "获得授权信息", notes = "适合 code 授权码模式,或者 implicit 简化模式;在 sso.vue 单点登录界面被【获取】调用") + @ApiImplicitParam(name = "clientId", required = true, value = "客户端编号", example = "tudou", dataTypeClass = String.class) + public CommonResult authorize(@RequestParam("clientId") String clientId) { + // 0. 校验用户已经登录。通过 Spring Security 实现 + + // 1. 获得 Client 客户端的信息 + OAuth2ClientDO client = oauth2ClientService.validOAuthClientFromCache(clientId); + // 2. 获得用户已经授权的信息 + List approves = oauth2ApproveService.getApproveList(getLoginUserId(), getUserType(), clientId); + // 拼接返回 + return success(OAuth2OpenConvert.INSTANCE.convert(client, approves)); + } + + /** + * 对应 Spring Security OAuth 的 AuthorizationEndpoint 类的 approveOrDeny 方法 + * + * 场景一:【自动授权 autoApprove = true】 + * 刚进入 sso.vue 界面,调用该接口,用户历史已经给该应用做过对应的授权,或者 OAuth2Client 支持该 scope 的自动授权 + * 场景二:【手动授权 autoApprove = false】 + * 在 sso.vue 界面,用户选择好 scope 授权范围,调用该接口,进行授权。此时,approved 为 true 或者 false + * + * 因为前后端分离,Axios 无法很好的处理 302 重定向,所以和 Spring Security OAuth 略有不同,返回结果是重定向的 URL,剩余交给前端处理 + */ + @PostMapping("/authorize") + @ApiOperation(value = "申请授权", notes = "适合 code 授权码模式,或者 implicit 简化模式;在 sso.vue 单点登录界面被【提交】调用") + @ApiImplicitParams({ + @ApiImplicitParam(name = "response_type", required = true, value = "响应类型", example = "code", dataTypeClass = String.class), + @ApiImplicitParam(name = "client_id", required = true, value = "客户端编号", example = "tudou", dataTypeClass = String.class), + @ApiImplicitParam(name = "scope", value = "授权范围", example = "userinfo.read", dataTypeClass = String.class), // 使用 Map 格式,Spring MVC 暂时不支持这么接收参数 + @ApiImplicitParam(name = "redirect_uri", required = true, value = "重定向 URI", example = "https://www.iocoder.cn", dataTypeClass = String.class), + @ApiImplicitParam(name = "auto_approve", required = true, value = "用户是否接受", example = "true", dataTypeClass = Boolean.class), + @ApiImplicitParam(name = "state", example = "1", dataTypeClass = String.class) + }) + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult approveOrDeny(@RequestParam("response_type") String responseType, + @RequestParam("client_id") String clientId, + @RequestParam(value = "scope", required = false) String scope, + @RequestParam("redirect_uri") String redirectUri, + @RequestParam(value = "auto_approve") Boolean autoApprove, + @RequestParam(value = "state", required = false) String state) { + @SuppressWarnings("unchecked") + Map scopes = JsonUtils.parseObject(scope, Map.class); + scopes = ObjectUtil.defaultIfNull(scopes, Collections.emptyMap()); + // 0. 校验用户已经登录。通过 Spring Security 实现 + + // 1.1 校验 responseType 是否满足 code 或者 token 值 + OAuth2GrantTypeEnum grantTypeEnum = getGrantTypeEnum(responseType); + // 1.2 校验 redirectUri 重定向域名是否合法 + 校验 scope 是否在 Client 授权范围内 + OAuth2ClientDO client = oauth2ClientService.validOAuthClientFromCache(clientId, null, + grantTypeEnum.getGrantType(), scopes.keySet(), redirectUri); + + // 2.1 假设 approved 为 null,说明是场景一 + if (Boolean.TRUE.equals(autoApprove)) { + // 如果无法自动授权通过,则返回空 url,前端不进行跳转 + if (!oauth2ApproveService.checkForPreApproval(getLoginUserId(), getUserType(), clientId, scopes.keySet())) { + return success(null); + } + } else { // 2.2 假设 approved 非 null,说明是场景二 + // 如果计算后不通过,则跳转一个错误链接 + if (!oauth2ApproveService.updateAfterApproval(getLoginUserId(), getUserType(), clientId, scopes)) { + return success(OAuth2Utils.buildUnsuccessfulRedirect(redirectUri, responseType, state, + "access_denied", "User denied access")); + } + } + + // 3.1 如果是 code 授权码模式,则发放 code 授权码,并重定向 + List approveScopes = convertList(scopes.entrySet(), Map.Entry::getKey, Map.Entry::getValue); + if (grantTypeEnum == OAuth2GrantTypeEnum.AUTHORIZATION_CODE) { + return success(getAuthorizationCodeRedirect(getLoginUserId(), client, approveScopes, redirectUri, state)); + } + // 3.2 如果是 token 则是 implicit 简化模式,则发送 accessToken 访问令牌,并重定向 + return success(getImplicitGrantRedirect(getLoginUserId(), client, approveScopes, redirectUri, state)); + } + + private static OAuth2GrantTypeEnum getGrantTypeEnum(String responseType) { + if (StrUtil.equals(responseType, "code")) { + return OAuth2GrantTypeEnum.AUTHORIZATION_CODE; + } + if (StrUtil.equalsAny(responseType, "token")) { + return OAuth2GrantTypeEnum.IMPLICIT; + } + throw exception0(BAD_REQUEST.getCode(), "response_type 参数值只允许 code 和 token"); + } + + private String getImplicitGrantRedirect(Long userId, OAuth2ClientDO client, + List scopes, String redirectUri, String state) { + // 1. 创建 access token 访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2GrantService.grantImplicit(userId, getUserType(), client.getClientId(), scopes); + Assert.notNull(accessTokenDO, "访问令牌不能为空"); // 防御性检查 + // 2. 拼接重定向的 URL + // noinspection unchecked + return OAuth2Utils.buildImplicitRedirectUri(redirectUri, accessTokenDO.getAccessToken(), state, accessTokenDO.getExpiresTime(), + scopes, JsonUtils.parseObject(client.getAdditionalInformation(), Map.class)); + } + + private String getAuthorizationCodeRedirect(Long userId, OAuth2ClientDO client, + List scopes, String redirectUri, String state) { + // 1. 创建 code 授权码 + String authorizationCode = oauth2GrantService.grantAuthorizationCodeForCode(userId, getUserType(), client.getClientId(), scopes, + redirectUri, state); + // 2. 拼接重定向的 URL + return OAuth2Utils.buildAuthorizationCodeRedirectUri(redirectUri, authorizationCode, state); + } + + private Integer getUserType() { + return UserTypeEnum.ADMIN.getValue(); + } + + private String[] obtainBasicAuthorization(HttpServletRequest request) { + String[] clientIdAndSecret = HttpUtils.obtainBasicAuthorization(request); + if (ArrayUtil.isEmpty(clientIdAndSecret) || clientIdAndSecret.length != 2) { + throw exception0(BAD_REQUEST.getCode(), "client_id 或 client_secret 未正确传递"); + } + return clientIdAndSecret; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2TokenController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2TokenController.java new file mode 100644 index 0000000..7c75a1b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2TokenController.java @@ -0,0 +1,50 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenRespVO; +import com.jojubanking.boot.module.system.convert.auth.OAuth2TokenConvert; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.enums.logger.LoginLogTypeEnum; +import com.jojubanking.boot.module.system.service.auth.AdminAuthService; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2TokenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - OAuth2.0 令牌") +@RestController +@RequestMapping("/system/oauth2-token") +public class OAuth2TokenController { + + @Resource + private OAuth2TokenService oauth2TokenService; + @Resource + private AdminAuthService authService; + + @GetMapping("/page") + @ApiOperation(value = "获得访问令牌分页", notes = "只返回有效期内的") + @PreAuthorize("@ss.hasPermission('system:oauth2-token:page')") + public CommonResult> getAccessTokenPage(@Valid OAuth2AccessTokenPageReqVO reqVO) { + PageResult pageResult = oauth2TokenService.getAccessTokenPage(reqVO); + return success(OAuth2TokenConvert.INSTANCE.convert(pageResult)); + } + + @DeleteMapping("/delete") + @ApiOperation("删除访问令牌") + @ApiImplicitParam(name = "accessToken", value = "访问令牌", required = true, dataTypeClass = String.class, example = "tudou") + @PreAuthorize("@ss.hasPermission('system:oauth2-token:delete')") + public CommonResult deleteAccessToken(@RequestParam("accessToken") String accessToken) { + authService.logout(accessToken, LoginLogTypeEnum.LOGOUT_DELETE.getType()); + return success(true); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2UserController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2UserController.http new file mode 100644 index 0000000..b18ff41 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2UserController.http @@ -0,0 +1,14 @@ +### 请求 /system/oauth2/user/get 接口 => 成功 +GET {{baseUrl}}/system/oauth2/user/get +Authorization: Bearer 47f9c74ec11041f193b777ebb95c3b0d +tenant-id: {{adminTenentId}} + +### 请求 /system/oauth2/user/update 接口 => 成功 +PUT {{baseUrl}}/system/oauth2/user/update +Content-Type: application/json +Authorization: Bearer 47f9c74ec11041f193b777ebb95c3b0d +tenant-id: {{adminTenentId}} + +{ + "nickname": "TW" +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2UserController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2UserController.java new file mode 100644 index 0000000..d3ad748 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2UserController.java @@ -0,0 +1,80 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.user.OAuth2UserInfoRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.user.OAuth2UserUpdateReqVO; +import com.jojubanking.boot.module.system.convert.oauth2.OAuth2UserConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.service.dept.DeptService; +import com.jojubanking.boot.module.system.service.dept.PostService; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 提供给外部应用调用为主 + * + * 1. 在 getUserInfo 方法上,添加 @PreAuthorize("@ss.hasScope('user.read')") 注解,声明需要满足 scope = user.read + * 2. 在 updateUserInfo 方法上,添加 @PreAuthorize("@ss.hasScope('user.write')") 注解,声明需要满足 scope = user.write + * + * @author TW + */ +@Api(tags = "管理后台 - OAuth2.0 用户") +@RestController +@RequestMapping("/system/oauth2/user") +@Validated +@Slf4j +public class OAuth2UserController { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + @Resource + private PostService postService; + + @GetMapping("/get") + @ApiOperation("获得用户基本信息") + @PreAuthorize("@ss.hasScope('user.read')") // + public CommonResult getUserInfo() { + // 获得用户基本信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + OAuth2UserInfoRespVO resp = OAuth2UserConvert.INSTANCE.convert(user); + // 获得部门信息 + if (user.getDeptId() != null) { + DeptDO dept = deptService.getDept(user.getDeptId()); + resp.setDept(OAuth2UserConvert.INSTANCE.convert(dept)); + } + // 获得岗位信息 + if (CollUtil.isNotEmpty(user.getPostIds())) { + List posts = postService.getPosts(user.getPostIds()); + resp.setPosts(OAuth2UserConvert.INSTANCE.convertList(posts)); + } + return success(resp); + } + + @PutMapping("/update") + @ApiOperation("更新用户基本信息") + @PreAuthorize("@ss.hasScope('user.write')") + public CommonResult updateUserInfo(@Valid @RequestBody OAuth2UserUpdateReqVO reqVO) { + // 这里将 UserProfileUpdateReqVO =》UserProfileUpdateReqVO 对象,实现接口的复用。 + // 主要是,AdminUserService 没有自己的 BO 对象,所以复用只能这么做 + userService.updateUserProfile(getLoginUserId(), OAuth2UserConvert.INSTANCE.convert(reqVO)); + return success(true); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientBaseVO.java new file mode 100644 index 0000000..9694d62 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientBaseVO.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** +* OAuth2 客户端 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class OAuth2ClientBaseVO { + + @ApiModelProperty(value = "客户端编号", required = true, example = "tudou") + @NotNull(message = "客户端编号不能为空") + private String clientId; + + @ApiModelProperty(value = "客户端密钥", required = true, example = "fan") + @NotNull(message = "客户端密钥不能为空") + private String secret; + + @ApiModelProperty(value = "应用名", required = true, example = "土豆") + @NotNull(message = "应用名不能为空") + private String name; + + @ApiModelProperty(value = "应用图标", required = true, example = "https://www.iocoder.cn/xx.png") + @NotNull(message = "应用图标不能为空") + @URL(message = "应用图标的地址不正确") + private String logo; + + @ApiModelProperty(value = "应用描述", example = "我是一个应用") + private String description; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") + private Integer status; + + @ApiModelProperty(value = "访问令牌的有效期", required = true, example = "8640") + @NotNull(message = "访问令牌的有效期不能为空") + private Integer accessTokenValiditySeconds; + + @ApiModelProperty(value = "刷新令牌的有效期", required = true, example = "8640000") + @NotNull(message = "刷新令牌的有效期不能为空") + private Integer refreshTokenValiditySeconds; + + @ApiModelProperty(value = "可重定向的 URI 地址", required = true, example = "https://www.iocoder.cn") + @NotNull(message = "可重定向的 URI 地址不能为空") + private List<@NotEmpty(message = "重定向的 URI 不能为空") + @URL(message = "重定向的 URI 格式不正确") String> redirectUris; + + @ApiModelProperty(value = "授权类型", required = true, example = "password", notes = "参见 OAuth2GrantTypeEnum 枚举") + @NotNull(message = "授权类型不能为空") + private List authorizedGrantTypes; + + @ApiModelProperty(value = "授权范围", example = "user_info") + private List scopes; + + @ApiModelProperty(value = "自动通过的授权范围", example = "user_info") + private List autoApproveScopes; + + @ApiModelProperty(value = "权限", example = "system:user:query") + private List authorities; + + @ApiModelProperty(value = "资源", example = "1024") + private List resourceIds; + + @ApiModelProperty(value = "附加信息", example = "{yunai: true}") + private String additionalInformation; + + @AssertTrue(message = "附加信息必须是 JSON 格式") + public boolean isAdditionalInformationJson() { + return StrUtil.isEmpty(additionalInformation) || JsonUtils.isJson(additionalInformation); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientCreateReqVO.java new file mode 100644 index 0000000..c83362b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientCreateReqVO.java @@ -0,0 +1,12 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client; + +import lombok.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - OAuth2 客户端创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OAuth2ClientCreateReqVO extends OAuth2ClientBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientPageReqVO.java new file mode 100644 index 0000000..45e068c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientPageReqVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client; + +import lombok.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; + +@ApiModel("管理后台 - OAuth2 客户端分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OAuth2ClientPageReqVO extends PageParam { + + @ApiModelProperty(value = "应用名", example = "土豆", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "状态", example = "1", notes = "参见 CommonStatusEnum 枚举") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientRespVO.java new file mode 100644 index 0000000..8b9c85e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientRespVO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - OAuth2 客户端 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OAuth2ClientRespVO extends OAuth2ClientBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientUpdateReqVO.java new file mode 100644 index 0000000..6152697 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientUpdateReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - OAuth2 客户端更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OAuth2ClientUpdateReqVO extends OAuth2ClientBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.java new file mode 100644 index 0000000..b6cc3fc --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("管理后台 - 【开放接口】访问令牌 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2OpenAccessTokenRespVO { + + @ApiModelProperty(value = "访问令牌", required = true, example = "tudou") + @JsonProperty("access_token") + private String accessToken; + + @ApiModelProperty(value = "刷新令牌", required = true, example = "nice") + @JsonProperty("refresh_token") + private String refreshToken; + + @ApiModelProperty(value = "令牌类型", required = true, example = "bearer") + @JsonProperty("token_type") + private String tokenType; + + @ApiModelProperty(value = "过期时间", required = true, example = "42430", notes = "单位:秒") + @JsonProperty("expires_in") + private Long expiresIn; + + @ApiModelProperty(value = "授权范围", example = "user_info", notes = "如果多个授权范围,使用空格分隔") + private String scope; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.java new file mode 100644 index 0000000..bb5cba6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open; + +import com.jojubanking.boot.framework.common.core.KeyValue; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@ApiModel("管理后台 - 授权页的信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2OpenAuthorizeInfoRespVO { + + /** + * 客户端 + */ + private Client client; + + @ApiModelProperty(value = "scope 的选中信息", required = true, notes = "使用 List 保证有序性,Key 是 scope,Value 为是否选中") + private List> scopes; + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Client { + + @ApiModelProperty(value = "应用名", required = true, example = "土豆") + private String name; + + @ApiModelProperty(value = "应用图标", required = true, example = "https://www.iocoder.cn/xx.png") + private String logo; + + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.java new file mode 100644 index 0000000..33d9a2f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@ApiModel("管理后台 - 【开放接口】校验令牌 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2OpenCheckTokenRespVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "666") + @JsonProperty("user_id") + private Long userId; + @ApiModelProperty(value = "用户类型", required = true, example = "2", notes = "参见 UserTypeEnum 枚举") + @JsonProperty("user_type") + private Integer userType; + @ApiModelProperty(value = "租户编号", required = true, example = "1024") + @JsonProperty("tenant_id") + private Long tenantId; + + @ApiModelProperty(value = "客户端编号", required = true, example = "car") + private String clientId; + @ApiModelProperty(value = "授权范围", required = true, example = "user_info") + private List scopes; + + @ApiModelProperty(value = "访问令牌", required = true, example = "tudou") + @JsonProperty("access_token") + private String accessToken; + + @ApiModelProperty(value = "过期时间", required = true, example = "1593092157", notes = "时间戳 / 1000,即单位:秒") + private Long exp; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenPageReqVO.java new file mode 100644 index 0000000..e9c94bc --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenPageReqVO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2.vo.token; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@ApiModel("管理后台 - 访问令牌分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class OAuth2AccessTokenPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户编号", required = true, example = "666") + private Long userId; + + @ApiModelProperty(value = "用户类型", required = true, example = "2", notes = "参见 UserTypeEnum 枚举") + private Integer userType; + + @ApiModelProperty(value = "客户端编号", required = true, example = "2") + private String clientId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenRespVO.java new file mode 100644 index 0000000..2b6b43c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenRespVO.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2.vo.token; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@ApiModel("管理后台 - 访问令牌 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2AccessTokenRespVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "访问令牌", required = true, example = "tudou") + private String accessToken; + + @ApiModelProperty(value = "刷新令牌", required = true, example = "nice") + private String refreshToken; + + @ApiModelProperty(value = "用户编号", required = true, example = "666") + private Long userId; + + @ApiModelProperty(value = "用户类型", required = true, example = "2", notes = "参见 UserTypeEnum 枚举") + private Integer userType; + + @ApiModelProperty(value = "客户端编号", required = true, example = "2") + private String clientId; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + + @ApiModelProperty(value = "过期时间", required = true) + private Date expiresTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO.java new file mode 100644 index 0000000..234ce51 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO.java @@ -0,0 +1,71 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@ApiModel("管理后台 - OAuth2 获得用户基本信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2UserInfoRespVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") + private String username; + + @ApiModelProperty(value = "用户昵称", required = true, example = "芋道") + private String nickname; + + @ApiModelProperty(value = "用户邮箱", example = "joju@iocoder.cn") + private String email; + @ApiModelProperty(value = "手机号码", example = "15601691300") + private String mobile; + + @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SexEnum 枚举类") + private Integer sex; + + @ApiModelProperty(value = "用户头像", example = "https://www.iocoder.cn/xxx.png") + private String avatar; + + /** + * 所在部门 + */ + private Dept dept; + + /** + * 所属岗位数组 + */ + private List posts; + + @ApiModel("部门") + @Data + public static class Dept { + + @ApiModelProperty(value = "部门编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "部门名称", required = true, example = "研发部") + private String name; + + } + + @ApiModel("岗位") + @Data + public static class Post { + + @ApiModelProperty(value = "岗位编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "岗位名称", required = true, example = "开发") + private String name; + + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserUpdateReqVO.java new file mode 100644 index 0000000..e56b36b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserUpdateReqVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Email; +import javax.validation.constraints.Size; + +@ApiModel("管理后台 - OAuth2 更新用户基本信息 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class OAuth2UserUpdateReqVO { + + @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过 30 个字符") + private String nickname; + + @ApiModelProperty(value = "用户邮箱", example = "joju@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过 50 个字符") + private String email; + + @ApiModelProperty(value = "手机号码", example = "15601691300") + @Length(min = 11, max = 11, message = "手机号长度必须 11 位") + private String mobile; + + @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SexEnum 枚举类") + private Integer sex; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/OrderController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/OrderController.java new file mode 100644 index 0000000..d5b7189 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/OrderController.java @@ -0,0 +1,218 @@ +package com.jojubanking.boot.module.system.controller.admin.order; + +import com.jojubanking.boot.module.system.framework.tjfiles.TjfilesProperties; +import com.jojubanking.boot.module.system.util.xytj.DateDUtil; +import org.apache.commons.lang.StringUtils; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.order.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import com.jojubanking.boot.module.system.convert.order.OrderConvert; +import com.jojubanking.boot.module.system.service.order.OrderService; + +@Api(tags = "管理后台 - 检查项目订单") +@RestController +@RequestMapping("/system/order") +@Validated +public class OrderController { + @Resource + private TjfilesProperties tjfilesProperties; + + @Resource + private OrderService orderService; + + @PostMapping("/create") + @ApiOperation("创建检查项目订单") + @PreAuthorize("@ss.hasPermission('system:order:create')") + public CommonResult createOrder(@Valid @RequestBody OrderCreateReqVO createReqVO) { + return success(orderService.createOrder(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新检查项目订单") + @PreAuthorize("@ss.hasPermission('system:order:update')") + public CommonResult updateOrder(@Valid @RequestBody OrderUpdateReqVO updateReqVO) { + orderService.updateOrder(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除检查项目订单") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:order:delete')") + public CommonResult deleteOrder(@RequestParam("id") Long id) { + orderService.deleteOrder(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得检查项目订单") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:order:query')") + public CommonResult getOrder(@RequestParam("id") Long id) { + OrderDO order = orderService.getOrder(id); + return success(OrderConvert.INSTANCE.convert(order)); + } + + @GetMapping("/list") + @ApiOperation("获得检查项目订单列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:order:query')") + public CommonResult> getOrderList(@RequestParam("ids") Collection ids) { + List list = orderService.getOrderList(ids); + return success(OrderConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得检查项目订单分页") + @PreAuthorize("@ss.hasPermission('system:order:query')") + public CommonResult> getOrderPage(@Valid OrderPageReqVO pageVO) { + PageResult pageResult = orderService.getOrderPage(pageVO); + return success(OrderConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出检查项目订单 Excel") + @PreAuthorize("@ss.hasPermission('system:order:export')") + @OperateLog(type = EXPORT) + public void exportOrderExcel(@Valid OrderExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = orderService.getOrderList(exportReqVO); + + // 导出 Excel + List datas = OrderConvert.INSTANCE.convertList02(list); + + String tjpath = tjfilesProperties.getTjfilespath(); + String filename = tjpath + DateDUtil.getCurrentDateTime() + "检查项目订单"; + String srcFilePath = filename + ".xlsx"; + + ExcelUtils.writeorder(response, srcFilePath, "数据", OrderExcelVO.class, datas); + + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); + + // 创建缓冲输入流 + try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFilePath)); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[4096]; + int bytesRead; + + // 读取并写入文件 + while ((bytesRead = bis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + + } + + @GetMapping("/listsum") + @ApiOperation("获得检查项目订单分页") + @PreAuthorize("@ss.hasPermission('system:order:query')") + public CommonResult> getOrderPage(@Valid OrderSumPageReqVO pageVO) { + List pageResult = new ArrayList<>(); + if(pageVO.getCreateTime() == null){ + pageResult = orderService.getOrderSumList(pageVO.getBatchno(), pageVO.getSchoolName(), pageVO.getClassName(), + pageVO.getItemname(), pageVO.getSex(), "", ""); + + }else{ + pageResult = orderService.getOrderSumList(pageVO.getBatchno(), pageVO.getSchoolName(), pageVO.getClassName(), + pageVO.getItemname(), pageVO.getSex(), pageVO.getCreateTime()[0], pageVO.getCreateTime()[1]); + } + for(int i=0; i pageResult = new ArrayList<>(); + if(pageVO.getCreateTime() == null){ + pageResult = orderService.getOrderSumList(pageVO.getBatchno(), pageVO.getSchoolName(), pageVO.getClassName(), + pageVO.getItemname(), pageVO.getSex(), "", ""); + + }else{ + pageResult = orderService.getOrderSumList(pageVO.getBatchno(), pageVO.getSchoolName(), pageVO.getClassName(), + pageVO.getItemname(), pageVO.getSex(), pageVO.getCreateTime()[0], pageVO.getCreateTime()[1]); + } + + for(int i=0; i datas = OrderConvert.INSTANCE.convertList03(pageResult); + ExcelUtils.writeorder(response, srcFilePath, "数据", OrderSumExcelVO.class, datas); + + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); + + // 创建缓冲输入流 + try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFilePath)); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[4096]; + int bytesRead; + + // 读取并写入文件 + while ((bytesRead = bis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderBaseVO.java new file mode 100644 index 0000000..b4c1a3c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderBaseVO.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.module.system.controller.admin.order.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 检查项目订单 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class OrderBaseVO { + + @ApiModelProperty(value = "体检批次号", required = true) + @NotNull(message = "体检批次号不能为空") + private String batchno; + + @ApiModelProperty(value = "病人唯一标识", required = true) + @NotNull(message = "病人唯一标识不能为空") + private String patid; + + @ApiModelProperty(value = "患者姓名") + private String name; + + @ApiModelProperty(value = "身份证") + private String nationid; + + @ApiModelProperty(value = "订单编码") + private String orderno; + + @ApiModelProperty(value = "套餐标识(0非套餐 1套餐 )", required = true) + @NotNull(message = "套餐标识(0非套餐 1套餐 )不能为空") + private Integer packageflag; + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包", required = true) + @NotNull(message = "套餐代码 目前只有一个基础包不能为空") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )", required = true) + @NotNull(message = "标识(1小项目 2临床 )不能为空") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码", required = true) + @NotNull(message = "项目代码不能为空") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "代价 单位分") + private String itemprice; + + @ApiModelProperty(value = "支付状态") + private String paystatus; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderCreateReqVO.java new file mode 100644 index 0000000..e87c677 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderCreateReqVO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.controller.admin.order.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 检查项目订单创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OrderCreateReqVO extends OrderBaseVO { + @ApiModelProperty(value = "订单状态") + private String paystatus; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "性别(1男 2女)") + private Integer sex; + + @ApiModelProperty(value = "执行科室") + private String zxks; + + @ApiModelProperty(value = "执行科室名称") + private String zxksname; + + @ApiModelProperty(value = "开单科室") + private String kdks; + + @ApiModelProperty(value = "开单科室名称") + private String kdksname; +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderExcelVO.java new file mode 100644 index 0000000..a826955 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderExcelVO.java @@ -0,0 +1,97 @@ +package com.jojubanking.boot.module.system.controller.admin.order.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 检查项目订单 Excel VO + * + * @author admin + */ +@Data +public class OrderExcelVO { + +// @ExcelProperty("ID") + @ExcelIgnore + private Long id; + + @ExcelProperty(value ={"体检批次号"},index = 0) + @ColumnWidth(value = 19) + private String batchno; + + + @ExcelProperty(value ={"就诊ID"},index = 1) + @ColumnWidth(value = 12) + private String patid; + + @ExcelProperty(value ={"订单编码"},index = 2) + @ColumnWidth(value = 20) + private String orderno; + + @ExcelProperty(value ={"患者姓名"},index = 3) + @ColumnWidth(value = 20) + private String name; + + @ExcelProperty(value ={"身份证"},index = 4) + @ColumnWidth(value = 20) + private String nationid; + + @ExcelProperty(value ={"学校名称"},index = 5) + @ColumnWidth(value = 30) + private String schoolName; + + @ExcelProperty(value ={"班级名称"},index = 6) + @ColumnWidth(value = 20) + private String className; + + @ExcelProperty(value ={"缴费状态"},index = 7, converter = DictConvert.class) + @DictFormat(DictTypeConstants.FEE_FLAG) + @ColumnWidth(value = 15) + private String paystatus; + +// @ExcelProperty("套餐标识(0非套餐 1套餐 )") +@ExcelIgnore +private Integer packageflag; + +// @ExcelProperty("套餐代码 目前只有一个基础包") +@ExcelIgnore +private String packageno; + + @ExcelProperty(value ={"标识"},index = 8, converter = DictConvert.class) + @DictFormat(DictTypeConstants.ITEM_TYPE) + @ColumnWidth(value = 10) + private Integer itemflag; + + @ExcelProperty(value ={"项目代码"},index = 9) + @ColumnWidth(value = 15) + private String itemno; + + @ExcelProperty(value ={"项目名称"},index = 10) + @ColumnWidth(value = 20) + private String itemname; + + @ExcelProperty(value ={"单价"},index = 11) + @ColumnWidth(value = 12) + private String itemprice; + + @ExcelProperty(value ={"开单科室"},index = 12) + @ColumnWidth(value = 20) + private String kdksname; + + @ExcelProperty(value ={"执行科室"},index = 13) + @ColumnWidth(value = 20) + private String zxksname; + + @ExcelProperty(value ={"创建时间"},index = 14) + @ColumnWidth(value = 20) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderExportReqVO.java new file mode 100644 index 0000000..8411a27 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderExportReqVO.java @@ -0,0 +1,61 @@ +package com.jojubanking.boot.module.system.controller.admin.order.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 检查项目订单 Excel 导出 Request VO", description = "参数和 OrderPageReqVO 是一致的") +@Data +public class OrderExportReqVO { + + @ApiModelProperty(value = "体检批次号") + private String batchno; + + @ApiModelProperty(value = "病人唯一标识") + private String patid; + + @ApiModelProperty(value = "订单编码") + private String orderno; + + @ApiModelProperty(value = "套餐标识(0非套餐 1套餐 )") + private Integer packageflag; + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "代价 单位分") + private String itemprice; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + + @ApiModelProperty(value = "支付状态") + private String paystatus; + + @ApiModelProperty(value = "执行科室名称") + private String zxksname; + + @ApiModelProperty(value = "开单科室名称") + private String kdksname; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderPageReqVO.java new file mode 100644 index 0000000..09e9bff --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderPageReqVO.java @@ -0,0 +1,69 @@ +package com.jojubanking.boot.module.system.controller.admin.order.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 检查项目订单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OrderPageReqVO extends PageParam { + + @ApiModelProperty(value = "体检批次号") + private String batchno; + + @ApiModelProperty(value = "病人唯一标识") + private String patid; + + @ApiModelProperty(value = "患者姓名") + private String name; + + @ApiModelProperty(value = "身份证") + private String nationid; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "订单编码") + private String orderno; + + @ApiModelProperty(value = "套餐标识(0非套餐 1套餐 )") + private Integer packageflag; + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "代价 单位分") + private String itemprice; + + @ApiModelProperty(value = "0未交费 1已缴费") + private String paystatus; + + @ApiModelProperty(value = "执行科室名称") + private String zxksname; + + @ApiModelProperty(value = "开单科室名称") + private String kdksname; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderRespVO.java new file mode 100644 index 0000000..ff6f142 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderRespVO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.system.controller.admin.order.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 检查项目订单 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OrderRespVO extends OrderBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Long id; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + + @ApiModelProperty(value = "执行科室") + private String zxks; + + @ApiModelProperty(value = "执行科室名称") + private String zxksname; + + @ApiModelProperty(value = "开单科室") + private String kdks; + + @ApiModelProperty(value = "开单科室名称") + private String kdksname; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumExcelVO.java new file mode 100644 index 0000000..ab909ee --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumExcelVO.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.controller.admin.order.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class OrderSumExcelVO { + + @ExcelProperty(value ={"体检批次号"},index = 1) + private String batchno; + + @ExcelProperty(value ={"班级"},index = 3) + @ColumnWidth(value = 15) + private String className; + + @ExcelProperty(value ={"学校"},index = 2) + @ColumnWidth(value = 20) + private String schoolName; + + @ExcelProperty(value ={"性别"},index = 4, converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_SEX) + @ColumnWidth(value = 10) + private Integer sex; + + @ExcelProperty(value ={"项目名称"},index = 0) + private String itemname; + + @ExcelProperty(value ={"人数"},index = 5) + @ColumnWidth(value = 10) + private String patCount; + + @ExcelProperty(value ={"金额"},index = 6) + @ColumnWidth(value = 30) + private String priceSum; +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumPageReqVO.java new file mode 100644 index 0000000..4d13bc3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumPageReqVO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.system.controller.admin.order.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 检查项目订单分页 Request VO") +@Data +public class OrderSumPageReqVO { + @ApiModelProperty(value = "体检批次号") + private String batchno; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "性别(1男 2女)") + private Integer sex; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumRespVO.java new file mode 100644 index 0000000..4d1d942 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumRespVO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.controller.admin.order.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 检查项目订单 Response VO") +@Data +public class OrderSumRespVO { + @ApiModelProperty(value = "体检批次号") + @NotNull(message = "体检批次号不能为空") + private String batchno; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "性别(1男 2女)") + private Integer sex; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "人数") + private String patCount; + + @ApiModelProperty(value = "金额") + private String priceSum; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderUpdateReqVO.java new file mode 100644 index 0000000..8b7c551 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.order.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 检查项目订单更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OrderUpdateReqVO extends OrderBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/OrderViewController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/OrderViewController.java new file mode 100644 index 0000000..cdf21c4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/OrderViewController.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.controller.admin.orderview; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.orderview.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.orderview.OrderViewDO; +import com.jojubanking.boot.module.system.convert.orderview.OrderViewConvert; +import com.jojubanking.boot.module.system.service.orderview.OrderViewService; + +@Api(tags = "管理后台 - VIEW") +@RestController +@RequestMapping("/system/order-view") +@Validated +public class OrderViewController { + + @Resource + private OrderViewService orderViewService; + + @PostMapping("/create") + @ApiOperation("创建VIEW") + @PreAuthorize("@ss.hasPermission('system:order-view:create')") + public CommonResult createOrderView(@Valid @RequestBody OrderViewCreateReqVO createReqVO) { + return success(orderViewService.createOrderView(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新VIEW") + @PreAuthorize("@ss.hasPermission('system:order-view:update')") + public CommonResult updateOrderView(@Valid @RequestBody OrderViewUpdateReqVO updateReqVO) { + orderViewService.updateOrderView(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除VIEW") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:order-view:delete')") + public CommonResult deleteOrderView(@RequestParam("id") Long id) { + orderViewService.deleteOrderView(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得VIEW") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:order-view:query')") + public CommonResult getOrderView(@RequestParam("id") Long id) { + OrderViewDO orderView = orderViewService.getOrderView(id); + return success(OrderViewConvert.INSTANCE.convert(orderView)); + } + + @GetMapping("/list") + @ApiOperation("获得VIEW列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:order-view:query')") + public CommonResult> getOrderViewList(@RequestParam("ids") Collection ids) { + List list = orderViewService.getOrderViewList(ids); + return success(OrderViewConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得VIEW分页") + @PreAuthorize("@ss.hasPermission('system:order-view:query')") + public CommonResult> getOrderViewPage(@Valid OrderViewPageReqVO pageVO) { + PageResult pageResult = orderViewService.getOrderViewPage(pageVO); + return success(OrderViewConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出VIEW Excel") + @PreAuthorize("@ss.hasPermission('system:order-view:export')") + @OperateLog(type = EXPORT) + public void exportOrderViewExcel(@Valid OrderViewExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = orderViewService.getOrderViewList(exportReqVO); + // 导出 Excel + List datas = OrderViewConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "VIEW.xls", "数据", OrderViewExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewBaseVO.java new file mode 100644 index 0000000..255b95c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewBaseVO.java @@ -0,0 +1,66 @@ +package com.jojubanking.boot.module.system.controller.admin.orderview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* VIEW Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class OrderViewBaseVO { + + @ApiModelProperty(value = "体检批次号", required = true) + @NotNull(message = "体检批次号不能为空") + private String batchno; + + @ApiModelProperty(value = "病人唯一标识", required = true) + @NotNull(message = "病人唯一标识不能为空") + private String patid; + + @ApiModelProperty(value = "患者姓名") + private String name; + + @ApiModelProperty(value = "身份证") + private String nationid; + + @ApiModelProperty(value = "订单编码") + private String orderno; + + @ApiModelProperty(value = "his收据号") + private String sjh; + + @ApiModelProperty(value = "套餐标识(0非套餐 1套餐 )", required = true) + @NotNull(message = "套餐标识(0非套餐 1套餐 )不能为空") + private Integer packageflag; + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包", required = true) + @NotNull(message = "套餐代码 目前只有一个基础包不能为空") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )", required = true) + @NotNull(message = "标识(1小项目 2临床 )不能为空") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码", required = true) + @NotNull(message = "项目代码不能为空") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "代价 单位分") + private String itemprice; + + @ApiModelProperty(value = "0未交费 1已缴费") + private String paystatus; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "班级名称") + private String className; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewCreateReqVO.java new file mode 100644 index 0000000..f060316 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.orderview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - VIEW创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OrderViewCreateReqVO extends OrderViewBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewExcelVO.java new file mode 100644 index 0000000..812126a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewExcelVO.java @@ -0,0 +1,68 @@ +package com.jojubanking.boot.module.system.controller.admin.orderview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * VIEW Excel VO + * + * @author admin + */ +@Data +public class OrderViewExcelVO { + + @ExcelProperty("ID") + private Long id; + + @ExcelProperty("体检批次号") + private String batchno; + + @ExcelProperty("病人唯一标识") + private String patid; + + @ExcelProperty("患者姓名") + private String name; + + @ExcelProperty("身份证") + private String nationid; + + @ExcelProperty("订单编码") + private String orderno; + + @ExcelProperty("his收据号") + private String sjh; + + @ExcelProperty("套餐标识(0非套餐 1套餐 )") + private Integer packageflag; + + @ExcelProperty("套餐代码 目前只有一个基础包") + private String packageno; + + @ExcelProperty("标识(1小项目 2临床 )") + private Integer itemflag; + + @ExcelProperty("项目代码") + private String itemno; + + @ExcelProperty("项目名称") + private String itemname; + + @ExcelProperty("代价 单位分") + private String itemprice; + + @ExcelProperty("0未交费 1已缴费") + private String paystatus; + + @ExcelProperty("创建时间") + private Date createTime; + + @ExcelProperty("学校名称") + private String schoolName; + + @ExcelProperty("班级名称") + private String className; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewExportReqVO.java new file mode 100644 index 0000000..6b6e395 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewExportReqVO.java @@ -0,0 +1,64 @@ +package com.jojubanking.boot.module.system.controller.admin.orderview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - VIEW Excel 导出 Request VO", description = "参数和 OrderViewPageReqVO 是一致的") +@Data +public class OrderViewExportReqVO { + + @ApiModelProperty(value = "体检批次号") + private String batchno; + + @ApiModelProperty(value = "病人唯一标识") + private String patid; + + @ApiModelProperty(value = "患者姓名") + private String name; + + @ApiModelProperty(value = "身份证") + private String nationid; + + @ApiModelProperty(value = "订单编码") + private String orderno; + + @ApiModelProperty(value = "his收据号") + private String sjh; + + @ApiModelProperty(value = "套餐标识(0非套餐 1套餐 )") + private Integer packageflag; + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "代价 单位分") + private String itemprice; + + @ApiModelProperty(value = "0未交费 1已缴费") + private String paystatus; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "班级名称") + private String className; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewPageReqVO.java new file mode 100644 index 0000000..790f8ad --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewPageReqVO.java @@ -0,0 +1,66 @@ +package com.jojubanking.boot.module.system.controller.admin.orderview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - VIEW分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OrderViewPageReqVO extends PageParam { + + @ApiModelProperty(value = "体检批次号") + private String batchno; + + @ApiModelProperty(value = "病人唯一标识") + private String patid; + + @ApiModelProperty(value = "患者姓名") + private String name; + + @ApiModelProperty(value = "身份证") + private String nationid; + + @ApiModelProperty(value = "订单编码") + private String orderno; + + @ApiModelProperty(value = "his收据号") + private String sjh; + + @ApiModelProperty(value = "套餐标识(0非套餐 1套餐 )") + private Integer packageflag; + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + @ApiModelProperty(value = "代价 单位分") + private String itemprice; + + @ApiModelProperty(value = "0未交费 1已缴费") + private String paystatus; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "班级名称") + private String className; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewRespVO.java new file mode 100644 index 0000000..2fca6c2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.orderview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - VIEW Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OrderViewRespVO extends OrderViewBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewUpdateReqVO.java new file mode 100644 index 0000000..09a61d8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.orderview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - VIEW更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class OrderViewUpdateReqVO extends OrderViewBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/MenuController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/MenuController.http new file mode 100644 index 0000000..a90d8b8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/MenuController.http @@ -0,0 +1,4 @@ +### 请求 /menu/list 接口 => 成功 +GET {{baseUrl}}/system/menu/list +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/MenuController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/MenuController.java new file mode 100644 index 0000000..079cf38 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/MenuController.java @@ -0,0 +1,91 @@ +package com.jojubanking.boot.module.system.controller.admin.permission; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.*; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.*; +import com.jojubanking.boot.module.system.convert.permission.MenuConvert; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import com.jojubanking.boot.module.system.service.permission.MenuService; +import com.jojubanking.boot.module.system.service.tenant.TenantService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Comparator; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - 菜单") +@RestController +@RequestMapping("/system/menu") +@Validated +public class MenuController { + + @Resource + private MenuService menuService; + @Resource + private TenantService tenantService; + + @PostMapping("/create") + @ApiOperation("创建菜单") + @PreAuthorize("@ss.hasPermission('system:menu:create')") + public CommonResult createMenu(@Valid @RequestBody MenuCreateReqVO reqVO) { + Long menuId = menuService.createMenu(reqVO); + return success(menuId); + } + + @PutMapping("/update") + @ApiOperation("修改菜单") + @PreAuthorize("@ss.hasPermission('system:menu:update')") + public CommonResult updateMenu(@Valid @RequestBody MenuUpdateReqVO reqVO) { + menuService.updateMenu(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除菜单") + @ApiImplicitParam(name = "id", value = "角色编号", required= true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:menu:delete')") + public CommonResult deleteMenu(@RequestParam("id") Long id) { + menuService.deleteMenu(id); + return success(true); + } + + @GetMapping("/list") + @ApiOperation(value = "获取菜单列表", notes = "用于【菜单管理】界面") + @PreAuthorize("@ss.hasPermission('system:menu:query')") + public CommonResult> getMenus(MenuListReqVO reqVO) { + List list = menuService.getMenus(reqVO); + list.sort(Comparator.comparing(MenuDO::getSort)); + return success(MenuConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获取菜单精简信息列表", notes = "只包含被开启的菜单,用于【角色分配菜单】功能的选项。" + + "在多租户的场景下,会只返回租户所在套餐有的菜单") + public CommonResult> getSimpleMenus() { + // 获得菜单列表,只要开启状态的 + MenuListReqVO reqVO = new MenuListReqVO(); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + List list = menuService.getTenantMenus(reqVO); + // 排序后,返回给前端 + list.sort(Comparator.comparing(MenuDO::getSort)); + return success(MenuConvert.INSTANCE.convertList02(list)); + } + + @GetMapping("/get") + @ApiOperation("获取菜单信息") + @PreAuthorize("@ss.hasPermission('system:menu:query')") + public CommonResult getMenu(Long id) { + MenuDO menu = menuService.getMenu(id); + return success(MenuConvert.INSTANCE.convert(menu)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/PermissionController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/PermissionController.java new file mode 100644 index 0000000..5d38919 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/PermissionController.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.controller.admin.permission; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleDataScopeReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleMenuReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.permission.PermissionAssignUserRoleReqVO; +import com.jojubanking.boot.module.system.service.permission.PermissionService; +import com.jojubanking.boot.module.system.service.tenant.TenantService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Set; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +/** + * 权限 Controller,提供赋予用户、角色的权限的 API 接口 + * + * @author TW + */ +@Api(tags = "管理后台 - 权限") +@RestController +@RequestMapping("/system/permission") +public class PermissionController { + + @Resource + private PermissionService permissionService; + @Resource + private TenantService tenantService; + + @ApiOperation("获得角色拥有的菜单编号") + @ApiImplicitParam(name = "roleId", value = "角色编号", required = true, dataTypeClass = Long.class) + @GetMapping("/list-role-resources") + @PreAuthorize("@ss.hasPermission('system:permission:assign-role-menu')") + public CommonResult> listRoleMenus(Long roleId) { + return success(permissionService.getRoleMenuIds(roleId)); + } + + @PostMapping("/assign-role-menu") + @ApiOperation("赋予角色菜单") + @PreAuthorize("@ss.hasPermission('system:permission:assign-role-menu')") + public CommonResult assignRoleMenu(@Validated @RequestBody PermissionAssignRoleMenuReqVO reqVO) { + // 开启多租户的情况下,需要过滤掉未开通的菜单 + tenantService.handleTenantMenu(menuIds -> reqVO.getMenuIds().removeIf(menuId -> !CollUtil.contains(menuIds, menuId))); + + // 执行菜单的分配 + permissionService.assignRoleMenu(reqVO.getRoleId(), reqVO.getMenuIds()); + return success(true); + } + + @PostMapping("/assign-role-data-scope") + @ApiOperation("赋予角色数据权限") + @PreAuthorize("@ss.hasPermission('system:permission:assign-role-data-scope')") + public CommonResult assignRoleDataScope(@Valid @RequestBody PermissionAssignRoleDataScopeReqVO reqVO) { + permissionService.assignRoleDataScope(reqVO.getRoleId(), reqVO.getDataScope(), reqVO.getDataScopeDeptIds()); + return success(true); + } + + @ApiOperation("获得管理员拥有的角色编号列表") + @ApiImplicitParam(name = "userId", value = "用户编号", required = true, dataTypeClass = Long.class) + @GetMapping("/list-user-roles") + @PreAuthorize("@ss.hasPermission('system:permission:assign-user-role')") + public CommonResult> listAdminRoles(@RequestParam("userId") Long userId) { + return success(permissionService.getUserRoleIdListByUserId(userId)); + } + + @ApiOperation("赋予用户角色") + @PostMapping("/assign-user-role") + @PreAuthorize("@ss.hasPermission('system:permission:assign-user-role')") + public CommonResult assignUserRole(@Validated @RequestBody PermissionAssignUserRoleReqVO reqVO) { + permissionService.assignUserRole(reqVO.getUserId(), reqVO.getRoleIds()); + return success(true); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/RoleController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/RoleController.http new file mode 100644 index 0000000..c28725d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/RoleController.http @@ -0,0 +1,45 @@ +### /role/create 成功 +POST {{baseUrl}}/system/role/create +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "name": "测试角色", + "code": "test", + "sort": 0 +} + +### /role/update 成功 +POST {{baseUrl}}/system/role/update +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "id": 100, + "name": "测试角色", + "code": "test", + "sort": 10 +} +### /resource/delete 成功 +POST {{baseUrl}}/system/role/delete +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +roleId=14 + +### /role/get 成功 +GET {{baseUrl}}/system/role/get?id=100 +Content-Type: application/x-www-form-urlencoded +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### /role/page 成功 +GET {{baseUrl}}/system/role/page?pageNo=1&pageSize=10 +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +### + diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/RoleController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/RoleController.java new file mode 100644 index 0000000..4430760 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/RoleController.java @@ -0,0 +1,107 @@ +package com.jojubanking.boot.module.system.controller.admin.permission; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.*; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.*; +import com.jojubanking.boot.module.system.convert.permission.RoleConvert; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.service.permission.RoleService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 角色") +@RestController +@RequestMapping("/system/role") +@Validated +public class RoleController { + + @Resource + private RoleService roleService; + + @PostMapping("/create") + @ApiOperation("创建角色") + @PreAuthorize("@ss.hasPermission('system:role:create')") + public CommonResult createRole(@Valid @RequestBody RoleCreateReqVO reqVO) { + return success(roleService.createRole(reqVO, null)); + } + + @PutMapping("/update") + @ApiOperation("修改角色") + @PreAuthorize("@ss.hasPermission('system:role:update')") + public CommonResult updateRole(@Valid @RequestBody RoleUpdateReqVO reqVO) { + roleService.updateRole(reqVO); + return success(true); + } + + @PutMapping("/update-status") + @ApiOperation("修改角色状态") + @PreAuthorize("@ss.hasPermission('system:role:update')") + public CommonResult updateRoleStatus(@Valid @RequestBody RoleUpdateStatusReqVO reqVO) { + roleService.updateRoleStatus(reqVO.getId(), reqVO.getStatus()); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除角色") + @ApiImplicitParam(name = "id", value = "角色编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:role:delete')") + public CommonResult deleteRole(@RequestParam("id") Long id) { + roleService.deleteRole(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得角色信息") + @PreAuthorize("@ss.hasPermission('system:role:query')") + public CommonResult getRole(@RequestParam("id") Long id) { + RoleDO role = roleService.getRole(id); + return success(RoleConvert.INSTANCE.convert(role)); + } + + @GetMapping("/page") + @ApiOperation("获得角色分页") + @PreAuthorize("@ss.hasPermission('system:role:query')") + public CommonResult> getRolePage(RolePageReqVO reqVO) { + return success(roleService.getRolePage(reqVO)); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获取角色精简信息列表", notes = "只包含被开启的角色,主要用于前端的下拉选项") + public CommonResult> getSimpleRoles() { + // 获得角色列表,只要开启状态的 + List list = roleService.getRoles(Collections.singleton(CommonStatusEnum.ENABLE.getStatus())); + // 排序后,返回给前端 + list.sort(Comparator.comparing(RoleDO::getSort)); + return success(RoleConvert.INSTANCE.convertList02(list)); + } + + @GetMapping("/export") + @OperateLog(type = EXPORT) + @PreAuthorize("@ss.hasPermission('system:role:export')") + public void export(HttpServletResponse response, @Validated RoleExportReqVO reqVO) throws IOException { + List list = roleService.getRoleList(reqVO); + List data = RoleConvert.INSTANCE.convertList03(list); + // 输出 + ExcelUtils.write(response, "角色数据.xls", "角色列表", RoleExcelVO.class, data); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java new file mode 100644 index 0000000..318b26a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuBaseVO.java @@ -0,0 +1,59 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.menu; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 菜单 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class MenuBaseVO { + + @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") + @NotBlank(message = "菜单名称不能为空") + @Size(max = 50, message = "菜单名称长度不能超过50个字符") + private String name; + + @ApiModelProperty(value = "权限标识", example = "sys:menu:add", notes = "仅菜单类型为按钮时,才需要传递") + @Size(max = 100) + private String permission; + + @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 MenuTypeEnum 枚举类") + @NotNull(message = "菜单类型不能为空") + private Integer type; + + @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") + @NotNull(message = "父菜单 ID 不能为空") + private Long parentId; + + @ApiModelProperty(value = "路由地址", example = "post", notes = "仅菜单类型为菜单或者目录时,才需要传") + @Size(max = 200, message = "路由地址不能超过200个字符") + private String path; + + @ApiModelProperty(value = "菜单图标", example = "/menu/list", notes = "仅菜单类型为菜单或者目录时,才需要传") + private String icon; + + @ApiModelProperty(value = "组件路径", example = "system/post/index", notes = "仅菜单类型为菜单时,才需要传") + @Size(max = 200, message = "组件路径不能超过255个字符") + private String component; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") + private Integer status; + + @ApiModelProperty(value = "是否可见", example = "false") + private Boolean visible; + + @ApiModelProperty(value = "是否缓存", example = "false") + private Boolean keepAlive; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuCreateReqVO.java new file mode 100644 index 0000000..4a2e5b4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuCreateReqVO.java @@ -0,0 +1,10 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.menu; + +import io.swagger.annotations.ApiModel; +import lombok.*; + +@ApiModel("管理后台 - 菜单创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class MenuCreateReqVO extends MenuBaseVO { +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java new file mode 100644 index 0000000..92be6e4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuListReqVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.menu; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +@ApiModel("管理后台 - 菜单列表 Request VO") +@Data +@Accessors(chain = true) +public class MenuListReqVO { + + @ApiModelProperty(value = "菜单名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuRespVO.java new file mode 100644 index 0000000..dbe3eee --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuRespVO.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.menu; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@ApiModel("管理后台 - 菜单信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class MenuRespVO extends MenuBaseVO { + + @ApiModelProperty(value = "菜单编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.java new file mode 100644 index 0000000..d8885c7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.menu; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 菜单精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class MenuSimpleRespVO { + + @ApiModelProperty(value = "菜单编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "菜单名称", required = true, example = "芋道") + private String name; + + @ApiModelProperty(value = "父菜单 ID", required = true, example = "1024") + private Long parentId; + + @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 MenuTypeEnum 枚举类") + private Integer type; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuUpdateReqVO.java new file mode 100644 index 0000000..56f8238 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.menu; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 菜单更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class MenuUpdateReqVO extends MenuBaseVO { + + @ApiModelProperty(value = "菜单编号", required = true, example = "1024") + @NotNull(message = "菜单编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java new file mode 100644 index 0000000..d26aa21 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.permission; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Set; + +@ApiModel("管理后台 - 赋予角色数据权限 Request VO") +@Data +public class PermissionAssignRoleDataScopeReqVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1") + @NotNull(message = "角色编号不能为空") + private Long roleId; + + @ApiModelProperty(value = "数据范围", required = true, example = "1", notes = "参见 DataScopeEnum 枚举类") + @NotNull(message = "数据范围不能为空") +// TODO 这里要多一个枚举校验 + private Integer dataScope; + + @ApiModelProperty(value = "部门编号列表", example = "1,3,5", notes = "只有范围类型为 DEPT_CUSTOM 时,该字段才需要") + private Set dataScopeDeptIds = Collections.emptySet(); // 兜底 + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java new file mode 100644 index 0000000..1f142f6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.permission; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Set; + +@ApiModel("管理后台 - 赋予角色菜单 Request VO") +@Data +public class PermissionAssignRoleMenuReqVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1") + @NotNull(message = "角色编号不能为空") + private Long roleId; + + @ApiModelProperty(value = "菜单编号列表", example = "1,3,5") + private Set menuIds = Collections.emptySet(); // 兜底 + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.java new file mode 100644 index 0000000..8b45c74 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.permission; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Collections; +import java.util.Set; + +@ApiModel("管理后台 - 赋予用户角色 Request VO") +@Data +public class PermissionAssignUserRoleReqVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1") + @NotNull(message = "用户编号不能为空") + private Long userId; + + @ApiModelProperty(value = "角色编号列表", example = "1,3,5") + private Set roleIds = Collections.emptySet(); // 兜底 + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleBaseVO.java new file mode 100644 index 0000000..836bd35 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleBaseVO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.role; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 角色 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class RoleBaseVO { + + @ApiModelProperty(value = "角色名称", required = true, example = "管理员") + @NotBlank(message = "角色名称不能为空") + @Size(max = 30, message = "角色名称长度不能超过30个字符") + private String name; + + @NotBlank(message = "角色标志不能为空") + @Size(max = 100, message = "角色标志长度不能超过100个字符") + @ApiModelProperty(value = "角色编码", required = true, example = "ADMIN") + private String code; + + @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "备注", example = "我是一个角色") + private String remark; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleCreateReqVO.java new file mode 100644 index 0000000..279d83d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@ApiModel("管理后台 - 角色创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class RoleCreateReqVO extends RoleBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleExcelVO.java new file mode 100644 index 0000000..52137be --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleExcelVO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.role; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 角色 Excel 导出响应 VO + */ +@Data +public class RoleExcelVO { + + @ExcelProperty("角色序号") + private Long id; + + @ExcelProperty("角色名称") + private String name; + + @ExcelProperty("角色标志") + private String code; + + @ExcelProperty("角色排序") + private Integer sort; + + @ExcelProperty("数据范围") + private Integer dataScope; + + @ExcelProperty(value = "角色状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private String status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleExportReqVO.java new file mode 100644 index 0000000..f5fe224 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleExportReqVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 角色分页 Request VO") +@Data +public class RoleExportReqVO { + + @ApiModelProperty(value = "角色名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "角色标识", example = "joju", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "开始时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RolePageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RolePageReqVO.java new file mode 100644 index 0000000..f5cfe85 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RolePageReqVO.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.role; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 角色分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class RolePageReqVO extends PageParam { + + @ApiModelProperty(value = "角色名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "角色标识", example = "joju", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleRespVO.java new file mode 100644 index 0000000..9d88f5e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleRespVO.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.Set; + +@ApiModel("管理后台 - 角色信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class RoleRespVO extends RoleBaseVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "数据范围", required = true, example = "1", notes = "参见 DataScopeEnum 枚举类") + private Integer dataScope; + + @ApiModelProperty(value = "数据范围(指定部门数组)", example = "1") + private Set dataScopeDeptIds; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "参见 RoleTypeEnum 枚举类") + private Integer type; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java new file mode 100644 index 0000000..f7ffac5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("管理后台 - 角色精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class RoleSimpleRespVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "角色名称", required = true, example = "芋道") + private String name; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleUpdateReqVO.java new file mode 100644 index 0000000..bccd216 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleUpdateReqVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 角色更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class RoleUpdateReqVO extends RoleBaseVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1024") + @NotNull(message = "角色编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.java new file mode 100644 index 0000000..07e4f60 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.system.controller.admin.permission.vo.role; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 角色更新状态 Request VO") +@Data +public class RoleUpdateStatusReqVO { + + @ApiModelProperty(value = "角色编号", required = true, example = "1024") + @NotNull(message = "角色编号不能为空") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") +// @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/RefundApplyController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/RefundApplyController.java new file mode 100644 index 0000000..1e69b6e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/RefundApplyController.java @@ -0,0 +1,245 @@ +package com.jojubanking.boot.module.system.controller.admin.refundapply; + +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.data.ImageData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentExcelVO; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import com.jojubanking.boot.module.system.framework.captcha.config.CaptchaProperties; +import com.jojubanking.boot.module.system.framework.tjfiles.TjfilesProperties; +import com.jojubanking.boot.module.system.util.xytj.DateDUtil; +import lombok.extern.slf4j.Slf4j; +import net.coobird.thumbnailator.Thumbnails; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.imageio.ImageIO; +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; +import java.util.function.Consumer; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; +import static com.jojubanking.boot.module.system.util.xytj.BarCodeUtils.getBarCode; +import static com.jojubanking.boot.module.system.util.xytj.BarCodeUtils.insertWords; + +import com.jojubanking.boot.module.system.controller.admin.refundapply.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.refundapply.RefundApplyDO; +import com.jojubanking.boot.module.system.convert.refundapply.RefundApplyConvert; +import com.jojubanking.boot.module.system.service.refundapply.RefundApplyService; + +@Slf4j +@Api(tags = "管理后台 - 就诊卡退费申请") +@RestController +@RequestMapping("/system/refund-apply") +@Validated +public class RefundApplyController { + @Resource + private TjfilesProperties tjfilesProperties; + + @Resource + private RefundApplyService refundApplyService; + + @PostMapping("/create") + @ApiOperation("创建就诊卡退费申请") + @PreAuthorize("@ss.hasPermission('system:refund-apply:create')") + public CommonResult createRefundApply(@Valid @RequestBody RefundApplyCreateReqVO createReqVO) { + return success(refundApplyService.createRefundApply(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新就诊卡退费申请") + @PreAuthorize("@ss.hasPermission('system:refund-apply:update')") + public CommonResult updateRefundApply(@Valid @RequestBody RefundApplyUpdateReqVO updateReqVO) { + refundApplyService.updateRefundApply(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除就诊卡退费申请") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:refund-apply:delete')") + public CommonResult deleteRefundApply(@RequestParam("id") Long id) { + refundApplyService.deleteRefundApply(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得就诊卡退费申请") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:refund-apply:query')") + public CommonResult getRefundApply(@RequestParam("id") Long id) { + RefundApplyDO refundApply = refundApplyService.getRefundApply(id); + return success(RefundApplyConvert.INSTANCE.convert(refundApply)); + } + + @GetMapping("/list") + @ApiOperation("获得就诊卡退费申请列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:refund-apply:query')") + public CommonResult> getRefundApplyList(@RequestParam("ids") Collection ids) { + List list = refundApplyService.getRefundApplyList(ids); + return success(RefundApplyConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得就诊卡退费申请分页") + @PreAuthorize("@ss.hasPermission('system:refund-apply:query')") + public CommonResult> getRefundApplyPage(@Valid RefundApplyPageReqVO pageVO) { + PageResult pageResult = refundApplyService.getRefundApplyPage(pageVO); + return success(RefundApplyConvert.INSTANCE.convertPage(pageResult)); + } + + public static String[] extractFileNameAndType(String url) { + String[] parts = url.split("/"); + String fullFileName = parts[parts.length - 1]; + String[] nameParts = fullFileName.split("\\."); + if (nameParts.length > 1) { + String fileName = ""; + for (int i = 0; i < nameParts.length - 1; i++) { + if (i > 0) { + fileName += "."; + } + fileName += nameParts[i]; + } + String fileType = nameParts[nameParts.length - 1]; + return new String[]{fileName, fileType}; + } + return null; + } + + @GetMapping("/export-excel") + @ApiOperation("导出就诊卡退费申请 Excel") + @PreAuthorize("@ss.hasPermission('system:refund-apply:export')") + @OperateLog(type = EXPORT) + public void exportRefundApplyExcel(@Valid RefundApplyExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = refundApplyService.getRefundApplyList(exportReqVO); + List datas = RefundApplyConvert.INSTANCE.convertList02(list); + + for (RefundApplyExcelVO data : datas) { + processImage(data.getZidcardimg(), data::setWriteCellDataFileIdcard); + processImage(data.getChildidcardimg(), data::setWriteCellDataFileChild); + processImage(data.getZbankcardimg(), data::setWriteCellDataFileBank); + } + +// ExcelUtils.write(response, "就诊卡退费申请.xls", "数据", RefundApplyExcelVO.class, datas); + + String tjpath = tjfilesProperties.getTjfilespath(); + + String filename = tjpath + DateDUtil.getCurrentDateTime() + "就诊卡退费申请"; +// String filename = tjpath + DateDUtil.getCurrentDateTime() + "就诊卡退费申请"; + String srcFilePath = filename + ".xlsx"; + ExcelUtils.write(response, srcFilePath, "数据", RefundApplyExcelVO.class, datas); + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); +// response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + // 创建缓冲输入流 + try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFilePath)); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[4096]; + int bytesRead; + + // 读取并写入文件 + while ((bytesRead = bis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + + log.info("end export"); + + } + private void processImage(String imageUrl, Consumer> consumer) { + if (imageUrl != null && !imageUrl.isEmpty()) { + String[] result = extractFileNameAndType(imageUrl); + if (result == null) { + log.error("未找到有效的文件类型,URL: {}", imageUrl); + return; + } + + String tjpath = tjfilesProperties.getTjfilespath(); + + String filePath = tjpath + result[0] + "." + result[1]; +// String filePath = tjpath + result[0] + "." + result[1]; + String fileType = result[1]; + log.info("处理图片文件,路径: {}", filePath); + + + try { + // 压缩图片 + byte[] compressedImageBytes = compressImage(filePath, fileType); +// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); +// FileInputStream inputStream = new FileInputStream(filePath)) { +// +// byte[] buffer = new byte[1024 * 10]; +// int bytesRead; +// while ((bytesRead = inputStream.read(buffer)) != -1) { +// outputStream.write(buffer, 0, bytesRead); +// } +// +// byte[] fileBytes = outputStream.toByteArray(); +// log.info("文件读取成功,字节数组长度: {}", fileBytes.length); + + WriteCellData writeCellData = new WriteCellData<>(); + consumer.accept(writeCellData); + + writeCellData.setType(CellDataTypeEnum.EMPTY); + List imageDataList = new ArrayList<>(); + ImageData imageData = new ImageData(); + imageDataList.add(imageData); + writeCellData.setImageDataList(imageDataList); + + imageData.setImage(compressedImageBytes); + if ("jpg".equalsIgnoreCase(fileType) || "jpeg".equalsIgnoreCase(fileType)) { + imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_JPEG); + } else if ("png".equalsIgnoreCase(fileType)) { + imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG); + } + + imageData.setTop(2); + imageData.setRight(2); + imageData.setBottom(2); + imageData.setLeft(2); + + } catch (IOException e) { + log.error("处理图片文件时发生错误,URL: {}", imageUrl, e); + throw new RuntimeException("处理图片文件失败", e); + } + } + + } + private byte[] compressImage(String filePath, String fileType) throws IOException { + File originalFile = new File(filePath); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + + if ("jpg".equalsIgnoreCase(fileType) || "jpeg".equalsIgnoreCase(fileType)) { + Thumbnails.of(originalFile) + .scale(0.5) // 缩放比例为 0.5,可以根据需要调整 + .outputQuality(0.5) // 输出质量为 0.5,可以根据需要调整 + .outputFormat("jpg") + .toOutputStream(outputStream); + } else if ("png".equalsIgnoreCase(fileType)) { + Thumbnails.of(originalFile) + .scale(0.5) // 缩放比例为 0.5,可以根据需要调整 + .outputFormat("png") + .toOutputStream(outputStream); + } + + return outputStream.toByteArray(); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyBaseVO.java new file mode 100644 index 0000000..ff2a37c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyBaseVO.java @@ -0,0 +1,64 @@ +package com.jojubanking.boot.module.system.controller.admin.refundapply.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 就诊卡退费申请 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class RefundApplyBaseVO { + + @ApiModelProperty(value = "姓名", required = true) + @NotNull(message = "姓名不能为空") + private String refname; + + @ApiModelProperty(value = "身份证号码", required = true) + @NotNull(message = "身份证号码不能为空") + private String refidcard; + + @ApiModelProperty(value = "银行卡号", required = true) + @NotNull(message = "银行卡号不能为空") + private String refbankcard; + + @ApiModelProperty(value = "银行卡持卡人姓名", required = true) + @NotNull(message = "银行卡持卡人姓名不能为空") + private String refbankcardname; + + @ApiModelProperty(value = "银行类型", required = true) + @NotNull(message = "银行类型不能为空") + private String refbanktype; + + @ApiModelProperty(value = "手机号", required = true) + @NotNull(message = "手机号不能为空") + private String reftel; + + @ApiModelProperty(value = "身份证正面") + private String zidcard; + + @ApiModelProperty(value = "身份证正面", required = true) + @NotNull(message = "身份证正面不能为空") + private String zidcardimg; + + @ApiModelProperty(value = "身份证反面") + private String fidcard; + + @ApiModelProperty(value = "身份证反面") + private String fidcardimg; + + @ApiModelProperty(value = "银行卡正面") + private String zbankcard; + + @ApiModelProperty(value = "银行卡正面", required = true) + @NotNull(message = "银行卡正面不能为空") + private String zbankcardimg; + + @ApiModelProperty(value = "儿童三选一") + private String childidcard; + + @ApiModelProperty(value = "儿童三选一") + private String childidcardimg; +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyCreateReqVO.java new file mode 100644 index 0000000..3fa6feb --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.refundapply.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 就诊卡退费申请创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RefundApplyCreateReqVO extends RefundApplyBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyExcelVO.java new file mode 100644 index 0000000..6c8d919 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyExcelVO.java @@ -0,0 +1,87 @@ +package com.jojubanking.boot.module.system.controller.admin.refundapply.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.metadata.data.WriteCellData; +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 就诊卡退费申请 Excel VO + * + * @author admin + */ +@Data +public class RefundApplyExcelVO { + + @ExcelIgnore + private Long id; + + @ExcelProperty(value ={"姓名"},index = 0) + @ColumnWidth(value = 20) + private String refname; + + @ExcelProperty(value ={"身份证号码"},index = 1) + @ColumnWidth(value = 20) + private String refidcard; + + @ExcelProperty(value ={"银行卡号"},index = 2) + @ColumnWidth(value = 20) + private String refbankcard; + + @ExcelProperty(value ={"银行卡持卡人姓名"},index = 3) + @ColumnWidth(value = 22) + private String refbankcardname; + + @ExcelProperty(value ={"开户行"},index = 4) + @ColumnWidth(value = 20) + private String refbanktype; + + @ExcelProperty(value ={"手机号"},index = 5) + @ColumnWidth(value = 20) + private String reftel; + + @ExcelIgnore + private String zidcard; + + @ExcelIgnore + private String zidcardimg; + + @ExcelProperty(value ={"身份证正面"},index = 6) + @ColumnWidth(value = 60) + private WriteCellData writeCellDataFileIdcard; + + @ExcelIgnore + private String fidcard; + + @ExcelIgnore + private String fidcardimg; + + @ExcelIgnore + private String zbankcard; + + @ExcelIgnore + private String zbankcardimg; + + @ExcelProperty(value ={"银行卡正面"},index = 7) + @ColumnWidth(value = 60) + private WriteCellData writeCellDataFileBank; + + @ExcelIgnore + private String childidcard; + + @ExcelIgnore + private String childidcardimg; + + @ExcelProperty(value ={"儿童证件"},index = 8) + @ColumnWidth(value = 60) + private WriteCellData writeCellDataFileChild; + + @ExcelProperty("创建时间") + @ColumnWidth(value = 15) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyExportReqVO.java new file mode 100644 index 0000000..6836e0f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyExportReqVO.java @@ -0,0 +1,61 @@ +package com.jojubanking.boot.module.system.controller.admin.refundapply.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 就诊卡退费申请 Excel 导出 Request VO", description = "参数和 RefundApplyPageReqVO 是一致的") +@Data +public class RefundApplyExportReqVO { + + @ApiModelProperty(value = "姓名") + private String refname; + + @ApiModelProperty(value = "身份证号码") + private String refidcard; + + @ApiModelProperty(value = "银行卡号") + private String refbankcard; + + @ApiModelProperty(value = "银行卡持卡人姓名") + private String refbankcardname; + + @ApiModelProperty(value = "银行类型") + private String refbanktype; + + @ApiModelProperty(value = "手机号") + private String reftel; + + @ApiModelProperty(value = "身份证正面") + private String zidcard; + + @ApiModelProperty(value = "身份证正面") + private String zidcardimg; + + @ApiModelProperty(value = "身份证反面") + private String fidcard; + + @ApiModelProperty(value = "身份证反面") + private String fidcardimg; + + @ApiModelProperty(value = "银行卡正面") + private String zbankcard; + + @ApiModelProperty(value = "银行卡正面") + private String zbankcardimg; + + @ApiModelProperty(value = "儿童三选一") + private String childidcard; + + @ApiModelProperty(value = "儿童三选一") + private String childidcardimg; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyPageReqVO.java new file mode 100644 index 0000000..7c218e8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyPageReqVO.java @@ -0,0 +1,63 @@ +package com.jojubanking.boot.module.system.controller.admin.refundapply.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 就诊卡退费申请分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RefundApplyPageReqVO extends PageParam { + + @ApiModelProperty(value = "姓名") + private String refname; + + @ApiModelProperty(value = "身份证号码") + private String refidcard; + + @ApiModelProperty(value = "银行卡号") + private String refbankcard; + + @ApiModelProperty(value = "银行卡持卡人姓名") + private String refbankcardname; + + @ApiModelProperty(value = "银行类型") + private String refbanktype; + + @ApiModelProperty(value = "手机号") + private String reftel; + + @ApiModelProperty(value = "身份证正面") + private String zidcard; + + @ApiModelProperty(value = "身份证正面") + private String zidcardimg; + + @ApiModelProperty(value = "身份证反面") + private String fidcard; + + @ApiModelProperty(value = "身份证反面") + private String fidcardimg; + + @ApiModelProperty(value = "银行卡正面") + private String zbankcard; + + @ApiModelProperty(value = "银行卡正面") + private String zbankcardimg; + + @ApiModelProperty(value = "儿童三选一") + private String childidcard; + + @ApiModelProperty(value = "儿童三选一") + private String childidcardimg; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyRespVO.java new file mode 100644 index 0000000..ef00e59 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.refundapply.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 就诊卡退费申请 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RefundApplyRespVO extends RefundApplyBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyUpdateReqVO.java new file mode 100644 index 0000000..96feb21 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.refundapply.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 就诊卡退费申请更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class RefundApplyUpdateReqVO extends RefundApplyBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/Reserve8Controller.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/Reserve8Controller.java new file mode 100644 index 0000000..83eae90 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/Reserve8Controller.java @@ -0,0 +1,101 @@ +package com.jojubanking.boot.module.system.controller.admin.reserve8; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.text.ParseException; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.reserve8.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.reserve8.Reserve8DO; +import com.jojubanking.boot.module.system.convert.reserve8.Reserve8Convert; +import com.jojubanking.boot.module.system.service.reserve8.Reserve8Service; + +@Api(tags = "管理后台 - 预约挂号") +@RestController +@RequestMapping("/system/reserve8") +@Validated +public class Reserve8Controller { + + @Resource + private Reserve8Service reserve8Service; + + @PostMapping("/create") + @ApiOperation("创建预约挂号") + @PreAuthorize("@ss.hasPermission('system:reserve8:create')") + public CommonResult createReserve8(@Valid @RequestBody Reserve8CreateReqVO createReqVO) { + return success(reserve8Service.createReserve8(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新预约挂号") + @PreAuthorize("@ss.hasPermission('system:reserve8:update')") + public CommonResult updateReserve8(@Valid @RequestBody Reserve8UpdateReqVO updateReqVO) { + reserve8Service.updateReserve8(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除预约挂号") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:reserve8:delete')") + public CommonResult deleteReserve8(@RequestParam("id") Integer id) { + reserve8Service.deleteReserve8(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得预约挂号") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:reserve8:query')") + public CommonResult getReserve8(@RequestParam("id") Integer id) { + Reserve8DO reserve8 = reserve8Service.getReserve8(id); + return success(Reserve8Convert.INSTANCE.convert(reserve8)); + } + + @GetMapping("/list") + @ApiOperation("获得预约挂号列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:reserve8:query')") + public CommonResult> getReserve8List(@RequestParam("ids") Collection ids) { + List list = reserve8Service.getReserve8List(ids); + return success(Reserve8Convert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得预约挂号分页") + @PreAuthorize("@ss.hasPermission('system:reserve8:query')") + public CommonResult> getReserve8Page(@Valid Reserve8PageReqVO pageVO) throws ParseException { + PageResult pageResult = reserve8Service.getReserve8Page(pageVO); + return success(Reserve8Convert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出预约挂号 Excel") + @PreAuthorize("@ss.hasPermission('system:reserve8:export')") + @OperateLog(type = EXPORT) + public void exportReserve8Excel(@Valid Reserve8ExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = reserve8Service.getReserve8List(exportReqVO); + // 导出 Excel + List datas = Reserve8Convert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "预约挂号.xls", "数据", Reserve8ExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8BaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8BaseVO.java new file mode 100644 index 0000000..afd1432 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8BaseVO.java @@ -0,0 +1,144 @@ +package com.jojubanking.boot.module.system.controller.admin.reserve8.vo; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import io.swagger.annotations.*; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 预约挂号 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class Reserve8BaseVO { + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "就诊卡id") + private Integer cardId; + + @ApiModelProperty(value = "病人名称") + private String name; + + @ApiModelProperty(value = "科室名称") + private String ksmc; + + @ApiModelProperty(value = "医生名称") + private String ysmc; + + @ApiModelProperty(value = "院区 ID") + private String subHospitalID; + + @ApiModelProperty(value = "票据编号") + private String reptNum; + + @ApiModelProperty(value = "操作类型") + private Integer lockType; + + @ApiModelProperty(value = "订单 ID") + private String hisOrderNO; + + @ApiModelProperty(value = "排班 ID") + private String scheduleId; + + @ApiModelProperty(value = "医生编码") + private String doctorCode; + + @ApiModelProperty(value = "科室编码") + private String departCode; + + @ApiModelProperty(value = "分时 ID") + private String parTimeId; + + @ApiModelProperty(value = "锁号时间") + private String lockTime; + + @ApiModelProperty(value = "患者 ID") + private String patientId; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "就诊序号") + private String serialNo; + + @ApiModelProperty(value = "就诊地址") + private String location; + + @ApiModelProperty(value = "号票编号") + private String ticketNo; + + @ApiModelProperty(value = "取号确认订单ID") + private String orderNo; + + @ApiModelProperty(value = "取号确认时间段") + private String timeInterval; + + @ApiModelProperty(value = "出诊日期") + private String registerdate; + + @ApiModelProperty(value = "诊查费") + private BigDecimal clinicFee; + + @ApiModelProperty(value = "挂号费") + private BigDecimal registrationFee; + + @ApiModelProperty(value = "收费性质") + private Integer payNature; + + @ApiModelProperty(value = "支付方式") + private String payType; + + @ApiModelProperty(value = "交易 ID") + private String powerTranID; + + @ApiModelProperty(value = "交易 卡号(扫码支付)") + private String powerTranCARD; + + @ApiModelProperty(value = "MISPOS终端号") + private String terminalId; + + @ApiModelProperty(value = "自费支付金额") + private BigDecimal zFAmount; + + @ApiModelProperty(value = "医保账户金额") + private BigDecimal yBZHAmount; + + @ApiModelProperty(value = "医保统筹金额") + private BigDecimal yBTCAmount; + + @ApiModelProperty(value = "医保结算信息") + private String yBOutMsg; + + @ApiModelProperty(value = "HIS 工号") + private String hisOperNum; + + @ApiModelProperty(value = "交易检索号(银行)") + private String referNo; + + @ApiModelProperty(value = "token") + private String token; + + @ApiModelProperty(value = "允许退号标志 N 不允许 Y 允许") + private String appFlag; + + @ApiModelProperty(value = "单据状态 1 已退费 0 正常") + private Integer appStatus; + + @ApiModelProperty(value = "1 预约挂号 2 今日挂号") + private Integer appType; + + @ApiModelProperty(value = "提交时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date ctime; + + @ApiModelProperty(value = "修改时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date utime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8CreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8CreateReqVO.java new file mode 100644 index 0000000..447b27b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8CreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.reserve8.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 预约挂号创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class Reserve8CreateReqVO extends Reserve8BaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8ExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8ExcelVO.java new file mode 100644 index 0000000..7498e75 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8ExcelVO.java @@ -0,0 +1,144 @@ +package com.jojubanking.boot.module.system.controller.admin.reserve8.vo; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 预约挂号 Excel VO + * + * @author admin + */ +@Data +public class Reserve8ExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("用户ID") + private Integer userId; + + @ExcelProperty("就诊卡id") + private Integer cardId; + + @ExcelProperty("病人名称") + private String name; + + @ExcelProperty("科室名称") + private String ksmc; + + @ExcelProperty("医生名称") + private String ysmc; + + @ExcelProperty("院区 ID") + private String subHospitalID; + + @ExcelProperty("票据编号") + private String reptNum; + + @ExcelProperty("操作类型") + private Integer lockType; + + @ExcelProperty("订单 ID") + private String hisOrderNO; + + @ExcelProperty("排班 ID") + private String scheduleId; + + @ExcelProperty("医生编码") + private String doctorCode; + + @ExcelProperty("科室编码") + private String departCode; + + @ExcelProperty("分时 ID") + private String parTimeId; + + @ExcelProperty("锁号时间") + private String lockTime; + + @ExcelProperty("患者 ID") + private String patientId; + + @ExcelProperty("手机号码") + private String mobile; + + @ExcelProperty("就诊序号") + private String serialNo; + + @ExcelProperty("就诊地址") + private String location; + + @ExcelProperty("号票编号") + private String ticketNo; + + @ExcelProperty("取号确认订单ID") + private String orderNo; + + @ExcelProperty("取号确认时间段") + private String timeInterval; + + @ExcelProperty("出诊日期") + private String registerdate; + + @ExcelProperty("诊查费") + private BigDecimal clinicFee; + + @ExcelProperty("挂号费") + private BigDecimal registrationFee; + + @ExcelProperty("收费性质") + private Integer payNature; + + @ExcelProperty("支付方式") + private String payType; + + @ExcelProperty("交易 ID") + private String powerTranID; + + @ExcelProperty("交易 卡号(扫码支付)") + private String powerTranCARD; + + @ExcelProperty("MISPOS终端号") + private String terminalId; + + @ExcelProperty("自费支付金额") + private BigDecimal zFAmount; + + @ExcelProperty("医保账户金额") + private BigDecimal yBZHAmount; + + @ExcelProperty("医保统筹金额") + private BigDecimal yBTCAmount; + + @ExcelProperty("医保结算信息") + private String yBOutMsg; + + @ExcelProperty("HIS 工号") + private String hisOperNum; + + @ExcelProperty("交易检索号(银行)") + private String referNo; + + @ExcelProperty("token") + private String token; + + @ExcelProperty("允许退号标志 N 不允许 Y 允许") + private String appFlag; + + @ExcelProperty("单据状态 1 已退费 0 正常") + private Integer appStatus; + + @ExcelProperty("1 预约挂号 2 今日挂号") + private Integer appType; + + @ExcelProperty("提交时间") + private Date ctime; + + @ExcelProperty("修改时间") + private Date utime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8ExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8ExportReqVO.java new file mode 100644 index 0000000..444f00d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8ExportReqVO.java @@ -0,0 +1,144 @@ +package com.jojubanking.boot.module.system.controller.admin.reserve8.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 预约挂号 Excel 导出 Request VO", description = "参数和 Reserve8PageReqVO 是一致的") +@Data +public class Reserve8ExportReqVO { + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "就诊卡id") + private Integer cardId; + + @ApiModelProperty(value = "病人名称") + private String name; + + @ApiModelProperty(value = "科室名称") + private String ksmc; + + @ApiModelProperty(value = "医生名称") + private String ysmc; + + @ApiModelProperty(value = "院区 ID") + private String subHospitalID; + + @ApiModelProperty(value = "票据编号") + private String reptNum; + + @ApiModelProperty(value = "操作类型") + private Integer lockType; + + @ApiModelProperty(value = "订单 ID") + private String hisOrderNO; + + @ApiModelProperty(value = "排班 ID") + private String scheduleId; + + @ApiModelProperty(value = "医生编码") + private String doctorCode; + + @ApiModelProperty(value = "科室编码") + private String departCode; + + @ApiModelProperty(value = "分时 ID") + private String parTimeId; + + @ApiModelProperty(value = "锁号时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] lockTime; + + @ApiModelProperty(value = "患者 ID") + private String patientId; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "就诊序号") + private String serialNo; + + @ApiModelProperty(value = "就诊地址") + private String location; + + @ApiModelProperty(value = "号票编号") + private String ticketNo; + + @ApiModelProperty(value = "取号确认订单ID") + private String orderNo; + + @ApiModelProperty(value = "取号确认时间段") + private String timeInterval; + + @ApiModelProperty(value = "出诊日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] registerdate; + + @ApiModelProperty(value = "诊查费") + private BigDecimal clinicFee; + + @ApiModelProperty(value = "挂号费") + private BigDecimal registrationFee; + + @ApiModelProperty(value = "收费性质") + private Integer payNature; + + @ApiModelProperty(value = "支付方式") + private String payType; + + @ApiModelProperty(value = "交易 ID") + private String powerTranID; + + @ApiModelProperty(value = "交易 卡号(扫码支付)") + private String powerTranCARD; + + @ApiModelProperty(value = "MISPOS终端号") + private String terminalId; + + @ApiModelProperty(value = "自费支付金额") + private BigDecimal zFAmount; + + @ApiModelProperty(value = "医保账户金额") + private BigDecimal yBZHAmount; + + @ApiModelProperty(value = "医保统筹金额") + private BigDecimal yBTCAmount; + + @ApiModelProperty(value = "医保结算信息") + private String yBOutMsg; + + @ApiModelProperty(value = "HIS 工号") + private String hisOperNum; + + @ApiModelProperty(value = "交易检索号(银行)") + private String referNo; + + @ApiModelProperty(value = "token") + private String token; + + @ApiModelProperty(value = "允许退号标志 N 不允许 Y 允许") + private String appFlag; + + @ApiModelProperty(value = "单据状态 1 已退费 0 正常") + private Integer appStatus; + + @ApiModelProperty(value = "1 预约挂号 2 今日挂号") + private Integer appType; + + @ApiModelProperty(value = "提交时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] ctime; + + @ApiModelProperty(value = "修改时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] utime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8PageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8PageReqVO.java new file mode 100644 index 0000000..322faf8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8PageReqVO.java @@ -0,0 +1,148 @@ +package com.jojubanking.boot.module.system.controller.admin.reserve8.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 预约挂号分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class Reserve8PageReqVO extends PageParam { + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "就诊卡id") + private Integer cardId; + + @ApiModelProperty(value = "病人名称") + private String name; + + @ApiModelProperty(value = "科室名称") + private String ksmc; + + @ApiModelProperty(value = "医生名称") + private String ysmc; + + @ApiModelProperty(value = "院区 ID") + private String subHospitalID; + + @ApiModelProperty(value = "票据编号") + private String reptNum; + + @ApiModelProperty(value = "操作类型") + private Integer lockType; + + @ApiModelProperty(value = "订单 ID") + private String hisOrderNO; + + @ApiModelProperty(value = "排班 ID") + private String scheduleId; + + @ApiModelProperty(value = "医生编码") + private String doctorCode; + + @ApiModelProperty(value = "科室编码") + private String departCode; + + @ApiModelProperty(value = "分时 ID") + private String parTimeId; + + @ApiModelProperty(value = "锁号时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] lockTime; + + @ApiModelProperty(value = "患者 ID") + private String patientId; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "就诊序号") + private String serialNo; + + @ApiModelProperty(value = "就诊地址") + private String location; + + @ApiModelProperty(value = "号票编号") + private String ticketNo; + + @ApiModelProperty(value = "取号确认订单ID") + private String orderNo; + + @ApiModelProperty(value = "取号确认时间段") + private String timeInterval; + + @ApiModelProperty(value = "出诊日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] registerdate; + + @ApiModelProperty(value = "诊查费") + private BigDecimal clinicFee; + + @ApiModelProperty(value = "挂号费") + private BigDecimal registrationFee; + + @ApiModelProperty(value = "收费性质") + private Integer payNature; + + @ApiModelProperty(value = "支付方式") + private String payType; + + @ApiModelProperty(value = "交易 ID") + private String powerTranID; + + @ApiModelProperty(value = "交易 卡号(扫码支付)") + private String powerTranCARD; + + @ApiModelProperty(value = "MISPOS终端号") + private String terminalId; + + @ApiModelProperty(value = "自费支付金额") + private BigDecimal zFAmount; + + @ApiModelProperty(value = "医保账户金额") + private BigDecimal yBZHAmount; + + @ApiModelProperty(value = "医保统筹金额") + private BigDecimal yBTCAmount; + + @ApiModelProperty(value = "医保结算信息") + private String yBOutMsg; + + @ApiModelProperty(value = "HIS 工号") + private String hisOperNum; + + @ApiModelProperty(value = "交易检索号(银行)") + private String referNo; + + @ApiModelProperty(value = "token") + private String token; + + @ApiModelProperty(value = "允许退号标志 N 不允许 Y 允许") + private String appFlag; + + @ApiModelProperty(value = "单据状态 1 已退费 0 正常") + private Integer appStatus; + + @ApiModelProperty(value = "1 预约挂号 2 今日挂号") + private Integer appType; + + @ApiModelProperty(value = "提交时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] ctime; + + @ApiModelProperty(value = "修改时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] utime; + + private String startDate; + private String endDate; +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8RespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8RespVO.java new file mode 100644 index 0000000..4f68bac --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8RespVO.java @@ -0,0 +1,16 @@ +package com.jojubanking.boot.module.system.controller.admin.reserve8.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 预约挂号 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class Reserve8RespVO extends Reserve8BaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8UpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8UpdateReqVO.java new file mode 100644 index 0000000..75d6b35 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8UpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.reserve8.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 预约挂号更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class Reserve8UpdateReqVO extends Reserve8BaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/SensitiveWordController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/SensitiveWordController.http new file mode 100644 index 0000000..cd97d2d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/SensitiveWordController.http @@ -0,0 +1,4 @@ +### 请求 /system/sensitive-word/validate-text 接口 => 成功 +GET {{baseUrl}}/system/sensitive-word/validate-text?text=XXX&tags=短信&tags=蔬菜 +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/SensitiveWordController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/SensitiveWordController.java new file mode 100644 index 0000000..7e294c1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/SensitiveWordController.java @@ -0,0 +1,105 @@ +package com.jojubanking.boot.module.system.controller.admin.sensitiveword; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.*; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.*; +import com.jojubanking.boot.module.system.convert.sensitiveword.SensitiveWordConvert; +import com.jojubanking.boot.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; +import com.jojubanking.boot.module.system.service.sensitiveword.SensitiveWordService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; +import java.util.Set; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 敏感词") +@RestController +@RequestMapping("/system/sensitive-word") +@Validated +public class SensitiveWordController { + + @Resource + private SensitiveWordService sensitiveWordService; + + @PostMapping("/create") + @ApiOperation("创建敏感词") + @PreAuthorize("@ss.hasPermission('system:sensitive-word:create')") + public CommonResult createSensitiveWord(@Valid @RequestBody SensitiveWordCreateReqVO createReqVO) { + return success(sensitiveWordService.createSensitiveWord(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新敏感词") + @PreAuthorize("@ss.hasPermission('system:sensitive-word:update')") + public CommonResult updateSensitiveWord(@Valid @RequestBody SensitiveWordUpdateReqVO updateReqVO) { + sensitiveWordService.updateSensitiveWord(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除敏感词") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:sensitive-word:delete')") + public CommonResult deleteSensitiveWord(@RequestParam("id") Long id) { + sensitiveWordService.deleteSensitiveWord(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得敏感词") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:sensitive-word:query')") + public CommonResult getSensitiveWord(@RequestParam("id") Long id) { + SensitiveWordDO sensitiveWord = sensitiveWordService.getSensitiveWord(id); + return success(SensitiveWordConvert.INSTANCE.convert(sensitiveWord)); + } + + @GetMapping("/page") + @ApiOperation("获得敏感词分页") + @PreAuthorize("@ss.hasPermission('system:sensitive-word:query')") + public CommonResult> getSensitiveWordPage(@Valid SensitiveWordPageReqVO pageVO) { + PageResult pageResult = sensitiveWordService.getSensitiveWordPage(pageVO); + return success(SensitiveWordConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出敏感词 Excel") + @PreAuthorize("@ss.hasPermission('system:sensitive-word:export')") + @OperateLog(type = EXPORT) + public void exportSensitiveWordExcel(@Valid SensitiveWordExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = sensitiveWordService.getSensitiveWordList(exportReqVO); + // 导出 Excel + List datas = SensitiveWordConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "敏感词.xls", "数据", SensitiveWordExcelVO.class, datas); + } + + @GetMapping("/get-tags") + @ApiOperation("获取所有敏感词的标签数组") + @PreAuthorize("@ss.hasPermission('system:sensitive-word:query')") + public CommonResult> getSensitiveWordTags() throws IOException { + return success(sensitiveWordService.getSensitiveWordTags()); + } + + @GetMapping("/validate-text") + @ApiOperation("获得文本所包含的不合法的敏感词数组") + public CommonResult> validateText(@RequestParam("text") String text, + @RequestParam(value = "tags", required = false) List tags) { + return success(sensitiveWordService.validateText(text, tags)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordBaseVO.java new file mode 100644 index 0000000..f9c5fa7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordBaseVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** +* 敏感词 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class SensitiveWordBaseVO { + + @ApiModelProperty(value = "敏感词", required = true, example = "敏感词") + @NotNull(message = "敏感词不能为空") + private String name; + + @ApiModelProperty(value = "标签", required = true, example = "短信,评论") + @NotNull(message = "标签不能为空") + private List tags; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") + @NotNull(message = "状态不能为空") + private Integer status; + + @ApiModelProperty(value = "描述", example = "污言秽语") + private String description; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordCreateReqVO.java new file mode 100644 index 0000000..760cae5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("管理后台 - 敏感词创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SensitiveWordCreateReqVO extends SensitiveWordBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordExcelVO.java new file mode 100644 index 0000000..ad552c3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordExcelVO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * 敏感词 Excel VO + * + * @author 永不言败 + */ +@Data +public class SensitiveWordExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("敏感词") + private String name; + + @ExcelProperty("标签") + private List tags; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @ExcelProperty("描述") + private String description; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordExportReqVO.java new file mode 100644 index 0000000..9550bdd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordExportReqVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 敏感词 Excel 导出 Request VO", description = "参数和 SensitiveWordPageReqVO 是一致的") +@Data +public class SensitiveWordExportReqVO { + + @ApiModelProperty(value = "敏感词", example = "敏感词") + private String name; + + @ApiModelProperty(value = "标签", example = "短信,评论") + private String tag; + + @ApiModelProperty(value = "状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordPageReqVO.java new file mode 100644 index 0000000..9daa61e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordPageReqVO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 敏感词分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SensitiveWordPageReqVO extends PageParam { + + @ApiModelProperty(value = "敏感词", example = "敏感词") + private String name; + + @ApiModelProperty(value = "标签", example = "短信,评论") + private String tag; + + @ApiModelProperty(value = "状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordRespVO.java new file mode 100644 index 0000000..b0b6c58 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordRespVO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 敏感词 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SensitiveWordRespVO extends SensitiveWordBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordUpdateReqVO.java new file mode 100644 index 0000000..b372fe8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordUpdateReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 敏感词更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SensitiveWordUpdateReqVO extends SensitiveWordBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsCallbackController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsCallbackController.java new file mode 100644 index 0000000..ad74825 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsCallbackController.java @@ -0,0 +1,62 @@ +package com.jojubanking.boot.module.system.controller.admin.sms; + +import cn.hutool.core.util.URLUtil; +import cn.hutool.extra.servlet.ServletUtil; +import com.jojubanking.boot.module.system.service.sms.SmsSendService; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.framework.sms.core.enums.SmsChannelEnum; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletRequest; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - 短信回调") +@RestController +@RequestMapping("/system/sms/callback") +public class SmsCallbackController { + + @Resource + private SmsSendService smsSendService; + + @PostMapping("/yunpian") + @PermitAll + @ApiOperation(value = "云片短信的回调", notes = "参见 https://www.yunpian.com/official/document/sms/zh_cn/domestic_push_report 文档") + @ApiImplicitParam(name = "sms_status", value = "发送状态", required = true, example = "[{具体内容}]", dataTypeClass = String.class) + @OperateLog(enable = false) + public String receiveYunpianSmsStatus(@RequestParam("sms_status") String smsStatus) throws Throwable { + String text = URLUtil.decode(smsStatus); // decode 解码参数,因为它被 encode + smsSendService.receiveSmsStatus(SmsChannelEnum.YUN_PIAN.getCode(), text); + return "SUCCESS"; // 约定返回 SUCCESS 为成功 + } + + @PostMapping("/aliyun") + @PermitAll + @ApiOperation(value = "阿里云短信的回调", notes = "参见 https://help.aliyun.com/document_detail/120998.html 文档") + @OperateLog(enable = false) + public CommonResult receiveAliyunSmsStatus(HttpServletRequest request) throws Throwable { + String text = ServletUtil.getBody(request); + smsSendService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text); + return success(true); + } + + @PostMapping("/tencent") + @PermitAll + @ApiOperation(value = "腾讯云短信的回调", notes = "参见 https://cloud.tencent.com/document/product/382/52077 文档") + @OperateLog(enable = false) + public CommonResult receiveTencentSmsStatus(HttpServletRequest request) throws Throwable { + String text = ServletUtil.getBody(request); + smsSendService.receiveSmsStatus(SmsChannelEnum.TENCENT.getCode(), text); + return success(true); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsChannelController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsChannelController.java new file mode 100644 index 0000000..0fe4446 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsChannelController.java @@ -0,0 +1,81 @@ +package com.jojubanking.boot.module.system.controller.admin.sms; + +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.*; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.*; +import com.jojubanking.boot.module.system.convert.sms.SmsChannelConvert; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsChannelDO; +import com.jojubanking.boot.module.system.service.sms.SmsChannelService; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Comparator; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - 短信渠道") +@RestController +@RequestMapping("system/sms-channel") +public class SmsChannelController { + + @Resource + private SmsChannelService smsChannelService; + + @PostMapping("/create") + @ApiOperation("创建短信渠道") + @PreAuthorize("@ss.hasPermission('system:sms-channel:create')") + public CommonResult createSmsChannel(@Valid @RequestBody SmsChannelCreateReqVO createReqVO) { + return success(smsChannelService.createSmsChannel(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新短信渠道") + @PreAuthorize("@ss.hasPermission('system:sms-channel:update')") + public CommonResult updateSmsChannel(@Valid @RequestBody SmsChannelUpdateReqVO updateReqVO) { + smsChannelService.updateSmsChannel(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除短信渠道") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:sms-channel:delete')") + public CommonResult deleteSmsChannel(@RequestParam("id") Long id) { + smsChannelService.deleteSmsChannel(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得短信渠道") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") + public CommonResult getSmsChannel(@RequestParam("id") Long id) { + SmsChannelDO smsChannel = smsChannelService.getSmsChannel(id); + return success(SmsChannelConvert.INSTANCE.convert(smsChannel)); + } + + @GetMapping("/page") + @ApiOperation("获得短信渠道分页") + @PreAuthorize("@ss.hasPermission('system:sms-channel:query')") + public CommonResult> getSmsChannelPage(@Valid SmsChannelPageReqVO pageVO) { + PageResult pageResult = smsChannelService.getSmsChannelPage(pageVO); + return success(SmsChannelConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获得短信渠道精简列表", notes = "包含被禁用的短信渠道") + public CommonResult> getSimpleSmsChannels() { + List list = smsChannelService.getSmsChannelList(); + // 排序后,返回给前端 + list.sort(Comparator.comparing(SmsChannelDO::getId)); + return success(SmsChannelConvert.INSTANCE.convertList03(list)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsLogController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsLogController.java new file mode 100644 index 0000000..1721f44 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsLogController.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.module.system.controller.admin.sms; + +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogExcelVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogRespVO; +import com.jojubanking.boot.module.system.convert.sms.SmsLogConvert; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsLogDO; +import com.jojubanking.boot.module.system.service.sms.SmsLogService; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 短信日志") +@RestController +@RequestMapping("/system/sms-log") +@Validated +public class SmsLogController { + + @Resource + private SmsLogService smsLogService; + + @GetMapping("/page") + @ApiOperation("获得短信日志分页") + @PreAuthorize("@ss.hasPermission('system:sms-log:query')") + public CommonResult> getSmsLogPage(@Valid SmsLogPageReqVO pageVO) { + PageResult pageResult = smsLogService.getSmsLogPage(pageVO); + return success(SmsLogConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出短信日志 Excel") + @PreAuthorize("@ss.hasPermission('system:sms-log:export')") + @OperateLog(type = EXPORT) + public void exportSmsLogExcel(@Valid SmsLogExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = smsLogService.getSmsLogList(exportReqVO); + // 导出 Excel + List datas = SmsLogConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "短信日志.xls", "数据", SmsLogExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsTemplateController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsTemplateController.http new file mode 100644 index 0000000..e8213e5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsTemplateController.http @@ -0,0 +1,14 @@ +### 请求 /system/sms-template/send-sms 接口 => 成功 +POST {{baseUrl}}/system/sms-template/send-sms +Authorization: Bearer {{token}} +Content-Type: application/json +tenant-id: {{adminTenentId}} + +{ + "templateCode": "test_01", + "mobile": "156016913900", + "params": { + "key01": "value01", + "key02": "value02" + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsTemplateController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsTemplateController.java new file mode 100644 index 0000000..ac1fe7e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/SmsTemplateController.java @@ -0,0 +1,99 @@ +package com.jojubanking.boot.module.system.controller.admin.sms; + +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.*; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.*; +import com.jojubanking.boot.module.system.convert.sms.SmsTemplateConvert; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.jojubanking.boot.module.system.service.sms.SmsTemplateService; +import com.jojubanking.boot.module.system.service.sms.SmsSendService; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 短信模板") +@RestController +@RequestMapping("/system/sms-template") +public class SmsTemplateController { + + @Resource + private SmsTemplateService smsTemplateService; + @Resource + private SmsSendService smsSendService; + + @PostMapping("/create") + @ApiOperation("创建短信模板") + @PreAuthorize("@ss.hasPermission('system:sms-template:create')") + public CommonResult createSmsTemplate(@Valid @RequestBody SmsTemplateCreateReqVO createReqVO) { + return success(smsTemplateService.createSmsTemplate(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新短信模板") + @PreAuthorize("@ss.hasPermission('system:sms-template:update')") + public CommonResult updateSmsTemplate(@Valid @RequestBody SmsTemplateUpdateReqVO updateReqVO) { + smsTemplateService.updateSmsTemplate(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除短信模板") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:sms-template:delete')") + public CommonResult deleteSmsTemplate(@RequestParam("id") Long id) { + smsTemplateService.deleteSmsTemplate(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得短信模板") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:sms-template:query')") + public CommonResult getSmsTemplate(@RequestParam("id") Long id) { + SmsTemplateDO smsTemplate = smsTemplateService.getSmsTemplate(id); + return success(SmsTemplateConvert.INSTANCE.convert(smsTemplate)); + } + + @GetMapping("/page") + @ApiOperation("获得短信模板分页") + @PreAuthorize("@ss.hasPermission('system:sms-template:query')") + public CommonResult> getSmsTemplatePage(@Valid SmsTemplatePageReqVO pageVO) { + PageResult pageResult = smsTemplateService.getSmsTemplatePage(pageVO); + return success(SmsTemplateConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出短信模板 Excel") + @PreAuthorize("@ss.hasPermission('system:sms-template:export')") + @OperateLog(type = EXPORT) + public void exportSmsTemplateExcel(@Valid SmsTemplateExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = smsTemplateService.getSmsTemplateList(exportReqVO); + // 导出 Excel + List datas = SmsTemplateConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "短信模板.xls", "数据", SmsTemplateExcelVO.class, datas); + } + + @PostMapping("/send-sms") + @ApiOperation("发送短信") + @PreAuthorize("@ss.hasPermission('system:sms-template:send-sms')") + public CommonResult sendSms(@Valid @RequestBody SmsTemplateSendReqVO sendReqVO) { + return success(smsSendService.sendSingleSmsToAdmin(sendReqVO.getMobile(), null, + sendReqVO.getTemplateCode(), sendReqVO.getTemplateParams())); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelBaseVO.java new file mode 100644 index 0000000..95324e6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelBaseVO.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.channel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.NotNull; + +/** +* 短信渠道 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class SmsChannelBaseVO { + + @ApiModelProperty(value = "短信签名", required = true, example = "TW") + @NotNull(message = "短信签名不能为空") + private String signature; + + @ApiModelProperty(value = "启用状态", required = true, example = "1") + @NotNull(message = "启用状态不能为空") + private Integer status; + + @ApiModelProperty(value = "备注", example = "好吃!") + private String remark; + + @ApiModelProperty(value = "短信 API 的账号", required = true, example = "joju") + @NotNull(message = "短信 API 的账号不能为空") + private String apiKey; + + @ApiModelProperty(value = "短信 API 的密钥", example = "yuanma") + private String apiSecret; + + @ApiModelProperty(value = "短信发送回调 URL", example = "http://www.iocoder.cn") + @URL(message = "回调 URL 格式不正确") + private String callbackUrl; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelCreateReqVO.java new file mode 100644 index 0000000..5a3c603 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelCreateReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 短信渠道创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsChannelCreateReqVO extends SmsChannelBaseVO { + + @ApiModelProperty(value = "渠道编码", required = true, example = "YUN_PIAN", notes = "参见 SmsChannelEnum 枚举类") + @NotNull(message = "渠道编码不能为空") + private String code; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java new file mode 100644 index 0000000..ae66a33 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.channel; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 短信渠道分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsChannelPageReqVO extends PageParam { + + @ApiModelProperty(value = "任务状态", example = "1") + private Integer status; + + @ApiModelProperty(value = "短信签名", example = "TW", notes = "模糊匹配") + private String signature; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java new file mode 100644 index 0000000..8a28f12 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 短信渠道 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsChannelRespVO extends SmsChannelBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "渠道编码", required = true, example = "YUN_PIAN", notes = "参见 SmsChannelEnum 枚举类") + private String code; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java new file mode 100644 index 0000000..f6f3ad1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 短信渠道精简 Response VO") +@Data +public class SmsChannelSimpleRespVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + + @ApiModelProperty(value = "短信签名", required = true, example = "TW") + @NotNull(message = "短信签名不能为空") + private String signature; + + @ApiModelProperty(value = "渠道编码", required = true, example = "YUN_PIAN", notes = "参见 SmsChannelEnum 枚举类") + private String code; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelUpdateReqVO.java new file mode 100644 index 0000000..95ec8e8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelUpdateReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.channel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 短信渠道更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsChannelUpdateReqVO extends SmsChannelBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.java new file mode 100644 index 0000000..cd3cca4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.log; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.framework.excel.core.convert.JsonConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; +import java.util.Map; + +/** + * 短信日志 Excel VO + * + * @author TW + */ +@Data +public class SmsLogExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty("短信渠道编号") + private Long channelId; + + @ExcelProperty("短信渠道编码") + private String channelCode; + + @ExcelProperty("模板编号") + private Long templateId; + + @ExcelProperty("模板编码") + private String templateCode; + + @ExcelProperty(value = "短信类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE) + private Integer templateType; + + @ExcelProperty("短信内容") + private String templateContent; + + @ExcelProperty(value = "短信参数", converter = JsonConvert.class) + private Map templateParams; + + @ExcelProperty("短信 API 的模板编号") + private String apiTemplateId; + + @ExcelProperty("手机号") + private String mobile; + + @ExcelProperty("用户编号") + private Long userId; + + @ExcelProperty(value = "用户类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_TYPE) + private Integer userType; + + @ExcelProperty(value = "发送状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_SEND_STATUS) + private Integer sendStatus; + + @ExcelProperty("发送时间") + private Date sendTime; + + @ExcelProperty("发送结果的编码") + private Integer sendCode; + + @ExcelProperty("发送结果的提示") + private String sendMsg; + + @ExcelProperty("短信 API 发送结果的编码") + private String apiSendCode; + + @ExcelProperty("短信 API 发送失败的提示") + private String apiSendMsg; + + @ExcelProperty("短信 API 发送返回的唯一请求 ID") + private String apiRequestId; + + @ExcelProperty("短信 API 发送返回的序号") + private String apiSerialNo; + + @ExcelProperty(value = "接收状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_RECEIVE_STATUS) + private Integer receiveStatus; + + @ExcelProperty("接收时间") + private Date receiveTime; + + @ExcelProperty("API 接收结果的编码") + private String apiReceiveCode; + + @ExcelProperty("API 接收结果的说明") + private String apiReceiveMsg; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.java new file mode 100644 index 0000000..f37da07 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.log; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 短信日志 Excel 导出 Request VO", description = "参数和 SmsLogPageReqVO 是一致的") +@Data +public class SmsLogExportReqVO { + + @ApiModelProperty(value = "短信渠道编号", example = "10") + private Long channelId; + + @ApiModelProperty(value = "模板编号", example = "20") + private Long templateId; + + @ApiModelProperty(value = "手机号", example = "15601691300") + private String mobile; + + @ApiModelProperty(value = "发送状态", example = "1") + private Integer sendStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始发送时间") + private Date[] sendTime; + + @ApiModelProperty(value = "接收状态", example = "0") + private Integer receiveStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "开始接收时间") + private Date[] receiveTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java new file mode 100644 index 0000000..fffd11d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.log; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 短信日志分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsLogPageReqVO extends PageParam { + + @ApiModelProperty(value = "短信渠道编号", example = "10") + private Long channelId; + + @ApiModelProperty(value = "模板编号", example = "20") + private Long templateId; + + @ApiModelProperty(value = "手机号", example = "15601691300") + private String mobile; + + @ApiModelProperty(value = "发送状态", example = "1", notes = "参见 SmsSendStatusEnum 枚举类") + private Integer sendStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "发送时间") + private Date[] sendTime; + + @ApiModelProperty(value = "接收状态", example = "0", notes = "参见 SmsReceiveStatusEnum 枚举类") + private Integer receiveStatus; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "接收时间") + private Date[] receiveTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java new file mode 100644 index 0000000..44a662f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java @@ -0,0 +1,89 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.log; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; +import java.util.Map; + +@ApiModel("管理后台 - 短信日志 Response VO") +@Data +public class SmsLogRespVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "短信渠道编号", required = true, example = "10") + private Long channelId; + + @ApiModelProperty(value = "短信渠道编码", required = true, example = "ALIYUN") + private String channelCode; + + @ApiModelProperty(value = "模板编号", required = true, example = "20") + private Long templateId; + + @ApiModelProperty(value = "模板编码", required = true, example = "test-01") + private String templateCode; + + @ApiModelProperty(value = "短信类型", required = true, example = "1") + private Integer templateType; + + @ApiModelProperty(value = "短信内容", required = true, example = "你好,你的验证码是 1024") + private String templateContent; + + @ApiModelProperty(value = "短信参数", required = true, example = "name,code") + private Map templateParams; + + @ApiModelProperty(value = "短信 API 的模板编号", required = true, example = "SMS_207945135") + private String apiTemplateId; + + @ApiModelProperty(value = "手机号", required = true, example = "15601691300") + private String mobile; + + @ApiModelProperty(value = "用户编号", example = "10") + private Long userId; + + @ApiModelProperty(value = "用户类型", example = "1") + private Integer userType; + + @ApiModelProperty(value = "发送状态", required = true, example = "1") + private Integer sendStatus; + + @ApiModelProperty(value = "发送时间") + private Date sendTime; + + @ApiModelProperty(value = "发送结果的编码", example = "0") + private Integer sendCode; + + @ApiModelProperty(value = "发送结果的提示", example = "成功") + private String sendMsg; + + @ApiModelProperty(value = "短信 API 发送结果的编码", example = "SUCCESS") + private String apiSendCode; + + @ApiModelProperty(value = "短信 API 发送失败的提示", example = "成功") + private String apiSendMsg; + + @ApiModelProperty(value = "短信 API 发送返回的唯一请求 ID", example = "3837C6D3-B96F-428C-BBB2-86135D4B5B99") + private String apiRequestId; + + @ApiModelProperty(value = "短信 API 发送返回的序号", example = "62923244790") + private String apiSerialNo; + + @ApiModelProperty(value = "接收状态", required = true, example = "0") + private Integer receiveStatus; + + @ApiModelProperty(value = "接收时间") + private Date receiveTime; + + @ApiModelProperty(value = "API 接收结果的编码", example = "DELIVRD") + private String apiReceiveCode; + + @ApiModelProperty(value = "API 接收结果的说明", example = "用户接收成功") + private String apiReceiveMsg; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.java new file mode 100644 index 0000000..4649679 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.template; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 短信模板 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class SmsTemplateBaseVO { + + @ApiModelProperty(value = "短信类型", required = true, example = "1", notes = "参见 SmsTemplateTypeEnum 枚举类") + @NotNull(message = "短信类型不能为空") + private Integer type; + + @ApiModelProperty(value = "开启状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") + @NotNull(message = "开启状态不能为空") + private Integer status; + + @ApiModelProperty(value = "模板编码", required = true, example = "test_01") + @NotNull(message = "模板编码不能为空") + private String code; + + @ApiModelProperty(value = "模板名称", required = true, example = "joju") + @NotNull(message = "模板名称不能为空") + private String name; + + @ApiModelProperty(value = "模板内容", required = true, example = "你好,{name}。你长的太{like}啦!") + @NotNull(message = "模板内容不能为空") + private String content; + + @ApiModelProperty(value = "备注", example = "哈哈哈") + private String remark; + + @ApiModelProperty(value = "短信 API 的模板编号", required = true, example = "4383920") + @NotNull(message = "短信 API 的模板编号不能为空") + private String apiTemplateId; + + @ApiModelProperty(value = "短信渠道编号", required = true, example = "10") + @NotNull(message = "短信渠道编号不能为空") + private Long channelId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateCreateReqVO.java new file mode 100644 index 0000000..5599614 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.template; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("管理后台 - 短信模板创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplateCreateReqVO extends SmsTemplateBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.java new file mode 100644 index 0000000..4f29b20 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.java @@ -0,0 +1,55 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.template; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 短信模板 Excel VO + * + * @author TW + */ +@Data +public class SmsTemplateExcelVO { + + @ExcelProperty("编号") + private Long id; + + @ExcelProperty(value = "短信签名", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE) + private Integer type; + + @ExcelProperty(value = "开启状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @ExcelProperty("模板编码") + private String code; + + @ExcelProperty("模板名称") + private String name; + + @ExcelProperty("模板内容") + private String content; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("短信 API 的模板编号") + private String apiTemplateId; + + @ExcelProperty("短信渠道编号") + private Long channelId; + + @ExcelProperty(value = "短信渠道编码", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_CHANNEL_CODE) + private String channelCode; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.java new file mode 100644 index 0000000..8e5dadc --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.template; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 短信模板 Excel 导出 Request VO", description = "参数和 SmsTemplatePageReqVO 是一致的") +@Data +public class SmsTemplateExportReqVO { + + @ApiModelProperty(value = "短信签名", example = "1") + private Integer type; + + @ApiModelProperty(value = "开启状态", example = "1") + private Integer status; + + @ApiModelProperty(value = "模板编码", example = "test_01", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "模板内容", example = "你好,{name}。你长的太{like}啦!", notes = "模糊匹配") + private String content; + + @ApiModelProperty(value = "短信 API 的模板编号", example = "4383920", notes = "模糊匹配") + private String apiTemplateId; + + @ApiModelProperty(value = "短信渠道编号", example = "10") + private Long channelId; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java new file mode 100644 index 0000000..c3ad755 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.template; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 短信模板分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplatePageReqVO extends PageParam { + + @ApiModelProperty(value = "短信签名", example = "1") + private Integer type; + + @ApiModelProperty(value = "开启状态", example = "1") + private Integer status; + + @ApiModelProperty(value = "模板编码", example = "test_01", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "模板内容", example = "你好,{name}。你长的太{like}啦!", notes = "模糊匹配") + private String content; + + @ApiModelProperty(value = "短信 API 的模板编号", example = "4383920", notes = "模糊匹配") + private String apiTemplateId; + + @ApiModelProperty(value = "短信渠道编号", example = "10") + private Long channelId; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java new file mode 100644 index 0000000..7777300 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.template; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; +import java.util.List; + +@ApiModel("管理后台 - 短信模板 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplateRespVO extends SmsTemplateBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "短信渠道编码", required = true, example = "ALIYUN") + private String channelCode; + + @ApiModelProperty(value = "参数数组", example = "name,code") + private List params; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java new file mode 100644 index 0000000..3110ee4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.template; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +@ApiModel("管理后台 - 短信模板的发送 Request VO") +@Data +public class SmsTemplateSendReqVO { + + @ApiModelProperty(value = "手机号", required = true, example = "15601691300") + @NotNull(message = "手机号不能为空") + private String mobile; + + @ApiModelProperty(value = "模板编码", required = true, example = "test_01") + @NotNull(message = "模板编码不能为空") + private String templateCode; + + @ApiModelProperty(value = "模板参数") + private Map templateParams; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateUpdateReqVO.java new file mode 100644 index 0000000..ab51e1d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateUpdateReqVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.sms.vo.template; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 短信模板更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplateUpdateReqVO extends SmsTemplateBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + @NotNull(message = "编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/socail/SocialUserController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/socail/SocialUserController.java new file mode 100644 index 0000000..95d6c5e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/socail/SocialUserController.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.controller.admin.socail; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.module.system.controller.admin.socail.vo.SocialUserBindReqVO; +import com.jojubanking.boot.module.system.controller.admin.socail.vo.SocialUserUnbindReqVO; +import com.jojubanking.boot.module.system.convert.social.SocialUserConvert; +import com.jojubanking.boot.module.system.service.social.SocialUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Api(tags = "管理后台 - 社交用户") +@RestController +@RequestMapping("/system/social-user") +@Validated +public class SocialUserController { + + @Resource + private SocialUserService socialUserService; + + @PostMapping("/bind") + @ApiOperation("社交绑定,使用 code 授权码") + public CommonResult socialBind(@RequestBody @Valid SocialUserBindReqVO reqVO) { + socialUserService.bindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO)); + return CommonResult.success(true); + } + + @DeleteMapping("/unbind") + @ApiOperation("取消社交绑定") + public CommonResult socialUnbind(@RequestBody SocialUserUnbindReqVO reqVO) { + socialUserService.unbindSocialUser(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO.getType(), reqVO.getOpenid()); + return CommonResult.success(true); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserBindReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserBindReqVO.java new file mode 100644 index 0000000..1a4e63f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserBindReqVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.controller.admin.socail.vo; + +import com.jojubanking.boot.module.system.enums.social.SocialTypeEnum; +import com.jojubanking.boot.framework.common.validation.InEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 社交绑定 Request VO,使用 code 授权码") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SocialUserBindReqVO { + + @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值") + @InEnum(SocialTypeEnum.class) + @NotNull(message = "社交平台的类型不能为空") + private Integer type; + + @ApiModelProperty(value = "授权码", required = true, example = "1024") + @NotEmpty(message = "授权码不能为空") + private String code; + + @ApiModelProperty(value = "state", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") + @NotEmpty(message = "state 不能为空") + private String state; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserUnbindReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserUnbindReqVO.java new file mode 100644 index 0000000..dfbf017 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserUnbindReqVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.socail.vo; + +import com.jojubanking.boot.framework.common.validation.InEnum; +import com.jojubanking.boot.module.system.enums.social.SocialTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 取消社交绑定 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SocialUserUnbindReqVO { + + @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值") + @InEnum(SocialTypeEnum.class) + @NotNull(message = "社交平台的类型不能为空") + private Integer type; + + @ApiModelProperty(value = "社交用户的 openid", required = true, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE") + @NotEmpty(message = "社交用户的 openid 不能为空") + private String openid; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/StudentController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/StudentController.java new file mode 100644 index 0000000..35168e0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/StudentController.java @@ -0,0 +1,337 @@ +package com.jojubanking.boot.module.system.controller.admin.student; + +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.data.ImageData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.google.zxing.WriterException; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.ChilditemPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.MzdmPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.MzdmRespVO; +import com.jojubanking.boot.module.system.controller.admin.order.vo.OrderExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserImportExcelVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserImportRespVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.XyrwListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.childitem.ChilditemDO; +import com.jojubanking.boot.module.system.dal.dataobject.mzdm.MzdmDO; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; +import com.jojubanking.boot.module.system.enums.common.SexEnum; +import com.jojubanking.boot.module.system.framework.tjfiles.TjfilesProperties; +import com.jojubanking.boot.module.system.service.childitem.ChilditemService; +import com.jojubanking.boot.module.system.service.mzdm.MzdmService; +import com.jojubanking.boot.module.system.service.order.OrderService; +import com.jojubanking.boot.module.system.service.xyrw.XyrwService; +import com.jojubanking.boot.module.system.util.xytj.DateDUtil; +import com.jojubanking.boot.module.system.util.xytj.Excel2PdfUtil; +import com.jojubanking.boot.module.system.util.xytj.VeDate; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.io.InputStreamResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.imageio.ImageIO; +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.URLEncoder; +import java.text.DecimalFormat; +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; +import static com.jojubanking.boot.module.system.util.xytj.BarCodeUtils.getBarCode; +import static com.jojubanking.boot.module.system.util.xytj.BarCodeUtils.insertWords; + +import com.jojubanking.boot.module.system.controller.admin.student.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.student.StudentDO; +import com.jojubanking.boot.module.system.convert.student.StudentConvert; +import com.jojubanking.boot.module.system.service.student.StudentService; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +@Api(tags = "管理后台 - 学生信息") +@RestController +@RequestMapping("/system/student") +@Validated +@Slf4j +public class StudentController { + @Resource + private TjfilesProperties tjfilesProperties; + + @Resource + private StudentService studentService; + @Resource + private XyrwService xyrwService; + @Resource + private ChilditemService childitemService; + @Resource + private OrderService orderService; + + @PostMapping("/create") + @ApiOperation("创建学生信息") + @PreAuthorize("@ss.hasPermission('system:student:create')") + public CommonResult createStudent(@Valid @RequestBody StudentCreateReqVO createReqVO) { + //获取下园批次,只取开始状态的批次 + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + + createReqVO.setStatus(0); + createReqVO.setFeeflag(0); +// createReqVO.setDeleted(false); +// createReqVO.setCreateTime(VeDate.getNowDate()); +// createReqVO.setUpdateTime(VeDate.getNowDate()); + createReqVO.setBatchno(listXyrw.get(0).getBatchno()); + createReqVO.setBatchname(listXyrw.get(0).getBatchName()); + createReqVO.setPatid("0"); + + return success(studentService.createStudent(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新学生信息") + @PreAuthorize("@ss.hasPermission('system:student:update')") + public CommonResult updateStudent(@Valid @RequestBody StudentUpdateReqVO updateReqVO) { + studentService.updateStudent(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除学生信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:student:delete')") + public CommonResult deleteStudent(@RequestParam("id") Long id) { + studentService.deleteStudent(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得学生信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:student:query')") + public CommonResult getStudent(@RequestParam("id") Long id) { + StudentDO student = studentService.getStudent(id); + return success(StudentConvert.INSTANCE.convert(student)); + } + + @GetMapping("/list") + @ApiOperation("获得学生信息列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:student:query')") + public CommonResult> getStudentList(@RequestParam("ids") Collection ids) { + List list = studentService.getStudentList(ids); + return success(StudentConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得学生信息分页") + @PreAuthorize("@ss.hasPermission('system:student:query')") + public CommonResult> getStudentPage(@Valid StudentPageReqVO pageVO) { + //获取下园批次,只取开始状态的批次 + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + + PageResult pageResult = studentService.getStudentPage(pageVO, listXyrw.get(0)); + return success(StudentConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/hispage") + @ApiOperation("获得学生信息分页") + @PreAuthorize("@ss.hasPermission('system:student:queryhis')") + public CommonResult> getStudentHisPage(@Valid StudentPageReqVO pageVO) { + //获取下园批次,只取开始状态的批次 + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + + PageResult pageResult = studentService.getStudentHisPage(pageVO, listXyrw.get(0)); + return success(StudentConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/importTemplate") + @ApiOperation("获得导入用户模板") + public void importTemplate(HttpServletResponse response) throws IOException { + + // 手动创建导出 demo + List list = Arrays.asList( + StudentExcelBaseVO.builder().name("张树杰").mobile("13857185597").className("小一班") + .schoolName("天使幼儿园").nationId("652829199609161401").build(), + StudentExcelBaseVO.builder().name("张树杰").mobile("13857185597").className("小一班") + .schoolName("天使幼儿园").nationId("652829199609161401").build() + ); + + // 输出 + ExcelUtils.write(response, "学生导入模板.xls", "用户列表", StudentExcelBaseVO.class, list); + } + + + @GetMapping("/export-excel") + @ApiOperation("导出学生信息 Excel") + @PreAuthorize("@ss.hasPermission('system:student:export')") + @OperateLog(type = EXPORT) + public void exportStudentExcel(@Valid StudentExportReqVO exportReqVO, + HttpServletResponse response) throws IOException, WriterException { +// List list = studentService.getStudentList(exportReqVO); + // 导出 Excel +// List datas = StudentConvert.INSTANCE.convertList02(list); +// ExcelUtils.write(response, "学生信息.xls", "数据", StudentExcelVO.class, datas); + + //获取下园批次,只取开始状态的批次 + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + String xyrwname = listXyrw.get(0).getBatchName(); + + log.info("start export"); + ChilditemPageReqVO pageVO = new ChilditemPageReqVO(); + pageVO.setPageSize(60); + //目前就一个基础项目,直接获取,节约生成时间 + Double number = 0.00; + DecimalFormat df = new DecimalFormat("0.00"); + pageVO.setPackageno("666"); + String strBaseXX = ""; + PageResult pageResult = childitemService.getChilditemPage(pageVO); + for(int j=0; j listmains = studentService.getStudentListForXy(exportReqVO); + + // 拼接数据 + List datas = StudentConvert.INSTANCE.convertList02(listmains); + + for(int i=0; i writeCellData = new WriteCellData<>(); + datas.get(i).setWriteCellDataFile(writeCellData); + // 这里可以设置为 EMPTY 则代表不需要其他数据了 + writeCellData.setType(CellDataTypeEnum.EMPTY); + List imageDataList = new ArrayList<>(); + ImageData imageData = new ImageData(); + imageDataList.add(imageData); + writeCellData.setImageDataList(imageDataList); + // 放入2进制图片 + imageData.setImage(qrCodeBytes); + // 图片类型 + imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG); + // 上 右 下 左 需要留空 + // 这个类似于 css 的 margin + // 这里实测 不能设置太大 超过单元格原始大小后 打开会提示修复。暂时未找到很好的解法。 + imageData.setTop(2); + imageData.setRight(2); + imageData.setBottom(2); + imageData.setLeft(2); + + + OrderReqVO.setPatid(datas.get(i).getPatid()); + OrderReqVO.setBatchno(listXyrw.get(0).getBatchno()); + OrderReqVO.setPackageflag(0); + OrderReqVO.setPaystatus("1"); + List xytjkxResult = orderService.getOrderList(OrderReqVO); + + String strkxmx = ""; + Double kxnumber = 0.00; + for(int k=0; k xytjStandResult = orderService.getOrderList(OrderReqVO); + if(xytjStandResult.size() !=0 ){ + datas.get(i).setTjpkgmx(strBaseXX); + datas.get(i).setTjpkgfee(df.format(number/100)); + } + } + + // 导出 Excel + String tjpath = tjfilesProperties.getTjfilespath(); + + //String filename = tjpath + DateDUtil.getCurrentDateTime() + "体检信息"; + String filename = tjpath + DateDUtil.getCurrentDateTime() + "体检信息"; + String srcFilePath = filename + ".xlsx"; + ExcelUtils.writexytj(response, xyrwname, srcFilePath, "数据", StudentExcelVO.class, datas); + + String pdfFilePath = filename + ".pdf"; + Excel2PdfUtil.excel2pdf(srcFilePath, pdfFilePath); + + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + response.setContentType("application/pdf;charset=UTF-8"); + + // 创建缓冲输入流 + try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(pdfFilePath)); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[4096]; + int bytesRead; + + // 读取并写入文件 + while ((bytesRead = bis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + + log.info("end export"); + } + + + @PostMapping("/import") + @ApiOperation("导入学生") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "Excel 文件", required = true, dataTypeClass = MultipartFile.class), + @ApiImplicitParam(name = "updateSupport", value = "是否支持更新,默认为 true", example = "true", dataTypeClass = Boolean.class) + }) + @PreAuthorize("@ss.hasPermission('system:student:import')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "true") Boolean updateSupport) throws Exception { + //获取下园批次,只取开始状态的批次 + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + + List list = ExcelUtils.read(file, StudentImportExcelVO.class); + return success(studentService.importUsers(list, updateSupport, listXyrw)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentBaseVO.java new file mode 100644 index 0000000..4dd7d72 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentBaseVO.java @@ -0,0 +1,73 @@ +package com.jojubanking.boot.module.system.controller.admin.student.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 学生信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class StudentBaseVO { + + @ApiModelProperty(value = "家长openid") + private String openid; + + @ApiModelProperty(value = "批次号") + private String batchno; + + @ApiModelProperty(value = "批次名称") + private String batchname; + + @ApiModelProperty(value = "病人唯一标识") + private String patid; + + @ApiModelProperty(value = "姓名", required = true) + @NotNull(message = "姓名不能为空") + private String name; + + @ApiModelProperty(value = "性别(1男 2女)", required = true) +// @NotNull(message = "性别(1男 2女)不能为空") + private Integer sex; + + @ApiModelProperty(value = "年龄", required = true) +// @NotNull(message = "年龄不能为空") + private Long age; + + @ApiModelProperty(value = "身份证号", required = true) + @NotNull(message = "身份证号不能为空") + private String nationId; + + @ApiModelProperty(value = "缴费标识") + private Integer feeflag; + + @ApiModelProperty(value = "班级ID") + private Long deptId; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "社区名称") + private String sqName; + + @ApiModelProperty(value = "街道名称") + private String jdName; + + @ApiModelProperty(value = "用户邮箱") + private String email; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "帐号状态(0正常 1停用)") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentCreateReqVO.java new file mode 100644 index 0000000..eb9d71c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.student.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 学生信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class StudentCreateReqVO extends StudentBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelBaseVO.java new file mode 100644 index 0000000..64cd66d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelBaseVO.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.system.controller.admin.student.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +//@ContentRowHeight(value = 30) +public class StudentExcelBaseVO { + @ExcelProperty(value ={"学校名称"},index = 0) + @ColumnWidth(value = 20) + private String schoolName; + + @ExcelProperty(value ={"班级名称"},index = 1) + @ColumnWidth(value = 15) + private String className; + + @ExcelProperty(value ={"姓名"},index = 2) + @ColumnWidth(value = 20) + private String name; + + @ExcelProperty(value ={"家长手机号"},index = 3) + @ColumnWidth(value = 15) + private String mobile; + + @ExcelProperty(value ={"身份证号"},index = 4) + @ColumnWidth(value = 20) + private String nationId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelVO.java new file mode 100644 index 0000000..6ebaecb --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelVO.java @@ -0,0 +1,129 @@ +package com.jojubanking.boot.module.system.controller.admin.student.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 学生信息 Excel VO + * + * @author admin + */ +@Data +@ContentRowHeight(value = 150) +public class StudentExcelVO { + +// @ExcelProperty("用户ID") + @ExcelIgnore + private Long id; + +// @ExcelProperty("家长openid") + @ExcelIgnore + private String openid; + +// @ExcelProperty("病人唯一标识") + @ExcelProperty(value ={"${bigHead}","就诊ID"},index = 0) + @ColumnWidth(value = 15) + private String patid; + +// @ExcelProperty("姓名") + @ExcelProperty(value ={"${bigHead}","姓名"},index = 3) + @ColumnWidth(value = 20) + private String name; + + @ExcelProperty(value ={"${bigHead}","性别"},index = 4, converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_SEX) + @ColumnWidth(value = 10) + private Integer sex; + + @ExcelProperty(value ={"${bigHead}","年龄"},index = 5) + @ColumnWidth(value = 10) + private Long age; + + @ExcelProperty(value ={"${bigHead}","身份证号"},index = 6) + @ColumnWidth(value = 20) + private String nationId; + + // @ExcelProperty("班级ID") + @ExcelIgnore + private Long deptId; + + @ExcelProperty(value ={"${bigHead}","部门"},index = 2) + @ColumnWidth(value = 15) + private String className; + + @ExcelProperty(value ={"${bigHead}","单位"},index = 1) + @ColumnWidth(value = 20) + private String schoolName; + + @ExcelProperty(value ={"${bigHead}","民族"},index = 7) + @ColumnWidth(value = 10) + private String sqName; + +// @ExcelProperty("街道名称") + @ExcelIgnore + private String jdName; + +// @ExcelProperty("用户邮箱") + @ExcelIgnore + private String email; + +// @ExcelProperty("手机号码") + @ExcelIgnore + private String mobile; + +// @ExcelProperty("备注") + @ExcelIgnore + private String remark; + +// @ExcelProperty("帐号状态(0正常 1停用)") + @ExcelIgnore + private Integer status; + +// @ExcelProperty("创建时间") + @ExcelIgnore + private Date createTime; + + @ExcelProperty(value ={"${bigHead}","乙肝两对半"},index = 8) + @ColumnWidth(value = 40) + private String tjpkgmx; + + @ExcelProperty(value ={"${bigHead}","乙肝两对半总额(元)"},index = 9) + @ColumnWidth(value = 25) + private String tjpkgfee; + + @ExcelProperty(value ={"${bigHead}","可选项目"},index = 10) + @ColumnWidth(value = 80) + private String tjkxmx; + + @ExcelProperty(value ={"${bigHead}","可选项目总额(元)"},index = 11) + @ColumnWidth(value = 20) + private String tjkxfee; + +// @ExcelProperty(value ={"${bigHead}","体检订单号"},index = 11) +// @ColumnWidth(value = 10) + @ExcelIgnore + private String orderno; + + @ExcelIgnore + private byte[] tjQrcode; + + @ExcelProperty(value ={"${bigHead}","缴费标识"},index = 12, converter = DictConvert.class) + @DictFormat(DictTypeConstants.FEE_FLAG) + @ColumnWidth(value = 15) + private Integer feeflag; + + @ExcelProperty(value ={"${bigHead}","体检二维码"},index = 13) + @ColumnWidth(value = 40) + private WriteCellData writeCellDataFile; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExportReqVO.java new file mode 100644 index 0000000..4ad2022 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExportReqVO.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.controller.admin.student.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 学生信息 Excel 导出 Request VO", description = "参数和 StudentPageReqVO 是一致的") +@Data +public class StudentExportReqVO { + + @ApiModelProperty(value = "家长openid") + private String openid; + + @ApiModelProperty(value = "批次号") + private String batchno; + + @ApiModelProperty(value = "病人唯一标识") + private String patid; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "性别(1男 2女)") + private Integer sex; + + @ApiModelProperty(value = "年龄") + private Long age; + + @ApiModelProperty(value = "身份证号") + private String nationId; + + @ApiModelProperty(value = "班级ID") + private Long deptId; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "社区名称") + private String sqName; + + @ApiModelProperty(value = "街道名称") + private String jdName; + + @ApiModelProperty(value = "用户邮箱") + private String email; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "帐号状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + + @ApiModelProperty(value = "缴费标识") + private Integer feeflag; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportExcelVO.java new file mode 100644 index 0000000..b29919f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportExcelVO.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.system.controller.admin.student.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 用户 Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class StudentImportExcelVO { + + @ExcelProperty("单位") + private String schoolName; + + @ExcelProperty("部门") + private String className; + + @ExcelProperty("姓名") + private String name; + + @ExcelProperty("民族") + private String sqName; + + @ExcelProperty("手机号") + private String mobile; + + @ExcelProperty("身份证号") + private String nationId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportRespVO.java new file mode 100644 index 0000000..89cbbe8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportRespVO.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.system.controller.admin.student.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@ApiModel("管理后台 - 学生导入 Response VO") +@Data +@Builder +public class StudentImportRespVO { + + @ApiModelProperty(value = "创建成功的用户名数组", required = true) + private List createStudentnames; + + @ApiModelProperty(value = "更新成功的用户名数组", required = true) + private List updateStudentnames; + + @ApiModelProperty(value = "导入失败的用户集合", required = true, notes = "key 为用户名,value 为失败原因") + private Map failureStudentnames; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageItemRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageItemRespVO.java new file mode 100644 index 0000000..7033d79 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageItemRespVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.controller.admin.student.vo; + +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserRespVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@ApiModel(value = "管理后台 - 用户分页时的信息 Response VO", description = "相比用户基本信息来说,会多部门信息") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class StudentPageItemRespVO extends StudentRespVO { + + /** + * 所在部门 + */ + private Dept dept; + + @ApiModel("部门") + @Data + public static class Dept { + + @ApiModelProperty(value = "部门编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "部门名称", required = true, example = "研发部") + private String name; + + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageReqVO.java new file mode 100644 index 0000000..6d84253 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageReqVO.java @@ -0,0 +1,75 @@ +package com.jojubanking.boot.module.system.controller.admin.student.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 学生信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class StudentPageReqVO extends PageParam { + + @ApiModelProperty(value = "家长openid") + private String openid; + + @ApiModelProperty(value = "批次号") + private String batchno; + + @ApiModelProperty(value = "批次名称") + private String batchname; + + @ApiModelProperty(value = "病人唯一标识") + private String patid; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "性别(1男 2女)") + private Integer sex; + + @ApiModelProperty(value = "年龄") + private Long age; + + @ApiModelProperty(value = "身份证号") + private String nationId; + + @ApiModelProperty(value = "班级ID") + private Long deptId; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "社区名称") + private String sqName; + + @ApiModelProperty(value = "街道名称") + private String jdName; + + @ApiModelProperty(value = "用户邮箱") + private String email; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "帐号状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty(value = "缴费标识(0否 1是 )") + private Integer feeflag; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentRespVO.java new file mode 100644 index 0000000..162e56e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.student.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 学生信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class StudentRespVO extends StudentBaseVO { + + @ApiModelProperty(value = "用户ID", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentUpdateReqVO.java new file mode 100644 index 0000000..a8e521a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.student.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 学生信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class StudentUpdateReqVO extends StudentBaseVO { + + @ApiModelProperty(value = "用户ID", required = true) + @NotNull(message = "用户ID不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/TenantController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/TenantController.http new file mode 100644 index 0000000..35d35f6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/TenantController.http @@ -0,0 +1,21 @@ +### 获取租户编号 /admin-api/system/get-id-by-name +GET {{baseUrl}}/system/tenant/get-id-by-name?name=TW + +### 创建租户 /admin-api/system/tenant/create +POST {{baseUrl}}/system/tenant/create +Content-Type: application/json +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} + +{ + "name": "芋道", + "contactName": "芋艿", + "contactMobile": "15601691300", + "status": 0, + "domain": "https://www.iocoder.cn", + "packageId": 110, + "expireTime": 1699545600000, + "accountCount": 20, + "username": "admin", + "password": "123321" +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/TenantController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/TenantController.java new file mode 100644 index 0000000..6d866ef --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/TenantController.java @@ -0,0 +1,99 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.*; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.*; +import com.jojubanking.boot.module.system.convert.tenant.TenantConvert; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantDO; +import com.jojubanking.boot.module.system.service.tenant.TenantService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 租户") +@RestController +@RequestMapping("/system/tenant") +public class TenantController { + + @Resource + private TenantService tenantService; + + @GetMapping("/get-id-by-name") + @PermitAll + @ApiOperation(value = "使用租户名,获得租户编号", notes = "登录界面,根据用户的租户名,获得租户编号") + @ApiImplicitParam(name = "name", value = "租户名", required = true, example = "1024", dataTypeClass = Long.class) + public CommonResult getTenantIdByName(@RequestParam("name") String name) { + TenantDO tenantDO = tenantService.getTenantByName(name); + return success(tenantDO != null ? tenantDO.getId() : null); + } + + @PostMapping("/create") + @ApiOperation("创建租户") + @PreAuthorize("@ss.hasPermission('system:tenant:create')") + public CommonResult createTenant(@Valid @RequestBody TenantCreateReqVO createReqVO) { + return success(tenantService.createTenant(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新租户") + @PreAuthorize("@ss.hasPermission('system:tenant:update')") + public CommonResult updateTenant(@Valid @RequestBody TenantUpdateReqVO updateReqVO) { + tenantService.updateTenant(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除租户") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:tenant:delete')") + public CommonResult deleteTenant(@RequestParam("id") Long id) { + tenantService.deleteTenant(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得租户") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:tenant:query')") + public CommonResult getTenant(@RequestParam("id") Long id) { + TenantDO tenant = tenantService.getTenant(id); + return success(TenantConvert.INSTANCE.convert(tenant)); + } + + @GetMapping("/page") + @ApiOperation("获得租户分页") + @PreAuthorize("@ss.hasPermission('system:tenant:query')") + public CommonResult> getTenantPage(@Valid TenantPageReqVO pageVO) { + PageResult pageResult = tenantService.getTenantPage(pageVO); + return success(TenantConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出租户 Excel") + @PreAuthorize("@ss.hasPermission('system:tenant:export')") + @OperateLog(type = EXPORT) + public void exportTenantExcel(@Valid TenantExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = tenantService.getTenantList(exportReqVO); + // 导出 Excel + List datas = TenantConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "租户.xls", "数据", TenantExcelVO.class, datas); + } + + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/TenantPackageController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/TenantPackageController.java new file mode 100644 index 0000000..d7434da --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/TenantPackageController.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.*; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.*; +import com.jojubanking.boot.module.system.convert.tenant.TenantPackageConvert; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantPackageDO; +import com.jojubanking.boot.module.system.service.tenant.TenantPackageService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "管理后台 - 租户套餐") +@RestController +@RequestMapping("/system/tenant-package") +@Validated +public class TenantPackageController { + + @Resource + private TenantPackageService tenantPackageService; + + @PostMapping("/create") + @ApiOperation("创建租户套餐") + @PreAuthorize("@ss.hasPermission('system:tenant-package:create')") + public CommonResult createTenantPackage(@Valid @RequestBody TenantPackageCreateReqVO createReqVO) { + return success(tenantPackageService.createTenantPackage(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新租户套餐") + @PreAuthorize("@ss.hasPermission('system:tenant-package:update')") + public CommonResult updateTenantPackage(@Valid @RequestBody TenantPackageUpdateReqVO updateReqVO) { + tenantPackageService.updateTenantPackage(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除租户套餐") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:tenant-package:delete')") + public CommonResult deleteTenantPackage(@RequestParam("id") Long id) { + tenantPackageService.deleteTenantPackage(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得租户套餐") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:tenant-package:query')") + public CommonResult getTenantPackage(@RequestParam("id") Long id) { + TenantPackageDO tenantPackage = tenantPackageService.getTenantPackage(id); + return success(TenantPackageConvert.INSTANCE.convert(tenantPackage)); + } + + @GetMapping("/page") + @ApiOperation("获得租户套餐分页") + @PreAuthorize("@ss.hasPermission('system:tenant-package:query')") + public CommonResult> getTenantPackagePage(@Valid TenantPackagePageReqVO pageVO) { + PageResult pageResult = tenantPackageService.getTenantPackagePage(pageVO); + return success(TenantPackageConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/get-simple-list") + @ApiOperation(value = "获取租户套餐精简信息列表", notes = "只包含被开启的租户套餐,主要用于前端的下拉选项") + public CommonResult> getTenantPackageList() { + // 获得角色列表,只要开启状态的 + List list = tenantPackageService.getTenantPackageListByStatus(CommonStatusEnum.ENABLE.getStatus()); + return success(TenantPackageConvert.INSTANCE.convertList02(list)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageBaseVO.java new file mode 100644 index 0000000..d7c950c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageBaseVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Set; + +/** +* 租户套餐 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class TenantPackageBaseVO { + + @ApiModelProperty(value = "套餐名", required = true, example = "VIP") + @NotNull(message = "套餐名不能为空") + private String name; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") + private Integer status; + + @ApiModelProperty(value = "备注", example = "好") + private String remark; + + @ApiModelProperty(value = "关联的菜单编号", required = true) + @NotNull(message = "关联的菜单编号不能为空") + private Set menuIds; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageCreateReqVO.java new file mode 100644 index 0000000..ecdb2ff --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@ApiModel("管理后台 - 租户套餐创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantPackageCreateReqVO extends TenantPackageBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackagePageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackagePageReqVO.java new file mode 100644 index 0000000..2efe958 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackagePageReqVO.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 租户套餐分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantPackagePageReqVO extends PageParam { + + @ApiModelProperty(value = "套餐名", example = "VIP") + private String name; + + @ApiModelProperty(value = "状态", example = "1") + private Integer status; + + @ApiModelProperty(value = "备注", example = "好") + private String remark; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageRespVO.java new file mode 100644 index 0000000..8c15eb8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageRespVO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +@ApiModel("管理后台 - 租户套餐 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantPackageRespVO extends TenantPackageBaseVO { + + @ApiModelProperty(value = "套餐编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageSimpleRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageSimpleRespVO.java new file mode 100644 index 0000000..cde297b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageSimpleRespVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 租户套餐精简 Response VO") +@Data +public class TenantPackageSimpleRespVO { + + @ApiModelProperty(value = "套餐编号", required = true, example = "1024") + @NotNull(message = "套餐编号不能为空") + private Long id; + + @ApiModelProperty(value = "套餐名", required = true, example = "VIP") + @NotNull(message = "套餐名不能为空") + private String name; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageUpdateReqVO.java new file mode 100644 index 0000000..a59cea9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageUpdateReqVO.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages; + +import lombok.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 租户套餐更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantPackageUpdateReqVO extends TenantPackageBaseVO { + + @ApiModelProperty(value = "套餐编号", required = true, example = "1024") + @NotNull(message = "套餐编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantBaseVO.java new file mode 100644 index 0000000..d9c8e4e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantBaseVO.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant; + +import lombok.*; +import io.swagger.annotations.*; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.*; +import java.util.Date; + +/** +* 租户 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class TenantBaseVO { + + @ApiModelProperty(value = "租户名", required = true, example = "芋道") + @NotNull(message = "租户名不能为空") + private String name; + + @ApiModelProperty(value = "联系人", required = true, example = "芋艿") + @NotNull(message = "联系人不能为空") + private String contactName; + + @ApiModelProperty(value = "联系手机", example = "15601691300") + private String contactMobile; + + @ApiModelProperty(value = "租户状态", required = true, example = "1") + @NotNull(message = "租户状态") + private Integer status; + + @ApiModelProperty(value = "绑定域名", example = "https://www.iocoder.cn") + @URL(message = "绑定域名的地址非 URL 格式") + private String domain; + + @ApiModelProperty(value = "租户套餐编号", required = true, example = "1024") + @NotNull(message = "租户套餐编号不能为空") + private Long packageId; + + @ApiModelProperty(value = "过期时间", required = true) + @NotNull(message = "过期时间不能为空") + private Date expireTime; + + @ApiModelProperty(value = "账号数量", required = true, example = "1024") + @NotNull(message = "账号数量不能为空") + private Integer accountCount; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantCreateReqVO.java new file mode 100644 index 0000000..8112bac --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantCreateReqVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant; + +import lombok.*; +import io.swagger.annotations.*; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +@ApiModel("管理后台 - 租户创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantCreateReqVO extends TenantBaseVO { + + @ApiModelProperty(value = "用户账号", required = true, example = "joju") + @NotBlank(message = "用户账号不能为空") + @Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成") + @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") + private String username; + + @ApiModelProperty(value = "密码", required = true, example = "123456") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantExcelVO.java new file mode 100644 index 0000000..d8f4efb --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantExcelVO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant; + +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import lombok.*; +import java.util.*; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; + + +/** + * 租户 Excel VO + * + * @author TW + */ +@Data +public class TenantExcelVO { + + @ExcelProperty("租户编号") + private Long id; + + @ExcelProperty("租户名") + private String name; + + @ExcelProperty("联系人") + private String contactName; + + @ExcelProperty("联系手机") + private String contactMobile; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantExportReqVO.java new file mode 100644 index 0000000..1256774 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantExportReqVO.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 租户 Excel 导出 Request VO", description = "参数和 TenantPageReqVO 是一致的") +@Data +public class TenantExportReqVO { + + @ApiModelProperty(value = "租户名", example = "芋道") + private String name; + + @ApiModelProperty(value = "联系人", example = "芋艿") + private String contactName; + + @ApiModelProperty(value = "联系手机", example = "15601691300") + private String contactMobile; + + @ApiModelProperty(value = "租户状态(0正常 1停用)", example = "1") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.java new file mode 100644 index 0000000..3d36b6a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 租户分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantPageReqVO extends PageParam { + + @ApiModelProperty(value = "租户名", example = "芋道") + private String name; + + @ApiModelProperty(value = "联系人", example = "芋艿") + private String contactName; + + @ApiModelProperty(value = "联系手机", example = "15601691300") + private String contactMobile; + + @ApiModelProperty(value = "租户状态(0正常 1停用)", example = "1") + private Integer status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + @ApiModelProperty(value = "创建时间") + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java new file mode 100644 index 0000000..01fbeed --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 租户 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantRespVO extends TenantBaseVO { + + @ApiModelProperty(value = "租户编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantUpdateReqVO.java new file mode 100644 index 0000000..13da5ef --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantUpdateReqVO.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant; + +import lombok.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 租户更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TenantUpdateReqVO extends TenantBaseVO { + + @ApiModelProperty(value = "租户编号", required = true, example = "1024") + @NotNull(message = "租户编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/UseCountController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/UseCountController.java new file mode 100644 index 0000000..6e40b8d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/UseCountController.java @@ -0,0 +1,416 @@ +package com.jojubanking.boot.module.system.controller.admin.usecount; + +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountToDO; +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountToDateDO; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.usecount.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountDO; +import com.jojubanking.boot.module.system.convert.usecount.UseCountConvert; +import com.jojubanking.boot.module.system.service.usecount.UseCountService; + +@Api(tags = "管理后台 - 统计") +@RestController +@RequestMapping("/system/use-count") +@Validated +public class UseCountController { + + @Resource + private UseCountService useCountService; + + @PostMapping("/create") + @ApiOperation("创建统计") + @PreAuthorize("@ss.hasPermission('system:use-count:create')") + public CommonResult createUseCount(@Valid @RequestBody UseCountCreateReqVO createReqVO) { + return success(useCountService.createUseCount(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新统计") + @PreAuthorize("@ss.hasPermission('system:use-count:update')") + public CommonResult updateUseCount(@Valid @RequestBody UseCountUpdateReqVO updateReqVO) { + useCountService.updateUseCount(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除统计") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:use-count:delete')") + public CommonResult deleteUseCount(@RequestParam("id") Integer id) { + useCountService.deleteUseCount(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得统计") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:use-count:query')") + public CommonResult getUseCount(@RequestParam("id") Integer id) { + UseCountDO useCount = useCountService.getUseCount(id); + return success(UseCountConvert.INSTANCE.convert(useCount)); + } + + @GetMapping("/list") + @ApiOperation("获得统计列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:use-count:query')") + public CommonResult> getUseCountList(@RequestParam("ids") Collection ids) { + List list = useCountService.getUseCountList(ids); + return success(UseCountConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得统计分页") + @PreAuthorize("@ss.hasPermission('system:use-count:query')") + public CommonResult> getUseCountPage(@Valid UseCountPageReqVO pageVO) { + PageResult pageResult = useCountService.getUseCountPage(pageVO); + return success(UseCountConvert.INSTANCE.convertPage(pageResult)); + } + @GetMapping("/counttosection") + @ApiOperation("获得统计分页counttosection") + @PreAuthorize("@ss.hasPermission('system:use-count:query')") + public CommonResult> getUseCountToSection(@RequestParam String startDate1, @RequestParam String endDate1) throws ParseException, ParseException { + DateFormat fmt =new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + Date startDate = fmt.parse(startDate1.concat(" 00:00:00")); + Date endDate = fmt.parse(endDate1.concat(" 23:59:59")); + + //功能标识:TL挂号、TH退号、YC住院、MZ门诊、WJ问卷、BG报告 + List list = useCountService.getUseCountToSection(startDate, endDate); + List resp = new ArrayList<>(); + //Long[] ans1 = new Long[6]; + Long[] ans1 = {0L, 0L, 0L, 0L, 0L, 0L}; + + for(int i=0; i> getUseCountTo(@Valid UseCountPageReqVO pageVO) { + + //7 days + List list = useCountService.getUseCountTo(); + List list1 = useCountService.getUseCountTo1(); + List list2 = useCountService.getUseCountTo2(); + List list3 = useCountService.getUseCountTo3(); + List list4 = useCountService.getUseCountTo4(); + List list5 = useCountService.getUseCountTo5(); + List list6 = useCountService.getUseCountTo6(); + + List resp = new ArrayList<>(); + Long[] ans1 = {0L, 0L, 0L, 0L, 0L, 0L, 0L}; + for(int i=0; i getUseCountToDate() { + List list = useCountService.getUseCountToDate(); + String[] ans1 = new String[7]; + ans1[0] = list.get(0).getDate6(); + ans1[1] = list.get(0).getDate5(); + ans1[2] = list.get(0).getDate4(); + ans1[3] = list.get(0).getDate3(); + ans1[4] = list.get(0).getDate2(); + ans1[5] = list.get(0).getDate1(); + ans1[6] = list.get(0).getDate(); + + return success(ans1); + //return success(UseCountConvert.INSTANCE.convertCountToDate(list)); + } + @GetMapping("/export-excel") + @ApiOperation("导出统计 Excel") + @PreAuthorize("@ss.hasPermission('system:use-count:export')") + @OperateLog(type = EXPORT) + public void exportUseCountExcel(@Valid UseCountExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = useCountService.getUseCountList(exportReqVO); + // 导出 Excel + List datas = UseCountConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "统计.xls", "数据", UseCountExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountBaseVO.java new file mode 100644 index 0000000..8eb7085 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountBaseVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.usecount.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 统计 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class UseCountBaseVO { + + @ApiModelProperty(value = "功能标识:TL挂号、TH退号、YC住院、MZ门诊、WJ问卷、BG报告") + private String interfaceIdentification; + + @ApiModelProperty(value = "用户标识") + private Integer userId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountCreateReqVO.java new file mode 100644 index 0000000..e7b572d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.usecount.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 统计创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UseCountCreateReqVO extends UseCountBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountExcelVO.java new file mode 100644 index 0000000..5bf38e9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountExcelVO.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.controller.admin.usecount.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 统计 Excel VO + * + * @author admin + */ +@Data +public class UseCountExcelVO { + + @ExcelProperty("自增主键") + private Integer id; + + @ExcelProperty("功能标识:TL挂号、TH退号、YC住院、MZ门诊、WJ问卷、BG报告") + private String interfaceIdentification; + + @ExcelProperty("用户标识") + private Integer userId; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountExportReqVO.java new file mode 100644 index 0000000..b173ba7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountExportReqVO.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.system.controller.admin.usecount.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 统计 Excel 导出 Request VO", description = "参数和 UseCountPageReqVO 是一致的") +@Data +public class UseCountExportReqVO { + + @ApiModelProperty(value = "功能标识:TL挂号、TH退号、YC住院、MZ门诊、WJ问卷、BG报告") + private String interfaceIdentification; + + @ApiModelProperty(value = "用户标识") + private Integer userId; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountPageReqVO.java new file mode 100644 index 0000000..262fc70 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountPageReqVO.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.controller.admin.usecount.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 统计分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UseCountPageReqVO extends PageParam { + + @ApiModelProperty(value = "功能标识:TL挂号、TH退号、YC住院、MZ门诊、WJ问卷、BG报告") + private String interfaceIdentification; + + @ApiModelProperty(value = "用户标识") + private Integer userId; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountRespVO.java new file mode 100644 index 0000000..ad06e8d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.usecount.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 统计 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UseCountRespVO extends UseCountBaseVO { + + @ApiModelProperty(value = "自增主键", required = true) + private Integer id; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountToDateRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountToDateRespVO.java new file mode 100644 index 0000000..d3a2a39 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountToDateRespVO.java @@ -0,0 +1,16 @@ +package com.jojubanking.boot.module.system.controller.admin.usecount.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class UseCountToDateRespVO { + + private String Date6; + private String Date5; + private String Date4; + private String Date3; + private String Date2; + private String Date1; + private String Date; +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountUpdateReqVO.java new file mode 100644 index 0000000..b6ba5ca --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.usecount.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 统计更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UseCountUpdateReqVO extends UseCountBaseVO { + + @ApiModelProperty(value = "自增主键", required = true) + @NotNull(message = "自增主键不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/UserController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/UserController.http new file mode 100644 index 0000000..6d9cea8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/UserController.http @@ -0,0 +1,4 @@ +### 请求 /system/user/page 接口 => 没有权限 +GET {{baseUrl}}/system/user/page?pageNo=1&pageSize=10 +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/UserController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/UserController.java new file mode 100644 index 0000000..4d8d2b7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/UserController.java @@ -0,0 +1,190 @@ +package com.jojubanking.boot.module.system.controller.admin.user; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.*; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.*; +import com.jojubanking.boot.module.system.convert.user.UserConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.service.dept.DeptService; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import com.jojubanking.boot.module.system.enums.common.SexEnum; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.MapUtils; +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.*; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertList; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertSet; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Api(tags = "管理后台 - 用户") +@RestController +@RequestMapping("/system/user") +@Validated +public class UserController { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + + @PostMapping("/create") + @ApiOperation("新增用户") + @PreAuthorize("@ss.hasPermission('system:user:create')") + public CommonResult createUser(@Valid @RequestBody UserCreateReqVO reqVO) { + Long id = userService.createUser(reqVO); + return success(id); + } + + @PutMapping("update") + @ApiOperation("修改用户") + @PreAuthorize("@ss.hasPermission('system:user:update')") + public CommonResult updateUser(@Valid @RequestBody UserUpdateReqVO reqVO) { + userService.updateUser(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除用户") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:user:delete')") + public CommonResult deleteUser(@RequestParam("id") Long id) { + userService.deleteUser(id); + return success(true); + } + + @PutMapping("/update-password") + @ApiOperation("重置用户密码") + @PreAuthorize("@ss.hasPermission('system:user:update-password')") + public CommonResult updateUserPassword(@Valid @RequestBody UserUpdatePasswordReqVO reqVO) { + userService.updateUserPassword(reqVO.getId(), reqVO.getPassword()); + return success(true); + } + + @PutMapping("/update-status") + @ApiOperation("修改用户状态") + @PreAuthorize("@ss.hasPermission('system:user:update')") + public CommonResult updateUserStatus(@Valid @RequestBody UserUpdateStatusReqVO reqVO) { + userService.updateUserStatus(reqVO.getId(), reqVO.getStatus()); + return success(true); + } + + @GetMapping("/page") + @ApiOperation("获得用户分页列表") + @PreAuthorize("@ss.hasPermission('system:user:list')") + public CommonResult> getUserPage(@Valid UserPageReqVO reqVO) { + // 获得用户分页列表 + PageResult pageResult = userService.getUserPage(reqVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(new PageResult<>(pageResult.getTotal())); // 返回空 + } + + // 获得拼接需要的数据 + Collection deptIds = convertList(pageResult.getList(), AdminUserDO::getDeptId); + Map deptMap = deptService.getDeptMap(deptIds); + // 拼接结果返回 + List userList = new ArrayList<>(pageResult.getList().size()); + pageResult.getList().forEach(user -> { + UserPageItemRespVO respVO = UserConvert.INSTANCE.convert(user); + respVO.setDept(UserConvert.INSTANCE.convert(deptMap.get(user.getDeptId()))); + userList.add(respVO); + }); + return success(new PageResult<>(userList, pageResult.getTotal())); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获取用户精简信息列表", notes = "只包含被开启的用户,主要用于前端的下拉选项") + public CommonResult> getSimpleUsers() { + // 获用户门列表,只要开启状态的 + List list = userService.getUsersByStatus(CommonStatusEnum.ENABLE.getStatus()); + // 排序后,返回给前端 + return success(UserConvert.INSTANCE.convertList04(list)); + } + + @GetMapping("/get") + @ApiOperation("获得用户详情") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:user:query')") + public CommonResult getInfo(@RequestParam("id") Long id) { + return success(UserConvert.INSTANCE.convert(userService.getUser(id))); + } + + @GetMapping("/export") + @ApiOperation("导出用户") + @PreAuthorize("@ss.hasPermission('system:user:export')") + @OperateLog(type = EXPORT) + public void exportUsers(@Validated UserExportReqVO reqVO, + HttpServletResponse response) throws IOException { + // 获得用户列表 + List users = userService.getUsers(reqVO); + + // 获得拼接需要的数据 + Collection deptIds = convertList(users, AdminUserDO::getDeptId); + Map deptMap = deptService.getDeptMap(deptIds); + Map deptLeaderUserMap = userService.getUserMap( + convertSet(deptMap.values(), DeptDO::getLeaderUserId)); + // 拼接数据 + List excelUsers = new ArrayList<>(users.size()); + users.forEach(user -> { + UserExcelVO excelVO = UserConvert.INSTANCE.convert02(user); + // 设置部门 + MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> { + excelVO.setDeptName(dept.getName()); + // 设置部门负责人的名字 + MapUtils.findAndThen(deptLeaderUserMap, dept.getLeaderUserId(), + deptLeaderUser -> excelVO.setDeptLeaderNickname(deptLeaderUser.getNickname())); + }); + excelUsers.add(excelVO); + }); + + // 输出 + ExcelUtils.write(response, "用户数据.xls", "用户列表", UserExcelVO.class, excelUsers); + } + + @GetMapping("/get-import-template") + @ApiOperation("获得导入用户模板") + public void importTemplate(HttpServletResponse response) throws IOException { + // 手动创建导出 demo + List list = Arrays.asList( + UserImportExcelVO.builder().username("terry").deptId(1L).email("32783747@qq.com").mobile("13857185597") + .nickname("terry").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(), + UserImportExcelVO.builder().username("joy").deptId(2L).email("joy@qq.com").mobile("13857185597") + .nickname("joy").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() + ); + + // 输出 + ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list); + } + + @PostMapping("/import") + @ApiOperation("导入用户") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "Excel 文件", required = true, dataTypeClass = MultipartFile.class), + @ApiImplicitParam(name = "updateSupport", value = "是否支持更新,默认为 false", example = "true", dataTypeClass = Boolean.class) + }) + @PreAuthorize("@ss.hasPermission('system:user:import')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.read(file, UserImportExcelVO.class); + return success(userService.importUsers(list, updateSupport)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/UserProfileController.http b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/UserProfileController.http new file mode 100644 index 0000000..f06037b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/UserProfileController.http @@ -0,0 +1,4 @@ +### 请求 /system/user/profile/get 接口 => 没有权限 +GET {{baseUrl}}/system/user/profile/get +Authorization: Bearer {{token}} +tenant-id: {{adminTenentId}} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/UserProfileController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/UserProfileController.java new file mode 100644 index 0000000..43a4acc --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/UserProfileController.java @@ -0,0 +1,108 @@ +package com.jojubanking.boot.module.system.controller.admin.user; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.datapermission.core.annotation.DataPermission; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileRespVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.jojubanking.boot.module.system.convert.user.UserConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.dal.dataobject.social.SocialUserDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.service.dept.DeptService; +import com.jojubanking.boot.module.system.service.dept.PostService; +import com.jojubanking.boot.module.system.service.permission.PermissionService; +import com.jojubanking.boot.module.system.service.permission.RoleService; +import com.jojubanking.boot.module.system.service.social.SocialUserService; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.jojubanking.boot.module.infra.enums.ErrorCodeConstants.FILE_IS_EMPTY; + +@Api(tags = "管理后台 - 用户个人中心") +@RestController +@RequestMapping("/system/user/profile") +@Validated +@Slf4j +public class UserProfileController { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + @Resource + private PostService postService; + @Resource + private PermissionService permissionService; + @Resource + private RoleService roleService; + @Resource + private SocialUserService socialService; + + @GetMapping("/get") + @ApiOperation("获得登录用户信息") + @DataPermission(enable = false) // 关闭数据权限,避免只查看自己时,查询不到部门。 + public CommonResult profile() { + // 获得用户基本信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + UserProfileRespVO resp = UserConvert.INSTANCE.convert03(user); + // 获得用户角色 + List userRoles = roleService.getRolesFromCache(permissionService.getUserRoleIdListByUserId(user.getId())); + resp.setRoles(UserConvert.INSTANCE.convertList(userRoles)); + // 获得部门信息 + if (user.getDeptId() != null) { + DeptDO dept = deptService.getDept(user.getDeptId()); + resp.setDept(UserConvert.INSTANCE.convert02(dept)); + } + // 获得岗位信息 + if (CollUtil.isNotEmpty(user.getPostIds())) { + List posts = postService.getPosts(user.getPostIds()); + resp.setPosts(UserConvert.INSTANCE.convertList02(posts)); + } + // 获得社交用户信息 + List socialUsers = socialService.getSocialUserList(user.getId(), UserTypeEnum.ADMIN.getValue()); + resp.setSocialUsers(UserConvert.INSTANCE.convertList03(socialUsers)); + return success(resp); + } + + @PutMapping("/update") + @ApiOperation("修改用户个人信息") + public CommonResult updateUserProfile(@Valid @RequestBody UserProfileUpdateReqVO reqVO) { + userService.updateUserProfile(getLoginUserId(), reqVO); + return success(true); + } + + @PutMapping("/update-password") + @ApiOperation("修改用户个人密码") + public CommonResult updateUserProfilePassword(@Valid @RequestBody UserProfileUpdatePasswordReqVO reqVO) { + userService.updateUserPassword(getLoginUserId(), reqVO); + return success(true); + } + + @RequestMapping(value = "/update-avatar", method = {RequestMethod.POST, RequestMethod.PUT}) // 解决 uni-app 不支持 Put 上传文件的问题 + @ApiOperation("上传用户个人头像") + public CommonResult updateUserAvatar(@RequestParam("avatarFile") MultipartFile file) throws Exception { + if (file.isEmpty()) { + throw ServiceExceptionUtil.exception(FILE_IS_EMPTY); + } + String avatar = userService.updateUserAvatar(getLoginUserId(), file.getInputStream()); + return success(avatar); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java new file mode 100644 index 0000000..fde3218 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO.java @@ -0,0 +1,104 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.profile; + +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserBaseVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + + +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("管理后台 - 用户个人中心信息 Response VO") +public class UserProfileRespVO extends UserBaseVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "最后登录 IP", required = true, example = "192.168.1.1") + private String loginIp; + + @ApiModelProperty(value = "最后登录时间", required = true, example = "时间戳格式") + private Date loginDate; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + + /** + * 所属角色 + */ + private List roles; + + /** + * 所在部门 + */ + private Dept dept; + + /** + * 所属岗位数组 + */ + private List posts; + /** + * 社交用户数组 + */ + private List socialUsers; + + @ApiModel("角色") + @Data + public static class Role { + + @ApiModelProperty(value = "角色编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "角色名称", required = true, example = "普通角色") + private String name; + + } + + @ApiModel("部门") + @Data + public static class Dept { + + @ApiModelProperty(value = "部门编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "部门名称", required = true, example = "研发部") + private String name; + + } + + @ApiModel("岗位") + @Data + public static class Post { + + @ApiModelProperty(value = "岗位编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "岗位名称", required = true, example = "开发") + private String name; + + } + + @ApiModel("社交用户") + @Data + public static class SocialUser { + + @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SocialTypeEnum 枚举类") + private Integer type; + + @ApiModelProperty(value = "社交用户的 openid", required = true, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE") + private String openid; + + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java new file mode 100644 index 0000000..c6880fa --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.profile; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; + +@ApiModel("管理后台 - 用户个人中心更新密码 Request VO") +@Data +public class UserProfileUpdatePasswordReqVO { + + @ApiModelProperty(value = "旧密码", required = true, example = "123456") + @NotEmpty(message = "旧密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String oldPassword; + + @ApiModelProperty(value = "新密码", required = true, example = "654321") + @NotEmpty(message = "新密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String newPassword; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java new file mode 100644 index 0000000..c9fc793 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.profile; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Email; +import javax.validation.constraints.Size; + +@ApiModel("管理后台 - 用户个人信息更新 Request VO") +@Data +public class UserProfileUpdateReqVO { + + @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过 30 个字符") + private String nickname; + + @ApiModelProperty(value = "用户邮箱", example = "joju@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过 50 个字符") + private String email; + + @ApiModelProperty(value = "手机号码", example = "15601691300") + @Length(min = 11, max = 11, message = "手机号长度必须 11 位") + private String mobile; + + @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SexEnum 枚举类") + private Integer sex; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserBaseVO.java new file mode 100644 index 0000000..0f4582f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserBaseVO.java @@ -0,0 +1,54 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + +import com.jojubanking.boot.framework.common.validation.Mobile; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import java.util.Set; + +/** + * 用户 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class UserBaseVO { + + @ApiModelProperty(value = "用户账号", required = true, example = "joju") + @NotBlank(message = "用户账号不能为空") + @Pattern(regexp = "^[a-zA-Z0-9]{4,30}$", message = "用户账号由 数字、字母 组成") + @Size(min = 4, max = 30, message = "用户账号长度为 4-30 个字符") + private String username; + + @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") + @Size(max = 30, message = "用户昵称长度不能超过30个字符") + private String nickname; + + @ApiModelProperty(value = "备注", example = "我是一个用户") + private String remark; + + @ApiModelProperty(value = "部门ID", example = "我是一个用户") + private Long deptId; + + @ApiModelProperty(value = "岗位编号数组", example = "1") + private Set postIds; + + @ApiModelProperty(value = "用户邮箱", example = "joju@iocoder.cn") + @Email(message = "邮箱格式不正确") + @Size(max = 50, message = "邮箱长度不能超过 50 个字符") + private String email; + + @ApiModelProperty(value = "手机号码", example = "15601691300") + @Mobile + private String mobile; + + @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SexEnum 枚举类") + private Integer sex; + + @ApiModelProperty(value = "用户头像", example = "https://www.iocoder.cn/xxx.png") + private String avatar; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserCreateReqVO.java new file mode 100644 index 0000000..adb6067 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserCreateReqVO.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; + +@ApiModel("管理后台 - 用户创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class UserCreateReqVO extends UserBaseVO { + + @ApiModelProperty(value = "密码", required = true, example = "123456") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserExcelVO.java new file mode 100644 index 0000000..4dea24f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserExcelVO.java @@ -0,0 +1,52 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 用户 Excel 导出 VO + */ +@Data +public class UserExcelVO { + + @ExcelProperty("用户编号") + private Long id; + + @ExcelProperty("用户名称") + private String username; + + @ExcelProperty("用户昵称") + private String nickname; + + @ExcelProperty("用户邮箱") + private String email; + + @ExcelProperty("手机号码") + private String mobile; + + @ExcelProperty(value = "用户性别", converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_SEX) + private Integer sex; + + @ExcelProperty(value = "帐号状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @ExcelProperty("最后登录IP") + private String loginIp; + + @ExcelProperty("最后登录时间") + private Date loginDate; + + @ExcelProperty("部门名称") + private String deptName; + + @ExcelProperty("部门负责人") + private String deptLeaderNickname; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserExportReqVO.java new file mode 100644 index 0000000..d333b24 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserExportReqVO.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 用户导出 Request VO", description = "参数和 UserPageReqVO 是一致的") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserExportReqVO { + + @ApiModelProperty(value = "用户账号", example = "joju", notes = "模糊匹配") + private String username; + + @ApiModelProperty(value = "手机号码", example = "joju", notes = "模糊匹配") + private String mobile; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + + @ApiModelProperty(value = "部门编号", example = "1024", notes = "同时筛选子部门") + private Long deptId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportExcelVO.java new file mode 100644 index 0000000..801950b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportExcelVO.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 用户 Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +public class UserImportExcelVO { + + @ExcelProperty("登录名称") + private String username; + + @ExcelProperty("用户名称") + private String nickname; + + @ExcelProperty("部门编号") + private Long deptId; + + @ExcelProperty("用户邮箱") + private String email; + + @ExcelProperty("手机号码") + private String mobile; + + @ExcelProperty(value = "用户性别", converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_SEX) + private Integer sex; + + @ExcelProperty(value = "账号状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportRespVO.java new file mode 100644 index 0000000..951468c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportRespVO.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@ApiModel("管理后台 - 用户导入 Response VO") +@Data +@Builder +public class UserImportRespVO { + + @ApiModelProperty(value = "创建成功的用户名数组", required = true) + private List createUsernames; + + @ApiModelProperty(value = "更新成功的用户名数组", required = true) + private List updateUsernames; + + @ApiModelProperty(value = "导入失败的用户集合", required = true, notes = "key 为用户名,value 为失败原因") + private Map failureUsernames; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageItemRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageItemRespVO.java new file mode 100644 index 0000000..5786a5a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageItemRespVO.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@ApiModel(value = "管理后台 - 用户分页时的信息 Response VO", description = "相比用户基本信息来说,会多部门信息") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class UserPageItemRespVO extends UserRespVO { + + /** + * 所在部门 + */ + private Dept dept; + + @ApiModel("部门") + @Data + public static class Dept { + + @ApiModelProperty(value = "部门编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "部门名称", required = true, example = "研发部") + private String name; + + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageReqVO.java new file mode 100644 index 0000000..26f08fe --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageReqVO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 用户分页 Request VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class UserPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户账号", example = "joju", notes = "模糊匹配") + private String username; + + @ApiModelProperty(value = "手机号码", example = "joju", notes = "模糊匹配") + private String mobile; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + + @ApiModelProperty(value = "部门编号", example = "1024", notes = "同时筛选子部门") + private Long deptId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserRespVO.java new file mode 100644 index 0000000..7055f98 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserRespVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.util.Date; + +@ApiModel("管理后台 - 用户信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class UserRespVO extends UserBaseVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "最后登录 IP", required = true, example = "192.168.1.1") + private String loginIp; + + @ApiModelProperty(value = "最后登录时间", required = true, example = "时间戳格式") + private Date loginDate; + + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java new file mode 100644 index 0000000..18889ba --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserSimpleRespVO.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@ApiModel("用户精简信息 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserSimpleRespVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "用户昵称", required = true, example = "芋道") + private String nickname; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java new file mode 100644 index 0000000..fb56ffa --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 用户更新密码 Request VO") +@Data +public class UserUpdatePasswordReqVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + @NotNull(message = "用户编号不能为空") + private Long id; + + @ApiModelProperty(value = "密码", required = true, example = "123456") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdateReqVO.java new file mode 100644 index 0000000..a4b1ef0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdateReqVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 用户更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +public class UserUpdateReqVO extends UserBaseVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + @NotNull(message = "用户编号不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java new file mode 100644 index 0000000..b51b908 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.system.controller.admin.user.vo.user; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@ApiModel("管理后台 - 用户更新状态 Request VO") +@Data +public class UserUpdateStatusReqVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + @NotNull(message = "角色编号不能为空") + private Long id; + + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举") + @NotNull(message = "状态不能为空") +// @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/UsersXqController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/UsersXqController.java new file mode 100644 index 0000000..a642447 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/UsersXqController.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.controller.admin.usersxq; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.usersxq.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.usersxq.UsersXqDO; +import com.jojubanking.boot.module.system.convert.usersxq.UsersXqConvert; +import com.jojubanking.boot.module.system.service.usersxq.UsersXqService; + +@Api(tags = "管理后台 - 用户信息") +@RestController +@RequestMapping("/system/users-xq") +@Validated +public class UsersXqController { + + @Resource + private UsersXqService usersXqService; + + @PostMapping("/create") + @ApiOperation("创建用户信息") + @PreAuthorize("@ss.hasPermission('system:users-xq:create')") + public CommonResult createUsersXq(@Valid @RequestBody UsersXqCreateReqVO createReqVO) { + return success(usersXqService.createUsersXq(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新用户信息") + @PreAuthorize("@ss.hasPermission('system:users-xq:update')") + public CommonResult updateUsersXq(@Valid @RequestBody UsersXqUpdateReqVO updateReqVO) { + usersXqService.updateUsersXq(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除用户信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:users-xq:delete')") + public CommonResult deleteUsersXq(@RequestParam("id") Long id) { + usersXqService.deleteUsersXq(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得用户信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:users-xq:query')") + public CommonResult getUsersXq(@RequestParam("id") Long id) { + UsersXqDO usersXq = usersXqService.getUsersXq(id); + return success(UsersXqConvert.INSTANCE.convert(usersXq)); + } + + @GetMapping("/list") + @ApiOperation("获得用户信息列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:users-xq:query')") + public CommonResult> getUsersXqList(@RequestParam("ids") Collection ids) { + List list = usersXqService.getUsersXqList(ids); + return success(UsersXqConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得用户信息分页") + @PreAuthorize("@ss.hasPermission('system:users-xq:query')") + public CommonResult> getUsersXqPage(@Valid UsersXqPageReqVO pageVO) { + PageResult pageResult = usersXqService.getUsersXqPage(pageVO); + return success(UsersXqConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出用户信息 Excel") + @PreAuthorize("@ss.hasPermission('system:users-xq:export')") + @OperateLog(type = EXPORT) + public void exportUsersXqExcel(@Valid UsersXqExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = usersXqService.getUsersXqList(exportReqVO); + // 导出 Excel + List datas = UsersXqConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "用户信息.xls", "数据", UsersXqExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqBaseVO.java new file mode 100644 index 0000000..be0b70c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqBaseVO.java @@ -0,0 +1,62 @@ +package com.jojubanking.boot.module.system.controller.admin.usersxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** +* 用户信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class UsersXqBaseVO { + + @ApiModelProperty(value = "用户账号", required = true) + @NotNull(message = "用户账号不能为空") + private String username; + + @ApiModelProperty(value = "密码", required = true) + @NotNull(message = "密码不能为空") + private String password; + + @ApiModelProperty(value = "用户昵称", required = true) + @NotNull(message = "用户昵称不能为空") + private String nickname; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "部门ID") + private Long deptId; + + @ApiModelProperty(value = "岗位编号数组") + private String postIds; + + @ApiModelProperty(value = "用户邮箱") + private String email; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "用户性别") + private Integer sex; + + @ApiModelProperty(value = "头像地址") + private String avatar; + + @ApiModelProperty(value = "帐号状态(0正常 1停用)", required = true) + @NotNull(message = "帐号状态(0正常 1停用)不能为空") + private Integer status; + + @ApiModelProperty(value = "最后登录IP") + private String loginIp; + + @ApiModelProperty(value = "最后登录时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date loginDate; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqCreateReqVO.java new file mode 100644 index 0000000..c4fd3e9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.usersxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 用户信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UsersXqCreateReqVO extends UsersXqBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqExcelVO.java new file mode 100644 index 0000000..17f68ab --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqExcelVO.java @@ -0,0 +1,62 @@ +package com.jojubanking.boot.module.system.controller.admin.usersxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 用户信息 Excel VO + * + * @author admin + */ +@Data +public class UsersXqExcelVO { + + @ExcelProperty("用户ID") + private Long id; + + @ExcelProperty("用户账号") + private String username; + + @ExcelProperty("密码") + private String password; + + @ExcelProperty("用户昵称") + private String nickname; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("部门ID") + private Long deptId; + + @ExcelProperty("岗位编号数组") + private String postIds; + + @ExcelProperty("用户邮箱") + private String email; + + @ExcelProperty("手机号码") + private String mobile; + + @ExcelProperty("用户性别") + private Integer sex; + + @ExcelProperty("头像地址") + private String avatar; + + @ExcelProperty("帐号状态(0正常 1停用)") + private Integer status; + + @ExcelProperty("最后登录IP") + private String loginIp; + + @ExcelProperty("最后登录时间") + private Date loginDate; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqExportReqVO.java new file mode 100644 index 0000000..6512c74 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqExportReqVO.java @@ -0,0 +1,59 @@ +package com.jojubanking.boot.module.system.controller.admin.usersxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 用户信息 Excel 导出 Request VO", description = "参数和 UsersXqPageReqVO 是一致的") +@Data +public class UsersXqExportReqVO { + + @ApiModelProperty(value = "用户账号") + private String username; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "部门ID") + private Long deptId; + + @ApiModelProperty(value = "岗位编号数组") + private String postIds; + + @ApiModelProperty(value = "用户邮箱") + private String email; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "用户性别") + private Integer sex; + + @ApiModelProperty(value = "头像地址") + private String avatar; + + @ApiModelProperty(value = "帐号状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty(value = "最后登录IP") + private String loginIp; + + @ApiModelProperty(value = "最后登录时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] loginDate; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqPageReqVO.java new file mode 100644 index 0000000..af682a7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqPageReqVO.java @@ -0,0 +1,61 @@ +package com.jojubanking.boot.module.system.controller.admin.usersxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 用户信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UsersXqPageReqVO extends PageParam { + + @ApiModelProperty(value = "用户账号") + private String username; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "部门ID") + private Long deptId; + + @ApiModelProperty(value = "岗位编号数组") + private String postIds; + + @ApiModelProperty(value = "用户邮箱") + private String email; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "用户性别") + private Integer sex; + + @ApiModelProperty(value = "头像地址") + private String avatar; + + @ApiModelProperty(value = "帐号状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty(value = "最后登录IP") + private String loginIp; + + @ApiModelProperty(value = "最后登录时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] loginDate; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqRespVO.java new file mode 100644 index 0000000..1b8038c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.usersxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 用户信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UsersXqRespVO extends UsersXqBaseVO { + + @ApiModelProperty(value = "用户ID", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqUpdateReqVO.java new file mode 100644 index 0000000..e5d4efe --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.usersxq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 用户信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UsersXqUpdateReqVO extends UsersXqBaseVO { + + @ApiModelProperty(value = "用户ID", required = true) + @NotNull(message = "用户ID不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/WqController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/WqController.java new file mode 100644 index 0000000..9492332 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/WqController.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.controller.admin.wq; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.wq.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wq.WqDO; +import com.jojubanking.boot.module.system.convert.wq.WqConvert; +import com.jojubanking.boot.module.system.service.wq.WqService; + +@Api(tags = "管理后台 - 问卷调查") +@RestController +@RequestMapping("/system/wq") +@Validated +public class WqController { + + @Resource + private WqService wqService; + + @PostMapping("/create") + @ApiOperation("创建问卷调查") + @PreAuthorize("@ss.hasPermission('system:wq:create')") + public CommonResult createWq(@Valid @RequestBody WqCreateReqVO createReqVO) { + return success(wqService.createWq(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新问卷调查") + @PreAuthorize("@ss.hasPermission('system:wq:update')") + public CommonResult updateWq(@Valid @RequestBody WqUpdateReqVO updateReqVO) { + wqService.updateWq(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除问卷调查") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:wq:delete')") + public CommonResult deleteWq(@RequestParam("id") Integer id) { + wqService.deleteWq(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得问卷调查") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:wq:query')") + public CommonResult getWq(@RequestParam("id") Integer id) { + WqDO wq = wqService.getWq(id); + return success(WqConvert.INSTANCE.convert(wq)); + } + + @GetMapping("/list") + @ApiOperation("获得问卷调查列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:wq:query')") + public CommonResult> getWqList(@RequestParam("ids") Collection ids) { + List list = wqService.getWqList(ids); + return success(WqConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得问卷调查分页") + @PreAuthorize("@ss.hasPermission('system:wq:query')") + public CommonResult> getWqPage(@Valid WqPageReqVO pageVO) { + PageResult pageResult = wqService.getWqPage(pageVO); + return success(WqConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出问卷调查 Excel") + @PreAuthorize("@ss.hasPermission('system:wq:export')") + @OperateLog(type = EXPORT) + public void exportWqExcel(@Valid WqExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = wqService.getWqList(exportReqVO); + // 导出 Excel + List datas = WqConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "问卷调查.xls", "数据", WqExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqBaseVO.java new file mode 100644 index 0000000..c0dbdfd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqBaseVO.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.system.controller.admin.wq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 问卷调查 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class WqBaseVO { + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "问卷类型编号", required = true) + @NotNull(message = "问卷类型编号不能为空") + private Long typeId; + + @ApiModelProperty(value = "问卷类型 住院、门诊") + private String type; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqCreateReqVO.java new file mode 100644 index 0000000..32d6b23 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.wq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 问卷调查创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqCreateReqVO extends WqBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqExcelVO.java new file mode 100644 index 0000000..7b872f1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqExcelVO.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.controller.admin.wq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 问卷调查 Excel VO + * + * @author admin + */ +@Data +public class WqExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("标题") + private String title; + + @ExcelProperty("问卷类型编号") + private Long typeId; + + @ExcelProperty("问卷类型 住院、门诊") + private String type; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqExportReqVO.java new file mode 100644 index 0000000..e47d64d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqExportReqVO.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.system.controller.admin.wq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 问卷调查 Excel 导出 Request VO", description = "参数和 WqPageReqVO 是一致的") +@Data +public class WqExportReqVO { + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "问卷类型编号") + private Long typeId; + + @ApiModelProperty(value = "问卷类型 住院、门诊") + private String type; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqPageReqVO.java new file mode 100644 index 0000000..c653a79 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqPageReqVO.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.system.controller.admin.wq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 问卷调查分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqPageReqVO extends PageParam { + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "问卷类型编号") + private Long typeId; + + @ApiModelProperty(value = "问卷类型 住院、门诊") + private String type; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqRespVO.java new file mode 100644 index 0000000..4b78dd5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.wq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 问卷调查 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqRespVO extends WqBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqUpdateReqVO.java new file mode 100644 index 0000000..988e754 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.wq.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 问卷调查更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqUpdateReqVO extends WqBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/WqdaController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/WqdaController.java new file mode 100644 index 0000000..856d73d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/WqdaController.java @@ -0,0 +1,110 @@ +package com.jojubanking.boot.module.system.controller.admin.wqda; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.wqda.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqda.WqdaDO; +import com.jojubanking.boot.module.system.convert.wqda.WqdaConvert; +import com.jojubanking.boot.module.system.service.wqda.WqdaService; + +@Api(tags = "管理后台 - 问卷调查答案") +@RestController +@RequestMapping("/system/wqda") +@Validated +public class WqdaController { + + @Resource + private WqdaService wqdaService; + + @PostMapping("/create") + @ApiOperation("创建问卷调查答案") + @PreAuthorize("@ss.hasPermission('system:wqda:create')") + public CommonResult createWqda(@Valid @RequestBody WqdaCreateReqVO createReqVO) { + return success(wqdaService.createWqda(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新问卷调查答案") + @PreAuthorize("@ss.hasPermission('system:wqda:update')") + public CommonResult updateWqda(@Valid @RequestBody WqdaUpdateReqVO updateReqVO) { + wqdaService.updateWqda(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除问卷调查答案") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:wqda:delete')") + public CommonResult deleteWqda(@RequestParam("id") Integer id) { + wqdaService.deleteWqda(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得问卷调查答案") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:wqda:query')") + public CommonResult getWqda(@RequestParam("id") Integer id) { + WqdaDO wqda = wqdaService.getWqda(id); + return success(WqdaConvert.INSTANCE.convert(wqda)); + } + + @GetMapping("/list") + @ApiOperation("获得问卷调查答案列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:wqda:query')") + public CommonResult> getWqdaList(@RequestParam("ids") Collection ids) { + List list = wqdaService.getWqdaList(ids); + return success(WqdaConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得问卷调查答案分页") + @PreAuthorize("@ss.hasPermission('system:wqda:query')") + public CommonResult> getWqdaPage(@Valid WqdaPageReqVO pageVO) { + PageResult pageResult = wqdaService.getWqdaPage(pageVO); + return success(WqdaConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出问卷调查答案 Excel") + @PreAuthorize("@ss.hasPermission('system:wqda:export')") + @OperateLog(type = EXPORT) + public void exportWqdaExcel(@Valid WqdaExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = wqdaService.getWqdaList(exportReqVO); + // 导出 Excel + List datas = WqdaConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "问卷调查答案.xls", "数据", WqdaExcelVO.class, datas); + } + + @GetMapping("/sum") + @ApiOperation("导出问卷调查答案 Excel") + @OperateLog + public CommonResult GetWqdaSum(WqSumReqVo wqSumReqVo) { + + String res = wqdaService.getWqdaSumList(wqSumReqVo.getQuestionType(), wqSumReqVo.getCreateTime()[0], wqSumReqVo.getCreateTime()[1]); + return success(res); + //return success(WqdaConvert.INSTANCE.convertList(list)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqSumReqVo.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqSumReqVo.java new file mode 100644 index 0000000..ce0c56e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqSumReqVo.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system.controller.admin.wqda.vo; + +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * @ClassName: WqSumReqVo + * @Description: + * @Author T.W + * @Date 2023/3/25 + * @Version 1.0 + */ +@Data +public class WqSumReqVo { + String questionType; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] createTime; +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaBaseVO.java new file mode 100644 index 0000000..a62aa27 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaBaseVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.controller.admin.wqda.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 问卷调查答案 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class WqdaBaseVO { + + @ApiModelProperty(value = "问卷类型编号", required = true) + @NotNull(message = "问卷类型编号不能为空") + private Long typeId; + + @ApiModelProperty(value = "问题编号") + private String questionId; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题标题") + private String questionTitle; + + @ApiModelProperty(value = "问题答案") + private String questionAnswer; + + @ApiModelProperty(value = "问题其他") + private String questionComment; + + @ApiModelProperty(value = "用户名称") + private String username; + + @ApiModelProperty(value = "用户电话") + private String usertel; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaCreateReqVO.java new file mode 100644 index 0000000..4bd749e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.wqda.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 问卷调查答案创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqdaCreateReqVO extends WqdaBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaExcelVO.java new file mode 100644 index 0000000..353476f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaExcelVO.java @@ -0,0 +1,47 @@ +package com.jojubanking.boot.module.system.controller.admin.wqda.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 问卷调查答案 Excel VO + * + * @author admin + */ +@Data +public class WqdaExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("问卷类型编号") + private Long typeId; + + @ExcelProperty("问题编号") + private String questionId; + + @ExcelProperty("问题类型") + private String questionType; + + @ExcelProperty("问题标题") + private String questionTitle; + + @ExcelProperty("问题答案") + private String questionAnswer; + + @ExcelProperty("问题其他") + private String questionComment; + + @ExcelProperty("用户名称") + private String username; + + @ExcelProperty("用户电话") + private String usertel; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaExportReqVO.java new file mode 100644 index 0000000..7ff45ba --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaExportReqVO.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.module.system.controller.admin.wqda.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 问卷调查答案 Excel 导出 Request VO", description = "参数和 WqdaPageReqVO 是一致的") +@Data +public class WqdaExportReqVO { + + @ApiModelProperty(value = "问卷类型编号") + private Long typeId; + + @ApiModelProperty(value = "问题编号") + private String questionId; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题标题") + private String questionTitle; + + @ApiModelProperty(value = "问题答案") + private String questionAnswer; + + @ApiModelProperty(value = "问题其他") + private String questionComment; + + @ApiModelProperty(value = "用户名称") + private String username; + + @ApiModelProperty(value = "用户电话") + private String usertel; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaPageReqVO.java new file mode 100644 index 0000000..151971f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaPageReqVO.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.system.controller.admin.wqda.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 问卷调查答案分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqdaPageReqVO extends PageParam { + + @ApiModelProperty(value = "问卷类型编号") + private Long typeId; + + @ApiModelProperty(value = "问题编号") + private String questionId; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题标题") + private String questionTitle; + + @ApiModelProperty(value = "问题答案") + private String questionAnswer; + + @ApiModelProperty(value = "问题其他") + private String questionComment; + + @ApiModelProperty(value = "用户名称") + private String username; + + @ApiModelProperty(value = "用户电话") + private String usertel; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaRespVO.java new file mode 100644 index 0000000..f6b2eb4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.wqda.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 问卷调查答案 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqdaRespVO extends WqdaBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaUpdateReqVO.java new file mode 100644 index 0000000..9263d67 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.wqda.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 问卷调查答案更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqdaUpdateReqVO extends WqdaBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/WqdaViewController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/WqdaViewController.java new file mode 100644 index 0000000..d8c72b7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/WqdaViewController.java @@ -0,0 +1,142 @@ +package com.jojubanking.boot.module.system.controller.admin.wqdaview; + +import com.jojubanking.boot.module.system.dal.dataobject.wq.WqDO; +import com.jojubanking.boot.module.system.dal.dataobject.wqwt.WqwtDO; +import com.jojubanking.boot.module.system.dal.mysql.wq.WqMapper; +import com.jojubanking.boot.module.system.dal.mysql.wqwt.WqwtMapper; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.wqdaview.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqdaview.WqdaViewDO; +import com.jojubanking.boot.module.system.convert.wqdaview.WqdaViewConvert; +import com.jojubanking.boot.module.system.service.wqdaview.WqdaViewService; + +@Api(tags = "管理后台 - VIEW") +@RestController +@RequestMapping("/system/wqda-view") +@Validated +public class WqdaViewController { + + @Resource + private WqdaViewService wqdaViewService; + + @Resource + private WqMapper wqMapper; + + @PostMapping("/create") + @ApiOperation("创建VIEW") + @PreAuthorize("@ss.hasPermission('system:wqda-view:create')") + public CommonResult createWqdaView(@Valid @RequestBody WqdaViewCreateReqVO createReqVO) { + return success(wqdaViewService.createWqdaView(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新VIEW") + @PreAuthorize("@ss.hasPermission('system:wqda-view:update')") + public CommonResult updateWqdaView(@Valid @RequestBody WqdaViewUpdateReqVO updateReqVO) { + wqdaViewService.updateWqdaView(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除VIEW") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:wqda-view:delete')") + public CommonResult deleteWqdaView(@RequestParam("id") Integer id) { + wqdaViewService.deleteWqdaView(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得VIEW") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:wqda-view:query')") + public CommonResult getWqdaView(@RequestParam("id") Integer id) { + WqdaViewDO wqdaView = wqdaViewService.getWqdaView(id); + return success(WqdaViewConvert.INSTANCE.convert(wqdaView)); + } + + @GetMapping("/list") + @ApiOperation("获得VIEW列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:wqda-view:query')") + public CommonResult> getWqdaViewList(@RequestParam("ids") Collection ids) { + List list = wqdaViewService.getWqdaViewList(ids); + return success(WqdaViewConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得VIEW分页") + @PreAuthorize("@ss.hasPermission('system:wqda-view:query')") + public CommonResult> getWqdaViewPage(@Valid WqdaViewPageReqVO pageVO) { + PageResult pageResult = wqdaViewService.getWqdaViewPage(pageVO); + return success(WqdaViewConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出VIEW Excel") + @PreAuthorize("@ss.hasPermission('system:wqda-view:export')") + @OperateLog(type = EXPORT) + public void exportWqdaViewExcel(@Valid WqdaViewExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = wqdaViewService.getWqdaViewList(exportReqVO); + // 导出 Excel + List datas = WqdaViewConvert.INSTANCE.convertList02(list); + + List list1 = new ArrayList( datas.size() ); + for ( WqdaViewExcelVO wqdaViewExcelVO : datas ) { + + WqdaViewExcel01VO wqdaViewExcel01VO = new WqdaViewExcel01VO(); + + wqdaViewExcel01VO.setId( wqdaViewExcelVO.getId() ); + + //questionLabel + WqDO wqDO = new WqDO(); + wqDO = wqMapper.selectOne("type_id", wqdaViewExcelVO.getTypeId().toString()); + wqdaViewExcel01VO.setTypeId( wqDO.getTitle() ); + +// wqdaViewExcel01VO.setQuestionId( wqdaViewDO.getQuestionId() ); +// wqdaViewExcel01VO.setQuestionType( wqdaViewDO.getQuestionType() ); + if(wqdaViewExcelVO.getQuestionTitle()!=null){ + if(wqdaViewExcelVO.getQuestionTitle().equals("其他")){ + wqdaViewExcel01VO.setQuestionTitle( wqdaViewExcelVO.getQuestionTitle() + ":" + wqdaViewExcelVO.getQuestionComment()); + }else { + wqdaViewExcel01VO.setQuestionTitle( wqdaViewExcelVO.getQuestionTitle() ); + } + }else { + wqdaViewExcel01VO.setQuestionTitle( wqdaViewExcelVO.getQuestionTitle() ); + } +// wqdaViewExcel01VO.setQuestionAnswer( wqdaViewExcelVO.getQuestionAnswer() ); +// wqdaViewExcel01VO.setQuestionComment( wqdaViewDO.getQuestionComment() ); + wqdaViewExcel01VO.setUsername( wqdaViewExcelVO.getUsername() ); + wqdaViewExcel01VO.setUsertel( wqdaViewExcelVO.getUsertel() ); + wqdaViewExcel01VO.setCreateTime( wqdaViewExcelVO.getCreateTime() ); + wqdaViewExcel01VO.setQuestionLabel( wqdaViewExcelVO.getQuestionLabel() ); + + list1.add( wqdaViewExcel01VO ); + } + + + ExcelUtils.write(response, "VIEW.xls", "数据", WqdaViewExcel01VO.class, list1); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewBaseVO.java new file mode 100644 index 0000000..9dc7832 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewBaseVO.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.module.system.controller.admin.wqdaview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* VIEW Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class WqdaViewBaseVO { + + @ApiModelProperty(value = "问卷类型编号", required = true) + @NotNull(message = "问卷类型编号不能为空") + private Long typeId; + + @ApiModelProperty(value = "问题编号") + private String questionId; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题标题") + private String questionTitle; + + @ApiModelProperty(value = "问题答案") + private String questionAnswer; + + @ApiModelProperty(value = "问题其他") + private String questionComment; + + @ApiModelProperty(value = "用户名称") + private String username; + + @ApiModelProperty(value = "用户电话") + private String usertel; + + @ApiModelProperty(value = "问题标题") + private String questionLabel; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewCreateReqVO.java new file mode 100644 index 0000000..6579622 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.wqdaview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - VIEW创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqdaViewCreateReqVO extends WqdaViewBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExcel01VO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExcel01VO.java new file mode 100644 index 0000000..d982a3e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExcel01VO.java @@ -0,0 +1,44 @@ +package com.jojubanking.boot.module.system.controller.admin.wqdaview.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.util.Date; +@Data +public class WqdaViewExcel01VO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("问卷类型") + private String typeId; + +// @ExcelProperty("问题编号") +// private String questionId; +// +// @ExcelProperty("问题类型") +// private String questionType; + + @ExcelProperty("问卷标题") + private String questionLabel; + + @ExcelProperty("问卷答案") + private String questionTitle; + +// @ExcelProperty("问卷答案") +// private String questionAnswer; + +// @ExcelProperty("问题其他") +// private String questionComment; + + @ExcelProperty("用户名称") + private String username; + + @ExcelProperty("用户电话") + private String usertel; + + @ExcelProperty("创建时间") + private Date createTime; + + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExcelVO.java new file mode 100644 index 0000000..1388aeb --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExcelVO.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.module.system.controller.admin.wqdaview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * VIEW Excel VO + * + * @author admin + */ +@Data +public class WqdaViewExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("问卷类型") + private Long typeId; + + @ExcelProperty("问题编号") + private String questionId; + + @ExcelProperty("问题类型") + private String questionType; + + @ExcelProperty("问卷标题") + private String questionLabel; + + @ExcelProperty("问卷答案") + private String questionTitle; + + @ExcelProperty("问卷答案") + private String questionAnswer; + + @ExcelProperty("问题其他") + private String questionComment; + + @ExcelProperty("用户名称") + private String username; + + @ExcelProperty("用户电话") + private String usertel; + + @ExcelProperty("创建时间") + private Date createTime; + + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExportReqVO.java new file mode 100644 index 0000000..bbf3815 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExportReqVO.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.module.system.controller.admin.wqdaview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - VIEW Excel 导出 Request VO", description = "参数和 WqdaViewPageReqVO 是一致的") +@Data +public class WqdaViewExportReqVO { + + @ApiModelProperty(value = "问卷类型编号") + private Long typeId; + + @ApiModelProperty(value = "问题编号") + private String questionId; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题标题") + private String questionTitle; + + @ApiModelProperty(value = "问题答案") + private String questionAnswer; + + @ApiModelProperty(value = "问题其他") + private String questionComment; + + @ApiModelProperty(value = "用户名称") + private String username; + + @ApiModelProperty(value = "用户电话") + private String usertel; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + + @ApiModelProperty(value = "问题标题") + private String questionLabel; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewPageReqVO.java new file mode 100644 index 0000000..c9c2309 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewPageReqVO.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.module.system.controller.admin.wqdaview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - VIEW分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqdaViewPageReqVO extends PageParam { + + @ApiModelProperty(value = "问卷类型编号") + private Long typeId; + + @ApiModelProperty(value = "问题编号") + private String questionId; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题标题") + private String questionTitle; + + @ApiModelProperty(value = "问题答案") + private String questionAnswer; + + @ApiModelProperty(value = "问题其他") + private String questionComment; + + @ApiModelProperty(value = "用户名称") + private String username; + + @ApiModelProperty(value = "用户电话") + private String usertel; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + + @ApiModelProperty(value = "问题标题") + private String questionLabel; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewRespVO.java new file mode 100644 index 0000000..9b95dda --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.wqdaview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - VIEW Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqdaViewRespVO extends WqdaViewBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewUpdateReqVO.java new file mode 100644 index 0000000..5929e71 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.wqdaview.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - VIEW更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqdaViewUpdateReqVO extends WqdaViewBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/WqwtController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/WqwtController.java new file mode 100644 index 0000000..ce5651f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/WqwtController.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.controller.admin.wqwt; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.wqwt.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqwt.WqwtDO; +import com.jojubanking.boot.module.system.convert.wqwt.WqwtConvert; +import com.jojubanking.boot.module.system.service.wqwt.WqwtService; + +@Api(tags = "管理后台 - 问卷调查问题") +@RestController +@RequestMapping("/system/wqwt") +@Validated +public class WqwtController { + + @Resource + private WqwtService wqwtService; + + @PostMapping("/create") + @ApiOperation("创建问卷调查问题") + @PreAuthorize("@ss.hasPermission('system:wqwt:create')") + public CommonResult createWqwt(@Valid @RequestBody WqwtCreateReqVO createReqVO) { + return success(wqwtService.createWqwt(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新问卷调查问题") + @PreAuthorize("@ss.hasPermission('system:wqwt:update')") + public CommonResult updateWqwt(@Valid @RequestBody WqwtUpdateReqVO updateReqVO) { + wqwtService.updateWqwt(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除问卷调查问题") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:wqwt:delete')") + public CommonResult deleteWqwt(@RequestParam("id") Integer id) { + wqwtService.deleteWqwt(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得问卷调查问题") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) + @PreAuthorize("@ss.hasPermission('system:wqwt:query')") + public CommonResult getWqwt(@RequestParam("id") Integer id) { + WqwtDO wqwt = wqwtService.getWqwt(id); + return success(WqwtConvert.INSTANCE.convert(wqwt)); + } + + @GetMapping("/list") + @ApiOperation("获得问卷调查问题列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:wqwt:query')") + public CommonResult> getWqwtList(@RequestParam("ids") Collection ids) { + List list = wqwtService.getWqwtList(ids); + return success(WqwtConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得问卷调查问题分页") + @PreAuthorize("@ss.hasPermission('system:wqwt:query')") + public CommonResult> getWqwtPage(@Valid WqwtPageReqVO pageVO) { + PageResult pageResult = wqwtService.getWqwtPage(pageVO); + return success(WqwtConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出问卷调查问题 Excel") + @PreAuthorize("@ss.hasPermission('system:wqwt:export')") + @OperateLog(type = EXPORT) + public void exportWqwtExcel(@Valid WqwtExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = wqwtService.getWqwtList(exportReqVO); + // 导出 Excel + List datas = WqwtConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "问卷调查问题.xls", "数据", WqwtExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtBaseVO.java new file mode 100644 index 0000000..61c1375 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtBaseVO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.controller.admin.wqwt.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 问卷调查问题 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class WqwtBaseVO { + + @ApiModelProperty(value = "问卷类型编号", required = true) + @NotNull(message = "问卷类型编号不能为空") + private Long typeId; + + @ApiModelProperty(value = "问题编号") + private String questionId; + + @ApiModelProperty(value = "父id") + private String pid; + + @ApiModelProperty(value = "问题级别,分为两级") + private String gradingType; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题标题") + private String questionTitle; + + @ApiModelProperty(value = "选项数目") + private Integer questionOpnum; + + @ApiModelProperty(value = "问题内容") + private String questionContent; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtCreateReqVO.java new file mode 100644 index 0000000..404ad73 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.wqwt.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 问卷调查问题创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqwtCreateReqVO extends WqwtBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtExcelVO.java new file mode 100644 index 0000000..7ac3f06 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtExcelVO.java @@ -0,0 +1,47 @@ +package com.jojubanking.boot.module.system.controller.admin.wqwt.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 问卷调查问题 Excel VO + * + * @author admin + */ +@Data +public class WqwtExcelVO { + + @ExcelProperty("ID") + private Integer id; + + @ExcelProperty("问卷类型编号") + private Long typeId; + + @ExcelProperty("问题编号") + private String questionId; + + @ExcelProperty("父id") + private String pid; + + @ExcelProperty("问题级别,分为两级") + private String gradingType; + + @ExcelProperty("问题类型") + private String questionType; + + @ExcelProperty("问题标题") + private String questionTitle; + + @ExcelProperty("选项数目") + private Integer questionOpnum; + + @ExcelProperty("问题内容") + private String questionContent; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtExportReqVO.java new file mode 100644 index 0000000..dd975ca --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtExportReqVO.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.module.system.controller.admin.wqwt.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 问卷调查问题 Excel 导出 Request VO", description = "参数和 WqwtPageReqVO 是一致的") +@Data +public class WqwtExportReqVO { + + @ApiModelProperty(value = "问卷类型编号") + private Long typeId; + + @ApiModelProperty(value = "问题编号") + private String questionId; + + @ApiModelProperty(value = "父id") + private String pid; + + @ApiModelProperty(value = "问题级别,分为两级") + private String gradingType; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题标题") + private String questionTitle; + + @ApiModelProperty(value = "选项数目") + private Integer questionOpnum; + + @ApiModelProperty(value = "问题内容") + private String questionContent; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtPageReqVO.java new file mode 100644 index 0000000..8b59fe3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtPageReqVO.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.system.controller.admin.wqwt.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 问卷调查问题分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqwtPageReqVO extends PageParam { + + @ApiModelProperty(value = "问卷类型编号") + private Long typeId; + + @ApiModelProperty(value = "问题编号") + private String questionId; + + @ApiModelProperty(value = "父id") + private String pid; + + @ApiModelProperty(value = "问题级别,分为两级") + private String gradingType; + + @ApiModelProperty(value = "问题类型") + private String questionType; + + @ApiModelProperty(value = "问题标题") + private String questionTitle; + + @ApiModelProperty(value = "选项数目") + private Integer questionOpnum; + + @ApiModelProperty(value = "问题内容") + private String questionContent; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtRespVO.java new file mode 100644 index 0000000..6ada1ee --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.wqwt.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 问卷调查问题 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqwtRespVO extends WqwtBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Integer id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtUpdateReqVO.java new file mode 100644 index 0000000..61110f9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.wqwt.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 问卷调查问题更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WqwtUpdateReqVO extends WqwtBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Integer id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainBaseVO.java new file mode 100644 index 0000000..4b94211 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainBaseVO.java @@ -0,0 +1,92 @@ +package com.jojubanking.boot.module.system.controller.admin.xymain.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 体检信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class xyMainBaseVO { + + @ApiModelProperty(value = "体检批次号", required = true) + + private String batchno; + + @ApiModelProperty(value = "体检批次名称", required = true) + + private String batchname; + + @ApiModelProperty(value = "家长openid") + private String openid; + + @ApiModelProperty(value = "默认体检人标识") + private Long defaultflag; + + @ApiModelProperty(value = "病人唯一标识", required = true) + + private String patid; + + @ApiModelProperty(value = "姓名", required = true) + @NotNull(message = "姓名不能为空") + private String name; + + @ApiModelProperty(value = "性别(1男 2女)", required = true) + @NotNull(message = "性别(1男 2女)不能为空") + private Integer sex; + + @ApiModelProperty(value = "年龄", required = true) + @NotNull(message = "年龄不能为空") + private Long age; + + @ApiModelProperty(value = "身份证号", required = true) + @NotNull(message = "身份证号不能为空") + private String nationId; + + @ApiModelProperty(value = "班级ID") + private Long deptId; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "社区名称") + private String sqName; + + @ApiModelProperty(value = "街道名称") + private String jdName; + + @ApiModelProperty(value = "用户邮箱") + private String email; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "缴费标识(0否 1是 )", required = true) + + private Integer feeflag; + + @ApiModelProperty(value = "缴费总金额") + private String feetotal; + + @ApiModelProperty(value = "体检基础套餐费用") + private String tjpkgfee; + + @ApiModelProperty(value = "体检基础套餐代码") + private String tjpkgno; + + @ApiModelProperty(value = "可选体检项目费用") + private String tjkxfee; + + @ApiModelProperty(value = "体检订单号") + private String tjorderno; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainCreateReqVO.java new file mode 100644 index 0000000..de33063 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.xymain.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 体检信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class xyMainCreateReqVO extends xyMainBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainExcelVO.java new file mode 100644 index 0000000..982be8c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainExcelVO.java @@ -0,0 +1,140 @@ +package com.jojubanking.boot.module.system.controller.admin.xymain.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.jojubanking.boot.framework.excel.core.annotations.DictFormat; +import com.jojubanking.boot.framework.excel.core.convert.DictConvert; +import com.jojubanking.boot.module.system.enums.DictTypeConstants; +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 体检信息 Excel VO + * + * @author admin + */ +@Data +public class xyMainExcelVO { + +// @ExcelProperty("ID") + @ExcelIgnore + private Long id; + +// @ExcelProperty("体检批次号") + @ExcelIgnore + private String batchno; + +// @ExcelProperty("体检批次名称") + @ExcelIgnore + private String batchname; + +// @ExcelProperty(value = "家长openid") + @ExcelIgnore + private String openid; + +// @ExcelProperty(value = "默认体检人标识") + @ExcelIgnore + private Long defaultflag; + +// @ExcelProperty(value ={"${bigHead}","${dateHead}","就诊ID"},index = 0) + @ExcelProperty(value ={"${bigHead}","就诊ID"},index = 0) + @ColumnWidth(value = 15) + private String patid; + + @ExcelProperty(value ={"${bigHead}","学校名称"},index = 1) + @ColumnWidth(value = 20) + private String schoolName; + + @ExcelProperty(value ={"${bigHead}","班级名称"},index = 2) + @ColumnWidth(value = 15) + private String className; + + @ExcelProperty(value ={"${bigHead}","姓名"},index = 3) + @ColumnWidth(value = 20) + private String name; + + + @ExcelProperty(value ={"${bigHead}","性别"},index = 4, converter = DictConvert.class) + @DictFormat(DictTypeConstants.USER_SEX) + @ColumnWidth(value = 10) + private Integer sex; + + @ExcelProperty(value ={"${bigHead}","年龄"},index = 5) + @ColumnWidth(value = 10) + private Long age; + + @ExcelProperty(value ={"${bigHead}","身份证号"},index = 6) + @ColumnWidth(value = 20) + private String nationId; + +// @ExcelProperty("班级ID") + @ExcelIgnore + private Long deptId; + +// @ExcelProperty("社区名称") + @ExcelIgnore + private String sqName; + +// @ExcelProperty("街道名称") + @ExcelIgnore + private String jdName; + +// @ExcelProperty("用户邮箱") + @ExcelIgnore + private String email; + +// @ExcelProperty("手机号码") + @ExcelIgnore + private String mobile; + +// @ExcelProperty("备注") + @ExcelIgnore + private String remark; + +// @ExcelProperty("缴费标识(0否 1是 )") + @ExcelIgnore + private Integer feeflag; + +// @ExcelProperty("缴费总金额") + @ExcelIgnore + private String feetotal; + + @ExcelProperty(value ={"${bigHead}","乙肝两对半"},index = 7) + @ColumnWidth(value = 40) + private String tjpkgmx; + + @ExcelIgnore + private String tjpkgno; + + @ExcelProperty(value ={"${bigHead}","乙肝两对半总额(元)"},index = 8) + @ColumnWidth(value = 15) + private String tjpkgfee; + + @ExcelProperty(value ={"${bigHead}","可选项目"},index = 9) + @ColumnWidth(value = 40) + private String tjkxmx; + + @ExcelProperty(value ={"${bigHead}","可选项目总额(元)"},index = 10) + @ColumnWidth(value = 15) + private String tjkxfee; + + @ExcelProperty(value ={"${bigHead}","体检订单号"},index = 11) + @ColumnWidth(value = 10) + private String tjorderno; + + @ExcelIgnore + private byte[] tjQrcode; + + @ExcelProperty(value ={"${bigHead}","体检二维码"},index = 12) + @ColumnWidth(value = 40) + private WriteCellData writeCellDataFile; + +// @ExcelProperty("创建时间") + @ExcelIgnore + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainExportReqVO.java new file mode 100644 index 0000000..42ab3f4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainExportReqVO.java @@ -0,0 +1,88 @@ +package com.jojubanking.boot.module.system.controller.admin.xymain.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 体检信息 Excel 导出 Request VO", description = "参数和 xyMainPageReqVO 是一致的") +@Data +public class xyMainExportReqVO { + + @ApiModelProperty(value = "体检批次号") + private String batchno; + + @ApiModelProperty(value = "体检批次名称") + private String batchname; + + @ApiModelProperty(value = "家长openid") + private String openid; + + @ApiModelProperty(value = "默认体检人标识") + private Long defaultflag; + + @ApiModelProperty(value = "病人唯一标识") + private String patid; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "性别(1男 2女)") + private Integer sex; + + @ApiModelProperty(value = "年龄") + private Long age; + + @ApiModelProperty(value = "身份证号") + private String nationId; + + @ApiModelProperty(value = "班级ID") + private Long deptId; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "社区名称") + private String sqName; + + @ApiModelProperty(value = "街道名称") + private String jdName; + + @ApiModelProperty(value = "用户邮箱") + private String email; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "缴费标识(0否 1是 )") + private Integer feeflag; + + @ApiModelProperty(value = "缴费总金额") + private String feetotal; + + @ApiModelProperty(value = "体检基础套餐费用") + private String tjpkgfee; + + @ApiModelProperty(value = "体检基础套餐代码") + private String tjpkgno; + + @ApiModelProperty(value = "可选体检项目费用") + private String tjkxfee; + + @ApiModelProperty(value = "体检订单号") + private String tjorderno; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageItemRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageItemRespVO.java new file mode 100644 index 0000000..e0e1107 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageItemRespVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.controller.admin.xymain.vo; + +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentRespVO; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@ApiModel(value = "管理后台 - 用户分页时的信息 Response VO", description = "相比用户基本信息来说,会多部门信息") +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class xyMainPageItemRespVO extends xyMainRespVO { + + /** + * 所在部门 + */ + private Dept dept; + + @ApiModel("部门") + @Data + public static class Dept { + + @ApiModelProperty(value = "部门编号", required = true, example = "1") + private Long id; + + @ApiModelProperty(value = "部门名称", required = true, example = "研发部") + private String name; + + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageReqVO.java new file mode 100644 index 0000000..07ee0a8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageReqVO.java @@ -0,0 +1,91 @@ +package com.jojubanking.boot.module.system.controller.admin.xymain.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 体检信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class xyMainPageReqVO extends PageParam { + + @ApiModelProperty(value = "体检批次号") + private String batchno; + + @ApiModelProperty(value = "体检批次名称") + private String batchname; + + @ApiModelProperty(value = "家长openid") + private String openid; + + @ApiModelProperty(value = "默认体检人标识") + private Long defaultflag; + + @ApiModelProperty(value = "病人唯一标识") + private String patid; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "性别(1男 2女)") + private Integer sex; + + @ApiModelProperty(value = "年龄") + private Long age; + + @ApiModelProperty(value = "身份证号") + private String nationId; + + @ApiModelProperty(value = "班级ID") + private Long deptId; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "社区名称") + private String sqName; + + @ApiModelProperty(value = "街道名称") + private String jdName; + + @ApiModelProperty(value = "用户邮箱") + private String email; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "缴费标识(0否 1是 )") + private Integer feeflag; + + @ApiModelProperty(value = "缴费总金额") + private String feetotal; + + @ApiModelProperty(value = "体检基础套餐费用") + private String tjpkgfee; + + @ApiModelProperty(value = "体检基础套餐代码") + private String tjpkgno; + + @ApiModelProperty(value = "可选体检项目费用") + private String tjkxfee; + + @ApiModelProperty(value = "体检订单号") + private String tjorderno; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainRespVO.java new file mode 100644 index 0000000..3695593 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.xymain.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 体检信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class xyMainRespVO extends xyMainBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainUpdateReqVO.java new file mode 100644 index 0000000..24a0ff2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.xymain.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 体检信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class xyMainUpdateReqVO extends xyMainBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/xyMainController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/xyMainController.java new file mode 100644 index 0000000..a8b9b53 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xymain/xyMainController.java @@ -0,0 +1,302 @@ +package com.jojubanking.boot.module.system.controller.admin.xymain; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.data.ImageData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import com.jojubanking.boot.framework.common.util.collection.MapUtils; +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.ChilditemPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.ChilditemRespVO; +import com.jojubanking.boot.module.system.controller.admin.item.vo.ItemPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.item.vo.ItemRespVO; +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentPageItemRespVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserExcelVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserImportExcelVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserImportRespVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.XyrwListReqVO; +import com.jojubanking.boot.module.system.convert.item.ItemConvert; +import com.jojubanking.boot.module.system.convert.student.StudentConvert; +import com.jojubanking.boot.module.system.convert.user.UserConvert; +import com.jojubanking.boot.module.system.dal.dataobject.childitem.ChilditemDO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.deptxq.DeptXqDO; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; +import com.jojubanking.boot.module.system.dal.dataobject.student.StudentDO; + +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; +import com.jojubanking.boot.module.system.service.childitem.ChilditemService; +import com.jojubanking.boot.module.system.service.deptxq.DeptXqService; +import com.jojubanking.boot.module.system.service.item.ItemService; + +import com.jojubanking.boot.module.system.service.xyrw.XyrwService; +import com.jojubanking.boot.module.system.util.xytj.XmlUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.imageio.ImageIO; +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.util.*; +import java.io.IOException; +import java.util.List; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; + +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertList; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertSet; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; +import static com.jojubanking.boot.module.system.util.xytj.BarCodeUtils.getBarCode; +import static com.jojubanking.boot.module.system.util.xytj.BarCodeUtils.insertWords; + +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.xymain.xyMainDO; +import com.jojubanking.boot.module.system.convert.xymain.xyMainConvert; +import com.jojubanking.boot.module.system.service.xymain.xyMainService; +import org.springframework.web.multipart.MultipartFile; + +@Api(tags = "管理后台 - 体检信息") +@RestController +@RequestMapping("/system/xy-main") +@Validated +@Slf4j +public class xyMainController { + + @Resource + private xyMainService xyMainService; + @Resource + private DeptXqService deptXpService; + @Resource + private XyrwService xyrwService; + @Resource + private ChilditemService childitemService; + + @PostMapping("/create") + @ApiOperation("创建体检信息") + @PreAuthorize("@ss.hasPermission('system:xy-main:create')") + public CommonResult createxyMain(@Valid @RequestBody xyMainCreateReqVO createReqVO) { + return success(xyMainService.createxyMain(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新体检信息") + @PreAuthorize("@ss.hasPermission('system:xy-main:update')") + public CommonResult updatexyMain(@Valid @RequestBody xyMainUpdateReqVO updateReqVO) { + xyMainService.updatexyMain(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除体检信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:xy-main:delete')") + public CommonResult deletexyMain(@RequestParam("id") Long id) { + xyMainService.deletexyMain(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得体检信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:xy-main:query')") + public CommonResult getxyMain(@RequestParam("id") Long id) { + xyMainDO xyMain = xyMainService.getxyMain(id); + return success(xyMainConvert.INSTANCE.convert01(xyMain)); + } + + @GetMapping("/list") + @ApiOperation("获得体检信息列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:xy-main:query')") + public CommonResult> getxyMainList(@RequestParam("ids") Collection ids) { + List list = xyMainService.getxyMainList(ids); + return success(xyMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得体检信息分页") + @PreAuthorize("@ss.hasPermission('system:xy-main:query')") + public CommonResult> getxyMainPage(@Valid xyMainPageReqVO pageVO) { +// PageResult pageResult = xyMainService.getxyMainPage(pageVO); +// return success(xyMainConvert.INSTANCE.convertPage(pageResult)); + // 获得用户分页列表 + PageResult pageResult = xyMainService.getxyMainPage(pageVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(new PageResult<>(pageResult.getTotal())); // 返回空 + } + + // 获得拼接需要的数据 + Collection deptIds = convertList(pageResult.getList(), xyMainDO::getDeptId); + Map deptMap = deptXpService.getDeptMap(deptIds); + // 拼接结果返回 + List userList = new ArrayList<>(pageResult.getList().size()); + pageResult.getList().forEach(user -> { + xyMainPageItemRespVO respVO = xyMainConvert.INSTANCE.convert01(user); + respVO.setDept(xyMainConvert.INSTANCE.convert(deptMap.get(user.getDeptId()))); + userList.add(respVO); + }); + return success(new PageResult<>(userList, pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @ApiOperation("导出体检信息 Excel") + @PreAuthorize("@ss.hasPermission('system:xy-main:export')") + @OperateLog(type = EXPORT) + public void exportxyMainExcel(@Valid xyMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException, WriterException { + +// log.info("start export"); +// ChilditemPageReqVO pageVO = new ChilditemPageReqVO(); +// pageVO.setPageSize(60); +// //目前就一个基础项目,直接获取,节约生成时间 +// pageVO.setPackageno("666"); +// String strBaseXX = ""; +// PageResult pageResult = childitemService.getChilditemPage(pageVO); +// for(int j=0; j list = xyrwService.getXyrwSimpleList(xyrwListReqVO); +// String xyrwname = list.get(0).getBatchName(); +// +// List listmains = xyMainService.getxyMainList(exportReqVO); +// +// // 拼接数据 +// List datas = xyMainConvert.INSTANCE.convertList02(listmains); +// +// for(int i=0; i writeCellData = new WriteCellData<>(); +// datas.get(i).setWriteCellDataFile(writeCellData); +// // 这里可以设置为 EMPTY 则代表不需要其他数据了 +// writeCellData.setType(CellDataTypeEnum.EMPTY); +// List imageDataList = new ArrayList<>(); +// ImageData imageData = new ImageData(); +// imageDataList.add(imageData); +// writeCellData.setImageDataList(imageDataList); +// // 放入2进制图片 +// imageData.setImage(qrCodeBytes); +// // 图片类型 +// imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG); +// // 上 右 下 左 需要留空 +// // 这个类似于 css 的 margin +// // 这里实测 不能设置太大 超过单元格原始大小后 打开会提示修复。暂时未找到很好的解法。 +// imageData.setTop(2); +// imageData.setRight(2); +// imageData.setBottom(2); +// imageData.setLeft(2); +// +// xytjkxVO.setOrderno(datas.get(i).getTjorderno()); +// xytjkxVO.setPackageno("0"); +// PageResult xytjkxResult = tJOrderService.getTJOrderPage(xytjkxVO); +// +// String strkxmx = ""; +// for(int k=0; k hints = new HashMap<>(); + hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符集编码类型 + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); // 设置错误校正等级 + + BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.CODE_128, width, height, hints); + + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + if (bitMatrix.get(x, y)) { + image.setRGB(x, y, Color.BLACK.getRGB()); + } else { + image.setRGB(x, y, Color.WHITE.getRGB()); + } + } + } + + ImageIO.write(image, format, outputFile); + + System.out.println("已生成一维码并保存到" + outputFile.getName() + "文件中!"); + } + + @PostMapping("/import") + @ApiOperation("导入体检信息 Excel") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "Excel 文件", required = true, dataTypeClass = MultipartFile.class), + @ApiImplicitParam(name = "updateSupport", value = "是否支持更新,默认为 false", example = "true", dataTypeClass = Boolean.class) + }) + @PreAuthorize("@ss.hasPermission('system:xy-main:import')") + public void importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.read(file, UserImportExcelVO.class); + //return success(userService.importUsers(list, updateSupport)); + + return; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/XyrwController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/XyrwController.java new file mode 100644 index 0000000..dba226f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/XyrwController.java @@ -0,0 +1,150 @@ +package com.jojubanking.boot.module.system.controller.admin.xyrw; + +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.XyrwListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.student.StudentDO; +import com.jojubanking.boot.module.system.service.student.StudentService; +import com.jojubanking.boot.module.system.util.xytj.DateDUtil; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.xyrw.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; +import com.jojubanking.boot.module.system.convert.xyrw.XyrwConvert; +import com.jojubanking.boot.module.system.service.xyrw.XyrwService; + +@Api(tags = "管理后台 - 批次信息") +@RestController +@RequestMapping("/system/xyrw") +@Validated +public class XyrwController { + + @Resource + private XyrwService xyrwService; + @Resource + private StudentService studentService; + + @PostMapping("/create") + @ApiOperation("创建批次信息") + @PreAuthorize("@ss.hasPermission('system:xyrw:create')") + public CommonResult createXyrw(@Valid @RequestBody XyrwCreateReqVO createReqVO) { + //新建批次 + //批次号命名规则:XYTJ20240612001,XYTJ20240618002........; + //XYTJ+年月日+顺序号排下去,到了2025年,再从001、002开始,如XYTJ20250318001,XYTJ20250915002; + //1.获取上一个批次号,如果为空,则从001开始 + //2.非空,比较是否跨年 + //获取下园批次,只取开始状态的批次 + String curBatchno = ""; + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + if(listXyrw.size() > 0){ + curBatchno = listXyrw.get(0).getBatchno(); + String bno = curBatchno.substring(12); + String bdate = curBatchno.substring(4, 8); + if(bdate.equals(DateDUtil.getCurrentDate().substring(0,4))){ + Long lno = Long.parseLong(bno); + lno = lno + 1; + if(lno == 999L ) { + lno = 1L; + } + curBatchno = "XYTJ" + DateDUtil.getCurrentDate() + String.format("%03d", lno); + }else{ + curBatchno = "XYTJ" + DateDUtil.getCurrentDate() + "001"; + } + }else{ + curBatchno = "XYTJ" + DateDUtil.getCurrentDate() + "001"; + } + createReqVO.setBatchno(curBatchno); + + long id = xyrwService.createXyrw(createReqVO); + //更新其他批次为结束 + XyrwUpdateReqVO updateReqVO = new XyrwUpdateReqVO(); + updateReqVO.setBatchStatus(2); + //updateReqVO.setBatchno(createReqVO.getBatchno()); + updateReqVO.setBatchno(curBatchno); + xyrwService.updateXyrwByBatch(updateReqVO); + + return success(id); + } + + @PutMapping("/update") + @ApiOperation("更新批次信息") + @PreAuthorize("@ss.hasPermission('system:xyrw:update')") + public CommonResult updateXyrw(@Valid @RequestBody XyrwUpdateReqVO updateReqVO) { + xyrwService.updateXyrw(updateReqVO); + + //修改对应学生表里面的批次名称 + StudentDO studentDO = new StudentDO(); + studentDO.setBatchname(updateReqVO.getBatchName()); + + studentDO.setBatchno(updateReqVO.getBatchno()); + studentService.updateStudentXyrwName(studentDO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除批次信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:xyrw:delete')") + public CommonResult deleteXyrw(@RequestParam("id") Long id) { + xyrwService.deleteXyrw(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得批次信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:xyrw:query')") + public CommonResult getXyrw(@RequestParam("id") Long id) { + XyrwDO xyrw = xyrwService.getXyrw(id); + return success(XyrwConvert.INSTANCE.convert(xyrw)); + } + + @GetMapping("/list") + @ApiOperation("获得批次信息列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:xyrw:query')") + public CommonResult> getXyrwList(@RequestParam("ids") Collection ids) { + List list = xyrwService.getXyrwList(ids); + return success(XyrwConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得批次信息分页") + @PreAuthorize("@ss.hasPermission('system:xyrw:query')") + public CommonResult> getXyrwPage(@Valid XyrwPageReqVO pageVO) { + PageResult pageResult = xyrwService.getXyrwPage(pageVO); + return success(XyrwConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出批次信息 Excel") + @PreAuthorize("@ss.hasPermission('system:xyrw:export')") + @OperateLog(type = EXPORT) + public void exportXyrwExcel(@Valid XyrwExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = xyrwService.getXyrwList(exportReqVO); + // 导出 Excel + List datas = XyrwConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "批次信息.xls", "数据", XyrwExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwBaseVO.java new file mode 100644 index 0000000..51b955c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwBaseVO.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.system.controller.admin.xyrw.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 批次信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class XyrwBaseVO { + + @ApiModelProperty(value = "批次号", required = true) + @NotNull(message = "批次号不能为空") + private String batchno; + + @ApiModelProperty(value = "体检批次名称", required = true) + @NotNull(message = "体检批次名称不能为空") + private String batchName; + + @ApiModelProperty(value = "批次状态(1进行中 2停止)", required = true) + @NotNull(message = "批次状态(1进行中 2停止)不能为空") + private Integer batchStatus; + + @ApiModelProperty(value = "备注") + private String remark; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwCreateReqVO.java new file mode 100644 index 0000000..f6e04fd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.admin.xyrw.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 批次信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class XyrwCreateReqVO extends XyrwBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwExcelVO.java new file mode 100644 index 0000000..56a4c04 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwExcelVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.controller.admin.xyrw.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 批次信息 Excel VO + * + * @author admin + */ +@Data +public class XyrwExcelVO { + + @ExcelProperty("ID") + private Long id; + + @ExcelProperty("批次号") + private String batchno; + + @ExcelProperty("体检批次名称") + private String batchName; + + @ExcelProperty("批次状态(1进行中 2停止)") + private Integer batchStatus; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwExportReqVO.java new file mode 100644 index 0000000..c60e353 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwExportReqVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.admin.xyrw.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 批次信息 Excel 导出 Request VO", description = "参数和 XyrwPageReqVO 是一致的") +@Data +public class XyrwExportReqVO { + + @ApiModelProperty(value = "批次号") + private String batchno; + + @ApiModelProperty(value = "体检批次名称") + private String batchName; + + @ApiModelProperty(value = "批次状态(1进行中 2停止)") + private Integer batchStatus; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwPageReqVO.java new file mode 100644 index 0000000..70d7fd3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwPageReqVO.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.controller.admin.xyrw.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 批次信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class XyrwPageReqVO extends PageParam { + + @ApiModelProperty(value = "批次号") + private String batchno; + + @ApiModelProperty(value = "体检批次名称") + private String batchName; + + @ApiModelProperty(value = "批次状态(1进行中 2停止)") + private Integer batchStatus; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwRespVO.java new file mode 100644 index 0000000..78aa653 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.admin.xyrw.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("管理后台 - 批次信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class XyrwRespVO extends XyrwBaseVO { + + @ApiModelProperty(value = "ID", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwUpdateReqVO.java new file mode 100644 index 0000000..e45cbcf --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.admin.xyrw.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("管理后台 - 批次信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class XyrwUpdateReqVO extends XyrwBaseVO { + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "ID不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xytjjg/XytjjgController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xytjjg/XytjjgController.java new file mode 100644 index 0000000..78f7f88 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/admin/xytjjg/XytjjgController.java @@ -0,0 +1,121 @@ +package com.jojubanking.boot.module.system.controller.admin.xytjjg; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.admin.xytjjg.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.xytjjg.XytjjgDO; +import com.jojubanking.boot.module.system.convert.xytjjg.XytjjgConvert; +import com.jojubanking.boot.module.system.service.xytjjg.XytjjgService; + +@Api(tags = "管理后台 - HIS项目") +@RestController +@RequestMapping("/system/xytjjg") +@Validated +public class XytjjgController { + + @Resource + private XytjjgService xytjjgService; + + @PostMapping("/create") + @ApiOperation("创建HIS项目") + @PreAuthorize("@ss.hasPermission('system:xytjjg:create')") + public CommonResult createXytjjg(@Valid @RequestBody XytjjgCreateReqVO createReqVO) { + return success(xytjjgService.createXytjjg(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新HIS项目") + @PreAuthorize("@ss.hasPermission('system:xytjjg:update')") + public CommonResult updateXytjjg(@Valid @RequestBody XytjjgUpdateReqVO updateReqVO) { + xytjjgService.updateXytjjg(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除HIS项目") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:xytjjg:delete')") + public CommonResult deleteXytjjg(@RequestParam("id") Long id) { + xytjjgService.deleteXytjjg(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得HIS项目") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + @PreAuthorize("@ss.hasPermission('system:xytjjg:query')") + public CommonResult getXytjjg(@RequestParam("id") Long id) { + XytjjgDO xytjjg = xytjjgService.getXytjjg(id); + return success(XytjjgConvert.INSTANCE.convert(xytjjg)); + } + + @GetMapping("/list") + @ApiOperation("获得HIS项目列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + @PreAuthorize("@ss.hasPermission('system:xytjjg:query')") + public CommonResult> getXytjjgList(@RequestParam("ids") Collection ids) { + List list = xytjjgService.getXytjjgList(ids); + return success(XytjjgConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得HIS项目分页") + @PreAuthorize("@ss.hasPermission('system:xytjjg:query')") + public CommonResult> getXytjjgPage(@Valid XytjjgPageReqVO pageVO) { + PageResult pageResult = xytjjgService.getXytjjgPage(pageVO); + return success(XytjjgConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出HIS项目 Excel") + @PreAuthorize("@ss.hasPermission('system:xytjjg:export')") + @OperateLog(type = EXPORT) + public void exportXytjjgExcel(@Valid XytjjgExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = xytjjgService.getXytjjgList(exportReqVO); + // 导出 Excel + List datas = XytjjgConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "HIS项目.xls", "数据", XytjjgExcelVO.class, datas); + } + + @GetMapping("/getall") + @ApiOperation("导出HIS项目 Excel") + @PreAuthorize("@ss.hasPermission('system:xytjjg:export')") + public CommonResult> getall(@RequestParam("value") String value ){ + //复用excel导出功能,产生前端需要动态数据 + XytjjgExportReqVO exportReqVO = new XytjjgExportReqVO(); + exportReqVO.setItemname(value); + exportReqVO.setItemno(value); + List list = xytjjgService.getXytjjgFilterList01(exportReqVO); + + List datas = XytjjgConvert.INSTANCE.convertList03(list); + + if(list.size() !=0 ){ + for(int i=0; i logout(HttpServletRequest request) { +// String token = SecurityFrameworkUtils.obtainAuthorization(request, securityProperties.getTokenHeader()); +// if (StrUtil.isNotBlank(token)) { +// authService.logout(token); +// } +// return success(true); +// } + + @PostMapping("/refresh-token") + @ApiOperation("刷新令牌") + @ApiImplicitParam(name = "refreshToken", value = "刷新令牌", required = true, dataTypeClass = String.class) + @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 + public CommonResult refreshToken(@RequestParam("refreshToken") String refreshToken) { + return success(authService.refreshToken(refreshToken)); + } + + // ========== 社交登录相关 ========== + + @PostMapping("/social-login") + @ApiOperation(value = "社交快捷登录,使用 code 授权码", notes = "适合未登录的用户,但是社交账号已绑定用户") + public CommonResult socialLogin(@RequestBody @Valid AppAuthSocialLoginReqVO reqVO) { + return success(authService.socialLogin(reqVO)); + } + + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginReqVO.java new file mode 100644 index 0000000..e951cf8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginReqVO.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.module.system.controller.app.auth.vo; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.validation.InEnum; +import com.jojubanking.boot.framework.common.validation.Mobile; +import com.jojubanking.boot.module.system.enums.social.SocialTypeEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.NotEmpty; + +@ApiModel(value = "用户 APP - 手机 + 密码登录 Request VO", description = "如果登录并绑定社交用户,需要传递 social 开头的参数") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AppAuthLoginReqVO { + + @ApiModelProperty(value = "手机号", required = true, example = "15601691300") + @NotEmpty(message = "手机号不能为空") + @Mobile + private String mobile; + + @ApiModelProperty(value = "密码", required = true, example = "buzhidao") + @NotEmpty(message = "密码不能为空") + @Length(min = 4, max = 16, message = "密码长度为 4-16 位") + private String password; + + // ========== 绑定社交登录时,需要传递如下参数 ========== + + @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") + @InEnum(SocialTypeEnum.class) + private Integer socialType; + + @ApiModelProperty(value = "授权码", required = true, example = "1024") + private String socialCode; + + @ApiModelProperty(value = "state", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") + private String socialState; + + @AssertTrue(message = "授权码不能为空") + public boolean isSocialCodeValid() { + return socialType == null || StrUtil.isNotEmpty(socialCode); + } + + @AssertTrue(message = "授权 state 不能为空") + public boolean isSocialState() { + return socialType == null || StrUtil.isNotEmpty(socialState); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginRespVO.java new file mode 100644 index 0000000..9a05da1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginRespVO.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.controller.app.auth.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@ApiModel("用户 APP - 登录 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AppAuthLoginRespVO { + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + private Long userId; + + @ApiModelProperty(value = "访问令牌", required = true, example = "happy") + private String accessToken; + + @ApiModelProperty(value = "刷新令牌", required = true, example = "nice") + private String refreshToken; + + @ApiModelProperty(value = "过期时间", required = true) + private Date expiresTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthSocialLoginReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthSocialLoginReqVO.java new file mode 100644 index 0000000..655dd94 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthSocialLoginReqVO.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.controller.app.auth.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; + +@ApiModel("用户 APP - 社交快捷登录 Request VO,使用 code 授权码") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AppAuthSocialLoginReqVO { + +// @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") +// @InEnum(SocialTypeEnum.class) +// @NotNull(message = "社交平台的类型不能为空") +// private Integer type; + + @ApiModelProperty(value = "授权码", required = true, example = "1024") + @NotEmpty(message = "授权码不能为空") + private String code; + +// @ApiModelProperty(value = "state", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62") +// @NotEmpty(message = "state 不能为空") +// private String state; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/carousel/AppCarouselController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/carousel/AppCarouselController.java new file mode 100644 index 0000000..c7ad3d2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/carousel/AppCarouselController.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.controller.app.carousel; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.carousel.vo.CarouselExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.carousel.vo.CarouselRespVO; +import com.jojubanking.boot.module.system.controller.admin.hospital.vo.HospitalExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.hospital.vo.HospitalRespVO; +import com.jojubanking.boot.module.system.controller.admin.information.vo.InformationExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.information.vo.InformationRespVO; +import com.jojubanking.boot.module.system.controller.app.userinfo.vo.AppUserInfoPageReqVO; +import com.jojubanking.boot.module.system.controller.app.userinfo.vo.AppUserInfoRespVO; +import com.jojubanking.boot.module.system.convert.carousel.CarouselConvert; +import com.jojubanking.boot.module.system.convert.hospital.HospitalConvert; +import com.jojubanking.boot.module.system.convert.information.InformationConvert; +import com.jojubanking.boot.module.system.convert.userinfo.UserInfoConvert; +import com.jojubanking.boot.module.system.dal.dataobject.carousel.CarouselDO; +import com.jojubanking.boot.module.system.dal.dataobject.hospital.HospitalDO; +import com.jojubanking.boot.module.system.dal.dataobject.information.InformationDO; +import com.jojubanking.boot.module.system.dal.dataobject.userinfo.UserInfoDO; +import com.jojubanking.boot.module.system.service.carousel.CarouselService; +import com.jojubanking.boot.module.system.service.hospital.HospitalService; +import com.jojubanking.boot.module.system.service.information.InformationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +/** + * @ClassName: AppCarouselController + * @Description: + * @Author T.W + * @Date 2023/3/20 + * @Version 1.0 + */ +@Api(tags = "用户 APP - 用户信息") +@RestController +@RequestMapping("/member/carousel-info") +@Validated +public class AppCarouselController { + @Resource + private CarouselService carouselService; + @Resource + private InformationService informationService; + @Resource + private HospitalService hospitalService; + + @PostMapping("/page") + @ApiOperation("获得轮播图分页") + public CommonResult> getUserInfoList() { + CarouselExportReqVO exportReqVO = new CarouselExportReqVO(); + exportReqVO.setType(1); + List list = carouselService.getCarouselList(exportReqVO); + return success(CarouselConvert.INSTANCE.convertList(list)); + } + + @PostMapping("/info") + @ApiOperation("获得健康信息分页") + public CommonResult> getInformationInfoList() { + InformationExportReqVO exportReqVO = new InformationExportReqVO(); + exportReqVO.setType(1); + List list = informationService.getInformationList(exportReqVO); + return success(InformationConvert.INSTANCE.convertList(list)); + } + + @PostMapping("/hospital") + @ApiOperation("获得医院信息分页") + public CommonResult getHospitalInfoList() { + HospitalExportReqVO exportReqVO = new HospitalExportReqVO(); + //exportReqVO.setType(1); + List list = hospitalService.getHospitalList(exportReqVO); + return success(HospitalConvert.INSTANCE.convert(list.get(0))); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/dict/AppDictDataController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/dict/AppDictDataController.java new file mode 100644 index 0000000..b744b8b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/dict/AppDictDataController.java @@ -0,0 +1,4 @@ +package com.jojubanking.boot.module.system.controller.app.dict; + +public class AppDictDataController { +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/package-info.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/package-info.java new file mode 100644 index 0000000..0f5471c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位,避免 package 无法提交到 Git 仓库 + */ +package com.jojubanking.boot.module.system.controller.app; diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/AppUserInfoController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/AppUserInfoController.java new file mode 100644 index 0000000..eba92ae --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/AppUserInfoController.java @@ -0,0 +1,106 @@ +package com.jojubanking.boot.module.system.controller.app.userinfo; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import io.swagger.annotations.*; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +import com.jojubanking.boot.framework.excel.core.util.ExcelUtils; + +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import static com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.jojubanking.boot.module.system.controller.app.userinfo.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.userinfo.UserInfoDO; +import com.jojubanking.boot.module.system.convert.userinfo.UserInfoConvert; +import com.jojubanking.boot.module.system.service.userinfo.UserInfoService; + +@Api(tags = "用户 APP - 用户信息") +@RestController +@RequestMapping("/member/user-info") +@Validated +public class AppUserInfoController { + + @Resource + private UserInfoService userInfoService; + + @PostMapping("/test") + @ApiOperation("测试") + public CommonResult test() { + return success(true); + } + + @PostMapping("/create") + @ApiOperation("创建用户信息") + + public CommonResult createUserInfo(@Valid @RequestBody AppUserInfoCreateReqVO createReqVO) { + return success(userInfoService.createUserInfo(createReqVO)); + } + + @PutMapping("/update") + @ApiOperation("更新用户信息") + + public CommonResult updateUserInfo(@Valid @RequestBody AppUserInfoUpdateReqVO updateReqVO) { + userInfoService.updateUserInfo(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除用户信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) + + public CommonResult deleteUserInfo(@RequestParam("id") Long id) { + userInfoService.deleteUserInfo(id); + return success(true); + } + + @GetMapping("/get") + @ApiOperation("获得用户信息") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) + + public CommonResult getUserInfo(@RequestParam("id") Long id) { + UserInfoDO userInfo = userInfoService.getUserInfo(id); + return success(UserInfoConvert.INSTANCE.convert(userInfo)); + } + + @GetMapping("/list") + @ApiOperation("获得用户信息列表") + @ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class) + + public CommonResult> getUserInfoList(@RequestParam("ids") Collection ids) { + List list = userInfoService.getUserInfoList(ids); + return success(UserInfoConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @ApiOperation("获得用户信息分页") + + public CommonResult> getUserInfoPage(@Valid AppUserInfoPageReqVO pageVO) { + PageResult pageResult = userInfoService.getUserInfoPage(pageVO); + return success(UserInfoConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @ApiOperation("导出用户信息 Excel") + + @OperateLog(type = EXPORT) + public void exportUserInfoExcel(@Valid AppUserInfoExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = userInfoService.getUserInfoList(exportReqVO); + // 导出 Excel + List datas = UserInfoConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "用户信息.xls", "数据", AppUserInfoExcelVO.class, datas); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoBaseVO.java new file mode 100644 index 0000000..cb53cc4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoBaseVO.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.module.system.controller.app.userinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +/** +* 用户信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class AppUserInfoBaseVO { + + @ApiModelProperty(value = "openid") + private String openid; + + @ApiModelProperty(value = "用户名") + private String name; + + @ApiModelProperty(value = "账号") + private String user; + + @ApiModelProperty(value = "登录密码") + private String password; + + @ApiModelProperty(value = "移动电话") + private String phone; + + @ApiModelProperty(value = "身份证") + private String idno; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "头像url") + private String headurl; + + @ApiModelProperty(value = "出生日期") + private String birthdate; + + @ApiModelProperty(value = "籍贯") + private String nativeplace; + + @ApiModelProperty(value = "国家") + private String country; + + @ApiModelProperty(value = "省份") + private String province; + + @ApiModelProperty(value = "城市") + private String city; + + @ApiModelProperty(value = "性别") + private String sex; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoCreateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoCreateReqVO.java new file mode 100644 index 0000000..1f806ba --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoCreateReqVO.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.controller.app.userinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("用户 APP - 用户信息创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AppUserInfoCreateReqVO extends AppUserInfoBaseVO { + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoExcelVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoExcelVO.java new file mode 100644 index 0000000..5e962a6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoExcelVO.java @@ -0,0 +1,68 @@ +package com.jojubanking.boot.module.system.controller.app.userinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 用户信息 Excel VO + * + * @author admin + */ +@Data +public class AppUserInfoExcelVO { + + @ExcelProperty("用户id") + private Long id; + + @ExcelProperty("openid") + private String openid; + + @ExcelProperty("用户名") + private String name; + + @ExcelProperty("账号") + private String user; + + @ExcelProperty("登录密码") + private String password; + + @ExcelProperty("移动电话") + private String phone; + + @ExcelProperty("身份证") + private String idno; + + @ExcelProperty("邮箱") + private String email; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("头像url") + private String headurl; + + @ExcelProperty("出生日期") + private String birthdate; + + @ExcelProperty("籍贯") + private String nativeplace; + + @ExcelProperty("国家") + private String country; + + @ExcelProperty("省份") + private String province; + + @ExcelProperty("城市") + private String city; + + @ExcelProperty("性别") + private String sex; + + @ExcelProperty("创建时间") + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoExportReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoExportReqVO.java new file mode 100644 index 0000000..977ac9d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoExportReqVO.java @@ -0,0 +1,65 @@ +package com.jojubanking.boot.module.system.controller.app.userinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "用户 APP - 用户信息 Excel 导出 Request VO", description = "参数和 UserInfoPageReqVO 是一致的") +@Data +public class AppUserInfoExportReqVO { + + @ApiModelProperty(value = "openid") + private String openid; + + @ApiModelProperty(value = "用户名") + private String name; + + @ApiModelProperty(value = "账号") + private String user; + + @ApiModelProperty(value = "登录密码") + private String password; + + @ApiModelProperty(value = "移动电话") + private String phone; + + @ApiModelProperty(value = "身份证") + private String idno; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "头像url") + private String headurl; + + @ApiModelProperty(value = "出生日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] birthdate; + + @ApiModelProperty(value = "籍贯") + private String nativeplace; + + @ApiModelProperty(value = "国家") + private String country; + + @ApiModelProperty(value = "省份") + private String province; + + @ApiModelProperty(value = "城市") + private String city; + + @ApiModelProperty(value = "性别") + private String sex; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoPageReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoPageReqVO.java new file mode 100644 index 0000000..63b2d00 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoPageReqVO.java @@ -0,0 +1,67 @@ +package com.jojubanking.boot.module.system.controller.app.userinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import com.jojubanking.boot.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("用户 APP - 用户信息分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AppUserInfoPageReqVO extends PageParam { + + @ApiModelProperty(value = "openid") + private String openid; + + @ApiModelProperty(value = "用户名") + private String name; + + @ApiModelProperty(value = "账号") + private String user; + + @ApiModelProperty(value = "登录密码") + private String password; + + @ApiModelProperty(value = "移动电话") + private String phone; + + @ApiModelProperty(value = "身份证") + private String idno; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "头像url") + private String headurl; + + @ApiModelProperty(value = "出生日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] birthdate; + + @ApiModelProperty(value = "籍贯") + private String nativeplace; + + @ApiModelProperty(value = "国家") + private String country; + + @ApiModelProperty(value = "省份") + private String province; + + @ApiModelProperty(value = "城市") + private String city; + + @ApiModelProperty(value = "性别") + private String sex; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoRespVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoRespVO.java new file mode 100644 index 0000000..3169017 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoRespVO.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.controller.app.userinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; + +@ApiModel("用户 APP - 用户信息 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AppUserInfoRespVO extends AppUserInfoBaseVO { + + @ApiModelProperty(value = "用户id", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoUpdateReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoUpdateReqVO.java new file mode 100644 index 0000000..afea3e6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.controller.app.userinfo.vo; + +import lombok.*; +import java.util.*; +import io.swagger.annotations.*; +import javax.validation.constraints.*; + +@ApiModel("用户 APP - 用户信息更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AppUserInfoUpdateReqVO extends AppUserInfoBaseVO { + + @ApiModelProperty(value = "用户id", required = true) + @NotNull(message = "用户id不能为空") + private Long id; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/AppDeptInfoController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/AppDeptInfoController.java new file mode 100644 index 0000000..46d04f3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/AppDeptInfoController.java @@ -0,0 +1,422 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo; + +import cn.hutool.core.io.IoUtil; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonObject; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.operatelog.core.annotations.OperateLog; +import com.jojubanking.boot.module.infra.service.file.FileService; +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.ChilditemPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.deptxq.vo.DeptXqListReqVO; +import com.jojubanking.boot.module.system.controller.admin.deptxq.vo.DeptXqSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.item.vo.ItemExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.item.vo.ItemRespVO; +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.MzdmExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.MzdmPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.order.vo.OrderExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.refundapply.vo.RefundApplyCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.refundapply.vo.RefundApplyExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentRespVO; +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentUpdateReqVO; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainRespVO; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainUpdateReqVO; +import com.jojubanking.boot.module.system.controller.admin.xyrw.vo.XyrwRespVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.*; +import com.jojubanking.boot.module.system.convert.deptxq.DeptXqConvert; +import com.jojubanking.boot.module.system.convert.item.ItemConvert; +import com.jojubanking.boot.module.system.convert.student.StudentConvert; +import com.jojubanking.boot.module.system.convert.xymain.xyMainConvert; +import com.jojubanking.boot.module.system.convert.xyrw.XyrwConvert; +import com.jojubanking.boot.module.system.dal.dataobject.childitem.ChilditemDO; +import com.jojubanking.boot.module.system.dal.dataobject.deptxq.DeptXqDO; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; +import com.jojubanking.boot.module.system.dal.dataobject.mzdm.MzdmDO; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import com.jojubanking.boot.module.system.dal.dataobject.refundapply.RefundApplyDO; +import com.jojubanking.boot.module.system.dal.dataobject.student.StudentDO; +import com.jojubanking.boot.module.system.dal.dataobject.xymain.xyMainDO; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; +import com.jojubanking.boot.module.system.framework.tjfiles.TjfilesProperties; +import com.jojubanking.boot.module.system.service.childitem.ChilditemService; +import com.jojubanking.boot.module.system.service.deptxq.DeptXqService; +import com.jojubanking.boot.module.system.service.item.ItemService; +import com.jojubanking.boot.module.system.service.mzdm.MzdmService; +import com.jojubanking.boot.module.system.service.order.OrderService; +import com.jojubanking.boot.module.system.service.refundapply.RefundApplyService; +import com.jojubanking.boot.module.system.service.student.StudentService; +import com.jojubanking.boot.module.system.service.xymain.xyMainService; +import com.jojubanking.boot.module.system.service.xyrw.XyrwService; +import com.jojubanking.boot.module.system.util.xytj.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.text.DecimalFormat; +import java.util.*; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.error; +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +@Api(tags = "APP - 机构信息") +@RestController +@RequestMapping("/member/dept-info") +@Validated +@Slf4j +public class AppDeptInfoController { + @Resource + private DeptXqService deptXqService; + + @Resource + private xyMainService xyMainService; + @Resource + private ItemService itemService; + @Resource + private ChilditemService childitemService; + @Resource + private StudentService studentService; + + @Resource + private XyrwService xyrwService; + @Resource + private MzdmService mzdmService; + + @Resource + private RefundApplyService refundApplyService; + @Resource + private OrderService orderService; + @Resource + private TjfilesProperties tjfilesProperties; + + @Resource + private FileService fileService; + + @PostMapping("/upload") + @ApiOperation("上传文件") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "文件附件", required = true, dataTypeClass = MultipartFile.class), + @ApiImplicitParam(name = "path", value = "文件路径", example = "jojuyuanma.png", dataTypeClass = String.class) + }) + @OperateLog(logArgs = false) // 上传文件,没有记录操作日志的必要 + public CommonResult uploadFile(@RequestParam("file") MultipartFile file, + @RequestParam(value = "path", required = false) String path) throws Exception { + return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()))); + } + + + @PostMapping("/createRefund") + @ApiOperation("创建就诊卡退费申请") + public CommonResult createRefundApply(@Valid @RequestBody RefundApplyCreateReqVO createReqVO) { + + //查询姓名+身份证号相同的资料 + RefundApplyExportReqVO exportReqVO = new RefundApplyExportReqVO(); + exportReqVO.setRefname(createReqVO.getRefname()); + exportReqVO.setRefidcard(createReqVO.getRefidcard()); + List list = refundApplyService.getRefundApplyList(exportReqVO); + if(list.size() != 0){ + return error(REFUND_APPLY_SYSTEM_CARDNO_ERROR); + } + return success(refundApplyService.createRefundApply(createReqVO)); + } + @PostMapping("/create") + @ApiOperation("创建体检信息") + public CommonResult createxyMain(@Valid @RequestBody StudentCreateReqVO createReqVO) throws Exception { + String cardtype; + //每个身份证只能一条记录 + //第一步查档 + HashMap map = WSUtil.getPatient(createReqVO.getNationId(), "1"); + String errCode = StringDUtil.changeNullToEmpty(map.get("errCode")); + + if("0".equals(errCode)) { + HashMap patientMap = (HashMap) ((List)map.get("list")).get(0); + + if(patientMap.get("brzt").equals("R")){ + log.info("new user"); + //第二步如果新用户,则自动身份证建档 + + //获取民族代码 + MzdmExportReqVO exportReqVO = new MzdmExportReqVO(); + exportReqVO.setName(createReqVO.getSqName()); + List list = mzdmService.getMzdmList(exportReqVO); + String mzdm = ""; + if(list.size() != 0){ + mzdm = list.get(0).getMzdm().toString(); + } + HashMap map1 = WSUtil.addUser(createReqVO.getName(), createReqVO.getNationId(), + createReqVO.getMobile(), mzdm); + String errCode1 = StringDUtil.changeNullToEmpty(map1.get("errCode")); + if("0".equals(errCode1)) { + HashMap newpatientMap = (HashMap) ((List)map1.get("list")).get(0); + createReqVO.setPatid(newpatientMap.get("patid").toString()); + //cardtype = newpatientMap.get("cardtype").toString(); + cardtype = "1"; + }else { + return error(TJ_SYSTEM_CREATEUSR_ERROR); + } + + }else{ + log.info("exist user"); + createReqVO.setPatid(patientMap.get("patid").toString()); + cardtype = patientMap.get("cardtype").toString(); + } + + }else { + return error(TJ_SYSTEM_CARDNO_ERROR); + } + //第三步更新学生信息 + //return success(xyMainService.createxyMain(createReqVO)); + //return success(studentService.createStudent(createReqVO)); + StudentUpdateReqVO updateReqVO = new StudentUpdateReqVO(); + updateReqVO.setPatid(createReqVO.getPatid()); + updateReqVO.setOpenid(createReqVO.getOpenid()); + + //从身份证号计算年龄和性别 + String idCardNumber = createReqVO.getNationId(); + IDCardParser parser = new IDCardParser(idCardNumber); + parser.parse(); + + String birthDate = parser.getBirthDate(); + int gender = parser.getGender(); + + AgeCalculator calculator = new AgeCalculator(birthDate); + int age = calculator.calculateAge(); + + updateReqVO.setAge(Long.valueOf(age)); + updateReqVO.setSex(gender); + updateReqVO.setName(createReqVO.getName()); + updateReqVO.setId(createReqVO.getDeptId()); //deptid 已经不用,给id复用一下 + updateReqVO.setNationId(createReqVO.getNationId()); + + studentService.updateStudent(updateReqVO); + return success(cardtype); + } + + @PostMapping("/update") + @ApiOperation("更新体检信息") + public CommonResult updatexyMain(@Valid @RequestBody StudentUpdateReqVO updateReqVO) { + //已有缴费记录不允许修改 + +// xyMainService.updatexyMain(updateReqVO); + studentService.updateStudent(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @ApiOperation("删除体检信息") + public CommonResult deletexyMain(@RequestParam Long id) { + ////已有缴费记录不允许删除 +// Long xid = Long.getLong(id); + //xyMainService.deletexyMain(id); + studentService.deleteStudent(id); + return success(true); + } + + @GetMapping("/list-simple-student") + @ApiOperation("获得体检信息") + public CommonResult> getSimplexyMain(@RequestParam("openid") String openid, @RequestParam("batchno") String batchno) { + //通过家长的openid 获取体检人信息 +// StudentExportReqVO reqVO = new StudentExportReqVO(); +// reqVO.setOpenid(openid); + List list = studentService.getStudentListSimple(openid, batchno); + + //通过list中的patid去order表查orderno和paystatus + for(int i = 0; i < list.size(); i++){ + String patid = list.get(i).getPatid(); + + OrderExportReqVO exportReqVO = new OrderExportReqVO(); + exportReqVO.setPatid(patid); + List lstOrder = orderService.getOrderList(exportReqVO); + if(lstOrder.size() != 0){ + for(int j = 0; j < lstOrder.size(); j++){ + if(lstOrder.get(j).getPaystatus() != null) { + if (lstOrder.get(j).getPaystatus().equals("0") && !lstOrder.get(j).getOrderno().equals("")) { + log.info("tj 查询订单号:" + lstOrder.get(j).getOrderno()); + //paystatus 如果是0,就去微信复核一下,如果已支付就更新student和order表的标识,并更新list的feeflag + String ipport = tjfilesProperties.getIpport(); + JSONObject jsonParam = new JSONObject(); + jsonParam.put("out_trade_no", lstOrder.get(j).getOrderno()); + String res = HttpClientUtil.doPost(ipport + "/api/wxpay/findWxPayResult", jsonParam); + log.info("tj 查询订单号返回:" + res); + JSONObject jsonResult = JSONObject.parseObject(res); + if (jsonResult.get("errCode").equals("0")) { + JSONObject data = jsonResult.getJSONObject("data"); + if (data.get("tradeState").equals("SUCCESS")) { + log.info("确认该学生已付款"); + list.get(i).setFeeflag("1"); + + //更新student表的feeflag和order表的paystatus + //根据收据号更新支付状态 + //获取下园批次,只取开始状态的批次 + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + + OrderDO orderDO = new OrderDO(); + orderDO.setOrderno(lstOrder.get(j).getOrderno()); + + orderDO.setPaystatus("1"); + orderService.updateOrderByNotify(orderDO); + + //更新学生表的缴费标识 + StudentDO studenDO = new StudentDO(); + studenDO.setOrderno(lstOrder.get(j).getOrderno()); + studenDO.setBatchno(listXyrw.get(0).getBatchno()); + + studenDO.setFeeflag(1); + studentService.updateOrderByNotify(studenDO); + } + } + } else { + log.info("该学生已付款"); + } + } + else{ + log.info("该学生还无订单"); + } + } + }else{ + log.info("该学生还未选项目"); + } + } + + + + return success(list); + } + @GetMapping("/list-init-student") + @ApiOperation("获得体检信息") + public CommonResult getInitStudent(@RequestParam("nationid") String nationid, @RequestParam("batchno") String batchno) { + //通过家长的openid 获取体检人信息 +// StudentExportReqVO reqVO = new StudentExportReqVO(); +// reqVO.setOpenid(openid); + StudentDO list = studentService.getStudentListInit(nationid, batchno); + + return success(list); + } + + @GetMapping("/list-student") + @ApiOperation("获得体检信息列表") + public CommonResult> getxyMainList(@RequestParam Long deptid) { + xyMainExportReqVO reqVO = new xyMainExportReqVO(); + reqVO.setDeptId(deptid); + List list = xyMainService.getxyMainListSimple(reqVO); + return success(xyMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/list-xyrw") + @ApiOperation("获得批次信息列表") + public CommonResult> getXyrwList() { + //获取下园批次,只取开始状态的批次 + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List list = xyrwService.getXyrwSimpleList(xyrwListReqVO); + return success(XyrwConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/list-all-simple") + @ApiOperation(value = "获取部门精简信息列表", notes = "只包含被开启的部门,主要用于前端的下拉选项") + public CommonResult> getSimpleDepts(@RequestParam Long parentid) { + // 获得部门列表,只要开启状态的 + DeptXqtjListReqVO reqVO = new DeptXqtjListReqVO(); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setParentId(parentid); + List list = deptXqService.getSimpleXqtjDepts(reqVO); + // 排序后,返回给前端 + list.sort(Comparator.comparing(DeptXqDO::getSort)); + return success(DeptXqConvert.INSTANCE.convertList03(list)); + } + + + @GetMapping("/list-item") + @ApiOperation("获得检查项目列表") + public CommonResult> getItemList(@RequestParam String packageno, @RequestParam String patid) { + DecimalFormat df = new DecimalFormat("0.00"); + Double packnumber = 0.00; + + //获取下园批次,只取开始状态的批次 + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + + //使用packageno 是否非0来获取不同列表 + ItemListReqVO itemListReqVO = new ItemListReqVO(); + itemListReqVO.setPackageno(packageno); + + //如果是package,更新itemno为明细,后期还要优化 + String packContent = ""; + if(packageno.equals("666")){ + ItemListReqVO pageReqVO = new ItemListReqVO(); + pageReqVO.setPackageno(packageno); + List list1 = childitemService.getSimpleItemList(pageReqVO); + for(int i=0; i list = itemService.getSimpleItemList(patid, packageno, listXyrw.get(0).getBatchno()); + for(int i=0; i listBase = itemService.getItemList(itemExportReqVO); + for(int j=0; j addUser(@RequestParam String hzxm, @RequestParam String sfzh, + @RequestParam String lxdh, @RequestParam String mzdm) throws Exception { + return WSUtil.addUser(hzxm, sfzh, lxdh, mzdm); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/AppPayOrderController.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/AppPayOrderController.java new file mode 100644 index 0000000..ea4a22f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/AppPayOrderController.java @@ -0,0 +1,530 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.idempotent.core.annotation.Idempotent; +import com.jojubanking.boot.module.system.WebLog; +import com.jojubanking.boot.module.system.controller.admin.order.vo.OrderCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.order.vo.OrderExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainCreateReqVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.childitem.ChilditemDO; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import com.jojubanking.boot.module.system.dal.dataobject.student.StudentDO; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; +import com.jojubanking.boot.module.system.service.childitem.ChilditemService; +import com.jojubanking.boot.module.system.service.item.ItemService; +import com.jojubanking.boot.module.system.service.order.OrderService; +import com.jojubanking.boot.module.system.service.student.StudentService; +import com.jojubanking.boot.module.system.service.xymain.xyMainService; +import com.jojubanking.boot.module.system.service.xyrw.XyrwService; +import com.jojubanking.boot.module.system.util.xytj.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.dom4j.DocumentException; +import org.slf4j.ILoggerFactory; +import org.springframework.http.*; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.*; + +import static com.jojubanking.boot.framework.common.pojo.CommonResult.success; + +@Api(tags = "APP - 订单缴费") +@RestController +@RequestMapping("/member/order-info") +@Validated +@Slf4j +public class AppPayOrderController { + static RestTemplate restTemplate = new RestTemplate(); + static HttpHeaders headers; + static { + headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + } + + @Resource + private xyMainService xyMainService; + @Resource + private ItemService itemService; + @Resource + private ChilditemService childitemService; + @Resource + private OrderService orderService; + @Resource + private StudentService studentService; + + @Resource + private XyrwService xyrwService; + + @PostMapping("/listOrder") + @ApiOperation("创建体检信息") + public HashMap listOrder(@Valid @RequestBody FeeListVO feeListVO) throws DocumentException { + //获取下园批次,只取开始状态的批次 + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + + DecimalFormat df = new DecimalFormat("0.00"); + + List listStand = new ArrayList<>(); + OrderExportReqVO exportReqVO = new OrderExportReqVO(); + exportReqVO.setPaystatus("1"); + exportReqVO.setPatid(feeListVO.getPatid()); + exportReqVO.setBatchno(listXyrw.get(0).getBatchno()); + exportReqVO.setPackageflag(1); + List listPackage = orderService.getOrderList(exportReqVO); + if(listPackage.size() !=0 ){ + ItemListReqVO pageReqVO = new ItemListReqVO(); + pageReqVO.setPackageno("666"); + List list1 = childitemService.getSimpleItemList(pageReqVO); + for(int i=0; i< list1.size(); i++){ + ChilditemDO newitem = list1.get(i); + newitem.setItemprice(df.format(Double.parseDouble(list1.get(i).getItemprice())/100)); + listStand.add(newitem); + } + } + exportReqVO.setPaystatus("1"); + exportReqVO.setPatid(feeListVO.getPatid()); + exportReqVO.setBatchno(listXyrw.get(0).getBatchno()); + exportReqVO.setPackageflag(0); + List listAddtion = orderService.getOrderList(exportReqVO); + + HashMap resultMap = new HashMap(); + resultMap.put("listStand", listStand); + resultMap.put("listAddtion", listAddtion); + resultMap.put("errCode","0"); + resultMap.put("errMsg", ""); + return resultMap; + } + + @PostMapping("/updateOrder") + @ApiOperation("创建体检信息") + @WebLog(description = "updateOrder") + public HashMap updateOrder(@Valid @RequestBody FeeUpdateVO feeUpdateVO) throws DocumentException { + //根据收据号更新支付状态 + //获取下园批次,只取开始状态的批次 + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + + OrderDO orderDO = new OrderDO(); + orderDO.setOrderno(feeUpdateVO.getOrderid()); + + orderDO.setPaystatus("1"); + orderService.updateOrderByNotify(orderDO); + + //更新学生表的缴费标识 + StudentDO studenDO = new StudentDO(); + studenDO.setOrderno(feeUpdateVO.getOrderid()); + studenDO.setBatchno(listXyrw.get(0).getBatchno()); + + studenDO.setFeeflag(1); + studentService.updateOrderByNotify(studenDO); + + HashMap resultMap = new HashMap(); + resultMap.put("errCode","0"); + resultMap.put("errMsg", ""); + return resultMap; + } + + @PostMapping("/confirmOrder") + @ApiOperation("创建体检信息") + @WebLog(description = "confirmOrder") + public HashMap confirmOrder(@Valid @RequestBody FeeInfoVO feeInfoVO) throws DocumentException { + //预结算的时候 更新sjh + //获取下园批次,只取开始状态的批次 + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + + //更新必选体检项目 + ItemListReqVO pageReqVO = new ItemListReqVO(); + String packageNo = ""; + for(int j=0; j list1 = childitemService.getSimpleItemList(pageReqVO); + for(int i=0; i lstorder = orderService.getOrderList(exportReqVO); + + if(lstorder.size() != 0){ + //更新order表 + OrderDO orderDO = new OrderDO(); + orderDO.setBatchno(listXyrw.get(0).getBatchno()); + orderDO.setPatid(feeInfoVO.getPatid()); + orderDO.setItemname(feeInfoVO.getDetail().get(j).getYpmc()); + //可选项包编号总是0 + orderDO.setPackageno("0"); + + orderDO.setPaystatus("0"); + orderDO.setSjh(feeInfoVO.getSjh()); + orderDO.setOrderno(feeInfoVO.getOrderId()); + orderService.updateOrderByPay(orderDO); + } + } + + //更新学生表的缴费标识 + StudentDO studenDO = new StudentDO(); + studenDO.setPatid(feeInfoVO.getPatid()); + studenDO.setBatchno(listXyrw.get(0).getBatchno()); + + studenDO.setOrderno(feeInfoVO.getOrderId()); + studentService.updateOrderByConfirm(studenDO); + + HashMap resultMap = new HashMap(); + resultMap.put("errCode","0"); + resultMap.put("errMsg", ""); + return resultMap; + } + + @PostMapping("/payorder") + @ApiOperation("创建体检信息") + @WebLog(description = "payorder") + @Idempotent(timeout = 10, message = "重复请求,请稍后重试") + public HashMap payorder(@Valid @RequestBody xyMainOrderVO xyOrderVO) throws DocumentException { + List> listSuccess = new ArrayList<>();; + List> listFail = new ArrayList<>();; + + //获取下园批次,只取开始状态的批次 + XyrwListReqVO xyrwListReqVO = new XyrwListReqVO(); + xyrwListReqVO.setBatchStatus(1); + List listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + + //自动生成订单号 + // 设置六位数支付订单号 +// String payOrderNo = "TJ" + VeDate.getNo(6); + + //处理基础项目 +// "iteminfo": [ +// { +// "packageflag": 1, +// "packageno": "666", +// "itemflag": 0, +// "itemno": "验光、视网膜视力检查、龋齿防护、儿童入托体检新、静脉采血(检验科)、儿童体检血常规新(体检)、体检肝功(体检)", +// "itemname": "基础项目", +// "itemprice": "89.66", +// "id": 121, +// "createTime": 1704881523000, +// "checked": true +// } +// ], + //基础套餐,1. 获取套餐明细 + //2.轮询套餐中的子项目,开单 + + //处理可选项目 1.轮询可选项目开单 +// "itemkxinfo": [ +// { +// "packageflag": 0, +// "packageno": "0", +// "itemflag": 1, +// "itemno": "250308008", +// "itemname": "血清骨钙素测定", +// "itemprice": "56.00", +// "id": 133, +// "createTime": 1704881689000, +// "checked": true +// } +// ] + //如果是package,更新itemno为明细,后期还要优化 + JSONArray jsonPArray = xyOrderVO.getIteminfo(); + if(jsonPArray.size() != 0){ + Double number = 0.00; + ItemListReqVO pageReqVO = new ItemListReqVO(); + pageReqVO.setPackageno("666"); + + List list1 = childitemService.getSimpleItemList(pageReqVO); + for(int i=0; i zdkdMap = WSUtil.zdkd(xyOrderVO.getPatid(),ypdm, lcxmdm, lcxmbz, + list1.get(i).getItemname(), list1.get(i).getZxks()); + if("0".equals(zdkdMap.get("errCode"))) { + log.info(lcxmdm + ":开单成功"); + + //基础项目,order表中应该只有一条记录 + //插入order表 +// OrderCreateReqVO createReqVO = new OrderCreateReqVO(); +// createReqVO.setPatid(xyOrderVO.getPatid()); +// createReqVO.setItemno(list1.get(i).getItemno()); +// createReqVO.setItemprice(list1.get(i).getItemprice()); +// createReqVO.setBatchno(listXyrw.get(0).getBatchno()); +// createReqVO.setItemflag(list1.get(i).getItemflag()); +// createReqVO.setItemname(list1.get(i).getItemname()); +// createReqVO.setOrderno(""); +// createReqVO.setPackageflag(1); +// createReqVO.setPackageno("666"); +// orderService.createOrder(createReqVO); + number += Double.parseDouble(list1.get(i).getItemprice()); + listSuccess.add(zdkdMap); + }else{ + log.info(lcxmdm + ":开单失败"); + listFail.add(zdkdMap); + } + } + + //基础项目,order表中应该只有一条记录 + //插入order表 + DecimalFormat df = new DecimalFormat("0.00"); + + OrderCreateReqVO createReqVO = new OrderCreateReqVO(); + createReqVO.setPatid(xyOrderVO.getPatid()); + createReqVO.setItemno("0"); + createReqVO.setItemprice(df.format(number/100)); + createReqVO.setBatchno(listXyrw.get(0).getBatchno()); + createReqVO.setItemflag(0); + createReqVO.setItemname("乙肝两对半"); + createReqVO.setOrderno(""); + createReqVO.setPackageflag(1); + createReqVO.setPackageno("666"); + createReqVO.setPaystatus("0"); + createReqVO.setSchoolName(xyOrderVO.getSchoolName()); + createReqVO.setClassName(xyOrderVO.getClassName()); + createReqVO.setName(xyOrderVO.getName()); + createReqVO.setNationid(xyOrderVO.getNationId()); + //设置开单科室信息 + createReqVO.setKdks("1071"); + createReqVO.setKdksname("健康管理科"); + + //更新性别 + //从身份证号计算年龄和性别 + String idCardNumber = xyOrderVO.getNationId(); + IDCardParser parser = new IDCardParser(idCardNumber); + parser.parse(); + + String birthDate = parser.getBirthDate(); + int gender = parser.getGender(); + createReqVO.setSex(gender); + orderService.createOrder(createReqVO); + + } + + JSONArray jsonArray = xyOrderVO.getItemkxinfo(); + // 使用for循环遍历JSONArray + for (int j = 0; j < jsonArray.size(); j++) { + JSONObject jsonObject = jsonArray.getJSONObject(j); + // 处理jsonObject + String lcflag = jsonObject.getString("itemflag"); + String ypdm = ""; + String lcxmdm = ""; + String lcxmbz = ""; + if(lcflag.equals("1")) { + ypdm = jsonObject.getString("itemno"); + lcxmdm = "0"; + lcxmbz = "1"; + }else { + ypdm = "0"; + lcxmdm = jsonObject.getString("itemno"); + lcxmbz = "2"; + } + HashMap zdkdMap = WSUtil.zdkd(xyOrderVO.getPatid(),ypdm, lcxmdm, lcxmbz, + jsonObject.getString("itemname"), jsonObject.getString("zxks")); + if("0".equals(zdkdMap.get("errCode"))) { + log.info(lcxmdm + ":开单成功"); + //插入order表 + OrderCreateReqVO createReqVO = new OrderCreateReqVO(); + createReqVO.setPatid(xyOrderVO.getPatid()); + createReqVO.setItemno(jsonObject.getString("itemno")); + createReqVO.setItemprice(jsonObject.getString("itemprice")); + createReqVO.setBatchno(listXyrw.get(0).getBatchno()); + createReqVO.setItemflag(jsonObject.getInteger("itemflag")); + createReqVO.setItemname(StringUtils.deleteWhitespace(jsonObject.getString("itemname"))); + createReqVO.setOrderno(""); + createReqVO.setPackageflag(0); + createReqVO.setPackageno("0"); + createReqVO.setName(xyOrderVO.getName()); + createReqVO.setSchoolName(xyOrderVO.getSchoolName()); + createReqVO.setClassName(xyOrderVO.getClassName()); + createReqVO.setNationid(xyOrderVO.getNationId()); + //设置开单科室信息 + createReqVO.setKdks(jsonObject.getString("kdks")); + createReqVO.setKdksname(jsonObject.getString("kdksname")); + createReqVO.setZxks(jsonObject.getString("zxks")); + createReqVO.setZxksname(jsonObject.getString("zxksname")); + //更新性别 + //从身份证号计算年龄和性别 + String idCardNumber = xyOrderVO.getNationId(); + IDCardParser parser = new IDCardParser(idCardNumber); + parser.parse(); + + String birthDate = parser.getBirthDate(); + int gender = parser.getGender(); + createReqVO.setSex(gender); + + orderService.createOrder(createReqVO); + + listSuccess.add(zdkdMap); + }else{ + log.info(lcxmdm + ":开单失败"); + listFail.add(zdkdMap); + + } + + } + + HashMap resultMap = new HashMap(); + resultMap.put("list",listSuccess); + resultMap.put("listF",listFail); + resultMap.put("errCode","0"); + resultMap.put("errMsg", ""); + return resultMap; + } + + /* -----------------------------------------------------银联商务支付信息-------------------------------------------------- */ + + /** + * @description 获取银联商务支付信息 + * @author dqzhang + * @created 2021年11月19日 下午5:31:26 + * @return + * @throws Exception + */ + @RequestMapping("/getPayRequest") + @ResponseBody + public Object getPayRequest(String openid,String totalAmount,String patid,String cardno,String cardtype) throws Exception{ + + cardno = StringDUtil.removeSpaces(cardno); + if("".equals(cardno)) { + HashMap resultMap = new HashMap(); + resultMap.put("errCode", "noCardNo"); + resultMap.put("errMsg", "卡号不能为空!"); + return resultMap; + } + //先判断卡号是否已挂失 +// HashMap map1 = WSUtil.getPatient(cardno, cardtype); +// String errCode = StringDUtil.changeNullToEmpty(map1.get("errCode")); +// if("0".equals(errCode)) { +// HashMap patientMap = (HashMap) ((List)map1.get("list")).get(0); +// log.debug("patientMap"+patientMap); +// String ghbz = StringDUtil.changeNullToEmpty(patientMap.get("gsbz")); +// if("1".equals(ghbz)) { +// HashMap resultMap = new HashMap(); +// resultMap.put("errCode", "LossReported"); +// resultMap.put("errMsg", "卡已挂失/停用,请至窗口处理!"); +// return resultMap; +// } +// +// String pid = StringDUtil.changeNullToEmpty(patientMap.get("patid")); +// if("".equals(pid)) { +// HashMap resultMap = new HashMap(); +// resultMap.put("errCode", "IDCardNotAllowed"); +// resultMap.put("errMsg", "身份证不能充值,请选择其它卡!"); +// return resultMap; +// } +// }else { +// HashMap resultMap = new HashMap(); +// resultMap.put("errCode", map1.get("errCode")); +// resultMap.put("errMsg", map1.get("errMsg")); +// return resultMap; +// } + + BigDecimal bd = new BigDecimal(totalAmount).multiply(new BigDecimal(100)); + totalAmount = bd.intValue()+""; + TreeMap map = new TreeMap(); + //map.put("msgId", "12YK"); + map.put("msgSrcId", "12YK"); + map.put("msgSrc", "WWW.KRLSFYBJ.COM"); + map.put("msgType", "wx.unifiedOrder"); + map.put("requestTimestamp", DateDUtil.getTheCurrentTime()); + String merOrderId = "12YK"+DateDUtil.DateToStrPlus("yyyyMMddHHmmssSSS", new Date())/* + StringDUtil.randomInt(3)*/; + map.put("merOrderId", merOrderId); + map.put("mid", "898652880620011"); + map.put("tid", "65954193"); + map.put("totalAmount", totalAmount); + map.put("subOpenId", openid); + map.put("tradeType", "MINI"); + map.put("signType", "SHA256"); + String key = "KfG8PnwGSK8AXQFKtyfQnKi3x5kcZtDkWX2tctAMhcF5e6Ax"; + StringBuilder str = new StringBuilder(); + for(Map.Entry e: map.entrySet()) { + str.append(e.getKey()); + str.append("="); + str.append(e.getValue()); + str.append("&"); + } + str.deleteCharAt(str.length()-1); + str.append(key); + String sign = EncryptUtil.getSHA256Str(str.toString()); + map.put("sign", sign.toUpperCase()); + String url = "https://qr.chinaums.com/netpay-route-server/api/"; + String requestData = JSON.toJSONString(map); + HttpEntity entity = new HttpEntity(requestData, headers) ; + ResponseEntity resp =restTemplate.exchange(url, HttpMethod.POST, entity, HashMap.class); + HashMap respBody = resp.getBody(); + //支付信息写入本地数据库 + try { + String ec = StringDUtil.changeNullToEmpty(respBody.get("errCode")); + if("SUCCESS".equals(ec)) { + url = StatusDefine.IP_PORT+"/api/addPayRequest"; + HashMap requestMap = new HashMap(); + requestMap.put("merOrderId", merOrderId); + requestMap.put("totalAmount", totalAmount); + requestMap.put("orderText", JSON.toJSONString(respBody)); + requestMap.put("patid", patid); + requestMap.put("openid", openid); + requestMap.put("status", respBody.get("status")); + String requestBody = JSON.toJSONString(requestMap); + entity = new HttpEntity(requestBody, headers) ; + ResponseEntity result =restTemplate.exchange(url, HttpMethod.POST, entity, HashMap.class); + HashMap resultMap = result.getBody(); + if(!"0".equals(resultMap.get("errCode"))) { + log.error("写入下单信息失败"+resultMap.get("errMsg")); + } + }else { + log.error("下单信息异常"+JSON.toJSONString(respBody)); + } + } catch (Exception e1) { + log.error("写入下单信息失败"+e1.toString()); + } + return resp.getBody(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/StatusDefine.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/StatusDefine.java new file mode 100644 index 0000000..7ee77fd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/StatusDefine.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo; + + +public class StatusDefine { + + //后台地址 + public static String IP_PORT; + + public static String wxAppId = ""; + public static String wxSecret = ""; + public static String wxMchid = ""; //商户号 + public static String wxWechartkey = ""; //支付密钥 + + // public static String wxybkey= "1GRUDB4KG2BF3F60C80A0000BD2934B4"; + public static String wxybkey= "f6d394fbc881fee73172232a08dc9c03"; + + public static String wxCertPath = ""; //小程序证书文件路径 + public static String wxTokenUrl; //wxtoken获取地址 + + public static String cityId=""; + + public static String channel=""; +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/DeptXqtjBaseVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/DeptXqtjBaseVO.java new file mode 100644 index 0000000..cb75f06 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/DeptXqtjBaseVO.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** +* 部门 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class DeptXqtjBaseVO { + + @ApiModelProperty(value = "部门名称", required = true) + @NotNull(message = "部门名称不能为空") + private String name; + + @ApiModelProperty(value = "父部门id", required = true) + private Long parentId; + + @ApiModelProperty(value = "显示顺序", required = true) + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + @ApiModelProperty(value = "负责人") + private String leaderUserId; + + @ApiModelProperty(value = "联系电话") + private String phone; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "部门状态(0正常 1停用)", required = true) + @NotNull(message = "部门状态(0正常 1停用)不能为空") + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/DeptXqtjListReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/DeptXqtjListReqVO.java new file mode 100644 index 0000000..c3dfcd2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/DeptXqtjListReqVO.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("管理后台 - 部门列表 Request VO") +@Data +public class DeptXqtjListReqVO { + + @ApiModelProperty(value = "部门名称", example = "芋道", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 CommonStatusEnum 枚举类") + private Integer status; + + @ApiModelProperty(value = "父部门id", example = "0", notes = "") + private Long parentId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeInfoDetailVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeInfoDetailVO.java new file mode 100644 index 0000000..edef54c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeInfoDetailVO.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "处方明细") +public class FeeInfoDetailVO { + + @ApiModelProperty(value = "药品收费项目名称") + private String ypmc; + @ApiModelProperty(value = "药品收费项目数量") + private String xmsl; + @ApiModelProperty(value = "单价") + private String xmdj; + @ApiModelProperty(value = "规格") + private String ypgg; + @ApiModelProperty(value = "项目金额") + private String xmje; + @ApiModelProperty(value = "处方序号") + private String cfxh; +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeInfoVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeInfoVO.java new file mode 100644 index 0000000..e65403e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeInfoVO.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel(value = "费用详情") +public class FeeInfoVO { + + @ApiModelProperty(value = "处方类型") + private String cflx; + @ApiModelProperty(value = "挂号序号") + private String ghxh; + @ApiModelProperty(value = "账户余额") + private String zhye; + @ApiModelProperty(value = "订单id") + private String orderId; + @ApiModelProperty(value = "患者ID") + private String patid; + @ApiModelProperty(value = "处方明细数量") + private String cfmxsl; + @ApiModelProperty(value = "卡号") + private String cardno; + @ApiModelProperty(value = "药房代码") + private String yfdm; + @ApiModelProperty(value = "处方金额") + private String cfje; + @ApiModelProperty(value = "科室名称") + private String out_ksmc; + @ApiModelProperty(value = "患者姓名") + private String hzxm; + @ApiModelProperty(value = "药房名称") + private String yfmc; + @ApiModelProperty(value = "处方序号") + private String cfxh; + @ApiModelProperty(value = "处方明细") + private List detail; + @ApiModelProperty(value = "备注") + private String memo; + @ApiModelProperty(value = "录入日期") + private String lrrq; + @ApiModelProperty(value = "his收据号") + private String sjh; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeListVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeListVO.java new file mode 100644 index 0000000..4c9859e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeListVO.java @@ -0,0 +1,8 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo.vo; + +import lombok.Data; + +@Data +public class FeeListVO { + String patid; +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeUpdateVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeUpdateVO.java new file mode 100644 index 0000000..eac9c6b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeUpdateVO.java @@ -0,0 +1,8 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo.vo; + +import lombok.Data; + +@Data +public class FeeUpdateVO { + String orderid; +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/ItemListReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/ItemListReqVO.java new file mode 100644 index 0000000..725da9f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/ItemListReqVO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo.vo; + +import com.jojubanking.boot.framework.common.pojo.PageParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 检查项目分页 Request VO") +@Data +public class ItemListReqVO { + + @ApiModelProperty(value = "套餐标识(0非套餐 1套餐 )") + private Integer packageflag; + + @ApiModelProperty(value = "套餐代码 目前只有一个基础包") + private String packageno; + + @ApiModelProperty(value = "标识(1小项目 2临床 )") + private Integer itemflag; + + @ApiModelProperty(value = "项目代码") + private String itemno; + + @ApiModelProperty(value = "项目名称") + private String itemname; + + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/XyrwListReqVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/XyrwListReqVO.java new file mode 100644 index 0000000..2089809 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/XyrwListReqVO.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel(value = "管理后台 - 批次信息 Excel 导出 Request VO", description = "参数和 XyrwPageReqVO 是一致的") +@Data +public class XyrwListReqVO { + + @ApiModelProperty(value = "批次号") + private String batchno; + + @ApiModelProperty(value = "体检批次名称") + private String batchName; + + @ApiModelProperty(value = "批次状态(1进行中 2停止)") + private Integer batchStatus; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Date[] createTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/studentJfListVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/studentJfListVO.java new file mode 100644 index 0000000..d72dc27 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/studentJfListVO.java @@ -0,0 +1,69 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +@Data +public class studentJfListVO { + @ApiModelProperty(value = "家长openid") + private String openid; + + @ApiModelProperty(value = "病人唯一标识") + private String patid; + + @ApiModelProperty(value = "姓名", required = true) + @NotNull(message = "姓名不能为空") + private String name; + + @ApiModelProperty(value = "性别(1男 2女)", required = true) + @NotNull(message = "性别(1男 2女)不能为空") + private Integer sex; + + @ApiModelProperty(value = "年龄", required = true) + @NotNull(message = "年龄不能为空") + private Long age; + + @ApiModelProperty(value = "身份证号", required = true) + @NotNull(message = "身份证号不能为空") + private String nationId; + + @ApiModelProperty(value = "班级ID") + private Long deptId; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "社区名称") + private String sqName; + + @ApiModelProperty(value = "街道名称") + private String jdName; + + @ApiModelProperty(value = "用户邮箱") + private String email; + + @ApiModelProperty(value = "手机号码") + private String mobile; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "帐号状态(0正常 1停用)") + private Integer status; + + @ApiModelProperty(value = "用户ID", required = true) + private Long id; + + @ApiModelProperty(value = "创建时间", required = true) + private Date createTime; + + @ApiModelProperty(value = "缴费标识", required = true) + private String feeflag; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/xyMainOrderVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/xyMainOrderVO.java new file mode 100644 index 0000000..a0034db --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/xyMainOrderVO.java @@ -0,0 +1,55 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo.vo; + +import com.alibaba.fastjson.JSONArray; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.ArrayList; + +/** +* 体检信息 Base VO,提供给添加、修改、详细的子 VO 使用 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 +*/ +@Data +public class xyMainOrderVO { + + @ApiModelProperty(value = "家长openid") + private String openid; + + @ApiModelProperty(value = "病人唯一标识", required = true) + private String patid; + + @ApiModelProperty(value = "姓名", required = true) + @NotNull(message = "姓名不能为空") + private String name; + + @ApiModelProperty(value = "身份证号", required = true) + @NotNull(message = "身份证号不能为空") + private String nationId; + + @ApiModelProperty(value = "班级名称") + private String className; + + @ApiModelProperty(value = "学校名称") + private String schoolName; + + @ApiModelProperty(value = "缴费总金额") + private String feetotal; + + @ApiModelProperty(value = "体检基础套餐费用") + private String tjpkgfee; + + @ApiModelProperty(value = "体检基础套餐代码") + private String tjpkgno; + + @ApiModelProperty(value = "可选体检项目费用") + private String tjkxfee; + + @ApiModelProperty(value = "体检项目费用明细") + private JSONArray iteminfo; + + @ApiModelProperty(value = "可选体检项目费用明细") + private JSONArray itemkxinfo; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/xyMainUpdateByOpenidVO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/xyMainUpdateByOpenidVO.java new file mode 100644 index 0000000..f21bb5d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/xyMainUpdateByOpenidVO.java @@ -0,0 +1,10 @@ +package com.jojubanking.boot.module.system.controller.app.xytjinfo.vo; + +import io.swagger.annotations.ApiModelProperty; + +public class xyMainUpdateByOpenidVO { + + @ApiModelProperty(value = "家长openid") + private String openid; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/package-info.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/package-info.java new file mode 100644 index 0000000..f0e6d57 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/controller/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 RESTful API 给前端: + * 1. admin 包:提供给管理后台 joju-ui-admin 前端项目 + * 2. app 包:提供给用户 APP joju-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 + */ +package com.jojubanking.boot.module.system.controller; diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/auth/AuthConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/auth/AuthConvert.java new file mode 100644 index 0000000..ee43738 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/auth/AuthConvert.java @@ -0,0 +1,75 @@ +package com.jojubanking.boot.module.system.convert.auth; + +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeUseReqDTO; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.*; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.enums.permission.MenuIdEnum; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import org.slf4j.LoggerFactory; + +import java.util.*; + +@Mapper +public interface AuthConvert { + + AuthConvert INSTANCE = Mappers.getMapper(AuthConvert.class); + + AuthLoginRespVO convert(OAuth2AccessTokenDO bean); + + default AuthPermissionInfoRespVO convert(AdminUserDO user, List roleList, List menuList) { + return AuthPermissionInfoRespVO.builder() + .user(AuthPermissionInfoRespVO.UserVO.builder().id(user.getId()).nickname(user.getNickname()).avatar(user.getAvatar()).build()) + .roles(CollectionUtils.convertSet(roleList, RoleDO::getCode)) + .permissions(CollectionUtils.convertSet(menuList, MenuDO::getPermission)) + .build(); + } + + AuthMenuRespVO convertTreeNode(MenuDO menu); + + /** + * 将菜单列表,构建成菜单树 + * + * @param menuList 菜单列表 + * @return 菜单树 + */ + default List buildMenuTree(List menuList) { + // 排序,保证菜单的有序性 + menuList.sort(Comparator.comparing(MenuDO::getSort)); + // 构建菜单树 + // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。 + Map treeNodeMap = new LinkedHashMap<>(); + menuList.forEach(menu -> treeNodeMap.put(menu.getId(), AuthConvert.INSTANCE.convertTreeNode(menu))); + // 处理父子关系 + treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(MenuIdEnum.ROOT.getId())).forEach(childNode -> { + // 获得父节点 + AuthMenuRespVO parentNode = treeNodeMap.get(childNode.getParentId()); + if (parentNode == null) { + LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]", + childNode.getId(), childNode.getParentId()); + return; + } + // 将自己添加到父节点中 + if (parentNode.getChildren() == null) { + parentNode.setChildren(new ArrayList<>()); + } + parentNode.getChildren().add(childNode); + }); + // 获得到所有的根节点 + return CollectionUtils.filterList(treeNodeMap.values(), node -> MenuIdEnum.ROOT.getId().equals(node.getParentId())); + } + + SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialLoginReqVO reqVO); + + SmsCodeSendReqDTO convert(AuthSmsSendReqVO reqVO); + + SmsCodeUseReqDTO convert(AuthSmsLoginReqVO reqVO, Integer scene, String usedIp); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/auth/AuthGzConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/auth/AuthGzConvert.java new file mode 100644 index 0000000..582a812 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/auth/AuthGzConvert.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.convert.auth; + +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeUseReqDTO; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserUnbindReqDTO; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.AuthLoginRespVO; +import com.jojubanking.boot.module.system.controller.app.auth.vo.AppAuthLoginRespVO; +import com.jojubanking.boot.module.system.controller.app.auth.vo.AppAuthSocialLoginReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.enums.sms.SmsSceneEnum; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface AuthGzConvert { + AuthGzConvert INSTANCE = Mappers.getMapper(AuthGzConvert.class); + + AppAuthLoginRespVO convert(OAuth2AccessTokenDO bean); + + AppAuthLoginRespVO convert(OAuth2AccessTokenRespDTO bean); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/auth/OAuth2ClientConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/auth/OAuth2ClientConvert.java new file mode 100644 index 0000000..07329d8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/auth/OAuth2ClientConvert.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.convert.auth; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * OAuth2 客户端 Convert + * + * @author TW + */ +@Mapper +public interface OAuth2ClientConvert { + + OAuth2ClientConvert INSTANCE = Mappers.getMapper(OAuth2ClientConvert.class); + + OAuth2ClientDO convert(OAuth2ClientCreateReqVO bean); + + OAuth2ClientDO convert(OAuth2ClientUpdateReqVO bean); + + OAuth2ClientRespVO convert(OAuth2ClientDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/auth/OAuth2TokenConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/auth/OAuth2TokenConvert.java new file mode 100644 index 0000000..3e3fb36 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/auth/OAuth2TokenConvert.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.module.system.convert.auth; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface OAuth2TokenConvert { + + OAuth2TokenConvert INSTANCE = Mappers.getMapper(OAuth2TokenConvert.class); + + OAuth2AccessTokenCheckRespDTO convert(OAuth2AccessTokenDO bean); + + PageResult convert(PageResult page); + + OAuth2AccessTokenRespDTO convert2(OAuth2AccessTokenDO bean); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/building/BuildingConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/building/BuildingConvert.java new file mode 100644 index 0000000..aecda3e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/building/BuildingConvert.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.convert.building; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.building.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.building.BuildingDO; + +/** + * 楼层导视 Convert + * + * @author admin + */ +@Mapper +public interface BuildingConvert { + + BuildingConvert INSTANCE = Mappers.getMapper(BuildingConvert.class); + + BuildingDO convert(BuildingCreateReqVO bean); + + BuildingDO convert(BuildingUpdateReqVO bean); + + BuildingRespVO convert(BuildingDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + + List convertList03(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/carousel/CarouselConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/carousel/CarouselConvert.java new file mode 100644 index 0000000..518e7ff --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/carousel/CarouselConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.carousel; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.carousel.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.carousel.CarouselDO; + +/** + * 轮播图 Convert + * + * @author admin + */ +@Mapper +public interface CarouselConvert { + + CarouselConvert INSTANCE = Mappers.getMapper(CarouselConvert.class); + + CarouselDO convert(CarouselCreateReqVO bean); + + CarouselDO convert(CarouselUpdateReqVO bean); + + CarouselRespVO convert(CarouselDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/childitem/ChilditemConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/childitem/ChilditemConvert.java new file mode 100644 index 0000000..f14c1d6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/childitem/ChilditemConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.childitem; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.childitem.ChilditemDO; + +/** + * 检查项目子 Convert + * + * @author admin + */ +@Mapper +public interface ChilditemConvert { + + ChilditemConvert INSTANCE = Mappers.getMapper(ChilditemConvert.class); + + ChilditemDO convert(ChilditemCreateReqVO bean); + + ChilditemDO convert(ChilditemUpdateReqVO bean); + + ChilditemRespVO convert(ChilditemDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/common/CaptchaConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/common/CaptchaConvert.java new file mode 100644 index 0000000..c1bdd32 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/common/CaptchaConvert.java @@ -0,0 +1,17 @@ +package com.jojubanking.boot.module.system.convert.common; + +import cn.hutool.captcha.AbstractCaptcha; +import com.jojubanking.boot.module.system.controller.admin.common.vo.CaptchaImageRespVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface CaptchaConvert { + + CaptchaConvert INSTANCE = Mappers.getMapper(CaptchaConvert.class); + + default CaptchaImageRespVO convert(String uuid, AbstractCaptcha captcha) { + return CaptchaImageRespVO.builder().uuid(uuid).img(captcha.getImageBase64()).build(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dept/DeptConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dept/DeptConvert.java new file mode 100644 index 0000000..9b69109 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dept/DeptConvert.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.convert.dept; + +import com.jojubanking.boot.module.system.api.dept.dto.DeptRespDTO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptRespVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface DeptConvert { + + DeptConvert INSTANCE = Mappers.getMapper(DeptConvert.class); + + List convertList(List list); + + List convertList02(List list); + + DeptRespVO convert(DeptDO bean); + + DeptDO convert(DeptCreateReqVO bean); + + DeptDO convert(DeptUpdateReqVO bean); + + List convertList03(List list); + + DeptRespDTO convert03(DeptDO bean); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dept/PostConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dept/PostConvert.java new file mode 100644 index 0000000..c040dbd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dept/PostConvert.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.convert.dept; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.*; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.*; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface PostConvert { + + PostConvert INSTANCE = Mappers.getMapper(PostConvert.class); + + List convertList02(List list); + + PageResult convertPage(PageResult page); + + PostRespVO convert(PostDO id); + + PostDO convert(PostCreateReqVO bean); + + PostDO convert(PostUpdateReqVO reqVO); + + List convertList03(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/deptxq/DeptXqConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/deptxq/DeptXqConvert.java new file mode 100644 index 0000000..1a82f7f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/deptxq/DeptXqConvert.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.system.convert.deptxq; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.deptxq.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.deptxq.DeptXqDO; + +/** + * 部门 Convert + * + * @author admin + */ +@Mapper +public interface DeptXqConvert { + + DeptXqConvert INSTANCE = Mappers.getMapper(DeptXqConvert.class); + + DeptXqDO convert(DeptXqCreateReqVO bean); + + DeptXqDO convert(DeptXqUpdateReqVO bean); + + DeptXqRespVO convert(DeptXqDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + List convertList03(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dict/DictDataConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dict/DictDataConvert.java new file mode 100644 index 0000000..fc8c04d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dict/DictDataConvert.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.convert.dict; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.dict.dto.DictDataRespDTO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.*; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.*; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictDataDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface DictDataConvert { + + DictDataConvert INSTANCE = Mappers.getMapper(DictDataConvert.class); + + List convertList(List list); + + DictDataRespVO convert(DictDataDO bean); + + PageResult convertPage(PageResult page); + + DictDataDO convert(DictDataUpdateReqVO bean); + + DictDataDO convert(DictDataCreateReqVO bean); + + List convertList02(List bean); + + DictDataRespDTO convert02(DictDataDO bean); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dict/DictTypeConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dict/DictTypeConvert.java new file mode 100644 index 0000000..91846f3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dict/DictTypeConvert.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.convert.dict; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.*; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.*; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictTypeDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface DictTypeConvert { + + DictTypeConvert INSTANCE = Mappers.getMapper(DictTypeConvert.class); + + PageResult convertPage(PageResult bean); + + DictTypeRespVO convert(DictTypeDO bean); + + DictTypeDO convert(DictTypeCreateReqVO bean); + + DictTypeDO convert(DictTypeUpdateReqVO bean); + + List convertList(List list); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/doctor/DoctorConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/doctor/DoctorConvert.java new file mode 100644 index 0000000..70e176c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/doctor/DoctorConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.doctor; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.doctor.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.doctor.DoctorDO; + +/** + * 医生信息 Convert + * + * @author admin + */ +@Mapper +public interface DoctorConvert { + + DoctorConvert INSTANCE = Mappers.getMapper(DoctorConvert.class); + + DoctorDO convert(DoctorCreateReqVO bean); + + DoctorDO convert(DoctorUpdateReqVO bean); + + DoctorRespVO convert(DoctorDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dzquestion/DzQuestionConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dzquestion/DzQuestionConvert.java new file mode 100644 index 0000000..1f04686 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dzquestion/DzQuestionConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.dzquestion; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.dzquestion.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.dzquestion.DzQuestionDO; + +/** + * 导诊管理 Convert + * + * @author admin + */ +@Mapper +public interface DzQuestionConvert { + + DzQuestionConvert INSTANCE = Mappers.getMapper(DzQuestionConvert.class); + + DzQuestionDO convert(DzQuestionCreateReqVO bean); + + DzQuestionDO convert(DzQuestionUpdateReqVO bean); + + DzQuestionRespVO convert(DzQuestionDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dztype/DzTypeConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dztype/DzTypeConvert.java new file mode 100644 index 0000000..a61a4a1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/dztype/DzTypeConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.dztype; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.dztype.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.dztype.DzTypeDO; + +/** + * 导诊类型 Convert + * + * @author admin + */ +@Mapper +public interface DzTypeConvert { + + DzTypeConvert INSTANCE = Mappers.getMapper(DzTypeConvert.class); + + DzTypeDO convert(DzTypeCreateReqVO bean); + + DzTypeDO convert(DzTypeUpdateReqVO bean); + + DzTypeRespVO convert(DzTypeDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/errorcode/ErrorCodeConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/errorcode/ErrorCodeConvert.java new file mode 100644 index 0000000..e5caf20 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/errorcode/ErrorCodeConvert.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.convert.errorcode; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeRespDTO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeExcelVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeRespVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.errorcode.ErrorCodeDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 错误码 Convert + * + * @author TW + */ +@Mapper +public interface ErrorCodeConvert { + + ErrorCodeConvert INSTANCE = Mappers.getMapper(ErrorCodeConvert.class); + + ErrorCodeDO convert(ErrorCodeCreateReqVO bean); + + ErrorCodeDO convert(ErrorCodeUpdateReqVO bean); + + ErrorCodeRespVO convert(ErrorCodeDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + ErrorCodeDO convert(ErrorCodeAutoGenerateReqDTO bean); + + List convertList03(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/hospital/HospitalConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/hospital/HospitalConvert.java new file mode 100644 index 0000000..03de714 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/hospital/HospitalConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.hospital; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.hospital.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.hospital.HospitalDO; + +/** + * 医院信息 Convert + * + * @author admin + */ +@Mapper +public interface HospitalConvert { + + HospitalConvert INSTANCE = Mappers.getMapper(HospitalConvert.class); + + HospitalDO convert(HospitalCreateReqVO bean); + + HospitalDO convert(HospitalUpdateReqVO bean); + + HospitalRespVO convert(HospitalDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/information/InformationConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/information/InformationConvert.java new file mode 100644 index 0000000..0c63326 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/information/InformationConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.information; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.information.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.information.InformationDO; + +/** + * 指南信息 Convert + * + * @author admin + */ +@Mapper +public interface InformationConvert { + + InformationConvert INSTANCE = Mappers.getMapper(InformationConvert.class); + + InformationDO convert(InformationCreateReqVO bean); + + InformationDO convert(InformationUpdateReqVO bean); + + InformationRespVO convert(InformationDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/item/ItemConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/item/ItemConvert.java new file mode 100644 index 0000000..b6f8f87 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/item/ItemConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.item; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.item.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; + +/** + * 检查项目 Convert + * + * @author admin + */ +@Mapper +public interface ItemConvert { + + ItemConvert INSTANCE = Mappers.getMapper(ItemConvert.class); + + ItemDO convert(ItemCreateReqVO bean); + + ItemDO convert(ItemUpdateReqVO bean); + + ItemRespVO convert(ItemDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/ksinfo/KsInfoConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/ksinfo/KsInfoConvert.java new file mode 100644 index 0000000..fdf24d7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/ksinfo/KsInfoConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.ksinfo; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.ksinfo.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.ksinfo.KsInfoDO; + +/** + * 科室信息 Convert + * + * @author admin + */ +@Mapper +public interface KsInfoConvert { + + KsInfoConvert INSTANCE = Mappers.getMapper(KsInfoConvert.class); + + KsInfoDO convert(KsInfoCreateReqVO bean); + + KsInfoDO convert(KsInfoUpdateReqVO bean); + + KsInfoRespVO convert(KsInfoDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/kstype/KsTypeConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/kstype/KsTypeConvert.java new file mode 100644 index 0000000..e01ba0b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/kstype/KsTypeConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.kstype; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.kstype.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.kstype.KsTypeDO; + +/** + * 科室类别 Convert + * + * @author admin + */ +@Mapper +public interface KsTypeConvert { + + KsTypeConvert INSTANCE = Mappers.getMapper(KsTypeConvert.class); + + KsTypeDO convert(KsTypeCreateReqVO bean); + + KsTypeDO convert(KsTypeUpdateReqVO bean); + + KsTypeRespVO convert(KsTypeDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/label/LabelConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/label/LabelConvert.java new file mode 100644 index 0000000..547d78b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/label/LabelConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.label; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.label.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.label.LabelDO; + +/** + * 信息 Convert + * + * @author admin + */ +@Mapper +public interface LabelConvert { + + LabelConvert INSTANCE = Mappers.getMapper(LabelConvert.class); + + LabelDO convert(LabelCreateReqVO bean); + + LabelDO convert(LabelUpdateReqVO bean); + + LabelRespVO convert(LabelDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/logger/LoginLogConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/logger/LoginLogConvert.java new file mode 100644 index 0000000..a4f4bdd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/logger/LoginLogConvert.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.convert.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogExcelVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.logger.LoginLogDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface LoginLogConvert { + + LoginLogConvert INSTANCE = Mappers.getMapper(LoginLogConvert.class); + + PageResult convertPage(PageResult page); + + List convertList(List list); + + LoginLogDO convert(LoginLogCreateReqDTO bean); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/logger/OperateLogConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/logger/OperateLogConvert.java new file mode 100644 index 0000000..c7087e3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/logger/OperateLogConvert.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.system.convert.logger; + +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogExcelVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.logger.OperateLogDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.MapUtils; +import com.jojubanking.boot.module.system.api.logger.dto.OperateLogCreateReqDTO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS; + +@Mapper +public interface OperateLogConvert { + + OperateLogConvert INSTANCE = Mappers.getMapper(OperateLogConvert.class); + + OperateLogDO convert(OperateLogCreateReqDTO bean); + + PageResult convertPage(PageResult page); + + OperateLogRespVO convert(OperateLogDO bean); + + default List convertList(List list, Map userMap) { + return list.stream().map(operateLog -> { + OperateLogExcelVO excelVO = convert02(operateLog); + MapUtils.findAndThen(userMap, operateLog.getUserId(), user -> excelVO.setUserNickname(user.getNickname())); + excelVO.setSuccessStr(SUCCESS.getCode().equals(operateLog.getResultCode()) ? "成功" : "失败"); + return excelVO; + }).collect(Collectors.toList()); + } + + OperateLogExcelVO convert02(OperateLogDO bean); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/mzdm/MzdmConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/mzdm/MzdmConvert.java new file mode 100644 index 0000000..2862777 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/mzdm/MzdmConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.mzdm; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.mzdm.MzdmDO; + +/** + * 民族代码 Convert + * + * @author admin + */ +@Mapper +public interface MzdmConvert { + + MzdmConvert INSTANCE = Mappers.getMapper(MzdmConvert.class); + + MzdmDO convert(MzdmCreateReqVO bean); + + MzdmDO convert(MzdmUpdateReqVO bean); + + MzdmRespVO convert(MzdmDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/mzjf/MzjfConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/mzjf/MzjfConvert.java new file mode 100644 index 0000000..3773110 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/mzjf/MzjfConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.mzjf; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.mzjf.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.mzjf.MzjfDO; + +/** + * 门诊缴费 Convert + * + * @author admin + */ +@Mapper +public interface MzjfConvert { + + MzjfConvert INSTANCE = Mappers.getMapper(MzjfConvert.class); + + MzjfDO convert(MzjfCreateReqVO bean); + + MzjfDO convert(MzjfUpdateReqVO bean); + + MzjfRespVO convert(MzjfDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/notice/NoticeConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/notice/NoticeConvert.java new file mode 100644 index 0000000..5056f01 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/notice/NoticeConvert.java @@ -0,0 +1,24 @@ +package com.jojubanking.boot.module.system.convert.notice; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeRespVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.notice.NoticeDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface NoticeConvert { + + NoticeConvert INSTANCE = Mappers.getMapper(NoticeConvert.class); + + PageResult convertPage(PageResult page); + + NoticeRespVO convert(NoticeDO bean); + + NoticeDO convert(NoticeUpdateReqVO bean); + + NoticeDO convert(NoticeCreateReqVO bean); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/oauth2/OAuth2OpenConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/oauth2/OAuth2OpenConvert.java new file mode 100644 index 0000000..837caf0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/oauth2/OAuth2OpenConvert.java @@ -0,0 +1,56 @@ +package com.jojubanking.boot.module.system.convert.oauth2; + +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAccessTokenRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAuthorizeInfoRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open.OAuth2OpenCheckTokenRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.jojubanking.boot.module.system.util.oauth2.OAuth2Utils; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Mapper +public interface OAuth2OpenConvert { + + OAuth2OpenConvert INSTANCE = Mappers.getMapper(OAuth2OpenConvert.class); + + default OAuth2OpenAccessTokenRespVO convert(OAuth2AccessTokenDO bean) { + OAuth2OpenAccessTokenRespVO respVO = convert0(bean); + respVO.setTokenType(SecurityFrameworkUtils.AUTHORIZATION_BEARER.toLowerCase()); + respVO.setExpiresIn(OAuth2Utils.getExpiresIn(bean.getExpiresTime())); + respVO.setScope(OAuth2Utils.buildScopeStr(bean.getScopes())); + return respVO; + } + OAuth2OpenAccessTokenRespVO convert0(OAuth2AccessTokenDO bean); + + default OAuth2OpenCheckTokenRespVO convert2(OAuth2AccessTokenDO bean) { + OAuth2OpenCheckTokenRespVO respVO = convert3(bean); + respVO.setExp(bean.getExpiresTime().getTime() / 1000L); + respVO.setUserType(UserTypeEnum.ADMIN.getValue()); + return respVO; + } + OAuth2OpenCheckTokenRespVO convert3(OAuth2AccessTokenDO bean); + + default OAuth2OpenAuthorizeInfoRespVO convert(OAuth2ClientDO client, List approves) { + // 构建 scopes + List> scopes = new ArrayList<>(client.getScopes().size()); + Map approveMap = CollectionUtils.convertMap(approves, OAuth2ApproveDO::getScope); + client.getScopes().forEach(scope -> { + OAuth2ApproveDO approve = approveMap.get(scope); + scopes.add(new KeyValue<>(scope, approve != null ? approve.getApproved() : false)); + }); + // 拼接返回 + return new OAuth2OpenAuthorizeInfoRespVO( + new OAuth2OpenAuthorizeInfoRespVO.Client(client.getName(), client.getLogo()), scopes); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/oauth2/OAuth2UserConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/oauth2/OAuth2UserConvert.java new file mode 100644 index 0000000..aa4bbfa --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/oauth2/OAuth2UserConvert.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.system.convert.oauth2; + +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.user.OAuth2UserInfoRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.user.OAuth2UserUpdateReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface OAuth2UserConvert { + + OAuth2UserConvert INSTANCE = Mappers.getMapper(OAuth2UserConvert.class); + + OAuth2UserInfoRespVO convert(AdminUserDO bean); + OAuth2UserInfoRespVO.Dept convert(DeptDO dept); + List convertList(List list); + + UserProfileUpdateReqVO convert(OAuth2UserUpdateReqVO bean); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/order/OrderConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/order/OrderConvert.java new file mode 100644 index 0000000..9b96f00 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/order/OrderConvert.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.convert.order; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.order.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; + +/** + * 检查项目订单 Convert + * + * @author admin + */ +@Mapper +public interface OrderConvert { + + OrderConvert INSTANCE = Mappers.getMapper(OrderConvert.class); + + OrderDO convert(OrderCreateReqVO bean); + + OrderDO convert(OrderUpdateReqVO bean); + + OrderRespVO convert(OrderDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + List convertList03(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/orderview/OrderViewConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/orderview/OrderViewConvert.java new file mode 100644 index 0000000..3c8f12a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/orderview/OrderViewConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.orderview; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.orderview.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.orderview.OrderViewDO; + +/** + * VIEW Convert + * + * @author admin + */ +@Mapper +public interface OrderViewConvert { + + OrderViewConvert INSTANCE = Mappers.getMapper(OrderViewConvert.class); + + OrderViewDO convert(OrderViewCreateReqVO bean); + + OrderViewDO convert(OrderViewUpdateReqVO bean); + + OrderViewRespVO convert(OrderViewDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/package-info.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/package-info.java new file mode 100644 index 0000000..7beb7ed --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 POJO 类的实体转换 + * + * 目前使用 MapStruct 框架 + */ +package com.jojubanking.boot.module.system.convert; diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/permission/MenuConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/permission/MenuConvert.java new file mode 100644 index 0000000..aa9fa46 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/permission/MenuConvert.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.system.convert.permission; + +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuRespVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface MenuConvert { + + MenuConvert INSTANCE = Mappers.getMapper(MenuConvert.class); + + List convertList(List list); + + MenuDO convert(MenuCreateReqVO bean); + + MenuDO convert(MenuUpdateReqVO bean); + + MenuRespVO convert(MenuDO bean); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/permission/RoleConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/permission/RoleConvert.java new file mode 100644 index 0000000..ab594f6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/permission/RoleConvert.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.convert.permission; + +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.*; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.*; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.service.permission.bo.RoleCreateReqBO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface RoleConvert { + + RoleConvert INSTANCE = Mappers.getMapper(RoleConvert.class); + + RoleDO convert(RoleUpdateReqVO bean); + + RoleRespVO convert(RoleDO bean); + + RoleDO convert(RoleCreateReqVO bean); + + List convertList02(List list); + + List convertList03(List list); + + RoleDO convert(RoleCreateReqBO bean); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/refundapply/RefundApplyConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/refundapply/RefundApplyConvert.java new file mode 100644 index 0000000..385661d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/refundapply/RefundApplyConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.refundapply; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.refundapply.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.refundapply.RefundApplyDO; + +/** + * 就诊卡退费申请 Convert + * + * @author admin + */ +@Mapper +public interface RefundApplyConvert { + + RefundApplyConvert INSTANCE = Mappers.getMapper(RefundApplyConvert.class); + + RefundApplyDO convert(RefundApplyCreateReqVO bean); + + RefundApplyDO convert(RefundApplyUpdateReqVO bean); + + RefundApplyRespVO convert(RefundApplyDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/reserve8/Reserve8Convert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/reserve8/Reserve8Convert.java new file mode 100644 index 0000000..c82ac2c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/reserve8/Reserve8Convert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.reserve8; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.reserve8.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.reserve8.Reserve8DO; + +/** + * 预约挂号 Convert + * + * @author admin + */ +@Mapper +public interface Reserve8Convert { + + Reserve8Convert INSTANCE = Mappers.getMapper(Reserve8Convert.class); + + Reserve8DO convert(Reserve8CreateReqVO bean); + + Reserve8DO convert(Reserve8UpdateReqVO bean); + + Reserve8RespVO convert(Reserve8DO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/sensitiveword/SensitiveWordConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/sensitiveword/SensitiveWordConvert.java new file mode 100644 index 0000000..7103d47 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/sensitiveword/SensitiveWordConvert.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.convert.sensitiveword; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordExcelVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordRespVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 敏感词 Convert + * + * @author 永不言败 + */ +@Mapper +public interface SensitiveWordConvert { + + SensitiveWordConvert INSTANCE = Mappers.getMapper(SensitiveWordConvert.class); + + SensitiveWordDO convert(SensitiveWordCreateReqVO bean); + + SensitiveWordDO convert(SensitiveWordUpdateReqVO bean); + + SensitiveWordRespVO convert(SensitiveWordDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/sms/SmsChannelConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/sms/SmsChannelConvert.java new file mode 100644 index 0000000..48420d1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/sms/SmsChannelConvert.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.convert.sms; + +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelRespVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsChannelDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 短信渠道 Convert + * + * @author TW + */ +@Mapper +public interface SmsChannelConvert { + + SmsChannelConvert INSTANCE = Mappers.getMapper(SmsChannelConvert.class); + + SmsChannelDO convert(SmsChannelCreateReqVO bean); + + SmsChannelDO convert(SmsChannelUpdateReqVO bean); + + SmsChannelRespVO convert(SmsChannelDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + List convertList03(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/sms/SmsLogConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/sms/SmsLogConvert.java new file mode 100644 index 0000000..2e7599d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/sms/SmsLogConvert.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.system.convert.sms; + +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogExcelVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsLogDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 短信日志 Convert + * + * @author TW + */ +@Mapper +public interface SmsLogConvert { + + SmsLogConvert INSTANCE = Mappers.getMapper(SmsLogConvert.class); + + SmsLogRespVO convert(SmsLogDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/sms/SmsTemplateConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/sms/SmsTemplateConvert.java new file mode 100644 index 0000000..d89e0f3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/sms/SmsTemplateConvert.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.convert.sms; + +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateExcelVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateRespVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface SmsTemplateConvert { + + SmsTemplateConvert INSTANCE = Mappers.getMapper(SmsTemplateConvert.class); + + SmsTemplateDO convert(SmsTemplateCreateReqVO bean); + + SmsTemplateDO convert(SmsTemplateUpdateReqVO bean); + + SmsTemplateRespVO convert(SmsTemplateDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/social/SocialUserConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/social/SocialUserConvert.java new file mode 100644 index 0000000..fa664d0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/social/SocialUserConvert.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.convert.social; + +import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserUnbindReqDTO; +import com.jojubanking.boot.module.system.controller.admin.socail.vo.SocialUserBindReqVO; +import com.jojubanking.boot.module.system.controller.admin.socail.vo.SocialUserUnbindReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface SocialUserConvert { + + SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class); + + SocialUserBindReqDTO convert(Long userId, Integer userType, SocialUserBindReqVO reqVO); + + SocialUserUnbindReqDTO convert(Long userId, Integer userType, SocialUserUnbindReqVO reqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/student/StudentConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/student/StudentConvert.java new file mode 100644 index 0000000..a2dad5a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/student/StudentConvert.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.system.convert.student; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserImportExcelVO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.student.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.student.StudentDO; + +/** + * 学生信息 Convert + * + * @author admin + */ +@Mapper +public interface StudentConvert { + + StudentConvert INSTANCE = Mappers.getMapper(StudentConvert.class); + + StudentDO convert(StudentCreateReqVO bean); + + StudentDO convert(StudentUpdateReqVO bean); + + StudentDO convert(StudentImportExcelVO bean); + + StudentRespVO convert(StudentDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/tenant/TenantConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/tenant/TenantConvert.java new file mode 100644 index 0000000..b70180a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/tenant/TenantConvert.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.module.system.convert.tenant; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantExcelVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantRespVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantUpdateReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserCreateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 租户 Convert + * + * @author TW + */ +@Mapper +public interface TenantConvert { + + TenantConvert INSTANCE = Mappers.getMapper(TenantConvert.class); + + TenantDO convert(TenantCreateReqVO bean); + + TenantDO convert(TenantUpdateReqVO bean); + + TenantRespVO convert(TenantDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + default UserCreateReqVO convert02(TenantCreateReqVO bean) { + UserCreateReqVO reqVO = new UserCreateReqVO(); + reqVO.setUsername(bean.getUsername()); + reqVO.setPassword(bean.getPassword()); + reqVO.setNickname(bean.getContactName()); + reqVO.setMobile(bean.getContactMobile()); + return reqVO; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/tenant/TenantPackageConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/tenant/TenantPackageConvert.java new file mode 100644 index 0000000..c053d1a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/tenant/TenantPackageConvert.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.convert.tenant; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageRespVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantPackageDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 租户套餐 Convert + * + * @author TW + */ +@Mapper +public interface TenantPackageConvert { + + TenantPackageConvert INSTANCE = Mappers.getMapper(TenantPackageConvert.class); + + TenantPackageDO convert(TenantPackageCreateReqVO bean); + + TenantPackageDO convert(TenantPackageUpdateReqVO bean); + + TenantPackageRespVO convert(TenantPackageDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/usecount/UseCountConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/usecount/UseCountConvert.java new file mode 100644 index 0000000..2b02f76 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/usecount/UseCountConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.usecount; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.usecount.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountDO; + +/** + * 统计 Convert + * + * @author admin + */ +@Mapper +public interface UseCountConvert { + + UseCountConvert INSTANCE = Mappers.getMapper(UseCountConvert.class); + + UseCountDO convert(UseCountCreateReqVO bean); + + UseCountDO convert(UseCountUpdateReqVO bean); + + UseCountRespVO convert(UseCountDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/user/UserConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/user/UserConvert.java new file mode 100644 index 0000000..d918825 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/user/UserConvert.java @@ -0,0 +1,56 @@ +package com.jojubanking.boot.module.system.convert.user; + +import com.jojubanking.boot.module.system.api.user.dto.AdminUserRespDTO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileRespVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.*; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.*; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.dal.dataobject.social.SocialUserDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface UserConvert { + + UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); + + UserPageItemRespVO convert(AdminUserDO bean); + + UserPageItemRespVO.Dept convert(DeptDO bean); + + AdminUserDO convert(UserCreateReqVO bean); + + AdminUserDO convert(UserUpdateReqVO bean); + + UserExcelVO convert02(AdminUserDO bean); + + AdminUserDO convert(UserImportExcelVO bean); + + UserProfileRespVO convert03(AdminUserDO bean); + + List convertList(List list); + + UserProfileRespVO.Dept convert02(DeptDO bean); + + AdminUserDO convert(UserProfileUpdateReqVO bean); + + AdminUserDO convert(UserProfileUpdatePasswordReqVO bean); + + List convertList02(List list); + + List convertList03(List list); + + List convertList04(List list); + + AdminUserRespDTO convert4(AdminUserDO bean); + + List convertList4(List users); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/userinfo/UserInfoConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/userinfo/UserInfoConvert.java new file mode 100644 index 0000000..1f30c2d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/userinfo/UserInfoConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.userinfo; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.app.userinfo.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.userinfo.UserInfoDO; + +/** + * 用户信息 Convert + * + * @author admin + */ +@Mapper +public interface UserInfoConvert { + + UserInfoConvert INSTANCE = Mappers.getMapper(UserInfoConvert.class); + + UserInfoDO convert(AppUserInfoCreateReqVO bean); + + UserInfoDO convert(AppUserInfoUpdateReqVO bean); + + AppUserInfoRespVO convert(UserInfoDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/usersxq/UsersXqConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/usersxq/UsersXqConvert.java new file mode 100644 index 0000000..f578b90 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/usersxq/UsersXqConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.usersxq; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.usersxq.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.usersxq.UsersXqDO; + +/** + * 用户信息 Convert + * + * @author admin + */ +@Mapper +public interface UsersXqConvert { + + UsersXqConvert INSTANCE = Mappers.getMapper(UsersXqConvert.class); + + UsersXqDO convert(UsersXqCreateReqVO bean); + + UsersXqDO convert(UsersXqUpdateReqVO bean); + + UsersXqRespVO convert(UsersXqDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/wq/WqConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/wq/WqConvert.java new file mode 100644 index 0000000..ee7df86 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/wq/WqConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.wq; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.wq.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wq.WqDO; + +/** + * 问卷调查 Convert + * + * @author admin + */ +@Mapper +public interface WqConvert { + + WqConvert INSTANCE = Mappers.getMapper(WqConvert.class); + + WqDO convert(WqCreateReqVO bean); + + WqDO convert(WqUpdateReqVO bean); + + WqRespVO convert(WqDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/wqda/WqdaConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/wqda/WqdaConvert.java new file mode 100644 index 0000000..ca5ede7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/wqda/WqdaConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.wqda; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.wqda.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqda.WqdaDO; + +/** + * 问卷调查答案 Convert + * + * @author admin + */ +@Mapper +public interface WqdaConvert { + + WqdaConvert INSTANCE = Mappers.getMapper(WqdaConvert.class); + + WqdaDO convert(WqdaCreateReqVO bean); + + WqdaDO convert(WqdaUpdateReqVO bean); + + WqdaRespVO convert(WqdaDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/wqdaview/WqdaViewConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/wqdaview/WqdaViewConvert.java new file mode 100644 index 0000000..f2c7bbf --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/wqdaview/WqdaViewConvert.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.convert.wqdaview; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.wqdaview.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqdaview.WqdaViewDO; +import com.jojubanking.boot.module.system.dal.dataobject.wqdaview.WqdaViewCustDO; + +/** + * VIEW Convert + * + * @author admin + */ +@Mapper +public interface WqdaViewConvert { + + WqdaViewConvert INSTANCE = Mappers.getMapper(WqdaViewConvert.class); + + WqdaViewDO convert(WqdaViewCreateReqVO bean); + + WqdaViewDO convert(WqdaViewUpdateReqVO bean); + + WqdaViewRespVO convert(WqdaViewDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); +// List convertList03(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/wqwt/WqwtConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/wqwt/WqwtConvert.java new file mode 100644 index 0000000..9ba3247 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/wqwt/WqwtConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.wqwt; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.wqwt.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqwt.WqwtDO; + +/** + * 问卷调查问题 Convert + * + * @author admin + */ +@Mapper +public interface WqwtConvert { + + WqwtConvert INSTANCE = Mappers.getMapper(WqwtConvert.class); + + WqwtDO convert(WqwtCreateReqVO bean); + + WqwtDO convert(WqwtUpdateReqVO bean); + + WqwtRespVO convert(WqwtDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/xymain/xyMainConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/xymain/xyMainConvert.java new file mode 100644 index 0000000..7cd3887 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/xymain/xyMainConvert.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.module.system.convert.xymain; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentPageItemRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.deptxq.DeptXqDO; +import com.jojubanking.boot.module.system.dal.dataobject.student.StudentDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.xymain.xyMainDO; + +/** + * 体检信息 Convert + * + * @author admin + */ +@Mapper +public interface xyMainConvert { + + xyMainConvert INSTANCE = Mappers.getMapper(xyMainConvert.class); + + xyMainDO convert(xyMainCreateReqVO bean); + + xyMainPageItemRespVO convert01(xyMainDO bean); + + xyMainPageItemRespVO.Dept convert(DeptXqDO bean); + + xyMainDO convert(xyMainUpdateReqVO bean); + +// xyMainRespVO convert(xyMainDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +// xyMainExcelVO convertList03(xyMainDO bean); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/xyrw/XyrwConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/xyrw/XyrwConvert.java new file mode 100644 index 0000000..f239578 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/xyrw/XyrwConvert.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.convert.xyrw; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.xyrw.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; + +/** + * 批次信息 Convert + * + * @author admin + */ +@Mapper +public interface XyrwConvert { + + XyrwConvert INSTANCE = Mappers.getMapper(XyrwConvert.class); + + XyrwDO convert(XyrwCreateReqVO bean); + + XyrwDO convert(XyrwUpdateReqVO bean); + + XyrwRespVO convert(XyrwDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/xytjjg/XytjjgConvert.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/xytjjg/XytjjgConvert.java new file mode 100644 index 0000000..4918142 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/xytjjg/XytjjgConvert.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.convert.xytjjg; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.jojubanking.boot.module.system.controller.admin.xytjjg.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.xytjjg.XytjjgDO; + +/** + * HIS项目 Convert + * + * @author admin + */ +@Mapper +public interface XytjjgConvert { + + XytjjgConvert INSTANCE = Mappers.getMapper(XytjjgConvert.class); + + XytjjgDO convert(XytjjgCreateReqVO bean); + + XytjjgDO convert(XytjjgUpdateReqVO bean); + + XytjjgRespVO convert(XytjjgDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + List convertList03(List list); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md new file mode 100644 index 0000000..e034650 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md @@ -0,0 +1 @@ + diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/building/BuildingDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/building/BuildingDO.java new file mode 100644 index 0000000..f788764 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/building/BuildingDO.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.system.dal.dataobject.building; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 楼层导视 DO + * + * @author admin + */ +@TableName("hnwj_building") +@KeySequence("hnwj_building_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BuildingDO extends BaseDO { + + /** + * 大楼id + */ + @TableId + private Long id; + /** + * 大楼名称 + */ + private String name; + /** + * 父大楼id + */ + private Long parentId; + /** + * 大楼状态(0正常 1停用) + */ + private Integer status; + /** + * 楼层id + */ + private Integer fid; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/carousel/CarouselDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/carousel/CarouselDO.java new file mode 100644 index 0000000..2742003 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/carousel/CarouselDO.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.system.dal.dataobject.carousel; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 轮播图 DO + * + * @author admin + */ +@TableName("hnwj_carousel") +@KeySequence("hnwj_carousel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CarouselDO extends BaseDO { + + /** + * 用户ID + */ + @TableId + private Integer id; + /** + * 轮播图标题 + */ + private String title; + /** + * 轮播图 + */ + private String img; + /** + * 分类(1、首页轮播图 2、体检轮播图) + */ + private Integer type; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/childitem/ChilditemDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/childitem/ChilditemDO.java new file mode 100644 index 0000000..f8efcb7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/childitem/ChilditemDO.java @@ -0,0 +1,67 @@ +package com.jojubanking.boot.module.system.dal.dataobject.childitem; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 检查项目子 DO + * + * @author admin + */ +@TableName("xytj_childitem") +@KeySequence("xytj_childitem_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ChilditemDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 套餐代码 目前只有一个基础包 + */ + private String packageno; + /** + * 标识(1小项目 2临床 ) + */ + private Integer itemflag; + /** + * 项目代码 + */ + private String itemno; + /** + * 项目名称 + */ + private String itemname; + /** + * 代价 单位分 + */ + private String itemprice; + /** + * 执行科室 + */ + private String zxks; + /** + * 执行科室 + */ + private String zxksname; + + /** + * 执行科室 + */ + private String kdks; + + /** + * 执行科室 + */ + private String kdksname; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dept/DeptDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dept/DeptDO.java new file mode 100644 index 0000000..9bf7875 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dept/DeptDO.java @@ -0,0 +1,64 @@ +package com.jojubanking.boot.module.system.dal.dataobject.dept; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 部门表 + * + * @author ruoyi + * @author TW + */ +@TableName("system_dept") +@KeySequence("system_dept_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class DeptDO extends BaseDO { + + /** + * 部门ID + */ + @TableId + private Long id; + /** + * 部门名称 + */ + private String name; + /** + * 父部门ID + * + * 关联 {@link #id} + */ + private Long parentId; + /** + * 显示顺序 + */ + private Integer sort; + /** + * 负责人 + * + * 关联 {@link AdminUserDO#getId()} + */ + private Long leaderUserId; + /** + * 联系电话 + */ + private String phone; + /** + * 邮箱 + */ + private String email; + /** + * 部门状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dept/PostDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dept/PostDO.java new file mode 100644 index 0000000..0f1d360 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dept/PostDO.java @@ -0,0 +1,50 @@ +package com.jojubanking.boot.module.system.dal.dataobject.dept; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 岗位表 + * + * @author ruoyi + */ +@TableName("system_post") +@KeySequence("system_post_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class PostDO extends BaseDO { + + /** + * 岗位序号 + */ + @TableId + private Long id; + /** + * 岗位名称 + */ + private String name; + /** + * 岗位编码 + */ + private String code; + /** + * 岗位排序 + */ + private Integer sort; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dept/UserPostDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dept/UserPostDO.java new file mode 100644 index 0000000..47dd522 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dept/UserPostDO.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.dal.dataobject.dept; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 用户和岗位关联 + * + * @author ruoyi + */ +@TableName("system_user_post") +@KeySequence("system_user_post_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class UserPostDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 用户 ID + * + * 关联 {@link AdminUserDO#getId()} + */ + private Long userId; + /** + * 角色 ID + * + * 关联 {@link PostDO#getId()} + */ + private Long postId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/deptxq/DeptXqDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/deptxq/DeptXqDO.java new file mode 100644 index 0000000..9d2a724 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/deptxq/DeptXqDO.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.module.system.dal.dataobject.deptxq; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 部门 DO + * + * @author admin + */ +@TableName("xytj_dept") +@KeySequence("xytj_dept_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeptXqDO extends BaseDO { + + /** + * 部门id + */ + @TableId + private Long id; + /** + * 部门名称 + */ + private String name; + /** + * 父部门id + */ + private Long parentId; + /** + * 显示顺序 + */ + private Integer sort; + /** + * 负责人 + */ + private String leaderUserId; + /** + * 联系电话 + */ + private String phone; + /** + * 邮箱 + */ + private String email; + /** + * 部门状态(0正常 1停用) + */ + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dict/DictDataDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dict/DictDataDO.java new file mode 100644 index 0000000..89b6d36 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dict/DictDataDO.java @@ -0,0 +1,66 @@ +package com.jojubanking.boot.module.system.dal.dataobject.dict; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 字典数据表 + * + * @author ruoyi + */ +@TableName("system_dict_data") +@KeySequence("system_dict_data_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class DictDataDO extends BaseDO { + + /** + * 字典数据编号 + */ + @TableId + private Long id; + /** + * 字典排序 + */ + private Integer sort; + /** + * 字典标签 + */ + private String label; + /** + * 字典值 + */ + private String value; + /** + * 字典类型 + * + * 冗余 {@link DictDataDO#getDictType()} + */ + private String dictType; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 颜色类型 + * + * 对应到 element-ui 为 default、primary、success、info、warning、danger + */ + private String colorType; + /** + * css 样式 + */ + private String cssClass; + /** + * 备注 + */ + private String remark; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dict/DictTypeDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dict/DictTypeDO.java new file mode 100644 index 0000000..64a1d8b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dict/DictTypeDO.java @@ -0,0 +1,50 @@ +package com.jojubanking.boot.module.system.dal.dataobject.dict; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 字典类型表 + * + * @author ruoyi + */ +@TableName("system_dict_type") +@KeySequence("system_dict_type_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DictTypeDO extends BaseDO { + + /** + * 字典主键 + */ + @TableId + private Long id; + /** + * 字典名称 + */ + private String name; + /** + * 字典类型 + */ + private String type; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/doctor/DoctorDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/doctor/DoctorDO.java new file mode 100644 index 0000000..7d0005e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/doctor/DoctorDO.java @@ -0,0 +1,61 @@ +package com.jojubanking.boot.module.system.dal.dataobject.doctor; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 医生信息 DO + * + * @author admin + */ +@TableName("hnwj_doctor") +@KeySequence("hnwj_doctor_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DoctorDO extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + + private Integer sort; + + /** + * 医生姓名 + */ + private String name; + /** + * 医生头像 + */ + private String img; + /** + * 科室id + */ + private Integer mid; + /** + * 个人简介 + */ + private String info; + /** + * 个人擅长 + */ + private String grsc; + /** + * 坐诊时间 + */ + private String zztime; + /** + * 荣誉称号 + */ + private String label; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dzquestion/DzQuestionDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dzquestion/DzQuestionDO.java new file mode 100644 index 0000000..1a60971 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dzquestion/DzQuestionDO.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.module.system.dal.dataobject.dzquestion; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 导诊管理 DO + * + * @author admin + */ +@TableName("hnwj_dz_question") +@KeySequence("hnwj_dz_question_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DzQuestionDO extends BaseDO { + + /** + * id + */ + @TableId + private Integer id; + /** + * 问题 + */ + private String question; + /** + * 科室名称 + */ + private String departmentName; + /** + * 科室id + */ + private String departmentNo; + /** + * 身体部位标识 + */ + private String bodyAreaType; + /** + * 身体部位名称 + */ + private String bodyArerName; + /** + * 问题类型 + */ + private String questionType; + /** + * 问题类型名称 + */ + private String questionTypeName; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dztype/DzTypeDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dztype/DzTypeDO.java new file mode 100644 index 0000000..35ef631 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/dztype/DzTypeDO.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.system.dal.dataobject.dztype; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 导诊类型 DO + * + * @author admin + */ +@TableName("hnwj_dz_type") +@KeySequence("hnwj_dz_type_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DzTypeDO extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 身体部位标识 + */ + private String bodyAreaType; + /** + * 身体部位名称 + */ + private String bodyAreaName; + /** + * 问题类型 + */ + private String questionType; + /** + * 问题类型名称 + */ + private String questionTypeName; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/errorcode/ErrorCodeDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/errorcode/ErrorCodeDO.java new file mode 100644 index 0000000..bc5d3e5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/errorcode/ErrorCodeDO.java @@ -0,0 +1,54 @@ +package com.jojubanking.boot.module.system.dal.dataobject.errorcode; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.system.enums.errorcode.ErrorCodeTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * 错误码表 + * + * @author TW + */ +@TableName(value = "system_error_code") +@KeySequence("system_error_code_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Accessors(chain = true) +public class ErrorCodeDO extends BaseDO { + + /** + * 错误码编号,自增 + */ + @TableId + private Long id; + /** + * 错误码类型 + * + * 枚举 {@link ErrorCodeTypeEnum} + */ + private Integer type; + /** + * 应用名 + */ + private String applicationName; + /** + * 错误码编码 + */ + private Integer code; + /** + * 错误码错误提示 + */ + private String message; + /** + * 错误码备注 + */ + private String memo; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/hospital/HospitalDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/hospital/HospitalDO.java new file mode 100644 index 0000000..506a94b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/hospital/HospitalDO.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.module.system.dal.dataobject.hospital; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 医院信息 DO + * + * @author admin + */ +@TableName("hnwj_hospital") +@KeySequence("hnwj_hospital_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HospitalDO extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 医院名称 + */ + private String name; + /** + * logo + */ + private String logo; + /** + * 标签 + */ + private String label; + /** + * 联系电话 + */ + private String tel; + /** + * 地址 + */ + private String address; + /** + * 描述 + */ + private String content; + /** + * 封面图 + */ + private String img; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/information/InformationDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/information/InformationDO.java new file mode 100644 index 0000000..6df8551 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/information/InformationDO.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.system.dal.dataobject.information; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 指南信息 DO + * + * @author admin + */ +@TableName("hnwj_information") +@KeySequence("hnwj_information_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InformationDO extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 标题 + */ + private String title; + /** + * 封面图 + */ + private String img; + /** + * 内容 + */ + private String content; + /** + * 类型(1、健康指南 2、就医指南 3、医院动态) + */ + private Integer type; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/item/ItemDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/item/ItemDO.java new file mode 100644 index 0000000..9ad5aa8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/item/ItemDO.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.dal.dataobject.item; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 检查项目 DO + * + * @author admin + */ +@TableName("xytj_item") +@KeySequence("xytj_item_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 排序 + */ + private Integer sort; + + /** + * 套餐标识(0非套餐 1套餐 ) + */ + private Integer packageflag; + /** + * 套餐代码 目前只有一个基础包 + */ + private String packageno; + /** + * 标识(1小项目 2临床 ) + */ + private Integer itemflag; + /** + * 项目代码 + */ + private String itemno; + /** + * 项目名称 + */ + private String itemname; + /** + * 代价 单位分 + */ + private String itemprice; + + /** + * 显示标识 + */ + private Integer showflag; + /** + * 执行科室 + */ + private String zxks; + + /** + * 执行科室 + */ + private String zxksname; + + /** + * 执行科室 + */ + private String kdks; + + /** + * 执行科室 + */ + private String kdksname; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/ksinfo/KsInfoDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/ksinfo/KsInfoDO.java new file mode 100644 index 0000000..79c8aae --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/ksinfo/KsInfoDO.java @@ -0,0 +1,59 @@ +package com.jojubanking.boot.module.system.dal.dataobject.ksinfo; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 科室信息 DO + * + * @author admin + */ +@TableName("hnwj_ks_info") +@KeySequence("hnwj_ks_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class KsInfoDO extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 科室名称 + */ + private String name; + /** + * 科室分类 + */ + private Integer tid; + /** + * 详细介绍 + */ + private String info; + /** + * 分布位置 + */ + private String address; + /** + * 封面图 + */ + private String img; + /** + * 科室编码 + */ + private String departcode; + /** + * 科室类别 + */ + private String departtype; + + private String uptype; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/kstype/KsTypeDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/kstype/KsTypeDO.java new file mode 100644 index 0000000..75148e6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/kstype/KsTypeDO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.dal.dataobject.kstype; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 科室类别 DO + * + * @author admin + */ +@TableName("hnwj_ks_type") +@KeySequence("hnwj_ks_type_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class KsTypeDO extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 分类名称 + */ + private Integer sort; + + private String name; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/label/LabelDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/label/LabelDO.java new file mode 100644 index 0000000..5343b61 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/label/LabelDO.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.system.dal.dataobject.label; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 信息 DO + * + * @author admin + */ +@TableName("hnwj_label") +@KeySequence("hnwj_label_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LabelDO extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 导视名称 + */ + private String name; + /** + * 导视详情 + */ + private String info; + /** + * 楼层id + */ + private Integer fid; + /** + * 大楼id + */ + private Integer bid; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/logger/LoginLogDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/logger/LoginLogDO.java new file mode 100644 index 0000000..12197a2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/logger/LoginLogDO.java @@ -0,0 +1,72 @@ +package com.jojubanking.boot.module.system.dal.dataobject.logger; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.system.enums.logger.LoginLogTypeEnum; +import com.jojubanking.boot.module.system.enums.logger.LoginResultEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 登录日志表 + * + * 注意,包括登录和登出两种行为 + * + * @author TW + */ +@TableName("system_login_log") +@KeySequence("system_login_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LoginLogDO extends BaseDO { + + /** + * 日志主键 + */ + private Long id; + /** + * 日志类型 + * + * 枚举 {@link LoginLogTypeEnum} + */ + private Integer logType; + /** + * 链路追踪编号 + */ + private String traceId; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 用户账号 + * + * 冗余,因为账号可以变更 + */ + private String username; + /** + * 登录结果 + * + * 枚举 {@link LoginResultEnum} + */ + private Integer result; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/logger/OperateLogDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/logger/OperateLogDO.java new file mode 100644 index 0000000..d16b353 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/logger/OperateLogDO.java @@ -0,0 +1,144 @@ +package com.jojubanking.boot.module.system.dal.dataobject.logger; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.Map; + +/** + * 操作日志表 + * + * @author TW + */ +@TableName(value = "system_operate_log", autoResultMap = true) +@KeySequence("system_operate_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class OperateLogDO extends BaseDO { + + /** + * {@link #javaMethodArgs} 的最大长度 + */ + public static final Integer JAVA_METHOD_ARGS_MAX_LENGTH = 8000; + + /** + * {@link #resultData} 的最大长度 + */ + public static final Integer RESULT_MAX_LENGTH = 4000; + + /** + * 日志主键 + */ + @TableId + private Long id; + /** + * 链路追踪编号 + * + * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 + */ + private String traceId; + /** + * 用户编号 + * + * 关联 MemberUserDO 的 id 属性,或者 AdminUserDO 的 id 属性 + */ + private Long userId; + /** + * 用户类型 + * + * 关联 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 操作模块 + */ + private String module; + /** + * 操作名 + */ + private String name; + /** + * 操作分类 + * + * 枚举 {@link OperateTypeEnum} + */ + private Integer type; + /** + * 操作内容,记录整个操作的明细 + * 例如说,修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。 + */ + private String content; + /** + * 拓展字段,有些复杂的业务,需要记录一些字段 + * 例如说,记录订单编号,则可以添加 key 为 "orderId",value 为订单编号 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map exts; + + /** + * 请求方法名 + */ + private String requestMethod; + /** + * 请求地址 + */ + private String requestUrl; + /** + * 用户 IP + */ + private String userIp; + /** + * 浏览器 UA + */ + private String userAgent; + + /** + * Java 方法名 + */ + private String javaMethod; + /** + * Java 方法的参数 + * + * 实际格式为 Map + * 不使用 @TableField(typeHandler = FastjsonTypeHandler.class) 注解的原因是,数据库存储有长度限制,会进行裁剪,会导致 JSON 反序列化失败 + * 其中,key 为参数名,value 为参数值 + */ + private String javaMethodArgs; + /** + * 开始时间 + */ + private Date startTime; + /** + * 执行时长,单位:毫秒 + */ + private Integer duration; + /** + * 结果码 + * + * 目前使用的 {@link CommonResult#getCode()} 属性 + */ + private Integer resultCode; + /** + * 结果提示 + * + * 目前使用的 {@link CommonResult#getMsg()} 属性 + */ + private String resultMsg; + /** + * 结果数据 + * + * 如果是对象,则使用 JSON 格式化 + */ + private String resultData; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/mzdm/MzdmDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/mzdm/MzdmDO.java new file mode 100644 index 0000000..2871de4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/mzdm/MzdmDO.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.module.system.dal.dataobject.mzdm; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 民族代码 DO + * + * @author admin + */ +@TableName("xytj_mzdm") +@KeySequence("xytj_mzdm_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MzdmDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 民族代码 + */ + private Integer mzdm; + /** + * 民族名称 + */ + private String name; + /** + * 拼音 + */ + private String py; + /** + * wb + */ + private String wb; + /** + * 备注 + */ + private String memo; + /** + * gjbzbbh + */ + private String gjbzbbh; + /** + * jlzt + */ + private String jlzt; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/mzjf/MzjfDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/mzjf/MzjfDO.java new file mode 100644 index 0000000..d9870fb --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/mzjf/MzjfDO.java @@ -0,0 +1,222 @@ +package com.jojubanking.boot.module.system.dal.dataobject.mzjf; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 门诊缴费 DO + * + * @author admin + */ +@TableName("user_mzjf") +@KeySequence("user_mzjf_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +//@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +//public class MzjfDO extends BaseDO { + public class MzjfDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 用户ID + */ + private Integer userId; + /** + * 就诊卡id + */ + private Integer cardId; + /** + * ID + */ + private String patientid; + /** + * 证件类型 + */ + private String idtype; + /** + * 操作类型 + */ + private Integer locktype; + /** + * 检查项目名称 + */ + private String creatitemname; + /** + * 预约时间 + */ + private String appointmenttime; + /** + * 创建时间 + */ + private String creatdate; + /** + * 查询方式 + */ + private Integer querytype; + /** + * 订单ID + */ + private String orderno; + /** + * 单据ID + */ + private String flowno; + /** + * 开单科室编号 + */ + private String setdepartcode; + /** + * 开单科室名称 + */ + private String setdepartname; + /** + * 执行科室编号 + */ + private String dodepartcode; + /** + * 执行科室名称 + */ + private String dodepartname; + /** + * 单据类别 + */ + private String billtype; + /** + * 单据名称 + */ + private String billname; + /** + * 单据描述 + */ + private String billdes; + /** + * 开单时间 + */ + private String billtime; + /** + * 项目总金额 + */ + private String billmoney; + /** + * 医生代码 + */ + private String doctorcode; + /** + * 医生名称 + */ + private String doctorname; + /** + * 自费金额 + */ + private String sincemoney; + /** + * 公费金额 + */ + private String fairmoney; + /** + * 开单流水 + */ + private String serialno; + /** + * 申请单号 + */ + private String appointno; + /** + * 就诊流水号 + */ + private String serialflowno; + /** + * 就诊类别 + */ + private String jzlb; + /** + * 病种类别代码 + */ + private String bzdm; + /** + * 更新时间 + */ + private String updatedate; + /** + * 账单信息 + */ + private String billsmsg; + /** + * 支付签名 + */ + private String paynature; + /** + * 支付类别 + */ + private String paytype; + /** + * 支付ID + */ + private String powertranid; + /** + * 支付卡号 + */ + private String powertrancard; + /** + * 终端ID + */ + private String terminalid; + /** + * 参考号 + */ + private String referno; + /** + * 支付金额 + */ + private String zfamount; + /** + * 医保金额 + */ + private String ybzhamount; + /** + * 医保余额 + */ + private String ybtcamount; + /** + * 医保信息 + */ + private String yboutmsg; + /** + * his参考号 + */ + private String hisopernum; + /** + * 工行ID + */ + private String icbcorderid; + /** + * 工行支付时间 + */ + private String icbcpaytime; + /** + * 标志 + */ + private String appFlag; + /** + * 开单状态 + */ + private Integer appStatus; + /** + * 提交时间 + */ + private Date ctime; + /** + * 修改时间 + */ + private Date utime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/notice/NoticeDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/notice/NoticeDO.java new file mode 100644 index 0000000..84f5068 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/notice/NoticeDO.java @@ -0,0 +1,47 @@ +package com.jojubanking.boot.module.system.dal.dataobject.notice; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.system.enums.notice.NoticeTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 通知公告表 + * + * @author ruoyi + */ +@TableName("system_notice") +@KeySequence("system_notice_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +public class NoticeDO extends BaseDO { + + /** + * 公告ID + */ + private Long id; + /** + * 公告标题 + */ + private String title; + /** + * 公告类型 + * + * 枚举 {@link NoticeTypeEnum} + */ + private Integer type; + /** + * 公告内容 + */ + private String content; + /** + * 公告状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java new file mode 100644 index 0000000..1f93be7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.java @@ -0,0 +1,71 @@ +package com.jojubanking.boot.module.system.dal.dataobject.oauth2; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.tenant.core.db.TenantBaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; +import java.util.List; + +/** + * OAuth2 访问令牌 DO + * + * 如下字段,暂时未使用,暂时不支持: + * user_name、authentication(用户信息) + * + * @author TW + */ +@TableName(value = "system_oauth2_access_token", autoResultMap = true) +@KeySequence("system_oauth2_access_token_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class OAuth2AccessTokenDO extends TenantBaseDO { + + /** + * 编号,数据库递增 + */ + @TableId + private Long id; + /** + * 访问令牌 + */ + private String accessToken; + /** + * 刷新令牌 + */ + private String refreshToken; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 客户端编号 + * + * 关联 {@link OAuth2ClientDO#getId()} + */ + private String clientId; + /** + * 授权范围 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List scopes; + /** + * 过期时间 + */ + private Date expiresTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.java new file mode 100644 index 0000000..b791aeb --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.java @@ -0,0 +1,65 @@ +package com.jojubanking.boot.module.system.dal.dataobject.oauth2; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * OAuth2 批准 DO + * + * 用户在 sso.vue 界面时,记录接受的 scope 列表 + * + * @author TW + */ +@TableName(value = "system_oauth2_approve", autoResultMap = true) +@KeySequence("system_oauth2_approve_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class OAuth2ApproveDO extends BaseDO { + + /** + * 编号,数据库自增 + */ + @TableId + private Long id; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 客户端编号 + * + * 关联 {@link OAuth2ClientDO#getId()} + */ + private String clientId; + /** + * 授权范围 + */ + private String scope; + /** + * 是否接受 + * + * true - 接受 + * false - 拒绝 + */ + private Boolean approved; + /** + * 过期时间 + */ + private Date expiresTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2ClientDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2ClientDO.java new file mode 100644 index 0000000..5af2fad --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2ClientDO.java @@ -0,0 +1,109 @@ +package com.jojubanking.boot.module.system.dal.dataobject.oauth2; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.system.enums.oauth2.OAuth2GrantTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * OAuth2 客户端 DO + * + * @author TW + */ +@TableName(value = "system_oauth2_client", autoResultMap = true) +@KeySequence("system_oauth2_client_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class OAuth2ClientDO extends BaseDO { + + /** + * 编号,数据库自增 + * + * 由于 SQL Server 在存储 String 主键有点问题,所以暂时使用 Long 类型 + */ + @TableId + private Long id; + /** + * 客户端编号 + */ + private String clientId; + /** + * 客户端密钥 + */ + private String secret; + /** + * 应用名 + */ + private String name; + /** + * 应用图标 + */ + private String logo; + /** + * 应用描述 + */ + private String description; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 访问令牌的有效期 + */ + private Integer accessTokenValiditySeconds; + /** + * 刷新令牌的有效期 + */ + private Integer refreshTokenValiditySeconds; + /** + * 可重定向的 URI 地址 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List redirectUris; + /** + * 授权类型(模式) + * + * 枚举 {@link OAuth2GrantTypeEnum} + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List authorizedGrantTypes; + /** + * 授权范围 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List scopes; + /** + * 自动授权的 Scope + * + * code 授权时,如果 scope 在这个范围内,则自动通过 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List autoApproveScopes; + /** + * 权限 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List authorities; + /** + * 资源 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List resourceIds; + /** + * 附加信息,JSON 格式 + */ + private String additionalInformation; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2CodeDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2CodeDO.java new file mode 100644 index 0000000..04182eb --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2CodeDO.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.dal.dataobject.oauth2; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; +import java.util.List; + +/** + * OAuth2 授权码 DO + * + * @author TW + */ +@TableName(value = "system_oauth2_code", autoResultMap = true) +@KeySequence("system_oauth2_code_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class OAuth2CodeDO extends BaseDO { + + /** + * 编号,数据库递增 + */ + private Long id; + /** + * 授权码 + */ + private String code; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 客户端编号 + * + * 关联 {@link OAuth2ClientDO#getClientId()} + */ + private String clientId; + /** + * 授权范围 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List scopes; + /** + * 重定向地址 + */ + private String redirectUri; + /** + * 状态 + */ + private String state; + /** + * 过期时间 + */ + private Date expiresTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java new file mode 100644 index 0000000..4761501 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java @@ -0,0 +1,63 @@ +package com.jojubanking.boot.module.system.dal.dataobject.oauth2; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; +import java.util.List; + +/** + * OAuth2 刷新令牌 + * + * @author TW + */ +@TableName(value = "system_oauth2_refresh_token", autoResultMap = true) +// 由于 Oracle 的 SEQ 的名字长度有限制,所以就先用 system_oauth2_access_token_seq 吧,反正也没啥问题 +@KeySequence("system_oauth2_access_token_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class OAuth2RefreshTokenDO extends BaseDO { + + /** + * 编号,数据库字典 + */ + private Long id; + /** + * 刷新令牌 + */ + private String refreshToken; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + /** + * 客户端编号 + * + * 关联 {@link OAuth2ClientDO#getId()} + */ + private String clientId; + /** + * 授权范围 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List scopes; + /** + * 过期时间 + */ + private Date expiresTime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/order/OrderDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/order/OrderDO.java new file mode 100644 index 0000000..d062037 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/order/OrderDO.java @@ -0,0 +1,117 @@ +package com.jojubanking.boot.module.system.dal.dataobject.order; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 检查项目订单 DO + * + * @author admin + */ +@TableName("xytj_order") +@KeySequence("xytj_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 体检批次号 + */ + private String batchno; + /** + * 病人唯一标识 + */ + private String patid; + /** + * 患者姓名 + */ + private String name; + /** + * 患者性别 + */ + private String sex; + + /** + * 患者身份证 + */ + private String nationid; + /** + * 班级名称 + */ + private String className; + /** + * 学校名称 + */ + private String schoolName; + + /** + * 订单编码 + */ + private String orderno; + /** + * HIS收据号 + */ + private String sjh; + + /** + * 套餐标识(0非套餐 1套餐 ) + */ + private Integer packageflag; + /** + * 套餐代码 目前只有一个基础包 + */ + private String packageno; + /** + * 标识(1小项目 2临床 ) + */ + private Integer itemflag; + /** + * 项目代码 + */ + private String itemno; + /** + * 项目名称 + */ + private String itemname; + /** + * 代价 单位分 + */ + private String itemprice; + + /** + * 支付状态 + */ + private String paystatus; + + /** + * 执行科室 + */ + private String zxks; + + /** + * 执行科室名称 + */ + private String zxksname; + + /** + * 开单科室 + */ + private String kdks; + + /** + * 开单科室名称 + */ + private String kdksname; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/orderview/OrderViewDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/orderview/OrderViewDO.java new file mode 100644 index 0000000..0fcff45 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/orderview/OrderViewDO.java @@ -0,0 +1,89 @@ +package com.jojubanking.boot.module.system.dal.dataobject.orderview; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * VIEW DO + * + * @author admin + */ +@TableName("xytj_order_view") +@KeySequence("xytj_order_view_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OrderViewDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 体检批次号 + */ + private String batchno; + /** + * 病人唯一标识 + */ + private String patid; + /** + * 患者姓名 + */ + private String name; + /** + * 身份证 + */ + private String nationid; + /** + * 订单编码 + */ + private String orderno; + /** + * his收据号 + */ + private String sjh; + /** + * 套餐标识(0非套餐 1套餐 ) + */ + private Integer packageflag; + /** + * 套餐代码 目前只有一个基础包 + */ + private String packageno; + /** + * 标识(1小项目 2临床 ) + */ + private Integer itemflag; + /** + * 项目代码 + */ + private String itemno; + /** + * 项目名称 + */ + private String itemname; + /** + * 代价 单位分 + */ + private String itemprice; + /** + * 0未交费 1已缴费 + */ + private String paystatus; + /** + * 学校名称 + */ + private String schoolName; + /** + * 班级名称 + */ + private String className; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/permission/MenuDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/permission/MenuDO.java new file mode 100644 index 0000000..1417233 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/permission/MenuDO.java @@ -0,0 +1,92 @@ +package com.jojubanking.boot.module.system.dal.dataobject.permission; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.system.enums.permission.MenuTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 菜单 DO + * + * @author ruoyi + */ +@TableName("system_menu") +@KeySequence("system_menu_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class MenuDO extends BaseDO { + + /** + * 菜单ID + */ + @TableId + private Long id; + /** + * 菜单名称 + */ + private String name; + /** + * 权限标识 + * + * 一般格式为:${系统}:${模块}:${操作} + * 例如说:system:admin:add,即 system 服务的添加管理员。 + * + * 当我们把该 MenuDO 赋予给角色后,意味着该角色有该资源: + * - 对于后端,配合 @PreAuthorize 注解,配置 API 接口需要该权限,从而对 API 接口进行权限控制。 + * - 对于前端,配合前端标签,配置按钮是否展示,避免用户没有该权限时,结果可以看到该操作。 + */ + private String permission; + /** + * 菜单类型 + * + * 枚举 {@link MenuTypeEnum} + */ + private Integer type; + /** + * 显示顺序 + */ + private Integer sort; + /** + * 父菜单ID + */ + private Long parentId; + /** + * 路由地址 + */ + private String path; + /** + * 菜单图标 + */ + private String icon; + /** + * 组件路径 + */ + private String component; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 是否可见 + * + * 只有菜单、目录使用 + * 当设置为 true 时,该菜单不会展示在侧边栏,但是路由还是存在。例如说,一些独立的编辑页面 /edit/1024 等等 + */ + private Boolean visible; + /** + * 是否缓存 + * + * 只有菜单、目录使用 + * 是否使用 Vue 路由的 keep-alive 特性 + */ + private Boolean keepAlive; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/permission/RoleDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/permission/RoleDO.java new file mode 100644 index 0000000..9bbd211 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/permission/RoleDO.java @@ -0,0 +1,80 @@ +package com.jojubanking.boot.module.system.dal.dataobject.permission; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.type.JsonLongSetTypeHandler; +import com.jojubanking.boot.module.system.enums.permission.DataScopeEnum; +import com.jojubanking.boot.framework.tenant.core.db.TenantBaseDO; +import com.jojubanking.boot.module.system.enums.permission.RoleTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Set; + +/** + * 角色 DO + * + * @author ruoyi + */ +@TableName(value = "system_role", autoResultMap = true) +@KeySequence("system_role_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class RoleDO extends TenantBaseDO { + + /** + * 角色ID + */ + @TableId + private Long id; + /** + * 角色名称 + */ + private String name; + /** + * 角色标识 + * + * 枚举 + */ + private String code; + /** + * 角色排序 + */ + private Integer sort; + /** + * 角色状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 角色类型 + * + * 枚举 {@link RoleTypeEnum} + */ + private Integer type; + /** + * 备注 + */ + private String remark; + + /** + * 数据范围 + * + * 枚举 {@link DataScopeEnum} + */ + private Integer dataScope; + /** + * 数据范围(指定部门数组) + * + * 适用于 {@link #dataScope} 的值为 {@link DataScopeEnum#DEPT_CUSTOM} 时 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set dataScopeDeptIds; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/permission/RoleMenuDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/permission/RoleMenuDO.java new file mode 100644 index 0000000..80e77f8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/permission/RoleMenuDO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.system.dal.dataobject.permission; + +import com.jojubanking.boot.framework.tenant.core.db.TenantBaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 角色和菜单关联 + * + * @author ruoyi + */ +@TableName("system_role_menu") +@KeySequence("system_role_menu_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class RoleMenuDO extends TenantBaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 角色ID + */ + private Long roleId; + /** + * 菜单ID + */ + private Long menuId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/permission/UserRoleDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/permission/UserRoleDO.java new file mode 100644 index 0000000..d64ebad --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/permission/UserRoleDO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.system.dal.dataobject.permission; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 用户和角色关联 + * + * @author ruoyi + */ +@TableName("system_user_role") +@KeySequence("system_user_role_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class UserRoleDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 用户 ID + */ + private Long userId; + /** + * 角色 ID + */ + private Long roleId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/refundapply/RefundApplyDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/refundapply/RefundApplyDO.java new file mode 100644 index 0000000..fc25ea4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/refundapply/RefundApplyDO.java @@ -0,0 +1,85 @@ +package com.jojubanking.boot.module.system.dal.dataobject.refundapply; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 就诊卡退费申请 DO + * + * @author admin + */ +@TableName("user_refund_apply") +@KeySequence("user_refund_apply_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RefundApplyDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 姓名 + */ + private String refname; + /** + * 身份证号码 + */ + private String refidcard; + /** + * 银行卡号 + */ + private String refbankcard; + /** + * 银行卡持卡人姓名 + */ + private String refbankcardname; + /** + * 银行类型 + */ + private String refbanktype; + /** + * 手机号 + */ + private String reftel; + /** + * 身份证正面 + */ + private String zidcard; + /** + * 身份证正面 + */ + private String zidcardimg; + /** + * 身份证反面 + */ + private String fidcard; + /** + * 身份证反面 + */ + private String fidcardimg; + /** + * 银行卡正面 + */ + private String zbankcard; + /** + * 银行卡正面 + */ + private String zbankcardimg; + /** + * 儿童三选一 + */ + private String childidcard; + /** + * 儿童三选一 + */ + private String childidcardimg; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/reserve8/Reserve8DO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/reserve8/Reserve8DO.java new file mode 100644 index 0000000..9eee46a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/reserve8/Reserve8DO.java @@ -0,0 +1,225 @@ +package com.jojubanking.boot.module.system.dal.dataobject.reserve8; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 预约挂号 DO + * + * @author admin + */ +@TableName("user_reserve8") +@KeySequence("user_reserve8_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +//@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Reserve8DO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 用户ID + */ + private Integer userId; + /** + * 就诊卡id + */ + private Integer cardId; + /** + * 病人名称 + */ + private String name; + /** + * 科室名称 + */ + private String ksmc; + /** + * 医生名称 + */ + private String ysmc; + /** + * 院区 ID + */ + @TableField("SubHospitalID") + private String subHospitalID; + /** + * 票据编号 + */ + @TableField("ReptNum") + private String reptNum; + /** + * 操作类型 + */ + @TableField("LockType") + private Integer lockType; + /** + * 订单 ID + */ + @TableField("HisOrderNO") + private String hisOrderNO; + /** + * 排班 ID + */ + @TableField("ScheduleId") + private String scheduleId; + /** + * 医生编码 + */ + @TableField("DoctorCode") + private String doctorCode; + /** + * 科室编码 + */ + @TableField("DepartCode") + private String departCode; + /** + * 分时 ID + */ + @TableField("ParTimeId") + private String parTimeId; + /** + * 锁号时间 + */ + @TableField("LockTime") + private String lockTime; + /** + * 患者 ID + */ + @TableField("PatientId") + private String patientId; + /** + * 手机号码 + */ + @TableField("Mobile") + private String mobile; + /** + * 就诊序号 + */ + @TableField("SerialNo") + private String serialNo; + /** + * 就诊地址 + */ + @TableField("Location") + private String location; + /** + * 号票编号 + */ + @TableField("TicketNo") + private String ticketNo; + /** + * 取号确认订单ID + */ + @TableField("OrderNo") + private String orderNo; + /** + * 取号确认时间段 + */ + @TableField("TimeInterval") + private String timeInterval; + /** + * 出诊日期 + */ + @TableField("Registerdate") + private String registerdate; + /** + * 诊查费 + */ + @TableField("ClinicFee") + private BigDecimal clinicFee; + /** + * 挂号费 + */ + @TableField("RegistrationFee") + private BigDecimal registrationFee; + /** + * 收费性质 + */ + @TableField("PayNature") + private Integer payNature; + /** + * 支付方式 + */ + @TableField("PayType") + private String payType; + /** + * 交易 ID + */ + @TableField("PowerTranID") + private String powerTranID; + /** + * 交易 卡号(扫码支付) + * + */ + @TableField("PowerTranCARD") + private String powerTranCARD; + /** + * MISPOS终端号 + */ + @TableField("TerminalId") + private String terminalId; + /** + * 自费支付金额 + */ + @TableField("ZFAmount") + private BigDecimal zFAmount; + /** + * 医保账户金额 + */ + @TableField("YBZHAmount") + private BigDecimal yBZHAmount; + /** + * 医保统筹金额 + */ + @TableField("YBTCAmount") + private BigDecimal yBTCAmount; + /** + * 医保结算信息 + */ + @TableField("YBOutMsg") + private String yBOutMsg; + /** + * HIS 工号 + */ + @TableField("HisOperNum") + private String hisOperNum; + /** + * 交易检索号(银行) + */ + @TableField("ReferNo") + private String referNo; + /** + * token + */ + private String token; + /** + * 允许退号标志 N 不允许 Y 允许 + */ + private String appFlag; + /** + * 单据状态 1 已退费 0 正常 + */ + private Integer appStatus; + /** + * 1 预约挂号 2 今日挂号 + */ + private Integer appType; + /** + * 提交时间 + */ + private Date ctime; + /** + * 修改时间 + */ + private Date utime; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.java new file mode 100644 index 0000000..72281b9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.module.system.dal.dataobject.sensitiveword; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.mybatis.core.type.StringListTypeHandler; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 敏感词 DO + * + * @author 永不言败 + */ +@TableName(value = "system_sensitive_word", autoResultMap = true) +@KeySequence("system_sensitive_word_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class SensitiveWordDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 敏感词 + */ + private String name; + /** + * 描述 + */ + private String description; + /** + * 标签数组 + * + * 用于实现不同的业务场景下,需要使用不同标签的敏感词。 + * 例如说,tag 有短信、论坛两种,敏感词 "推广" 在短信下是敏感词,在论坛下不是敏感词。 + * 此时,我们会存储一条敏感词记录,它的 name 为"推广",tag 为短信。 + */ + @TableField(typeHandler = StringListTypeHandler.class) + private List tags; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsChannelDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsChannelDO.java new file mode 100644 index 0000000..626a7a8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsChannelDO.java @@ -0,0 +1,62 @@ +package com.jojubanking.boot.module.system.dal.dataobject.sms; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.sms.core.enums.SmsChannelEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +/** + * 短信渠道 DO + * + * @author zzf + * @since 2021-01-25 + */ +@TableName(value = "system_sms_channel", autoResultMap = true) +@KeySequence("system_sms_channel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsChannelDO extends BaseDO { + + /** + * 渠道编号 + */ + private Long id; + /** + * 短信签名 + */ + private String signature; + /** + * 渠道编码 + * + * 枚举 {@link SmsChannelEnum} + */ + private String code; + /** + * 启用状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 短信 API 的账号 + */ + private String apiKey; + /** + * 短信 API 的密钥 + */ + private String apiSecret; + /** + * 短信发送回调 URL + */ + private String callbackUrl; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsCodeDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsCodeDO.java new file mode 100644 index 0000000..aa06404 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsCodeDO.java @@ -0,0 +1,65 @@ +package com.jojubanking.boot.module.system.dal.dataobject.sms; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Date; + +/** + * 手机验证码 DO + * + * idx_mobile 索引:基于 {@link #mobile} 字段 + * + * @author TW + */ +@TableName("system_sms_code") +@KeySequence("system_sms_code_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SmsCodeDO extends BaseDO { + + /** + * 编号 + */ + private Integer id; + /** + * 手机号 + */ + private String mobile; + /** + * 验证码 + */ + private String code; + /** + * 发送场景 + * + * 枚举 {@link SmsCodeDO} + */ + private Integer scene; + /** + * 创建 IP + */ + private String createIp; + /** + * 今日发送的第几条 + */ + private Integer todayIndex; + /** + * 是否使用 + */ + private Boolean used; + /** + * 使用时间 + */ + private Date usedTime; + /** + * 使用 IP + */ + private String usedIp; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsLogDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsLogDO.java new file mode 100644 index 0000000..39baf32 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsLogDO.java @@ -0,0 +1,175 @@ +package com.jojubanking.boot.module.system.dal.dataobject.sms; + +import com.jojubanking.boot.module.system.enums.sms.SmsReceiveStatusEnum; +import com.jojubanking.boot.module.system.enums.sms.SmsSendStatusEnum; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.*; + +import java.util.Date; +import java.util.Map; + +/** + * 短信日志 DO + * + * @author zzf + * @since 2021-01-25 + */ +@TableName(value = "system_sms_log", autoResultMap = true) +@KeySequence("system_sms_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SmsLogDO extends BaseDO { + + /** + * 自增编号 + */ + private Long id; + + // ========= 渠道相关字段 ========= + + /** + * 短信渠道编号 + * + * 关联 {@link SmsChannelDO#getId()} + */ + private Long channelId; + /** + * 短信渠道编码 + * + * 冗余 {@link SmsChannelDO#getCode()} + */ + private String channelCode; + + // ========= 模板相关字段 ========= + + /** + * 模板编号 + * + * 关联 {@link SmsTemplateDO#getId()} + */ + private Long templateId; + /** + * 模板编码 + * + * 冗余 {@link SmsTemplateDO#getCode()} + */ + private String templateCode; + /** + * 短信类型 + * + * 冗余 {@link SmsTemplateDO#getType()} + */ + private Integer templateType; + /** + * 基于 {@link SmsTemplateDO#getContent()} 格式化后的内容 + */ + private String templateContent; + /** + * 基于 {@link SmsTemplateDO#getParams()} 输入后的参数 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private Map templateParams; + /** + * 短信 API 的模板编号 + * + * 冗余 {@link SmsTemplateDO#getApiTemplateId()} + */ + private String apiTemplateId; + + // ========= 手机相关字段 ========= + + /** + * 手机号 + */ + private String mobile; + /** + * 用户编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + + // ========= 发送相关字段 ========= + + /** + * 发送状态 + * + * 枚举 {@link SmsSendStatusEnum} + */ + private Integer sendStatus; + /** + * 发送时间 + */ + private Date sendTime; + /** + * 发送结果的编码 + * + * 枚举 {@link SmsFrameworkErrorCodeConstants} + */ + private Integer sendCode; + /** + * 发送结果的提示 + * + * 一般情况下,使用 {@link SmsFrameworkErrorCodeConstants} + * 异常情况下,通过格式化 Exception 的提示存储 + */ + private String sendMsg; + /** + * 短信 API 发送结果的编码 + * + * 由于第三方的错误码可能是字符串,所以使用 String 类型 + */ + private String apiSendCode; + /** + * 短信 API 发送失败的提示 + */ + private String apiSendMsg; + /** + * 短信 API 发送返回的唯一请求 ID + * + * 用于和短信 API 进行定位于排错 + */ + private String apiRequestId; + /** + * 短信 API 发送返回的序号 + * + * 用于和短信 API 平台的发送记录关联 + */ + private String apiSerialNo; + + // ========= 接收相关字段 ========= + + /** + * 接收状态 + * + * 枚举 {@link SmsReceiveStatusEnum} + */ + private Integer receiveStatus; + /** + * 接收时间 + */ + private Date receiveTime; + /** + * 短信 API 接收结果的编码 + */ + private String apiReceiveCode; + /** + * 短信 API 接收结果的提示 + */ + private String apiReceiveMsg; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsTemplateDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsTemplateDO.java new file mode 100644 index 0000000..1fe72b9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsTemplateDO.java @@ -0,0 +1,91 @@ +package com.jojubanking.boot.module.system.dal.dataobject.sms; + +import com.jojubanking.boot.module.system.enums.sms.SmsTemplateTypeEnum; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +/** + * 短信模板 DO + * + * @author zzf + * @since 2021-01-25 + */ +@TableName(value = "system_sms_template", autoResultMap = true) +@KeySequence("system_sms_template_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SmsTemplateDO extends BaseDO { + + /** + * 自增编号 + */ + private Long id; + + // ========= 模板相关字段 ========= + + /** + * 短信类型 + * + * 枚举 {@link SmsTemplateTypeEnum} + */ + private Integer type; + /** + * 启用状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 模板编码,保证唯一 + */ + private String code; + /** + * 模板名称 + */ + private String name; + /** + * 模板内容 + * + * 内容的参数,使用 {} 包括,例如说 {name} + */ + private String content; + /** + * 参数数组(自动根据内容生成) + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List params; + /** + * 备注 + */ + private String remark; + /** + * 短信 API 的模板编号 + */ + private String apiTemplateId; + + // ========= 渠道相关字段 ========= + + /** + * 短信渠道编号 + * + * 关联 {@link SmsChannelDO#getId()} + */ + private Long channelId; + /** + * 短信渠道编码 + * + * 冗余 {@link SmsChannelDO#getCode()} + */ + private String channelCode; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserBindDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserBindDO.java new file mode 100644 index 0000000..0a26a16 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserBindDO.java @@ -0,0 +1,58 @@ +package com.jojubanking.boot.module.system.dal.dataobject.social; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import lombok.experimental.Accessors; + +/** + * 社交用户的绑定 + * 即 {@link SocialUserDO} 与 UserDO 的关联表 + * + * @author TW + */ +@TableName(value = "system_social_user_bind", autoResultMap = true) +@KeySequence("system_social_user_bind_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class SocialUserBindDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 关联的用户编号 + * + * 关联 UserDO 的编号 + */ + private Long userId; + /** + * 用户类型 + * + * 枚举 {@link UserTypeEnum} + */ + private Integer userType; + + /** + * 社交平台的用户编号 + * + * 关联 {@link SocialUserDO#getId()} + */ + private Long socialUserId; + /** + * 社交平台的类型 + * + * 冗余 {@link SocialUserDO#getType()} + */ + private Integer socialType; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserDO.java new file mode 100644 index 0000000..f2be486 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserDO.java @@ -0,0 +1,75 @@ +package com.jojubanking.boot.module.system.dal.dataobject.social; + +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.system.enums.social.SocialTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import lombok.experimental.Accessors; + +/** + * 社交(三方)用户 + * + * @author weir + */ +@TableName(value = "system_social_user", autoResultMap = true) +@KeySequence("system_social_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class SocialUserDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Long id; + /** + * 社交平台的类型 + * + * 枚举 {@link SocialTypeEnum} + */ + private Integer type; + + /** + * 社交 openid + */ + private String openid; + /** + * 社交 token + */ + private String token; + /** + * 原始 Token 数据,一般是 JSON 格式 + */ + private String rawTokenInfo; + + /** + * 用户昵称 + */ + private String nickname; + /** + * 用户头像 + */ + private String avatar; + /** + * 原始用户数据,一般是 JSON 格式 + */ + private String rawUserInfo; + + /** + * 最后一次的认证 code + */ + private String code; + /** + * 最后一次的认证 state + */ + private String state; + +} + + diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/student/StudentDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/student/StudentDO.java new file mode 100644 index 0000000..5cad8f9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/student/StudentDO.java @@ -0,0 +1,127 @@ +package com.jojubanking.boot.module.system.dal.dataobject.student; + +import io.swagger.annotations.ApiModelProperty; +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 学生信息 DO + * + * @author admin + */ +@TableName("xytj_student") +@KeySequence("xytj_student_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class StudentDO extends BaseDO { + + /** + * 用户ID + */ + @TableId + private Long id; + /** + * 家长openid + */ + private String openid; + /** + * 批次号 + */ + private String batchno; + /** + * 批次名称 + */ + private String batchname; + + /** + * 病人唯一标识 + */ + private String patid; + /** + * 姓名 + */ + private String name; + /** + * 性别(1男 2女) + */ + private Integer sex; + /** + * 年龄 + */ + private Long age; + /** + * 身份证号 + */ + private String nationId; + /** + * 班级ID + */ + private Long deptId; + /** + * 班级名称 + */ + private String className; + /** + * 学校名称 + */ + private String schoolName; + /** + * 社区名称 + */ + private String sqName; + /** + * 街道名称 + */ + private String jdName; + /** + * 用户邮箱 + */ + private String email; + /** + * 手机号码 + */ + private String mobile; + /** + * 备注 + */ + private String remark; + /** + * 帐号状态(0正常 1停用) + */ + private Integer status; + /** + * 缴费标识(0否 1是 ) + */ + private Integer feeflag; + /** + * 缴费总金额 + */ + private String feetotal; + /** + * 体检基础套餐费用 + */ + private String tjpkgfee; + /** + * 体检基础套餐明细 + */ + private String tjpkgmx; + /** + * 可选体检项目费用 + */ + private String tjkxfee; + /** + * 可选体检项目明细 + */ + private String tjkxmx; + /** + * 体检缴费流水号 + */ + private String orderno; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantDO.java new file mode 100644 index 0000000..1b53cf0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantDO.java @@ -0,0 +1,84 @@ +package com.jojubanking.boot.module.system.dal.dataobject.tenant; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 租户 DO + * + * @author TW + */ +@TableName(value = "system_tenant", autoResultMap = true) +@KeySequence("system_tenant_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +public class TenantDO extends BaseDO { + + /** + * 套餐编号 - 系统 + */ + public static final Long PACKAGE_ID_SYSTEM = 0L; + + /** + * 租户编号,自增 + */ + private Long id; + /** + * 租户名,唯一 + */ + private String name; + /** + * 联系人的用户编号 + * + * 关联 {@link AdminUserDO#getId()} + */ + private Long contactUserId; + /** + * 联系人 + */ + private String contactName; + /** + * 联系手机 + */ + private String contactMobile; + /** + * 租户状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 绑定域名 + * + * TODO TW:目前是预留字段,未来会支持根据域名,自动查询到对应的租户。等等 + */ + private String domain; + /** + * 租户套餐编号 + * + * 关联 {@link TenantPackageDO#getId()} + * 特殊逻辑:系统内置租户,不使用套餐,暂时使用 {@link #PACKAGE_ID_SYSTEM} 标识 + */ + private Long packageId; + /** + * 过期时间 + */ + private Date expireTime; + /** + * 账号数量 + */ + private Integer accountCount; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantPackageDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantPackageDO.java new file mode 100644 index 0000000..2857d8c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantPackageDO.java @@ -0,0 +1,52 @@ +package com.jojubanking.boot.module.system.dal.dataobject.tenant; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.mybatis.core.type.JsonLongSetTypeHandler; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.util.Set; + +/** + * 租户套餐 DO + * + * @author TW + */ +@TableName(value = "system_tenant_package", autoResultMap = true) +@KeySequence("system_tenant_package_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TenantPackageDO extends BaseDO { + + /** + * 套餐编号,自增 + */ + private Long id; + /** + * 套餐名,唯一 + */ + private String name; + /** + * 租户状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 关联的菜单编号 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set menuIds; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountDO.java new file mode 100644 index 0000000..c737b30 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountDO.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.module.system.dal.dataobject.usecount; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 统计 DO + * + * @author admin + */ +@TableName("users_use_count") +@KeySequence("users_use_count_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UseCountDO extends BaseDO { + + /** + * 自增主键 + */ + @TableId + private Integer id; + /** + * 功能标识:TL挂号、TH退号、YC住院、MZ门诊、WJ问卷、BG报告 + */ + private String interfaceIdentification; + /** + * 用户标识 + */ + private Integer userId; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDO.java new file mode 100644 index 0000000..69f92fd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDO.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.dal.dataobject.usecount; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.io.Serializable; + +@TableName("users_use_count") +@KeySequence("users_use_count_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UseCountToDO extends BaseDO { + /** + * 自增主键 + */ + @TableId + private Integer id; + /** + * 功能标识:TL挂号、TH退号、YC住院、MZ门诊、WJ问卷、BG报告 + */ + private String interfaceIdentification; + /** + * 用户标识 + */ + private Integer userId; + + private Long tlsum; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDateDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDateDO.java new file mode 100644 index 0000000..916d39c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDateDO.java @@ -0,0 +1,15 @@ +package com.jojubanking.boot.module.system.dal.dataobject.usecount; + +import lombok.Data; + +@Data +public class UseCountToDateDO { + private String Date6; + private String Date5; + private String Date4; + private String Date3; + private String Date2; + private String Date1; + private String Date; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/user/AdminUserDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/user/AdminUserDO.java new file mode 100644 index 0000000..855b578 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/user/AdminUserDO.java @@ -0,0 +1,98 @@ +package com.jojubanking.boot.module.system.dal.dataobject.user; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.mybatis.core.type.JsonLongSetTypeHandler; +import com.jojubanking.boot.framework.tenant.core.db.TenantBaseDO; +import com.jojubanking.boot.module.system.enums.common.SexEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import lombok.experimental.Accessors; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +import java.util.Date; +import java.util.Set; + +/** + * 管理后台的用户 DO + * + * @author TW + */ +@TableName(value = "system_users", autoResultMap = true) // 由于 SQL Server 的 system_user 是关键字,所以使用 system_users +@KeySequence("system_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class AdminUserDO extends TenantBaseDO { + + /** + * 用户ID + */ + @TableId + private Long id; + /** + * 用户账号 + */ + private String username; + /** + * 加密后的密码 + * + * 因为目前使用 {@link BCryptPasswordEncoder} 加密器,所以无需自己处理 salt 盐 + */ + private String password; + /** + * 用户昵称 + */ + private String nickname; + /** + * 备注 + */ + private String remark; + /** + * 部门 ID + */ + private Long deptId; + /** + * 岗位编号数组 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set postIds; + /** + * 用户邮箱 + */ + private String email; + /** + * 手机号码 + */ + private String mobile; + /** + * 用户性别 + * + * 枚举类 {@link SexEnum} + */ + private Integer sex; + /** + * 用户头像 + */ + private String avatar; + /** + * 帐号状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 最后登录IP + */ + private String loginIp; + /** + * 最后登录时间 + */ + private Date loginDate; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/userinfo/UserInfoDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/userinfo/UserInfoDO.java new file mode 100644 index 0000000..208f480 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/userinfo/UserInfoDO.java @@ -0,0 +1,89 @@ +package com.jojubanking.boot.module.system.dal.dataobject.userinfo; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 用户信息 DO + * + * @author admin + */ +@TableName("hnwj_user_info") +@KeySequence("hnwj_user_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserInfoDO extends BaseDO { + + /** + * 用户id + */ + @TableId + private Long id; + /** + * openid + */ + private String openid; + /** + * 用户名 + */ + private String name; + /** + * 账号 + */ + private String user; + /** + * 登录密码 + */ + private String password; + /** + * 移动电话 + */ + private String phone; + /** + * 身份证 + */ + private String idno; + /** + * 邮箱 + */ + private String email; + /** + * 备注 + */ + private String remark; + /** + * 头像url + */ + private String headurl; + /** + * 出生日期 + */ + private String birthdate; + /** + * 籍贯 + */ + private String nativeplace; + /** + * 国家 + */ + private String country; + /** + * 省份 + */ + private String province; + /** + * 城市 + */ + private String city; + /** + * 性别 + */ + private String sex; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/usersxq/UsersXqDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/usersxq/UsersXqDO.java new file mode 100644 index 0000000..1d5e419 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/usersxq/UsersXqDO.java @@ -0,0 +1,81 @@ +package com.jojubanking.boot.module.system.dal.dataobject.usersxq; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 用户信息 DO + * + * @author admin + */ +@TableName("xytj_users") +@KeySequence("xytj_users_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UsersXqDO extends BaseDO { + + /** + * 用户ID + */ + @TableId + private Long id; + /** + * 用户账号 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 用户昵称 + */ + private String nickname; + /** + * 备注 + */ + private String remark; + /** + * 部门ID + */ + private Long deptId; + /** + * 岗位编号数组 + */ + private String postIds; + /** + * 用户邮箱 + */ + private String email; + /** + * 手机号码 + */ + private String mobile; + /** + * 用户性别 + */ + private Integer sex; + /** + * 头像地址 + */ + private String avatar; + /** + * 帐号状态(0正常 1停用) + */ + private Integer status; + /** + * 最后登录IP + */ + private String loginIp; + /** + * 最后登录时间 + */ + private Date loginDate; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wq/WqDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wq/WqDO.java new file mode 100644 index 0000000..b716c0f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wq/WqDO.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.system.dal.dataobject.wq; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 问卷调查 DO + * + * @author admin + */ +@TableName("hnwj_wq") +@KeySequence("hnwj_wq_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WqDO extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 标题 + */ + private String title; + /** + * 问卷类型编号 + */ + private Long typeId; + /** + * 问卷类型 住院、门诊 + */ + private String type; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDO.java new file mode 100644 index 0000000..0fff0ca --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDO.java @@ -0,0 +1,62 @@ +package com.jojubanking.boot.module.system.dal.dataobject.wqda; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 问卷调查答案 DO + * + * @author admin + */ +@TableName("hnwj_wqda") +@KeySequence("hnwj_wqda_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WqdaDO extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 问卷类型编号 + */ + private Long typeId; + /** + * 问题编号 + */ + private String questionId; + /** + * 问题类型 + */ + private String questionType; + /** + * 问题标题 + */ + private String questionTitle; + /** + * 问题答案 + */ + private String questionAnswer; + /** + * 问题其他 + */ + private String questionComment; + /** + * 用户名称 + */ + private String username; + /** + * 用户电话 + */ + private String usertel; + + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDOx.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDOx.java new file mode 100644 index 0000000..a3e829f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDOx.java @@ -0,0 +1,74 @@ +package com.jojubanking.boot.module.system.dal.dataobject.wqda; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 问卷调查答案 DO + * + * @author admin + */ +@TableName("hnwj_wqda") +@KeySequence("hnwj_wqda_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WqdaDOx extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 问卷类型编号 + */ + private Long typeId; + /** + * 问题编号 + */ + private String questionId; + /** + * 问题类型 + */ + private String questionType; + /** + * 问题标题 + */ + private String questionTitle; + /** + * 问题答案 + */ + private String questionAnswer; + /** + * 问题其他 + */ + private String questionComment; + /** + * 用户名称 + */ + private String username; + /** + * 用户电话 + */ + private String usertel; + /** + * 小计 + */ + private Long sum; + /** + * 占比 + */ + private Long progress; + + /** + * 问题label + */ + private String questionLabel; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewCustDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewCustDO.java new file mode 100644 index 0000000..7d2bca6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewCustDO.java @@ -0,0 +1,61 @@ +package com.jojubanking.boot.module.system.dal.dataobject.wqdaview; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +@TableName("hnwj_wqda_view") +@KeySequence("hnwj_wqda_view_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WqdaViewCustDO extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 问卷类型编号 + */ + private Long typeId; +// /** +// * 问题编号 +// */ +// private String questionId; +// /** +// * 问题类型 +// */ +// private String questionType; + /** + * 问题标题 + */ + private String questionTitle; + /** + * 问题答案 + */ + private String questionAnswer; + /** + * 问题其他 + */ + private String questionComment; + /** + * 用户名称 + */ + private String username; + /** + * 用户电话 + */ + private String usertel; + /** + * 问题标题 + */ + private String questionLabel; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewDO.java new file mode 100644 index 0000000..62c50fa --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewDO.java @@ -0,0 +1,65 @@ +package com.jojubanking.boot.module.system.dal.dataobject.wqdaview; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * VIEW DO + * + * @author admin + */ +@TableName("hnwj_wqda_view") +@KeySequence("hnwj_wqda_view_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WqdaViewDO extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 问卷类型编号 + */ + private Long typeId; + /** + * 问题编号 + */ + private String questionId; + /** + * 问题类型 + */ + private String questionType; + /** + * 问题标题 + */ + private String questionTitle; + /** + * 问题答案 + */ + private String questionAnswer; + /** + * 问题其他 + */ + private String questionComment; + /** + * 用户名称 + */ + private String username; + /** + * 用户电话 + */ + private String usertel; + /** + * 问题标题 + */ + private String questionLabel; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqwt/WqwtDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqwt/WqwtDO.java new file mode 100644 index 0000000..f79531f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/wqwt/WqwtDO.java @@ -0,0 +1,61 @@ +package com.jojubanking.boot.module.system.dal.dataobject.wqwt; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 问卷调查问题 DO + * + * @author admin + */ +@TableName("hnwj_wqwt") +@KeySequence("hnwj_wqwt_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WqwtDO extends BaseDO { + + /** + * ID + */ + @TableId + private Integer id; + /** + * 问卷类型编号 + */ + private Long typeId; + /** + * 问题编号 + */ + private String questionId; + /** + * 父id + */ + private String pid; + /** + * 问题级别,分为两级 + */ + private String gradingType; + /** + * 问题类型 + */ + private String questionType; + /** + * 问题标题 + */ + private String questionTitle; + /** + * 选项数目 + */ + private Integer questionOpnum; + /** + * 问题内容 + */ + private String questionContent; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/xymain/xyMainDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/xymain/xyMainDO.java new file mode 100644 index 0000000..deaf411 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/xymain/xyMainDO.java @@ -0,0 +1,115 @@ +package com.jojubanking.boot.module.system.dal.dataobject.xymain; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 体检信息 DO + * + * @author admin + */ +@TableName("xytj_main") +@KeySequence("xytj_main_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) + +@NoArgsConstructor +@AllArgsConstructor +public class xyMainDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 体检批次号 + */ + private String batchno; + /** + * 体检批次名称 + */ + private String batchname; + private String openid; + private Long defaultflag; + /** + * 病人唯一标识 + */ + private String patid; + /** + * 姓名 + */ + private String name; + /** + * 性别(1男 2女) + */ + private Integer sex; + /** + * 年龄 + */ + private Long age; + /** + * 身份证号 + */ + private String nationId; + /** + * 班级ID + */ + private Long deptId; + /** + * 班级名称 + */ + private String className; + /** + * 学校名称 + */ + private String schoolName; + /** + * 社区名称 + */ + private String sqName; + /** + * 街道名称 + */ + private String jdName; + /** + * 用户邮箱 + */ + private String email; + /** + * 手机号码 + */ + private String mobile; + /** + * 备注 + */ + private String remark; + /** + * 缴费标识(0否 1是 ) + */ + private Integer feeflag; + /** + * 缴费总金额 + */ + private String feetotal; + /** + * 体检基础套餐费用 + */ + private String tjpkgfee; + /** + * 体检基础套餐代码 + */ + private String tjpkgno; + /** + * 可选体检项目费用 + */ + private String tjkxfee; + /** + * 体检订单号 + */ + private String tjorderno; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/xyrw/XyrwDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/xyrw/XyrwDO.java new file mode 100644 index 0000000..ac89ab7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/xyrw/XyrwDO.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.system.dal.dataobject.xyrw; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * 批次信息 DO + * + * @author admin + */ +@TableName("xytj_xyrw") +@KeySequence("xytj_xyrw_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class XyrwDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 批次号 + */ + private String batchno; + /** + * 体检批次名称 + */ + private String batchName; + /** + * 批次状态(1进行中 2停止) + */ + private Integer batchStatus; + /** + * 备注 + */ + private String remark; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/xytjjg/XytjjgDO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/xytjjg/XytjjgDO.java new file mode 100644 index 0000000..fde8c3f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/dataobject/xytjjg/XytjjgDO.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.system.dal.dataobject.xytjjg; + +import lombok.*; +import java.util.*; +import com.baomidou.mybatisplus.annotation.*; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; + +/** + * HIS项目 DO + * + * @author admin + */ +@TableName("joju_xytjjg") +@KeySequence("joju_xytjjg_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class XytjjgDO extends BaseDO { + + /** + * 用户ID + */ + @TableId + private Long id; + /** + * 项目代码 + */ + private String itemno; + /** + * 项目名称 + */ + private String itemname; + /** + * 项目单价 + */ + private String itemprice; + /** + * 项目标识 + */ + private String itemflag; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/building/BuildingMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/building/BuildingMapper.java new file mode 100644 index 0000000..9631cb3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/building/BuildingMapper.java @@ -0,0 +1,63 @@ +package com.jojubanking.boot.module.system.dal.mysql.building; + +import java.util.*; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.building.BuildingDO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.building.vo.*; +import org.apache.ibatis.annotations.Select; + +/** + * 楼层导视 Mapper + * + * @author admin + */ +@Mapper +public interface BuildingMapper extends BaseMapperX { + + default PageResult selectPage(BuildingPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(BuildingDO::getName, reqVO.getName()) + .eqIfPresent(BuildingDO::getParentId, reqVO.getParentId()) + .eqIfPresent(BuildingDO::getStatus, reqVO.getStatus()) + .eqIfPresent(BuildingDO::getFid, reqVO.getFid()) + .betweenIfPresent(BuildingDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(BuildingDO::getId)); + } + + default List selectList(BuildingExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(BuildingDO::getName, reqVO.getName()) + .eqIfPresent(BuildingDO::getParentId, reqVO.getParentId()) + .eqIfPresent(BuildingDO::getStatus, reqVO.getStatus()) + .eqIfPresent(BuildingDO::getFid, reqVO.getFid()) + .betweenIfPresent(BuildingDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(BuildingDO::getId)); + } + + default List selectList01(BuildingListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(BuildingDO::getName, reqVO.getName()) + .eqIfPresent(BuildingDO::getStatus, reqVO.getStatus())); + } + + default BuildingDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(new LambdaQueryWrapper() + .eq(BuildingDO::getParentId, parentId) + .eq(BuildingDO::getName, name)); + } + + default Long selectCountByParentId(Long parentId) { + return selectCount(BuildingDO::getParentId, parentId); + } + + @Select("SELECT COUNT(*) FROM hnwj_buiding WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/carousel/CarouselMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/carousel/CarouselMapper.java new file mode 100644 index 0000000..a48469d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/carousel/CarouselMapper.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.system.dal.mysql.carousel; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.carousel.CarouselDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.carousel.vo.*; + +/** + * 轮播图 Mapper + * + * @author admin + */ +@Mapper +public interface CarouselMapper extends BaseMapperX { + + default PageResult selectPage(CarouselPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(CarouselDO::getTitle, reqVO.getTitle()) + .eqIfPresent(CarouselDO::getImg, reqVO.getImg()) + .eqIfPresent(CarouselDO::getType, reqVO.getType()) + .betweenIfPresent(CarouselDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(CarouselDO::getId)); + } + + default List selectList(CarouselExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(CarouselDO::getTitle, reqVO.getTitle()) + .eqIfPresent(CarouselDO::getImg, reqVO.getImg()) + .eqIfPresent(CarouselDO::getType, reqVO.getType()) + .betweenIfPresent(CarouselDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(CarouselDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/childitem/ChilditemMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/childitem/ChilditemMapper.java new file mode 100644 index 0000000..47abfc3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/childitem/ChilditemMapper.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.module.system.dal.mysql.childitem; + +import java.util.*; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.ItemListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.childitem.ChilditemDO; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.*; + +/** + * 检查项目子 Mapper + * + * @author admin + */ +@Mapper +public interface ChilditemMapper extends BaseMapperX { + + default PageResult selectPage(ChilditemPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ChilditemDO::getPackageno, reqVO.getPackageno()) + .eqIfPresent(ChilditemDO::getItemflag, reqVO.getItemflag()) + .eqIfPresent(ChilditemDO::getItemno, reqVO.getItemno()) + .likeIfPresent(ChilditemDO::getItemname, reqVO.getItemname()) + .eqIfPresent(ChilditemDO::getItemprice, reqVO.getItemprice()) + .betweenIfPresent(ChilditemDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ChilditemDO::getId)); + } + + default List selectList(ChilditemExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ChilditemDO::getPackageno, reqVO.getPackageno()) + .eqIfPresent(ChilditemDO::getItemflag, reqVO.getItemflag()) + .eqIfPresent(ChilditemDO::getItemno, reqVO.getItemno()) + .likeIfPresent(ChilditemDO::getItemname, reqVO.getItemname()) + .eqIfPresent(ChilditemDO::getItemprice, reqVO.getItemprice()) + .betweenIfPresent(ChilditemDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ChilditemDO::getId)); + } + + default List selectSimpleList(ItemListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ChilditemDO::getPackageno, reqVO.getPackageno()) + .eqIfPresent(ChilditemDO::getItemflag, reqVO.getItemflag()) + .eqIfPresent(ChilditemDO::getItemno, reqVO.getItemno()) + .eqIfPresent(ChilditemDO::getDeleted, false) + .likeIfPresent(ChilditemDO::getItemname, reqVO.getItemname()) + .orderByDesc(ChilditemDO::getId)); + } + + default void updateItemPriceByNo(ChilditemDO itemDO){ + update(itemDO, Wrappers.lambdaUpdate(ChilditemDO.class) + .eq(ChilditemDO::getItemno, itemDO.getItemno())); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dept/DeptMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dept/DeptMapper.java new file mode 100644 index 0000000..3f8994d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dept/DeptMapper.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.dal.mysql.dept; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface DeptMapper extends BaseMapperX { + + default List selectList(DeptListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DeptDO::getName, reqVO.getName()) + .eqIfPresent(DeptDO::getStatus, reqVO.getStatus())); + } + + default DeptDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(new LambdaQueryWrapper() + .eq(DeptDO::getParentId, parentId) + .eq(DeptDO::getName, name)); + } + + default Long selectCountByParentId(Long parentId) { + return selectCount(DeptDO::getParentId, parentId); + } + + @Select("SELECT COUNT(*) FROM system_dept WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dept/PostMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dept/PostMapper.java new file mode 100644 index 0000000..a50e3f6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dept/PostMapper.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.module.system.dal.mysql.dept; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.QueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface PostMapper extends BaseMapperX { + + default List selectList(Collection ids, Collection statuses) { + return selectList(new QueryWrapperX().inIfPresent("id", ids) + .inIfPresent("status", statuses)); + } + + default PageResult selectPage(PostPageReqVO reqVO) { + return selectPage(reqVO, new QueryWrapperX() + .likeIfPresent("code", reqVO.getCode()) + .likeIfPresent("name", reqVO.getName()) + .eqIfPresent("status", reqVO.getStatus()) + .orderByDesc("id")); + } + + default List selectList(PostExportReqVO reqVO) { + return selectList(new QueryWrapperX() + .likeIfPresent("code", reqVO.getCode()) + .likeIfPresent("name", reqVO.getName()) + .eqIfPresent("status", reqVO.getStatus())); + } + + default PostDO selectByName(String name) { + return selectOne(new QueryWrapper().eq("name", name)); + } + + default PostDO selectByCode(String code) { + return selectOne(new QueryWrapper().eq("code", code)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dept/UserPostMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dept/UserPostMapper.java new file mode 100644 index 0000000..a48cf4a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dept/UserPostMapper.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.dal.mysql.dept; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.dal.dataobject.dept.UserPostDO; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface UserPostMapper extends BaseMapperX { + + default List selectListByUserId(Long userId) { + return selectList(new LambdaQueryWrapperX() + .eq(UserPostDO::getUserId, userId)); + } + + default void deleteByUserIdAndPostId(Long userId, Collection postIds) { + delete(new LambdaQueryWrapperX() + .eq(UserPostDO::getUserId, userId) + .in(UserPostDO::getPostId, postIds)); + } + + default List selectListByPostIds(Collection postIds) { + return selectList(new LambdaQueryWrapperX() + .in(UserPostDO::getPostId, postIds)); + } + + default void deleteByUserId(Long userId){ + delete(Wrappers.lambdaUpdate(UserPostDO.class).eq(UserPostDO::getUserId, userId)); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/deptxq/DeptXqMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/deptxq/DeptXqMapper.java new file mode 100644 index 0000000..90edb75 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/deptxq/DeptXqMapper.java @@ -0,0 +1,77 @@ +package com.jojubanking.boot.module.system.dal.mysql.deptxq; + +import java.util.*; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.DeptXqtjListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.deptxq.DeptXqDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.deptxq.vo.*; +import org.apache.ibatis.annotations.Select; + +/** + * 部门 Mapper + * + * @author admin + */ +@Mapper +public interface DeptXqMapper extends BaseMapperX { + + default List selectXqList(DeptXqListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DeptXqDO::getName, reqVO.getName()) + .eqIfPresent(DeptXqDO::getStatus, reqVO.getStatus())); + } + + default List selectXqtjList(DeptXqtjListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DeptXqDO::getName, reqVO.getName()) + .eqIfPresent(DeptXqDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeptXqDO::getParentId, reqVO.getParentId())); + } + + default DeptXqDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(new LambdaQueryWrapper() + .eq(DeptXqDO::getParentId, parentId) + .eq(DeptXqDO::getName, name)); + } + + default Long selectCountByParentId(Long parentId) { + return selectCount(DeptXqDO::getParentId, parentId); + } + + @Select("SELECT COUNT(*) FROM xytj_dept WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + + default PageResult selectPage(DeptXqPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(DeptXqDO::getName, reqVO.getName()) + .eqIfPresent(DeptXqDO::getParentId, reqVO.getParentId()) + .eqIfPresent(DeptXqDO::getSort, reqVO.getSort()) + .eqIfPresent(DeptXqDO::getLeaderUserId, reqVO.getLeaderUserId()) + .eqIfPresent(DeptXqDO::getPhone, reqVO.getPhone()) + .eqIfPresent(DeptXqDO::getEmail, reqVO.getEmail()) + .eqIfPresent(DeptXqDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(DeptXqDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DeptXqDO::getId)); + } + + default List selectList(DeptXqExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DeptXqDO::getName, reqVO.getName()) + .eqIfPresent(DeptXqDO::getParentId, reqVO.getParentId()) + .eqIfPresent(DeptXqDO::getSort, reqVO.getSort()) + .eqIfPresent(DeptXqDO::getLeaderUserId, reqVO.getLeaderUserId()) + .eqIfPresent(DeptXqDO::getPhone, reqVO.getPhone()) + .eqIfPresent(DeptXqDO::getEmail, reqVO.getEmail()) + .eqIfPresent(DeptXqDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(DeptXqDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DeptXqDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dict/DictDataMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dict/DictDataMapper.java new file mode 100644 index 0000000..f2ba693 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dict/DictDataMapper.java @@ -0,0 +1,52 @@ +package com.jojubanking.boot.module.system.dal.mysql.dict; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictDataDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +@Mapper +public interface DictDataMapper extends BaseMapperX { + + default DictDataDO selectByDictTypeAndValue(String dictType, String value) { + return selectOne(new LambdaQueryWrapper().eq(DictDataDO::getDictType, dictType) + .eq(DictDataDO::getValue, value)); + } + + default DictDataDO selectByDictTypeAndLabel(String dictType, String label) { + return selectOne(new LambdaQueryWrapper().eq(DictDataDO::getDictType, dictType) + .eq(DictDataDO::getLabel, label)); + } + + default List selectByDictTypeAndValues(String dictType, Collection values) { + return selectList(new LambdaQueryWrapper().eq(DictDataDO::getDictType, dictType) + .in(DictDataDO::getValue, values)); + } + + default long selectCountByDictType(String dictType) { + return selectCount(DictDataDO::getDictType, dictType); + } + + default PageResult selectPage(DictDataPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(DictDataDO::getLabel, reqVO.getLabel()) + .likeIfPresent(DictDataDO::getDictType, reqVO.getDictType()) + .eqIfPresent(DictDataDO::getStatus, reqVO.getStatus()) + .orderByDesc(Arrays.asList(DictDataDO::getDictType, DictDataDO::getSort))); + } + + default List selectList(DictDataExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX().likeIfPresent(DictDataDO::getLabel, reqVO.getLabel()) + .likeIfPresent(DictDataDO::getDictType, reqVO.getDictType()) + .eqIfPresent(DictDataDO::getStatus, reqVO.getStatus())); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dict/DictTypeMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dict/DictTypeMapper.java new file mode 100644 index 0000000..6e0f75b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dict/DictTypeMapper.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.system.dal.mysql.dict; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictTypeDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface DictTypeMapper extends BaseMapperX { + + default PageResult selectPage(DictTypePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(DictTypeDO::getName, reqVO.getName()) + .likeIfPresent(DictTypeDO::getType, reqVO.getType()) + .eqIfPresent(DictTypeDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(DictTypeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DictTypeDO::getId)); + } + + default List selectList(DictTypeExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DictTypeDO::getName, reqVO.getName()) + .likeIfPresent(DictTypeDO::getType, reqVO.getType()) + .eqIfPresent(DictTypeDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(DictTypeDO::getCreateTime, reqVO.getCreateTime())); + } + + default DictTypeDO selectByType(String type) { + return selectOne(DictTypeDO::getType, type); + } + + default DictTypeDO selectByName(String name) { + return selectOne(DictTypeDO::getName, name); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/doctor/DoctorMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/doctor/DoctorMapper.java new file mode 100644 index 0000000..24d7f25 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/doctor/DoctorMapper.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.module.system.dal.mysql.doctor; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.doctor.DoctorDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.doctor.vo.*; + +/** + * 医生信息 Mapper + * + * @author admin + */ +@Mapper +public interface DoctorMapper extends BaseMapperX { + + default PageResult selectPage(DoctorPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(DoctorDO::getName, reqVO.getName()) + .eqIfPresent(DoctorDO::getImg, reqVO.getImg()) + .eqIfPresent(DoctorDO::getMid, reqVO.getMid()) + .eqIfPresent(DoctorDO::getInfo, reqVO.getInfo()) + .eqIfPresent(DoctorDO::getGrsc, reqVO.getGrsc()) + .betweenIfPresent(DoctorDO::getZztime, reqVO.getZztime()) + .eqIfPresent(DoctorDO::getLabel, reqVO.getLabel()) + .betweenIfPresent(DoctorDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DoctorDO::getId)); + } + + default List selectList(DoctorExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DoctorDO::getName, reqVO.getName()) + .eqIfPresent(DoctorDO::getImg, reqVO.getImg()) + .eqIfPresent(DoctorDO::getMid, reqVO.getMid()) + .eqIfPresent(DoctorDO::getInfo, reqVO.getInfo()) + .eqIfPresent(DoctorDO::getGrsc, reqVO.getGrsc()) + .betweenIfPresent(DoctorDO::getZztime, reqVO.getZztime()) + .eqIfPresent(DoctorDO::getLabel, reqVO.getLabel()) + .betweenIfPresent(DoctorDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DoctorDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dzquestion/DzQuestionMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dzquestion/DzQuestionMapper.java new file mode 100644 index 0000000..7ff8750 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dzquestion/DzQuestionMapper.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.module.system.dal.mysql.dzquestion; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.dzquestion.DzQuestionDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.dzquestion.vo.*; + +/** + * 导诊管理 Mapper + * + * @author admin + */ +@Mapper +public interface DzQuestionMapper extends BaseMapperX { + + default PageResult selectPage(DzQuestionPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DzQuestionDO::getQuestion, reqVO.getQuestion()) + .likeIfPresent(DzQuestionDO::getDepartmentName, reqVO.getDepartmentName()) + .eqIfPresent(DzQuestionDO::getDepartmentNo, reqVO.getDepartmentNo()) + .eqIfPresent(DzQuestionDO::getBodyAreaType, reqVO.getBodyAreaType()) + .likeIfPresent(DzQuestionDO::getBodyArerName, reqVO.getBodyArerName()) + .eqIfPresent(DzQuestionDO::getQuestionType, reqVO.getQuestionType()) + .likeIfPresent(DzQuestionDO::getQuestionTypeName, reqVO.getQuestionTypeName()) + .betweenIfPresent(DzQuestionDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DzQuestionDO::getId)); + } + + default List selectList(DzQuestionExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DzQuestionDO::getQuestion, reqVO.getQuestion()) + .likeIfPresent(DzQuestionDO::getDepartmentName, reqVO.getDepartmentName()) + .eqIfPresent(DzQuestionDO::getDepartmentNo, reqVO.getDepartmentNo()) + .eqIfPresent(DzQuestionDO::getBodyAreaType, reqVO.getBodyAreaType()) + .likeIfPresent(DzQuestionDO::getBodyArerName, reqVO.getBodyArerName()) + .eqIfPresent(DzQuestionDO::getQuestionType, reqVO.getQuestionType()) + .likeIfPresent(DzQuestionDO::getQuestionTypeName, reqVO.getQuestionTypeName()) + .betweenIfPresent(DzQuestionDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DzQuestionDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dztype/DzTypeMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dztype/DzTypeMapper.java new file mode 100644 index 0000000..3347230 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/dztype/DzTypeMapper.java @@ -0,0 +1,59 @@ +package com.jojubanking.boot.module.system.dal.mysql.dztype; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.dztype.DzTypeDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.dztype.vo.*; + +/** + * 导诊类型 Mapper + * + * @author admin + */ +@Mapper +public interface DzTypeMapper extends BaseMapperX { + + default PageResult selectPage(DzTypePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DzTypeDO::getBodyAreaType, reqVO.getBodyAreaType()) + .likeIfPresent(DzTypeDO::getBodyAreaName, reqVO.getBodyAreaName()) + .eqIfPresent(DzTypeDO::getQuestionType, reqVO.getQuestionType()) + .likeIfPresent(DzTypeDO::getQuestionTypeName, reqVO.getQuestionTypeName()) + .betweenIfPresent(DzTypeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DzTypeDO::getId)); + } + + default PageResult selectPage1(DzTypePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DzTypeDO::getBodyAreaType, reqVO.getBodyAreaType()) + .likeIfPresent(DzTypeDO::getBodyAreaName, reqVO.getBodyAreaName()) + .eqIfPresent(DzTypeDO::getQuestionType, reqVO.getQuestionType()) + .likeIfPresent(DzTypeDO::getQuestionTypeName, reqVO.getQuestionTypeName()) + .betweenIfPresent(DzTypeDO::getCreateTime, reqVO.getCreateTime()) + .last("group by body_area_type ORDER BY id")); + } + default PageResult selectPage2(DzTypePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DzTypeDO::getBodyAreaType, reqVO.getBodyAreaType()) + .likeIfPresent(DzTypeDO::getBodyAreaName, reqVO.getBodyAreaName()) + .eqIfPresent(DzTypeDO::getQuestionType, reqVO.getQuestionType()) + .likeIfPresent(DzTypeDO::getQuestionTypeName, reqVO.getQuestionTypeName()) + .betweenIfPresent(DzTypeDO::getCreateTime, reqVO.getCreateTime()) + .last("ORDER BY question_type")); + } + + default List selectList(DzTypeExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DzTypeDO::getBodyAreaType, reqVO.getBodyAreaType()) + .likeIfPresent(DzTypeDO::getBodyAreaName, reqVO.getBodyAreaName()) + .eqIfPresent(DzTypeDO::getQuestionType, reqVO.getQuestionType()) + .likeIfPresent(DzTypeDO::getQuestionTypeName, reqVO.getQuestionTypeName()) + .betweenIfPresent(DzTypeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DzTypeDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/errorcode/ErrorCodeMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/errorcode/ErrorCodeMapper.java new file mode 100644 index 0000000..44bcfe7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/errorcode/ErrorCodeMapper.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.module.system.dal.mysql.errorcode; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodePageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.errorcode.ErrorCodeDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +@Mapper +public interface ErrorCodeMapper extends BaseMapperX { + + default PageResult selectPage(ErrorCodePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ErrorCodeDO::getType, reqVO.getType()) + .likeIfPresent(ErrorCodeDO::getApplicationName, reqVO.getApplicationName()) + .eqIfPresent(ErrorCodeDO::getCode, reqVO.getCode()) + .likeIfPresent(ErrorCodeDO::getMessage, reqVO.getMessage()) + .betweenIfPresent(ErrorCodeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ErrorCodeDO::getCode)); + } + + default List selectList(ErrorCodeExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ErrorCodeDO::getType, reqVO.getType()) + .likeIfPresent(ErrorCodeDO::getApplicationName, reqVO.getApplicationName()) + .eqIfPresent(ErrorCodeDO::getCode, reqVO.getCode()) + .likeIfPresent(ErrorCodeDO::getMessage, reqVO.getMessage()) + .betweenIfPresent(ErrorCodeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ErrorCodeDO::getCode)); + } + + default List selectListByCodes(Collection codes) { + return selectList(new LambdaQueryWrapperX().in(ErrorCodeDO::getCode, codes)); + } + + default ErrorCodeDO selectByCode(Integer code) { + return selectOne(new LambdaQueryWrapperX().eq(ErrorCodeDO::getCode, code)); + } + + default List selectListByApplicationNameAndUpdateTimeGt(String applicationName, Date minUpdateTime) { + return selectList(new LambdaQueryWrapperX().eq(ErrorCodeDO::getApplicationName, applicationName) + .gtIfPresent(ErrorCodeDO::getUpdateTime, minUpdateTime)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/hospital/HospitalMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/hospital/HospitalMapper.java new file mode 100644 index 0000000..51f5eab --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/hospital/HospitalMapper.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.module.system.dal.mysql.hospital; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.hospital.HospitalDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.hospital.vo.*; + +/** + * 医院信息 Mapper + * + * @author admin + */ +@Mapper +public interface HospitalMapper extends BaseMapperX { + + default PageResult selectPage(HospitalPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(HospitalDO::getName, reqVO.getName()) + .eqIfPresent(HospitalDO::getLogo, reqVO.getLogo()) + .eqIfPresent(HospitalDO::getLabel, reqVO.getLabel()) + .eqIfPresent(HospitalDO::getTel, reqVO.getTel()) + .eqIfPresent(HospitalDO::getAddress, reqVO.getAddress()) + .eqIfPresent(HospitalDO::getContent, reqVO.getContent()) + .eqIfPresent(HospitalDO::getImg, reqVO.getImg()) + .betweenIfPresent(HospitalDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(HospitalDO::getId)); + } + + default List selectList(HospitalExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(HospitalDO::getName, reqVO.getName()) + .eqIfPresent(HospitalDO::getLogo, reqVO.getLogo()) + .eqIfPresent(HospitalDO::getLabel, reqVO.getLabel()) + .eqIfPresent(HospitalDO::getTel, reqVO.getTel()) + .eqIfPresent(HospitalDO::getAddress, reqVO.getAddress()) + .eqIfPresent(HospitalDO::getContent, reqVO.getContent()) + .eqIfPresent(HospitalDO::getImg, reqVO.getImg()) + .betweenIfPresent(HospitalDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(HospitalDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/information/InformationMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/information/InformationMapper.java new file mode 100644 index 0000000..7c274df --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/information/InformationMapper.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.dal.mysql.information; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.information.InformationDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.information.vo.*; + +/** + * 指南信息 Mapper + * + * @author admin + */ +@Mapper +public interface InformationMapper extends BaseMapperX { + + default PageResult selectPage(InformationPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(InformationDO::getTitle, reqVO.getTitle()) + .eqIfPresent(InformationDO::getImg, reqVO.getImg()) + .eqIfPresent(InformationDO::getContent, reqVO.getContent()) + .eqIfPresent(InformationDO::getType, reqVO.getType()) + .betweenIfPresent(InformationDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(InformationDO::getId)); + } + + default List selectList(InformationExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(InformationDO::getTitle, reqVO.getTitle()) + .eqIfPresent(InformationDO::getImg, reqVO.getImg()) + .eqIfPresent(InformationDO::getContent, reqVO.getContent()) + .eqIfPresent(InformationDO::getType, reqVO.getType()) + .betweenIfPresent(InformationDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(InformationDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/item/ItemMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/item/ItemMapper.java new file mode 100644 index 0000000..57cdde2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/item/ItemMapper.java @@ -0,0 +1,91 @@ +package com.jojubanking.boot.module.system.dal.mysql.item; + +import java.util.*; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.ItemListReqVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.studentJfListVO; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.item.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 检查项目 Mapper + * + * @author admin + */ +@Mapper +public interface ItemMapper extends BaseMapperX { + + default PageResult selectPage(ItemPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ItemDO::getPackageflag, reqVO.getPackageflag()) + .eqIfPresent(ItemDO::getPackageno, reqVO.getPackageno()) + .eqIfPresent(ItemDO::getItemflag, reqVO.getItemflag()) + .eqIfPresent(ItemDO::getItemno, reqVO.getItemno()) + .likeIfPresent(ItemDO::getItemname, reqVO.getItemname()) + .eqIfPresent(ItemDO::getItemprice, reqVO.getItemprice()) + .betweenIfPresent(ItemDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ItemDO::getId)); + } + + default List selectList(ItemExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemDO::getPackageflag, reqVO.getPackageflag()) + .eqIfPresent(ItemDO::getPackageno, reqVO.getPackageno()) + .eqIfPresent(ItemDO::getItemflag, reqVO.getItemflag()) + .eqIfPresent(ItemDO::getItemno, reqVO.getItemno()) + .likeIfPresent(ItemDO::getItemname, reqVO.getItemname()) + .eqIfPresent(ItemDO::getItemprice, reqVO.getItemprice()) + .betweenIfPresent(ItemDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(ItemDO::getSort)); + } + +// @Select("SELECT * FROM xytj_item b WHERE NOT EXISTS ( SELECT 1 FROM xytj_order a WHERE a.itemno = b.itemno AND a.patid = #{patid} ) and b.packageno != #{packageno} ") +// List selectItemAddtionListByOrder(@Param("patid") String patid, @Param("packageno") String packageno ); + + @Select("SELECT * FROM xytj_item b WHERE NOT EXISTS ( SELECT 1 FROM xytj_order a WHERE a.itemno = b.itemno AND a.patid = #{patid} AND a.batchno = #{batchno} and a.deleted = false) and b.packageno = #{packageno} and b.deleted = false") + List selectItemStandardListByOrder(@Param("patid") String patid, @Param("packageno") String packageno , @Param("batchno") String batchno ); + + @Select("SELECT * FROM xytj_item b WHERE NOT EXISTS ( SELECT 1 FROM xytj_order a WHERE a.itemno = b.itemno AND a.patid = #{patid} ) and b.packageno = #{packageno} ") + List updateItemPriceByNo1(@Param("patid") String patid, @Param("packageno") String packageno ); + + default void updateItemByChild(ItemDO itemDO){ + update(itemDO, Wrappers.lambdaUpdate(ItemDO.class) + .eq(ItemDO::getPackageno, itemDO.getPackageno())); + } + + + default void updateItemPriceByNo(ItemDO itemDO){ + update(itemDO, Wrappers.lambdaUpdate(ItemDO.class) + .eq(ItemDO::getItemno, itemDO.getItemno())); + } + + default List selectSimpleList(ItemListReqVO reqVO) { + if(reqVO.getPackageno().equals("0")){ + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemDO::getPackageflag, reqVO.getPackageflag()) + .eqIfPresent(ItemDO::getPackageno, reqVO.getPackageno()) + .eqIfPresent(ItemDO::getItemflag, reqVO.getItemflag()) + .eqIfPresent(ItemDO::getItemno, reqVO.getItemno()) + .likeIfPresent(ItemDO::getItemname, reqVO.getItemname()) + .orderByDesc(ItemDO::getId)); + + }else{ + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemDO::getPackageflag, reqVO.getPackageflag()) + .neIfPresent(ItemDO::getPackageno, "0") + .eqIfPresent(ItemDO::getItemflag, reqVO.getItemflag()) + .eqIfPresent(ItemDO::getItemno, reqVO.getItemno()) + .likeIfPresent(ItemDO::getItemname, reqVO.getItemname()) + .orderByDesc(ItemDO::getId)); + } + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/ksinfo/KsInfoMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/ksinfo/KsInfoMapper.java new file mode 100644 index 0000000..d540d76 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/ksinfo/KsInfoMapper.java @@ -0,0 +1,66 @@ +package com.jojubanking.boot.module.system.dal.mysql.ksinfo; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.ksinfo.KsInfoDO; +import com.jojubanking.boot.module.system.dal.dataobject.wqda.WqdaDOx; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.ksinfo.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; + +/** + * 科室信息 Mapper + * + * @author admin + */ +@Mapper +public interface KsInfoMapper extends BaseMapperX { + + default PageResult selectPage(KsInfoPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(KsInfoDO::getName, reqVO.getName()) + .eqIfPresent(KsInfoDO::getTid, reqVO.getTid()) + .eqIfPresent(KsInfoDO::getInfo, reqVO.getInfo()) + .eqIfPresent(KsInfoDO::getAddress, reqVO.getAddress()) + .eqIfPresent(KsInfoDO::getImg, reqVO.getImg()) + .eqIfPresent(KsInfoDO::getDepartcode, reqVO.getDepartcode()) + .eqIfPresent(KsInfoDO::getDeparttype, reqVO.getDeparttype()) + .eqIfPresent(KsInfoDO::getUptype, reqVO.getUptype()) + .betweenIfPresent(KsInfoDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(KsInfoDO::getId)); + } + + default PageResult selectDzPage(KsInfoPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(KsInfoDO::getName, reqVO.getName()) + .eqIfPresent(KsInfoDO::getTid, reqVO.getTid()) + .eqIfPresent(KsInfoDO::getInfo, reqVO.getInfo()) + .eqIfPresent(KsInfoDO::getAddress, reqVO.getAddress()) + .eqIfPresent(KsInfoDO::getImg, reqVO.getImg()) + .eqIfPresent(KsInfoDO::getDepartcode, reqVO.getDepartcode()) + .eqIfPresent(KsInfoDO::getDeparttype, reqVO.getDeparttype()) + .eqIfPresent(KsInfoDO::getUptype, reqVO.getUptype()) + .betweenIfPresent(KsInfoDO::getCreateTime, reqVO.getCreateTime()) + .last("and uptype != '99' ORDER BY id")); + } + + default List selectList(KsInfoExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(KsInfoDO::getName, reqVO.getName()) + .eqIfPresent(KsInfoDO::getTid, reqVO.getTid()) + .eqIfPresent(KsInfoDO::getInfo, reqVO.getInfo()) + .eqIfPresent(KsInfoDO::getAddress, reqVO.getAddress()) + .eqIfPresent(KsInfoDO::getImg, reqVO.getImg()) + .eqIfPresent(KsInfoDO::getDepartcode, reqVO.getDepartcode()) + .eqIfPresent(KsInfoDO::getDeparttype, reqVO.getDeparttype()) + .eqIfPresent(KsInfoDO::getUptype, reqVO.getUptype()) + .betweenIfPresent(KsInfoDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(KsInfoDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/kstype/KsTypeMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/kstype/KsTypeMapper.java new file mode 100644 index 0000000..c014bb8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/kstype/KsTypeMapper.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.dal.mysql.kstype; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.kstype.KsTypeDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.kstype.vo.*; + +/** + * 科室类别 Mapper + * + * @author admin + */ +@Mapper +public interface KsTypeMapper extends BaseMapperX { + + default PageResult selectPage(KsTypePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(KsTypeDO::getName, reqVO.getName()) + .betweenIfPresent(KsTypeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(KsTypeDO::getId)); + } + + default List selectList(KsTypeExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(KsTypeDO::getName, reqVO.getName()) + .betweenIfPresent(KsTypeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(KsTypeDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/label/LabelMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/label/LabelMapper.java new file mode 100644 index 0000000..e5b4fca --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/label/LabelMapper.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.dal.mysql.label; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.label.LabelDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.label.vo.*; + +/** + * 信息 Mapper + * + * @author admin + */ +@Mapper +public interface LabelMapper extends BaseMapperX { + + default PageResult selectPage(LabelPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(LabelDO::getName, reqVO.getName()) + .eqIfPresent(LabelDO::getInfo, reqVO.getInfo()) + .eqIfPresent(LabelDO::getFid, reqVO.getFid()) + .eqIfPresent(LabelDO::getBid, reqVO.getBid()) + .betweenIfPresent(LabelDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(LabelDO::getId)); + } + + default List selectList(LabelExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(LabelDO::getName, reqVO.getName()) + .eqIfPresent(LabelDO::getInfo, reqVO.getInfo()) + .eqIfPresent(LabelDO::getFid, reqVO.getFid()) + .eqIfPresent(LabelDO::getBid, reqVO.getBid()) + .betweenIfPresent(LabelDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(LabelDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/logger/LoginLogMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/logger/LoginLogMapper.java new file mode 100644 index 0000000..ce09414 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/logger/LoginLogMapper.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.system.dal.mysql.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.logger.LoginLogDO; +import com.jojubanking.boot.module.system.enums.logger.LoginResultEnum; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface LoginLogMapper extends BaseMapperX { + + default PageResult selectPage(LoginLogPageReqVO reqVO) { + LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .likeIfPresent(LoginLogDO::getUserIp, reqVO.getUserIp()) + .likeIfPresent(LoginLogDO::getUsername, reqVO.getUsername()) + .betweenIfPresent(LoginLogDO::getCreateTime, reqVO.getCreateTime()); + if (Boolean.TRUE.equals(reqVO.getStatus())) { + query.eq(LoginLogDO::getResult, LoginResultEnum.SUCCESS.getResult()); + } else if (Boolean.FALSE.equals(reqVO.getStatus())) { + query.gt(LoginLogDO::getResult, LoginResultEnum.SUCCESS.getResult()); + } + query.orderByDesc(LoginLogDO::getId); // 降序 + return selectPage(reqVO, query); + } + + default List selectList(LoginLogExportReqVO reqVO) { + LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .likeIfPresent(LoginLogDO::getUserIp, reqVO.getUserIp()) + .likeIfPresent(LoginLogDO::getUsername, reqVO.getUsername()) + .betweenIfPresent(LoginLogDO::getCreateTime, reqVO.getCreateTime()); + if (Boolean.TRUE.equals(reqVO.getStatus())) { + query.eq(LoginLogDO::getResult, LoginResultEnum.SUCCESS.getResult()); + } else if (Boolean.FALSE.equals(reqVO.getStatus())) { + query.gt(LoginLogDO::getResult, LoginResultEnum.SUCCESS.getResult()); + } + query.orderByDesc(LoginLogDO::getId); // 降序 + return selectList(query); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/logger/OperateLogMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/logger/OperateLogMapper.java new file mode 100644 index 0000000..a62b664 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/logger/OperateLogMapper.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.module.system.dal.mysql.logger; + +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.logger.OperateLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface OperateLogMapper extends BaseMapperX { + + default PageResult selectPage(OperateLogPageReqVO reqVO, Collection userIds) { + LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .likeIfPresent(OperateLogDO::getModule, reqVO.getModule()) + .inIfPresent(OperateLogDO::getUserId, userIds) + .eqIfPresent(OperateLogDO::getType, reqVO.getType()) + .betweenIfPresent(OperateLogDO::getStartTime, reqVO.getStartTime()); + if (Boolean.TRUE.equals(reqVO.getSuccess())) { + query.eq(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode()); + } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { + query.gt(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode()); + } + query.orderByDesc(OperateLogDO::getId); // 降序 + return selectPage(reqVO, query); + } + + default List selectList(OperateLogExportReqVO reqVO, Collection userIds) { + LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .likeIfPresent(OperateLogDO::getModule, reqVO.getModule()) + .inIfPresent(OperateLogDO::getUserId, userIds) + .eqIfPresent(OperateLogDO::getType, reqVO.getType()) + .betweenIfPresent(OperateLogDO::getStartTime, reqVO.getStartTime()); + if (Boolean.TRUE.equals(reqVO.getSuccess())) { + query.eq(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode()); + } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { + query.gt(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode()); + } + query.orderByDesc(OperateLogDO::getId); // 降序 + return selectList(query); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/mzdm/MzdmMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/mzdm/MzdmMapper.java new file mode 100644 index 0000000..9a37ccd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/mzdm/MzdmMapper.java @@ -0,0 +1,59 @@ +package com.jojubanking.boot.module.system.dal.mysql.mzdm; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.mzdm.MzdmDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.*; + +/** + * 民族代码 Mapper + * + * @author admin + */ +@Mapper +public interface MzdmMapper extends BaseMapperX { + + default PageResult selectPage(MzdmPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MzdmDO::getMzdm, reqVO.getMzdm()) + .likeIfPresent(MzdmDO::getName, reqVO.getName()) + .eqIfPresent(MzdmDO::getPy, reqVO.getPy()) + .eqIfPresent(MzdmDO::getWb, reqVO.getWb()) + .eqIfPresent(MzdmDO::getMemo, reqVO.getMemo()) + .eqIfPresent(MzdmDO::getGjbzbbh, reqVO.getGjbzbbh()) + .eqIfPresent(MzdmDO::getJlzt, reqVO.getJlzt()) + .betweenIfPresent(MzdmDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(MzdmDO::getId)); + } + + default List selectList(MzdmExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MzdmDO::getMzdm, reqVO.getMzdm()) + .likeIfPresent(MzdmDO::getName, reqVO.getName()) + .eqIfPresent(MzdmDO::getPy, reqVO.getPy()) + .eqIfPresent(MzdmDO::getWb, reqVO.getWb()) + .eqIfPresent(MzdmDO::getMemo, reqVO.getMemo()) + .eqIfPresent(MzdmDO::getGjbzbbh, reqVO.getGjbzbbh()) + .eqIfPresent(MzdmDO::getJlzt, reqVO.getJlzt()) + .betweenIfPresent(MzdmDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(MzdmDO::getId)); + } + + default List selectList01(MzdmExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MzdmDO::getMzdm, reqVO.getMzdm()) + .likeIfPresent(MzdmDO::getName, reqVO.getName()) + .eqIfPresent(MzdmDO::getPy, reqVO.getPy()) + .eqIfPresent(MzdmDO::getWb, reqVO.getWb()) + .eqIfPresent(MzdmDO::getMemo, reqVO.getMemo()) + .eqIfPresent(MzdmDO::getGjbzbbh, reqVO.getGjbzbbh()) + .eqIfPresent(MzdmDO::getJlzt, reqVO.getJlzt()) + .betweenIfPresent(MzdmDO::getCreateTime, reqVO.getCreateTime()) + .orderByAsc(MzdmDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/mzjf/MzjfMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/mzjf/MzjfMapper.java new file mode 100644 index 0000000..b5743f8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/mzjf/MzjfMapper.java @@ -0,0 +1,136 @@ +package com.jojubanking.boot.module.system.dal.mysql.mzjf; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.mzjf.MzjfDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.mzjf.vo.*; + +/** + * 门诊缴费 Mapper + * + * @author admin + */ +@Mapper +public interface MzjfMapper extends BaseMapperX { + + default PageResult selectPage(MzjfPageReqVO reqVO) throws ParseException { + DateFormat fmt =new SimpleDateFormat("yyyy-MM-dd"); + Date startDate = fmt.parse(reqVO.getStartDate()); + Date endDate = fmt.parse(reqVO.getEndDate()); + Date[] dateSection = new Date[2]; + dateSection[0] = startDate; + dateSection[1] = endDate; + + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MzjfDO::getUserId, reqVO.getUserId()) + .eqIfPresent(MzjfDO::getCardId, reqVO.getCardId()) + .eqIfPresent(MzjfDO::getPatientid, reqVO.getPatientid()) + .eqIfPresent(MzjfDO::getIdtype, reqVO.getIdtype()) + .eqIfPresent(MzjfDO::getLocktype, reqVO.getLocktype()) + .likeIfPresent(MzjfDO::getCreatitemname, reqVO.getCreatitemname()) + .betweenIfPresent(MzjfDO::getAppointmenttime, reqVO.getAppointmenttime()) + .betweenIfPresent(MzjfDO::getCreatdate, reqVO.getCreatdate()) + .eqIfPresent(MzjfDO::getQuerytype, reqVO.getQuerytype()) + .eqIfPresent(MzjfDO::getOrderno, reqVO.getOrderno()) + .eqIfPresent(MzjfDO::getFlowno, reqVO.getFlowno()) + .eqIfPresent(MzjfDO::getSetdepartcode, reqVO.getSetdepartcode()) + .likeIfPresent(MzjfDO::getSetdepartname, reqVO.getSetdepartname()) + .eqIfPresent(MzjfDO::getDodepartcode, reqVO.getDodepartcode()) + .likeIfPresent(MzjfDO::getDodepartname, reqVO.getDodepartname()) + .eqIfPresent(MzjfDO::getBilltype, reqVO.getBilltype()) + .likeIfPresent(MzjfDO::getBillname, reqVO.getBillname()) + .eqIfPresent(MzjfDO::getBilldes, reqVO.getBilldes()) + .betweenIfPresent(MzjfDO::getBilltime, reqVO.getBilltime()) + .eqIfPresent(MzjfDO::getBillmoney, reqVO.getBillmoney()) + .eqIfPresent(MzjfDO::getDoctorcode, reqVO.getDoctorcode()) + .likeIfPresent(MzjfDO::getDoctorname, reqVO.getDoctorname()) + .eqIfPresent(MzjfDO::getSincemoney, reqVO.getSincemoney()) + .eqIfPresent(MzjfDO::getFairmoney, reqVO.getFairmoney()) + .eqIfPresent(MzjfDO::getSerialno, reqVO.getSerialno()) + .eqIfPresent(MzjfDO::getAppointno, reqVO.getAppointno()) + .eqIfPresent(MzjfDO::getSerialflowno, reqVO.getSerialflowno()) + .eqIfPresent(MzjfDO::getJzlb, reqVO.getJzlb()) + .eqIfPresent(MzjfDO::getBzdm, reqVO.getBzdm()) + .betweenIfPresent(MzjfDO::getUpdatedate, reqVO.getUpdatedate()) + .eqIfPresent(MzjfDO::getBillsmsg, reqVO.getBillsmsg()) + .eqIfPresent(MzjfDO::getPaynature, reqVO.getPaynature()) + .eqIfPresent(MzjfDO::getPaytype, reqVO.getPaytype()) + .eqIfPresent(MzjfDO::getPowertranid, reqVO.getPowertranid()) + .eqIfPresent(MzjfDO::getPowertrancard, reqVO.getPowertrancard()) + .eqIfPresent(MzjfDO::getTerminalid, reqVO.getTerminalid()) + .eqIfPresent(MzjfDO::getReferno, reqVO.getReferno()) + .eqIfPresent(MzjfDO::getZfamount, reqVO.getZfamount()) + .eqIfPresent(MzjfDO::getYbzhamount, reqVO.getYbzhamount()) + .eqIfPresent(MzjfDO::getYbtcamount, reqVO.getYbtcamount()) + .eqIfPresent(MzjfDO::getYboutmsg, reqVO.getYboutmsg()) + .eqIfPresent(MzjfDO::getHisopernum, reqVO.getHisopernum()) + .eqIfPresent(MzjfDO::getIcbcorderid, reqVO.getIcbcorderid()) + .betweenIfPresent(MzjfDO::getIcbcpaytime, reqVO.getIcbcpaytime()) + .eqIfPresent(MzjfDO::getAppFlag, reqVO.getAppFlag()) + .eqIfPresent(MzjfDO::getAppStatus, reqVO.getAppStatus()) + .betweenIfPresent(MzjfDO::getCtime, dateSection) + .betweenIfPresent(MzjfDO::getUtime, reqVO.getUtime()) + .orderByDesc(MzjfDO::getId)); + } + + default List selectList(MzjfExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MzjfDO::getUserId, reqVO.getUserId()) + .eqIfPresent(MzjfDO::getCardId, reqVO.getCardId()) + .eqIfPresent(MzjfDO::getPatientid, reqVO.getPatientid()) + .eqIfPresent(MzjfDO::getIdtype, reqVO.getIdtype()) + .eqIfPresent(MzjfDO::getLocktype, reqVO.getLocktype()) + .likeIfPresent(MzjfDO::getCreatitemname, reqVO.getCreatitemname()) + .betweenIfPresent(MzjfDO::getAppointmenttime, reqVO.getAppointmenttime()) + .betweenIfPresent(MzjfDO::getCreatdate, reqVO.getCreatdate()) + .eqIfPresent(MzjfDO::getQuerytype, reqVO.getQuerytype()) + .eqIfPresent(MzjfDO::getOrderno, reqVO.getOrderno()) + .eqIfPresent(MzjfDO::getFlowno, reqVO.getFlowno()) + .eqIfPresent(MzjfDO::getSetdepartcode, reqVO.getSetdepartcode()) + .likeIfPresent(MzjfDO::getSetdepartname, reqVO.getSetdepartname()) + .eqIfPresent(MzjfDO::getDodepartcode, reqVO.getDodepartcode()) + .likeIfPresent(MzjfDO::getDodepartname, reqVO.getDodepartname()) + .eqIfPresent(MzjfDO::getBilltype, reqVO.getBilltype()) + .likeIfPresent(MzjfDO::getBillname, reqVO.getBillname()) + .eqIfPresent(MzjfDO::getBilldes, reqVO.getBilldes()) + .betweenIfPresent(MzjfDO::getBilltime, reqVO.getBilltime()) + .eqIfPresent(MzjfDO::getBillmoney, reqVO.getBillmoney()) + .eqIfPresent(MzjfDO::getDoctorcode, reqVO.getDoctorcode()) + .likeIfPresent(MzjfDO::getDoctorname, reqVO.getDoctorname()) + .eqIfPresent(MzjfDO::getSincemoney, reqVO.getSincemoney()) + .eqIfPresent(MzjfDO::getFairmoney, reqVO.getFairmoney()) + .eqIfPresent(MzjfDO::getSerialno, reqVO.getSerialno()) + .eqIfPresent(MzjfDO::getAppointno, reqVO.getAppointno()) + .eqIfPresent(MzjfDO::getSerialflowno, reqVO.getSerialflowno()) + .eqIfPresent(MzjfDO::getJzlb, reqVO.getJzlb()) + .eqIfPresent(MzjfDO::getBzdm, reqVO.getBzdm()) + .betweenIfPresent(MzjfDO::getUpdatedate, reqVO.getUpdatedate()) + .eqIfPresent(MzjfDO::getBillsmsg, reqVO.getBillsmsg()) + .eqIfPresent(MzjfDO::getPaynature, reqVO.getPaynature()) + .eqIfPresent(MzjfDO::getPaytype, reqVO.getPaytype()) + .eqIfPresent(MzjfDO::getPowertranid, reqVO.getPowertranid()) + .eqIfPresent(MzjfDO::getPowertrancard, reqVO.getPowertrancard()) + .eqIfPresent(MzjfDO::getTerminalid, reqVO.getTerminalid()) + .eqIfPresent(MzjfDO::getReferno, reqVO.getReferno()) + .eqIfPresent(MzjfDO::getZfamount, reqVO.getZfamount()) + .eqIfPresent(MzjfDO::getYbzhamount, reqVO.getYbzhamount()) + .eqIfPresent(MzjfDO::getYbtcamount, reqVO.getYbtcamount()) + .eqIfPresent(MzjfDO::getYboutmsg, reqVO.getYboutmsg()) + .eqIfPresent(MzjfDO::getHisopernum, reqVO.getHisopernum()) + .eqIfPresent(MzjfDO::getIcbcorderid, reqVO.getIcbcorderid()) + .betweenIfPresent(MzjfDO::getIcbcpaytime, reqVO.getIcbcpaytime()) + .eqIfPresent(MzjfDO::getAppFlag, reqVO.getAppFlag()) + .eqIfPresent(MzjfDO::getAppStatus, reqVO.getAppStatus()) + .betweenIfPresent(MzjfDO::getCtime, reqVO.getCtime()) + .betweenIfPresent(MzjfDO::getUtime, reqVO.getUtime()) + .orderByDesc(MzjfDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/notice/NoticeMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/notice/NoticeMapper.java new file mode 100644 index 0000000..a9fc7f7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/notice/NoticeMapper.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.system.dal.mysql.notice; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticePageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.notice.NoticeDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface NoticeMapper extends BaseMapperX { + + default PageResult selectPage(NoticePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(NoticeDO::getTitle, reqVO.getTitle()) + .eqIfPresent(NoticeDO::getStatus, reqVO.getStatus()) + .orderByDesc(NoticeDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java new file mode 100644 index 0000000..eaa5f54 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java @@ -0,0 +1,33 @@ +package com.jojubanking.boot.module.system.dal.mysql.oauth2; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface OAuth2AccessTokenMapper extends BaseMapperX { + + default OAuth2AccessTokenDO selectByAccessToken(String accessToken) { + return selectOne(OAuth2AccessTokenDO::getAccessToken, accessToken); + } + + default List selectListByRefreshToken(String refreshToken) { + return selectList(OAuth2AccessTokenDO::getRefreshToken, refreshToken); + } + + default PageResult selectPage(OAuth2AccessTokenPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(OAuth2AccessTokenDO::getUserId, reqVO.getUserId()) + .eqIfPresent(OAuth2AccessTokenDO::getUserType, reqVO.getUserType()) + .likeIfPresent(OAuth2AccessTokenDO::getClientId, reqVO.getClientId()) + .gt(OAuth2AccessTokenDO::getExpiresTime, new Date()) + .orderByDesc(OAuth2AccessTokenDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.java new file mode 100644 index 0000000..47b9804 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.system.dal.mysql.oauth2; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface OAuth2ApproveMapper extends BaseMapperX { + + default int update(OAuth2ApproveDO updateObj) { + return update(updateObj, new LambdaQueryWrapperX() + .eq(OAuth2ApproveDO::getUserId, updateObj.getUserId()) + .eq(OAuth2ApproveDO::getUserType, updateObj.getUserType()) + .eq(OAuth2ApproveDO::getClientId, updateObj.getClientId()) + .eq(OAuth2ApproveDO::getScope, updateObj.getScope())); + } + + default List selectListByUserIdAndUserTypeAndClientId(Long userId, Integer userType, String clientId) { + return selectList(new LambdaQueryWrapperX() + .eq(OAuth2ApproveDO::getUserId, userId) + .eq(OAuth2ApproveDO::getUserType, userType) + .eq(OAuth2ApproveDO::getClientId, clientId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2ClientMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2ClientMapper.java new file mode 100644 index 0000000..90c7d5d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2ClientMapper.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.dal.mysql.oauth2; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; + +/** + * OAuth2 客户端 Mapper + * + * @author TW + */ +@Mapper +public interface OAuth2ClientMapper extends BaseMapperX { + + default PageResult selectPage(OAuth2ClientPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(OAuth2ClientDO::getName, reqVO.getName()) + .eqIfPresent(OAuth2ClientDO::getStatus, reqVO.getStatus()) + .orderByDesc(OAuth2ClientDO::getId)); + } + + default OAuth2ClientDO selectByClientId(String clientId) { + return selectOne(OAuth2ClientDO::getClientId, clientId); + } + + @Select("SELECT COUNT(*) FROM system_oauth2_client WHERE update_time > #{maxUpdateTime}") + int selectCountByUpdateTimeGt(Date maxUpdateTime); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2CodeMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2CodeMapper.java new file mode 100644 index 0000000..2ae3977 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2CodeMapper.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.dal.mysql.oauth2; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2CodeDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OAuth2CodeMapper extends BaseMapperX { + + default OAuth2CodeDO selectByCode(String code) { + return selectOne(OAuth2CodeDO::getCode, code); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java new file mode 100644 index 0000000..f96aab4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java @@ -0,0 +1,20 @@ +package com.jojubanking.boot.module.system.dal.mysql.oauth2; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OAuth2RefreshTokenMapper extends BaseMapperX { + + default int deleteByRefreshToken(String refreshToken) { + return delete(new LambdaQueryWrapperX() + .eq(OAuth2RefreshTokenDO::getRefreshToken, refreshToken)); + } + + default OAuth2RefreshTokenDO selectByRefreshToken(String refreshToken) { + return selectOne(OAuth2RefreshTokenDO::getRefreshToken, refreshToken); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/order/OrderMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/order/OrderMapper.java new file mode 100644 index 0000000..71468fe --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/order/OrderMapper.java @@ -0,0 +1,115 @@ +package com.jojubanking.boot.module.system.dal.mysql.order; + +import java.util.*; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.controller.admin.order.vo.OrderSumRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.order.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 检查项目订单 Mapper + * + * @author admin + */ +@Mapper +public interface OrderMapper extends BaseMapperX { + + default PageResult selectPage(OrderPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(OrderDO::getBatchno, reqVO.getBatchno()) + .eqIfPresent(OrderDO::getPatid, reqVO.getPatid()) + .eqIfPresent(OrderDO::getOrderno, reqVO.getOrderno()) + .eqIfPresent(OrderDO::getPackageflag, reqVO.getPackageflag()) + .eqIfPresent(OrderDO::getPackageno, reqVO.getPackageno()) + .eqIfPresent(OrderDO::getItemflag, reqVO.getItemflag()) + .eqIfPresent(OrderDO::getItemno, reqVO.getItemno()) + .eqIfPresent(OrderDO::getPaystatus, reqVO.getPaystatus()) + .likeIfPresent(OrderDO::getName, reqVO.getName()) + .likeIfPresent(OrderDO::getNationid, reqVO.getNationid()) + .likeIfPresent(OrderDO::getSchoolName, reqVO.getSchoolName()) + .likeIfPresent(OrderDO::getClassName, reqVO.getClassName()) + .likeIfPresent(OrderDO::getItemname, reqVO.getItemname()) + .likeIfPresent(OrderDO::getZxksname, reqVO.getZxksname()) + .likeIfPresent(OrderDO::getKdksname, reqVO.getKdksname()) + .eqIfPresent(OrderDO::getItemprice, reqVO.getItemprice()) + .betweenIfPresent(OrderDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(OrderDO::getId)); + } + + default List selectList(OrderExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(OrderDO::getBatchno, reqVO.getBatchno()) + .eqIfPresent(OrderDO::getPatid, reqVO.getPatid()) + .eqIfPresent(OrderDO::getOrderno, reqVO.getOrderno()) + .eqIfPresent(OrderDO::getPackageflag, reqVO.getPackageflag()) + .eqIfPresent(OrderDO::getPackageno, reqVO.getPackageno()) + .eqIfPresent(OrderDO::getItemflag, reqVO.getItemflag()) + .eqIfPresent(OrderDO::getItemno, reqVO.getItemno()) + .eqIfPresent(OrderDO::getPaystatus, reqVO.getPaystatus()) + .likeIfPresent(OrderDO::getSchoolName, reqVO.getSchoolName()) + .likeIfPresent(OrderDO::getClassName, reqVO.getClassName()) + .likeIfPresent(OrderDO::getItemname, reqVO.getItemname()) + .likeIfPresent(OrderDO::getZxksname, reqVO.getZxksname()) + .likeIfPresent(OrderDO::getKdksname, reqVO.getKdksname()) + .eqIfPresent(OrderDO::getItemprice, reqVO.getItemprice()) + .betweenIfPresent(OrderDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(OrderDO::getId)); + } + + + default void updateOrderByPay(OrderDO tjOrderDO){ + if(tjOrderDO.getPackageno().equals("0")){ + //属于可选项目 + update(tjOrderDO, Wrappers.lambdaUpdate(OrderDO.class) + .eq(OrderDO::getPackageno, tjOrderDO.getPackageno()) + .eq(OrderDO::getPatid, tjOrderDO.getPatid()) + .eq(OrderDO::getItemname, tjOrderDO.getItemname()) + .eq(OrderDO::getBatchno, tjOrderDO.getBatchno())); + } + else{ + //属于必选包,直接按包编号更新 + update(tjOrderDO, Wrappers.lambdaUpdate(OrderDO.class) + .eq(OrderDO::getPackageno, tjOrderDO.getPackageno()) + .eq(OrderDO::getPatid, tjOrderDO.getPatid()) + .eq(OrderDO::getBatchno, tjOrderDO.getBatchno())); + } + } + + default void updateOrderByNotify(OrderDO tjOrderDO){ + update(tjOrderDO, Wrappers.lambdaUpdate(OrderDO.class) + .eq(OrderDO::getOrderno, tjOrderDO.getOrderno())); + } + + @Select("update xytj_order set deleted = true WHERE DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) < '24:00:00' and (paystatus != '1' or paystatus IS NULL)") + void updateOrderAfter24(); + + @Select("select * from xytj_order WHERE DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) < '24:00:00' and (paystatus = '0') group by orderno") + List selectOrderAfter24(); + + @Select("") + List getSumList(@Param("batchno") String batchno, @Param("schoolName") String schoolName, @Param("className") String className, + @Param("itemname") String itemname, @Param("sex") Integer sex, + @Param("dateRangeStart") String dateRangeStart, @Param("dateRangeEnd") String dateRangeEnd); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/orderSum/OrderSumMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/orderSum/OrderSumMapper.java new file mode 100644 index 0000000..9fd22be --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/orderSum/OrderSumMapper.java @@ -0,0 +1,58 @@ +package com.jojubanking.boot.module.system.dal.mysql.orderSum; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.controller.admin.order.vo.OrderSumRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface OrderSumMapper extends BaseMapperX { + + + @Select("") + List getSumList(String batchno, String schoolName, String className, + String itemname, Integer sex, String dateRangeStart, String dateRangeEnd); + + +// @Select("select *, COALESCE(count(*), 0) as tlsum " + +// "from users_use_count " + +// " WHERE create_time BETWEEN #{startDate} AND #{endDate} " + +// "GROUP BY interface_identification") +// List selectCountToSection(@Param("startDate") Date startDate, @Param("endDate") Date endDate); + +// @Select("") +// List getList(long offset, long limit, +// String ph, String scxh, String bb, String djp, Integer xcpd02dxbzdhStatus, Integer bzjlhStatus, String dateRangeStart, String dateRangeEnd); + + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/orderview/OrderViewMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/orderview/OrderViewMapper.java new file mode 100644 index 0000000..892f1dc --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/orderview/OrderViewMapper.java @@ -0,0 +1,62 @@ +package com.jojubanking.boot.module.system.dal.mysql.orderview; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.orderview.OrderViewDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.orderview.vo.*; + +/** + * VIEW Mapper + * + * @author admin + */ +@Mapper +public interface OrderViewMapper extends BaseMapperX { + + default PageResult selectPage(OrderViewPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(OrderViewDO::getBatchno, reqVO.getBatchno()) + .eqIfPresent(OrderViewDO::getPatid, reqVO.getPatid()) + .likeIfPresent(OrderViewDO::getName, reqVO.getName()) + .eqIfPresent(OrderViewDO::getNationid, reqVO.getNationid()) + .eqIfPresent(OrderViewDO::getOrderno, reqVO.getOrderno()) + .eqIfPresent(OrderViewDO::getSjh, reqVO.getSjh()) + .eqIfPresent(OrderViewDO::getPackageflag, reqVO.getPackageflag()) + .eqIfPresent(OrderViewDO::getPackageno, reqVO.getPackageno()) + .eqIfPresent(OrderViewDO::getItemflag, reqVO.getItemflag()) + .eqIfPresent(OrderViewDO::getItemno, reqVO.getItemno()) + .likeIfPresent(OrderViewDO::getItemname, reqVO.getItemname()) + .eqIfPresent(OrderViewDO::getItemprice, reqVO.getItemprice()) + .eqIfPresent(OrderViewDO::getPaystatus, reqVO.getPaystatus()) + .betweenIfPresent(OrderViewDO::getCreateTime, reqVO.getCreateTime()) + .likeIfPresent(OrderViewDO::getSchoolName, reqVO.getSchoolName()) + .likeIfPresent(OrderViewDO::getClassName, reqVO.getClassName()) + .orderByDesc(OrderViewDO::getId)); + } + + default List selectList(OrderViewExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(OrderViewDO::getBatchno, reqVO.getBatchno()) + .eqIfPresent(OrderViewDO::getPatid, reqVO.getPatid()) + .likeIfPresent(OrderViewDO::getName, reqVO.getName()) + .eqIfPresent(OrderViewDO::getNationid, reqVO.getNationid()) + .eqIfPresent(OrderViewDO::getOrderno, reqVO.getOrderno()) + .eqIfPresent(OrderViewDO::getSjh, reqVO.getSjh()) + .eqIfPresent(OrderViewDO::getPackageflag, reqVO.getPackageflag()) + .eqIfPresent(OrderViewDO::getPackageno, reqVO.getPackageno()) + .eqIfPresent(OrderViewDO::getItemflag, reqVO.getItemflag()) + .eqIfPresent(OrderViewDO::getItemno, reqVO.getItemno()) + .likeIfPresent(OrderViewDO::getItemname, reqVO.getItemname()) + .eqIfPresent(OrderViewDO::getItemprice, reqVO.getItemprice()) + .eqIfPresent(OrderViewDO::getPaystatus, reqVO.getPaystatus()) + .betweenIfPresent(OrderViewDO::getCreateTime, reqVO.getCreateTime()) + .likeIfPresent(OrderViewDO::getSchoolName, reqVO.getSchoolName()) + .likeIfPresent(OrderViewDO::getClassName, reqVO.getClassName()) + .orderByDesc(OrderViewDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/package-info.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/package-info.java new file mode 100644 index 0000000..8eb7714 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/package-info.java @@ -0,0 +1,9 @@ +/** + * DAL = Data Access Layer 数据访问层 + * 1. data object:数据对象 + * 2. redis:Redis 的 CRUD 操作 + * 3. mysql:MySQL 的 CRUD 操作 + * + * 其中,MySQL 的表以 system_ 作为前缀 + */ +package com.jojubanking.boot.module.system.dal.mysql; diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/MenuMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/MenuMapper.java new file mode 100644 index 0000000..70ebcc9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/MenuMapper.java @@ -0,0 +1,34 @@ +package com.jojubanking.boot.module.system.dal.mysql.permission; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface MenuMapper extends BaseMapperX { + + default MenuDO selectByParentIdAndName(Long parentId, String name) { + return selectOne(new LambdaQueryWrapper().eq(MenuDO::getParentId, parentId) + .eq(MenuDO::getName, name)); + } + + default Long selectCountByParentId(Long parentId) { + return selectCount(MenuDO::getParentId, parentId); + } + + default List selectList(MenuListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX().likeIfPresent(MenuDO::getName, reqVO.getName()) + .eqIfPresent(MenuDO::getStatus, reqVO.getStatus())); + } + + @Select("SELECT COUNT(*) FROM system_menu WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMapper.java new file mode 100644 index 0000000..0fb200a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMapper.java @@ -0,0 +1,53 @@ +package com.jojubanking.boot.module.system.dal.mysql.permission; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.dataobject.BaseDO; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RolePageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import org.springframework.lang.Nullable; + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +@Mapper +public interface RoleMapper extends BaseMapperX { + + default PageResult selectPage(RolePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(RoleDO::getName, reqVO.getName()) + .likeIfPresent(RoleDO::getCode, reqVO.getCode()) + .eqIfPresent(RoleDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(BaseDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(RoleDO::getId)); + } + + default List selectList(RoleExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(RoleDO::getName, reqVO.getName()) + .likeIfPresent(RoleDO::getCode, reqVO.getCode()) + .eqIfPresent(RoleDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(BaseDO::getCreateTime, reqVO.getCreateTime())); + } + + default RoleDO selectByName(String name) { + return selectOne(RoleDO::getName, name); + } + + default RoleDO selectByCode(String code) { + return selectOne(RoleDO::getCode, code); + } + + default List selectListByStatus(@Nullable Collection statuses) { + return selectList(RoleDO::getStatus, statuses); + } + + @Select("SELECT COUNT(*) FROM system_role WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuBatchInsertMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuBatchInsertMapper.java new file mode 100644 index 0000000..87385ca --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuBatchInsertMapper.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.dal.mysql.permission; + +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleMenuDO; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Repository; + +/** + * 实体 {@link RoleMenuDO} 的批量插入 Mapper + * + * @author TW + */ +@Repository +public class RoleMenuBatchInsertMapper extends ServiceImpl { +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuMapper.java new file mode 100644 index 0000000..ce448ea --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuMapper.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.dal.mysql.permission; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleMenuDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import org.springframework.stereotype.Repository; + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +@Mapper +public interface RoleMenuMapper extends BaseMapperX { + + @Repository + class BatchInsertMapper extends ServiceImpl { + } + + default List selectListByRoleId(Long roleId) { + return selectList(new QueryWrapper().eq("role_id", roleId)); + } + + default void deleteListByRoleIdAndMenuIds(Long roleId, Collection menuIds) { + delete(new QueryWrapper().eq("role_id", roleId) + .in("menu_id", menuIds)); + } + + default void deleteListByMenuId(Long menuId) { + delete(new QueryWrapper().eq("menu_id", menuId)); + } + + default void deleteListByRoleId(Long roleId) { + delete(new QueryWrapper().eq("role_id", roleId)); + } + + @Select("SELECT COUNT(*) FROM system_role_menu WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/UserRoleBatchInsertMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/UserRoleBatchInsertMapper.java new file mode 100644 index 0000000..3e68e49 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/UserRoleBatchInsertMapper.java @@ -0,0 +1,14 @@ +package com.jojubanking.boot.module.system.dal.mysql.permission; + +import com.jojubanking.boot.module.system.dal.dataobject.permission.UserRoleDO; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Repository; + +/** + * 实体 {@link UserRoleDO} 的批量插入 Mapper + * + * @author TW + */ +@Repository +public class UserRoleBatchInsertMapper extends ServiceImpl { +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/UserRoleMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/UserRoleMapper.java new file mode 100644 index 0000000..1c6b7f5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/permission/UserRoleMapper.java @@ -0,0 +1,45 @@ +package com.jojubanking.boot.module.system.dal.mysql.permission; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.permission.UserRoleDO; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Collection; +import java.util.Date; +import java.util.List; + +@Mapper +public interface UserRoleMapper extends BaseMapperX { + + default List selectListByUserId(Long userId) { + return selectList(new QueryWrapper().eq("user_id", userId)); + } + + default List selectListByRoleId(Long roleId) { + return selectList(new QueryWrapper().eq("role_id", roleId)); + } + + default void deleteListByUserIdAndRoleIdIds(Long userId, Collection roleIds) { + delete(new QueryWrapper().eq("user_id", userId) + .in("role_id", roleIds)); + } + + default void deleteListByUserId(Long userId) { + delete(new QueryWrapper().eq("user_id", userId)); + } + + default void deleteListByRoleId(Long roleId) { + delete(new QueryWrapper().eq("role_id", roleId)); + } + + + default List selectListByRoleIds(Collection roleIds) { + return selectList(UserRoleDO::getRoleId, roleIds); + } + + @Select("SELECT COUNT(*) FROM system_user_role WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/refundapply/RefundApplyMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/refundapply/RefundApplyMapper.java new file mode 100644 index 0000000..f7aeafa --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/refundapply/RefundApplyMapper.java @@ -0,0 +1,58 @@ +package com.jojubanking.boot.module.system.dal.mysql.refundapply; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.refundapply.RefundApplyDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.refundapply.vo.*; + +/** + * 就诊卡退费申请 Mapper + * + * @author admin + */ +@Mapper +public interface RefundApplyMapper extends BaseMapperX { + + default PageResult selectPage(RefundApplyPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(RefundApplyDO::getRefname, reqVO.getRefname()) + .eqIfPresent(RefundApplyDO::getRefidcard, reqVO.getRefidcard()) + .eqIfPresent(RefundApplyDO::getRefbankcard, reqVO.getRefbankcard()) + .eqIfPresent(RefundApplyDO::getRefbanktype, reqVO.getRefbanktype()) + .eqIfPresent(RefundApplyDO::getReftel, reqVO.getReftel()) + .eqIfPresent(RefundApplyDO::getZidcard, reqVO.getZidcard()) + .eqIfPresent(RefundApplyDO::getZidcardimg, reqVO.getZidcardimg()) + .eqIfPresent(RefundApplyDO::getFidcard, reqVO.getFidcard()) + .eqIfPresent(RefundApplyDO::getFidcardimg, reqVO.getFidcardimg()) + .eqIfPresent(RefundApplyDO::getZbankcard, reqVO.getZbankcard()) + .eqIfPresent(RefundApplyDO::getZbankcardimg, reqVO.getZbankcardimg()) + .eqIfPresent(RefundApplyDO::getChildidcard, reqVO.getChildidcard()) + .eqIfPresent(RefundApplyDO::getChildidcardimg, reqVO.getChildidcardimg()) + .betweenIfPresent(RefundApplyDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(RefundApplyDO::getId)); + } + + default List selectList(RefundApplyExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(RefundApplyDO::getRefname, reqVO.getRefname()) + .eqIfPresent(RefundApplyDO::getRefidcard, reqVO.getRefidcard()) + .eqIfPresent(RefundApplyDO::getRefbankcard, reqVO.getRefbankcard()) + .eqIfPresent(RefundApplyDO::getRefbanktype, reqVO.getRefbanktype()) + .eqIfPresent(RefundApplyDO::getReftel, reqVO.getReftel()) + .eqIfPresent(RefundApplyDO::getZidcard, reqVO.getZidcard()) + .eqIfPresent(RefundApplyDO::getZidcardimg, reqVO.getZidcardimg()) + .eqIfPresent(RefundApplyDO::getFidcard, reqVO.getFidcard()) + .eqIfPresent(RefundApplyDO::getFidcardimg, reqVO.getFidcardimg()) + .eqIfPresent(RefundApplyDO::getZbankcard, reqVO.getZbankcard()) + .eqIfPresent(RefundApplyDO::getZbankcardimg, reqVO.getZbankcardimg()) + .eqIfPresent(RefundApplyDO::getChildidcard, reqVO.getChildidcard()) + .eqIfPresent(RefundApplyDO::getChildidcardimg, reqVO.getChildidcardimg()) + .betweenIfPresent(RefundApplyDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(RefundApplyDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/reserve8/Reserve8Mapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/reserve8/Reserve8Mapper.java new file mode 100644 index 0000000..81b8cf5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/reserve8/Reserve8Mapper.java @@ -0,0 +1,122 @@ +package com.jojubanking.boot.module.system.dal.mysql.reserve8; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.reserve8.Reserve8DO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.reserve8.vo.*; + +/** + * 预约挂号 Mapper + * + * @author admin + */ +@Mapper +public interface Reserve8Mapper extends BaseMapperX { + + default PageResult selectPage(Reserve8PageReqVO reqVO) throws ParseException { + DateFormat fmt =new SimpleDateFormat("yyyy-MM-dd"); + Date startDate = fmt.parse(reqVO.getStartDate()); + Date endDate = fmt.parse(reqVO.getEndDate()); + Date[] dateSection = new Date[2]; + dateSection[0] = startDate; + dateSection[1] = endDate; + + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(Reserve8DO::getUserId, reqVO.getUserId()) + .eqIfPresent(Reserve8DO::getCardId, reqVO.getCardId()) + .likeIfPresent(Reserve8DO::getName, reqVO.getName()) + .eqIfPresent(Reserve8DO::getKsmc, reqVO.getKsmc()) + .eqIfPresent(Reserve8DO::getYsmc, reqVO.getYsmc()) + .eqIfPresent(Reserve8DO::getSubHospitalID, reqVO.getSubHospitalID()) + .eqIfPresent(Reserve8DO::getReptNum, reqVO.getReptNum()) + .eqIfPresent(Reserve8DO::getLockType, reqVO.getLockType()) + .eqIfPresent(Reserve8DO::getHisOrderNO, reqVO.getHisOrderNO()) + .eqIfPresent(Reserve8DO::getScheduleId, reqVO.getScheduleId()) + .eqIfPresent(Reserve8DO::getDoctorCode, reqVO.getDoctorCode()) + .eqIfPresent(Reserve8DO::getDepartCode, reqVO.getDepartCode()) + .eqIfPresent(Reserve8DO::getParTimeId, reqVO.getParTimeId()) + .betweenIfPresent(Reserve8DO::getLockTime, reqVO.getLockTime()) + .eqIfPresent(Reserve8DO::getPatientId, reqVO.getPatientId()) + .eqIfPresent(Reserve8DO::getMobile, reqVO.getMobile()) + .eqIfPresent(Reserve8DO::getSerialNo, reqVO.getSerialNo()) + .eqIfPresent(Reserve8DO::getLocation, reqVO.getLocation()) + .eqIfPresent(Reserve8DO::getTicketNo, reqVO.getTicketNo()) + .eqIfPresent(Reserve8DO::getOrderNo, reqVO.getOrderNo()) + .eqIfPresent(Reserve8DO::getTimeInterval, reqVO.getTimeInterval()) + .betweenIfPresent(Reserve8DO::getRegisterdate, reqVO.getRegisterdate()) + .eqIfPresent(Reserve8DO::getClinicFee, reqVO.getClinicFee()) + .eqIfPresent(Reserve8DO::getRegistrationFee, reqVO.getRegistrationFee()) + .eqIfPresent(Reserve8DO::getPayNature, reqVO.getPayNature()) + .eqIfPresent(Reserve8DO::getPayType, reqVO.getPayType()) + .eqIfPresent(Reserve8DO::getPowerTranID, reqVO.getPowerTranID()) + .eqIfPresent(Reserve8DO::getPowerTranCARD, reqVO.getPowerTranCARD()) + .eqIfPresent(Reserve8DO::getTerminalId, reqVO.getTerminalId()) + .eqIfPresent(Reserve8DO::getZFAmount, reqVO.getZFAmount()) + .eqIfPresent(Reserve8DO::getYBZHAmount, reqVO.getYBZHAmount()) + .eqIfPresent(Reserve8DO::getYBTCAmount, reqVO.getYBTCAmount()) + .eqIfPresent(Reserve8DO::getYBOutMsg, reqVO.getYBOutMsg()) + .eqIfPresent(Reserve8DO::getHisOperNum, reqVO.getHisOperNum()) + .eqIfPresent(Reserve8DO::getReferNo, reqVO.getReferNo()) + .eqIfPresent(Reserve8DO::getToken, reqVO.getToken()) + .eqIfPresent(Reserve8DO::getAppFlag, reqVO.getAppFlag()) + .eqIfPresent(Reserve8DO::getAppStatus, reqVO.getAppStatus()) + .eqIfPresent(Reserve8DO::getAppType, reqVO.getAppType()) + .betweenIfPresent(Reserve8DO::getCtime, dateSection) + .betweenIfPresent(Reserve8DO::getUtime, reqVO.getUtime()) + .orderByDesc(Reserve8DO::getId)); + } + + default List selectList(Reserve8ExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(Reserve8DO::getUserId, reqVO.getUserId()) + .eqIfPresent(Reserve8DO::getCardId, reqVO.getCardId()) + .likeIfPresent(Reserve8DO::getName, reqVO.getName()) + .eqIfPresent(Reserve8DO::getKsmc, reqVO.getKsmc()) + .eqIfPresent(Reserve8DO::getYsmc, reqVO.getYsmc()) + .eqIfPresent(Reserve8DO::getSubHospitalID, reqVO.getSubHospitalID()) + .eqIfPresent(Reserve8DO::getReptNum, reqVO.getReptNum()) + .eqIfPresent(Reserve8DO::getLockType, reqVO.getLockType()) + .eqIfPresent(Reserve8DO::getHisOrderNO, reqVO.getHisOrderNO()) + .eqIfPresent(Reserve8DO::getScheduleId, reqVO.getScheduleId()) + .eqIfPresent(Reserve8DO::getDoctorCode, reqVO.getDoctorCode()) + .eqIfPresent(Reserve8DO::getDepartCode, reqVO.getDepartCode()) + .eqIfPresent(Reserve8DO::getParTimeId, reqVO.getParTimeId()) + .betweenIfPresent(Reserve8DO::getLockTime, reqVO.getLockTime()) + .eqIfPresent(Reserve8DO::getPatientId, reqVO.getPatientId()) + .eqIfPresent(Reserve8DO::getMobile, reqVO.getMobile()) + .eqIfPresent(Reserve8DO::getSerialNo, reqVO.getSerialNo()) + .eqIfPresent(Reserve8DO::getLocation, reqVO.getLocation()) + .eqIfPresent(Reserve8DO::getTicketNo, reqVO.getTicketNo()) + .eqIfPresent(Reserve8DO::getOrderNo, reqVO.getOrderNo()) + .eqIfPresent(Reserve8DO::getTimeInterval, reqVO.getTimeInterval()) + .betweenIfPresent(Reserve8DO::getRegisterdate, reqVO.getRegisterdate()) + .eqIfPresent(Reserve8DO::getClinicFee, reqVO.getClinicFee()) + .eqIfPresent(Reserve8DO::getRegistrationFee, reqVO.getRegistrationFee()) + .eqIfPresent(Reserve8DO::getPayNature, reqVO.getPayNature()) + .eqIfPresent(Reserve8DO::getPayType, reqVO.getPayType()) + .eqIfPresent(Reserve8DO::getPowerTranID, reqVO.getPowerTranID()) + .eqIfPresent(Reserve8DO::getPowerTranCARD, reqVO.getPowerTranCARD()) + .eqIfPresent(Reserve8DO::getTerminalId, reqVO.getTerminalId()) + .eqIfPresent(Reserve8DO::getZFAmount, reqVO.getZFAmount()) + .eqIfPresent(Reserve8DO::getYBZHAmount, reqVO.getYBZHAmount()) + .eqIfPresent(Reserve8DO::getYBTCAmount, reqVO.getYBTCAmount()) + .eqIfPresent(Reserve8DO::getYBOutMsg, reqVO.getYBOutMsg()) + .eqIfPresent(Reserve8DO::getHisOperNum, reqVO.getHisOperNum()) + .eqIfPresent(Reserve8DO::getReferNo, reqVO.getReferNo()) + .eqIfPresent(Reserve8DO::getToken, reqVO.getToken()) + .eqIfPresent(Reserve8DO::getAppFlag, reqVO.getAppFlag()) + .eqIfPresent(Reserve8DO::getAppStatus, reqVO.getAppStatus()) + .eqIfPresent(Reserve8DO::getAppType, reqVO.getAppType()) + .betweenIfPresent(Reserve8DO::getCtime, reqVO.getCtime()) + .betweenIfPresent(Reserve8DO::getUtime, reqVO.getUtime()) + .orderByDesc(Reserve8DO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sensitiveword/SensitiveWordMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sensitiveword/SensitiveWordMapper.java new file mode 100644 index 0000000..b1fb334 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sensitiveword/SensitiveWordMapper.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.module.system.dal.mysql.sensitiveword; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; +import java.util.List; + +/** + * 敏感词 Mapper + * + * @author 永不言败 + */ +@Mapper +public interface SensitiveWordMapper extends BaseMapperX { + + default PageResult selectPage(SensitiveWordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(SensitiveWordDO::getName, reqVO.getName()) + .likeIfPresent(SensitiveWordDO::getTags, reqVO.getTag()) + .eqIfPresent(SensitiveWordDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(SensitiveWordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SensitiveWordDO::getId)); + } + + default List selectList(SensitiveWordExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(SensitiveWordDO::getName, reqVO.getName()) + .likeIfPresent(SensitiveWordDO::getTags, reqVO.getTag()) + .eqIfPresent(SensitiveWordDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(SensitiveWordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SensitiveWordDO::getId)); + } + + default SensitiveWordDO selectByName(String name) { + return selectOne(SensitiveWordDO::getName, name); + } + + @Select("SELECT COUNT(*) FROM system_sensitive_word WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sms/SmsChannelMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sms/SmsChannelMapper.java new file mode 100644 index 0000000..ab41cf0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sms/SmsChannelMapper.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.dal.mysql.sms; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsChannelDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; + +@Mapper +public interface SmsChannelMapper extends BaseMapperX { + + default PageResult selectPage(SmsChannelPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(SmsChannelDO::getSignature, reqVO.getSignature()) + .eqIfPresent(SmsChannelDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(SmsChannelDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SmsChannelDO::getId)); + } + + @Select("SELECT COUNT(*) FROM system_sms_channel WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sms/SmsCodeMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sms/SmsCodeMapper.java new file mode 100644 index 0000000..1ebce88 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sms/SmsCodeMapper.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.system.dal.mysql.sms; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.QueryWrapperX; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsCodeDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SmsCodeMapper extends BaseMapperX { + + /** + * 获得手机号的最后一个手机验证码 + * + * @param mobile 手机号 + * @param scene 发送场景,选填 + * @param code 验证码 选填 + * @return 手机验证码 + */ + default SmsCodeDO selectLastByMobile(String mobile, String code, Integer scene) { + return selectOne(new QueryWrapperX() + .eq("mobile", mobile) + .eqIfPresent("scene", scene) + .eqIfPresent("code", code) + .orderByDesc("id") + .limit1()); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sms/SmsLogMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sms/SmsLogMapper.java new file mode 100644 index 0000000..4f8fba5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sms/SmsLogMapper.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.dal.mysql.sms; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsLogDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SmsLogMapper extends BaseMapperX { + + default PageResult selectPage(SmsLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SmsLogDO::getChannelId, reqVO.getChannelId()) + .eqIfPresent(SmsLogDO::getTemplateId, reqVO.getTemplateId()) + .likeIfPresent(SmsLogDO::getMobile, reqVO.getMobile()) + .eqIfPresent(SmsLogDO::getSendStatus, reqVO.getSendStatus()) + .betweenIfPresent(SmsLogDO::getSendTime, reqVO.getSendTime()) + .eqIfPresent(SmsLogDO::getSendStatus, reqVO.getReceiveStatus()) + .betweenIfPresent(SmsLogDO::getReceiveTime, reqVO.getReceiveTime()) + .orderByDesc(SmsLogDO::getId)); + } + + default List selectList(SmsLogExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(SmsLogDO::getChannelId, reqVO.getChannelId()) + .eqIfPresent(SmsLogDO::getTemplateId, reqVO.getTemplateId()) + .likeIfPresent(SmsLogDO::getMobile, reqVO.getMobile()) + .eqIfPresent(SmsLogDO::getSendStatus, reqVO.getSendStatus()) + .betweenIfPresent(SmsLogDO::getSendTime, reqVO.getSendTime()) + .eqIfPresent(SmsLogDO::getSendStatus, reqVO.getReceiveStatus()) + .betweenIfPresent(SmsLogDO::getReceiveTime, reqVO.getReceiveTime()) + .orderByDesc(SmsLogDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sms/SmsTemplateMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sms/SmsTemplateMapper.java new file mode 100644 index 0000000..cea7360 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/sms/SmsTemplateMapper.java @@ -0,0 +1,53 @@ +package com.jojubanking.boot.module.system.dal.mysql.sms; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsTemplateDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface SmsTemplateMapper extends BaseMapperX { + + @Select("SELECT COUNT(*) FROM system_sms_template WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + + default SmsTemplateDO selectByCode(String code) { + return selectOne(SmsTemplateDO::getCode, code); + } + + default PageResult selectPage(SmsTemplatePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SmsTemplateDO::getType, reqVO.getType()) + .eqIfPresent(SmsTemplateDO::getStatus, reqVO.getStatus()) + .likeIfPresent(SmsTemplateDO::getCode, reqVO.getCode()) + .likeIfPresent(SmsTemplateDO::getContent, reqVO.getContent()) + .likeIfPresent(SmsTemplateDO::getApiTemplateId, reqVO.getApiTemplateId()) + .eqIfPresent(SmsTemplateDO::getChannelId, reqVO.getChannelId()) + .betweenIfPresent(SmsTemplateDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SmsTemplateDO::getId)); + } + + default List selectList(SmsTemplateExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(SmsTemplateDO::getType, reqVO.getType()) + .eqIfPresent(SmsTemplateDO::getStatus, reqVO.getStatus()) + .likeIfPresent(SmsTemplateDO::getCode, reqVO.getCode()) + .likeIfPresent(SmsTemplateDO::getContent, reqVO.getContent()) + .likeIfPresent(SmsTemplateDO::getApiTemplateId, reqVO.getApiTemplateId()) + .eqIfPresent(SmsTemplateDO::getChannelId, reqVO.getChannelId()) + .betweenIfPresent(SmsTemplateDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SmsTemplateDO::getId)); + } + + default Long selectCountByChannelId(Long channelId) { + return selectCount(SmsTemplateDO::getChannelId, channelId); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/social/SocialUserBindMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/social/SocialUserBindMapper.java new file mode 100644 index 0000000..e96de0e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/social/SocialUserBindMapper.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.system.dal.mysql.social; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.dal.dataobject.social.SocialUserBindDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface SocialUserBindMapper extends BaseMapperX { + + default void deleteByUserTypeAndUserIdAndSocialType(Integer userType, Long userId, Integer socialType) { + delete(new LambdaQueryWrapperX() + .eq(SocialUserBindDO::getUserType, userType) + .eq(SocialUserBindDO::getUserId, userId) + .eq(SocialUserBindDO::getSocialType, socialType)); + } + + default void deleteByUserTypeAndSocialUserId(Integer userType, Long socialUserId) { + delete(new LambdaQueryWrapperX() + .eq(SocialUserBindDO::getUserType, userType) + .eq(SocialUserBindDO::getSocialUserId, socialUserId)); + } + + default SocialUserBindDO selectByUserTypeAndSocialUserId(Integer userType, Long socialUserId) { + return selectOne(new LambdaQueryWrapperX() + .eq(SocialUserBindDO::getUserType, userType) + .eq(SocialUserBindDO::getSocialUserId, socialUserId)); + } + + default List selectListByUserIdAndUserType(Long userId, Integer userType) { + return selectList(new LambdaQueryWrapperX() + .eq(SocialUserBindDO::getUserId, userId) + .eq(SocialUserBindDO::getUserType, userType)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/social/SocialUserMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/social/SocialUserMapper.java new file mode 100644 index 0000000..28613d3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/social/SocialUserMapper.java @@ -0,0 +1,25 @@ +package com.jojubanking.boot.module.system.dal.mysql.social; + +import com.jojubanking.boot.module.system.dal.dataobject.social.SocialUserDO; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SocialUserMapper extends BaseMapperX { + + default SocialUserDO selectByTypeAndCodeAnState(Integer type, String code, String state) { + return selectOne(new LambdaQueryWrapper() + .eq(SocialUserDO::getType, type) + .eq(SocialUserDO::getCode, code) + .eq(SocialUserDO::getState, state)); + } + + default SocialUserDO selectByTypeAndOpenid(Integer type, String openid) { + return selectOne(new LambdaQueryWrapper() + .eq(SocialUserDO::getType, type) + .eq(SocialUserDO::getOpenid, openid)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/student/StudentMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/student/StudentMapper.java new file mode 100644 index 0000000..17ca981 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/student/StudentMapper.java @@ -0,0 +1,163 @@ +package com.jojubanking.boot.module.system.dal.mysql.student; + +import java.util.*; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.studentJfListVO; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import com.jojubanking.boot.module.system.dal.dataobject.student.StudentDO; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.student.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 学生信息 Mapper + * + * @author admin + */ +@Mapper +public interface StudentMapper extends BaseMapperX { + + default PageResult selectPage(StudentPageReqVO reqVO, XyrwDO xyrwDO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(StudentDO::getOpenid, reqVO.getOpenid()) + .eqIfPresent(StudentDO::getPatid, reqVO.getPatid()) + .eqIfPresent(StudentDO::getName, reqVO.getName()) + .eqIfPresent(StudentDO::getSex, reqVO.getSex()) + .eqIfPresent(StudentDO::getAge, reqVO.getAge()) + .eqIfPresent(StudentDO::getNationId, reqVO.getNationId()) + .eqIfPresent(StudentDO::getDeptId, reqVO.getDeptId()) + .eqIfPresent(StudentDO::getFeeflag, reqVO.getFeeflag()) + .eqIfPresent(StudentDO::getClassName, reqVO.getClassName()) + .eqIfPresent(StudentDO::getSchoolName, reqVO.getSchoolName()) + .likeIfPresent(StudentDO::getSqName, reqVO.getSqName()) + .likeIfPresent(StudentDO::getJdName, reqVO.getJdName()) + .eqIfPresent(StudentDO::getEmail, reqVO.getEmail()) + .eqIfPresent(StudentDO::getMobile, reqVO.getMobile()) + .eqIfPresent(StudentDO::getRemark, reqVO.getRemark()) + .eqIfPresent(StudentDO::getStatus, reqVO.getStatus()) + .eqIfPresent(StudentDO::getBatchno, xyrwDO.getBatchno()) + .betweenIfPresent(StudentDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(StudentDO::getId)); + } + default PageResult selectHisPage(StudentPageReqVO reqVO, XyrwDO xyrwDO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(StudentDO::getOpenid, reqVO.getOpenid()) + .eqIfPresent(StudentDO::getPatid, reqVO.getPatid()) + .likeIfPresent(StudentDO::getName, reqVO.getName()) + .eqIfPresent(StudentDO::getSex, reqVO.getSex()) + .eqIfPresent(StudentDO::getAge, reqVO.getAge()) + .eqIfPresent(StudentDO::getNationId, reqVO.getNationId()) + .eqIfPresent(StudentDO::getDeptId, reqVO.getDeptId()) + .eqIfPresent(StudentDO::getFeeflag, reqVO.getFeeflag()) + .likeIfPresent(StudentDO::getClassName, reqVO.getClassName()) + .likeIfPresent(StudentDO::getSchoolName, reqVO.getSchoolName()) + .likeIfPresent(StudentDO::getSqName, reqVO.getSqName()) + .likeIfPresent(StudentDO::getJdName, reqVO.getJdName()) + .eqIfPresent(StudentDO::getEmail, reqVO.getEmail()) + .eqIfPresent(StudentDO::getMobile, reqVO.getMobile()) + .eqIfPresent(StudentDO::getRemark, reqVO.getRemark()) + .eqIfPresent(StudentDO::getStatus, reqVO.getStatus()) + .eqIfPresent(StudentDO::getBatchno, reqVO.getBatchno()) + .neIfPresent(StudentDO::getBatchno, xyrwDO.getBatchno()) + .betweenIfPresent(StudentDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(StudentDO::getId)); + } + + default List selectListSimple(StudentExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(StudentDO::getOpenid, reqVO.getOpenid()) + .eqIfPresent(StudentDO::getPatid, reqVO.getPatid()) + .likeIfPresent(StudentDO::getName, reqVO.getName()) + .eqIfPresent(StudentDO::getSex, reqVO.getSex()) + .eqIfPresent(StudentDO::getAge, reqVO.getAge()) + .eqIfPresent(StudentDO::getNationId, reqVO.getNationId()) + .eqIfPresent(StudentDO::getDeptId, reqVO.getDeptId()) + .likeIfPresent(StudentDO::getClassName, reqVO.getClassName()) + .likeIfPresent(StudentDO::getSchoolName, reqVO.getSchoolName()) + .likeIfPresent(StudentDO::getSqName, reqVO.getSqName()) + .likeIfPresent(StudentDO::getJdName, reqVO.getJdName()) + .eqIfPresent(StudentDO::getEmail, reqVO.getEmail()) + .eqIfPresent(StudentDO::getMobile, reqVO.getMobile()) + .eqIfPresent(StudentDO::getRemark, reqVO.getRemark()) + .eqIfPresent(StudentDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(StudentDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(StudentDO::getId)); + } + @Select("SELECT * FROM xytj_student where openid = #{openid} and batchno = #{batchno} and deleted = 0") + List selectbyopenid(@Param("openid") String openid, @Param("batchno") String batchno); + @Select("SELECT * FROM xytj_student where nation_id = #{nationid} and deleted = 0") + StudentDO selectByNationId(String nationid); + + + @Select("SELECT * FROM xytj_student where nation_id = #{nationid} and batchno = #{batchno} and deleted = 0") + StudentDO selectByNationidForTJ(@Param("nationid") String nationid, @Param("batchno") String batchno); + + default List selectList(StudentExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(StudentDO::getOpenid, reqVO.getOpenid()) + .eqIfPresent(StudentDO::getPatid, reqVO.getPatid()) + .likeIfPresent(StudentDO::getName, reqVO.getName()) + .eqIfPresent(StudentDO::getSex, reqVO.getSex()) + .eqIfPresent(StudentDO::getAge, reqVO.getAge()) + .eqIfPresent(StudentDO::getNationId, reqVO.getNationId()) + .eqIfPresent(StudentDO::getDeptId, reqVO.getDeptId()) + .likeIfPresent(StudentDO::getClassName, reqVO.getClassName()) + .likeIfPresent(StudentDO::getSchoolName, reqVO.getSchoolName()) + .likeIfPresent(StudentDO::getSqName, reqVO.getSqName()) + .likeIfPresent(StudentDO::getJdName, reqVO.getJdName()) + .eqIfPresent(StudentDO::getEmail, reqVO.getEmail()) + .eqIfPresent(StudentDO::getMobile, reqVO.getMobile()) + .eqIfPresent(StudentDO::getRemark, reqVO.getRemark()) + .eqIfPresent(StudentDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(StudentDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(StudentDO::getId)); + } + + default List selectListXy(StudentExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(StudentDO::getOpenid, reqVO.getOpenid()) + .eqIfPresent(StudentDO::getPatid, reqVO.getPatid()) + .eqIfPresent(StudentDO::getName, reqVO.getName()) + .eqIfPresent(StudentDO::getSex, reqVO.getSex()) + .eqIfPresent(StudentDO::getAge, reqVO.getAge()) + .eqIfPresent(StudentDO::getNationId, reqVO.getNationId()) + .eqIfPresent(StudentDO::getDeptId, reqVO.getDeptId()) + .eqIfPresent(StudentDO::getClassName, reqVO.getClassName()) + .eqIfPresent(StudentDO::getSchoolName, reqVO.getSchoolName()) + .likeIfPresent(StudentDO::getSqName, reqVO.getSqName()) + .likeIfPresent(StudentDO::getJdName, reqVO.getJdName()) + .eqIfPresent(StudentDO::getEmail, reqVO.getEmail()) + .eqIfPresent(StudentDO::getMobile, reqVO.getMobile()) + .eqIfPresent(StudentDO::getRemark, reqVO.getRemark()) + .eqIfPresent(StudentDO::getStatus, reqVO.getStatus()) + .eqIfPresent(StudentDO::getBatchno, reqVO.getBatchno()) + .eqIfPresent(StudentDO::getFeeflag, reqVO.getFeeflag()) + .betweenIfPresent(StudentDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(StudentDO::getSchoolName) + .orderByDesc(StudentDO::getClassName) + .orderByDesc(StudentDO::getName)); + } + default void updateOrderByNotify(StudentDO studentDO){ + update(studentDO, Wrappers.lambdaUpdate(StudentDO.class) + .eq(StudentDO::getBatchno, studentDO.getBatchno()) + .eq(StudentDO::getOrderno, studentDO.getOrderno())); + } + default void updateOrderByConfirm(StudentDO studentDO){ + update(studentDO, Wrappers.lambdaUpdate(StudentDO.class) + .eq(StudentDO::getBatchno, studentDO.getBatchno()) + .eq(StudentDO::getPatid, studentDO.getPatid())); + } + + default void updateXyrwName(StudentDO studentDO){ + update(studentDO, Wrappers.lambdaUpdate(StudentDO.class) + .eq(StudentDO::getBatchno, studentDO.getBatchno())); + } + + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/tenant/TenantMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/tenant/TenantMapper.java new file mode 100644 index 0000000..500fe4b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/tenant/TenantMapper.java @@ -0,0 +1,58 @@ +package com.jojubanking.boot.module.system.dal.mysql.tenant; + +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; +import java.util.List; + +/** + * 租户 Mapper + * + * @author TW + */ +@Mapper +public interface TenantMapper extends BaseMapperX { + + default PageResult selectPage(TenantPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(TenantDO::getName, reqVO.getName()) + .likeIfPresent(TenantDO::getContactName, reqVO.getContactName()) + .likeIfPresent(TenantDO::getContactMobile, reqVO.getContactMobile()) + .eqIfPresent(TenantDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(TenantDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TenantDO::getId)); + } + + default List selectList(TenantExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(TenantDO::getName, reqVO.getName()) + .likeIfPresent(TenantDO::getContactName, reqVO.getContactName()) + .likeIfPresent(TenantDO::getContactMobile, reqVO.getContactMobile()) + .eqIfPresent(TenantDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(TenantDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TenantDO::getId)); + } + + default TenantDO selectByName(String name) { + return selectOne(TenantDO::getName, name); + } + + default Long selectCountByPackageId(Long packageId) { + return selectCount(TenantDO::getPackageId, packageId); + } + + default List selectListByPackageId(Long packageId) { + return selectList(TenantDO::getPackageId, packageId); + } + + @Select("SELECT COUNT(*) FROM system_tenant WHERE update_time > #{maxUpdateTime}") + Long selectCountByUpdateTimeGt(Date maxUpdateTime); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/tenant/TenantPackageMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/tenant/TenantPackageMapper.java new file mode 100644 index 0000000..ab19bd2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/tenant/TenantPackageMapper.java @@ -0,0 +1,32 @@ +package com.jojubanking.boot.module.system.dal.mysql.tenant; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantPackageDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 租户套餐 Mapper + * + * @author TW + */ +@Mapper +public interface TenantPackageMapper extends BaseMapperX { + + default PageResult selectPage(TenantPackagePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(TenantPackageDO::getName, reqVO.getName()) + .eqIfPresent(TenantPackageDO::getStatus, reqVO.getStatus()) + .likeIfPresent(TenantPackageDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(TenantPackageDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(TenantPackageDO::getId)); + } + + default List selectListByStatus(Integer status) { + return selectList(TenantPackageDO::getStatus, status); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/usecount/UseCountMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/usecount/UseCountMapper.java new file mode 100644 index 0000000..ae5b29a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/usecount/UseCountMapper.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.dal.mysql.usecount; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.usecount.vo.*; + +/** + * 统计 Mapper + * + * @author admin + */ +@Mapper +public interface UseCountMapper extends BaseMapperX { + + default PageResult selectPage(UseCountPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UseCountDO::getInterfaceIdentification, reqVO.getInterfaceIdentification()) + .eqIfPresent(UseCountDO::getUserId, reqVO.getUserId()) + .betweenIfPresent(UseCountDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UseCountDO::getId)); + } + + default List selectList(UseCountExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(UseCountDO::getInterfaceIdentification, reqVO.getInterfaceIdentification()) + .eqIfPresent(UseCountDO::getUserId, reqVO.getUserId()) + .betweenIfPresent(UseCountDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UseCountDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/usecount/UseCountXMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/usecount/UseCountXMapper.java new file mode 100644 index 0000000..e6328bd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/usecount/UseCountXMapper.java @@ -0,0 +1,63 @@ +package com.jojubanking.boot.module.system.dal.mysql.usecount; + +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountDO; +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountToDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.Date; +import java.util.List; + +@Mapper +public interface UseCountXMapper extends BaseMapperX { + + @Select("select *, count(*) as tlsum " + + "from users_use_count " + + "where create_time BETWEEN CONCAT(CURDATE(),' 00:00:00') AND CONCAT(CURDATE(),' 23:59:59') " + + "GROUP BY interface_identification") + List selectCountTo(); + + @Select("select *, count(*) as tlsum " + + "from users_use_count " + + "where create_time BETWEEN CONCAT( SUBDATE(CURDATE(), 1),' 00:00:00') AND CONCAT( SUBDATE(CURDATE(), 1),' 23:59:59')" + + "GROUP BY interface_identification") + List selectCountTo1(); + + @Select("select *, count(*) as tlsum " + + "from users_use_count " + + "where create_time BETWEEN CONCAT( SUBDATE(CURDATE(), 2),' 00:00:00') AND CONCAT( SUBDATE(CURDATE(), 2),' 23:59:59')" + + "GROUP BY interface_identification") + List selectCountTo2(); + + @Select("select *, count(*) as tlsum " + + "from users_use_count " + + "where create_time BETWEEN CONCAT( SUBDATE(CURDATE(), 3),' 00:00:00') AND CONCAT( SUBDATE(CURDATE(), 3),' 23:59:59')" + + "GROUP BY interface_identification") + List selectCountTo3(); + + @Select("select *, count(*) as tlsum " + + "from users_use_count " + + "where create_time BETWEEN CONCAT( SUBDATE(CURDATE(), 4),' 00:00:00') AND CONCAT( SUBDATE(CURDATE(), 4),' 23:59:59')" + + "GROUP BY interface_identification") + List selectCountTo4(); + + @Select("select *, count(*) as tlsum " + + "from users_use_count " + + "where create_time BETWEEN CONCAT( SUBDATE(CURDATE(), 5),' 00:00:00') AND CONCAT( SUBDATE(CURDATE(), 5),' 23:59:59')" + + "GROUP BY interface_identification") + List selectCountTo5(); + + @Select("select *, count(*) as tlsum " + + "from users_use_count " + + "where create_time BETWEEN CONCAT( SUBDATE(CURDATE(), 6),' 00:00:00') AND CONCAT( SUBDATE(CURDATE(), 6),' 23:59:59')" + + "GROUP BY interface_identification") + List selectCountTo6(); + + @Select("select *, COALESCE(count(*), 0) as tlsum " + + "from users_use_count " + + " WHERE create_time BETWEEN #{startDate} AND #{endDate} " + + "GROUP BY interface_identification") + List selectCountToSection(@Param("startDate") Date startDate, @Param("endDate") Date endDate); +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/user/AdminUserMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/user/AdminUserMapper.java new file mode 100644 index 0000000..a805519 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/user/AdminUserMapper.java @@ -0,0 +1,65 @@ +package com.jojubanking.boot.module.system.dal.mysql.user; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collection; +import java.util.List; + +@Mapper +public interface AdminUserMapper extends BaseMapperX { + + default AdminUserDO selectByUsername(String username) { + return selectOne(new LambdaQueryWrapper().eq(AdminUserDO::getUsername, username)); + } + + default AdminUserDO selectByEmail(String email) { + return selectOne(new LambdaQueryWrapper().eq(AdminUserDO::getEmail, email)); + } + + default AdminUserDO selectByMobile(String mobile) { + return selectOne(new LambdaQueryWrapper().eq(AdminUserDO::getMobile, mobile)); + } + + default PageResult selectPage(UserPageReqVO reqVO, Collection deptIds) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername()) + .likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile()) + .eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime()) + .inIfPresent(AdminUserDO::getDeptId, deptIds) + .orderByDesc(AdminUserDO::getId)); + } + + default List selectList(UserExportReqVO reqVO, Collection deptIds) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(AdminUserDO::getUsername, reqVO.getUsername()) + .likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile()) + .eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getCreateTime()) + .inIfPresent(AdminUserDO::getDeptId, deptIds)); + } + + default List selectListByNickname(String nickname) { + return selectList(new LambdaQueryWrapperX().like(AdminUserDO::getNickname, nickname)); + } + + default List selectListByUsername(String username) { + return selectList(new LambdaQueryWrapperX().like(AdminUserDO::getUsername, username)); + } + + default List selectListByStatus(Integer status) { + return selectList(AdminUserDO::getStatus, status); + } + + default List selectListByDeptIds(Collection deptIds) { + return selectList(AdminUserDO::getDeptId, deptIds); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/userinfo/UserInfoMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/userinfo/UserInfoMapper.java new file mode 100644 index 0000000..cb528f4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/userinfo/UserInfoMapper.java @@ -0,0 +1,65 @@ +package com.jojubanking.boot.module.system.dal.mysql.userinfo; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.userinfo.UserInfoDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.app.userinfo.vo.*; + +/** + * 用户信息 Mapper + * + * @author admin + */ +@Mapper +public interface UserInfoMapper extends BaseMapperX { + default UserInfoDO selectByMobile(String mobile) { + return selectOne(UserInfoDO::getPhone, mobile); + } + + default PageResult selectPage(AppUserInfoPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UserInfoDO::getOpenid, reqVO.getOpenid()) + .likeIfPresent(UserInfoDO::getName, reqVO.getName()) + .eqIfPresent(UserInfoDO::getUser, reqVO.getUser()) + .eqIfPresent(UserInfoDO::getPassword, reqVO.getPassword()) + .eqIfPresent(UserInfoDO::getPhone, reqVO.getPhone()) + .eqIfPresent(UserInfoDO::getIdno, reqVO.getIdno()) + .eqIfPresent(UserInfoDO::getEmail, reqVO.getEmail()) + .eqIfPresent(UserInfoDO::getRemark, reqVO.getRemark()) + .eqIfPresent(UserInfoDO::getHeadurl, reqVO.getHeadurl()) + .betweenIfPresent(UserInfoDO::getBirthdate, reqVO.getBirthdate()) + .eqIfPresent(UserInfoDO::getNativeplace, reqVO.getNativeplace()) + .eqIfPresent(UserInfoDO::getCountry, reqVO.getCountry()) + .eqIfPresent(UserInfoDO::getProvince, reqVO.getProvince()) + .eqIfPresent(UserInfoDO::getCity, reqVO.getCity()) + .eqIfPresent(UserInfoDO::getSex, reqVO.getSex()) + .betweenIfPresent(UserInfoDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserInfoDO::getId)); + } + + default List selectList(AppUserInfoExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(UserInfoDO::getOpenid, reqVO.getOpenid()) + .likeIfPresent(UserInfoDO::getName, reqVO.getName()) + .eqIfPresent(UserInfoDO::getUser, reqVO.getUser()) + .eqIfPresent(UserInfoDO::getPassword, reqVO.getPassword()) + .eqIfPresent(UserInfoDO::getPhone, reqVO.getPhone()) + .eqIfPresent(UserInfoDO::getIdno, reqVO.getIdno()) + .eqIfPresent(UserInfoDO::getEmail, reqVO.getEmail()) + .eqIfPresent(UserInfoDO::getRemark, reqVO.getRemark()) + .eqIfPresent(UserInfoDO::getHeadurl, reqVO.getHeadurl()) + .betweenIfPresent(UserInfoDO::getBirthdate, reqVO.getBirthdate()) + .eqIfPresent(UserInfoDO::getNativeplace, reqVO.getNativeplace()) + .eqIfPresent(UserInfoDO::getCountry, reqVO.getCountry()) + .eqIfPresent(UserInfoDO::getProvince, reqVO.getProvince()) + .eqIfPresent(UserInfoDO::getCity, reqVO.getCity()) + .eqIfPresent(UserInfoDO::getSex, reqVO.getSex()) + .betweenIfPresent(UserInfoDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UserInfoDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/usersxq/UsersXqMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/usersxq/UsersXqMapper.java new file mode 100644 index 0000000..11f4261 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/usersxq/UsersXqMapper.java @@ -0,0 +1,58 @@ +package com.jojubanking.boot.module.system.dal.mysql.usersxq; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.usersxq.UsersXqDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.usersxq.vo.*; + +/** + * 用户信息 Mapper + * + * @author admin + */ +@Mapper +public interface UsersXqMapper extends BaseMapperX { + + default PageResult selectPage(UsersXqPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(UsersXqDO::getUsername, reqVO.getUsername()) + .eqIfPresent(UsersXqDO::getPassword, reqVO.getPassword()) + .likeIfPresent(UsersXqDO::getNickname, reqVO.getNickname()) + .eqIfPresent(UsersXqDO::getRemark, reqVO.getRemark()) + .eqIfPresent(UsersXqDO::getDeptId, reqVO.getDeptId()) + .eqIfPresent(UsersXqDO::getPostIds, reqVO.getPostIds()) + .eqIfPresent(UsersXqDO::getEmail, reqVO.getEmail()) + .eqIfPresent(UsersXqDO::getMobile, reqVO.getMobile()) + .eqIfPresent(UsersXqDO::getSex, reqVO.getSex()) + .eqIfPresent(UsersXqDO::getAvatar, reqVO.getAvatar()) + .eqIfPresent(UsersXqDO::getStatus, reqVO.getStatus()) + .eqIfPresent(UsersXqDO::getLoginIp, reqVO.getLoginIp()) + .betweenIfPresent(UsersXqDO::getLoginDate, reqVO.getLoginDate()) + .betweenIfPresent(UsersXqDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UsersXqDO::getId)); + } + + default List selectList(UsersXqExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(UsersXqDO::getUsername, reqVO.getUsername()) + .eqIfPresent(UsersXqDO::getPassword, reqVO.getPassword()) + .likeIfPresent(UsersXqDO::getNickname, reqVO.getNickname()) + .eqIfPresent(UsersXqDO::getRemark, reqVO.getRemark()) + .eqIfPresent(UsersXqDO::getDeptId, reqVO.getDeptId()) + .eqIfPresent(UsersXqDO::getPostIds, reqVO.getPostIds()) + .eqIfPresent(UsersXqDO::getEmail, reqVO.getEmail()) + .eqIfPresent(UsersXqDO::getMobile, reqVO.getMobile()) + .eqIfPresent(UsersXqDO::getSex, reqVO.getSex()) + .eqIfPresent(UsersXqDO::getAvatar, reqVO.getAvatar()) + .eqIfPresent(UsersXqDO::getStatus, reqVO.getStatus()) + .eqIfPresent(UsersXqDO::getLoginIp, reqVO.getLoginIp()) + .betweenIfPresent(UsersXqDO::getLoginDate, reqVO.getLoginDate()) + .betweenIfPresent(UsersXqDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UsersXqDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wq/WqMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wq/WqMapper.java new file mode 100644 index 0000000..953d6f8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wq/WqMapper.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.system.dal.mysql.wq; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.wq.WqDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.wq.vo.*; + +/** + * 问卷调查 Mapper + * + * @author admin + */ +@Mapper +public interface WqMapper extends BaseMapperX { + + default PageResult selectPage(WqPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WqDO::getTitle, reqVO.getTitle()) + .eqIfPresent(WqDO::getTypeId, reqVO.getTypeId()) + .eqIfPresent(WqDO::getType, reqVO.getType()) + .betweenIfPresent(WqDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WqDO::getId)); + } + + default List selectList(WqExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(WqDO::getTitle, reqVO.getTitle()) + .eqIfPresent(WqDO::getTypeId, reqVO.getTypeId()) + .eqIfPresent(WqDO::getType, reqVO.getType()) + .betweenIfPresent(WqDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WqDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wqda/WqdaMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wqda/WqdaMapper.java new file mode 100644 index 0000000..31a86be --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wqda/WqdaMapper.java @@ -0,0 +1,54 @@ +package com.jojubanking.boot.module.system.dal.mysql.wqda; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.wqda.WqdaDO; +import com.jojubanking.boot.module.system.dal.dataobject.wqda.WqdaDOx; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.wqda.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 问卷调查答案 Mapper + * + * @author admin + */ +@Mapper +public interface WqdaMapper extends BaseMapperX { + + default PageResult selectPage(WqdaPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WqdaDO::getTypeId, reqVO.getTypeId()) + .eqIfPresent(WqdaDO::getQuestionId, reqVO.getQuestionId()) + .eqIfPresent(WqdaDO::getQuestionType, reqVO.getQuestionType()) + .eqIfPresent(WqdaDO::getQuestionTitle, reqVO.getQuestionTitle()) + .eqIfPresent(WqdaDO::getQuestionAnswer, reqVO.getQuestionAnswer()) + .eqIfPresent(WqdaDO::getQuestionComment, reqVO.getQuestionComment()) + .likeIfPresent(WqdaDO::getUsername, reqVO.getUsername()) + .eqIfPresent(WqdaDO::getUsertel, reqVO.getUsertel()) + .betweenIfPresent(WqdaDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WqdaDO::getId)); + } + + default List selectList(WqdaExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(WqdaDO::getTypeId, reqVO.getTypeId()) + .eqIfPresent(WqdaDO::getQuestionId, reqVO.getQuestionId()) + .eqIfPresent(WqdaDO::getQuestionType, reqVO.getQuestionType()) + .eqIfPresent(WqdaDO::getQuestionTitle, reqVO.getQuestionTitle()) + .eqIfPresent(WqdaDO::getQuestionAnswer, reqVO.getQuestionAnswer()) + .eqIfPresent(WqdaDO::getQuestionComment, reqVO.getQuestionComment()) + .likeIfPresent(WqdaDO::getUsername, reqVO.getUsername()) + .eqIfPresent(WqdaDO::getUsertel, reqVO.getUsertel()) + .betweenIfPresent(WqdaDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WqdaDO::getId)); + } + +// @Select("SELECT *, COUNT(*) as sum FROM hnwj_wqda where question_id = #{questionId} and type_id = #{typeId} GROUP BY question_answer order by id") +// List selectSumList(@Param("questionId")String questionId, @Param("typeId")String typeId); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wqda/WqdaxMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wqda/WqdaxMapper.java new file mode 100644 index 0000000..b0bb044 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wqda/WqdaxMapper.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.dal.mysql.wqda; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.wqda.WqdaDO; +import com.jojubanking.boot.module.system.dal.dataobject.wqda.WqdaDOx; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.wqda.vo.*; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 问卷调查答案 Mapper + * + * @author admin + */ +@Mapper +public interface WqdaxMapper extends BaseMapperX { + + + @Select("SELECT *, COUNT(*) as sum FROM hnwj_wqda where question_id = #{questionId} and type_id = #{typeId} and (create_time >= #{startTime} and create_time <= #{endTime}) GROUP BY question_answer order by id") + List selectSumList(@Param("questionId")String questionId, @Param("typeId")String typeId, @Param("startTime")String startTime, @Param("endTime")String endTime); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wqdaview/WqdaViewMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wqdaview/WqdaViewMapper.java new file mode 100644 index 0000000..59c41b5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wqdaview/WqdaViewMapper.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.module.system.dal.mysql.wqdaview; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.wqdaview.WqdaViewCustDO; +import com.jojubanking.boot.module.system.dal.dataobject.wqdaview.WqdaViewDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.wqdaview.vo.*; + +/** + * VIEW Mapper + * + * @author admin + */ +@Mapper +public interface WqdaViewMapper extends BaseMapperX { + + default PageResult selectPage(WqdaViewPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WqdaViewDO::getTypeId, reqVO.getTypeId()) + .eqIfPresent(WqdaViewDO::getQuestionId, reqVO.getQuestionId()) + .eqIfPresent(WqdaViewDO::getQuestionType, reqVO.getQuestionType()) + .likeIfPresent(WqdaViewDO::getQuestionTitle, reqVO.getQuestionTitle()) + .likeIfPresent(WqdaViewDO::getQuestionAnswer, reqVO.getQuestionAnswer()) + .likeIfPresent(WqdaViewDO::getQuestionComment, reqVO.getQuestionComment()) + .likeIfPresent(WqdaViewDO::getUsername, reqVO.getUsername()) + .likeIfPresent(WqdaViewDO::getUsertel, reqVO.getUsertel()) + .betweenIfPresent(WqdaViewDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(WqdaViewDO::getQuestionLabel, reqVO.getQuestionLabel()) + .orderByDesc(WqdaViewDO::getId)); + } + + default List selectList(WqdaViewExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(WqdaViewDO::getTypeId, reqVO.getTypeId()) + .eqIfPresent(WqdaViewDO::getQuestionId, reqVO.getQuestionId()) + .eqIfPresent(WqdaViewDO::getQuestionType, reqVO.getQuestionType()) + .eqIfPresent(WqdaViewDO::getQuestionTitle, reqVO.getQuestionTitle()) + .eqIfPresent(WqdaViewDO::getQuestionAnswer, reqVO.getQuestionAnswer()) + .eqIfPresent(WqdaViewDO::getQuestionComment, reqVO.getQuestionComment()) + .likeIfPresent(WqdaViewDO::getUsername, reqVO.getUsername()) + .eqIfPresent(WqdaViewDO::getUsertel, reqVO.getUsertel()) + .betweenIfPresent(WqdaViewDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(WqdaViewDO::getQuestionLabel, reqVO.getQuestionLabel()) + .orderByDesc(WqdaViewDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wqwt/WqwtMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wqwt/WqwtMapper.java new file mode 100644 index 0000000..8eff9fa --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/wqwt/WqwtMapper.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.module.system.dal.mysql.wqwt; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.wqwt.WqwtDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.wqwt.vo.*; + +/** + * 问卷调查问题 Mapper + * + * @author admin + */ +@Mapper +public interface WqwtMapper extends BaseMapperX { + + default PageResult selectPage(WqwtPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WqwtDO::getTypeId, reqVO.getTypeId()) + .eqIfPresent(WqwtDO::getQuestionId, reqVO.getQuestionId()) + .eqIfPresent(WqwtDO::getPid, reqVO.getPid()) + .eqIfPresent(WqwtDO::getGradingType, reqVO.getGradingType()) + .eqIfPresent(WqwtDO::getQuestionType, reqVO.getQuestionType()) + .eqIfPresent(WqwtDO::getQuestionTitle, reqVO.getQuestionTitle()) + .eqIfPresent(WqwtDO::getQuestionOpnum, reqVO.getQuestionOpnum()) + .eqIfPresent(WqwtDO::getQuestionContent, reqVO.getQuestionContent()) + .betweenIfPresent(WqwtDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WqwtDO::getId)); + } + + default List selectList(WqwtExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(WqwtDO::getTypeId, reqVO.getTypeId()) + .eqIfPresent(WqwtDO::getQuestionId, reqVO.getQuestionId()) + .eqIfPresent(WqwtDO::getPid, reqVO.getPid()) + .eqIfPresent(WqwtDO::getGradingType, reqVO.getGradingType()) + .eqIfPresent(WqwtDO::getQuestionType, reqVO.getQuestionType()) + .eqIfPresent(WqwtDO::getQuestionTitle, reqVO.getQuestionTitle()) + .eqIfPresent(WqwtDO::getQuestionOpnum, reqVO.getQuestionOpnum()) + .eqIfPresent(WqwtDO::getQuestionContent, reqVO.getQuestionContent()) + .betweenIfPresent(WqwtDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WqwtDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/xymain/xyMainMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/xymain/xyMainMapper.java new file mode 100644 index 0000000..4617a89 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/xymain/xyMainMapper.java @@ -0,0 +1,103 @@ +package com.jojubanking.boot.module.system.dal.mysql.xymain; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.xyMainUpdateByOpenidVO; +import com.jojubanking.boot.module.system.dal.dataobject.xymain.xyMainDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.*; + +/** + * 体检信息 Mapper + * + * @author admin + */ +@Mapper +public interface xyMainMapper extends BaseMapperX { + + default PageResult selectPage(xyMainPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(xyMainDO::getBatchno, reqVO.getBatchno()) + .likeIfPresent(xyMainDO::getBatchname, reqVO.getBatchname()) + .eqIfPresent(xyMainDO::getPatid, reqVO.getPatid()) + .likeIfPresent(xyMainDO::getName, reqVO.getName()) + .eqIfPresent(xyMainDO::getSex, reqVO.getSex()) + .eqIfPresent(xyMainDO::getAge, reqVO.getAge()) + .eqIfPresent(xyMainDO::getNationId, reqVO.getNationId()) + .eqIfPresent(xyMainDO::getDeptId, reqVO.getDeptId()) + .likeIfPresent(xyMainDO::getClassName, reqVO.getClassName()) + .likeIfPresent(xyMainDO::getSchoolName, reqVO.getSchoolName()) + .likeIfPresent(xyMainDO::getSqName, reqVO.getSqName()) + .likeIfPresent(xyMainDO::getJdName, reqVO.getJdName()) + .eqIfPresent(xyMainDO::getEmail, reqVO.getEmail()) + .eqIfPresent(xyMainDO::getMobile, reqVO.getMobile()) + .eqIfPresent(xyMainDO::getRemark, reqVO.getRemark()) + .eqIfPresent(xyMainDO::getFeeflag, reqVO.getFeeflag()) + .eqIfPresent(xyMainDO::getFeetotal, reqVO.getFeetotal()) + .eqIfPresent(xyMainDO::getTjpkgfee, reqVO.getTjpkgfee()) + .eqIfPresent(xyMainDO::getTjpkgno, reqVO.getTjpkgno()) + .eqIfPresent(xyMainDO::getTjkxfee, reqVO.getTjkxfee()) + .eqIfPresent(xyMainDO::getTjorderno, reqVO.getTjorderno()) + .betweenIfPresent(xyMainDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(xyMainDO::getId)); + } + + default List selectListSimple(xyMainExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(xyMainDO::getBatchno, reqVO.getBatchno()) + .likeIfPresent(xyMainDO::getBatchname, reqVO.getBatchname()) + .eqIfPresent(xyMainDO::getPatid, reqVO.getPatid()) + .likeIfPresent(xyMainDO::getName, reqVO.getName()) + .eqIfPresent(xyMainDO::getSex, reqVO.getSex()) + .eqIfPresent(xyMainDO::getAge, reqVO.getAge()) + .eqIfPresent(xyMainDO::getNationId, reqVO.getNationId()) + .eqIfPresent(xyMainDO::getDeptId, reqVO.getDeptId()) + .eqIfPresent(xyMainDO::getOpenid, reqVO.getOpenid()) + .likeIfPresent(xyMainDO::getClassName, reqVO.getClassName()) + .likeIfPresent(xyMainDO::getSchoolName, reqVO.getSchoolName()) + .likeIfPresent(xyMainDO::getSqName, reqVO.getSqName()) + .likeIfPresent(xyMainDO::getJdName, reqVO.getJdName()) + .eqIfPresent(xyMainDO::getEmail, reqVO.getEmail()) + .eqIfPresent(xyMainDO::getMobile, reqVO.getMobile()) + .eqIfPresent(xyMainDO::getRemark, reqVO.getRemark()) + .eqIfPresent(xyMainDO::getFeeflag, reqVO.getFeeflag()) + .eqIfPresent(xyMainDO::getFeetotal, reqVO.getFeetotal()) + .eqIfPresent(xyMainDO::getTjpkgfee, reqVO.getTjpkgfee()) + .eqIfPresent(xyMainDO::getTjpkgno, reqVO.getTjpkgno()) + .eqIfPresent(xyMainDO::getTjkxfee, reqVO.getTjkxfee()) + .eqIfPresent(xyMainDO::getTjorderno, reqVO.getTjorderno()) + .betweenIfPresent(xyMainDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(xyMainDO::getId)); + } + + default List selectList(xyMainExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(xyMainDO::getBatchno, reqVO.getBatchno()) + .likeIfPresent(xyMainDO::getBatchname, reqVO.getBatchname()) + .eqIfPresent(xyMainDO::getPatid, reqVO.getPatid()) + .likeIfPresent(xyMainDO::getName, reqVO.getName()) + .eqIfPresent(xyMainDO::getSex, reqVO.getSex()) + .eqIfPresent(xyMainDO::getAge, reqVO.getAge()) + .eqIfPresent(xyMainDO::getNationId, reqVO.getNationId()) + .eqIfPresent(xyMainDO::getDeptId, reqVO.getDeptId()) + .likeIfPresent(xyMainDO::getClassName, reqVO.getClassName()) + .likeIfPresent(xyMainDO::getSchoolName, reqVO.getSchoolName()) + .likeIfPresent(xyMainDO::getSqName, reqVO.getSqName()) + .likeIfPresent(xyMainDO::getJdName, reqVO.getJdName()) + .eqIfPresent(xyMainDO::getEmail, reqVO.getEmail()) + .eqIfPresent(xyMainDO::getMobile, reqVO.getMobile()) + .eqIfPresent(xyMainDO::getRemark, reqVO.getRemark()) + .eqIfPresent(xyMainDO::getFeeflag, reqVO.getFeeflag()) + .eqIfPresent(xyMainDO::getFeetotal, reqVO.getFeetotal()) + .eqIfPresent(xyMainDO::getTjpkgfee, reqVO.getTjpkgfee()) + .eqIfPresent(xyMainDO::getTjpkgno, reqVO.getTjpkgno()) + .eqIfPresent(xyMainDO::getTjkxfee, reqVO.getTjkxfee()) + .eqIfPresent(xyMainDO::getTjorderno, reqVO.getTjorderno()) + .betweenIfPresent(xyMainDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(xyMainDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/xyrw/XyrwMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/xyrw/XyrwMapper.java new file mode 100644 index 0000000..e79179b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/xyrw/XyrwMapper.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.module.system.dal.mysql.xyrw; + +import java.util.*; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.XyrwListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.xyrw.vo.*; + +/** + * 批次信息 Mapper + * + * @author admin + */ +@Mapper +public interface XyrwMapper extends BaseMapperX { + + default PageResult selectPage(XyrwPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(XyrwDO::getBatchno, reqVO.getBatchno()) + .likeIfPresent(XyrwDO::getBatchName, reqVO.getBatchName()) + .eqIfPresent(XyrwDO::getBatchStatus, reqVO.getBatchStatus()) + .eqIfPresent(XyrwDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(XyrwDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(XyrwDO::getId)); + } + + default List selectList(XyrwExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(XyrwDO::getBatchno, reqVO.getBatchno()) + .likeIfPresent(XyrwDO::getBatchName, reqVO.getBatchName()) + .eqIfPresent(XyrwDO::getBatchStatus, reqVO.getBatchStatus()) + .eqIfPresent(XyrwDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(XyrwDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(XyrwDO::getId)); + } + + default List selectList(XyrwListReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(XyrwDO::getBatchno, reqVO.getBatchno()) + .likeIfPresent(XyrwDO::getBatchName, reqVO.getBatchName()) + .eqIfPresent(XyrwDO::getBatchStatus, reqVO.getBatchStatus()) + .eqIfPresent(XyrwDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(XyrwDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(XyrwDO::getId)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/xytjjg/XytjjgBatchInsertMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/xytjjg/XytjjgBatchInsertMapper.java new file mode 100644 index 0000000..e0ac4ae --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/xytjjg/XytjjgBatchInsertMapper.java @@ -0,0 +1,9 @@ +package com.jojubanking.boot.module.system.dal.mysql.xytjjg; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jojubanking.boot.module.system.dal.dataobject.xytjjg.XytjjgDO; +import org.springframework.stereotype.Repository; + +@Repository +public class XytjjgBatchInsertMapper extends ServiceImpl { +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/xytjjg/XytjjgMapper.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/xytjjg/XytjjgMapper.java new file mode 100644 index 0000000..bf283fb --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/mysql/xytjjg/XytjjgMapper.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.module.system.dal.mysql.xytjjg; + +import java.sql.*; +import java.util.*; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.framework.mybatis.core.mapper.BaseMapperX; +import com.jojubanking.boot.module.system.dal.dataobject.xytjjg.XytjjgDO; +import org.apache.ibatis.annotations.Mapper; +import com.jojubanking.boot.module.system.controller.admin.xytjjg.vo.*; + +/** + * HIS项目 Mapper + * + * @author admin + */ +@Mapper +public interface XytjjgMapper extends BaseMapperX { + + default PageResult selectPage(XytjjgPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(XytjjgDO::getItemno, reqVO.getItemno()) + .likeIfPresent(XytjjgDO::getItemname, reqVO.getItemname()) + .eqIfPresent(XytjjgDO::getItemprice, reqVO.getItemprice()) + .eqIfPresent(XytjjgDO::getItemflag, reqVO.getItemflag()) + .betweenIfPresent(XytjjgDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(XytjjgDO::getId)); + } + + default List selectList(XytjjgExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(XytjjgDO::getItemno, reqVO.getItemno()) + .likeIfPresent(XytjjgDO::getItemname, reqVO.getItemname()) + .eqIfPresent(XytjjgDO::getItemprice, reqVO.getItemprice()) + .eqIfPresent(XytjjgDO::getItemflag, reqVO.getItemflag()) + .betweenIfPresent(XytjjgDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(XytjjgDO::getId)); + } + + default List selectFilterList(XytjjgExportReqVO reqVO) { + return selectList(new LambdaQueryWrapper() + .like(XytjjgDO::getItemno, reqVO.getItemno()) + .or().like(XytjjgDO::getItemname, reqVO.getItemname()) + .orderByAsc(XytjjgDO::getItemno)); + } + + + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/redis/RedisKeyConstants.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/redis/RedisKeyConstants.java new file mode 100644 index 0000000..763135d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/redis/RedisKeyConstants.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.dal.redis; + +import com.jojubanking.boot.framework.redis.core.RedisKeyDefine; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; + +import java.time.Duration; + +import static com.jojubanking.boot.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING; + +/** + * System Redis Key 枚举类 + * + * @author TW + */ +public interface RedisKeyConstants { + + RedisKeyDefine CAPTCHA_CODE = new RedisKeyDefine("验证码的缓存", + "captcha_code:%s", // 参数为 uuid + STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + + RedisKeyDefine OAUTH2_ACCESS_TOKEN = new RedisKeyDefine("访问令牌的缓存", + "oauth2_access_token:%s", // 参数为访问令牌 token + STRING, OAuth2AccessTokenDO.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC); + + RedisKeyDefine SOCIAL_AUTH_STATE = new RedisKeyDefine("社交登陆的 state", // 注意,它是被 JustAuth 的 justauth.type.prefix 使用到 + "social_auth_state:%s", // 参数为 state + STRING, String.class, Duration.ofHours(24)); // 值为 state + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/redis/common/CaptchaRedisDAO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/redis/common/CaptchaRedisDAO.java new file mode 100644 index 0000000..6e3427f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/redis/common/CaptchaRedisDAO.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.dal.redis.common; + +import com.jojubanking.boot.module.system.dal.redis.RedisKeyConstants; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.time.Duration; + +/** + * 验证码的 Redis DAO + * + * @author TW + */ +@Repository +public class CaptchaRedisDAO { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + public String get(String uuid) { + String redisKey = formatKey(uuid); + return stringRedisTemplate.opsForValue().get(redisKey); + } + + public void set(String uuid, String code, Duration timeout) { + String redisKey = formatKey(uuid); + stringRedisTemplate.opsForValue().set(redisKey, code, timeout); + } + + public void delete(String uuid) { + String redisKey = formatKey(uuid); + stringRedisTemplate.delete(redisKey); + } + + private static String formatKey(String uuid) { + return String.format(RedisKeyConstants.CAPTCHA_CODE.getKeyTemplate(), uuid); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java new file mode 100644 index 0000000..51d2782 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.java @@ -0,0 +1,57 @@ +package com.jojubanking.boot.module.system.dal.redis.oauth2; + +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.redis.RedisKeyConstants; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * {@link OAuth2AccessTokenDO} 的 RedisDAO + * + * @author TW + */ +@Repository +public class OAuth2AccessTokenRedisDAO { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + public OAuth2AccessTokenDO get(String accessToken) { + String redisKey = formatKey(accessToken); + return JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(redisKey), OAuth2AccessTokenDO.class); + } + + public void set(OAuth2AccessTokenDO accessTokenDO) { + String redisKey = formatKey(accessTokenDO.getAccessToken()); + // 清理多余字段,避免缓存 + accessTokenDO.setUpdater(null); + accessTokenDO.setUpdateTime(null); + accessTokenDO.setCreateTime(null); + accessTokenDO.setCreator(null); + accessTokenDO.setDeleted(null); + stringRedisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonString(accessTokenDO), + accessTokenDO.getExpiresTime().getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS); + } + + public void delete(String accessToken) { + String redisKey = formatKey(accessToken); + stringRedisTemplate.delete(redisKey); + } + + public void deleteList(Collection accessTokens) { + List redisKeys = CollectionUtils.convertList(accessTokens, OAuth2AccessTokenRedisDAO::formatKey); + stringRedisTemplate.delete(redisKeys); + } + + private static String formatKey(String accessToken) { + return String.format(RedisKeyConstants.OAUTH2_ACCESS_TOKEN.getKeyTemplate(), accessToken); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/captcha/config/CaptchaConfig.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/captcha/config/CaptchaConfig.java new file mode 100644 index 0000000..3e76403 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/captcha/config/CaptchaConfig.java @@ -0,0 +1,9 @@ +package com.jojubanking.boot.module.system.framework.captcha.config; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(CaptchaProperties.class) +public class CaptchaConfig { +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/captcha/config/CaptchaProperties.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/captcha/config/CaptchaProperties.java new file mode 100644 index 0000000..365c8a7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/captcha/config/CaptchaProperties.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.system.framework.captcha.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; +import java.time.Duration; + +@ConfigurationProperties(prefix = "joju.captcha") +@Validated +@Data +public class CaptchaProperties { + + private static final Boolean ENABLE_DEFAULT = true; + + /** + * 是否开启 + * 注意,这里仅仅是后端 Server 是否校验,暂时不控制前端的逻辑 + */ + private Boolean enable = ENABLE_DEFAULT; + /** + * 验证码的过期时间 + */ + @NotNull(message = "验证码的过期时间不为空") + private Duration timeout; + /** + * 验证码的高度 + */ + @NotNull(message = "验证码的高度不能为空") + private Integer height; + /** + * 验证码的宽度 + */ + @NotNull(message = "验证码的宽度不能为空") + private Integer width; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/captcha/package-info.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/captcha/package-info.java new file mode 100644 index 0000000..3aa5898 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/captcha/package-info.java @@ -0,0 +1,4 @@ +/** + * 基于 Hutool captcha 库,实现验证码功能 + */ +package com.jojubanking.boot.module.system.framework.captcha; diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/datapermission/config/DataPermissionConfiguration.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/datapermission/config/DataPermissionConfiguration.java new file mode 100644 index 0000000..ba3b017 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/datapermission/config/DataPermissionConfiguration.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.system.framework.datapermission.config; + +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.framework.datapermission.core.rule.dept.DeptDataPermissionRuleCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * system 模块的数据权限 Configuration + * + * @author TW + */ +@Configuration(proxyBeanMethods = false) +public class DataPermissionConfiguration { + + @Bean + public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() { + return rule -> { + // dept + rule.addDeptColumn(AdminUserDO.class); + rule.addDeptColumn(DeptDO.class, "id"); + // user + rule.addUserColumn(AdminUserDO.class, "id"); + }; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/datapermission/package-info.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/datapermission/package-info.java new file mode 100644 index 0000000..9260f9d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/datapermission/package-info.java @@ -0,0 +1,4 @@ +/** + * system 模块的数据权限配置 + */ +package com.jojubanking.boot.module.system.framework.datapermission; diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/package-info.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/package-info.java new file mode 100644 index 0000000..49c9833 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于 system 模块的 framework 封装 + * + * @author TW + */ +package com.jojubanking.boot.module.system.framework; diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/sms/SmsCodeConfiguration.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/sms/SmsCodeConfiguration.java new file mode 100644 index 0000000..946284e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/sms/SmsCodeConfiguration.java @@ -0,0 +1,9 @@ +package com.jojubanking.boot.module.system.framework.sms; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(SmsCodeProperties.class) +public class SmsCodeConfiguration { +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/sms/SmsCodeProperties.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/sms/SmsCodeProperties.java new file mode 100644 index 0000000..5cc0a21 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/sms/SmsCodeProperties.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.system.framework.sms; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; +import java.time.Duration; + +@ConfigurationProperties(prefix = "joju.sms-code") +@Validated +@Data +public class SmsCodeProperties { + + /** + * 过期时间 + */ + @NotNull(message = "过期时间不能为空") + private Duration expireTimes; + /** + * 短信发送频率 + */ + @NotNull(message = "短信发送频率不能为空") + private Duration sendFrequency; + /** + * 每日发送最大数量 + */ + @NotNull(message = "每日发送最大数量不能为空") + private Integer sendMaximumQuantityPerDay; + /** + * 验证码最小值 + */ + @NotNull(message = "验证码最小值不能为空") + private Integer beginCode; + /** + * 验证码最大值 + */ + @NotNull(message = "验证码最大值不能为空") + private Integer endCode; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/tjfiles/TjfilesConfig.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/tjfiles/TjfilesConfig.java new file mode 100644 index 0000000..84e7f08 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/tjfiles/TjfilesConfig.java @@ -0,0 +1,10 @@ +package com.jojubanking.boot.module.system.framework.tjfiles; + +import com.jojubanking.boot.module.system.framework.captcha.config.CaptchaProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(TjfilesProperties.class) +public class TjfilesConfig { +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/tjfiles/TjfilesProperties.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/tjfiles/TjfilesProperties.java new file mode 100644 index 0000000..0984d77 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/framework/tjfiles/TjfilesProperties.java @@ -0,0 +1,27 @@ +package com.jojubanking.boot.module.system.framework.tjfiles; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; +import java.time.Duration; + +@ConfigurationProperties(prefix = "joju.tjfiles") +@Validated +@Data + +public class TjfilesProperties { + /** + * 文件路径 + */ + @NotNull(message = "文件路径不能为空") + private String tjfilespath; + + /** + * ip地址 + */ + @NotNull(message = "ip地址不能为空") + private String ipport; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/job/GetKsinfoDaily.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/job/GetKsinfoDaily.java new file mode 100644 index 0000000..dfdb0f2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/job/GetKsinfoDaily.java @@ -0,0 +1,90 @@ +package com.jojubanking.boot.module.system.job; + +import com.jojubanking.boot.framework.common.util.http.SoapUtil; +import com.jojubanking.boot.framework.common.util.xml.XmlUtil; +import com.jojubanking.boot.framework.quartz.core.handler.JobHandler; +import com.jojubanking.boot.module.system.service.ksinfo.KsInfoService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +@Slf4j +public class GetKsinfoDaily implements JobHandler { + + @Resource + private KsInfoService ksInfoService; + + + @Override + public String execute(String param) throws Exception { + //从his获取科室列表 + String xml = queryAppointDeptMark(); + // 解析报文 + + List> lst = XmlUtil.getPacsRes(xml, "MOP_OutpRegisterDeptQuery"); + + //根据科室列表更新或者插入ks表 + for(int i=0; i ks = lst.get(i); + String KsCode = ks.get("DepartCode").toString(); + String Name = ks.get("DepartName").toString(); + String Departtype = ks.get("DepartType").toString(); + ksInfoService.updateKsInfoPerDay(KsCode, Name, Departtype); + } + + return String.format("刷新科室列表"); + } + + /** + * 部门查询 + * + * @param + * @return + */ + public String queryAppointDeptMark() throws Exception { + StringBuffer str = new StringBuffer(); + str.append(""); + str.append("1"); + str.append(""); + str.append(""); + str.append(""); + str.append(""); + str.append(""); + str.append(""); + str.append(""); + str.append(""); + str.append("0"); + str.append(""); +//420621199809253859 + + String reqXml = requestXml("MOP_OutpRegisterDeptQuery", str.toString()); + String respXml = SoapUtil.soapMethod(reqXml); + log.info("MOP_OutpRegisterDeptQuery:" + reqXml); + log.info("MOP_OutpRegisterDeptQuery:" + respXml); + return respXml; + } + public static String requestXml(String method, String xml) { + StringBuffer str = new StringBuffer(); + str.append(""); + str.append(""); + str.append(""); + str.append(""); + str.append(""); + str.append(xml); + str.append(""); + str.append("]]>"); + str.append(""); + str.append(""); + str.append(""); + return str.toString(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/job/UpdateOrderDaily.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/job/UpdateOrderDaily.java new file mode 100644 index 0000000..3b7d265 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/job/UpdateOrderDaily.java @@ -0,0 +1,31 @@ +package com.jojubanking.boot.module.system.job; + +import com.jojubanking.boot.framework.quartz.core.handler.JobHandler; +import com.jojubanking.boot.module.system.controller.admin.item.vo.ItemExportReqVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.ItemListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.childitem.ChilditemDO; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; +import com.jojubanking.boot.module.system.service.item.ItemService; +import com.jojubanking.boot.module.system.service.order.OrderService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +@Slf4j +public class UpdateOrderDaily implements JobHandler { + @Resource + private OrderService orderService; + + @Override + public String execute(String param) throws Exception { + + orderService.updateOrderAfter24(); + return String.format("删除过期order"); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/job/UpdatePriceDaily.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/job/UpdatePriceDaily.java new file mode 100644 index 0000000..43f19e9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/job/UpdatePriceDaily.java @@ -0,0 +1,186 @@ +package com.jojubanking.boot.module.system.job; + +import com.jojubanking.boot.framework.quartz.core.handler.JobHandler; +import com.jojubanking.boot.module.system.controller.admin.item.vo.ItemExportReqVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.ItemListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.childitem.ChilditemDO; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; +import com.jojubanking.boot.module.system.service.childitem.ChilditemService; +import com.jojubanking.boot.module.system.service.item.ItemService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +@Slf4j +public class UpdatePriceDaily implements JobHandler { + @Resource + private ItemService itemService; + @Resource + private ChilditemService childitemService; + + @Override + public String execute(String param) throws Exception { + + //获取所有的基本体检项目itemno + // 标识(1小项目 2临床 ),分开更新 + String itemnos = ""; + + ItemListReqVO pageReqVO = new ItemListReqVO(); + pageReqVO.setPackageno("666"); + pageReqVO.setItemflag(1); + List listbase = childitemService.getSimpleItemList(pageReqVO); + for(int i=0; i> lstHisBase = new ArrayList<>(); + lstHisBase = itemService.getItemPricexxm(itemnos); + + //根据his的价格和名称重新更新表格 + for(int i=0; i ks = lstHisBase.get(i); + String itemno = ks.get("id").toString(); + String itemname = ks.get("name").toString(); + String itemprice = ks.get("xmdj").toString(); + + ItemDO itemDO = new ItemDO(); + DecimalFormat df = new DecimalFormat("#"); + Double number = Double.parseDouble(itemprice)*100; + itemDO.setItemprice(df.format(number)); + //itemDO.setItemprice(itemprice); + itemDO.setItemname(itemname); + + itemDO.setItemno(itemno); + itemService.updateItemPriceByNo(itemDO); + } + + itemnos = ""; + ItemListReqVO pageReqVO1 = new ItemListReqVO(); + pageReqVO1.setPackageno("666"); + pageReqVO1.setItemflag(2); + List listbase1 = childitemService.getSimpleItemList(pageReqVO1); + for(int i=0; i> lstHisBase1 = new ArrayList<>(); + lstHisBase1 = itemService.getItemPriceLc(itemnos); + + //根据his的价格和名称重新更新表格 + for(int i=0; i ks = lstHisBase1.get(i); + String itemno = ks.get("id").toString(); + String itemname = ks.get("name").toString(); + String itemprice = ks.get("xmdj").toString(); + + ItemDO itemDO = new ItemDO(); + DecimalFormat df = new DecimalFormat("#"); + Double number = Double.parseDouble(itemprice)*100; + itemDO.setItemprice(df.format(number)); + //itemDO.setItemprice(itemprice); + itemDO.setItemname(itemname); + + itemDO.setItemno(itemno); + itemService.updateItemPriceByNo(itemDO); + } + + //获取所有的可选体检项目itemno + // 标识(1小项目 2临床 ),分开更新 + itemnos = ""; + ItemExportReqVO exportReqVO = new ItemExportReqVO(); + exportReqVO.setPackageno("0"); + exportReqVO.setItemflag(1); + List listKx = itemService.getItemList(exportReqVO); + for(int j=0; j> lstHisKx = new ArrayList<>(); + lstHisKx = itemService.getItemPricexxm(itemnos); + + //根据his的价格和名称重新更新表格 + for(int i=0; i ks = lstHisKx.get(i); + String itemno = ks.get("id").toString(); + String itemname = ks.get("name").toString(); + String itemprice = ks.get("xmdj").toString(); + + ItemDO itemDO = new ItemDO(); + DecimalFormat df = new DecimalFormat("#"); + Double number = Double.parseDouble(itemprice)*100; + itemDO.setItemprice(df.format(number)); + //itemDO.setItemprice(itemprice); + itemDO.setItemname(itemname); + + itemDO.setItemno(itemno); + itemService.updateItemPriceByNo(itemDO); + } + + //更新可选临床项目 + itemnos = ""; + ItemExportReqVO exportReqVO1 = new ItemExportReqVO(); + exportReqVO1.setPackageno("0"); + exportReqVO1.setItemflag(2); + List listKx1 = itemService.getItemList(exportReqVO1); + for(int j=0; j> lstHisKx1 = new ArrayList<>(); + lstHisKx1 = itemService.getItemPriceLc(itemnos); + + //根据his的价格和名称重新更新表格 + for(int i=0; i ks = lstHisKx1.get(i); + String itemno = ks.get("id").toString(); + String itemname = ks.get("name").toString(); + String itemprice = ks.get("xmdj").toString(); + + ItemDO itemDO = new ItemDO(); + DecimalFormat df = new DecimalFormat("#"); + Double number = Double.parseDouble(itemprice)*100; + itemDO.setItemprice(df.format(number)); + //itemDO.setItemprice(itemprice); + itemDO.setItemname(itemname); + + itemDO.setItemno(itemno); + itemService.updateItemPriceByNo(itemDO); + } + + return String.format("刷新体检项目价格"); + } + + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/job/package-info.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/job/package-info.java new file mode 100644 index 0000000..0a8f6e3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/job/package-info.java @@ -0,0 +1 @@ +package com.jojubanking.boot.module.system.job; diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/auth/OAuth2ClientRefreshConsumer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/auth/OAuth2ClientRefreshConsumer.java new file mode 100644 index 0000000..1b4fc36 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/auth/OAuth2ClientRefreshConsumer.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.mq.consumer.auth; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.jojubanking.boot.module.system.mq.message.auth.OAuth2ClientRefreshMessage; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2ClientService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link OAuth2ClientRefreshMessage} 的消费者 + * + * @author TW + */ +@Component +@Slf4j +public class OAuth2ClientRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private OAuth2ClientService oauth2ClientService; + + @Override + public void onMessage(OAuth2ClientRefreshMessage message) { + log.info("[onMessage][收到 OAuth2Client 刷新消息]"); + oauth2ClientService.initLocalCache(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/dept/DeptRefreshConsumer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/dept/DeptRefreshConsumer.java new file mode 100644 index 0000000..171be42 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/dept/DeptRefreshConsumer.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.mq.consumer.dept; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.jojubanking.boot.module.system.mq.message.dept.DeptRefreshMessage; +import com.jojubanking.boot.module.system.service.dept.DeptService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link DeptRefreshMessage} 的消费者 + * + * @author TW + */ +@Component +@Slf4j +public class DeptRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private DeptService deptService; + + @Override + public void onMessage(DeptRefreshMessage message) { + log.info("[onMessage][收到 Dept 刷新消息]"); + deptService.initLocalCache(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/deptXq/DeptXqRefreshConsumer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/deptXq/DeptXqRefreshConsumer.java new file mode 100644 index 0000000..6ad79d2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/deptXq/DeptXqRefreshConsumer.java @@ -0,0 +1,30 @@ +package com.jojubanking.boot.module.system.mq.consumer.deptXq; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.jojubanking.boot.module.system.mq.message.dept.DeptRefreshMessage; +import com.jojubanking.boot.module.system.service.dept.DeptService; +import com.jojubanking.boot.module.system.service.deptxq.DeptXqService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link DeptRefreshMessage} 的消费者 + * + * @author TW + */ +@Component +@Slf4j +public class DeptXqRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private DeptXqService deptService; + + @Override + public void onMessage(DeptRefreshMessage message) { + log.info("[onMessage][收到 DeptXq 刷新消息]"); + deptService.initLocalCache(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/mail/MailSendConsumer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/mail/MailSendConsumer.java new file mode 100644 index 0000000..00bce6d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/mail/MailSendConsumer.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.mq.consumer.mail; + +import com.jojubanking.boot.framework.mq.core.stream.AbstractStreamMessageListener; +import com.jojubanking.boot.module.system.mq.message.mail.MailSendMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +// TODO TW:这个暂未实现 +@Component +@Slf4j +public class MailSendConsumer extends AbstractStreamMessageListener { + + @Override + public void onMessage(MailSendMessage message) { + log.info("[onMessage][消息内容({})]", message); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/permission/MenuRefreshConsumer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/permission/MenuRefreshConsumer.java new file mode 100644 index 0000000..b1e88bf --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/permission/MenuRefreshConsumer.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.mq.consumer.permission; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.jojubanking.boot.module.system.mq.message.permission.MenuRefreshMessage; +import com.jojubanking.boot.module.system.service.permission.MenuService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link MenuRefreshMessage} 的消费者 + * + * @author TW + */ +@Component +@Slf4j +public class MenuRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private MenuService menuService; + + @Override + public void onMessage(MenuRefreshMessage message) { + log.info("[onMessage][收到 Menu 刷新消息]"); + menuService.initLocalCache(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/permission/RoleMenuRefreshConsumer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/permission/RoleMenuRefreshConsumer.java new file mode 100644 index 0000000..ca6d543 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/permission/RoleMenuRefreshConsumer.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.mq.consumer.permission; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.jojubanking.boot.module.system.mq.message.permission.RoleMenuRefreshMessage; +import com.jojubanking.boot.module.system.service.permission.PermissionService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link RoleMenuRefreshMessage} 的消费者 + * + * @author TW + */ +@Component +@Slf4j +public class RoleMenuRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private PermissionService permissionService; + + @Override + public void onMessage(RoleMenuRefreshMessage message) { + log.info("[onMessage][收到 Role 与 Menu 的关联刷新消息]"); + permissionService.initLocalCache(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/permission/RoleRefreshConsumer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/permission/RoleRefreshConsumer.java new file mode 100644 index 0000000..9814ad2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/permission/RoleRefreshConsumer.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.mq.consumer.permission; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.jojubanking.boot.module.system.mq.message.permission.RoleRefreshMessage; +import com.jojubanking.boot.module.system.service.permission.RoleService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link RoleRefreshMessage} 的消费者 + * + * @author TW + */ +@Component +@Slf4j +public class RoleRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private RoleService roleService; + + @Override + public void onMessage(RoleRefreshMessage message) { + log.info("[onMessage][收到 Role 刷新消息]"); + roleService.initLocalCache(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/permission/UserRoleRefreshConsumer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/permission/UserRoleRefreshConsumer.java new file mode 100644 index 0000000..cde6746 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/permission/UserRoleRefreshConsumer.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.mq.consumer.permission; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.jojubanking.boot.module.system.mq.message.permission.UserRoleRefreshMessage; +import com.jojubanking.boot.module.system.service.permission.PermissionService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link UserRoleRefreshMessage} 的消费者 + * + * @author TW + */ +@Component +@Slf4j +public class UserRoleRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private PermissionService permissionService; + + @Override + public void onMessage(UserRoleRefreshMessage message) { + log.info("[onMessage][收到 User 与 Role 的关联刷新消息]"); + permissionService.initLocalCache(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/sensitiveword/SensitiveWordRefreshConsumer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/sensitiveword/SensitiveWordRefreshConsumer.java new file mode 100644 index 0000000..41ad73a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/sensitiveword/SensitiveWordRefreshConsumer.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.mq.consumer.sensitiveword; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.jojubanking.boot.module.system.mq.message.sensitiveword.SensitiveWordRefreshMessage; +import com.jojubanking.boot.module.system.service.sensitiveword.SensitiveWordService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SensitiveWordRefreshMessage} 的消费者 + * + * @author TW + */ +@Component +@Slf4j +public class SensitiveWordRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private SensitiveWordService sensitiveWordService; + + @Override + public void onMessage(SensitiveWordRefreshMessage message) { + log.info("[onMessage][收到 SensitiveWord 刷新消息]"); + sensitiveWordService.initLocalCache(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/sms/SmsChannelRefreshConsumer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/sms/SmsChannelRefreshConsumer.java new file mode 100644 index 0000000..fe04091 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/sms/SmsChannelRefreshConsumer.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.mq.consumer.sms; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.jojubanking.boot.module.system.mq.message.sms.SmsChannelRefreshMessage; +import com.jojubanking.boot.module.system.service.sms.SmsChannelService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SmsChannelRefreshMessage} 的消费者 + * + * @author TW + */ +@Component +@Slf4j +public class SmsChannelRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private SmsChannelService smsChannelService; + + @Override + public void onMessage(SmsChannelRefreshMessage message) { + log.info("[onMessage][收到 SmsChannel 刷新消息]"); + smsChannelService.initSmsClients(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/sms/SmsSendConsumer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/sms/SmsSendConsumer.java new file mode 100644 index 0000000..088b1b8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/sms/SmsSendConsumer.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.mq.consumer.sms; + +import com.jojubanking.boot.module.system.mq.message.sms.SmsSendMessage; +import com.jojubanking.boot.module.system.service.sms.SmsSendService; +import com.jojubanking.boot.framework.mq.core.stream.AbstractStreamMessageListener; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SmsSendMessage} 的消费者 + * + * @author zzf + */ +@Component +@Slf4j +public class SmsSendConsumer extends AbstractStreamMessageListener { + + @Resource + private SmsSendService smsSendService; + + @Override + public void onMessage(SmsSendMessage message) { + log.info("[onMessage][消息内容({})]", message); + smsSendService.doSendSms(message); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.java new file mode 100644 index 0000000..5a20331 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.java @@ -0,0 +1,29 @@ +package com.jojubanking.boot.module.system.mq.consumer.sms; + +import com.jojubanking.boot.module.system.mq.message.sms.SmsTemplateRefreshMessage; +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessageListener; +import com.jojubanking.boot.module.system.service.sms.SmsTemplateService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 针对 {@link SmsTemplateRefreshMessage} 的消费者 + * + * @author TW + */ +@Component +@Slf4j +public class SmsTemplateRefreshConsumer extends AbstractChannelMessageListener { + + @Resource + private SmsTemplateService smsTemplateService; + + @Override + public void onMessage(SmsTemplateRefreshMessage message) { + log.info("[onMessage][收到 SmsTemplate 刷新消息]"); + smsTemplateService.initLocalCache(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/auth/OAuth2ClientRefreshMessage.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/auth/OAuth2ClientRefreshMessage.java new file mode 100644 index 0000000..a3d30d8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/auth/OAuth2ClientRefreshMessage.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.mq.message.auth; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * OAuth 2.0 客户端的数据刷新 Message + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class OAuth2ClientRefreshMessage extends AbstractChannelMessage { + + @Override + public String getChannel() { + return "system.oauth2-client.refresh"; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/dept/DeptRefreshMessage.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/dept/DeptRefreshMessage.java new file mode 100644 index 0000000..4b36ce6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/dept/DeptRefreshMessage.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.mq.message.dept; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 部门数据刷新 Message + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DeptRefreshMessage extends AbstractChannelMessage { + + @Override + public String getChannel() { + return "system.dept.refresh"; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/deptXq/DeptXqRefreshMessage.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/deptXq/DeptXqRefreshMessage.java new file mode 100644 index 0000000..2215209 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/deptXq/DeptXqRefreshMessage.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.mq.message.deptXq; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 部门数据刷新 Message + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DeptXqRefreshMessage extends AbstractChannelMessage { + + @Override + public String getChannel() { + return "system.deptXq.refresh"; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/mail/MailSendMessage.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/mail/MailSendMessage.java new file mode 100644 index 0000000..cd739ee --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/mail/MailSendMessage.java @@ -0,0 +1,48 @@ +package com.jojubanking.boot.module.system.mq.message.mail; + +import com.jojubanking.boot.framework.mq.core.stream.AbstractStreamMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +/** + * 邮箱发送消息 + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class MailSendMessage extends AbstractStreamMessage { + + /** + * 邮箱地址 + */ + @NotNull(message = "邮箱地址不能为空") + private String address; + /** + * 短信模板编号 + */ + @NotNull(message = "短信模板编号不能为空") + private String templateCode; + /** + * 短信模板参数 + */ + private Map templateParams; + + /** + * 用户编号,允许空 + */ + private Integer userId; + /** + * 用户类型,允许空 + */ + private Integer userType; + + @Override + public String getStreamKey() { + return "system.mail.send"; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/permission/MenuRefreshMessage.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/permission/MenuRefreshMessage.java new file mode 100644 index 0000000..0b58530 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/permission/MenuRefreshMessage.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.mq.message.permission; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 菜单数据刷新 Message + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class MenuRefreshMessage extends AbstractChannelMessage { + + @Override + public String getChannel() { + return "system.menu.refresh"; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/permission/RoleMenuRefreshMessage.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/permission/RoleMenuRefreshMessage.java new file mode 100644 index 0000000..d1d36d3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/permission/RoleMenuRefreshMessage.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.mq.message.permission; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 角色与菜单数据刷新 Message + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class RoleMenuRefreshMessage extends AbstractChannelMessage { + + @Override + public String getChannel() { + return "system.role-menu.refresh"; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/permission/RoleRefreshMessage.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/permission/RoleRefreshMessage.java new file mode 100644 index 0000000..4210641 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/permission/RoleRefreshMessage.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.mq.message.permission; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 角色数据刷新 Message + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class RoleRefreshMessage extends AbstractChannelMessage { + + @Override + public String getChannel() { + return "system.role.refresh"; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/permission/UserRoleRefreshMessage.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/permission/UserRoleRefreshMessage.java new file mode 100644 index 0000000..60a50a7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/permission/UserRoleRefreshMessage.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.mq.message.permission; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户与角色的数据刷新 Message + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class UserRoleRefreshMessage extends AbstractChannelMessage { + + @Override + public String getChannel() { + return "system.user-role.refresh"; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/sensitiveword/SensitiveWordRefreshMessage.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/sensitiveword/SensitiveWordRefreshMessage.java new file mode 100644 index 0000000..053c96d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/sensitiveword/SensitiveWordRefreshMessage.java @@ -0,0 +1,19 @@ +package com.jojubanking.boot.module.system.mq.message.sensitiveword; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 敏感词的刷新 Message + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class SensitiveWordRefreshMessage extends AbstractChannelMessage { + + @Override + public String getChannel() { + return "system.sensitive-word.refresh"; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/sms/SmsChannelRefreshMessage.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/sms/SmsChannelRefreshMessage.java new file mode 100644 index 0000000..c0965a6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/sms/SmsChannelRefreshMessage.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.mq.message.sms; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 短信渠道的数据刷新 Message + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class SmsChannelRefreshMessage extends AbstractChannelMessage { + + @Override + public String getChannel() { + return "system.sms-channel.refresh"; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/sms/SmsSendMessage.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/sms/SmsSendMessage.java new file mode 100644 index 0000000..a868e92 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/sms/SmsSendMessage.java @@ -0,0 +1,52 @@ +package com.jojubanking.boot.module.system.mq.message.sms; + +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.mq.core.stream.AbstractStreamMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 短信发送消息 + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +public class SmsSendMessage extends AbstractStreamMessage { + + /** + * 短信日志编号 + */ + @NotNull(message = "短信日志编号不能为空") + private Long logId; + /** + * 手机号 + */ + @NotNull(message = "手机号不能为空") + private String mobile; + /** + * 短信渠道编号 + */ + @NotNull(message = "短信渠道编号不能为空") + private Long channelId; + /** + * 短信 API 的模板编号 + */ + @NotNull(message = "短信 API 的模板编号不能为空") + private String apiTemplateId; + /** + * 短信模板参数 + */ + private List> templateParams; + + @Override + public String getStreamKey() { + return "system.sms.send"; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/sms/SmsTemplateRefreshMessage.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/sms/SmsTemplateRefreshMessage.java new file mode 100644 index 0000000..e1d54bb --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/message/sms/SmsTemplateRefreshMessage.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.mq.message.sms; + +import com.jojubanking.boot.framework.mq.core.pubsub.AbstractChannelMessage; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 短信模板的数据刷新 Message + * + * @author TW + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class SmsTemplateRefreshMessage extends AbstractChannelMessage { + + @Override + public String getChannel() { + return "system.sms-template.refresh"; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/auth/OAuth2ClientProducer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/auth/OAuth2ClientProducer.java new file mode 100644 index 0000000..278c4d7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/auth/OAuth2ClientProducer.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.system.mq.producer.auth; + +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import com.jojubanking.boot.module.system.mq.message.auth.OAuth2ClientRefreshMessage; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * OAuth 2.0 客户端相关消息的 Producer + */ +@Component +public class OAuth2ClientProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送 {@link OAuth2ClientRefreshMessage} 消息 + */ + public void sendOAuth2ClientRefreshMessage() { + OAuth2ClientRefreshMessage message = new OAuth2ClientRefreshMessage(); + redisMQTemplate.send(message); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/dept/DeptProducer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/dept/DeptProducer.java new file mode 100644 index 0000000..3eda994 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/dept/DeptProducer.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.system.mq.producer.dept; + +import com.jojubanking.boot.module.system.mq.message.dept.DeptRefreshMessage; +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Dept 部门相关消息的 Producer + */ +@Component +public class DeptProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送 {@link DeptRefreshMessage} 消息 + */ + public void sendDeptRefreshMessage() { + DeptRefreshMessage message = new DeptRefreshMessage(); + redisMQTemplate.send(message); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/deptXq/DeptXqProducer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/deptXq/DeptXqProducer.java new file mode 100644 index 0000000..78578a4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/deptXq/DeptXqProducer.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.system.mq.producer.deptXq; + +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import com.jojubanking.boot.module.system.mq.message.dept.DeptRefreshMessage; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Dept 部门相关消息的 Producer + */ +@Component +public class DeptXqProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送 {@link DeptRefreshMessage} 消息 + */ + public void sendDeptRefreshMessage() { + DeptRefreshMessage message = new DeptRefreshMessage(); + redisMQTemplate.send(message); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/package-info.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/package-info.java new file mode 100644 index 0000000..5776d73 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.jojubanking.boot.module.system.mq.producer; diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/permission/MenuProducer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/permission/MenuProducer.java new file mode 100644 index 0000000..ac4ebfe --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/permission/MenuProducer.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.system.mq.producer.permission; + +import com.jojubanking.boot.module.system.mq.message.permission.MenuRefreshMessage; +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Menu 菜单相关消息的 Producer + */ +@Component +public class MenuProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送 {@link MenuRefreshMessage} 消息 + */ + public void sendMenuRefreshMessage() { + MenuRefreshMessage message = new MenuRefreshMessage(); + redisMQTemplate.send(message); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/permission/PermissionProducer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/permission/PermissionProducer.java new file mode 100644 index 0000000..091056a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/permission/PermissionProducer.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.module.system.mq.producer.permission; + +import com.jojubanking.boot.module.system.mq.message.permission.RoleMenuRefreshMessage; +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import com.jojubanking.boot.module.system.mq.message.permission.UserRoleRefreshMessage; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Permission 权限相关消息的 Producer + */ +@Component +public class PermissionProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送 {@link RoleMenuRefreshMessage} 消息 + */ + public void sendRoleMenuRefreshMessage() { + RoleMenuRefreshMessage message = new RoleMenuRefreshMessage(); + redisMQTemplate.send(message); + } + + /** + * 发送 {@link UserRoleRefreshMessage} 消息 + */ + public void sendUserRoleRefreshMessage() { + UserRoleRefreshMessage message = new UserRoleRefreshMessage(); + redisMQTemplate.send(message); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/permission/RoleProducer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/permission/RoleProducer.java new file mode 100644 index 0000000..841f852 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/permission/RoleProducer.java @@ -0,0 +1,28 @@ +package com.jojubanking.boot.module.system.mq.producer.permission; + +import com.jojubanking.boot.module.system.mq.message.permission.RoleRefreshMessage; +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * Role 角色相关消息的 Producer + * + * @author TW + */ +@Component +public class RoleProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送 {@link RoleRefreshMessage} 消息 + */ + public void sendRoleRefreshMessage() { + RoleRefreshMessage message = new RoleRefreshMessage(); + redisMQTemplate.send(message); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/sensitiveword/SensitiveWordProducer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/sensitiveword/SensitiveWordProducer.java new file mode 100644 index 0000000..77d04d6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/sensitiveword/SensitiveWordProducer.java @@ -0,0 +1,26 @@ +package com.jojubanking.boot.module.system.mq.producer.sensitiveword; + +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import com.jojubanking.boot.module.system.mq.message.sensitiveword.SensitiveWordRefreshMessage; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 敏感词相关的 Producer + */ +@Component +public class SensitiveWordProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送 {@link SensitiveWordRefreshMessage} 消息 + */ + public void sendSensitiveWordRefreshMessage() { + SensitiveWordRefreshMessage message = new SensitiveWordRefreshMessage(); + redisMQTemplate.send(message); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/sms/SmsProducer.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/sms/SmsProducer.java new file mode 100644 index 0000000..47553ee --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/mq/producer/sms/SmsProducer.java @@ -0,0 +1,59 @@ +package com.jojubanking.boot.module.system.mq.producer.sms; + +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.module.system.mq.message.sms.SmsChannelRefreshMessage; +import com.jojubanking.boot.module.system.mq.message.sms.SmsSendMessage; +import com.jojubanking.boot.module.system.mq.message.sms.SmsTemplateRefreshMessage; +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * Sms 短信相关消息的 Producer + * + * @author zzf + * @date 2021/3/9 16:35 + */ +@Slf4j +@Component +public class SmsProducer { + + @Resource + private RedisMQTemplate redisMQTemplate; + + /** + * 发送 {@link SmsChannelRefreshMessage} 消息 + */ + public void sendSmsChannelRefreshMessage() { + SmsChannelRefreshMessage message = new SmsChannelRefreshMessage(); + redisMQTemplate.send(message); + } + + /** + * 发送 {@link SmsTemplateRefreshMessage} 消息 + */ + public void sendSmsTemplateRefreshMessage() { + SmsTemplateRefreshMessage message = new SmsTemplateRefreshMessage(); + redisMQTemplate.send(message); + } + + /** + * 发送 {@link SmsSendMessage} 消息 + * + * @param logId 短信日志编号 + * @param mobile 手机号 + * @param channelId 渠道编号 + * @param apiTemplateId 短信模板编号 + * @param templateParams 短信模板参数 + */ + public void sendSmsSendMessage(Long logId, String mobile, + Long channelId, String apiTemplateId, List> templateParams) { + SmsSendMessage message = new SmsSendMessage().setLogId(logId).setMobile(mobile); + message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams); + redisMQTemplate.send(message); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/package-info.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/package-info.java new file mode 100644 index 0000000..514bf6a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/package-info.java @@ -0,0 +1,8 @@ +/** + * system 模块下,我们放通用业务,支撑上层的核心业务。 + * 例如说:用户、部门、权限、数据字典等等 + * + * 1. Controller URL:以 /system/ 开头,避免和其它 Module 冲突 + * 2. DataObject 表名:以 system_ 开头,方便在数据库中区分 + */ +package com.jojubanking.boot.module.system; diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/auth/AdminAuthService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/auth/AdminAuthService.java new file mode 100644 index 0000000..94f165c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/auth/AdminAuthService.java @@ -0,0 +1,74 @@ +package com.jojubanking.boot.module.system.service.auth; + +import com.jojubanking.boot.module.system.controller.admin.auth.vo.*; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; + +import javax.validation.Valid; + +/** + * 管理后台的认证 Service 接口 + * + * 提供用户的登录、登出的能力 + * + * @author TW + */ +public interface AdminAuthService { + + /** + * 验证账号 + 密码。如果通过,则返回用户 + * + * @param username 账号 + * @param password 密码 + * @return 用户 + */ + AdminUserDO authenticate(String username, String password); + + /** + * 账号登录 + * + * @param reqVO 登录信息 + * @return 登录结果 + */ + AuthLoginRespVO login(@Valid AuthLoginReqVO reqVO); + + /** + * 基于 token 退出登录 + * + * @param token token + * @param logType 登出类型 + */ + void logout(String token, Integer logType); + + /** + * 短信验证码发送 + * + * @param reqVO 发送请求 + */ + void sendSmsCode(AuthSmsSendReqVO reqVO); + + /** + * 短信登录 + * + * @param reqVO 登录信息 + * @return 登录结果 + */ + AuthLoginRespVO smsLogin(AuthSmsLoginReqVO reqVO) ; + + /** + * 社交快捷登录,使用 code 授权码 + * + * @param reqVO 登录信息 + * @return 登录结果 + */ + AuthLoginRespVO socialLogin(@Valid AuthSocialLoginReqVO reqVO); + + /** + * 刷新访问令牌 + * + * @param refreshToken 刷新令牌 + * @return 登录结果 + */ + AuthLoginRespVO refreshToken(String refreshToken); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/auth/AdminAuthServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/auth/AdminAuthServiceImpl.java new file mode 100644 index 0000000..4aa558f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/auth/AdminAuthServiceImpl.java @@ -0,0 +1,251 @@ +package com.jojubanking.boot.module.system.service.auth; + +import cn.hutool.core.util.ObjectUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.util.monitor.TracerUtils; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import com.jojubanking.boot.framework.common.util.validation.ValidationUtils; +import com.jojubanking.boot.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.jojubanking.boot.module.system.api.sms.SmsCodeApi; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.*; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.*; +import com.jojubanking.boot.module.system.convert.auth.AuthConvert; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.enums.logger.LoginLogTypeEnum; +import com.jojubanking.boot.module.system.enums.logger.LoginResultEnum; +import com.jojubanking.boot.module.system.enums.oauth2.OAuth2ClientConstants; +import com.jojubanking.boot.module.system.enums.sms.SmsSceneEnum; +import com.jojubanking.boot.module.system.service.common.CaptchaService; +import com.jojubanking.boot.module.system.service.logger.LoginLogService; +import com.jojubanking.boot.module.system.service.member.MemberService; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2TokenService; +import com.jojubanking.boot.module.system.service.social.SocialUserService; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.Objects; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.framework.common.util.servlet.ServletUtils.getClientIP; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * Auth Service 实现类 + * + * @author TW + */ +@Service +@Slf4j +public class AdminAuthServiceImpl implements AdminAuthService { + + @Resource + private AdminUserService userService; + @Resource + private CaptchaService captchaService; + @Resource + private LoginLogService loginLogService; + @Resource + private OAuth2TokenService oauth2TokenService; + @Resource + private SocialUserService socialUserService; + @Resource + private MemberService memberService; + + @Resource + private Validator validator; + + @Resource + private SmsCodeApi smsCodeApi; + + @Override + public AdminUserDO authenticate(String username, String password) { + final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_USERNAME; + // 校验账号是否存在 + AdminUserDO user = userService.getUserByUsername(username); + if (user == null) { + createLoginLog(null, username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + if (!userService.isPasswordMatch(password, user.getPassword())) { + createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); + throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + } + // 校验是否禁用 + if (ObjectUtil.notEqual(user.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { + createLoginLog(user.getId(), username, logTypeEnum, LoginResultEnum.USER_DISABLED); + throw exception(AUTH_LOGIN_USER_DISABLED); + } + return user; + } + + @Override + public AuthLoginRespVO login(AuthLoginReqVO reqVO) { + // 判断验证码是否正确 + verifyCaptcha(reqVO); + + // 使用账号密码,进行登录 + AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword()); + + // 如果 socialType 非空,说明需要绑定社交用户 + if (reqVO.getSocialType() != null) { + socialUserService.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(), + reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState())); + } + + // 创建 Token 令牌,记录登录日志 + return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME); + } + + @Override + public void sendSmsCode(AuthSmsSendReqVO reqVO) { + // 登录场景,验证是否存在 + if (userService.getUserByMobile(reqVO.getMobile()) == null) { + throw exception(AUTH_MOBILE_NOT_EXISTS); + } + // 发送验证码 + smsCodeApi.sendSmsCode(AuthConvert.INSTANCE.convert(reqVO).setCreateIp(getClientIP())); + } + + @Override + public AuthLoginRespVO smsLogin(AuthSmsLoginReqVO reqVO) { + // 校验验证码 + smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.ADMIN_MEMBER_LOGIN.getScene(), getClientIP())); + + // 获得用户信息 + AdminUserDO user = userService.getUserByMobile(reqVO.getMobile()); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + + // 创建 Token 令牌,记录登录日志 + return createTokenAfterLoginSuccess(user.getId(), reqVO.getMobile(), LoginLogTypeEnum.LOGIN_MOBILE); + } + + @VisibleForTesting + void verifyCaptcha(AuthLoginReqVO reqVO) { + // 如果验证码关闭,则不进行校验 + if (!captchaService.isCaptchaEnable()) { + return; + } + // 校验验证码 + ValidationUtils.validate(validator, reqVO, AuthLoginReqVO.CodeEnableGroup.class); + // 验证码不存在 + final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_USERNAME; + String code = captchaService.getCaptchaCode(reqVO.getUuid()); + if (code == null) { + // 创建登录失败日志(验证码不存在) + createLoginLog(null, reqVO.getUsername(), logTypeEnum, LoginResultEnum.CAPTCHA_NOT_FOUND); + throw exception(AUTH_LOGIN_CAPTCHA_NOT_FOUND); + } + // 验证码不正确 + if (!code.equals(reqVO.getCode())) { + // 创建登录失败日志(验证码不正确) + createLoginLog(null, reqVO.getUsername(), logTypeEnum, LoginResultEnum.CAPTCHA_CODE_ERROR); + throw exception(AUTH_LOGIN_CAPTCHA_CODE_ERROR); + } + // 正确,所以要删除下验证码 + captchaService.deleteCaptchaCode(reqVO.getUuid()); + } + + private void createLoginLog(Long userId, String username, + LoginLogTypeEnum logTypeEnum, LoginResultEnum loginResult) { + // 插入登录日志 + LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); + reqDTO.setLogType(logTypeEnum.getType()); + reqDTO.setTraceId(TracerUtils.getTraceId()); + reqDTO.setUserId(userId); + reqDTO.setUserType(getUserType().getValue()); + reqDTO.setUsername(username); + reqDTO.setUserAgent(ServletUtils.getUserAgent()); + reqDTO.setUserIp(ServletUtils.getClientIP()); + reqDTO.setResult(loginResult.getResult()); + loginLogService.createLoginLog(reqDTO); + // 更新最后登录时间 + if (userId != null && Objects.equals(LoginResultEnum.SUCCESS.getResult(), loginResult.getResult())) { + userService.updateUserLogin(userId, ServletUtils.getClientIP()); + } + } + + @Override + public AuthLoginRespVO socialLogin(AuthSocialLoginReqVO reqVO) { + // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号 + Long userId = socialUserService.getBindUserId(UserTypeEnum.ADMIN.getValue(), reqVO.getType(), + reqVO.getCode(), reqVO.getState()); + if (userId == null) { + throw exception(AUTH_THIRD_LOGIN_NOT_BIND); + } + + // 获得用户 + AdminUserDO user = userService.getUser(userId); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + + // 创建 Token 令牌,记录登录日志 + return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL); + } + + @Override + public AuthLoginRespVO refreshToken(String refreshToken) { + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, OAuth2ClientConstants.CLIENT_ID_DEFAULT); + return AuthConvert.INSTANCE.convert(accessTokenDO); + } + + private AuthLoginRespVO createTokenAfterLoginSuccess(Long userId, String username, LoginLogTypeEnum logType) { + // 插入登陆日志 + createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS); + // 创建访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, getUserType().getValue(), + OAuth2ClientConstants.CLIENT_ID_DEFAULT, null); + // 构建返回结果 + return AuthConvert.INSTANCE.convert(accessTokenDO); + } + + @Override + public void logout(String token, Integer logType) { + // 删除访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.removeAccessToken(token); + if (accessTokenDO == null) { + return; + } + // 删除成功,则记录登出日志 + createLogoutLog(accessTokenDO.getUserId(), accessTokenDO.getUserType(), logType); + } + + private void createLogoutLog(Long userId, Integer userType, Integer logType) { + LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); + reqDTO.setLogType(logType); + reqDTO.setTraceId(TracerUtils.getTraceId()); + reqDTO.setUserId(userId); + reqDTO.setUserType(userType); + if (ObjectUtil.equal(getUserType().getValue(), userType)) { + reqDTO.setUsername(getUsername(userId)); + } else { + reqDTO.setUsername(memberService.getMemberUserMobile(userId)); + } + reqDTO.setUserAgent(ServletUtils.getUserAgent()); + reqDTO.setUserIp(ServletUtils.getClientIP()); + reqDTO.setResult(LoginResultEnum.SUCCESS.getResult()); + loginLogService.createLoginLog(reqDTO); + } + + private String getUsername(Long userId) { + if (userId == null) { + return null; + } + AdminUserDO user = userService.getUser(userId); + return user != null ? user.getUsername() : null; + } + + private UserTypeEnum getUserType() { + return UserTypeEnum.ADMIN; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/authgz/GzAuthService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/authgz/GzAuthService.java new file mode 100644 index 0000000..6acd1c3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/authgz/GzAuthService.java @@ -0,0 +1,36 @@ +package com.jojubanking.boot.module.system.service.authgz; + +import com.jojubanking.boot.module.system.controller.admin.auth.vo.*; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.*; +import com.jojubanking.boot.module.system.controller.app.auth.vo.AppAuthLoginRespVO; +import com.jojubanking.boot.module.system.controller.app.auth.vo.AppAuthSocialLoginReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; + +import javax.validation.Valid; + +public interface GzAuthService { + + /** + * 基于 token 退出登录 + * + * @param token token + * @param logType 登出类型 + */ +// void logout(String token, Integer logType); + + /** + * 社交快捷登录,使用 code 授权码 + * + * @param reqVO 登录信息 + * @return 登录结果 + */ + AppAuthLoginRespVO socialLogin(@Valid AppAuthSocialLoginReqVO reqVO); + + /** + * 刷新访问令牌 + * + * @param refreshToken 刷新令牌 + * @return 登录结果 + */ + AppAuthLoginRespVO refreshToken(String refreshToken); +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/authgz/GzAuthServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/authgz/GzAuthServiceImpl.java new file mode 100644 index 0000000..a1a8542 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/authgz/GzAuthServiceImpl.java @@ -0,0 +1,186 @@ +package com.jojubanking.boot.module.system.service.authgz; + +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage; +import me.chanjar.weixin.mp.api.WxMpStoreService; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.util.monitor.TracerUtils; +import com.jojubanking.boot.framework.common.util.servlet.ServletUtils; +import com.jojubanking.boot.framework.common.util.validation.ValidationUtils; +import com.jojubanking.boot.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.jojubanking.boot.module.system.api.oauth2.OAuth2TokenApi; +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO; +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; +import com.jojubanking.boot.module.system.api.sms.SmsCodeApi; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.*; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.*; +import com.jojubanking.boot.module.system.controller.app.auth.vo.AppAuthLoginRespVO; +import com.jojubanking.boot.module.system.controller.app.auth.vo.AppAuthSocialLoginReqVO; +import com.jojubanking.boot.module.system.convert.auth.AuthConvert; +import com.jojubanking.boot.module.system.convert.auth.AuthGzConvert; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.dal.dataobject.userinfo.UserInfoDO; +import com.jojubanking.boot.module.system.enums.logger.LoginLogTypeEnum; +import com.jojubanking.boot.module.system.enums.logger.LoginResultEnum; +import com.jojubanking.boot.module.system.enums.oauth2.OAuth2ClientConstants; +import com.jojubanking.boot.module.system.enums.sms.SmsSceneEnum; +import com.jojubanking.boot.module.system.service.common.CaptchaService; +import com.jojubanking.boot.module.system.service.logger.LoginLogService; +import com.jojubanking.boot.module.system.service.member.MemberService; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2TokenService; +import com.jojubanking.boot.module.system.service.social.SocialUserService; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import com.google.common.annotations.VisibleForTesting; +import com.jojubanking.boot.module.system.service.userinfo.UserInfoService; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; +import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; +import me.chanjar.weixin.mp.bean.result.WxMpUser; +import me.chanjar.weixin.mp.bean.store.WxMpStoreBaseInfo; +import me.chanjar.weixin.mp.bean.store.WxMpStoreInfo; +import me.chanjar.weixin.mp.bean.store.WxMpStoreListResult; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.validation.Validator; +import java.util.List; +import java.util.Objects; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.framework.common.util.servlet.ServletUtils.getClientIP; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * @ClassName: GzAuthServiceImpl + * @Description: + * @Author T.W + * @Date 2023/3/14 + * @Version 1.0 + */ +@Service +@Slf4j +public class GzAuthServiceImpl implements GzAuthService{ + + @Resource + private OAuth2TokenApi oauth2TokenApi; + @Resource + private UserInfoService userService; + + //joju微信APPID + //public static final String WX_APP_ID="wx7a0981df44f66897"; + + public static final String WX_APP_ID="wx429a10e7e3bcdfad"; + + //joju微信AppSecret + //public static final String WX_SECRET="4c329fa399103dd27edd84617c620e8e"; + public static final String WX_SECRET="8ec92f632bcf449b2cfb4673ecce8789"; + + @Override + public AppAuthLoginRespVO socialLogin(AppAuthSocialLoginReqVO reqVO) { + + //通过微信api 获取用户信息 + +// WxMpStoreService wxMpStoreService; +// +// WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage(); +// wxMpConfigStorage.setAppId(WX_APP_ID);//你的公众号id +// wxMpConfigStorage.setSecret(WX_SECRET);//你的公众号密匙 +// WxMpServiceImpl wxMpService = new WxMpServiceImpl(); +// wxMpService.setWxMpConfigStorage(wxMpConfigStorage); +// +// WxMpOAuth2AccessToken wxMpOAuth2AccessToken = null; +// try { +// wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(reqVO.getCode()); +// } catch (WxErrorException e) { +// e.printStackTrace(); +// } +// +// // 3.进一步获取用户信息 +// String openId = wxMpOAuth2AccessToken.getOpenId(); +// log.info("openid="+openId); +// +// // 拿到用户的基本信息 +// WxMpUser wxMpUser=null; +// try { +// wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null); +// log.info(wxMpUser.toString()); +// +// } catch (WxErrorException e) { +// e.printStackTrace(); +// } + + String mobile = "13857185597"; + String userIp = "127.0.0.1"; + String openid = "123456789"; + + // 校验账号是否存在 + UserInfoDO user = userService.getUserByMobile(mobile); + if (user == null) { + //createLoginLog(null, mobile, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS); +// throw exception(AUTH_LOGIN_BAD_CREDENTIALS); + //注册用户 + // 获得获得注册用户 + user = userService.createUserIfAbsent(mobile, userIp); + } + + // 创建 Token 令牌,记录登录日志 + return createTokenAfterLoginSuccess(user, LoginLogTypeEnum.LOGIN_SOCIAL); + } + + @Override + public AppAuthLoginRespVO refreshToken(String refreshToken) { + OAuth2AccessTokenRespDTO accessTokenDO = oauth2TokenApi.refreshAccessToken(refreshToken, OAuth2ClientConstants.CLIENT_ID_DEFAULT); + return AuthGzConvert.INSTANCE.convert(accessTokenDO); + } + + private AppAuthLoginRespVO createTokenAfterLoginSuccess(UserInfoDO user, LoginLogTypeEnum logType) { + // 插入登陆日志 +// createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS); + + // 创建访问令牌 + Integer type = 2; + OAuth2AccessTokenCreateReqDTO req = new OAuth2AccessTokenCreateReqDTO(); + req.setUserId(Long.valueOf(1)); + req.setUserType(type); + req.setClientId(OAuth2ClientConstants.CLIENT_ID_DEFAULT); + OAuth2AccessTokenRespDTO accessTokenRespDTO = oauth2TokenApi.createAccessToken(req); + +// OAuth2AccessTokenRespDTO accessTokenDO = oauth2TokenApi.createAccessToken(Long.valueOf(1), Integer.valueOf(2), OAuth2ClientConstants.CLIENT_ID_DEFAULT, null); + // 构建返回结果 + return AuthGzConvert.INSTANCE.convert(accessTokenRespDTO); + } + +// @Override +// public void logout(String token, Integer logType) { +// // 删除访问令牌 +// OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.removeAccessToken(token); +// if (accessTokenDO == null) { +// return; +// } +// // 删除成功,则记录登出日志 +// createLogoutLog(accessTokenDO.getUserId(), accessTokenDO.getUserType(), logType); +// } +// +// private void createLogoutLog(Long userId, Integer userType, Integer logType) { +// LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); +// reqDTO.setLogType(logType); +// reqDTO.setTraceId(TracerUtils.getTraceId()); +// reqDTO.setUserId(userId); +// reqDTO.setUserType(userType); +// if (ObjectUtil.equal(getUserType().getValue(), userType)) { +// reqDTO.setUsername(getUsername(userId)); +// } else { +// reqDTO.setUsername(memberService.getMemberUserMobile(userId)); +// } +// reqDTO.setUserAgent(ServletUtils.getUserAgent()); +// reqDTO.setUserIp(ServletUtils.getClientIP()); +// reqDTO.setResult(LoginResultEnum.SUCCESS.getResult()); +// loginLogService.createLoginLog(reqDTO); +// } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/building/BuildingService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/building/BuildingService.java new file mode 100644 index 0000000..afa801e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/building/BuildingService.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.building; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.building.vo.*; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.building.BuildingDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; + +/** + * 楼层导视 Service 接口 + * + * @author admin + */ +public interface BuildingService { + + /** + * 创建楼层导视 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createBuilding(@Valid BuildingCreateReqVO createReqVO); + + /** + * 更新楼层导视 + * + * @param updateReqVO 更新信息 + */ + void updateBuilding(@Valid BuildingUpdateReqVO updateReqVO); + + /** + * 删除楼层导视 + * + * @param id 编号 + */ + void deleteBuilding(Long id); + + /** + * 获得楼层导视 + * + * @param id 编号 + * @return 楼层导视 + */ + BuildingDO getBuilding(Long id); + + /** + * 获得楼层导视列表 + * + * @param ids 编号 + * @return 楼层导视列表 + */ + List getBuildingList(Collection ids); + + /** + * 筛选楼层导视列表 + * + * @param reqVO 筛选条件请求 VO + * @return 部门列表 + */ + List getSimpleBuildings(BuildingListReqVO reqVO); + + List getBuildingsByParentIdFromCache(Long parentId, boolean recursive); + + /** + * 获得楼层导视分页 + * + * @param pageReqVO 分页查询 + * @return 楼层导视分页 + */ + PageResult getBuildingPage(BuildingPageReqVO pageReqVO); + + /** + * 获得楼层导视列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 楼层导视列表 + */ + List getBuildingList(BuildingExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/building/BuildingServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/building/BuildingServiceImpl.java new file mode 100644 index 0000000..4956960 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/building/BuildingServiceImpl.java @@ -0,0 +1,208 @@ +package com.jojubanking.boot.module.system.service.building; + +import cn.hutool.core.collection.CollUtil; +import com.google.common.collect.Multimap; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.module.system.convert.dept.DeptConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.enums.dept.DeptIdEnum; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.building.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.building.BuildingDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.building.BuildingConvert; +import com.jojubanking.boot.module.system.dal.mysql.building.BuildingMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 楼层导视 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class BuildingServiceImpl implements BuildingService { + + @Resource + private BuildingMapper buildingMapper; + private volatile Multimap parentBuildingCache; + + @Override + public Long createBuilding(BuildingCreateReqVO createReqVO) { + // 校验正确性 + if (createReqVO.getParentId() == null) { + createReqVO.setParentId(DeptIdEnum.ROOT.getId()); + } + + checkCreateOrUpdate(null, createReqVO.getParentId(), createReqVO.getName()); + // 插入 + BuildingDO building = BuildingConvert.INSTANCE.convert(createReqVO); + buildingMapper.insert(building); + // 发送刷新消息 +// deptProducer.sendDeptRefreshMessage(); + // 返回 + return building.getId(); + } + private void checkCreateOrUpdate(Long id, Long parentId, String name) { + // 校验自己存在 + checkBuildingExists(id); + // 校验父部门的有效性 + checkParentBuildingEnable(id, parentId); + // 校验部门名的唯一性 + checkBuildingNameUnique(id, parentId, name); + } + + private void checkParentBuildingEnable(Long id, Long parentId) { + if (parentId == null || DeptIdEnum.ROOT.getId().equals(parentId)) { + return; + } + // 不能设置自己为父部门 + if (parentId.equals(id)) { + throw ServiceExceptionUtil.exception(BUILDING_PARENT_ERROR); + } + // 父岗位不存在 + BuildingDO building = buildingMapper.selectById(parentId); + if (building == null) { + throw ServiceExceptionUtil.exception(BUILDING_PARENT_NOT_EXITS); + } + // 父部门被禁用 + if (!CommonStatusEnum.ENABLE.getStatus().equals(building.getStatus())) { + throw ServiceExceptionUtil.exception(BUILDING_NOT_ENABLE); + } + // 父部门不能是原来的子部门 +// List children = this.getBuildingsByParentIdFromCache(id, true); +// if (children.stream().anyMatch(building1 -> building1.getId().equals(parentId))) { +// throw ServiceExceptionUtil.exception(BUILDING_PARENT_IS_CHILD); +// } + } + @Override + public List getBuildingsByParentIdFromCache(Long parentId, boolean recursive) { + if (parentId == null) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); // TODO TW:待优化,新增缓存,避免每次遍历的计算 + // 递归,简单粗暴 + this.getBuildingsByParentIdFromCache(result, parentId, + recursive ? Integer.MAX_VALUE : 1, // 如果递归获取,则无限;否则,只递归 1 次 + parentBuildingCache); + return result; + } + + /** + * 递归获取所有的子部门,添加到 result 结果 + * + * @param result 结果 + * @param parentId 父编号 + * @param recursiveCount 递归次数 + * @param parentBuildingCache 父部门 Map,使用缓存,避免变化 + */ + private void getBuildingsByParentIdFromCache(List result, Long parentId, int recursiveCount, + Multimap parentBuildingCache) { + // 递归次数为 0,结束! + if (recursiveCount == 0) { + return; + } + // 获得子部门 + Collection depts = parentBuildingCache.get(parentId); + if (CollUtil.isEmpty(depts)) { + return; + } + result.addAll(depts); + // 继续递归 + depts.forEach(dept -> getBuildingsByParentIdFromCache(result, dept.getId(), + recursiveCount - 1, parentBuildingCache)); + } + private void checkBuildingExists(Long id) { + if (id == null) { + return; + } + BuildingDO building = buildingMapper.selectById(id); + if (building == null) { + throw ServiceExceptionUtil.exception(BUILDING_NOT_FOUND); + } + } + + private void checkBuildingNameUnique(Long id, Long parentId, String name) { + BuildingDO menu = buildingMapper.selectByParentIdAndName(parentId, name); + if (menu == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw ServiceExceptionUtil.exception(BUILDING_NAME_DUPLICATE); + } + if (!menu.getId().equals(id)) { + throw ServiceExceptionUtil.exception(BUILDING_NAME_DUPLICATE); + } + } + @Override + public void updateBuilding(BuildingUpdateReqVO updateReqVO) { + + // 校验正确性 + if (updateReqVO.getParentId() == null) { + updateReqVO.setParentId(DeptIdEnum.ROOT.getId()); + } + checkCreateOrUpdate(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getName()); + // 更新部门 + BuildingDO updateObj = BuildingConvert.INSTANCE.convert(updateReqVO); + buildingMapper.updateById(updateObj); + // 发送刷新消息 +// deptProducer.sendDeptRefreshMessage(); + + } + + @Override + public void deleteBuilding(Long id) { + // 校验是否存在 + checkBuildingExists(id); + // 校验是否有子部门 + if (buildingMapper.selectCountByParentId(id) > 0) { + throw ServiceExceptionUtil.exception(BUILDING_EXITS_CHILDREN); + } + // 删除部门 + buildingMapper.deleteById(id); + // 发送刷新消息 +// deptProducer.sendDeptRefreshMessage(); + + } + + private void validateBuildingExists(Long id) { + if (buildingMapper.selectById(id) == null) { + throw exception(BUILDING_NOT_EXISTS); + } + } + + @Override + public BuildingDO getBuilding(Long id) { + return buildingMapper.selectById(id); + } + + @Override + public List getBuildingList(Collection ids) { + return buildingMapper.selectBatchIds(ids); + } + + @Override + public PageResult getBuildingPage(BuildingPageReqVO pageReqVO) { + return buildingMapper.selectPage(pageReqVO); + } + + @Override + public List getBuildingList(BuildingExportReqVO exportReqVO) { + return buildingMapper.selectList(exportReqVO); + } + + @Override + public List getSimpleBuildings(BuildingListReqVO reqVO){ + return buildingMapper.selectList01(reqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/carousel/CarouselService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/carousel/CarouselService.java new file mode 100644 index 0000000..85249f9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/carousel/CarouselService.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.service.carousel; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.carousel.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.carousel.CarouselDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 轮播图 Service 接口 + * + * @author admin + */ +public interface CarouselService { + + /** + * 创建轮播图 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createCarousel(@Valid CarouselCreateReqVO createReqVO); + + /** + * 更新轮播图 + * + * @param updateReqVO 更新信息 + */ + void updateCarousel(@Valid CarouselUpdateReqVO updateReqVO); + + /** + * 删除轮播图 + * + * @param id 编号 + */ + void deleteCarousel(Integer id); + + /** + * 获得轮播图 + * + * @param id 编号 + * @return 轮播图 + */ + CarouselDO getCarousel(Integer id); + + /** + * 获得轮播图列表 + * + * @param ids 编号 + * @return 轮播图列表 + */ + List getCarouselList(Collection ids); + + /** + * 获得轮播图分页 + * + * @param pageReqVO 分页查询 + * @return 轮播图分页 + */ + PageResult getCarouselPage(CarouselPageReqVO pageReqVO); + + /** + * 获得轮播图列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 轮播图列表 + */ + List getCarouselList(CarouselExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/carousel/CarouselServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/carousel/CarouselServiceImpl.java new file mode 100644 index 0000000..782aaae --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/carousel/CarouselServiceImpl.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.carousel; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.carousel.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.carousel.CarouselDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.carousel.CarouselConvert; +import com.jojubanking.boot.module.system.dal.mysql.carousel.CarouselMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 轮播图 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class CarouselServiceImpl implements CarouselService { + + @Resource + private CarouselMapper carouselMapper; + + @Override + public Integer createCarousel(CarouselCreateReqVO createReqVO) { + // 插入 + CarouselDO carousel = CarouselConvert.INSTANCE.convert(createReqVO); + carouselMapper.insert(carousel); + // 返回 + return carousel.getId(); + } + + @Override + public void updateCarousel(CarouselUpdateReqVO updateReqVO) { + // 校验存在 + this.validateCarouselExists(updateReqVO.getId()); + // 更新 + CarouselDO updateObj = CarouselConvert.INSTANCE.convert(updateReqVO); + carouselMapper.updateById(updateObj); + } + + @Override + public void deleteCarousel(Integer id) { + // 校验存在 + this.validateCarouselExists(id); + // 删除 + carouselMapper.deleteById(id); + } + + private void validateCarouselExists(Integer id) { + if (carouselMapper.selectById(id) == null) { + throw exception(CAROUSEL_NOT_EXISTS); + } + } + + @Override + public CarouselDO getCarousel(Integer id) { + return carouselMapper.selectById(id); + } + + @Override + public List getCarouselList(Collection ids) { + return carouselMapper.selectBatchIds(ids); + } + + @Override + public PageResult getCarouselPage(CarouselPageReqVO pageReqVO) { + return carouselMapper.selectPage(pageReqVO); + } + + @Override + public List getCarouselList(CarouselExportReqVO exportReqVO) { + return carouselMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/childitem/ChilditemService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/childitem/ChilditemService.java new file mode 100644 index 0000000..be2ed98 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/childitem/ChilditemService.java @@ -0,0 +1,73 @@ +package com.jojubanking.boot.module.system.service.childitem; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.*; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.ItemListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.childitem.ChilditemDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; + +/** + * 检查项目子 Service 接口 + * + * @author admin + */ +public interface ChilditemService { + + /** + * 创建检查项目子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createChilditem(@Valid ChilditemCreateReqVO createReqVO); + + /** + * 更新检查项目子 + * + * @param updateReqVO 更新信息 + */ + void updateChilditem(@Valid ChilditemUpdateReqVO updateReqVO); + void updateItemPriceByNo(ChilditemDO itemDO); + /** + * 删除检查项目子 + * + * @param id 编号 + */ + void deleteChilditem(Long id); + + /** + * 获得检查项目子 + * + * @param id 编号 + * @return 检查项目子 + */ + ChilditemDO getChilditem(Long id); + + /** + * 获得检查项目子列表 + * + * @param ids 编号 + * @return 检查项目子列表 + */ + List getChilditemList(Collection ids); + List getSimpleItemList(ItemListReqVO itemListReqVO); + + /** + * 获得检查项目子分页 + * + * @param pageReqVO 分页查询 + * @return 检查项目子分页 + */ + PageResult getChilditemPage(ChilditemPageReqVO pageReqVO); + + /** + * 获得检查项目子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检查项目子列表 + */ + List getChilditemList(ChilditemExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/childitem/ChilditemServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/childitem/ChilditemServiceImpl.java new file mode 100644 index 0000000..ba531db --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/childitem/ChilditemServiceImpl.java @@ -0,0 +1,95 @@ +package com.jojubanking.boot.module.system.service.childitem; + +import com.jojubanking.boot.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.ItemListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.childitem.ChilditemDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.childitem.ChilditemConvert; +import com.jojubanking.boot.module.system.dal.mysql.childitem.ChilditemMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 检查项目子 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class ChilditemServiceImpl implements ChilditemService { + + @Resource + private ChilditemMapper childitemMapper; + + @Override + public Long createChilditem(ChilditemCreateReqVO createReqVO) { + // 插入 + ChilditemDO childitem = ChilditemConvert.INSTANCE.convert(createReqVO); + childitemMapper.insert(childitem); + // 返回 + return childitem.getId(); + } + + @Override + public void updateChilditem(ChilditemUpdateReqVO updateReqVO) { + // 校验存在 + this.validateChilditemExists(updateReqVO.getId()); + // 更新 + ChilditemDO updateObj = ChilditemConvert.INSTANCE.convert(updateReqVO); + childitemMapper.updateById(updateObj); + } + + @Override + public void updateItemPriceByNo(ChilditemDO itemDO){ + childitemMapper.updateItemPriceByNo(itemDO); + } + + @Override + public void deleteChilditem(Long id) { + // 校验存在 + this.validateChilditemExists(id); + // 删除 + childitemMapper.deleteById(id); + } + + private void validateChilditemExists(Long id) { + if (childitemMapper.selectById(id) == null) { + throw exception(CHILDITEM_NOT_EXISTS); + } + } + + @Override + public ChilditemDO getChilditem(Long id) { + return childitemMapper.selectById(id); + } + + @Override + public List getChilditemList(Collection ids) { + return childitemMapper.selectBatchIds(ids); + } + + @Override + public List getSimpleItemList(ItemListReqVO itemListReqVO) { + return childitemMapper.selectSimpleList(itemListReqVO); + } + + @Override + public PageResult getChilditemPage(ChilditemPageReqVO pageReqVO) { + return childitemMapper.selectPage(pageReqVO); + } + + @Override + public List getChilditemList(ChilditemExportReqVO exportReqVO) { + return childitemMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/common/CaptchaService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/common/CaptchaService.java new file mode 100644 index 0000000..9910f07 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/common/CaptchaService.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.service.common; + +import com.jojubanking.boot.module.system.controller.admin.common.vo.CaptchaImageRespVO; + +/** + * 验证码 Service 接口 + */ +public interface CaptchaService { + + /** + * 获得验证码图片 + * + * @return 验证码图片 + */ + CaptchaImageRespVO getCaptchaImage(); + + /** + * 是否开启图片验证码 + * + * @return 是否 + */ + Boolean isCaptchaEnable(); + + /** + * 获得 uuid 对应的验证码 + * + * @param uuid 验证码编号 + * @return 验证码 + */ + String getCaptchaCode(String uuid); + + /** + * 删除 uuid 对应的验证码 + * + * @param uuid 验证码编号 + */ + void deleteCaptchaCode(String uuid); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/common/CaptchaServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/common/CaptchaServiceImpl.java new file mode 100644 index 0000000..70b5a17 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/common/CaptchaServiceImpl.java @@ -0,0 +1,65 @@ +package com.jojubanking.boot.module.system.service.common; + +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.CircleCaptcha; +import cn.hutool.core.util.IdUtil; +import com.jojubanking.boot.module.system.convert.common.CaptchaConvert; +import com.jojubanking.boot.module.system.framework.captcha.config.CaptchaProperties; +import com.jojubanking.boot.module.system.controller.admin.common.vo.CaptchaImageRespVO; +import com.jojubanking.boot.module.system.dal.redis.common.CaptchaRedisDAO; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 验证码 Service 实现类 + */ +@Service +public class CaptchaServiceImpl implements CaptchaService { + + @Resource + private CaptchaProperties captchaProperties; + + /** + * 验证码是否开关 + * + * 虽然 {@link CaptchaProperties#getEnable()} 有该属性,但是 Apollo 在 Spring Boot 下无法刷新 @ConfigurationProperties 注解, + * 所以暂时只能这么处理~ + */ + @Value("${joju.captcha.enable}") + private Boolean enable; + + @Resource + private CaptchaRedisDAO captchaRedisDAO; + + @Override + public CaptchaImageRespVO getCaptchaImage() { + if (!Boolean.TRUE.equals(enable)) { + return CaptchaImageRespVO.builder().enable(enable).build(); + } + // 生成验证码 + CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight()); + // 缓存到 Redis 中 + String uuid = IdUtil.fastSimpleUUID(); + captchaRedisDAO.set(uuid, captcha.getCode(), captchaProperties.getTimeout()); + // 返回 + return CaptchaConvert.INSTANCE.convert(uuid, captcha).setEnable(enable); + } + + @Override + public Boolean isCaptchaEnable() { + return enable; + } + + @Override + public String getCaptchaCode(String uuid) { + return captchaRedisDAO.get(uuid); + } + + @Override + public void deleteCaptchaCode(String uuid) { + captchaRedisDAO.delete(uuid); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dept/DeptService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dept/DeptService.java new file mode 100644 index 0000000..fe95b84 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dept/DeptService.java @@ -0,0 +1,112 @@ +package com.jojubanking.boot.module.system.service.dept; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * 部门 Service 接口 + * + * @author TW + */ +public interface DeptService { + + /** + * 初始化部门的本地缓存 + */ + void initLocalCache(); + + /** + * 创建部门 + * + * @param reqVO 部门信息 + * @return 部门编号 + */ + Long createDept(DeptCreateReqVO reqVO); + + /** + * 更新部门 + * + * @param reqVO 部门信息 + */ + void updateDept(DeptUpdateReqVO reqVO); + + /** + * 删除部门 + * + * @param id 部门编号 + */ + void deleteDept(Long id); + + /** + * 筛选部门列表 + * + * @param reqVO 筛选条件请求 VO + * @return 部门列表 + */ + List getSimpleDepts(DeptListReqVO reqVO); + + /** + * 获得所有子部门,从缓存中 + * + * @param parentId 部门编号 + * @param recursive 是否递归获取所有 + * @return 子部门列表 + */ + List getDeptsByParentIdFromCache(Long parentId, boolean recursive); + + /** + * 获得部门信息数组 + * + * @param ids 部门编号数组 + * @return 部门信息数组 + */ + List getDepts(Collection ids); + + /** + * 获得部门信息 + * + * @param id 部门编号 + * @return 部门信息 + */ + DeptDO getDept(Long id); + + /** + * 校验部门们是否有效。如下情况,视为无效: + * 1. 部门编号不存在 + * 2. 部门被禁用 + * + * @param ids 角色编号数组 + */ + void validDepts(Collection ids); + + /** + * 获得指定编号的部门列表 + * + * @param ids 部门编号数组 + * @return 部门列表 + */ + List getSimpleDepts(Collection ids); + + /** + * 获得指定编号的部门 Map + * + * @param ids 部门编号数组 + * @return 部门 Map + */ + default Map getDeptMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyMap(); + } + List list = getSimpleDepts(ids); + return CollectionUtils.convertMap(list, DeptDO::getId); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dept/DeptServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dept/DeptServiceImpl.java new file mode 100644 index 0000000..b9f45fe --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dept/DeptServiceImpl.java @@ -0,0 +1,307 @@ +package com.jojubanking.boot.module.system.service.dept; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.tenant.core.aop.TenantIgnore; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; +import com.jojubanking.boot.module.system.convert.dept.DeptConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.mysql.dept.DeptMapper; +import com.jojubanking.boot.module.system.enums.dept.DeptIdEnum; +import com.jojubanking.boot.module.system.mq.producer.dept.DeptProducer; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 部门 Service 实现类 + * + * @author TW + */ +@Service +@Validated +@Slf4j +public class DeptServiceImpl implements DeptService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 部门缓存 + * key:部门编号 {@link DeptDO#getId()} + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + @SuppressWarnings("FieldCanBeLocal") + private volatile Map deptCache; + /** + * 父部门缓存 + * key:部门编号 {@link DeptDO#getParentId()} + * value: 直接子部门列表 + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Multimap parentDeptCache; + /** + * 缓存部门的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Resource + private DeptMapper deptMapper; + + @Resource + private DeptProducer deptProducer; + + @Resource + @Lazy // 注入自己,所以延迟加载 + private DeptService self; + + @Override + @PostConstruct + @TenantIgnore // 初始化缓存,无需租户过滤 + public synchronized void initLocalCache() { + // 获取部门列表,如果有更新 + List deptList = loadDeptIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(deptList)) { + return; + } + + // 构建缓存 + ImmutableMap.Builder builder = ImmutableMap.builder(); + ImmutableMultimap.Builder parentBuilder = ImmutableMultimap.builder(); + deptList.forEach(sysRoleDO -> { + builder.put(sysRoleDO.getId(), sysRoleDO); + parentBuilder.put(sysRoleDO.getParentId(), sysRoleDO); + }); + // 设置缓存 + deptCache = builder.build(); + parentDeptCache = parentBuilder.build(); + maxUpdateTime = CollectionUtils.getMaxValue(deptList, DeptDO::getUpdateTime); + log.info("[initLocalCache][初始化 Dept 数量为 {}]", deptList.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + self.initLocalCache(); + } + + /** + * 如果部门发生变化,从数据库中获取最新的全量部门。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前部门的最大更新时间 + * @return 部门列表 + */ + protected List loadDeptIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadMenuIfUpdate][首次加载全量部门]"); + } else { // 判断数据库中是否有更新的部门 + if (deptMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { + return null; + } + log.info("[loadMenuIfUpdate][增量加载全量部门]"); + } + // 第二步,如果有更新,则从数据库加载所有部门 + return deptMapper.selectList(); + } + + @Override + public Long createDept(DeptCreateReqVO reqVO) { + // 校验正确性 + if (reqVO.getParentId() == null) { + reqVO.setParentId(DeptIdEnum.ROOT.getId()); + } + checkCreateOrUpdate(null, reqVO.getParentId(), reqVO.getName()); + // 插入部门 + DeptDO dept = DeptConvert.INSTANCE.convert(reqVO); + deptMapper.insert(dept); + // 发送刷新消息 + deptProducer.sendDeptRefreshMessage(); + return dept.getId(); + } + + @Override + public void updateDept(DeptUpdateReqVO reqVO) { + // 校验正确性 + if (reqVO.getParentId() == null) { + reqVO.setParentId(DeptIdEnum.ROOT.getId()); + } + checkCreateOrUpdate(reqVO.getId(), reqVO.getParentId(), reqVO.getName()); + // 更新部门 + DeptDO updateObj = DeptConvert.INSTANCE.convert(reqVO); + deptMapper.updateById(updateObj); + // 发送刷新消息 + deptProducer.sendDeptRefreshMessage(); + } + + @Override + public void deleteDept(Long id) { + // 校验是否存在 + checkDeptExists(id); + // 校验是否有子部门 + if (deptMapper.selectCountByParentId(id) > 0) { + throw ServiceExceptionUtil.exception(DEPT_EXITS_CHILDREN); + } + // 删除部门 + deptMapper.deleteById(id); + // 发送刷新消息 + deptProducer.sendDeptRefreshMessage(); + } + + @Override + public List getSimpleDepts(DeptListReqVO reqVO) { + return deptMapper.selectList(reqVO); + } + + @Override + public List getDeptsByParentIdFromCache(Long parentId, boolean recursive) { + if (parentId == null) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); // TODO TW:待优化,新增缓存,避免每次遍历的计算 + // 递归,简单粗暴 + this.getDeptsByParentIdFromCache(result, parentId, + recursive ? Integer.MAX_VALUE : 1, // 如果递归获取,则无限;否则,只递归 1 次 + parentDeptCache); + return result; + } + + /** + * 递归获取所有的子部门,添加到 result 结果 + * + * @param result 结果 + * @param parentId 父编号 + * @param recursiveCount 递归次数 + * @param parentDeptMap 父部门 Map,使用缓存,避免变化 + */ + private void getDeptsByParentIdFromCache(List result, Long parentId, int recursiveCount, + Multimap parentDeptMap) { + // 递归次数为 0,结束! + if (recursiveCount == 0) { + return; + } + // 获得子部门 + Collection depts = parentDeptMap.get(parentId); + if (CollUtil.isEmpty(depts)) { + return; + } + result.addAll(depts); + // 继续递归 + depts.forEach(dept -> getDeptsByParentIdFromCache(result, dept.getId(), + recursiveCount - 1, parentDeptMap)); + } + + private void checkCreateOrUpdate(Long id, Long parentId, String name) { + // 校验自己存在 + checkDeptExists(id); + // 校验父部门的有效性 + checkParentDeptEnable(id, parentId); + // 校验部门名的唯一性 + checkDeptNameUnique(id, parentId, name); + } + + private void checkParentDeptEnable(Long id, Long parentId) { + if (parentId == null || DeptIdEnum.ROOT.getId().equals(parentId)) { + return; + } + // 不能设置自己为父部门 + if (parentId.equals(id)) { + throw ServiceExceptionUtil.exception(DEPT_PARENT_ERROR); + } + // 父岗位不存在 + DeptDO dept = deptMapper.selectById(parentId); + if (dept == null) { + throw ServiceExceptionUtil.exception(DEPT_PARENT_NOT_EXITS); + } + // 父部门被禁用 + if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { + throw ServiceExceptionUtil.exception(DEPT_NOT_ENABLE); + } + // 父部门不能是原来的子部门 + List children = this.getDeptsByParentIdFromCache(id, true); + if (children.stream().anyMatch(dept1 -> dept1.getId().equals(parentId))) { + throw ServiceExceptionUtil.exception(DEPT_PARENT_IS_CHILD); + } + } + + private void checkDeptExists(Long id) { + if (id == null) { + return; + } + DeptDO dept = deptMapper.selectById(id); + if (dept == null) { + throw ServiceExceptionUtil.exception(DEPT_NOT_FOUND); + } + } + + private void checkDeptNameUnique(Long id, Long parentId, String name) { + DeptDO menu = deptMapper.selectByParentIdAndName(parentId, name); + if (menu == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw ServiceExceptionUtil.exception(DEPT_NAME_DUPLICATE); + } + if (!menu.getId().equals(id)) { + throw ServiceExceptionUtil.exception(DEPT_NAME_DUPLICATE); + } + } + + @Override + public List getDepts(Collection ids) { + return deptMapper.selectBatchIds(ids); + } + + @Override + public DeptDO getDept(Long id) { + return deptMapper.selectById(id); + } + + @Override + public void validDepts(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得科室信息 + List depts = deptMapper.selectBatchIds(ids); + Map deptMap = CollectionUtils.convertMap(depts, DeptDO::getId); + // 校验 + ids.forEach(id -> { + DeptDO dept = deptMap.get(id); + if (dept == null) { + throw exception(DEPT_NOT_FOUND); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { + throw exception(DEPT_NOT_ENABLE, dept.getName()); + } + }); + } + + @Override + public List getSimpleDepts(Collection ids) { + return deptMapper.selectBatchIds(ids); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dept/PostService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dept/PostService.java new file mode 100644 index 0000000..3fb9a70 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dept/PostService.java @@ -0,0 +1,98 @@ +package com.jojubanking.boot.module.system.service.dept; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import org.springframework.lang.Nullable; + +import java.util.Collection; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.collection.SetUtils.asSet; + +/** + * 岗位 Service 接口 + * + * @author TW + */ +public interface PostService { + + /** + * 创建岗位 + * + * @param reqVO 岗位信息 + * @return 岗位编号 + */ + Long createPost(PostCreateReqVO reqVO); + + /** + * 更新岗位 + * + * @param reqVO 岗位信息 + */ + void updatePost(PostUpdateReqVO reqVO); + + /** + * 删除岗位信息 + * + * @param id 岗位编号 + */ + void deletePost(Long id); + + /** + * 获得岗位列表 + * + * @param ids 岗位编号数组。如果为空,不进行筛选 + * @return 部门列表 + */ + default List getPosts(@Nullable Collection ids) { + return getPosts(ids, asSet(CommonStatusEnum.ENABLE.getStatus(), CommonStatusEnum.DISABLE.getStatus())); + } + + /** + * 获得符合条件的岗位列表 + * + * @param ids 岗位编号数组。如果为空,不进行筛选 + * @param statuses 状态数组。如果为空,不进行筛选 + * @return 部门列表 + */ + List getPosts(@Nullable Collection ids, @Nullable Collection statuses); + + /** + * 获得岗位分页列表 + * + * @param reqVO 分页条件 + * @return 部门分页列表 + */ + PageResult getPostPage(PostPageReqVO reqVO); + + /** + * 获得岗位列表 + * + * @param reqVO 查询条件 + * @return 部门列表 + */ + List getPosts(PostExportReqVO reqVO); + + /** + * 获得岗位信息 + * + * @param id 岗位编号 + * @return 岗位信息 + */ + PostDO getPost(Long id); + + /** + * 校验岗位们是否有效。如下情况,视为无效: + * 1. 岗位编号不存在 + * 2. 岗位被禁用 + * + * @param ids 岗位编号数组 + */ + void validPosts(Collection ids); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dept/PostServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dept/PostServiceImpl.java new file mode 100644 index 0000000..9f36a17 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dept/PostServiceImpl.java @@ -0,0 +1,151 @@ +package com.jojubanking.boot.module.system.service.dept; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; +import com.jojubanking.boot.module.system.convert.dept.PostConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import com.jojubanking.boot.module.system.dal.mysql.dept.PostMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertMap; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 岗位 Service 实现类 + * + * @author TW + */ +@Service +@Validated +public class PostServiceImpl implements PostService { + + @Resource + private PostMapper postMapper; + + @Override + public Long createPost(PostCreateReqVO reqVO) { + // 校验正确性 + this.checkCreateOrUpdate(null, reqVO.getName(), reqVO.getCode()); + // 插入岗位 + PostDO post = PostConvert.INSTANCE.convert(reqVO); + postMapper.insert(post); + return post.getId(); + } + + @Override + public void updatePost(PostUpdateReqVO reqVO) { + // 校验正确性 + this.checkCreateOrUpdate(reqVO.getId(), reqVO.getName(), reqVO.getCode()); + // 更新岗位 + PostDO updateObj = PostConvert.INSTANCE.convert(reqVO); + postMapper.updateById(updateObj); + } + + @Override + public void deletePost(Long id) { + // 校验是否存在 + this.checkPostExists(id); + // 删除部门 + postMapper.deleteById(id); + } + + @Override + public List getPosts(Collection ids, Collection statuses) { + return postMapper.selectList(ids, statuses); + } + + @Override + public PageResult getPostPage(PostPageReqVO reqVO) { + return postMapper.selectPage(reqVO); + } + + @Override + public List getPosts(PostExportReqVO reqVO) { + return postMapper.selectList(reqVO); + } + + @Override + public PostDO getPost(Long id) { + return postMapper.selectById(id); + } + + private void checkCreateOrUpdate(Long id, String name, String code) { + // 校验自己存在 + checkPostExists(id); + // 校验岗位名的唯一性 + checkPostNameUnique(id, name); + // 校验岗位编码的唯一性 + checkPostCodeUnique(id, code); + } + + private void checkPostNameUnique(Long id, String name) { + PostDO post = postMapper.selectByName(name); + if (post == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw ServiceExceptionUtil.exception(POST_NAME_DUPLICATE); + } + if (!post.getId().equals(id)) { + throw ServiceExceptionUtil.exception(POST_NAME_DUPLICATE); + } + } + + private void checkPostCodeUnique(Long id, String code) { + PostDO post = postMapper.selectByCode(code); + if (post == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw ServiceExceptionUtil.exception(POST_CODE_DUPLICATE); + } + if (!post.getId().equals(id)) { + throw ServiceExceptionUtil.exception(POST_CODE_DUPLICATE); + } + } + + private void checkPostExists(Long id) { + if (id == null) { + return; + } + PostDO post = postMapper.selectById(id); + if (post == null) { + throw ServiceExceptionUtil.exception(POST_NOT_FOUND); + } + } + + @Override + public void validPosts(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得岗位信息 + List posts = postMapper.selectBatchIds(ids); + Map postMap = convertMap(posts, PostDO::getId); + // 校验 + ids.forEach(id -> { + PostDO post = postMap.get(id); + if (post == null) { + throw exception(POST_NOT_FOUND); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) { + throw exception(POST_NOT_ENABLE, post.getName()); + } + }); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/deptxq/DeptXqService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/deptxq/DeptXqService.java new file mode 100644 index 0000000..e7a2784 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/deptxq/DeptXqService.java @@ -0,0 +1,98 @@ +package com.jojubanking.boot.module.system.service.deptxq; + +import java.util.*; +import javax.validation.*; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.jojubanking.boot.module.system.controller.admin.deptxq.vo.*; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.DeptXqtjListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.deptxq.DeptXqDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 部门 Service 接口 + * + * @author admin + */ +public interface DeptXqService { + + /** + * 初始化部门的本地缓存 + */ + void initLocalCache(); + /** + * 创建部门 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeptXq(@Valid DeptXqCreateReqVO createReqVO); + + /** + * 更新部门 + * + * @param updateReqVO 更新信息 + */ + void updateDeptXq(@Valid DeptXqUpdateReqVO updateReqVO); + + /** + * 删除部门 + * + * @param id 编号 + */ + void deleteDeptXq(Long id); + + /** + * 获得部门 + * + * @param id 编号 + * @return 部门 + */ + DeptXqDO getDeptXq(Long id); + + /** + * 获得部门列表 + * + * @param ids 编号 + * @return 部门列表 + */ + List getDeptXqList(Collection ids); + + /** + * 获得部门分页 + * + * @param pageReqVO 分页查询 + * @return 部门分页 + */ + PageResult getDeptXqPage(DeptXqPageReqVO pageReqVO); + + /** + * 获得部门列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 部门列表 + */ + List getDeptXqList(DeptXqExportReqVO exportReqVO); + + /** + * 筛选部门列表 + * + * @param reqVO 筛选条件请求 VO + * @return 部门列表 + */ + List getSimpleXqDepts(DeptXqListReqVO reqVO); + List getSimpleXqtjDepts(DeptXqtjListReqVO reqVO); + + List getSimpleXqDepts(Collection ids); + default Map getDeptMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyMap(); + } + List list = getSimpleXqDepts(ids); + return CollectionUtils.convertMap(list, DeptXqDO::getId); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/deptxq/DeptXqServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/deptxq/DeptXqServiceImpl.java new file mode 100644 index 0000000..0ec8f3f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/deptxq/DeptXqServiceImpl.java @@ -0,0 +1,315 @@ +package com.jojubanking.boot.module.system.service.deptxq; + +import cn.hutool.core.collection.CollUtil; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.tenant.core.aop.TenantIgnore; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.DeptXqtjListReqVO; +import com.jojubanking.boot.module.system.convert.dept.DeptConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.enums.dept.DeptIdEnum; +import com.jojubanking.boot.module.system.mq.producer.dept.DeptProducer; +import com.jojubanking.boot.module.system.mq.producer.deptXq.DeptXqProducer; +import com.jojubanking.boot.module.system.service.dept.DeptService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.deptxq.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.deptxq.DeptXqDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.deptxq.DeptXqConvert; +import com.jojubanking.boot.module.system.dal.mysql.deptxq.DeptXqMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 部门 Service 实现类 + * + * @author admin + */ +@Service +@Validated +@Slf4j +public class DeptXqServiceImpl implements DeptXqService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + /** + * 部门缓存 + * key:部门编号 {@link DeptXqDO#getId()} + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + @SuppressWarnings("FieldCanBeLocal") + private volatile Map deptCache; + + /** + * 父部门缓存 + * key:部门编号 {@link DeptXqDO#getParentId()} + * value: 直接子部门列表 + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Multimap parentDeptCache; + /** + * 缓存部门的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + @Resource + private DeptXqMapper deptXqMapper; + @Resource + private DeptXqProducer deptXqProducer; + + @Resource + @Lazy // 注入自己,所以延迟加载 + private DeptXqService self; + + @Override + @PostConstruct + @TenantIgnore // 初始化缓存,无需租户过滤 + public synchronized void initLocalCache() { + // 获取部门列表,如果有更新 + List deptList = loadDeptIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(deptList)) { + return; + } + + // 构建缓存 + ImmutableMap.Builder builder = ImmutableMap.builder(); + ImmutableMultimap.Builder parentBuilder = ImmutableMultimap.builder(); + deptList.forEach(sysRoleDO -> { + builder.put(sysRoleDO.getId(), sysRoleDO); + parentBuilder.put(sysRoleDO.getParentId(), sysRoleDO); + }); + // 设置缓存 + deptCache = builder.build(); + parentDeptCache = parentBuilder.build(); + maxUpdateTime = CollectionUtils.getMaxValue(deptList, DeptXqDO::getUpdateTime); + log.info("[initLocalCache][初始化 Dept 数量为 {}]", deptList.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + self.initLocalCache(); + } + + /** + * 如果部门发生变化,从数据库中获取最新的全量部门。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前部门的最大更新时间 + * @return 部门列表 + */ + protected List loadDeptIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadMenuIfUpdate][首次加载全量部门]"); + } else { // 判断数据库中是否有更新的部门 + if (deptXqMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { + return null; + } + log.info("[loadMenuIfUpdate][增量加载全量部门]"); + } + // 第二步,如果有更新,则从数据库加载所有部门 + return deptXqMapper.selectList(); + } + + + @Override + public Long createDeptXq(DeptXqCreateReqVO reqVO) { +// // 插入 +// DeptXqDO deptXq = DeptXqConvert.INSTANCE.convert(createReqVO); +// deptXqMapper.insert(deptXq); +// // 返回 +// return deptXq.getId(); + + // 校验正确性 + if (reqVO.getParentId() == null) { + reqVO.setParentId(DeptIdEnum.ROOT.getId()); + } + checkCreateOrUpdate(null, reqVO.getParentId(), reqVO.getName()); + // 插入部门 + DeptXqDO dept = DeptXqConvert.INSTANCE.convert(reqVO); + deptXqMapper.insert(dept); + // 发送刷新消息 + deptXqProducer.sendDeptRefreshMessage(); + return dept.getId(); + } + private void checkCreateOrUpdate(Long id, Long parentId, String name) { + // 校验自己存在 + checkDeptExists(id); + // 校验父部门的有效性 + checkParentDeptEnable(id, parentId); + // 校验部门名的唯一性 + checkDeptNameUnique(id, parentId, name); + } + private void checkParentDeptEnable(Long id, Long parentId) { + if (parentId == null || DeptIdEnum.ROOT.getId().equals(parentId)) { + return; + } + // 不能设置自己为父部门 + if (parentId.equals(id)) { + throw ServiceExceptionUtil.exception(DEPT_PARENT_ERROR); + } + // 父岗位不存在 + DeptXqDO dept = deptXqMapper.selectById(parentId); + if (dept == null) { + throw ServiceExceptionUtil.exception(DEPT_PARENT_NOT_EXITS); + } + // 父部门被禁用 + if (!CommonStatusEnum.ENABLE.getStatus().equals(dept.getStatus())) { + throw ServiceExceptionUtil.exception(DEPT_NOT_ENABLE); + } + // 父部门不能是原来的子部门 + List children = this.getDeptsByParentIdFromCache(id, true); + if (children.stream().anyMatch(dept1 -> dept1.getId().equals(parentId))) { + throw ServiceExceptionUtil.exception(DEPT_PARENT_IS_CHILD); + } + } + public List getDeptsByParentIdFromCache(Long parentId, boolean recursive) { + if (parentId == null) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); // TODO TW:待优化,新增缓存,避免每次遍历的计算 + // 递归,简单粗暴 + this.getDeptsByParentIdFromCache(result, parentId, + recursive ? Integer.MAX_VALUE : 1, // 如果递归获取,则无限;否则,只递归 1 次 + parentDeptCache); + return result; + } + private void getDeptsByParentIdFromCache(List result, Long parentId, int recursiveCount, + Multimap parentDeptMap) { + // 递归次数为 0,结束! + if (recursiveCount == 0) { + return; + } + // 获得子部门 + Collection depts = parentDeptMap.get(parentId); + if (CollUtil.isEmpty(depts)) { + return; + } + result.addAll(depts); + // 继续递归 + depts.forEach(dept -> getDeptsByParentIdFromCache(result, dept.getId(), + recursiveCount - 1, parentDeptMap)); + } + + private void checkDeptExists(Long id) { + if (id == null) { + return; + } + DeptXqDO dept = deptXqMapper.selectById(id); + if (dept == null) { + throw ServiceExceptionUtil.exception(DEPT_NOT_FOUND); + } + } + + private void checkDeptNameUnique(Long id, Long parentId, String name) { + DeptXqDO menu = deptXqMapper.selectByParentIdAndName(parentId, name); + if (menu == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的岗位 + if (id == null) { + throw ServiceExceptionUtil.exception(DEPT_NAME_DUPLICATE); + } + if (!menu.getId().equals(id)) { + throw ServiceExceptionUtil.exception(DEPT_NAME_DUPLICATE); + } + } + @Override + public void updateDeptXq(DeptXqUpdateReqVO reqVO) { +// // 校验存在 +// this.validateDeptXqExists(updateReqVO.getId()); +// // 更新 +// DeptXqDO updateObj = DeptXqConvert.INSTANCE.convert(updateReqVO); +// deptXqMapper.updateById(updateObj); + + // 校验正确性 + if (reqVO.getParentId() == null) { + reqVO.setParentId(DeptIdEnum.ROOT.getId()); + } + checkCreateOrUpdate(reqVO.getId(), reqVO.getParentId(), reqVO.getName()); + // 更新部门 + DeptXqDO updateObj = DeptXqConvert.INSTANCE.convert(reqVO); + deptXqMapper.updateById(updateObj); + // 发送刷新消息 + deptXqProducer.sendDeptRefreshMessage(); + } + + @Override + public void deleteDeptXq(Long id) { +// // 校验存在 +// this.validateDeptXqExists(id); +// // 删除 +// deptXqMapper.deleteById(id); + + // 校验是否存在 + checkDeptExists(id); + // 校验是否有子部门 + if (deptXqMapper.selectCountByParentId(id) > 0) { + throw ServiceExceptionUtil.exception(DEPT_EXITS_CHILDREN); + } + // 删除部门 + deptXqMapper.deleteById(id); + // 发送刷新消息 + deptXqProducer.sendDeptRefreshMessage(); + } + + private void validateDeptXqExists(Long id) { + if (deptXqMapper.selectById(id) == null) { + throw exception(DEPT_XQ_NOT_EXISTS); + } + } + + @Override + public DeptXqDO getDeptXq(Long id) { + return deptXqMapper.selectById(id); + } + + @Override + public List getDeptXqList(Collection ids) { + return deptXqMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeptXqPage(DeptXqPageReqVO pageReqVO) { + return deptXqMapper.selectPage(pageReqVO); + } + + @Override + public List getDeptXqList(DeptXqExportReqVO exportReqVO) { + return deptXqMapper.selectList(exportReqVO); + } + + @Override + public List getSimpleXqDepts(Collection ids) { + return deptXqMapper.selectBatchIds(ids); + } + + + public List getSimpleXqDepts(DeptXqListReqVO reqVO) { + return deptXqMapper.selectXqList(reqVO); + } + public List getSimpleXqtjDepts(DeptXqtjListReqVO reqVO) { + return deptXqMapper.selectXqtjList(reqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dict/DictDataService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dict/DictDataService.java new file mode 100644 index 0000000..976dd1b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dict/DictDataService.java @@ -0,0 +1,108 @@ +package com.jojubanking.boot.module.system.service.dict; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictDataDO; + +import java.util.Collection; +import java.util.List; + +/** + * 字典数据 Service 接口 + * + * @author ruoyi + */ +public interface DictDataService { + + /** + * 创建字典数据 + * + * @param reqVO 字典数据信息 + * @return 字典数据编号 + */ + Long createDictData(DictDataCreateReqVO reqVO); + + /** + * 更新字典数据 + * + * @param reqVO 字典数据信息 + */ + void updateDictData(DictDataUpdateReqVO reqVO); + + /** + * 删除字典数据 + * + * @param id 字典数据编号 + */ + void deleteDictData(Long id); + + /** + * 获得字典数据列表 + * + * @return 字典数据全列表 + */ + List getDictDatas(); + + /** + * 获得字典数据分页列表 + * + * @param reqVO 分页请求 + * @return 字典数据分页列表 + */ + PageResult getDictDataPage(DictDataPageReqVO reqVO); + + /** + * 获得字典数据列表 + * + * @param reqVO 列表请求 + * @return 字典数据列表 + */ + List getDictDatas(DictDataExportReqVO reqVO); + + /** + * 获得字典数据详情 + * + * @param id 字典数据编号 + * @return 字典数据 + */ + DictDataDO getDictData(Long id); + + /** + * 获得指定字典类型的数据数量 + * + * @param dictType 字典类型 + * @return 数据数量 + */ + long countByDictType(String dictType); + + /** + * 校验字典数据们是否有效。如下情况,视为无效: + * 1. 字典数据不存在 + * 2. 字典数据被禁用 + * + * @param dictType 字典类型 + * @param values 字典数据值的数组 + */ + void validDictDatas(String dictType, Collection values); + + /** + * 获得指定的字典数据 + * + * @param dictType 字典类型 + * @param value 字典数据值 + * @return 字典数据 + */ + DictDataDO getDictData(String dictType, String value); + + /** + * 解析获得指定的字典数据,从缓存中 + * + * @param dictType 字典类型 + * @param label 字典数据标签 + * @return 字典数据 + */ + DictDataDO parseDictData(String dictType, String label); +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dict/DictDataServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dict/DictDataServiceImpl.java new file mode 100644 index 0000000..e25bd26 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dict/DictDataServiceImpl.java @@ -0,0 +1,185 @@ +package com.jojubanking.boot.module.system.service.dict; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; +import com.jojubanking.boot.module.system.convert.dict.DictDataConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictDataDO; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictTypeDO; +import com.jojubanking.boot.module.system.dal.mysql.dict.DictDataMapper; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 字典数据 Service 实现类 + * + * @author ruoyi + */ +@Service +@Slf4j +public class DictDataServiceImpl implements DictDataService { + + /** + * 排序 dictType > sort + */ + private static final Comparator COMPARATOR_TYPE_AND_SORT = Comparator + .comparing(DictDataDO::getDictType) + .thenComparingInt(DictDataDO::getSort); + + @Resource + private DictTypeService dictTypeService; + + @Resource + private DictDataMapper dictDataMapper; + + @Override + public List getDictDatas() { + List list = dictDataMapper.selectList(); + list.sort(COMPARATOR_TYPE_AND_SORT); + return list; + } + + @Override + public PageResult getDictDataPage(DictDataPageReqVO reqVO) { + return dictDataMapper.selectPage(reqVO); + } + + @Override + public List getDictDatas(DictDataExportReqVO reqVO) { + List list = dictDataMapper.selectList(reqVO); + list.sort(COMPARATOR_TYPE_AND_SORT); + return list; + } + + @Override + public DictDataDO getDictData(Long id) { + return dictDataMapper.selectById(id); + } + + @Override + public Long createDictData(DictDataCreateReqVO reqVO) { + // 校验正确性 + checkCreateOrUpdate(null, reqVO.getValue(), reqVO.getDictType()); + + // 插入字典类型 + DictDataDO dictData = DictDataConvert.INSTANCE.convert(reqVO); + dictDataMapper.insert(dictData); + return dictData.getId(); + } + + @Override + public void updateDictData(DictDataUpdateReqVO reqVO) { + // 校验正确性 + checkCreateOrUpdate(reqVO.getId(), reqVO.getValue(), reqVO.getDictType()); + + // 更新字典类型 + DictDataDO updateObj = DictDataConvert.INSTANCE.convert(reqVO); + dictDataMapper.updateById(updateObj); + } + + @Override + public void deleteDictData(Long id) { + // 校验是否存在 + checkDictDataExists(id); + + // 删除字典数据 + dictDataMapper.deleteById(id); + } + + @Override + public long countByDictType(String dictType) { + return dictDataMapper.selectCountByDictType(dictType); + } + + + private void checkCreateOrUpdate(Long id, String value, String dictType) { + // 校验自己存在 + checkDictDataExists(id); + // 校验字典类型有效 + checkDictTypeValid(dictType); + // 校验字典数据的值的唯一性 + checkDictDataValueUnique(id, dictType, value); + } + + @VisibleForTesting + public void checkDictDataValueUnique(Long id, String dictType, String value) { + DictDataDO dictData = dictDataMapper.selectByDictTypeAndValue(dictType, value); + if (dictData == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典数据 + if (id == null) { + throw exception(DICT_DATA_VALUE_DUPLICATE); + } + if (!dictData.getId().equals(id)) { + throw exception(DICT_DATA_VALUE_DUPLICATE); + } + } + + @VisibleForTesting + public void checkDictDataExists(Long id) { + if (id == null) { + return; + } + DictDataDO dictData = dictDataMapper.selectById(id); + if (dictData == null) { + throw exception(DICT_DATA_NOT_EXISTS); + } + } + + @VisibleForTesting + public void checkDictTypeValid(String type) { + DictTypeDO dictType = dictTypeService.getDictType(type); + if (dictType == null) { + throw exception(DICT_TYPE_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dictType.getStatus())) { + throw exception(DICT_TYPE_NOT_ENABLE); + } + } + + @Override + public void validDictDatas(String dictType, Collection values) { + if (CollUtil.isEmpty(values)) { + return; + } + Map dictDataMap = CollectionUtils.convertMap( + dictDataMapper.selectByDictTypeAndValues(dictType, values), DictDataDO::getValue); + // 校验 + values.forEach(value -> { + DictDataDO dictData = dictDataMap.get(value); + if (dictData == null) { + throw exception(DICT_DATA_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(dictData.getStatus())) { + throw exception(DICT_DATA_NOT_ENABLE, dictData.getLabel()); + } + }); + } + + @Override + public DictDataDO getDictData(String dictType, String value) { + return dictDataMapper.selectByDictTypeAndValue(dictType, value); + } + + @Override + public DictDataDO parseDictData(String dictType, String label) { + return dictDataMapper.selectByDictTypeAndLabel(dictType, label); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dict/DictTypeService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dict/DictTypeService.java new file mode 100644 index 0000000..d7654ba --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dict/DictTypeService.java @@ -0,0 +1,80 @@ +package com.jojubanking.boot.module.system.service.dict; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictTypeDO; + +import java.util.List; + +/** + * 字典类型 Service 接口 + * + * @author TW + */ +public interface DictTypeService { + + /** + * 创建字典类型 + * + * @param reqVO 字典类型信息 + * @return 字典类型编号 + */ + Long createDictType(DictTypeCreateReqVO reqVO); + + /** + * 更新字典类型 + * + * @param reqVO 字典类型信息 + */ + void updateDictType(DictTypeUpdateReqVO reqVO); + + /** + * 删除字典类型 + * + * @param id 字典类型编号 + */ + void deleteDictType(Long id); + + /** + * 获得字典类型分页列表 + * + * @param reqVO 分页请求 + * @return 字典类型分页列表 + */ + PageResult getDictTypePage(DictTypePageReqVO reqVO); + + /** + * 获得字典类型列表 + * + * @param reqVO 列表请求 + * @return 字典类型列表 + */ + List getDictTypeList(DictTypeExportReqVO reqVO); + + /** + * 获得字典类型详情 + * + * @param id 字典类型编号 + * @return 字典类型 + */ + DictTypeDO getDictType(Long id); + + /** + * 获得字典类型详情 + * + * @param type 字典类型 + * @return 字典类型详情 + */ + DictTypeDO getDictType(String type); + + /** + * 获得全部字典类型列表 + * + * @return 字典类型列表 + */ + List getDictTypeList(); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dict/DictTypeServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dict/DictTypeServiceImpl.java new file mode 100644 index 0000000..0f53585 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dict/DictTypeServiceImpl.java @@ -0,0 +1,145 @@ +package com.jojubanking.boot.module.system.service.dict; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeUpdateReqVO; +import com.jojubanking.boot.module.system.convert.dict.DictTypeConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictTypeDO; +import com.jojubanking.boot.module.system.dal.mysql.dict.DictTypeMapper; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 字典类型 Service 实现类 + * + * @author TW + */ +@Service +public class DictTypeServiceImpl implements DictTypeService { + + @Resource + private DictDataService dictDataService; + + @Resource + private DictTypeMapper dictTypeMapper; + + @Override + public PageResult getDictTypePage(DictTypePageReqVO reqVO) { + return dictTypeMapper.selectPage(reqVO); + } + + @Override + public List getDictTypeList(DictTypeExportReqVO reqVO) { + return dictTypeMapper.selectList(reqVO); + } + + @Override + public DictTypeDO getDictType(Long id) { + return dictTypeMapper.selectById(id); + } + + @Override + public DictTypeDO getDictType(String type) { + return dictTypeMapper.selectByType(type); + } + + @Override + public Long createDictType(DictTypeCreateReqVO reqVO) { + // 校验正确性 + checkCreateOrUpdate(null, reqVO.getName(), reqVO.getType()); + // 插入字典类型 + DictTypeDO dictType = DictTypeConvert.INSTANCE.convert(reqVO); + dictTypeMapper.insert(dictType); + return dictType.getId(); + } + + @Override + public void updateDictType(DictTypeUpdateReqVO reqVO) { + // 校验正确性 + checkCreateOrUpdate(reqVO.getId(), reqVO.getName(), null); + // 更新字典类型 + DictTypeDO updateObj = DictTypeConvert.INSTANCE.convert(reqVO); + dictTypeMapper.updateById(updateObj); + } + + @Override + public void deleteDictType(Long id) { + // 校验是否存在 + DictTypeDO dictType = checkDictTypeExists(id); + // 校验是否有字典数据 + if (dictDataService.countByDictType(dictType.getType()) > 0) { + throw exception(DICT_TYPE_HAS_CHILDREN); + } + // 删除字典类型 + dictTypeMapper.deleteById(id); + } + + @Override + public List getDictTypeList() { + return dictTypeMapper.selectList(); + } + + private void checkCreateOrUpdate(Long id, String name, String type) { + // 校验自己存在 + checkDictTypeExists(id); + // 校验字典类型的名字的唯一性 + checkDictTypeNameUnique(id, name); + // 校验字典类型的类型的唯一性 + checkDictTypeUnique(id, type); + } + + @VisibleForTesting + public void checkDictTypeNameUnique(Long id, String name) { + DictTypeDO dictType = dictTypeMapper.selectByName(name); + if (dictType == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(DICT_TYPE_NAME_DUPLICATE); + } + if (!dictType.getId().equals(id)) { + throw exception(DICT_TYPE_NAME_DUPLICATE); + } + } + + @VisibleForTesting + public void checkDictTypeUnique(Long id, String type) { + if (StrUtil.isEmpty(type)) { + return; + } + DictTypeDO dictType = dictTypeMapper.selectByType(type); + if (dictType == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(DICT_TYPE_TYPE_DUPLICATE); + } + if (!dictType.getId().equals(id)) { + throw exception(DICT_TYPE_TYPE_DUPLICATE); + } + } + + @VisibleForTesting + public DictTypeDO checkDictTypeExists(Long id) { + if (id == null) { + return null; + } + DictTypeDO dictType = dictTypeMapper.selectById(id); + if (dictType == null) { + throw exception(DICT_TYPE_NOT_EXISTS); + } + return dictType; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/doctor/DoctorService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/doctor/DoctorService.java new file mode 100644 index 0000000..71e0201 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/doctor/DoctorService.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.service.doctor; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.doctor.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.doctor.DoctorDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 医生信息 Service 接口 + * + * @author admin + */ +public interface DoctorService { + + /** + * 创建医生信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createDoctor(@Valid DoctorCreateReqVO createReqVO); + + /** + * 更新医生信息 + * + * @param updateReqVO 更新信息 + */ + void updateDoctor(@Valid DoctorUpdateReqVO updateReqVO); + + /** + * 删除医生信息 + * + * @param id 编号 + */ + void deleteDoctor(Integer id); + + /** + * 获得医生信息 + * + * @param id 编号 + * @return 医生信息 + */ + DoctorDO getDoctor(Integer id); + + /** + * 获得医生信息列表 + * + * @param ids 编号 + * @return 医生信息列表 + */ + List getDoctorList(Collection ids); + + /** + * 获得医生信息分页 + * + * @param pageReqVO 分页查询 + * @return 医生信息分页 + */ + PageResult getDoctorPage(DoctorPageReqVO pageReqVO); + + /** + * 获得医生信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 医生信息列表 + */ + List getDoctorList(DoctorExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/doctor/DoctorServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/doctor/DoctorServiceImpl.java new file mode 100644 index 0000000..5abf539 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/doctor/DoctorServiceImpl.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.doctor; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.doctor.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.doctor.DoctorDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.doctor.DoctorConvert; +import com.jojubanking.boot.module.system.dal.mysql.doctor.DoctorMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 医生信息 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class DoctorServiceImpl implements DoctorService { + + @Resource + private DoctorMapper doctorMapper; + + @Override + public Integer createDoctor(DoctorCreateReqVO createReqVO) { + // 插入 + DoctorDO doctor = DoctorConvert.INSTANCE.convert(createReqVO); + doctorMapper.insert(doctor); + // 返回 + return doctor.getId(); + } + + @Override + public void updateDoctor(DoctorUpdateReqVO updateReqVO) { + // 校验存在 + this.validateDoctorExists(updateReqVO.getId()); + // 更新 + DoctorDO updateObj = DoctorConvert.INSTANCE.convert(updateReqVO); + doctorMapper.updateById(updateObj); + } + + @Override + public void deleteDoctor(Integer id) { + // 校验存在 + this.validateDoctorExists(id); + // 删除 + doctorMapper.deleteById(id); + } + + private void validateDoctorExists(Integer id) { + if (doctorMapper.selectById(id) == null) { + throw exception(DOCTOR_NOT_EXISTS); + } + } + + @Override + public DoctorDO getDoctor(Integer id) { + return doctorMapper.selectById(id); + } + + @Override + public List getDoctorList(Collection ids) { + return doctorMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDoctorPage(DoctorPageReqVO pageReqVO) { + return doctorMapper.selectPage(pageReqVO); + } + + @Override + public List getDoctorList(DoctorExportReqVO exportReqVO) { + return doctorMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dzquestion/DzQuestionService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dzquestion/DzQuestionService.java new file mode 100644 index 0000000..f5ac530 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dzquestion/DzQuestionService.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.service.dzquestion; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.dzquestion.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.dzquestion.DzQuestionDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 导诊管理 Service 接口 + * + * @author admin + */ +public interface DzQuestionService { + + /** + * 创建导诊管理 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createDzQuestion(@Valid DzQuestionCreateReqVO createReqVO); + + /** + * 更新导诊管理 + * + * @param updateReqVO 更新信息 + */ + void updateDzQuestion(@Valid DzQuestionUpdateReqVO updateReqVO); + + /** + * 删除导诊管理 + * + * @param id 编号 + */ + void deleteDzQuestion(Integer id); + + /** + * 获得导诊管理 + * + * @param id 编号 + * @return 导诊管理 + */ + DzQuestionDO getDzQuestion(Integer id); + + /** + * 获得导诊管理列表 + * + * @param ids 编号 + * @return 导诊管理列表 + */ + List getDzQuestionList(Collection ids); + + /** + * 获得导诊管理分页 + * + * @param pageReqVO 分页查询 + * @return 导诊管理分页 + */ + PageResult getDzQuestionPage(DzQuestionPageReqVO pageReqVO); + + /** + * 获得导诊管理列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 导诊管理列表 + */ + List getDzQuestionList(DzQuestionExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dzquestion/DzQuestionServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dzquestion/DzQuestionServiceImpl.java new file mode 100644 index 0000000..35e8016 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dzquestion/DzQuestionServiceImpl.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.dzquestion; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.dzquestion.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.dzquestion.DzQuestionDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.dzquestion.DzQuestionConvert; +import com.jojubanking.boot.module.system.dal.mysql.dzquestion.DzQuestionMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 导诊管理 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class DzQuestionServiceImpl implements DzQuestionService { + + @Resource + private DzQuestionMapper dzQuestionMapper; + + @Override + public Integer createDzQuestion(DzQuestionCreateReqVO createReqVO) { + // 插入 + DzQuestionDO dzQuestion = DzQuestionConvert.INSTANCE.convert(createReqVO); + dzQuestionMapper.insert(dzQuestion); + // 返回 + return dzQuestion.getId(); + } + + @Override + public void updateDzQuestion(DzQuestionUpdateReqVO updateReqVO) { + // 校验存在 + this.validateDzQuestionExists(updateReqVO.getId()); + // 更新 + DzQuestionDO updateObj = DzQuestionConvert.INSTANCE.convert(updateReqVO); + dzQuestionMapper.updateById(updateObj); + } + + @Override + public void deleteDzQuestion(Integer id) { + // 校验存在 + this.validateDzQuestionExists(id); + // 删除 + dzQuestionMapper.deleteById(id); + } + + private void validateDzQuestionExists(Integer id) { + if (dzQuestionMapper.selectById(id) == null) { + throw exception(DZ_QUESTION_NOT_EXISTS); + } + } + + @Override + public DzQuestionDO getDzQuestion(Integer id) { + return dzQuestionMapper.selectById(id); + } + + @Override + public List getDzQuestionList(Collection ids) { + return dzQuestionMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDzQuestionPage(DzQuestionPageReqVO pageReqVO) { + return dzQuestionMapper.selectPage(pageReqVO); + } + + @Override + public List getDzQuestionList(DzQuestionExportReqVO exportReqVO) { + return dzQuestionMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dztype/DzTypeService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dztype/DzTypeService.java new file mode 100644 index 0000000..df16d74 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dztype/DzTypeService.java @@ -0,0 +1,72 @@ +package com.jojubanking.boot.module.system.service.dztype; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.dztype.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.dztype.DzTypeDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 导诊类型 Service 接口 + * + * @author admin + */ +public interface DzTypeService { + + /** + * 创建导诊类型 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createDzType(@Valid DzTypeCreateReqVO createReqVO); + + /** + * 更新导诊类型 + * + * @param updateReqVO 更新信息 + */ + void updateDzType(@Valid DzTypeUpdateReqVO updateReqVO); + + /** + * 删除导诊类型 + * + * @param id 编号 + */ + void deleteDzType(Integer id); + + /** + * 获得导诊类型 + * + * @param id 编号 + * @return 导诊类型 + */ + DzTypeDO getDzType(Integer id); + + /** + * 获得导诊类型列表 + * + * @param ids 编号 + * @return 导诊类型列表 + */ + List getDzTypeList(Collection ids); + + /** + * 获得导诊类型分页 + * + * @param pageReqVO 分页查询 + * @return 导诊类型分页 + */ + PageResult getDzTypePage(DzTypePageReqVO pageReqVO); + PageResult getDzTypePageGroup(DzTypePageReqVO pageReqVO); + PageResult getDzTypeGroup(DzTypePageReqVO pageReqVO); + + /** + * 获得导诊类型列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 导诊类型列表 + */ + List getDzTypeList(DzTypeExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dztype/DzTypeServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dztype/DzTypeServiceImpl.java new file mode 100644 index 0000000..ae10bf7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/dztype/DzTypeServiceImpl.java @@ -0,0 +1,89 @@ +package com.jojubanking.boot.module.system.service.dztype; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.dztype.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.dztype.DzTypeDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.dztype.DzTypeConvert; +import com.jojubanking.boot.module.system.dal.mysql.dztype.DzTypeMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 导诊类型 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class DzTypeServiceImpl implements DzTypeService { + + @Resource + private DzTypeMapper dzTypeMapper; + + @Override + public Integer createDzType(DzTypeCreateReqVO createReqVO) { + // 插入 + DzTypeDO dzType = DzTypeConvert.INSTANCE.convert(createReqVO); + dzTypeMapper.insert(dzType); + // 返回 + return dzType.getId(); + } + + @Override + public void updateDzType(DzTypeUpdateReqVO updateReqVO) { + // 校验存在 + this.validateDzTypeExists(updateReqVO.getId()); + // 更新 + DzTypeDO updateObj = DzTypeConvert.INSTANCE.convert(updateReqVO); + dzTypeMapper.updateById(updateObj); + } + + @Override + public void deleteDzType(Integer id) { + // 校验存在 + this.validateDzTypeExists(id); + // 删除 + dzTypeMapper.deleteById(id); + } + + private void validateDzTypeExists(Integer id) { + if (dzTypeMapper.selectById(id) == null) { + throw exception(DZ_TYPE_NOT_EXISTS); + } + } + + @Override + public DzTypeDO getDzType(Integer id) { + return dzTypeMapper.selectById(id); + } + + @Override + public List getDzTypeList(Collection ids) { + return dzTypeMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDzTypePageGroup(DzTypePageReqVO pageReqVO) { + return dzTypeMapper.selectPage1(pageReqVO); + } + public PageResult getDzTypeGroup(DzTypePageReqVO pageReqVO) { + return dzTypeMapper.selectPage2(pageReqVO); + } + + @Override + public PageResult getDzTypePage(DzTypePageReqVO pageReqVO) { + return dzTypeMapper.selectPage(pageReqVO); + } + + public List getDzTypeList(DzTypeExportReqVO exportReqVO) { + return dzTypeMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeService.java new file mode 100644 index 0000000..3e98361 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeService.java @@ -0,0 +1,87 @@ +package com.jojubanking.boot.module.system.service.errorcode; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeRespDTO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.errorcode.ErrorCodeDO; + +import javax.validation.Valid; +import java.util.Date; +import java.util.List; + +/** + * 错误码 Service 接口 + * + * @author TW + */ +public interface ErrorCodeService { + + /** + * 自动创建错误码 + * + * @param autoGenerateDTOs 错误码信息 + */ + void autoGenerateErrorCodes(@Valid List autoGenerateDTOs); + + /** + * 增量获得错误码数组 + * + * 如果 minUpdateTime 为空时,则获取所有错误码 + * + * @param applicationName 应用名 + * @param minUpdateTime 最小更新时间 + * @return 错误码数组 + */ + List getErrorCodeList(String applicationName, Date minUpdateTime); + + /** + * 创建错误码 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createErrorCode(@Valid ErrorCodeCreateReqVO createReqVO); + + /** + * 更新错误码 + * + * @param updateReqVO 更新信息 + */ + void updateErrorCode(@Valid ErrorCodeUpdateReqVO updateReqVO); + + /** + * 删除错误码 + * + * @param id 编号 + */ + void deleteErrorCode(Long id); + + /** + * 获得错误码 + * + * @param id 编号 + * @return 错误码 + */ + ErrorCodeDO getErrorCode(Long id); + + /** + * 获得错误码分页 + * + * @param pageReqVO 分页查询 + * @return 错误码分页 + */ + PageResult getErrorCodePage(ErrorCodePageReqVO pageReqVO); + + /** + * 获得错误码列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 错误码列表 + */ + List getErrorCodeList(ErrorCodeExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeServiceImpl.java new file mode 100644 index 0000000..817e643 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeServiceImpl.java @@ -0,0 +1,174 @@ +package com.jojubanking.boot.module.system.service.errorcode; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeRespDTO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeUpdateReqVO; +import com.jojubanking.boot.module.system.convert.errorcode.ErrorCodeConvert; +import com.jojubanking.boot.module.system.dal.dataobject.errorcode.ErrorCodeDO; +import com.jojubanking.boot.module.system.dal.mysql.errorcode.ErrorCodeMapper; +import com.jojubanking.boot.module.system.enums.errorcode.ErrorCodeTypeEnum; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertMap; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertSet; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.ERROR_CODE_DUPLICATE; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.ERROR_CODE_NOT_EXISTS; + +/** + * 错误码 Service 实现类 + * + * @author dlyan + */ +@Service +@Validated +@Slf4j +public class ErrorCodeServiceImpl implements ErrorCodeService { + + @Resource + private ErrorCodeMapper errorCodeMapper; + + @Override + public Long createErrorCode(ErrorCodeCreateReqVO createReqVO) { + // 校验 code 重复 + validateCodeDuplicate(createReqVO.getCode(), null); + + // 插入 + ErrorCodeDO errorCode = ErrorCodeConvert.INSTANCE.convert(createReqVO); + errorCode.setType(ErrorCodeTypeEnum.MANUAL_OPERATION.getType()); + errorCodeMapper.insert(errorCode); + // 返回 + return errorCode.getId(); + } + + @Override + public void updateErrorCode(ErrorCodeUpdateReqVO updateReqVO) { + // 校验存在 + this.validateErrorCodeExists(updateReqVO.getId()); + // 校验 code 重复 + validateCodeDuplicate(updateReqVO.getCode(), updateReqVO.getId()); + + // 更新 + ErrorCodeDO updateObj = ErrorCodeConvert.INSTANCE.convert(updateReqVO); + updateObj.setType(ErrorCodeTypeEnum.MANUAL_OPERATION.getType()); + errorCodeMapper.updateById(updateObj); + } + + @Override + public void deleteErrorCode(Long id) { + // 校验存在 + this.validateErrorCodeExists(id); + // 删除 + errorCodeMapper.deleteById(id); + } + + /** + * 校验错误码的唯一字段是否重复 + * + * 是否存在相同编码的错误码 + * + * @param code 错误码编码 + * @param id 错误码编号 + */ + @VisibleForTesting + public void validateCodeDuplicate(Integer code, Long id) { + ErrorCodeDO errorCodeDO = errorCodeMapper.selectByCode(code); + if (errorCodeDO == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的错误码 + if (id == null) { + throw exception(ERROR_CODE_DUPLICATE); + } + if (!errorCodeDO.getId().equals(id)) { + throw exception(ERROR_CODE_DUPLICATE); + } + } + + @VisibleForTesting + public void validateErrorCodeExists(Long id) { + if (errorCodeMapper.selectById(id) == null) { + throw exception(ERROR_CODE_NOT_EXISTS); + } + } + + @Override + public ErrorCodeDO getErrorCode(Long id) { + return errorCodeMapper.selectById(id); + } + + @Override + public PageResult getErrorCodePage(ErrorCodePageReqVO pageReqVO) { + return errorCodeMapper.selectPage(pageReqVO); + } + + @Override + public List getErrorCodeList(ErrorCodeExportReqVO exportReqVO) { + return errorCodeMapper.selectList(exportReqVO); + } + + @Override + @Transactional + public void autoGenerateErrorCodes(List autoGenerateDTOs) { + if (CollUtil.isEmpty(autoGenerateDTOs)) { + return; + } + // 获得错误码 + List errorCodeDOs = errorCodeMapper.selectListByCodes( + convertSet(autoGenerateDTOs, ErrorCodeAutoGenerateReqDTO::getCode)); + Map errorCodeDOMap = convertMap(errorCodeDOs, ErrorCodeDO::getCode); + + // 遍历 autoGenerateBOs 数组,逐个插入或更新。考虑到每次量级不大,就不走批量了 + autoGenerateDTOs.forEach(autoGenerateDTO -> { + ErrorCodeDO errorCodeDO = errorCodeDOMap.get(autoGenerateDTO.getCode()); + // 不存在,则进行新增 + if (errorCodeDO == null) { + errorCodeDO = ErrorCodeConvert.INSTANCE.convert(autoGenerateDTO); + errorCodeDO.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType()); + errorCodeMapper.insert(errorCodeDO); + return; + } + // 存在,则进行更新。更新有三个前置条件: + // 条件 1. 只更新自动生成的错误码,即 Type 为 ErrorCodeTypeEnum.AUTO_GENERATION + if (!ErrorCodeTypeEnum.AUTO_GENERATION.getType().equals(errorCodeDO.getType())) { + return; + } + // 条件 2. 分组 applicationName 必须匹配,避免存在错误码冲突的情况 + if (!autoGenerateDTO.getApplicationName().equals(errorCodeDO.getApplicationName())) { + log.error("[autoGenerateErrorCodes][自动创建({}/{}) 错误码失败,数据库中已经存在({}/{})]", + autoGenerateDTO.getCode(), autoGenerateDTO.getApplicationName(), + errorCodeDO.getCode(), errorCodeDO.getApplicationName()); + return; + } + // 条件 3. 错误提示语存在差异 + if (autoGenerateDTO.getMessage().equals(errorCodeDO.getMessage())) { + return; + } + // 最终匹配,进行更新 + errorCodeMapper.updateById(new ErrorCodeDO().setId(errorCodeDO.getId()).setMessage(autoGenerateDTO.getMessage())); + }); + } + + @Override + public List getErrorCodeList(String applicationName, Date minUpdateTime) { + List errorCodeDOs = errorCodeMapper.selectListByApplicationNameAndUpdateTimeGt( + applicationName, minUpdateTime); + return ErrorCodeConvert.INSTANCE.convertList03(errorCodeDOs); + } + +} + diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/hospital/HospitalService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/hospital/HospitalService.java new file mode 100644 index 0000000..6c5f422 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/hospital/HospitalService.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.service.hospital; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.hospital.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.hospital.HospitalDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 医院信息 Service 接口 + * + * @author admin + */ +public interface HospitalService { + + /** + * 创建医院信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createHospital(@Valid HospitalCreateReqVO createReqVO); + + /** + * 更新医院信息 + * + * @param updateReqVO 更新信息 + */ + void updateHospital(@Valid HospitalUpdateReqVO updateReqVO); + + /** + * 删除医院信息 + * + * @param id 编号 + */ + void deleteHospital(Integer id); + + /** + * 获得医院信息 + * + * @param id 编号 + * @return 医院信息 + */ + HospitalDO getHospital(Integer id); + + /** + * 获得医院信息列表 + * + * @param ids 编号 + * @return 医院信息列表 + */ + List getHospitalList(Collection ids); + + /** + * 获得医院信息分页 + * + * @param pageReqVO 分页查询 + * @return 医院信息分页 + */ + PageResult getHospitalPage(HospitalPageReqVO pageReqVO); + + /** + * 获得医院信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 医院信息列表 + */ + List getHospitalList(HospitalExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/hospital/HospitalServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/hospital/HospitalServiceImpl.java new file mode 100644 index 0000000..0602d08 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/hospital/HospitalServiceImpl.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.hospital; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.hospital.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.hospital.HospitalDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.hospital.HospitalConvert; +import com.jojubanking.boot.module.system.dal.mysql.hospital.HospitalMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 医院信息 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class HospitalServiceImpl implements HospitalService { + + @Resource + private HospitalMapper hospitalMapper; + + @Override + public Integer createHospital(HospitalCreateReqVO createReqVO) { + // 插入 + HospitalDO hospital = HospitalConvert.INSTANCE.convert(createReqVO); + hospitalMapper.insert(hospital); + // 返回 + return hospital.getId(); + } + + @Override + public void updateHospital(HospitalUpdateReqVO updateReqVO) { + // 校验存在 + this.validateHospitalExists(updateReqVO.getId()); + // 更新 + HospitalDO updateObj = HospitalConvert.INSTANCE.convert(updateReqVO); + hospitalMapper.updateById(updateObj); + } + + @Override + public void deleteHospital(Integer id) { + // 校验存在 + this.validateHospitalExists(id); + // 删除 + hospitalMapper.deleteById(id); + } + + private void validateHospitalExists(Integer id) { + if (hospitalMapper.selectById(id) == null) { + throw exception(HOSPITAL_NOT_EXISTS); + } + } + + @Override + public HospitalDO getHospital(Integer id) { + return hospitalMapper.selectById(id); + } + + @Override + public List getHospitalList(Collection ids) { + return hospitalMapper.selectBatchIds(ids); + } + + @Override + public PageResult getHospitalPage(HospitalPageReqVO pageReqVO) { + return hospitalMapper.selectPage(pageReqVO); + } + + @Override + public List getHospitalList(HospitalExportReqVO exportReqVO) { + return hospitalMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/information/InformationService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/information/InformationService.java new file mode 100644 index 0000000..c8e42b7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/information/InformationService.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.service.information; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.information.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.information.InformationDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 指南信息 Service 接口 + * + * @author admin + */ +public interface InformationService { + + /** + * 创建指南信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createInformation(@Valid InformationCreateReqVO createReqVO); + + /** + * 更新指南信息 + * + * @param updateReqVO 更新信息 + */ + void updateInformation(@Valid InformationUpdateReqVO updateReqVO); + + /** + * 删除指南信息 + * + * @param id 编号 + */ + void deleteInformation(Integer id); + + /** + * 获得指南信息 + * + * @param id 编号 + * @return 指南信息 + */ + InformationDO getInformation(Integer id); + + /** + * 获得指南信息列表 + * + * @param ids 编号 + * @return 指南信息列表 + */ + List getInformationList(Collection ids); + + /** + * 获得指南信息分页 + * + * @param pageReqVO 分页查询 + * @return 指南信息分页 + */ + PageResult getInformationPage(InformationPageReqVO pageReqVO); + + /** + * 获得指南信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 指南信息列表 + */ + List getInformationList(InformationExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/information/InformationServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/information/InformationServiceImpl.java new file mode 100644 index 0000000..963c80e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/information/InformationServiceImpl.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.information; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.information.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.information.InformationDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.information.InformationConvert; +import com.jojubanking.boot.module.system.dal.mysql.information.InformationMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 指南信息 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class InformationServiceImpl implements InformationService { + + @Resource + private InformationMapper informationMapper; + + @Override + public Integer createInformation(InformationCreateReqVO createReqVO) { + // 插入 + InformationDO information = InformationConvert.INSTANCE.convert(createReqVO); + informationMapper.insert(information); + // 返回 + return information.getId(); + } + + @Override + public void updateInformation(InformationUpdateReqVO updateReqVO) { + // 校验存在 + this.validateInformationExists(updateReqVO.getId()); + // 更新 + InformationDO updateObj = InformationConvert.INSTANCE.convert(updateReqVO); + informationMapper.updateById(updateObj); + } + + @Override + public void deleteInformation(Integer id) { + // 校验存在 + this.validateInformationExists(id); + // 删除 + informationMapper.deleteById(id); + } + + private void validateInformationExists(Integer id) { + if (informationMapper.selectById(id) == null) { + throw exception(INFORMATION_NOT_EXISTS); + } + } + + @Override + public InformationDO getInformation(Integer id) { + return informationMapper.selectById(id); + } + + @Override + public List getInformationList(Collection ids) { + return informationMapper.selectBatchIds(ids); + } + + @Override + public PageResult getInformationPage(InformationPageReqVO pageReqVO) { + return informationMapper.selectPage(pageReqVO); + } + + @Override + public List getInformationList(InformationExportReqVO exportReqVO) { + return informationMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/item/ItemService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/item/ItemService.java new file mode 100644 index 0000000..840076b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/item/ItemService.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.item; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.item.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 检查项目 Service 接口 + * + * @author admin + */ +public interface ItemService { + + Map getLCzxks(String itemname); + Map getSFXMMzxks(String itemname); + + public List> getItemPriceLc(String itemnos); + public List> getItemPricexxm(String itemnos); + + /** + * 创建检查项目 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createItem(@Valid ItemCreateReqVO createReqVO); + + /** + * 更新检查项目 + * + * @param updateReqVO 更新信息 + */ + void updateItem(@Valid ItemUpdateReqVO updateReqVO); + public void updateItemByChild(ItemDO itemDO); + + public void updateItemPriceByNo(ItemDO itemDO); + + public List> getItemPrice(String itemnos); + + /** + * 删除检查项目 + * + * @param id 编号 + */ + void deleteItem(Long id); + + /** + * 获得检查项目 + * + * @param id 编号 + * @return 检查项目 + */ + ItemDO getItem(Long id); + + /** + * 获得检查项目列表 + * + * @param ids 编号 + * @return 检查项目列表 + */ + List getItemList(Collection ids); + + List getSimpleItemList(String patid, String packageno, String batchno); + /** + * 获得检查项目分页 + * + * @param pageReqVO 分页查询 + * @return 检查项目分页 + */ + PageResult getItemPage(ItemPageReqVO pageReqVO); + + /** + * 获得检查项目列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检查项目列表 + */ + List getItemList(ItemExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/item/ItemServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/item/ItemServiceImpl.java new file mode 100644 index 0000000..ed97be2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/item/ItemServiceImpl.java @@ -0,0 +1,449 @@ +package com.jojubanking.boot.module.system.service.item; + +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.ItemListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import com.jojubanking.boot.module.system.dal.dataobject.xytjjg.XytjjgDO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.sql.*; +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.item.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.item.ItemConvert; +import com.jojubanking.boot.module.system.dal.mysql.item.ItemMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 检查项目 Service 实现类 + * + * @author admin + */ +@Service +@Validated +@Slf4j +public class ItemServiceImpl implements ItemService { + + @Resource + private ItemMapper itemMapper; + + public Map getLCzxks(String itemname){ + log.info("getLCzxks"); + Map resmap = new HashMap(); + + String URL = "jdbc:sqlserver://168.168.0.10:1433;databaseName=THIS4"; + String USER = "joju"; + String PASSWORD = "Joju@123"; + List> list = new ArrayList<>(); + // 1.加载驱动程序 + try { + Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + // 2.获得数据库链接 + log.info("开始链接数据库"); + Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); + log.info("打印链接状态:" + conn); + // 3.通过数据库的连接操作数据库,实现增删改查(使用Statement类) +// String inHosnum = "811134"; + String sql = "select * from joju_lcxm where name ='" + itemname + "'"; + log.info("打印sql" + sql); + Statement statement = conn.createStatement(); + ResultSet rs = statement.executeQuery(sql); + log.info("返回结果是:" + rs); + // 4.处理数据库的返回结果(使用ResultSet类) + while (rs.next()) { + log.info("开始处理数据"); + Map map = new HashMap(); + map.put("id", rs.getString("id")); + map.put("name", rs.getString("name")); + map.put("zxks_id", rs.getString("zxks_id")); + String strzxksname = rs.getString("zxks_name"); + if(strzxksname == null){ + map.put("zxks_name", ""); + }else{ + map.put("zxks_name", rs.getString("zxks_name")); + } + map.put("xmdj", rs.getString("xmdj")); + list.add(map); + } + log.info("list size: " + list.size()); + // 关闭资源【多谢指正】 + rs.close(); + statement.close(); + conn.close(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } + + //每个项目应该只对应一个zxks 或者为空 + if(list.size() == 0){ + log.info("执行科室为空,默认1716"); + resmap.put("zxks", "1716"); + resmap.put("zxksname", "儿童保健部"); + return resmap; + }else{ + String strzxks = list.get(0).get("zxks_id").toString(); + String strzxksname = list.get(0).get("zxks_name").toString(); + if(strzxks.trim().isEmpty()){ + log.info("执行科室为空,默认1716"); + resmap.put("zxks", "1716"); + resmap.put("zxksname", "儿童保健部"); + return resmap; + }else{ + log.info("执行科室为:" + strzxks); + resmap.put("zxks", strzxks); + resmap.put("zxksname", strzxksname); + return resmap; + } + } + } + + public Map getSFXMMzxks(String itemname){ + log.info("getSFXMMzxks"); + Map resmap = new HashMap(); +// String URL = "jdbc:sqlserver:thin:@//168.168.0.10:1433/THIS4"; + String URL = "jdbc:sqlserver://168.168.0.10:1433;databaseName=THIS4"; + String USER = "joju"; + String PASSWORD = "Joju@123"; + List> list = new ArrayList<>(); + // 1.加载驱动程序 + try { + Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + // 2.获得数据库链接 + log.info("开始链接数据库"); + Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); + log.info("打印链接状态:" + conn); + // 3.通过数据库的连接操作数据库,实现增删改查(使用Statement类) +// String inHosnum = "811134"; + String sql = "select * from joju_sfxxm where name ='" + itemname + "'";; + log.info("打印sql" + sql); + Statement statement = conn.createStatement(); + ResultSet rs = statement.executeQuery(sql); + log.info("返回结果是:" + rs); + // 4.处理数据库的返回结果(使用ResultSet类) + while (rs.next()) { + log.info("开始处理数据"); + Map map = new HashMap(); +// log.info("打印itemType" + rs.getString("ItemType")); + map.put("id", rs.getString("id")); + map.put("name", rs.getString("name")); + map.put("zxks_id", rs.getString("zxks_id")); + String strzxksname = rs.getString("zxks_name"); + if(strzxksname == null){ + map.put("zxks_name", ""); + }else{ + map.put("zxks_name", rs.getString("zxks_name")); + } + map.put("xmdj", rs.getString("xmdj")); + list.add(map); + } + log.info("list is " + list); + // 关闭资源【多谢指正】 + rs.close(); + statement.close(); + conn.close(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } + + //每个项目应该只对应一个zxks 或者为空 + if(list.size() == 0){ + log.info("执行科室为空,默认1716"); + resmap.put("zxks", "1716"); + resmap.put("zxksname", "儿童保健部"); + return resmap; + }else{ + String strzxks = list.get(0).get("zxks_id").toString(); + String strzxksname = list.get(0).get("zxks_name").toString(); + if(strzxks.trim().isEmpty()){ + log.info("执行科室为空,默认1716"); + resmap.put("zxks", "1716"); + resmap.put("zxksname", "儿童保健部"); + return resmap; + }else{ + log.info("执行科室为:" + strzxks); + resmap.put("zxks", strzxks); + resmap.put("zxksname", strzxksname); + return resmap; + } + } + + } + + public List> getItemPricexxm(String itemnos){ + log.info("getItemPricexxm"); + String URL = "jdbc:sqlserver://168.168.0.10:1433;databaseName=THIS4"; + String USER = "joju"; + String PASSWORD = "Joju@123"; + List> list = new ArrayList<>(); + // 1.加载驱动程序 + try { + Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + // 2.获得数据库链接 + log.info("开始链接数据库"); + Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); + log.info("打印链接状态:" + conn); + // 3.通过数据库的连接操作数据库,实现增删改查(使用Statement类) + String sql = "select * from joju_sfxxm where id in (" + itemnos + ")"; + log.info("打印sql" + sql); + Statement statement = conn.createStatement(); + ResultSet rs = statement.executeQuery(sql); + log.info("返回结果是:" + rs); + // 4.处理数据库的返回结果(使用ResultSet类) + while (rs.next()) { + log.info("开始处理数据"); + Map map = new HashMap(); + map.put("id", rs.getString("id")); + map.put("name", rs.getString("name")); + map.put("zxks_id", rs.getString("zxks_id")); + map.put("xmdj", rs.getString("xmdj")); + list.add(map); + } + log.info("list size: " + list); + // 关闭资源【多谢指正】 + rs.close(); + statement.close(); + conn.close(); + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } + return list; + } + + public List> getItemPriceLc(String itemnos){ + log.info("getLCzxks"); + String URL = "jdbc:sqlserver://168.168.0.10:1433;databaseName=THIS4"; + String USER = "joju"; + String PASSWORD = "Joju@123"; + List> list = new ArrayList<>(); + // 1.加载驱动程序 + try { + Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + // 2.获得数据库链接 + log.info("开始链接数据库"); + Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); + log.info("打印链接状态:" + conn); + // 3.通过数据库的连接操作数据库,实现增删改查(使用Statement类) + String sql = "select * from joju_lcxm where id in (" + itemnos + ")"; + log.info("打印sql" + sql); + Statement statement = conn.createStatement(); + ResultSet rs = statement.executeQuery(sql); + log.info("返回结果是:" + rs); + // 4.处理数据库的返回结果(使用ResultSet类) + while (rs.next()) { + log.info("开始处理数据"); + Map map = new HashMap(); + map.put("id", rs.getString("id")); + map.put("name", rs.getString("name")); + map.put("zxks_id", rs.getString("zxks_id")); + map.put("xmdj", rs.getString("xmdj")); + list.add(map); + } + log.info("list size: " + list); + // 关闭资源【多谢指正】 + rs.close(); + statement.close(); + conn.close(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } + return list; + } + public Object ItemPriceQuery(String QueryNum){ + String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + String dburl = "jdbc:sqlserver://168.168.0.79:1433;DatabaseName = THIS4"; +// // 方案一 +// String dburl = "jdbc:sqlserver://localhost:1433;DatabaseName = SQL_Road;encrypt=false"; +// // 方案一 +// String dburl = "jdbc:sqlserver://localhost:1433;DatabaseName = SQL_Road;encrypt=true;trustServerCertificate=true"; + String userName = "a";//数据库对应用户 + String userPwd = "1";//数据库对应密码 + Map map=new HashMap(); + try { + Class.forName(driverName); + log.info("THIS4驱动连接成功!!!"); + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + log.info("THIS4驱动加载失败"); + } + + try { + Connection dbcon = DriverManager.getConnection(dburl,userName,userPwd); + log.info("THIS4数据库连接成功!"); + + //预编译 + String sql="select * from VW_XMJGHQ where id='"+QueryNum+"'"; + Statement statement = dbcon.createStatement(); + ResultSet rs = statement.executeQuery(sql); + // 4.处理数据库的返回结果(使用ResultSet类) + while (rs.next()) { + map.put("name",rs.getString("name")); + map.put("dxmmc",rs.getString("dxmmc")); + map.put("py",rs.getString("py")); + map.put("xmdw",rs.getString("xmdw")); + map.put("xmdj",rs.getString("xmdj")); + map.put("zxks_mc",rs.getString("zxks_mc")); + break; + } + + // 关闭资源 + rs.close(); + statement.close(); + dbcon.close(); + } catch (SQLException e) { + e.printStackTrace(); + log.info("THIS4q驱动连接失败"); + } + + return map; + } + + @Override + public Long createItem(ItemCreateReqVO createReqVO) { + // 插入 + ItemDO item = ItemConvert.INSTANCE.convert(createReqVO); + itemMapper.insert(item); + // 返回 + return item.getId(); + } + + @Override + public void updateItem(ItemUpdateReqVO updateReqVO) { + // 校验存在 + this.validateItemExists(updateReqVO.getId()); + // 更新 + ItemDO updateObj = ItemConvert.INSTANCE.convert(updateReqVO); + itemMapper.updateById(updateObj); + } + @Override + public void updateItemPriceByNo(ItemDO itemDO){ + itemMapper.updateItemPriceByNo(itemDO); + } + + @Override + public void updateItemByChild(ItemDO itemDO){ + itemMapper.updateItemByChild(itemDO); + } + + @Override + public List> getItemPrice(String itemnos){ + String sql = "select * from HIS_RJKDXMCX where HIS代码 in (" + itemnos + ") "; + log.info("打印sql" + sql); + List> list = new ArrayList<>(); + Map map = new HashMap(); + map.put("itemno", "387"); + map.put("itemname", "静脉采血(检验科)"); + map.put("itemprice", "200"); + list.add(map); + Map map1 = new HashMap(); + map1.put("itemno", "310300007A"); + map1.put("itemname", "验光"); + map1.put("itemprice", "300"); + list.add(map1); + + return list; + +// //体检项目价格视图 HIS_RJKDXMCX +//// SELECT * FROM [dbo].[HIS_RJKDXMCX] +//// where [HIS代码]='387' +//// select * from HIS_RJKDXMCX +//// where [HIS代码] IN ('387','485') +// log.info("拼接数据"); +//// String URL = "jdbc:sqlserver:thin:@//168.168.0.10:1433/THIS4"; +// String URL = "jdbc:sqlserver://168.168.0.10:1433;databaseName=THIS4"; +// String USER = "joju"; +// String PASSWORD = "1"; +// List> list = null; +// // 1.加载驱动程序 +// try { +// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); +// // 2.获得数据库链接 +// log.info("开始链接数据库"); +// Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); +// log.info("打印链接状态:" + conn); +// // 3.通过数据库的连接操作数据库,实现增删改查(使用Statement类) +//// String inHosnum = "811134"; +// String sql = "select * from HIS_RJKDXMCX where HIS代码 in (" + itemnos + ") "; +// log.info("打印sql" + sql); +// Statement statement = conn.createStatement(); +// ResultSet rs = statement.executeQuery(sql); +// log.info("返回结果是:" + rs); +// // 4.处理数据库的返回结果(使用ResultSet类) +// while (rs.next()) { +// log.info("开始处理数据"); +// Map map = new HashMap(); +//// log.info("打印itemType" + rs.getString("ItemType")); +// map.put("itemno", rs.getString("HIS代码")); +// map.put("itemname", rs.getString("项目名称")); +// map.put("itemprice", rs.getString("单价")); +// list.add(map); +// } +// log.info("list is " + list); +// // 关闭资源【多谢指正】 +// rs.close(); +// statement.close(); +// conn.close(); +// } catch (ClassNotFoundException e) { +// e.printStackTrace(); +// } catch (SQLException e) { +// e.printStackTrace(); +// } +// return list; + } + + @Override + public void deleteItem(Long id) { + // 校验存在 + this.validateItemExists(id); + // 删除 + itemMapper.deleteById(id); + } + + private void validateItemExists(Long id) { + if (itemMapper.selectById(id) == null) { + throw exception(ITEM_NOT_EXISTS); + } + } + + @Override + public ItemDO getItem(Long id) { + return itemMapper.selectById(id); + } + + @Override + public List getItemList(Collection ids) { + return itemMapper.selectBatchIds(ids); + } + + @Override + public List getSimpleItemList(String patid, String packageno, String batchno) { + // return itemMapper.selectSimpleList(itemListReqVO); + return itemMapper.selectItemStandardListByOrder(patid, packageno, batchno); + } + + @Override + public PageResult getItemPage(ItemPageReqVO pageReqVO) { + return itemMapper.selectPage(pageReqVO); + } + + @Override + public List getItemList(ItemExportReqVO exportReqVO) { + return itemMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/ksinfo/KsInfoService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/ksinfo/KsInfoService.java new file mode 100644 index 0000000..5aea739 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/ksinfo/KsInfoService.java @@ -0,0 +1,73 @@ +package com.jojubanking.boot.module.system.service.ksinfo; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.ksinfo.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.ksinfo.KsInfoDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 科室信息 Service 接口 + * + * @author admin + */ +public interface KsInfoService { + + /** + * 创建科室信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createKsInfo(@Valid KsInfoCreateReqVO createReqVO); + + /** + * 更新科室信息 + * + * @param updateReqVO 更新信息 + */ + void updateKsInfo(@Valid KsInfoUpdateReqVO updateReqVO); + + /** + * 删除科室信息 + * + * @param id 编号 + */ + void deleteKsInfo(Integer id); + + /** + * 获得科室信息 + * + * @param id 编号 + * @return 科室信息 + */ + KsInfoDO getKsInfo(Integer id); + + /** + * 获得科室信息列表 + * + * @param ids 编号 + * @return 科室信息列表 + */ + List getKsInfoList(Collection ids); + + /** + * 获得科室信息分页 + * + * @param pageReqVO 分页查询 + * @return 科室信息分页 + */ + PageResult getKsInfoPage(KsInfoPageReqVO pageReqVO); + + PageResult getDzInfoPage(KsInfoPageReqVO pageReqVO); + + /** + * 获得科室信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 科室信息列表 + */ + List getKsInfoList(KsInfoExportReqVO exportReqVO); + + void updateKsInfoPerDay(String kscode, String name, String departtype); +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/ksinfo/KsInfoServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/ksinfo/KsInfoServiceImpl.java new file mode 100644 index 0000000..1d42be6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/ksinfo/KsInfoServiceImpl.java @@ -0,0 +1,113 @@ +package com.jojubanking.boot.module.system.service.ksinfo; + +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.ksinfo.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.ksinfo.KsInfoDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.ksinfo.KsInfoConvert; +import com.jojubanking.boot.module.system.dal.mysql.ksinfo.KsInfoMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 科室信息 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class KsInfoServiceImpl implements KsInfoService { + + @Resource + private KsInfoMapper ksInfoMapper; + + @Override + public Integer createKsInfo(KsInfoCreateReqVO createReqVO) { + // 插入 + KsInfoDO ksInfo = KsInfoConvert.INSTANCE.convert(createReqVO); + ksInfoMapper.insert(ksInfo); + // 返回 + return ksInfo.getId(); + } + + @Override + public void updateKsInfo(KsInfoUpdateReqVO updateReqVO) { + // 校验存在 + this.validateKsInfoExists(updateReqVO.getId()); + // 更新 + KsInfoDO updateObj = KsInfoConvert.INSTANCE.convert(updateReqVO); + ksInfoMapper.updateById(updateObj); + } + + @Override + public void deleteKsInfo(Integer id) { + // 校验存在 + this.validateKsInfoExists(id); + // 删除 + ksInfoMapper.deleteById(id); + } + + private void validateKsInfoExists(Integer id) { + if (ksInfoMapper.selectById(id) == null) { + throw exception(KS_INFO_NOT_EXISTS); + } + } + + @Override + public KsInfoDO getKsInfo(Integer id) { + return ksInfoMapper.selectById(id); + } + + @Override + public List getKsInfoList(Collection ids) { + return ksInfoMapper.selectBatchIds(ids); + } + + @Override + public PageResult getKsInfoPage(KsInfoPageReqVO pageReqVO) { + return ksInfoMapper.selectPage(pageReqVO); + } + + @Override + public PageResult getDzInfoPage(KsInfoPageReqVO pageReqVO) { + return ksInfoMapper.selectDzPage(pageReqVO); + } + + @Override + public List getKsInfoList(KsInfoExportReqVO exportReqVO) { + return ksInfoMapper.selectList(exportReqVO); + } + + @Override + public void updateKsInfoPerDay(String kscode, String name, String departtype){ + KsInfoDO ksInfoDO1 = new KsInfoDO(); + ksInfoDO1 = ksInfoMapper.selectOne("departcode", kscode); + + if(ksInfoDO1 == null){ + // + KsInfoDO ksInfoDO = new KsInfoDO(); + ksInfoDO.setName(name); + ksInfoDO.setDeparttype(departtype); + ksInfoDO.setDepartcode(kscode); + ksInfoMapper.insert(ksInfoDO); + }else{ + // +// KsInfoDO ksInfoDO = new KsInfoDO(); +// ksInfoDO.setName(name); +// ksInfoDO.setDeparttype(departtype); +// ksInfoDO.setDepartcode(kscode); + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("departcode", kscode).set("departtype", departtype).set("name", name) + .eq("departcode",kscode); + ksInfoMapper.update(null, updateWrapper); + } + } +} + diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/kstype/KsTypeService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/kstype/KsTypeService.java new file mode 100644 index 0000000..44eeefb --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/kstype/KsTypeService.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.service.kstype; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.kstype.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.kstype.KsTypeDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 科室类别 Service 接口 + * + * @author admin + */ +public interface KsTypeService { + + /** + * 创建科室类别 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createKsType(@Valid KsTypeCreateReqVO createReqVO); + + /** + * 更新科室类别 + * + * @param updateReqVO 更新信息 + */ + void updateKsType(@Valid KsTypeUpdateReqVO updateReqVO); + + /** + * 删除科室类别 + * + * @param id 编号 + */ + void deleteKsType(Integer id); + + /** + * 获得科室类别 + * + * @param id 编号 + * @return 科室类别 + */ + KsTypeDO getKsType(Integer id); + + /** + * 获得科室类别列表 + * + * @param ids 编号 + * @return 科室类别列表 + */ + List getKsTypeList(Collection ids); + + /** + * 获得科室类别分页 + * + * @param pageReqVO 分页查询 + * @return 科室类别分页 + */ + PageResult getKsTypePage(KsTypePageReqVO pageReqVO); + + /** + * 获得科室类别列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 科室类别列表 + */ + List getKsTypeList(KsTypeExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/kstype/KsTypeServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/kstype/KsTypeServiceImpl.java new file mode 100644 index 0000000..4cf902b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/kstype/KsTypeServiceImpl.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.kstype; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.kstype.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.kstype.KsTypeDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.kstype.KsTypeConvert; +import com.jojubanking.boot.module.system.dal.mysql.kstype.KsTypeMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 科室类别 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class KsTypeServiceImpl implements KsTypeService { + + @Resource + private KsTypeMapper ksTypeMapper; + + @Override + public Integer createKsType(KsTypeCreateReqVO createReqVO) { + // 插入 + KsTypeDO ksType = KsTypeConvert.INSTANCE.convert(createReqVO); + ksTypeMapper.insert(ksType); + // 返回 + return ksType.getId(); + } + + @Override + public void updateKsType(KsTypeUpdateReqVO updateReqVO) { + // 校验存在 + this.validateKsTypeExists(updateReqVO.getId()); + // 更新 + KsTypeDO updateObj = KsTypeConvert.INSTANCE.convert(updateReqVO); + ksTypeMapper.updateById(updateObj); + } + + @Override + public void deleteKsType(Integer id) { + // 校验存在 + this.validateKsTypeExists(id); + // 删除 + ksTypeMapper.deleteById(id); + } + + private void validateKsTypeExists(Integer id) { + if (ksTypeMapper.selectById(id) == null) { + throw exception(KS_TYPE_NOT_EXISTS); + } + } + + @Override + public KsTypeDO getKsType(Integer id) { + return ksTypeMapper.selectById(id); + } + + @Override + public List getKsTypeList(Collection ids) { + return ksTypeMapper.selectBatchIds(ids); + } + + @Override + public PageResult getKsTypePage(KsTypePageReqVO pageReqVO) { + return ksTypeMapper.selectPage(pageReqVO); + } + + @Override + public List getKsTypeList(KsTypeExportReqVO exportReqVO) { + return ksTypeMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/label/LabelService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/label/LabelService.java new file mode 100644 index 0000000..d49a121 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/label/LabelService.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.service.label; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.label.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.label.LabelDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 信息 Service 接口 + * + * @author admin + */ +public interface LabelService { + + /** + * 创建信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createLabel(@Valid LabelCreateReqVO createReqVO); + + /** + * 更新信息 + * + * @param updateReqVO 更新信息 + */ + void updateLabel(@Valid LabelUpdateReqVO updateReqVO); + + /** + * 删除信息 + * + * @param id 编号 + */ + void deleteLabel(Integer id); + + /** + * 获得信息 + * + * @param id 编号 + * @return 信息 + */ + LabelDO getLabel(Integer id); + + /** + * 获得信息列表 + * + * @param ids 编号 + * @return 信息列表 + */ + List getLabelList(Collection ids); + + /** + * 获得信息分页 + * + * @param pageReqVO 分页查询 + * @return 信息分页 + */ + PageResult getLabelPage(LabelPageReqVO pageReqVO); + + /** + * 获得信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 信息列表 + */ + List getLabelList(LabelExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/label/LabelServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/label/LabelServiceImpl.java new file mode 100644 index 0000000..6ae90ed --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/label/LabelServiceImpl.java @@ -0,0 +1,90 @@ +package com.jojubanking.boot.module.system.service.label; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.label.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.label.LabelDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.label.LabelConvert; +import com.jojubanking.boot.module.system.dal.mysql.label.LabelMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 信息 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class LabelServiceImpl implements LabelService { + + @Resource + private LabelMapper labelMapper; + + @Override + public Integer createLabel(LabelCreateReqVO createReqVO) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("name",createReqVO.getName()); + long count = labelMapper.selectCount(query); + if(count !=0 ){ + throw ServiceExceptionUtil.exception(LABEL_EXISTS); + } + // 插入 + LabelDO label = LabelConvert.INSTANCE.convert(createReqVO); + labelMapper.insert(label); + // 返回 + return label.getId(); + } + + @Override + public void updateLabel(LabelUpdateReqVO updateReqVO) { + // 校验存在 + this.validateLabelExists(updateReqVO.getId()); + // 更新 + LabelDO updateObj = LabelConvert.INSTANCE.convert(updateReqVO); + labelMapper.updateById(updateObj); + } + + @Override + public void deleteLabel(Integer id) { + // 校验存在 + this.validateLabelExists(id); + // 删除 + labelMapper.deleteById(id); + } + + private void validateLabelExists(Integer id) { + if (labelMapper.selectById(id) == null) { + throw exception(LABEL_NOT_EXISTS); + } + } + + @Override + public LabelDO getLabel(Integer id) { + return labelMapper.selectById(id); + } + + @Override + public List getLabelList(Collection ids) { + return labelMapper.selectBatchIds(ids); + } + + @Override + public PageResult getLabelPage(LabelPageReqVO pageReqVO) { + return labelMapper.selectPage(pageReqVO); + } + + @Override + public List getLabelList(LabelExportReqVO exportReqVO) { + return labelMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/logger/LoginLogService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/logger/LoginLogService.java new file mode 100644 index 0000000..023679b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/logger/LoginLogService.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.service.logger; + +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.logger.LoginLogDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.logger.dto.LoginLogCreateReqDTO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 登录日志 Service 接口 + */ +public interface LoginLogService { + + /** + * 获得登录日志分页 + * + * @param reqVO 分页条件 + * @return 登录日志分页 + */ + PageResult getLoginLogPage(LoginLogPageReqVO reqVO); + + /** + * 获得登录日志列表 + * + * @param reqVO 列表条件 + * @return 登录日志列表 + */ + List getLoginLogList(LoginLogExportReqVO reqVO); + + /** + * 创建登录日志 + * + * @param reqDTO 日志信息 + */ + void createLoginLog(@Valid LoginLogCreateReqDTO reqDTO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/logger/LoginLogServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/logger/LoginLogServiceImpl.java new file mode 100644 index 0000000..52d2d1f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/logger/LoginLogServiceImpl.java @@ -0,0 +1,42 @@ +package com.jojubanking.boot.module.system.service.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import com.jojubanking.boot.module.system.convert.logger.LoginLogConvert; +import com.jojubanking.boot.module.system.dal.dataobject.logger.LoginLogDO; +import com.jojubanking.boot.module.system.dal.mysql.logger.LoginLogMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 登录日志 Service 实现 + */ +@Service +@Validated +public class LoginLogServiceImpl implements LoginLogService { + + @Resource + private LoginLogMapper loginLogMapper; + + @Override + public PageResult getLoginLogPage(LoginLogPageReqVO reqVO) { + return loginLogMapper.selectPage(reqVO); + } + + @Override + public List getLoginLogList(LoginLogExportReqVO reqVO) { + return loginLogMapper.selectList(reqVO); + } + + @Override + public void createLoginLog(LoginLogCreateReqDTO reqDTO) { + LoginLogDO loginLog = LoginLogConvert.INSTANCE.convert(reqDTO); + loginLogMapper.insert(loginLog); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/logger/OperateLogService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/logger/OperateLogService.java new file mode 100644 index 0000000..ad5833f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/logger/OperateLogService.java @@ -0,0 +1,43 @@ +package com.jojubanking.boot.module.system.service.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.operatelog.core.service.OperateLog; +import com.jojubanking.boot.framework.operatelog.core.service.OperateLogFrameworkService; +import com.jojubanking.boot.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.logger.OperateLogDO; + +import java.util.List; + +/** + * 操作日志 Service 接口 + * + * @author TW + */ +public interface OperateLogService { + + /** + * 记录操作日志 + * + * @param createReqDTO 操作日志请求 + */ + void createOperateLog(OperateLogCreateReqDTO createReqDTO); + + /** + * 获得操作日志分页列表 + * + * @param reqVO 分页条件 + * @return 操作日志分页列表 + */ + PageResult getOperateLogPage(OperateLogPageReqVO reqVO); + + /** + * 获得操作日志列表 + * + * @param reqVO 列表条件 + * @return 日志列表 + */ + List getOperateLogs(OperateLogExportReqVO reqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/logger/OperateLogServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/logger/OperateLogServiceImpl.java new file mode 100644 index 0000000..ea92dcf --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/logger/OperateLogServiceImpl.java @@ -0,0 +1,75 @@ +package com.jojubanking.boot.module.system.service.logger; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.string.StrUtils; +import com.jojubanking.boot.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import com.jojubanking.boot.module.system.convert.logger.OperateLogConvert; +import com.jojubanking.boot.module.system.dal.dataobject.logger.OperateLogDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.dal.mysql.logger.OperateLogMapper; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertSet; +import static com.jojubanking.boot.module.system.dal.dataobject.logger.OperateLogDO.JAVA_METHOD_ARGS_MAX_LENGTH; +import static com.jojubanking.boot.module.system.dal.dataobject.logger.OperateLogDO.RESULT_MAX_LENGTH; + +@Service +@Validated +@Slf4j +public class OperateLogServiceImpl implements OperateLogService { + + @Resource + private OperateLogMapper operateLogMapper; + + @Resource + private AdminUserService userService; + + @Override + public void createOperateLog(OperateLogCreateReqDTO createReqDTO) { + OperateLogDO logDO = OperateLogConvert.INSTANCE.convert(createReqDTO); + logDO.setJavaMethodArgs(StrUtils.maxLength(logDO.getJavaMethodArgs(), JAVA_METHOD_ARGS_MAX_LENGTH)); + logDO.setResultData(StrUtils.maxLength(logDO.getResultData(), RESULT_MAX_LENGTH)); + operateLogMapper.insert(logDO); + } + + @Override + public PageResult getOperateLogPage(OperateLogPageReqVO reqVO) { + // 处理基于用户昵称的查询 + Collection userIds = null; + if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { + userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), AdminUserDO::getId); + if (CollUtil.isEmpty(userIds)) { + return PageResult.empty(); + } + } + // 查询分页 + return operateLogMapper.selectPage(reqVO, userIds); + } + + @Override + public List getOperateLogs(OperateLogExportReqVO reqVO) { + // 处理基于用户昵称的查询 + Collection userIds = null; + if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { + userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), AdminUserDO::getId); + if (CollUtil.isEmpty(userIds)) { + return Collections.emptyList(); + } + } + // 查询列表 + return operateLogMapper.selectList(reqVO, userIds); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/member/MemberService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/member/MemberService.java new file mode 100644 index 0000000..7b1812e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/member/MemberService.java @@ -0,0 +1,18 @@ +package com.jojubanking.boot.module.system.service.member; + +/** + * Member Service 接口 + * + * @author TW + */ +public interface MemberService { + + /** + * 获得会员用户的手机号码 + * + * @param id 会员用户编号 + * @return 手机号码 + */ + String getMemberUserMobile(Long id); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/member/MemberServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/member/MemberServiceImpl.java new file mode 100644 index 0000000..ba7cf5a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/member/MemberServiceImpl.java @@ -0,0 +1,41 @@ +package com.jojubanking.boot.module.system.service.member; + +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.extra.spring.SpringUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +/** + * Member Service 实现类 + * + * @author TW + */ +@Service +public class MemberServiceImpl implements MemberService { + + @Value("${joju.info.base-package}") + private String basePackage; + + private volatile Object memberUserApi; + + @Override + public String getMemberUserMobile(Long id) { + if (id == null) { + return null; + } + Object user = ReflectUtil.invoke(getMemberUserApi(), "getUser", id); + if (user == null) { + return null; + } + return ReflectUtil.invoke(user, "getMobile"); + } + + private Object getMemberUserApi() { + if (memberUserApi == null) { + memberUserApi = SpringUtil.getBean(ClassUtil.loadClass(String.format("%s.module.member.api.user.MemberUserApi", basePackage))); + } + return memberUserApi; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/member/package-info.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/member/package-info.java new file mode 100644 index 0000000..a411bbb --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/member/package-info.java @@ -0,0 +1,4 @@ +/** + * joju-module-member 模块的适配,解除 joju-module-system 对它们的依赖 + */ +package com.jojubanking.boot.module.system.service.member; diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/mzdm/MzdmService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/mzdm/MzdmService.java new file mode 100644 index 0000000..b14d962 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/mzdm/MzdmService.java @@ -0,0 +1,71 @@ +package com.jojubanking.boot.module.system.service.mzdm; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.mzdm.MzdmDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 民族代码 Service 接口 + * + * @author admin + */ +public interface MzdmService { + + /** + * 创建民族代码 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMzdm(@Valid MzdmCreateReqVO createReqVO); + + /** + * 更新民族代码 + * + * @param updateReqVO 更新信息 + */ + void updateMzdm(@Valid MzdmUpdateReqVO updateReqVO); + + /** + * 删除民族代码 + * + * @param id 编号 + */ + void deleteMzdm(Long id); + + /** + * 获得民族代码 + * + * @param id 编号 + * @return 民族代码 + */ + MzdmDO getMzdm(Long id); + + /** + * 获得民族代码列表 + * + * @param ids 编号 + * @return 民族代码列表 + */ + List getMzdmList(Collection ids); + + /** + * 获得民族代码分页 + * + * @param pageReqVO 分页查询 + * @return 民族代码分页 + */ + PageResult getMzdmPage(MzdmPageReqVO pageReqVO); + + /** + * 获得民族代码列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 民族代码列表 + */ + List getMzdmList(MzdmExportReqVO exportReqVO); + List getMzdmList01(MzdmExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/mzdm/MzdmServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/mzdm/MzdmServiceImpl.java new file mode 100644 index 0000000..4a8fbd0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/mzdm/MzdmServiceImpl.java @@ -0,0 +1,86 @@ +package com.jojubanking.boot.module.system.service.mzdm; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.mzdm.MzdmDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.mzdm.MzdmConvert; +import com.jojubanking.boot.module.system.dal.mysql.mzdm.MzdmMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 民族代码 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class MzdmServiceImpl implements MzdmService { + + @Resource + private MzdmMapper mzdmMapper; + + @Override + public Long createMzdm(MzdmCreateReqVO createReqVO) { + // 插入 + MzdmDO mzdm = MzdmConvert.INSTANCE.convert(createReqVO); + mzdmMapper.insert(mzdm); + // 返回 + return mzdm.getId(); + } + + @Override + public void updateMzdm(MzdmUpdateReqVO updateReqVO) { + // 校验存在 + this.validateMzdmExists(updateReqVO.getId()); + // 更新 + MzdmDO updateObj = MzdmConvert.INSTANCE.convert(updateReqVO); + mzdmMapper.updateById(updateObj); + } + + @Override + public void deleteMzdm(Long id) { + // 校验存在 + this.validateMzdmExists(id); + // 删除 + mzdmMapper.deleteById(id); + } + + private void validateMzdmExists(Long id) { + if (mzdmMapper.selectById(id) == null) { + throw exception(MZDM_NOT_EXISTS); + } + } + + @Override + public MzdmDO getMzdm(Long id) { + return mzdmMapper.selectById(id); + } + + @Override + public List getMzdmList(Collection ids) { + return mzdmMapper.selectBatchIds(ids); + } + + @Override + public PageResult getMzdmPage(MzdmPageReqVO pageReqVO) { + return mzdmMapper.selectPage(pageReqVO); + } + + @Override + public List getMzdmList(MzdmExportReqVO exportReqVO) { + return mzdmMapper.selectList(exportReqVO); + } + @Override + public List getMzdmList01(MzdmExportReqVO exportReqVO) { + return mzdmMapper.selectList01(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/mzjf/MzjfService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/mzjf/MzjfService.java new file mode 100644 index 0000000..ee09f0c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/mzjf/MzjfService.java @@ -0,0 +1,71 @@ +package com.jojubanking.boot.module.system.service.mzjf; + +import java.text.ParseException; +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.mzjf.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.mzjf.MzjfDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 门诊缴费 Service 接口 + * + * @author admin + */ +public interface MzjfService { + + /** + * 创建门诊缴费 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createMzjf(@Valid MzjfCreateReqVO createReqVO); + + /** + * 更新门诊缴费 + * + * @param updateReqVO 更新信息 + */ + void updateMzjf(@Valid MzjfUpdateReqVO updateReqVO); + + /** + * 删除门诊缴费 + * + * @param id 编号 + */ + void deleteMzjf(Integer id); + + /** + * 获得门诊缴费 + * + * @param id 编号 + * @return 门诊缴费 + */ + MzjfDO getMzjf(Integer id); + + /** + * 获得门诊缴费列表 + * + * @param ids 编号 + * @return 门诊缴费列表 + */ + List getMzjfList(Collection ids); + + /** + * 获得门诊缴费分页 + * + * @param pageReqVO 分页查询 + * @return 门诊缴费分页 + */ + PageResult getMzjfPage(MzjfPageReqVO pageReqVO) throws ParseException; + + /** + * 获得门诊缴费列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 门诊缴费列表 + */ + List getMzjfList(MzjfExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/mzjf/MzjfServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/mzjf/MzjfServiceImpl.java new file mode 100644 index 0000000..d74a2a9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/mzjf/MzjfServiceImpl.java @@ -0,0 +1,83 @@ +package com.jojubanking.boot.module.system.service.mzjf; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.text.ParseException; +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.mzjf.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.mzjf.MzjfDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.mzjf.MzjfConvert; +import com.jojubanking.boot.module.system.dal.mysql.mzjf.MzjfMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 门诊缴费 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class MzjfServiceImpl implements MzjfService { + + @Resource + private MzjfMapper mzjfMapper; + + @Override + public Integer createMzjf(MzjfCreateReqVO createReqVO) { + // 插入 + MzjfDO mzjf = MzjfConvert.INSTANCE.convert(createReqVO); + mzjfMapper.insert(mzjf); + // 返回 + return mzjf.getId(); + } + + @Override + public void updateMzjf(MzjfUpdateReqVO updateReqVO) { + // 校验存在 + this.validateMzjfExists(updateReqVO.getId()); + // 更新 + MzjfDO updateObj = MzjfConvert.INSTANCE.convert(updateReqVO); + mzjfMapper.updateById(updateObj); + } + + @Override + public void deleteMzjf(Integer id) { + // 校验存在 + this.validateMzjfExists(id); + // 删除 + mzjfMapper.deleteById(id); + } + + private void validateMzjfExists(Integer id) { + if (mzjfMapper.selectById(id) == null) { + throw exception(MZJF_NOT_EXISTS); + } + } + + @Override + public MzjfDO getMzjf(Integer id) { + return mzjfMapper.selectById(id); + } + + @Override + public List getMzjfList(Collection ids) { + return mzjfMapper.selectBatchIds(ids); + } + + @Override + public PageResult getMzjfPage(MzjfPageReqVO pageReqVO) throws ParseException { + return mzjfMapper.selectPage(pageReqVO); + } + + @Override + public List getMzjfList(MzjfExportReqVO exportReqVO) { + return mzjfMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/notice/NoticeService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/notice/NoticeService.java new file mode 100644 index 0000000..ee0f108 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/notice/NoticeService.java @@ -0,0 +1,52 @@ +package com.jojubanking.boot.module.system.service.notice; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.notice.NoticeDO; + +/** + * 通知公告 Service 接口 + */ +public interface NoticeService { + + /** + * 创建岗位公告公告 + * + * @param reqVO 岗位公告公告信息 + * @return 岗位公告公告编号 + */ + Long createNotice(NoticeCreateReqVO reqVO); + + /** + * 更新岗位公告公告 + * + * @param reqVO 岗位公告公告信息 + */ + void updateNotice(NoticeUpdateReqVO reqVO); + + /** + * 删除岗位公告公告信息 + * + * @param id 岗位公告公告编号 + */ + void deleteNotice(Long id); + + /** + * 获得岗位公告公告分页列表 + * + * @param reqVO 分页条件 + * @return 部门分页列表 + */ + PageResult pageNotices(NoticePageReqVO reqVO); + + /** + * 获得岗位公告公告信息 + * + * @param id 岗位公告公告编号 + * @return 岗位公告公告信息 + */ + NoticeDO getNotice(Long id); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/notice/NoticeServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/notice/NoticeServiceImpl.java new file mode 100644 index 0000000..63a520f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/notice/NoticeServiceImpl.java @@ -0,0 +1,74 @@ +package com.jojubanking.boot.module.system.service.notice; + +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; +import com.jojubanking.boot.module.system.convert.notice.NoticeConvert; +import com.jojubanking.boot.module.system.dal.mysql.notice.NoticeMapper; +import com.jojubanking.boot.module.system.dal.dataobject.notice.NoticeDO; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.NOTICE_NOT_FOUND; + +/** + * 通知公告 Service 实现类 + * + * @author TW + */ +@Service +public class NoticeServiceImpl implements NoticeService { + + @Resource + private NoticeMapper noticeMapper; + + @Override + public Long createNotice(NoticeCreateReqVO reqVO) { + NoticeDO notice = NoticeConvert.INSTANCE.convert(reqVO); + noticeMapper.insert(notice); + return notice.getId(); + } + + @Override + public void updateNotice(NoticeUpdateReqVO reqVO) { + // 校验是否存在 + this.checkNoticeExists(reqVO.getId()); + // 更新通知公告 + NoticeDO updateObj = NoticeConvert.INSTANCE.convert(reqVO); + noticeMapper.updateById(updateObj); + } + + @Override + public void deleteNotice(Long id) { + // 校验是否存在 + this.checkNoticeExists(id); + // 删除通知公告 + noticeMapper.deleteById(id); + } + + @Override + public PageResult pageNotices(NoticePageReqVO reqVO) { + return noticeMapper.selectPage(reqVO); + } + + @Override + public NoticeDO getNotice(Long id) { + return noticeMapper.selectById(id); + } + + @VisibleForTesting + public void checkNoticeExists(Long id) { + if (id == null) { + return; + } + NoticeDO notice = noticeMapper.selectById(id); + if (notice == null) { + throw ServiceExceptionUtil.exception(NOTICE_NOT_FOUND); + } + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveService.java new file mode 100644 index 0000000..58b12c7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveService.java @@ -0,0 +1,52 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * OAuth2 批准 Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 ApprovalStoreUserApprovalHandler 的功能,记录用户针对指定客户端的授权,减少手动确定。 + * + * @author TW + */ +public interface OAuth2ApproveService { + + /** + * 获得指定用户,针对指定客户端的指定授权,是否通过 + * + * 参考 ApprovalStoreUserApprovalHandler 的 checkForPreApproval 方法 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @param requestedScopes 授权范围 + * @return 是否授权通过 + */ + boolean checkForPreApproval(Long userId, Integer userType, String clientId, Collection requestedScopes); + + /** + * 在用户发起批准时,基于 scopes 的选项,计算最终是否通过 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @param requestedScopes 授权范围 + * @return 是否授权通过 + */ + boolean updateAfterApproval(Long userId, Integer userType, String clientId, Map requestedScopes); + + /** + * 获得用户的批准列表,排除已过期的 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @return 是否授权通过 + */ + List getApproveList(Long userId, Integer userType, String clientId); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveServiceImpl.java new file mode 100644 index 0000000..42f96c8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveServiceImpl.java @@ -0,0 +1,102 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.jojubanking.boot.module.system.dal.mysql.oauth2.OAuth2ApproveMapper; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.*; + +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertSet; + +/** + * OAuth2 批准 Service 实现类 + * + * @author TW + */ +@Service +@Validated +public class OAuth2ApproveServiceImpl implements OAuth2ApproveService { + + /** + * 批准的过期时间,默认 30 天 + */ + private static final Integer TIMEOUT = 30 * 24 * 60 * 60; // 单位:秒 + + @Resource + private OAuth2ClientService oauth2ClientService; + + @Resource + private OAuth2ApproveMapper oauth2ApproveMapper; + + @Override + @Transactional + public boolean checkForPreApproval(Long userId, Integer userType, String clientId, Collection requestedScopes) { + // 第一步,基于 Client 的自动授权计算,如果 scopes 都在自动授权中,则返回 true 通过 + OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); + Assert.notNull(clientDO, "客户端不能为空"); // 防御性编程 + if (CollUtil.containsAll(clientDO.getAutoApproveScopes(), requestedScopes)) { + // gh-877 - if all scopes are auto approved, approvals still need to be added to the approval store. + Date expireTime = DateUtils.addDate(Calendar.SECOND, TIMEOUT); + for (String scope : requestedScopes) { + saveApprove(userId, userType, clientId, scope, true, expireTime); + } + return true; + } + + // 第二步,算上用户已经批准的授权。如果 scopes 都包含,则返回 true + List approveDOs = getApproveList(userId, userType, clientId); + Set scopes = convertSet(approveDOs, OAuth2ApproveDO::getScope, + OAuth2ApproveDO::getApproved); // 只保留未过期的 + 同意的 + return CollUtil.containsAll(scopes, requestedScopes); + } + + @Override + @Transactional + public boolean updateAfterApproval(Long userId, Integer userType, String clientId, Map requestedScopes) { + // 如果 requestedScopes 为空,说明没有要求,则返回 true 通过 + if (CollUtil.isEmpty(requestedScopes)) { + return true; + } + + // 更新批准的信息 + boolean success = false; // 需要至少有一个同意 + Date expireTime = DateUtils.addDate(Calendar.SECOND, TIMEOUT); + for (Map.Entry entry :requestedScopes.entrySet()) { + if (entry.getValue()) { + success = true; + } + saveApprove(userId, userType, clientId, entry.getKey(), entry.getValue(), expireTime); + } + return success; + } + + @Override + public List getApproveList(Long userId, Integer userType, String clientId) { + List approveDOs = oauth2ApproveMapper.selectListByUserIdAndUserTypeAndClientId( + userId, userType, clientId); + approveDOs.removeIf(o -> DateUtils.isExpired(o.getExpiresTime())); + return approveDOs; + } + + @VisibleForTesting + void saveApprove(Long userId, Integer userType, String clientId, + String scope, Boolean approved, Date expireTime) { + // 先更新 + OAuth2ApproveDO approveDO = new OAuth2ApproveDO().setUserId(userId).setUserType(userType) + .setClientId(clientId).setScope(scope).setApproved(approved).setExpiresTime(expireTime); + if (oauth2ApproveMapper.update(approveDO) == 1) { + return; + } + // 失败,则说明不存在,进行更新 + oauth2ApproveMapper.insert(approveDO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientService.java new file mode 100644 index 0000000..7f6d465 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientService.java @@ -0,0 +1,88 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; + +import javax.validation.Valid; +import java.util.Collection; + +/** + * OAuth2.0 Client Service 接口 + * + * 从功能上,和 JdbcClientDetailsService 的功能,提供客户端的操作 + * + * @author TW + */ +public interface OAuth2ClientService { + + /** + * 初始化 OAuth2Client 的本地缓存 + */ + void initLocalCache(); + + /** + * 创建 OAuth2 客户端 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createOAuth2Client(@Valid OAuth2ClientCreateReqVO createReqVO); + + /** + * 更新 OAuth2 客户端 + * + * @param updateReqVO 更新信息 + */ + void updateOAuth2Client(@Valid OAuth2ClientUpdateReqVO updateReqVO); + + /** + * 删除 OAuth2 客户端 + * + * @param id 编号 + */ + void deleteOAuth2Client(Long id); + + /** + * 获得 OAuth2 客户端 + * + * @param id 编号 + * @return OAuth2 客户端 + */ + OAuth2ClientDO getOAuth2Client(Long id); + + /** + * 获得 OAuth2 客户端分页 + * + * @param pageReqVO 分页查询 + * @return OAuth2 客户端分页 + */ + PageResult getOAuth2ClientPage(OAuth2ClientPageReqVO pageReqVO); + + /** + * 从缓存中,校验客户端是否合法 + * + * @return 客户端 + */ + default OAuth2ClientDO validOAuthClientFromCache(String clientId) { + return validOAuthClientFromCache(clientId, null, null, null, null); + } + + /** + * 从缓存中,校验客户端是否合法 + * + * 非空时,进行校验 + * + * @param clientId 客户端编号 + * @param clientSecret 客户端密钥 + * @param authorizedGrantType 授权方式 + * @param scopes 授权范围 + * @param redirectUri 重定向地址 + * @return 客户端 + */ + OAuth2ClientDO validOAuthClientFromCache(String clientId, String clientSecret, + String authorizedGrantType, Collection scopes, String redirectUri); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientServiceImpl.java new file mode 100644 index 0000000..41d5cd8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientServiceImpl.java @@ -0,0 +1,211 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.string.StrUtils; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientUpdateReqVO; +import com.jojubanking.boot.module.system.convert.auth.OAuth2ClientConvert; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.jojubanking.boot.module.system.dal.mysql.oauth2.OAuth2ClientMapper; +import com.jojubanking.boot.module.system.mq.producer.auth.OAuth2ClientProducer; +import com.google.common.annotations.VisibleForTesting; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertMap; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.getMaxValue; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * OAuth2.0 Client Service 实现类 + * + * @author TW + */ +@Service +@Validated +@Slf4j +public class OAuth2ClientServiceImpl implements OAuth2ClientService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 客户端缓存 + * key:客户端编号 {@link OAuth2ClientDO#getClientId()} ()} + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + @Getter // 解决单测 + @Setter // 解决单测 + private volatile Map clientCache; + /** + * 缓存角色的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + @Getter + private volatile Date maxUpdateTime; + + @Resource + private OAuth2ClientMapper oauth2ClientMapper; + + @Resource + private OAuth2ClientProducer oauth2ClientProducer; + + /** + * 初始化 {@link #clientCache} 缓存 + */ + @Override + @PostConstruct + public void initLocalCache() { + // 获取客户端列表,如果有更新 + List tenantList = loadOAuth2ClientIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(tenantList)) { + return; + } + + // 写入缓存 + clientCache = convertMap(tenantList, OAuth2ClientDO::getClientId); + maxUpdateTime = getMaxValue(tenantList, OAuth2ClientDO::getUpdateTime); + log.info("[initLocalCache][初始化 OAuth2Client 数量为 {}]", tenantList.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initLocalCache(); + } + + /** + * 如果客户端发生变化,从数据库中获取最新的全量客户端。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前客户端的最大更新时间 + * @return 客户端列表 + */ + private List loadOAuth2ClientIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadOAuth2ClientIfUpdate][首次加载全量客户端]"); + } else { // 判断数据库中是否有更新的客户端 + if (oauth2ClientMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { + return null; + } + log.info("[loadOAuth2ClientIfUpdate][增量加载全量客户端]"); + } + // 第二步,如果有更新,则从数据库加载所有客户端 + return oauth2ClientMapper.selectList(); + } + + @Override + public Long createOAuth2Client(OAuth2ClientCreateReqVO createReqVO) { + validateClientIdExists(null, createReqVO.getClientId()); + // 插入 + OAuth2ClientDO oauth2Client = OAuth2ClientConvert.INSTANCE.convert(createReqVO); + oauth2ClientMapper.insert(oauth2Client); + // 发送刷新消息 + oauth2ClientProducer.sendOAuth2ClientRefreshMessage(); + return oauth2Client.getId(); + } + + @Override + public void updateOAuth2Client(OAuth2ClientUpdateReqVO updateReqVO) { + // 校验存在 + validateOAuth2ClientExists(updateReqVO.getId()); + // 校验 Client 未被占用 + validateClientIdExists(updateReqVO.getId(), updateReqVO.getClientId()); + + // 更新 + OAuth2ClientDO updateObj = OAuth2ClientConvert.INSTANCE.convert(updateReqVO); + oauth2ClientMapper.updateById(updateObj); + // 发送刷新消息 + oauth2ClientProducer.sendOAuth2ClientRefreshMessage(); + } + + @Override + public void deleteOAuth2Client(Long id) { + // 校验存在 + validateOAuth2ClientExists(id); + // 删除 + oauth2ClientMapper.deleteById(id); + // 发送刷新消息 + oauth2ClientProducer.sendOAuth2ClientRefreshMessage(); + } + + private void validateOAuth2ClientExists(Long id) { + if (oauth2ClientMapper.selectById(id) == null) { + throw exception(OAUTH2_CLIENT_NOT_EXISTS); + } + } + + @VisibleForTesting + void validateClientIdExists(Long id, String clientId) { + OAuth2ClientDO client = oauth2ClientMapper.selectByClientId(clientId); + if (client == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的客户端 + if (id == null) { + throw exception(OAUTH2_CLIENT_EXISTS); + } + if (!client.getId().equals(id)) { + throw exception(OAUTH2_CLIENT_EXISTS); + } + } + + @Override + public OAuth2ClientDO getOAuth2Client(Long id) { + return oauth2ClientMapper.selectById(id); + } + + @Override + public PageResult getOAuth2ClientPage(OAuth2ClientPageReqVO pageReqVO) { + return oauth2ClientMapper.selectPage(pageReqVO); + } + + @Override + public OAuth2ClientDO validOAuthClientFromCache(String clientId, String clientSecret, + String authorizedGrantType, Collection scopes, String redirectUri) { + // 校验客户端存在、且开启 + OAuth2ClientDO client = clientCache.get(clientId); + if (client == null) { + throw exception(OAUTH2_CLIENT_NOT_EXISTS); + } + if (ObjectUtil.notEqual(client.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { + throw exception(OAUTH2_CLIENT_DISABLE); + } + + // 校验客户端密钥 + if (StrUtil.isNotEmpty(clientSecret) && ObjectUtil.notEqual(client.getSecret(), clientSecret)) { + throw exception(OAUTH2_CLIENT_CLIENT_SECRET_ERROR); + } + // 校验授权方式 + if (StrUtil.isNotEmpty(authorizedGrantType) && !CollUtil.contains(client.getAuthorizedGrantTypes(), authorizedGrantType)) { + throw exception(OAUTH2_CLIENT_AUTHORIZED_GRANT_TYPE_NOT_EXISTS); + } + // 校验授权范围 + if (CollUtil.isNotEmpty(scopes) && !CollUtil.containsAll(client.getScopes(), scopes)) { + throw exception(OAUTH2_CLIENT_SCOPE_OVER); + } + // 校验回调地址 + if (StrUtil.isNotEmpty(redirectUri) && !StrUtils.startWithAny(redirectUri, client.getRedirectUris())) { + throw exception(OAUTH2_CLIENT_REDIRECT_URI_NOT_MATCH, redirectUri); + } + return client; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeService.java new file mode 100644 index 0000000..d08930b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeService.java @@ -0,0 +1,39 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2CodeDO; + +import java.util.List; + +/** + * OAuth2.0 授权码 Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 JdbcAuthorizationCodeServices 的功能,提供授权码的操作 + * + * @author TW + */ +public interface OAuth2CodeService { + + /** + * 创建授权码 + * + * 参考 JdbcAuthorizationCodeServices 的 createAuthorizationCode 方法 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @param redirectUri 重定向 URI + * @param state 状态 + * @return 授权码的信息 + */ + OAuth2CodeDO createAuthorizationCode(Long userId, Integer userType, String clientId, + List scopes, String redirectUri, String state); + + /** + * 使用授权码 + * + * @param code 授权码 + */ + OAuth2CodeDO consumeAuthorizationCode(String code); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeServiceImpl.java new file mode 100644 index 0000000..0598059 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeServiceImpl.java @@ -0,0 +1,64 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import cn.hutool.core.util.IdUtil; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2CodeDO; +import com.jojubanking.boot.module.system.dal.mysql.oauth2.OAuth2CodeMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Calendar; +import java.util.List; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.OAUTH2_CODE_EXPIRE; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.OAUTH2_CODE_NOT_EXISTS; + +/** + * OAuth2.0 授权码 Service 实现类 + * + * @author TW + */ +@Service +@Validated +public class OAuth2CodeServiceImpl implements OAuth2CodeService { + + /** + * 授权码的过期时间,默认 5 分钟 + */ + private static final Integer TIMEOUT = 5 * 60; + + @Resource + private OAuth2CodeMapper oauth2CodeMapper; + + @Override + public OAuth2CodeDO createAuthorizationCode(Long userId, Integer userType, String clientId, + List scopes, String redirectUri, String state) { + OAuth2CodeDO codeDO = new OAuth2CodeDO().setCode(generateCode()) + .setUserId(userId).setUserType(userType) + .setClientId(clientId).setScopes(scopes) + .setExpiresTime(DateUtils.addDate(Calendar.SECOND, TIMEOUT)) + .setRedirectUri(redirectUri).setState(state); + oauth2CodeMapper.insert(codeDO); + return codeDO; + } + + @Override + public OAuth2CodeDO consumeAuthorizationCode(String code) { + OAuth2CodeDO codeDO = oauth2CodeMapper.selectByCode(code); + if (codeDO == null) { + throw exception(OAUTH2_CODE_NOT_EXISTS); + } + if (DateUtils.isExpired(codeDO.getExpiresTime())) { + throw exception(OAUTH2_CODE_EXPIRE); + } + oauth2CodeMapper.deleteById(codeDO.getId()); + return codeDO; + } + + private static String generateCode() { + return IdUtil.fastSimpleUUID(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantService.java new file mode 100644 index 0000000..e60619b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantService.java @@ -0,0 +1,113 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; + +import java.util.List; + +/** + * OAuth2 授予 Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 TokenGranter 的功能,提供访问令牌、刷新令牌的操作 + * + * 将自身的 AdminUser 用户,授权给第三方应用,采用 OAuth2.0 的协议。 + * + * 问题:为什么自身也作为一个第三方应用,也走这套流程呢? + * 回复:当然可以这么做,采用 Implicit 模式。考虑到大多数开发者使用不到这个特性,OAuth2.0 毕竟有一定学习成本,所以暂时没有采取这种方式。 + * + * @author TW + */ +public interface OAuth2GrantService { + + /** + * 简化模式 + * + * 对应 Spring Security OAuth2 的 ImplicitTokenGranter 功能 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantImplicit(Long userId, Integer userType, + String clientId, List scopes); + + /** + * 授权码模式,第一阶段,获得 code 授权码 + * + * 对应 Spring Security OAuth2 的 AuthorizationEndpoint 的 generateCode 方法 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @param redirectUri 重定向 URI + * @param state 状态 + * @return 授权码 + */ + String grantAuthorizationCodeForCode(Long userId, Integer userType, + String clientId, List scopes, + String redirectUri, String state); + + /** + * 授权码模式,第二阶段,获得 accessToken 访问令牌 + * + * 对应 Spring Security OAuth2 的 AuthorizationCodeTokenGranter 功能 + * + * @param clientId 客户端编号 + * @param code 授权码 + * @param redirectUri 重定向 URI + * @param state 状态 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantAuthorizationCodeForAccessToken(String clientId, String code, + String redirectUri, String state); + + /** + * 密码模式 + * + * 对应 Spring Security OAuth2 的 ResourceOwnerPasswordTokenGranter 功能 + * + * @param username 账号 + * @param password 密码 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantPassword(String username, String password, + String clientId, List scopes); + + /** + * 刷新模式 + * + * 对应 Spring Security OAuth2 的 ResourceOwnerPasswordTokenGranter 功能 + * + * @param refreshToken 刷新令牌 + * @param clientId 客户端编号 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantRefreshToken(String refreshToken, String clientId); + + /** + * 客户端模式 + * + * 对应 Spring Security OAuth2 的 ClientCredentialsTokenGranter 功能 + * + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @return 访问令牌 + */ + OAuth2AccessTokenDO grantClientCredentials(String clientId, List scopes); + + /** + * 移除访问令牌 + * + * 对应 Spring Security OAuth2 的 ConsumerTokenServices 的 revokeToken 方法 + * + * @param accessToken 访问令牌 + * @param clientId 客户端编号 + * @return 是否移除到 + */ + boolean revokeToken(String clientId, String accessToken); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantServiceImpl.java new file mode 100644 index 0000000..ebf2cca --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantServiceImpl.java @@ -0,0 +1,104 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2CodeDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.enums.ErrorCodeConstants; +import com.jojubanking.boot.module.system.service.auth.AdminAuthService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * OAuth2 授予 Service 实现类 + * + * @author TW + */ +@Service +public class OAuth2GrantServiceImpl implements OAuth2GrantService { + + @Resource + private OAuth2TokenService oauth2TokenService; + @Resource + private OAuth2CodeService oauth2CodeService; + @Resource + private AdminAuthService adminAuthService; + + @Override + public OAuth2AccessTokenDO grantImplicit(Long userId, Integer userType, + String clientId, List scopes) { + return oauth2TokenService.createAccessToken(userId, userType, clientId, scopes); + } + + @Override + public String grantAuthorizationCodeForCode(Long userId, Integer userType, + String clientId, List scopes, + String redirectUri, String state) { + return oauth2CodeService.createAuthorizationCode(userId, userType, clientId, scopes, + redirectUri, state).getCode(); + } + + @Override + public OAuth2AccessTokenDO grantAuthorizationCodeForAccessToken(String clientId, String code, + String redirectUri, String state) { + OAuth2CodeDO codeDO = oauth2CodeService.consumeAuthorizationCode(code); + Assert.notNull(codeDO, "授权码不能为空"); // 防御性编程 + // 校验 clientId 是否匹配 + if (!StrUtil.equals(clientId, codeDO.getClientId())) { + throw exception(ErrorCodeConstants.OAUTH2_GRANT_CLIENT_ID_MISMATCH); + } + // 校验 redirectUri 是否匹配 + if (!StrUtil.equals(redirectUri, codeDO.getRedirectUri())) { + throw exception(ErrorCodeConstants.OAUTH2_GRANT_REDIRECT_URI_MISMATCH); + } + // 校验 state 是否匹配 + state = StrUtil.nullToDefault(state, ""); // 数据库 state 为 null 时,会设置为 "" 空串 + if (!StrUtil.equals(state, codeDO.getState())) { + throw exception(ErrorCodeConstants.OAUTH2_GRANT_STATE_MISMATCH); + } + + // 创建访问令牌 + return oauth2TokenService.createAccessToken(codeDO.getUserId(), codeDO.getUserType(), + codeDO.getClientId(), codeDO.getScopes()); + } + + @Override + public OAuth2AccessTokenDO grantPassword(String username, String password, String clientId, List scopes) { + // 使用账号 + 密码进行登录 + AdminUserDO user = adminAuthService.authenticate(username, password); + Assert.notNull(user, "用户不能为空!"); // 防御性编程 + + // 创建访问令牌 + return oauth2TokenService.createAccessToken(user.getId(), UserTypeEnum.ADMIN.getValue(), clientId, scopes); + } + + @Override + public OAuth2AccessTokenDO grantRefreshToken(String refreshToken, String clientId) { + return oauth2TokenService.refreshAccessToken(refreshToken, clientId); + } + + @Override + public OAuth2AccessTokenDO grantClientCredentials(String clientId, List scopes) { + // TODO TW:项目中使用 OAuth2 解决的是三方应用的授权,内部的 SSO 等问题,所以暂时不考虑 client_credentials 这个场景 + throw new UnsupportedOperationException("暂时不支持 client_credentials 授权模式"); + } + + @Override + public boolean revokeToken(String clientId, String accessToken) { + // 先查询,保证 clientId 时匹配的 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.getAccessToken(accessToken); + if (accessTokenDO == null || ObjectUtil.notEqual(clientId, accessTokenDO.getClientId())) { + return false; + } + // 再删除 + return oauth2TokenService.removeAccessToken(accessToken) != null; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenService.java new file mode 100644 index 0000000..0f7d3a6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenService.java @@ -0,0 +1,80 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; + +import java.util.List; + +/** + * OAuth2.0 Token Service 接口 + * + * 从功能上,和 Spring Security OAuth 的 DefaultTokenServices + JdbcTokenStore 的功能,提供访问令牌、刷新令牌的操作 + * + * @author TW + */ +public interface OAuth2TokenService { + + /** + * 创建访问令牌 + * 注意:该流程中,会包含创建刷新令牌的创建 + * + * 参考 DefaultTokenServices 的 createAccessToken 方法 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @param clientId 客户端编号 + * @param scopes 授权范围 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List scopes); + + /** + * 刷新访问令牌 + * + * 参考 DefaultTokenServices 的 refreshAccessToken 方法 + * + * @param refreshToken 刷新令牌 + * @param clientId 客户端编号 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId); + + /** + * 获得访问令牌 + * + * 参考 DefaultTokenServices 的 getAccessToken 方法 + * + * @param accessToken 访问令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO getAccessToken(String accessToken); + + /** + * 校验访问令牌 + * + * @param accessToken 访问令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO checkAccessToken(String accessToken); + + /** + * 移除访问令牌 + * 注意:该流程中,会移除相关的刷新令牌 + * + * 参考 DefaultTokenServices 的 revokeToken 方法 + * + * @param accessToken 刷新令牌 + * @return 访问令牌的信息 + */ + OAuth2AccessTokenDO removeAccessToken(String accessToken); + + /** + * 获得访问令牌分页 + * + * @param reqVO 请求 + * @return 访问令牌分页 + */ + PageResult getAccessTokenPage(OAuth2AccessTokenPageReqVO reqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenServiceImpl.java new file mode 100644 index 0000000..c752a08 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenServiceImpl.java @@ -0,0 +1,165 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenDO; +import com.jojubanking.boot.module.system.dal.mysql.oauth2.OAuth2AccessTokenMapper; +import com.jojubanking.boot.module.system.dal.mysql.oauth2.OAuth2RefreshTokenMapper; +import com.jojubanking.boot.module.system.dal.redis.oauth2.OAuth2AccessTokenRedisDAO; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.Calendar; +import java.util.List; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertSet; + +/** + * OAuth2.0 Token Service 实现类 + * + * @author TW + */ +@Service +public class OAuth2TokenServiceImpl implements OAuth2TokenService { + + @Resource + private OAuth2AccessTokenMapper oauth2AccessTokenMapper; + @Resource + private OAuth2RefreshTokenMapper oauth2RefreshTokenMapper; + + @Resource + private OAuth2AccessTokenRedisDAO oauth2AccessTokenRedisDAO; + + @Resource + private OAuth2ClientService oauth2ClientService; + + @Override + @Transactional + public OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List scopes) { + OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); + // 创建刷新令牌 + OAuth2RefreshTokenDO refreshTokenDO = createOAuth2RefreshToken(userId, userType, clientDO, scopes); + // 创建访问令牌 + return createOAuth2AccessToken(refreshTokenDO, clientDO); + } + + @Override + public OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId) { + // 查询访问令牌 + OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectByRefreshToken(refreshToken); + if (refreshTokenDO == null) { + throw exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), "无效的刷新令牌"); + } + + // 校验 Client 匹配 + OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId); + if (ObjectUtil.notEqual(clientId, refreshTokenDO.getClientId())) { + throw exception0(GlobalErrorCodeConstants.BAD_REQUEST.getCode(), "刷新令牌的客户端编号不正确"); + } + + // 移除相关的访问令牌 + List accessTokenDOs = oauth2AccessTokenMapper.selectListByRefreshToken(refreshToken); + if (CollUtil.isNotEmpty(accessTokenDOs)) { + oauth2AccessTokenMapper.deleteBatchIds(convertSet(accessTokenDOs, OAuth2AccessTokenDO::getId)); + oauth2AccessTokenRedisDAO.deleteList(convertSet(accessTokenDOs, OAuth2AccessTokenDO::getAccessToken)); + } + + // 已过期的情况下,删除刷新令牌 + if (DateUtils.isExpired(refreshTokenDO.getExpiresTime())) { + oauth2RefreshTokenMapper.deleteById(refreshTokenDO.getId()); + throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "刷新令牌已过期"); + } + + // 创建访问令牌 + return createOAuth2AccessToken(refreshTokenDO, clientDO); + } + + @Override + public OAuth2AccessTokenDO getAccessToken(String accessToken) { + // 优先从 Redis 中获取 + OAuth2AccessTokenDO accessTokenDO = oauth2AccessTokenRedisDAO.get(accessToken); + if (accessTokenDO != null) { + return accessTokenDO; + } + + // 获取不到,从 MySQL 中获取 + accessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessToken); + // 如果在 MySQL 存在,则往 Redis 中写入 + if (accessTokenDO != null && !DateUtils.isExpired(accessTokenDO.getExpiresTime())) { + oauth2AccessTokenRedisDAO.set(accessTokenDO); + } + return accessTokenDO; + } + + @Override + public OAuth2AccessTokenDO checkAccessToken(String accessToken) { + OAuth2AccessTokenDO accessTokenDO = getAccessToken(accessToken); + if (accessTokenDO == null) { + throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "访问令牌不存在"); + } + if (DateUtils.isExpired(accessTokenDO.getExpiresTime())) { + throw exception0(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), "访问令牌已过期"); + } + return accessTokenDO; + } + + @Override + public OAuth2AccessTokenDO removeAccessToken(String accessToken) { + // 删除访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessToken); + if (accessTokenDO == null) { + return null; + } + oauth2AccessTokenMapper.deleteById(accessTokenDO.getId()); + oauth2AccessTokenRedisDAO.delete(accessToken); + // 删除刷新令牌 + oauth2RefreshTokenMapper.deleteByRefreshToken(accessTokenDO.getRefreshToken()); + return accessTokenDO; + } + + @Override + public PageResult getAccessTokenPage(OAuth2AccessTokenPageReqVO reqVO) { + return oauth2AccessTokenMapper.selectPage(reqVO); + } + + private OAuth2AccessTokenDO createOAuth2AccessToken(OAuth2RefreshTokenDO refreshTokenDO, OAuth2ClientDO clientDO) { + OAuth2AccessTokenDO accessTokenDO = new OAuth2AccessTokenDO().setAccessToken(generateAccessToken()) + .setUserId(refreshTokenDO.getUserId()).setUserType(refreshTokenDO.getUserType()) + .setClientId(clientDO.getClientId()).setScopes(refreshTokenDO.getScopes()) + .setRefreshToken(refreshTokenDO.getRefreshToken()) + .setExpiresTime(DateUtils.addDate(Calendar.SECOND, clientDO.getAccessTokenValiditySeconds())); + accessTokenDO.setTenantId(TenantContextHolder.getTenantId()); // 手动设置租户编号,避免缓存到 Redis 的时候,无对应的租户编号 + oauth2AccessTokenMapper.insert(accessTokenDO); + // 记录到 Redis 中 + oauth2AccessTokenRedisDAO.set(accessTokenDO); + return accessTokenDO; + } + + private OAuth2RefreshTokenDO createOAuth2RefreshToken(Long userId, Integer userType, OAuth2ClientDO clientDO, List scopes) { + OAuth2RefreshTokenDO refreshToken = new OAuth2RefreshTokenDO().setRefreshToken(generateRefreshToken()) + .setUserId(userId).setUserType(userType) + .setClientId(clientDO.getClientId()).setScopes(scopes) + .setExpiresTime(DateUtils.addDate(Calendar.SECOND, clientDO.getRefreshTokenValiditySeconds())); + oauth2RefreshTokenMapper.insert(refreshToken); + return refreshToken; + } + + private static String generateAccessToken() { + return IdUtil.fastSimpleUUID(); + } + + private static String generateRefreshToken() { + return IdUtil.fastSimpleUUID(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/order/OrderService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/order/OrderService.java new file mode 100644 index 0000000..6cfb1c0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/order/OrderService.java @@ -0,0 +1,77 @@ +package com.jojubanking.boot.module.system.service.order; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.order.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 检查项目订单 Service 接口 + * + * @author admin + */ +public interface OrderService { + + /** + * 创建检查项目订单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createOrder(@Valid OrderCreateReqVO createReqVO); + + /** + * 更新检查项目订单 + * + * @param updateReqVO 更新信息 + */ + void updateOrder(@Valid OrderUpdateReqVO updateReqVO); + public void updateOrderByPay(OrderDO tjOrderDO); + public void updateOrderByNotify(OrderDO tjOrderDO); + + public void updateOrderAfter24(); + /** + * 删除检查项目订单 + * + * @param id 编号 + */ + void deleteOrder(Long id); + + /** + * 获得检查项目订单 + * + * @param id 编号 + * @return 检查项目订单 + */ + OrderDO getOrder(Long id); + + /** + * 获得检查项目订单列表 + * + * @param ids 编号 + * @return 检查项目订单列表 + */ + List getOrderList(Collection ids); + + /** + * 获得检查项目订单分页 + * + * @param pageReqVO 分页查询 + * @return 检查项目订单分页 + */ + PageResult getOrderPage(OrderPageReqVO pageReqVO); + + /** + * 获得检查项目订单列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检查项目订单列表 + */ + List getOrderList(OrderExportReqVO exportReqVO); + + List getOrderSumList(String batchno, String schoolName, String className, + String itemname, Integer sex, String dateRangeStart, String dateRangeEnd); + + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/order/OrderServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/order/OrderServiceImpl.java new file mode 100644 index 0000000..d72ab5d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/order/OrderServiceImpl.java @@ -0,0 +1,175 @@ +package com.jojubanking.boot.module.system.service.order; + +import com.alibaba.fastjson.JSONObject; +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentExportReqVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.XyrwListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.student.StudentDO; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; +import com.jojubanking.boot.module.system.framework.tjfiles.TjfilesProperties; +import com.jojubanking.boot.module.system.service.student.StudentService; +import com.jojubanking.boot.module.system.service.xyrw.XyrwService; +import com.jojubanking.boot.module.system.util.xytj.HttpClientUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.order.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.order.OrderConvert; +import com.jojubanking.boot.module.system.dal.mysql.order.OrderMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 检查项目订单 Service 实现类 + * + * @author admin + */ +@Service +@Validated +@Slf4j +public class OrderServiceImpl implements OrderService { + + @Resource + private OrderMapper orderMapper; + + @Resource + private StudentService studentService; + @Resource + private TjfilesProperties tjfilesProperties; + @Resource + private XyrwService xyrwService; + + @Override + public Long createOrder(OrderCreateReqVO createReqVO) { + // 插入 + OrderDO order = OrderConvert.INSTANCE.convert(createReqVO); + orderMapper.insert(order); + // 返回 + return order.getId(); + } + + @Override + public void updateOrderByPay(OrderDO tjOrderDO){ + orderMapper.updateOrderByPay(tjOrderDO); + } + + @Override + public void updateOrderAfter24(){ +// update xytj_order set deleted = true WHERE DATE(create_time) = CURDATE() - INTERVAL 1 DAY AND TIME(create_time) < '24:00:00' +// and (paystatus != '1' or paystatus IS NULL)")" + +// StudentExportReqVO exportReqVO = new StudentExportReqVO(); +// List list = studentService.getStudentList(exportReqVO); + + //取出paystatus为0 的记录 + //orderno非空,查询缴费记录,如果已缴费则更新paystatus 为1 + List lstOrder = orderMapper.selectOrderAfter24(); + log.info("tj 定时查询订单号,total:" + lstOrder.size()); + for(int i=0 ; i listXyrw = xyrwService.getXyrwSimpleList(xyrwListReqVO); + + OrderDO orderDO = new OrderDO(); + orderDO.setOrderno(lstOrder.get(i).getOrderno()); + + orderDO.setPaystatus("1"); + orderMapper.updateOrderByNotify(orderDO); + + //更新学生表的缴费标识 + StudentDO studenDO = new StudentDO(); + studenDO.setOrderno(lstOrder.get(i).getOrderno()); + studenDO.setBatchno(listXyrw.get(0).getBatchno()); + + studenDO.setFeeflag(1); + studentService.updateOrderByNotify(studenDO); + } + } + + } + } + log.info("开始定时查询,软删除paystatus为0的订单"); + orderMapper.updateOrderAfter24(); + log.info("结束定时查询,软删除paystatus为0的订单"); + } + + @Override + public void updateOrderByNotify(OrderDO tjOrderDO){ + orderMapper.updateOrderByNotify(tjOrderDO); + } + + @Override + public void updateOrder(OrderUpdateReqVO updateReqVO) { + // 校验存在 + this.validateOrderExists(updateReqVO.getId()); + // 更新 + OrderDO updateObj = OrderConvert.INSTANCE.convert(updateReqVO); + orderMapper.updateById(updateObj); + } + + @Override + public void deleteOrder(Long id) { + // 校验存在 + this.validateOrderExists(id); + // 删除 + orderMapper.deleteById(id); + } + + private void validateOrderExists(Long id) { + if (orderMapper.selectById(id) == null) { + throw exception(ORDER_NOT_EXISTS); + } + } + + @Override + public OrderDO getOrder(Long id) { + return orderMapper.selectById(id); + } + + @Override + public List getOrderList(Collection ids) { + return orderMapper.selectBatchIds(ids); + } + + @Override + public PageResult getOrderPage(OrderPageReqVO pageReqVO) { + return orderMapper.selectPage(pageReqVO); + } + + @Override + public List getOrderList(OrderExportReqVO exportReqVO) { + return orderMapper.selectList(exportReqVO); + } + + @Override + public List getOrderSumList(String batchno, String schoolName, String className, + String itemname, Integer sex, String dateRangeStart, String dateRangeEnd){ + return orderMapper.getSumList( batchno, schoolName, className, itemname, sex, dateRangeStart, dateRangeEnd); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/orderview/OrderViewService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/orderview/OrderViewService.java new file mode 100644 index 0000000..88b21a5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/orderview/OrderViewService.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.service.orderview; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.orderview.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.orderview.OrderViewDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * VIEW Service 接口 + * + * @author admin + */ +public interface OrderViewService { + + /** + * 创建VIEW + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createOrderView(@Valid OrderViewCreateReqVO createReqVO); + + /** + * 更新VIEW + * + * @param updateReqVO 更新信息 + */ + void updateOrderView(@Valid OrderViewUpdateReqVO updateReqVO); + + /** + * 删除VIEW + * + * @param id 编号 + */ + void deleteOrderView(Long id); + + /** + * 获得VIEW + * + * @param id 编号 + * @return VIEW + */ + OrderViewDO getOrderView(Long id); + + /** + * 获得VIEW列表 + * + * @param ids 编号 + * @return VIEW列表 + */ + List getOrderViewList(Collection ids); + + /** + * 获得VIEW分页 + * + * @param pageReqVO 分页查询 + * @return VIEW分页 + */ + PageResult getOrderViewPage(OrderViewPageReqVO pageReqVO); + + /** + * 获得VIEW列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return VIEW列表 + */ + List getOrderViewList(OrderViewExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/orderview/OrderViewServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/orderview/OrderViewServiceImpl.java new file mode 100644 index 0000000..a9f7a67 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/orderview/OrderViewServiceImpl.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.orderview; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.orderview.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.orderview.OrderViewDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.orderview.OrderViewConvert; +import com.jojubanking.boot.module.system.dal.mysql.orderview.OrderViewMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * VIEW Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class OrderViewServiceImpl implements OrderViewService { + + @Resource + private OrderViewMapper orderViewMapper; + + @Override + public Long createOrderView(OrderViewCreateReqVO createReqVO) { + // 插入 + OrderViewDO orderView = OrderViewConvert.INSTANCE.convert(createReqVO); + orderViewMapper.insert(orderView); + // 返回 + return orderView.getId(); + } + + @Override + public void updateOrderView(OrderViewUpdateReqVO updateReqVO) { + // 校验存在 + this.validateOrderViewExists(updateReqVO.getId()); + // 更新 + OrderViewDO updateObj = OrderViewConvert.INSTANCE.convert(updateReqVO); + orderViewMapper.updateById(updateObj); + } + + @Override + public void deleteOrderView(Long id) { + // 校验存在 + this.validateOrderViewExists(id); + // 删除 + orderViewMapper.deleteById(id); + } + + private void validateOrderViewExists(Long id) { + if (orderViewMapper.selectById(id) == null) { + throw exception(ORDER_VIEW_NOT_EXISTS); + } + } + + @Override + public OrderViewDO getOrderView(Long id) { + return orderViewMapper.selectById(id); + } + + @Override + public List getOrderViewList(Collection ids) { + return orderViewMapper.selectBatchIds(ids); + } + + @Override + public PageResult getOrderViewPage(OrderViewPageReqVO pageReqVO) { + return orderViewMapper.selectPage(pageReqVO); + } + + @Override + public List getOrderViewList(OrderViewExportReqVO exportReqVO) { + return orderViewMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/MenuService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/MenuService.java new file mode 100644 index 0000000..c940e89 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/MenuService.java @@ -0,0 +1,109 @@ +package com.jojubanking.boot.module.system.service.permission; + +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; + +import java.util.Collection; +import java.util.List; + +/** + * 菜单 Service 接口 + * + * @author TW + */ +public interface MenuService { + + /** + * 初始化菜单的本地缓存 + */ + void initLocalCache(); + + /** + * 创建菜单 + * + * @param reqVO 菜单信息 + * @return 创建出来的菜单编号 + */ + Long createMenu(MenuCreateReqVO reqVO); + + /** + * 更新菜单 + * + * @param reqVO 菜单信息 + */ + void updateMenu(MenuUpdateReqVO reqVO); + + /** + * 删除菜单 + * + * @param id 菜单编号 + */ + void deleteMenu(Long id); + + /** + * 获得所有菜单列表 + * + * @return 菜单列表 + */ + List getMenus(); + + /** + * 基于租户,筛选菜单列表 + * 注意,如果是系统租户,返回的还是全菜单 + * + * @param reqVO 筛选条件请求 VO + * @return 菜单列表 + */ + List getTenantMenus(MenuListReqVO reqVO); + + /** + * 筛选菜单列表 + * + * @param reqVO 筛选条件请求 VO + * @return 菜单列表 + */ + List getMenus(MenuListReqVO reqVO); + + /** + * 获得所有菜单,从缓存中 + * + * 任一参数为空时,则返回为空 + * + * @param menuTypes 菜单类型数组 + * @param menusStatuses 菜单状态数组 + * @return 菜单列表 + */ + List getMenuListFromCache(Collection menuTypes, Collection menusStatuses); + + /** + * 获得指定编号的菜单数组,从缓存中 + * + * 任一参数为空时,则返回为空 + * + * @param menuIds 菜单编号数组 + * @param menuTypes 菜单类型数组 + * @param menusStatuses 菜单状态数组 + * @return 菜单数组 + */ + List getMenuListFromCache(Collection menuIds, Collection menuTypes, + Collection menusStatuses); + + /** + * 获得权限对应的菜单数组 + * + * @param permission 权限标识 + * @return 数组 + */ + List getMenuListByPermissionFromCache(String permission); + + /** + * 获得菜单 + * + * @param id 菜单编号 + * @return 菜单 + */ + MenuDO getMenu(Long id); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/MenuServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/MenuServiceImpl.java new file mode 100644 index 0000000..e870468 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/MenuServiceImpl.java @@ -0,0 +1,324 @@ +package com.jojubanking.boot.module.system.service.permission; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO; +import com.jojubanking.boot.module.system.convert.permission.MenuConvert; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import com.jojubanking.boot.module.system.dal.mysql.permission.MenuMapper; +import com.jojubanking.boot.module.system.enums.permission.MenuIdEnum; +import com.jojubanking.boot.module.system.enums.permission.MenuTypeEnum; +import com.jojubanking.boot.module.system.mq.producer.permission.MenuProducer; +import com.jojubanking.boot.module.system.service.tenant.TenantService; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 菜单 Service 实现 + * + * @author TW + */ +@Service +@Slf4j +public class MenuServiceImpl implements MenuService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 菜单缓存 + * key:菜单编号 + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Map menuCache; + /** + * 权限与菜单缓存 + * key:权限 {@link MenuDO#getPermission()} + * value:MenuDO 数组,因为一个权限可能对应多个 MenuDO 对象 + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Multimap permissionMenuCache; + /** + * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Resource + private MenuMapper menuMapper; + @Resource + private PermissionService permissionService; + @Resource + @Lazy // 延迟,避免循环依赖报错 + private TenantService tenantService; + + @Resource + private MenuProducer menuProducer; + + /** + * 初始化 {@link #menuCache} 和 {@link #permissionMenuCache} 缓存 + */ + @Override + @PostConstruct + public synchronized void initLocalCache() { + // 获取菜单列表,如果有更新 + List menuList = this.loadMenuIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(menuList)) { + return; + } + + // 构建缓存 + ImmutableMap.Builder menuCacheBuilder = ImmutableMap.builder(); + ImmutableMultimap.Builder permMenuCacheBuilder = ImmutableMultimap.builder(); + menuList.forEach(menuDO -> { + menuCacheBuilder.put(menuDO.getId(), menuDO); + if (StrUtil.isNotEmpty(menuDO.getPermission())) { // 会存在 permission 为 null 的情况,导致 put 报 NPE 异常 + permMenuCacheBuilder.put(menuDO.getPermission(), menuDO); + } + }); + menuCache = menuCacheBuilder.build(); + permissionMenuCache = permMenuCacheBuilder.build(); + maxUpdateTime = CollectionUtils.getMaxValue(menuList, MenuDO::getUpdateTime); + log.info("[initLocalCache][缓存菜单,数量为:{}]", menuList.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initLocalCache(); + } + + /** + * 如果菜单发生变化,从数据库中获取最新的全量菜单。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前菜单的最大更新时间 + * @return 菜单列表 + */ + private List loadMenuIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadMenuIfUpdate][首次加载全量菜单]"); + } else { // 判断数据库中是否有更新的菜单 + if (menuMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { + return null; + } + log.info("[loadMenuIfUpdate][增量加载全量菜单]"); + } + // 第二步,如果有更新,则从数据库加载所有菜单 + return menuMapper.selectList(); + } + + @Override + public Long createMenu(MenuCreateReqVO reqVO) { + // 校验父菜单存在 + checkParentResource(reqVO.getParentId(), null); + // 校验菜单(自己) + checkResource(reqVO.getParentId(), reqVO.getName(), null); + // 插入数据库 + MenuDO menu = MenuConvert.INSTANCE.convert(reqVO); + initMenuProperty(menu); + menuMapper.insert(menu); + // 发送刷新消息 + menuProducer.sendMenuRefreshMessage(); + // 返回 + return menu.getId(); + } + + @Override + public void updateMenu(MenuUpdateReqVO reqVO) { + // 校验更新的菜单是否存在 + if (menuMapper.selectById(reqVO.getId()) == null) { + throw ServiceExceptionUtil.exception(MENU_NOT_EXISTS); + } + // 校验父菜单存在 + checkParentResource(reqVO.getParentId(), reqVO.getId()); + // 校验菜单(自己) + checkResource(reqVO.getParentId(), reqVO.getName(), reqVO.getId()); + // 更新到数据库 + MenuDO updateObject = MenuConvert.INSTANCE.convert(reqVO); + initMenuProperty(updateObject); + menuMapper.updateById(updateObject); + // 发送刷新消息 + menuProducer.sendMenuRefreshMessage(); + } + + /** + * 删除菜单 + * + * @param menuId 菜单编号 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteMenu(Long menuId) { + // 校验是否还有子菜单 + if (menuMapper.selectCountByParentId(menuId) > 0) { + throw ServiceExceptionUtil.exception(MENU_EXISTS_CHILDREN); + } + // 校验删除的菜单是否存在 + if (menuMapper.selectById(menuId) == null) { + throw ServiceExceptionUtil.exception(MENU_NOT_EXISTS); + } + // 标记删除 + menuMapper.deleteById(menuId); + // 删除授予给角色的权限 + permissionService.processMenuDeleted(menuId); + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + menuProducer.sendMenuRefreshMessage(); + } + + }); + } + + @Override + public List getMenus() { + return menuMapper.selectList(); + } + + @Override + public List getTenantMenus(MenuListReqVO reqVO) { + List menus = getMenus(reqVO); + // 开启多租户的情况下,需要过滤掉未开通的菜单 + tenantService.handleTenantMenu(menuIds -> menus.removeIf(menu -> !CollUtil.contains(menuIds, menu.getId()))); + return menus; + } + + @Override + public List getMenus(MenuListReqVO reqVO) { + return menuMapper.selectList(reqVO); + } + + @Override + public List getMenuListFromCache(Collection menuTypes, Collection menusStatuses) { + // 任一一个参数为空,则返回空 + if (CollectionUtils.isAnyEmpty(menuTypes, menusStatuses)) { + return Collections.emptyList(); + } + // 创建新数组,避免缓存被修改 + return menuCache.values().stream().filter(menu -> menuTypes.contains(menu.getType()) + && menusStatuses.contains(menu.getStatus())) + .collect(Collectors.toList()); + } + + @Override + public List getMenuListFromCache(Collection menuIds, Collection menuTypes, + Collection menusStatuses) { + // 任一一个参数为空,则返回空 + if (CollectionUtils.isAnyEmpty(menuIds, menuTypes, menusStatuses)) { + return Collections.emptyList(); + } + return menuCache.values().stream().filter(menu -> menuIds.contains(menu.getId()) + && menuTypes.contains(menu.getType()) + && menusStatuses.contains(menu.getStatus())) + .collect(Collectors.toList()); + } + + @Override + public List getMenuListByPermissionFromCache(String permission) { + return new ArrayList<>(permissionMenuCache.get(permission)); + } + + @Override + public MenuDO getMenu(Long id) { + return menuMapper.selectById(id); + } + + /** + * 校验父菜单是否合法 + * + * 1. 不能设置自己为父菜单 + * 2. 父菜单不存在 + * 3. 父菜单必须是 {@link MenuTypeEnum#MENU} 菜单类型 + * + * @param parentId 父菜单编号 + * @param childId 当前菜单编号 + */ + @VisibleForTesting + public void checkParentResource(Long parentId, Long childId) { + if (parentId == null || MenuIdEnum.ROOT.getId().equals(parentId)) { + return; + } + // 不能设置自己为父菜单 + if (parentId.equals(childId)) { + throw ServiceExceptionUtil.exception(MENU_PARENT_ERROR); + } + MenuDO menu = menuMapper.selectById(parentId); + // 父菜单不存在 + if (menu == null) { + throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_EXISTS); + } + // 父菜单必须是目录或者菜单类型 + if (!MenuTypeEnum.DIR.getType().equals(menu.getType()) + && !MenuTypeEnum.MENU.getType().equals(menu.getType())) { + throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_DIR_OR_MENU); + } + } + + /** + * 校验菜单是否合法 + * + * 1. 校验相同父菜单编号下,是否存在相同的菜单名 + * + * @param name 菜单名字 + * @param parentId 父菜单编号 + * @param id 菜单编号 + */ + @VisibleForTesting + public void checkResource(Long parentId, String name, Long id) { + MenuDO menu = menuMapper.selectByParentIdAndName(parentId, name); + if (menu == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的菜单 + if (id == null) { + throw ServiceExceptionUtil.exception(MENU_NAME_DUPLICATE); + } + if (!menu.getId().equals(id)) { + throw ServiceExceptionUtil.exception(MENU_NAME_DUPLICATE); + } + } + + /** + * 初始化菜单的通用属性。 + * + * 例如说,只有目录或者菜单类型的菜单,才设置 icon + * + * @param menu 菜单 + */ + private void initMenuProperty(MenuDO menu) { + // 菜单为按钮类型时,无需 component、icon、path 属性,进行置空 + if (MenuTypeEnum.BUTTON.getType().equals(menu.getType())) { + menu.setComponent(""); + menu.setIcon(""); + menu.setPath(""); + } + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/PermissionService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/PermissionService.java new file mode 100644 index 0000000..80a08c8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/PermissionService.java @@ -0,0 +1,142 @@ +package com.jojubanking.boot.module.system.service.permission; + +import com.jojubanking.boot.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import org.springframework.lang.Nullable; + +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * 权限 Service 接口 + * + * 提供用户-角色、角色-菜单、角色-部门的关联权限处理 + * + * @author TW + */ +public interface PermissionService { + + /** + * 初始化权限的本地缓存 + */ + void initLocalCache(); + + /** + * 获得角色们拥有的菜单列表,从缓存中获取 + * + * 任一参数为空时,则返回为空 + * + * @param roleIds 角色编号数组 + * @param menuTypes 菜单类型数组 + * @param menusStatuses 菜单状态数组 + * @return 菜单列表 + */ + List getRoleMenuListFromCache(Collection roleIds, Collection menuTypes, + Collection menusStatuses); + + /** + * 获得用户拥有的角色编号集合,从缓存中获取 + * + * @param userId 用户编号 + * @param roleStatuses 角色状态集合. 允许为空,为空时不过滤 + * @return 角色编号集合 + */ + Set getUserRoleIdsFromCache(Long userId, @Nullable Collection roleStatuses); + + /** + * 获得角色拥有的菜单编号集合 + * + * @param roleId 角色编号 + * @return 菜单编号集合 + */ + Set getRoleMenuIds(Long roleId); + + /** + * 获得拥有多个角色的用户编号集合 + * + * @param roleIds 角色编号集合 + * @return 用户编号集合 + */ + Set getUserRoleIdListByRoleIds(Collection roleIds); + + /** + * 设置角色菜单 + * + * @param roleId 角色编号 + * @param menuIds 菜单编号集合 + */ + void assignRoleMenu(Long roleId, Set menuIds); + + /** + * 获得用户拥有的角色编号集合 + * + * @param userId 用户编号 + * @return 角色编号集合 + */ + Set getUserRoleIdListByUserId(Long userId); + + /** + * 设置用户角色 + * + * @param userId 角色编号 + * @param roleIds 角色编号集合 + */ + void assignUserRole(Long userId, Set roleIds); + + /** + * 设置角色的数据权限 + * + * @param roleId 角色编号 + * @param dataScope 数据范围 + * @param dataScopeDeptIds 部门编号数组 + */ + void assignRoleDataScope(Long roleId, Integer dataScope, Set dataScopeDeptIds); + + /** + * 处理角色删除时,删除关联授权数据 + * + * @param roleId 角色编号 + */ + void processRoleDeleted(Long roleId); + + /** + * 处理菜单删除时,删除关联授权数据 + * + * @param menuId 菜单编号 + */ + void processMenuDeleted(Long menuId); + + /** + * 处理用户删除是,删除关联授权数据 + * + * @param userId 用户编号 + */ + void processUserDeleted(Long userId); + + /** + * 判断是否有权限,任一一个即可 + * + * @param userId 用户编号 + * @param permissions 权限 + * @return 是否 + */ + boolean hasAnyPermissions(Long userId, String... permissions); + + /** + * 判断是否有角色,任一一个即可 + * + * @param roles 角色数组 + * @return 是否 + */ + boolean hasAnyRoles(Long userId, String... roles); + + /** + * 获得登陆用户的部门数据权限 + * + * @param userId 用户编号 + * @return 部门数据权限 + */ + DeptDataPermissionRespDTO getDeptDataPermission(Long userId); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl.java new file mode 100644 index 0000000..3d54dfe --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl.java @@ -0,0 +1,516 @@ +package com.jojubanking.boot.module.system.service.permission; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ArrayUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.common.util.collection.MapUtils; +import com.jojubanking.boot.framework.common.util.json.JsonUtils; +import com.jojubanking.boot.framework.datapermission.core.annotation.DataPermission; +import com.jojubanking.boot.framework.tenant.core.aop.TenantIgnore; +import com.jojubanking.boot.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleMenuDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.UserRoleDO; +import com.jojubanking.boot.module.system.dal.mysql.permission.RoleMenuBatchInsertMapper; +import com.jojubanking.boot.module.system.dal.mysql.permission.RoleMenuMapper; +import com.jojubanking.boot.module.system.dal.mysql.permission.UserRoleBatchInsertMapper; +import com.jojubanking.boot.module.system.dal.mysql.permission.UserRoleMapper; +import com.jojubanking.boot.module.system.enums.permission.DataScopeEnum; +import com.jojubanking.boot.module.system.mq.producer.permission.PermissionProducer; +import com.jojubanking.boot.module.system.service.dept.DeptService; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; +import java.util.function.Supplier; + +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertSet; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.getMaxValue; +import static java.util.Collections.singleton; + +/** + * 权限 Service 实现类 + * + * @author TW + */ +@Service +@Slf4j +public class PermissionServiceImpl implements PermissionService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 角色编号与菜单编号的缓存映射 + * key:角色编号 + * value:菜单编号的数组 + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + @Getter + @Setter // 单元测试需要 + private volatile Multimap roleMenuCache; + /** + * 菜单编号与角色编号的缓存映射 + * key:菜单编号 + * value:角色编号的数组 + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + @Getter + @Setter // 单元测试需要 + private volatile Multimap menuRoleCache; + /** + * 缓存 RoleMenu 的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + @Getter + private volatile Date roleMenuMaxUpdateTime; + + /** + * 用户编号与角色编号的缓存映射 + * key:用户编号 + * value:角色编号的数组 + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + @Getter + @Setter // 单元测试需要 + private volatile Map> userRoleCache; + /** + * 缓存 UserRole 的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + @Getter + private volatile Date userRoleMaxUpdateTime; + + @Resource + private RoleMenuMapper roleMenuMapper; + @Resource + private RoleMenuBatchInsertMapper roleMenuBatchInsertMapper; + @Resource + private UserRoleMapper userRoleMapper; + @Resource + private UserRoleBatchInsertMapper userRoleBatchInsertMapper; + + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + @Resource + private DeptService deptService; + @Resource + private AdminUserService userService; + + @Resource + private PermissionProducer permissionProducer; + + @Resource + @Lazy // 注入自己,所以延迟加载 + private PermissionService self; + + @Override + @PostConstruct + @TenantIgnore // 初始化缓存,无需租户过滤 + public void initLocalCache() { + initUserRoleLocalCache(); + initRoleMenuLocalCache(); + } + + /** + * 初始化 {@link #roleMenuCache} 和 {@link #menuRoleCache} 缓存 + */ + @VisibleForTesting + void initRoleMenuLocalCache() { + // 获取角色与菜单的关联列表,如果有更新 + List roleMenuList = loadRoleMenuIfUpdate(roleMenuMaxUpdateTime); + if (CollUtil.isEmpty(roleMenuList)) { + return; + } + + // 初始化 roleMenuCache 和 menuRoleCache 缓存 + ImmutableMultimap.Builder roleMenuCacheBuilder = ImmutableMultimap.builder(); + ImmutableMultimap.Builder menuRoleCacheBuilder = ImmutableMultimap.builder(); + roleMenuList.forEach(roleMenuDO -> { + roleMenuCacheBuilder.put(roleMenuDO.getRoleId(), roleMenuDO.getMenuId()); + menuRoleCacheBuilder.put(roleMenuDO.getMenuId(), roleMenuDO.getRoleId()); + }); + roleMenuCache = roleMenuCacheBuilder.build(); + menuRoleCache = menuRoleCacheBuilder.build(); + roleMenuMaxUpdateTime = getMaxValue(roleMenuList, RoleMenuDO::getUpdateTime); + log.info("[initRoleMenuLocalCache][初始化角色与菜单的关联数量为 {}]", roleMenuList.size()); + } + + /** + * 初始化 {@link #userRoleCache} 缓存 + */ + @VisibleForTesting + void initUserRoleLocalCache() { + // 获取用户与角色的关联列表,如果有更新 + List userRoleList = loadUserRoleIfUpdate(userRoleMaxUpdateTime); + if (CollUtil.isEmpty(userRoleList)) { + return; + } + + // 初始化 userRoleCache 缓存 + ImmutableMultimap.Builder userRoleCacheBuilder = ImmutableMultimap.builder(); + userRoleList.forEach(userRoleDO -> userRoleCacheBuilder.put(userRoleDO.getUserId(), userRoleDO.getRoleId())); + userRoleCache = CollectionUtils.convertMultiMap2(userRoleList, UserRoleDO::getUserId, UserRoleDO::getRoleId); + userRoleMaxUpdateTime = getMaxValue(userRoleList, UserRoleDO::getUpdateTime); + log.info("[initUserRoleLocalCache][初始化用户与角色的关联数量为 {}]", userRoleList.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + self.initLocalCache(); + } + + /** + * 如果角色与菜单的关联发生变化,从数据库中获取最新的全量角色与菜单的关联。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前角色与菜单的关联的最大更新时间 + * @return 角色与菜单的关联列表 + */ + protected List loadRoleMenuIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadRoleMenuIfUpdate][首次加载全量角色与菜单的关联]"); + } else { // 判断数据库中是否有更新的角色与菜单的关联 + if (roleMenuMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { + return null; + } + log.info("[loadRoleMenuIfUpdate][增量加载全量角色与菜单的关联]"); + } + // 第二步,如果有更新,则从数据库加载所有角色与菜单的关联 + return roleMenuMapper.selectList(); + } + + /** + * 如果用户与角色的关联发生变化,从数据库中获取最新的全量用户与角色的关联。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前角色与菜单的关联的最大更新时间 + * @return 角色与菜单的关联列表 + */ + protected List loadUserRoleIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadUserRoleIfUpdate][首次加载全量用户与角色的关联]"); + } else { // 判断数据库中是否有更新的用户与角色的关联 + if (userRoleMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { + return null; + } + log.info("[loadUserRoleIfUpdate][增量加载全量用户与角色的关联]"); + } + // 第二步,如果有更新,则从数据库加载所有用户与角色的关联 + return userRoleMapper.selectList(); + } + + @Override + public List getRoleMenuListFromCache(Collection roleIds, Collection menuTypes, + Collection menusStatuses) { + // 任一一个参数为空时,不返回任何菜单 + if (CollectionUtils.isAnyEmpty(roleIds, menuTypes, menusStatuses)) { + return Collections.emptyList(); + } + + // 判断角色是否包含超级管理员。如果是超级管理员,获取到全部 + List roleList = roleService.getRolesFromCache(roleIds); + if (roleService.hasAnySuperAdmin(roleList)) { + return menuService.getMenuListFromCache(menuTypes, menusStatuses); + } + + // 获得角色拥有的菜单关联 + List menuIds = MapUtils.getList(roleMenuCache, roleIds); + return menuService.getMenuListFromCache(menuIds, menuTypes, menusStatuses); + } + + @Override + public Set getUserRoleIdsFromCache(Long userId, Collection roleStatuses) { + Set cacheRoleIds = userRoleCache.get(userId); + // 创建用户的时候没有分配角色,会存在空指针异常 + if (CollUtil.isEmpty(cacheRoleIds)) { + return Collections.emptySet(); + } + Set roleIds = new HashSet<>(cacheRoleIds); + // 过滤角色状态 + if (CollectionUtil.isNotEmpty(roleStatuses)) { + roleIds.removeIf(roleId -> { + RoleDO role = roleService.getRoleFromCache(roleId); + return role == null || !roleStatuses.contains(role.getStatus()); + }); + } + return roleIds; + } + + @Override + public Set getRoleMenuIds(Long roleId) { + // 如果是管理员的情况下,获取全部菜单编号 + if (roleService.hasAnySuperAdmin(Collections.singleton(roleId))) { + return convertSet(menuService.getMenus(), MenuDO::getId); + } + // 如果是非管理员的情况下,获得拥有的菜单编号 + return convertSet(roleMenuMapper.selectListByRoleId(roleId), RoleMenuDO::getMenuId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void assignRoleMenu(Long roleId, Set menuIds) { + // 获得角色拥有菜单编号 + Set dbMenuIds = convertSet(roleMenuMapper.selectListByRoleId(roleId), + RoleMenuDO::getMenuId); + // 计算新增和删除的菜单编号 + Collection createMenuIds = CollUtil.subtract(menuIds, dbMenuIds); + Collection deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIds); + // 执行新增和删除。对于已经授权的菜单,不用做任何处理 + if (!CollectionUtil.isEmpty(createMenuIds)) { + roleMenuBatchInsertMapper.saveBatch(CollectionUtils.convertList(createMenuIds, menuId -> { + RoleMenuDO entity = new RoleMenuDO(); + entity.setRoleId(roleId); + entity.setMenuId(menuId); + return entity; + })); + } + if (!CollectionUtil.isEmpty(deleteMenuIds)) { + roleMenuMapper.deleteListByRoleIdAndMenuIds(roleId, deleteMenuIds); + } + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + permissionProducer.sendRoleMenuRefreshMessage(); + } + + }); + } + + @Override + public Set getUserRoleIdListByUserId(Long userId) { + return convertSet(userRoleMapper.selectListByUserId(userId), + UserRoleDO::getRoleId); + } + + @Override + public Set getUserRoleIdListByRoleIds(Collection roleIds) { + return convertSet(userRoleMapper.selectListByRoleIds(roleIds), + UserRoleDO::getUserId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void assignUserRole(Long userId, Set roleIds) { + // 获得角色拥有角色编号 + Set dbRoleIds = convertSet(userRoleMapper.selectListByUserId(userId), + UserRoleDO::getRoleId); + // 计算新增和删除的角色编号 + Collection createRoleIds = CollUtil.subtract(roleIds, dbRoleIds); + Collection deleteMenuIds = CollUtil.subtract(dbRoleIds, roleIds); + // 执行新增和删除。对于已经授权的角色,不用做任何处理 + if (!CollectionUtil.isEmpty(createRoleIds)) { + userRoleBatchInsertMapper.saveBatch(CollectionUtils.convertList(createRoleIds, roleId -> { + UserRoleDO entity = new UserRoleDO(); + entity.setUserId(userId); + entity.setRoleId(roleId); + return entity; + })); + } + if (!CollectionUtil.isEmpty(deleteMenuIds)) { + userRoleMapper.deleteListByUserIdAndRoleIdIds(userId, deleteMenuIds); + } + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + permissionProducer.sendUserRoleRefreshMessage(); + } + + }); + } + + @Override + public void assignRoleDataScope(Long roleId, Integer dataScope, Set dataScopeDeptIds) { + roleService.updateRoleDataScope(roleId, dataScope, dataScopeDeptIds); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void processRoleDeleted(Long roleId) { + // 标记删除 UserRole + userRoleMapper.deleteListByRoleId(roleId); + // 标记删除 RoleMenu + roleMenuMapper.deleteListByRoleId(roleId); + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + permissionProducer.sendRoleMenuRefreshMessage(); + permissionProducer.sendUserRoleRefreshMessage(); + } + + }); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void processMenuDeleted(Long menuId) { + roleMenuMapper.deleteListByMenuId(menuId); + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + permissionProducer.sendRoleMenuRefreshMessage(); + } + + }); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void processUserDeleted(Long userId) { + userRoleMapper.deleteListByUserId(userId); + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + permissionProducer.sendUserRoleRefreshMessage(); + } + + }); + } + + @Override + public boolean hasAnyPermissions(Long userId, String... permissions) { + // 如果为空,说明已经有权限 + if (ArrayUtil.isEmpty(permissions)) { + return true; + } + + // 获得当前登录的角色。如果为空,说明没有权限 + Set roleIds = getUserRoleIdsFromCache(userId, singleton(CommonStatusEnum.ENABLE.getStatus())); + if (CollUtil.isEmpty(roleIds)) { + return false; + } + // 判断是否是超管。如果是,当然符合条件 + if (roleService.hasAnySuperAdmin(roleIds)) { + return true; + } + + // 遍历权限,判断是否有一个满足 + return Arrays.stream(permissions).anyMatch(permission -> { + List menuList = menuService.getMenuListByPermissionFromCache(permission); + // 采用严格模式,如果权限找不到对应的 Menu 的话,认为 + if (CollUtil.isEmpty(menuList)) { + return false; + } + // 获得是否拥有该权限,任一一个 + return menuList.stream().anyMatch(menu -> CollUtil.containsAny(roleIds, + menuRoleCache.get(menu.getId()))); + }); + } + + @Override + public boolean hasAnyRoles(Long userId, String... roles) { + // 如果为空,说明已经有权限 + if (ArrayUtil.isEmpty(roles)) { + return true; + } + + // 获得当前登录的角色。如果为空,说明没有权限 + Set roleIds = getUserRoleIdsFromCache(userId, singleton(CommonStatusEnum.ENABLE.getStatus())); + if (CollUtil.isEmpty(roleIds)) { + return false; + } + // 判断是否是超管。如果是,当然符合条件 + if (roleService.hasAnySuperAdmin(roleIds)) { + return true; + } + Set userRoles = convertSet(roleService.getRolesFromCache(roleIds), + RoleDO::getCode); + return CollUtil.containsAny(userRoles, Sets.newHashSet(roles)); + } + + @Override + @DataPermission(enable = false) // 关闭数据权限,不然就会出现递归获取数据权限的问题 + @TenantIgnore // 忽略多租户的自动过滤。如果不忽略,会导致添加租户时,因为切换租户,导致获取不到 User。即使忽略,本身该方法不存在跨租户的操作,不会存在问题。 + public DeptDataPermissionRespDTO getDeptDataPermission(Long userId) { + // 获得用户的角色 + Set roleIds = getUserRoleIdsFromCache(userId, singleton(CommonStatusEnum.ENABLE.getStatus())); + // 如果角色为空,则只能查看自己 + DeptDataPermissionRespDTO result = new DeptDataPermissionRespDTO(); + if (CollUtil.isEmpty(roleIds)) { + result.setSelf(true); + return result; + } + List roles = roleService.getRolesFromCache(roleIds); + + // 获得用户的部门编号的缓存,通过 Guava 的 Suppliers 惰性求值,即有且仅有第一次发起 DB 的查询 + Supplier userDeptIdCache = Suppliers.memoize(() -> userService.getUser(userId).getDeptId()); + // 遍历每个角色,计算 + for (RoleDO role : roles) { + // 为空时,跳过 + if (role.getDataScope() == null) { + continue; + } + // 情况一,ALL + if (Objects.equals(role.getDataScope(), DataScopeEnum.ALL.getScope())) { + result.setAll(true); + continue; + } + // 情况二,DEPT_CUSTOM + if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_CUSTOM.getScope())) { + CollUtil.addAll(result.getDeptIds(), role.getDataScopeDeptIds()); + // 自定义可见部门时,保证可以看到自己所在的部门。否则,一些场景下可能会有问题。 + // 例如说,登录时,基于 t_user 的 username 查询会可能被 dept_id 过滤掉 + CollUtil.addAll(result.getDeptIds(), userDeptIdCache.get()); + continue; + } + // 情况三,DEPT_ONLY + if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_ONLY.getScope())) { + CollectionUtils.addIfNotNull(result.getDeptIds(), userDeptIdCache.get()); + continue; + } + // 情况四,DEPT_DEPT_AND_CHILD + if (Objects.equals(role.getDataScope(), DataScopeEnum.DEPT_AND_CHILD.getScope())) { + List depts = deptService.getDeptsByParentIdFromCache(userDeptIdCache.get(), true); + CollUtil.addAll(result.getDeptIds(), CollectionUtils.convertList(depts, DeptDO::getId)); + // 添加本身部门编号 + CollUtil.addAll(result.getDeptIds(), userDeptIdCache.get()); + continue; + } + // 情况五,SELF + if (Objects.equals(role.getDataScope(), DataScopeEnum.SELF.getScope())) { + result.setSelf(true); + continue; + } + // 未知情况,error log 即可 + log.error("[getDeptDataPermission][LoginUser({}) role({}) 无法处理]", userId, JsonUtils.toJsonString(result)); + } + return result; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/RoleService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/RoleService.java new file mode 100644 index 0000000..45f9c39 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/RoleService.java @@ -0,0 +1,143 @@ +package com.jojubanking.boot.module.system.service.permission; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RolePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import org.springframework.lang.Nullable; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +/** + * 角色 Service 接口 + * + * @author TW + */ +public interface RoleService { + + /** + * 初始化角色的本地缓存 + */ + void initLocalCache(); + + /** + * 创建角色 + * + * @param reqVO 创建角色信息 + * @param type 角色类型 + * @return 角色编号 + */ + Long createRole(@Valid RoleCreateReqVO reqVO, Integer type); + + /** + * 更新角色 + * + * @param reqVO 更新角色信息 + */ + void updateRole(@Valid RoleUpdateReqVO reqVO); + + /** + * 删除角色 + * + * @param id 角色编号 + */ + void deleteRole(Long id); + + /** + * 更新角色状态 + * + * @param id 角色编号 + * @param status 状态 + */ + void updateRoleStatus(Long id, Integer status); + + /** + * 设置角色的数据权限 + * + * @param id 角色编号 + * @param dataScope 数据范围 + * @param dataScopeDeptIds 部门编号数组 + */ + void updateRoleDataScope(Long id, Integer dataScope, Set dataScopeDeptIds); + + /** + * 获得角色,从缓存中 + * + * @param id 角色编号 + * @return 角色 + */ + RoleDO getRoleFromCache(Long id); + + /** + * 获得角色列表 + * + * @param statuses 筛选的状态。允许空,空时不筛选 + * @return 角色列表 + */ + List getRoles(@Nullable Collection statuses); + + /** + * 获得角色数组,从缓存中 + * + * @param ids 角色编号数组 + * @return 角色数组 + */ + List getRolesFromCache(Collection ids); + + /** + * 判断角色数组中,是否有超级管理员 + * + * @param roleList 角色数组 + * @return 是否有管理员 + */ + boolean hasAnySuperAdmin(Collection roleList); + + /** + * 判断角色编号数组中,是否有管理员 + * + * @param ids 角色编号数组 + * @return 是否有管理员 + */ + default boolean hasAnySuperAdmin(Set ids) { + return hasAnySuperAdmin(getRolesFromCache(ids)); + } + + /** + * 获得角色 + * + * @param id 角色编号 + * @return 角色 + */ + RoleDO getRole(Long id); + + /** + * 获得角色分页 + * + * @param reqVO 角色分页查询 + * @return 角色分页结果 + */ + PageResult getRolePage(RolePageReqVO reqVO); + + /** + * 获得角色列表 + * + * @param reqVO 列表查询 + * @return 角色列表 + */ + List getRoleList(RoleExportReqVO reqVO); + + /** + * 校验角色们是否有效。如下情况,视为无效: + * 1. 角色编号不存在 + * 2. 角色被禁用 + * + * @param ids 角色编号数组 + */ + void validRoles(Collection ids); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/RoleServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/RoleServiceImpl.java new file mode 100644 index 0000000..5f653c3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/RoleServiceImpl.java @@ -0,0 +1,324 @@ +package com.jojubanking.boot.module.system.service.permission; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.system.enums.permission.DataScopeEnum; +import com.jojubanking.boot.framework.tenant.core.aop.TenantIgnore; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RolePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; +import com.jojubanking.boot.module.system.convert.permission.RoleConvert; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.dal.mysql.permission.RoleMapper; +import com.jojubanking.boot.module.system.enums.permission.RoleCodeEnum; +import com.jojubanking.boot.module.system.enums.permission.RoleTypeEnum; +import com.jojubanking.boot.module.system.mq.producer.permission.RoleProducer; +import com.google.common.annotations.VisibleForTesting; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.lang.Nullable; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; +import org.springframework.util.StringUtils; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 角色 Service 实现类 + * + * @author TW + */ +@Service +@Slf4j +public class RoleServiceImpl implements RoleService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 角色缓存 + * key:角色编号 {@link RoleDO#getId()} + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + @Getter + private volatile Map roleCache; + /** + * 缓存角色的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + @Getter + private volatile Date maxUpdateTime; + + @Resource + private PermissionService permissionService; + + @Resource + private RoleMapper roleMapper; + + @Resource + private RoleProducer roleProducer; + + @Resource + @Lazy // 注入自己,所以延迟加载 + private RoleService self; + + /** + * 初始化 {@link #roleCache} 缓存 + */ + @Override + @PostConstruct + @TenantIgnore // 忽略自动多租户,全局初始化缓存 + public void initLocalCache() { + // 获取角色列表,如果有更新 + List roleList = loadRoleIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(roleList)) { + return; + } + + // 写入缓存 + roleCache = CollectionUtils.convertMap(roleList, RoleDO::getId); + maxUpdateTime = CollectionUtils.getMaxValue(roleList, RoleDO::getUpdateTime); + log.info("[initLocalCache][初始化 Role 数量为 {}]", roleList.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + self.initLocalCache(); + } + + /** + * 如果角色发生变化,从数据库中获取最新的全量角色。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前角色的最大更新时间 + * @return 角色列表 + */ + private List loadRoleIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadRoleIfUpdate][首次加载全量角色]"); + } else { // 判断数据库中是否有更新的角色 + if (roleMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { + return null; + } + log.info("[loadRoleIfUpdate][增量加载全量角色]"); + } + // 第二步,如果有更新,则从数据库加载所有角色 + return roleMapper.selectList(); + } + + @Override + @Transactional + public Long createRole(RoleCreateReqVO reqVO, Integer type) { + // 校验角色 + checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null); + // 插入到数据库 + RoleDO role = RoleConvert.INSTANCE.convert(reqVO); + role.setType(ObjectUtil.defaultIfNull(type, RoleTypeEnum.CUSTOM.getType())); + role.setStatus(CommonStatusEnum.ENABLE.getStatus()); + role.setDataScope(DataScopeEnum.ALL.getScope()); // 默认可查看所有数据。原因是,可能一些项目不需要项目权限 + roleMapper.insert(role); + // 发送刷新消息 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCommit() { + roleProducer.sendRoleRefreshMessage(); + } + }); + // 返回 + return role.getId(); + } + + @Override + public void updateRole(RoleUpdateReqVO reqVO) { + // 校验是否可以更新 + checkUpdateRole(reqVO.getId()); + // 校验角色的唯一字段是否重复 + checkDuplicateRole(reqVO.getName(), reqVO.getCode(), reqVO.getId()); + + // 更新到数据库 + RoleDO updateObject = RoleConvert.INSTANCE.convert(reqVO); + roleMapper.updateById(updateObject); + // 发送刷新消息 + roleProducer.sendRoleRefreshMessage(); + } + + @Override + public void updateRoleStatus(Long id, Integer status) { + // 校验是否可以更新 + checkUpdateRole(id); + // 更新状态 + RoleDO updateObject = new RoleDO(); + updateObject.setId(id); + updateObject.setStatus(status); + roleMapper.updateById(updateObject); + // 发送刷新消息 + roleProducer.sendRoleRefreshMessage(); + } + + @Override + public void updateRoleDataScope(Long id, Integer dataScope, Set dataScopeDeptIds) { + // 校验是否可以更新 + checkUpdateRole(id); + // 更新数据范围 + RoleDO updateObject = new RoleDO(); + updateObject.setId(id); + updateObject.setDataScope(dataScope); + updateObject.setDataScopeDeptIds(dataScopeDeptIds); + roleMapper.updateById(updateObject); + // 发送刷新消息 + roleProducer.sendRoleRefreshMessage(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteRole(Long id) { + // 校验是否可以更新 + this.checkUpdateRole(id); + // 标记删除 + roleMapper.deleteById(id); + // 删除相关数据 + permissionService.processRoleDeleted(id); + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + + @Override + public void afterCommit() { + roleProducer.sendRoleRefreshMessage(); + } + + }); + } + + @Override + public RoleDO getRoleFromCache(Long id) { + return roleCache.get(id); + } + + @Override + public List getRoles(@Nullable Collection statuses) { + if (CollUtil.isEmpty(statuses)) { + return roleMapper.selectList(); + } + return roleMapper.selectListByStatus(statuses); + } + + @Override + public List getRolesFromCache(Collection ids) { + if (CollectionUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return roleCache.values().stream().filter(roleDO -> ids.contains(roleDO.getId())) + .collect(Collectors.toList()); + } + + @Override + public boolean hasAnySuperAdmin(Collection roleList) { + if (CollectionUtil.isEmpty(roleList)) { + return false; + } + return roleList.stream().anyMatch(role -> RoleCodeEnum.isSuperAdmin(role.getCode())); + } + + @Override + public RoleDO getRole(Long id) { + return roleMapper.selectById(id); + } + + @Override + public PageResult getRolePage(RolePageReqVO reqVO) { + return roleMapper.selectPage(reqVO); + } + + @Override + public List getRoleList(RoleExportReqVO reqVO) { + return roleMapper.selectList(reqVO); + } + + /** + * 校验角色的唯一字段是否重复 + * + * 1. 是否存在相同名字的角色 + * 2. 是否存在相同编码的角色 + * + * @param name 角色名字 + * @param code 角色额编码 + * @param id 角色编号 + */ + @VisibleForTesting + public void checkDuplicateRole(String name, String code, Long id) { + // 0. 超级管理员,不允许创建 + if (RoleCodeEnum.isSuperAdmin(code)) { + throw exception(ROLE_ADMIN_CODE_ERROR, code); + } + // 1. 该 name 名字被其它角色所使用 + RoleDO role = roleMapper.selectByName(name); + if (role != null && !role.getId().equals(id)) { + throw exception(ROLE_NAME_DUPLICATE, name); + } + // 2. 是否存在相同编码的角色 + if (!StringUtils.hasText(code)) { + return; + } + // 该 code 编码被其它角色所使用 + role = roleMapper.selectByCode(code); + if (role != null && !role.getId().equals(id)) { + throw exception(ROLE_CODE_DUPLICATE, code); + } + } + + /** + * 校验角色是否可以被更新 + * + * @param id 角色编号 + */ + @VisibleForTesting + public void checkUpdateRole(Long id) { + RoleDO roleDO = roleMapper.selectById(id); + if (roleDO == null) { + throw exception(ROLE_NOT_EXISTS); + } + // 内置角色,不允许删除 + if (RoleTypeEnum.SYSTEM.getType().equals(roleDO.getType())) { + throw exception(ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE); + } + } + + @Override + public void validRoles(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得角色信息 + List roles = roleMapper.selectBatchIds(ids); + Map roleMap = CollectionUtils.convertMap(roles, RoleDO::getId); + // 校验 + ids.forEach(id -> { + RoleDO role = roleMap.get(id); + if (role == null) { + throw exception(ROLE_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())) { + throw exception(ROLE_IS_DISABLE, role.getName()); + } + }); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/bo/RoleCreateReqBO.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/bo/RoleCreateReqBO.java new file mode 100644 index 0000000..c097653 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/permission/bo/RoleCreateReqBO.java @@ -0,0 +1,49 @@ +package com.jojubanking.boot.module.system.service.permission.bo; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 角色创建 Request BO + * + * @author TW + */ +@Data +public class RoleCreateReqBO { + + /** + * 租户编号 + */ + @NotNull(message = "租户编号不能为空") + private Long tenantId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + @Size(max = 30, message = "角色名称长度不能超过30个字符") + private String name; + + /** + * 角色标志 + */ + @NotBlank(message = "角色标志不能为空") + @Size(max = 100, message = "角色标志长度不能超过100个字符") + private String code; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + /** + * 角色类型 + */ + @NotNull(message = "角色类型不能为空") + private Integer type; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/refundapply/RefundApplyService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/refundapply/RefundApplyService.java new file mode 100644 index 0000000..f4d06af --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/refundapply/RefundApplyService.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.service.refundapply; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.refundapply.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.refundapply.RefundApplyDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 就诊卡退费申请 Service 接口 + * + * @author admin + */ +public interface RefundApplyService { + + /** + * 创建就诊卡退费申请 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createRefundApply(@Valid RefundApplyCreateReqVO createReqVO); + + /** + * 更新就诊卡退费申请 + * + * @param updateReqVO 更新信息 + */ + void updateRefundApply(@Valid RefundApplyUpdateReqVO updateReqVO); + + /** + * 删除就诊卡退费申请 + * + * @param id 编号 + */ + void deleteRefundApply(Long id); + + /** + * 获得就诊卡退费申请 + * + * @param id 编号 + * @return 就诊卡退费申请 + */ + RefundApplyDO getRefundApply(Long id); + + /** + * 获得就诊卡退费申请列表 + * + * @param ids 编号 + * @return 就诊卡退费申请列表 + */ + List getRefundApplyList(Collection ids); + + /** + * 获得就诊卡退费申请分页 + * + * @param pageReqVO 分页查询 + * @return 就诊卡退费申请分页 + */ + PageResult getRefundApplyPage(RefundApplyPageReqVO pageReqVO); + + /** + * 获得就诊卡退费申请列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 就诊卡退费申请列表 + */ + List getRefundApplyList(RefundApplyExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/refundapply/RefundApplyServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/refundapply/RefundApplyServiceImpl.java new file mode 100644 index 0000000..9a0a448 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/refundapply/RefundApplyServiceImpl.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.refundapply; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.refundapply.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.refundapply.RefundApplyDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.refundapply.RefundApplyConvert; +import com.jojubanking.boot.module.system.dal.mysql.refundapply.RefundApplyMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 就诊卡退费申请 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class RefundApplyServiceImpl implements RefundApplyService { + + @Resource + private RefundApplyMapper refundApplyMapper; + + @Override + public Long createRefundApply(RefundApplyCreateReqVO createReqVO) { + // 插入 + RefundApplyDO refundApply = RefundApplyConvert.INSTANCE.convert(createReqVO); + refundApplyMapper.insert(refundApply); + // 返回 + return refundApply.getId(); + } + + @Override + public void updateRefundApply(RefundApplyUpdateReqVO updateReqVO) { + // 校验存在 + this.validateRefundApplyExists(updateReqVO.getId()); + // 更新 + RefundApplyDO updateObj = RefundApplyConvert.INSTANCE.convert(updateReqVO); + refundApplyMapper.updateById(updateObj); + } + + @Override + public void deleteRefundApply(Long id) { + // 校验存在 + this.validateRefundApplyExists(id); + // 删除 + refundApplyMapper.deleteById(id); + } + + private void validateRefundApplyExists(Long id) { + if (refundApplyMapper.selectById(id) == null) { + throw exception(REFUND_APPLY_NOT_EXISTS); + } + } + + @Override + public RefundApplyDO getRefundApply(Long id) { + return refundApplyMapper.selectById(id); + } + + @Override + public List getRefundApplyList(Collection ids) { + return refundApplyMapper.selectBatchIds(ids); + } + + @Override + public PageResult getRefundApplyPage(RefundApplyPageReqVO pageReqVO) { + return refundApplyMapper.selectPage(pageReqVO); + } + + @Override + public List getRefundApplyList(RefundApplyExportReqVO exportReqVO) { + return refundApplyMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/reserve8/Reserve8Service.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/reserve8/Reserve8Service.java new file mode 100644 index 0000000..2e4f149 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/reserve8/Reserve8Service.java @@ -0,0 +1,71 @@ +package com.jojubanking.boot.module.system.service.reserve8; + +import java.text.ParseException; +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.reserve8.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.reserve8.Reserve8DO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 预约挂号 Service 接口 + * + * @author admin + */ +public interface Reserve8Service { + + /** + * 创建预约挂号 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createReserve8(@Valid Reserve8CreateReqVO createReqVO); + + /** + * 更新预约挂号 + * + * @param updateReqVO 更新信息 + */ + void updateReserve8(@Valid Reserve8UpdateReqVO updateReqVO); + + /** + * 删除预约挂号 + * + * @param id 编号 + */ + void deleteReserve8(Integer id); + + /** + * 获得预约挂号 + * + * @param id 编号 + * @return 预约挂号 + */ + Reserve8DO getReserve8(Integer id); + + /** + * 获得预约挂号列表 + * + * @param ids 编号 + * @return 预约挂号列表 + */ + List getReserve8List(Collection ids); + + /** + * 获得预约挂号分页 + * + * @param pageReqVO 分页查询 + * @return 预约挂号分页 + */ + PageResult getReserve8Page(Reserve8PageReqVO pageReqVO) throws ParseException; + + /** + * 获得预约挂号列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 预约挂号列表 + */ + List getReserve8List(Reserve8ExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/reserve8/Reserve8ServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/reserve8/Reserve8ServiceImpl.java new file mode 100644 index 0000000..8d91f88 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/reserve8/Reserve8ServiceImpl.java @@ -0,0 +1,83 @@ +package com.jojubanking.boot.module.system.service.reserve8; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.text.ParseException; +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.reserve8.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.reserve8.Reserve8DO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.reserve8.Reserve8Convert; +import com.jojubanking.boot.module.system.dal.mysql.reserve8.Reserve8Mapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 预约挂号 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class Reserve8ServiceImpl implements Reserve8Service { + + @Resource + private Reserve8Mapper reserve8Mapper; + + @Override + public Integer createReserve8(Reserve8CreateReqVO createReqVO) { + // 插入 + Reserve8DO reserve8 = Reserve8Convert.INSTANCE.convert(createReqVO); + reserve8Mapper.insert(reserve8); + // 返回 + return reserve8.getId(); + } + + @Override + public void updateReserve8(Reserve8UpdateReqVO updateReqVO) { + // 校验存在 + this.validateReserve8Exists(updateReqVO.getId()); + // 更新 + Reserve8DO updateObj = Reserve8Convert.INSTANCE.convert(updateReqVO); + reserve8Mapper.updateById(updateObj); + } + + @Override + public void deleteReserve8(Integer id) { + // 校验存在 + this.validateReserve8Exists(id); + // 删除 + reserve8Mapper.deleteById(id); + } + + private void validateReserve8Exists(Integer id) { + if (reserve8Mapper.selectById(id) == null) { + throw exception(RESERVE8_NOT_EXISTS); + } + } + + @Override + public Reserve8DO getReserve8(Integer id) { + return reserve8Mapper.selectById(id); + } + + @Override + public List getReserve8List(Collection ids) { + return reserve8Mapper.selectBatchIds(ids); + } + + @Override + public PageResult getReserve8Page(Reserve8PageReqVO pageReqVO) throws ParseException { + return reserve8Mapper.selectPage(pageReqVO); + } + + @Override + public List getReserve8List(Reserve8ExportReqVO exportReqVO) { + return reserve8Mapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordService.java new file mode 100644 index 0000000..400370a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordService.java @@ -0,0 +1,104 @@ +package com.jojubanking.boot.module.system.service.sensitiveword; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; + +import javax.validation.Valid; +import java.util.List; +import java.util.Set; + +/** + * 敏感词 Service 接口 + * + * @author 永不言败 + */ +public interface SensitiveWordService { + + /** + * 初始化本地缓存 + */ + void initLocalCache(); + + /** + * 创建敏感词 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSensitiveWord(@Valid SensitiveWordCreateReqVO createReqVO); + + /** + * 更新敏感词 + * + * @param updateReqVO 更新信息 + */ + void updateSensitiveWord(@Valid SensitiveWordUpdateReqVO updateReqVO); + + /** + * 删除敏感词 + * + * @param id 编号 + */ + void deleteSensitiveWord(Long id); + + /** + * 获得敏感词 + * + * @param id 编号 + * @return 敏感词 + */ + SensitiveWordDO getSensitiveWord(Long id); + + /** + * 获得敏感词列表 + * + * @return 敏感词列表 + */ + List getSensitiveWordList(); + + /** + * 获得敏感词分页 + * + * @param pageReqVO 分页查询 + * @return 敏感词分页 + */ + PageResult getSensitiveWordPage(SensitiveWordPageReqVO pageReqVO); + + /** + * 获得敏感词列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 敏感词列表 + */ + List getSensitiveWordList(SensitiveWordExportReqVO exportReqVO); + + /** + * 获得所有敏感词的标签数组 + * + * @return 标签数组 + */ + Set getSensitiveWordTags(); + + /** + * 获得文本所包含的不合法的敏感词数组 + * + * @param text 文本 + * @param tags 标签数组 + * @return 不合法的敏感词数组 + */ + List validateText(String text, List tags); + + /** + * 判断文本是否包含敏感词 + * + * @param text 文本 + * @param tags 表述数组 + * @return 是否包含 + */ + boolean isTextValid(String text, List tags); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordServiceImpl.java new file mode 100644 index 0000000..0d22d65 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordServiceImpl.java @@ -0,0 +1,265 @@ +package com.jojubanking.boot.module.system.service.sensitiveword; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordUpdateReqVO; +import com.jojubanking.boot.module.system.convert.sensitiveword.SensitiveWordConvert; +import com.jojubanking.boot.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; +import com.jojubanking.boot.module.system.dal.mysql.sensitiveword.SensitiveWordMapper; +import com.jojubanking.boot.module.system.mq.producer.sensitiveword.SensitiveWordProducer; +import com.jojubanking.boot.module.system.util.collection.SimpleTrie; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.SENSITIVE_WORD_EXISTS; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.SENSITIVE_WORD_NOT_EXISTS; + +/** + * 敏感词 Service 实现类 + * + * @author 永不言败 + */ +@Service +@Slf4j +@Validated +public class SensitiveWordServiceImpl implements SensitiveWordService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 敏感词标签缓存 + * key:敏感词编号 {@link SensitiveWordDO#getId()} + *

+ * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + @Getter + private volatile Set sensitiveWordTagsCache = Collections.emptySet(); + + /** + * 缓存敏感词的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + @Getter + private volatile Date maxUpdateTime; + + @Resource + private SensitiveWordMapper sensitiveWordMapper; + + @Resource + private SensitiveWordProducer sensitiveWordProducer; + + /** + * 默认的敏感词的字典树,包含所有敏感词 + */ + @Getter + private volatile SimpleTrie defaultSensitiveWordTrie = new SimpleTrie(Collections.emptySet()); + /** + * 标签与敏感词的字段数的映射 + */ + @Getter + private volatile Map tagSensitiveWordTries = Collections.emptyMap(); + + /** + * 初始化缓存 + */ + @Override + @PostConstruct + public void initLocalCache() { + // 获取敏感词列表,如果有更新 + List sensitiveWordList = loadSensitiveWordIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(sensitiveWordList)) { + return; + } + + // 写入 sensitiveWordTagsCache 缓存 + Set tags = new HashSet<>(); + sensitiveWordList.forEach(word -> tags.addAll(word.getTags())); + sensitiveWordTagsCache = tags; + // 写入 defaultSensitiveWordTrie、tagSensitiveWordTries 缓存 + initSensitiveWordTrie(sensitiveWordList); + // 写入 maxUpdateTime 最大更新时间 + maxUpdateTime = CollectionUtils.getMaxValue(sensitiveWordList, SensitiveWordDO::getUpdateTime); + log.info("[initLocalCache][初始化 敏感词 数量为 {}]", sensitiveWordList.size()); + } + + private void initSensitiveWordTrie(List wordDOs) { + // 过滤禁用的敏感词 + wordDOs = CollectionUtils.filterList(wordDOs, word -> word.getStatus().equals(CommonStatusEnum.ENABLE.getStatus())); + + // 初始化默认的 defaultSensitiveWordTrie + this.defaultSensitiveWordTrie = new SimpleTrie(CollectionUtils.convertList(wordDOs, SensitiveWordDO::getName)); + + // 初始化 tagSensitiveWordTries + Multimap tagWords = HashMultimap.create(); + for (SensitiveWordDO word : wordDOs) { + if (CollUtil.isEmpty(word.getTags())) { + continue; + } + word.getTags().forEach(tag -> tagWords.put(tag, word.getName())); + } + // 添加到 tagSensitiveWordTries 中 + Map tagSensitiveWordTries = new HashMap<>(); + tagWords.asMap().forEach((tag, words) -> tagSensitiveWordTries.put(tag, new SimpleTrie(words))); + this.tagSensitiveWordTries = tagSensitiveWordTries; + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initLocalCache(); + } + + /** + * 如果敏感词发生变化,从数据库中获取最新的全量敏感词。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前敏感词的最大更新时间 + * @return 敏感词列表 + */ + private List loadSensitiveWordIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + // 如果更新时间为空,说明 DB 一定有新数据 + if (maxUpdateTime == null) { + log.info("[loadSensitiveWordIfUpdate][首次加载全量敏感词]"); + } else { // 判断数据库中是否有更新的敏感词 + if (sensitiveWordMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { + return null; + } + log.info("[loadSensitiveWordIfUpdate][增量加载全量敏感词]"); + } + // 第二步,如果有更新,则从数据库加载所有敏感词 + return sensitiveWordMapper.selectList(); + } + + @Override + public Long createSensitiveWord(SensitiveWordCreateReqVO createReqVO) { + // 校验唯一性 + checkSensitiveWordNameUnique(null, createReqVO.getName()); + // 插入 + SensitiveWordDO sensitiveWord = SensitiveWordConvert.INSTANCE.convert(createReqVO); + sensitiveWordMapper.insert(sensitiveWord); + // 发送消息,刷新缓存 + sensitiveWordProducer.sendSensitiveWordRefreshMessage(); + return sensitiveWord.getId(); + } + + @Override + public void updateSensitiveWord(SensitiveWordUpdateReqVO updateReqVO) { + // 校验唯一性 + checkSensitiveWordExists(updateReqVO.getId()); + checkSensitiveWordNameUnique(updateReqVO.getId(), updateReqVO.getName()); + // 更新 + SensitiveWordDO updateObj = SensitiveWordConvert.INSTANCE.convert(updateReqVO); + sensitiveWordMapper.updateById(updateObj); + // 发送消息,刷新缓存 + sensitiveWordProducer.sendSensitiveWordRefreshMessage(); + } + + @Override + public void deleteSensitiveWord(Long id) { + // 校验存在 + checkSensitiveWordExists(id); + // 删除 + sensitiveWordMapper.deleteById(id); + // 发送消息,刷新缓存 + sensitiveWordProducer.sendSensitiveWordRefreshMessage(); + } + + private void checkSensitiveWordNameUnique(Long id, String name) { + SensitiveWordDO word = sensitiveWordMapper.selectByName(name); + if (word == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的敏感词 + if (id == null) { + throw exception(SENSITIVE_WORD_EXISTS); + } + if (!word.getId().equals(id)) { + throw exception(SENSITIVE_WORD_EXISTS); + } + } + + private void checkSensitiveWordExists(Long id) { + if (sensitiveWordMapper.selectById(id) == null) { + throw exception(SENSITIVE_WORD_NOT_EXISTS); + } + } + + @Override + public SensitiveWordDO getSensitiveWord(Long id) { + return sensitiveWordMapper.selectById(id); + } + + @Override + public List getSensitiveWordList() { + return sensitiveWordMapper.selectList(); + } + + @Override + public PageResult getSensitiveWordPage(SensitiveWordPageReqVO pageReqVO) { + return sensitiveWordMapper.selectPage(pageReqVO); + } + + @Override + public List getSensitiveWordList(SensitiveWordExportReqVO exportReqVO) { + return sensitiveWordMapper.selectList(exportReqVO); + } + + @Override + public Set getSensitiveWordTags() { + return sensitiveWordTagsCache; + } + + @Override + public List validateText(String text, List tags) { + if (CollUtil.isEmpty(tags)) { + return defaultSensitiveWordTrie.validate(text); + } + // 有标签的情况 + Set result = new HashSet<>(); + tags.forEach(tag -> { + SimpleTrie trie = tagSensitiveWordTries.get(tag); + if (trie == null) { + return; + } + result.addAll(trie.validate(text)); + }); + return new ArrayList<>(result); + } + + @Override + public boolean isTextValid(String text, List tags) { + if (CollUtil.isEmpty(tags)) { + return defaultSensitiveWordTrie.isValid(text); + } + // 有标签的情况 + for (String tag : tags) { + SimpleTrie trie = tagSensitiveWordTries.get(tag); + if (trie == null) { + continue; + } + if (!trie.isValid(text)) { + return false; + } + } + return true; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsChannelService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsChannelService.java new file mode 100644 index 0000000..569d22c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsChannelService.java @@ -0,0 +1,79 @@ +package com.jojubanking.boot.module.system.service.sms; + +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsChannelDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 短信渠道 Service 接口 + * + * @author zzf + * @date 2021/1/25 9:24 + */ +public interface SmsChannelService { + + /** + * 初始化短信客户端 + */ + void initSmsClients(); + + /** + * 创建短信渠道 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSmsChannel(@Valid SmsChannelCreateReqVO createReqVO); + + /** + * 更新短信渠道 + * + * @param updateReqVO 更新信息 + */ + void updateSmsChannel(@Valid SmsChannelUpdateReqVO updateReqVO); + + /** + * 删除短信渠道 + * + * @param id 编号 + */ + void deleteSmsChannel(Long id); + + /** + * 获得短信渠道 + * + * @param id 编号 + * @return 短信渠道 + */ + SmsChannelDO getSmsChannel(Long id); + + /** + * 获得短信渠道列表 + * + * @param ids 编号 + * @return 短信渠道列表 + */ + List getSmsChannelList(Collection ids); + + /** + * 获得所有短信渠道列表 + * + * @return 短信渠道列表 + */ + List getSmsChannelList(); + + /** + * 获得短信渠道分页 + * + * @param pageReqVO 分页查询 + * @return 短信渠道分页 + */ + PageResult getSmsChannelPage(SmsChannelPageReqVO pageReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsChannelServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsChannelServiceImpl.java new file mode 100644 index 0000000..babaca3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsChannelServiceImpl.java @@ -0,0 +1,168 @@ +package com.jojubanking.boot.module.system.service.sms; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.sms.core.client.SmsClientFactory; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; +import com.jojubanking.boot.module.system.convert.sms.SmsChannelConvert; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsChannelDO; +import com.jojubanking.boot.module.system.dal.mysql.sms.SmsChannelMapper; +import com.jojubanking.boot.module.system.mq.producer.sms.SmsProducer; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; + +/** + * 短信渠道Service实现类 + * + * @author zzf + * @date 2021/1/25 9:25 + */ +@Service +@Slf4j +public class SmsChannelServiceImpl implements SmsChannelService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Resource + private SmsClientFactory smsClientFactory; + + @Resource + private SmsChannelMapper smsChannelMapper; + + @Resource + private SmsTemplateService smsTemplateService; + + @Resource + private SmsProducer smsProducer; + + @Override + @PostConstruct + public void initSmsClients() { + // 获取短信渠道,如果有更新 + List smsChannels = this.loadSmsChannelIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(smsChannels)) { + return; + } + + // 创建或更新短信 Client + List propertiesList = SmsChannelConvert.INSTANCE.convertList02(smsChannels); + propertiesList.forEach(properties -> smsClientFactory.createOrUpdateSmsClient(properties)); + + // 写入缓存 + maxUpdateTime = CollectionUtils.getMaxValue(smsChannels, SmsChannelDO::getUpdateTime); + log.info("[initSmsClients][初始化 SmsChannel 数量为 {}]", smsChannels.size()); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initSmsClients(); + } + + /** + * 如果短信渠道发生变化,从数据库中获取最新的全量短信渠道。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前短信渠道的最大更新时间 + * @return 短信渠道列表 + */ + private List loadSmsChannelIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadSmsChannelIfUpdate][首次加载全量短信渠道]"); + } else { // 判断数据库中是否有更新的短信渠道 + if (smsChannelMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { + return null; + } + log.info("[loadSmsChannelIfUpdate][增量加载全量短信渠道]"); + } + // 第二步,如果有更新,则从数据库加载所有短信渠道 + return smsChannelMapper.selectList(); + } + + @Override + public Long createSmsChannel(SmsChannelCreateReqVO createReqVO) { + // 插入 + SmsChannelDO smsChannel = SmsChannelConvert.INSTANCE.convert(createReqVO); + smsChannelMapper.insert(smsChannel); + // 发送刷新消息 + smsProducer.sendSmsChannelRefreshMessage(); + // 返回 + return smsChannel.getId(); + } + + @Override + public void updateSmsChannel(SmsChannelUpdateReqVO updateReqVO) { + // 校验存在 + this.validateSmsChannelExists(updateReqVO.getId()); + // 更新 + SmsChannelDO updateObj = SmsChannelConvert.INSTANCE.convert(updateReqVO); + smsChannelMapper.updateById(updateObj); + // 发送刷新消息 + smsProducer.sendSmsChannelRefreshMessage(); + } + + @Override + public void deleteSmsChannel(Long id) { + // 校验存在 + this.validateSmsChannelExists(id); + // 校验是否有字典数据 + if (smsTemplateService.countByChannelId(id) > 0) { + throw exception(SMS_CHANNEL_HAS_CHILDREN); + } + // 删除 + smsChannelMapper.deleteById(id); + // 发送刷新消息 + smsProducer.sendSmsChannelRefreshMessage(); + } + + private void validateSmsChannelExists(Long id) { + if (smsChannelMapper.selectById(id) == null) { + throw exception(SMS_CHANNEL_NOT_EXISTS); + } + } + + @Override + public SmsChannelDO getSmsChannel(Long id) { + return smsChannelMapper.selectById(id); + } + + @Override + public List getSmsChannelList(Collection ids) { + return smsChannelMapper.selectBatchIds(ids); + } + + @Override + public List getSmsChannelList() { + return smsChannelMapper.selectList(); + } + + @Override + public PageResult getSmsChannelPage(SmsChannelPageReqVO pageReqVO) { + return smsChannelMapper.selectPage(pageReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsCodeService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsCodeService.java new file mode 100644 index 0000000..3e6803d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsCodeService.java @@ -0,0 +1,40 @@ +package com.jojubanking.boot.module.system.service.sms; + +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeCheckReqDTO; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeUseReqDTO; + +import javax.validation.Valid; + +/** + * 短信验证码 Service 接口 + * + * @author TW + */ +public interface SmsCodeService { + + /** + * 创建短信验证码,并进行发送 + * + * @param reqDTO 发送请求 + */ + void sendSmsCode(@Valid SmsCodeSendReqDTO reqDTO); + + /** + * 验证短信验证码,并进行使用 + * 如果正确,则将验证码标记成已使用 + * 如果错误,则抛出 {@link ServiceException} 异常 + * + * @param reqDTO 使用请求 + */ + void useSmsCode(@Valid SmsCodeUseReqDTO reqDTO); + + /** + * 检查验证码是否有效 + * + * @param reqDTO 校验请求 + */ + void checkSmsCode(@Valid SmsCodeCheckReqDTO reqDTO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsCodeServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsCodeServiceImpl.java new file mode 100644 index 0000000..15c233c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsCodeServiceImpl.java @@ -0,0 +1,110 @@ +package com.jojubanking.boot.module.system.service.sms; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; +import com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeCheckReqDTO; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeUseReqDTO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsCodeDO; +import com.jojubanking.boot.module.system.dal.mysql.sms.SmsCodeMapper; +import com.jojubanking.boot.module.system.enums.sms.SmsSceneEnum; +import com.jojubanking.boot.module.system.framework.sms.SmsCodeProperties; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Date; + +import static cn.hutool.core.util.RandomUtil.randomInt; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 短信验证码 Service 实现类 + * + * @author TW + */ +@Service +@Validated +public class SmsCodeServiceImpl implements SmsCodeService { + + @Resource + private SmsCodeProperties smsCodeProperties; + + @Resource + private SmsCodeMapper smsCodeMapper; + + @Resource + private SmsSendService smsSendService; + + @Override + public void sendSmsCode(SmsCodeSendReqDTO reqDTO) { + SmsSceneEnum sceneEnum = SmsSceneEnum.getCodeByScene(reqDTO.getScene()); + Assert.notNull(sceneEnum, "验证码场景({}) 查找不到配置", reqDTO.getScene()); + // 创建验证码 + String code = createSmsCode(reqDTO.getMobile(), reqDTO.getScene(), reqDTO.getCreateIp()); + // 发送验证码 + smsSendService.sendSingleSms(reqDTO.getMobile(), null, null, + sceneEnum.getTemplateCode(), MapUtil.of("code", code)); + } + + private String createSmsCode(String mobile, Integer scene, String ip) { + // 校验是否可以发送验证码,不用筛选场景 + SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, null,null); + if (lastSmsCode != null) { + if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime() + < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁 + throw ServiceExceptionUtil.exception(SMS_CODE_SEND_TOO_FAST); + } + if (DateUtils.isToday(lastSmsCode.getCreateTime()) && // 必须是今天,才能计算超过当天的上限 + lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。 + throw ServiceExceptionUtil.exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY); + } + // TODO TW:提升,每个 IP 每天可发送数量 + // TODO TW:提升,每个 IP 每小时可发送数量 + } + + // 创建验证码记录 + String code = String.valueOf(randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1)); + SmsCodeDO newSmsCode = SmsCodeDO.builder().mobile(mobile).code(code).scene(scene) + .todayIndex(lastSmsCode != null && DateUtils.isToday(lastSmsCode.getCreateTime()) ? lastSmsCode.getTodayIndex() + 1 : 1) + .createIp(ip).used(false).build(); + smsCodeMapper.insert(newSmsCode); + return code; + } + + @Override + public void useSmsCode(SmsCodeUseReqDTO reqDTO) { + // 检测验证码是否有效 + SmsCodeDO lastSmsCode = this.checkSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene()); + // 使用验证码 + smsCodeMapper.updateById(SmsCodeDO.builder().id(lastSmsCode.getId()) + .used(true).usedTime(new Date()).usedIp(reqDTO.getUsedIp()).build()); + } + + @Override + public void checkSmsCode(SmsCodeCheckReqDTO reqDTO) { + checkSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene()); + } + + public SmsCodeDO checkSmsCode0(String mobile, String code, Integer scene) { + // 校验验证码 + SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile,code,scene); + // 若验证码不存在,抛出异常 + if (lastSmsCode == null) { + throw ServiceExceptionUtil.exception(SMS_CODE_NOT_FOUND); + } + // 超过时间 + if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime() + >= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期 + throw ServiceExceptionUtil.exception(SMS_CODE_EXPIRED); + } + // 判断验证码是否已被使用 + if (Boolean.TRUE.equals(lastSmsCode.getUsed())) { + throw ServiceExceptionUtil.exception(SMS_CODE_USED); + } + return lastSmsCode; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsLogService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsLogService.java new file mode 100644 index 0000000..2391383 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsLogService.java @@ -0,0 +1,77 @@ +package com.jojubanking.boot.module.system.service.sms; + +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsLogDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsTemplateDO; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 短信日志 Service 接口 + * + * @author zzf + * @date 13:48 2021/3/2 + */ +public interface SmsLogService { + + /** + * 创建短信日志 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param userType 用户类型 + * @param isSend 是否发送 + * @param template 短信模板 + * @param templateContent 短信内容 + * @param templateParams 短信参数 + * @return 发送日志编号 + */ + Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, + SmsTemplateDO template, String templateContent, Map templateParams); + + /** + * 更新日志的发送结果 + * + * @param id 日志编号 + * @param sendCode 发送结果的编码 + * @param sendMsg 发送结果的提示 + * @param apiSendCode 短信 API 发送结果的编码 + * @param apiSendMsg 短信 API 发送失败的提示 + * @param apiRequestId 短信 API 发送返回的唯一请求 ID + * @param apiSerialNo 短信 API 发送返回的序号 + */ + void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, + String apiSendCode, String apiSendMsg, String apiRequestId, String apiSerialNo); + + /** + * 更新日志的接收结果 + * + * @param id 日志编号 + * @param success 是否接收成功 + * @param receiveTime 用户接收时间 + * @param apiReceiveCode API 接收结果的编码 + * @param apiReceiveMsg API 接收结果的说明 + */ + void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg); + + /** + * 获得短信日志分页 + * + * @param pageReqVO 分页查询 + * @return 短信日志分页 + */ + PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO); + + /** + * 获得短信日志列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 短信日志列表 + */ + List getSmsLogList(SmsLogExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsLogServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsLogServiceImpl.java new file mode 100644 index 0000000..5ff4888 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsLogServiceImpl.java @@ -0,0 +1,88 @@ +package com.jojubanking.boot.module.system.service.sms; + +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsLogDO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.jojubanking.boot.module.system.dal.mysql.sms.SmsLogMapper; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.enums.sms.SmsReceiveStatusEnum; +import com.jojubanking.boot.module.system.enums.sms.SmsSendStatusEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 短信日志 Service 实现类 + * + * @author zzf + */ +@Slf4j +@Service +public class SmsLogServiceImpl implements SmsLogService { + + @Resource + private SmsLogMapper smsLogMapper; + + @Override + public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, + SmsTemplateDO template, String templateContent, Map templateParams) { + SmsLogDO.SmsLogDOBuilder logBuilder = SmsLogDO.builder(); + // 根据是否要发送,设置状态 + logBuilder.sendStatus(Objects.equals(isSend, true) ? SmsSendStatusEnum.INIT.getStatus() + : SmsSendStatusEnum.IGNORE.getStatus()); + // 设置手机相关字段 + logBuilder.mobile(mobile).userId(userId).userType(userType); + // 设置模板相关字段 + logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType()); + logBuilder.templateContent(templateContent).templateParams(templateParams) + .apiTemplateId(template.getApiTemplateId()); + // 设置渠道相关字段 + logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode()); + // 设置接收相关字段 + logBuilder.receiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); + + // 插入数据库 + SmsLogDO logDO = logBuilder.build(); + smsLogMapper.insert(logDO); + return logDO.getId(); + } + + @Override + public void updateSmsSendResult(Long id, Integer sendCode, String sendMsg, + String apiSendCode, String apiSendMsg, + String apiRequestId, String apiSerialNo) { + SmsSendStatusEnum sendStatus = CommonResult.isSuccess(sendCode) ? + SmsSendStatusEnum.SUCCESS : SmsSendStatusEnum.FAILURE; + smsLogMapper.updateById(SmsLogDO.builder().id(id).sendStatus(sendStatus.getStatus()) + .sendTime(new Date()).sendCode(sendCode).sendMsg(sendMsg) + .apiSendCode(apiSendCode).apiSendMsg(apiSendMsg) + .apiRequestId(apiRequestId).apiSerialNo(apiSerialNo).build()); + } + + @Override + public void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, + String apiReceiveCode, String apiReceiveMsg) { + SmsReceiveStatusEnum receiveStatus = Objects.equals(success, true) ? + SmsReceiveStatusEnum.SUCCESS : SmsReceiveStatusEnum.FAILURE; + smsLogMapper.updateById(SmsLogDO.builder().id(id).receiveStatus(receiveStatus.getStatus()) + .receiveTime(receiveTime).apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build()); + } + + @Override + public PageResult getSmsLogPage(SmsLogPageReqVO pageReqVO) { + return smsLogMapper.selectPage(pageReqVO); + } + + @Override + public List getSmsLogList(SmsLogExportReqVO exportReqVO) { + return smsLogMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsSendService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsSendService.java new file mode 100644 index 0000000..04a44c8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsSendService.java @@ -0,0 +1,78 @@ +package com.jojubanking.boot.module.system.service.sms; + +import com.jojubanking.boot.module.system.mq.message.sms.SmsSendMessage; + +import java.util.List; +import java.util.Map; + +/** + * 短信发送 Service 接口 + * + * @author TW + */ +public interface SmsSendService { + + /** + * 发送单条短信给管理后台的用户 + * + * 在 mobile 为空时,使用 userId 加载对应管理员的手机号 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ + Long sendSingleSmsToAdmin(String mobile, Long userId, + String templateCode, Map templateParams); + + /** + * 发送单条短信给用户 APP 的用户 + * + * 在 mobile 为空时,使用 userId 加载对应会员的手机号 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ + Long sendSingleSmsToMember(String mobile, Long userId, + String templateCode, Map templateParams); + + /** + * 发送单条短信给用户 + * + * @param mobile 手机号 + * @param userId 用户编号 + * @param userType 用户类型 + * @param templateCode 短信模板编号 + * @param templateParams 短信模板参数 + * @return 发送日志编号 + */ + Long sendSingleSms(String mobile, Long userId, Integer userType, + String templateCode, Map templateParams); + + default void sendBatchSms(List mobiles, List userIds, Integer userType, + String templateCode, Map templateParams) { + throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); + } + + /** + * 执行真正的短信发送 + * 注意,该方法仅仅提供给 MQ Consumer 使用 + * + * @param message 短信 + */ + void doSendSms(SmsSendMessage message); + + /** + * 接收短信的接收结果 + * + * @param channelCode 渠道编码 + * @param text 结果内容 + * @throws Throwable 处理失败时,抛出异常 + */ + void receiveSmsStatus(String channelCode, String text) throws Throwable; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsSendServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsSendServiceImpl.java new file mode 100644 index 0000000..5919c65 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsSendServiceImpl.java @@ -0,0 +1,186 @@ +package com.jojubanking.boot.module.system.service.sms; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.sms.core.client.SmsClient; +import com.jojubanking.boot.framework.sms.core.client.SmsClientFactory; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsChannelDO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.mq.message.sms.SmsSendMessage; +import com.jojubanking.boot.module.system.mq.producer.sms.SmsProducer; +import com.jojubanking.boot.module.system.service.member.MemberService; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import com.google.common.annotations.VisibleForTesting; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 短信发送 Service 发送的实现 + * + * @author TW + */ +@Service +public class SmsSendServiceImpl implements SmsSendService { + + @Resource + private AdminUserService adminUserService; + @Resource + private MemberService memberService; + @Resource + private SmsChannelService smsChannelService; + @Resource + private SmsTemplateService smsTemplateService; + @Resource + private SmsLogService smsLogService; + + @Resource + private SmsClientFactory smsClientFactory; + + @Resource + private SmsProducer smsProducer; + + @Override + public Long sendSingleSmsToAdmin(String mobile, Long userId, String templateCode, Map templateParams) { + // 如果 mobile 为空,则加载用户编号对应的手机号 + if (StrUtil.isEmpty(mobile)) { + AdminUserDO user = adminUserService.getUser(userId); + if (user != null) { + mobile = user.getMobile(); + } + } + // 执行发送 + return this.sendSingleSms(mobile, userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams); + } + + @Override + public Long sendSingleSmsToMember(String mobile, Long userId, String templateCode, Map templateParams) { + // 如果 mobile 为空,则加载用户编号对应的手机号 + if (StrUtil.isEmpty(mobile)) { + mobile = memberService.getMemberUserMobile(userId); + } + // 执行发送 + return this.sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams); + } + + @Override + public Long sendSingleSms(String mobile, Long userId, Integer userType, + String templateCode, Map templateParams) { + // 校验短信模板是否合法 + SmsTemplateDO template = this.checkSmsTemplateValid(templateCode); + // 校验短信渠道是否合法 + SmsChannelDO smsChannel = this.checkSmsChannelValid(template.getChannelId()); + + // 校验手机号码是否存在 + mobile = this.checkMobile(mobile); + // 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志 + List> newTemplateParams = this.buildTemplateParams(template, templateParams); + + // 创建发送日志。如果模板被禁用,则不发送短信,只记录日志 + Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()) + && CommonStatusEnum.ENABLE.getStatus().equals(smsChannel.getStatus()); + ; + String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams); + Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams); + + // 发送 MQ 消息,异步执行发送短信 + if (isSend) { + smsProducer.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(), + template.getApiTemplateId(), newTemplateParams); + } + return sendLogId; + } + + @VisibleForTesting + public SmsChannelDO checkSmsChannelValid(Long channelId) { + // 获得短信模板。考虑到效率,从缓存中获取 + SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); + // 短信模板不存在 + if (channelDO == null) { + throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS); + } + return channelDO; + } + + @VisibleForTesting + public SmsTemplateDO checkSmsTemplateValid(String templateCode) { + // 获得短信模板。考虑到效率,从缓存中获取 + SmsTemplateDO template = smsTemplateService.getSmsTemplateByCodeFromCache(templateCode); + // 短信模板不存在 + if (template == null) { + throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS); + } + return template; + } + + /** + * 将参数模板,处理成有序的 KeyValue 数组 + *

+ * 原因是,部分短信平台并不是使用 key 作为参数,而是数组下标,例如说腾讯云 https://cloud.tencent.com/document/product/382/39023 + * + * @param template 短信模板 + * @param templateParams 原始参数 + * @return 处理后的参数 + */ + @VisibleForTesting + public List> buildTemplateParams(SmsTemplateDO template, Map templateParams) { + return template.getParams().stream().map(key -> { + Object value = templateParams.get(key); + if (value == null) { + throw exception(SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, key); + } + return new KeyValue<>(key, value); + }).collect(Collectors.toList()); + } + + @VisibleForTesting + public String checkMobile(String mobile) { + if (StrUtil.isEmpty(mobile)) { + throw exception(SMS_SEND_MOBILE_NOT_EXISTS); + } + return mobile; + } + + @Override + public void doSendSms(SmsSendMessage message) { + // 获得渠道对应的 SmsClient 客户端 + SmsClient smsClient = smsClientFactory.getSmsClient(message.getChannelId()); + Assert.notNull(smsClient, "短信客户端({}) 不存在", message.getChannelId()); + // 发送短信 + SmsCommonResult sendResult = smsClient.sendSms(message.getLogId(), message.getMobile(), + message.getApiTemplateId(), message.getTemplateParams()); + smsLogService.updateSmsSendResult(message.getLogId(), sendResult.getCode(), sendResult.getMsg(), + sendResult.getApiCode(), sendResult.getApiMsg(), sendResult.getApiRequestId(), + sendResult.getData() != null ? sendResult.getData().getSerialNo() : null); + } + + @Override + public void receiveSmsStatus(String channelCode, String text) throws Throwable { + // 获得渠道对应的 SmsClient 客户端 + SmsClient smsClient = smsClientFactory.getSmsClient(channelCode); + Assert.notNull(smsClient, "短信客户端({}) 不存在", channelCode); + // 解析内容 + List receiveResults = smsClient.parseSmsReceiveStatus(text); + if (CollUtil.isEmpty(receiveResults)) { + return; + } + // 更新短信日志的接收结果. 因为量一般不大,所以先使用 for 循环更新 + receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(result.getLogId(), + result.getSuccess(), result.getReceiveTime(), result.getErrorCode(), result.getErrorCode())); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsTemplateService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsTemplateService.java new file mode 100644 index 0000000..df0273d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsTemplateService.java @@ -0,0 +1,115 @@ +package com.jojubanking.boot.module.system.service.sms; + +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 短信模板 Service 接口 + * + * @author zzf + * @date 2021/1/25 9:24 + */ +public interface SmsTemplateService { + + /** + * 初始化短信模板的本地缓存 + */ + void initLocalCache(); + + /** + * 获得短信模板,从缓存中 + * + * @param code 模板编码 + * @return 短信模板 + */ + SmsTemplateDO getSmsTemplateByCodeFromCache(String code); + + /** + * 格式化短信内容 + * + * @param content 短信模板的内容 + * @param params 内容的参数 + * @return 格式化后的内容 + */ + String formatSmsTemplateContent(String content, Map params); + + /** + * 获得短信模板 + * + * @param code 模板编码 + * @return 短信模板 + */ + SmsTemplateDO getSmsTemplateByCode(String code); + + /** + * 创建短信模板 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSmsTemplate(@Valid SmsTemplateCreateReqVO createReqVO); + + /** + * 更新短信模板 + * + * @param updateReqVO 更新信息 + */ + void updateSmsTemplate(@Valid SmsTemplateUpdateReqVO updateReqVO); + + /** + * 删除短信模板 + * + * @param id 编号 + */ + void deleteSmsTemplate(Long id); + + /** + * 获得短信模板 + * + * @param id 编号 + * @return 短信模板 + */ + SmsTemplateDO getSmsTemplate(Long id); + + /** + * 获得短信模板列表 + * + * @param ids 编号 + * @return 短信模板列表 + */ + List getSmsTemplateList(Collection ids); + + /** + * 获得短信模板分页 + * + * @param pageReqVO 分页查询 + * @return 短信模板分页 + */ + PageResult getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO); + + /** + * 获得短信模板列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 短信模板分页 + */ + List getSmsTemplateList(SmsTemplateExportReqVO exportReqVO); + + /** + * 获得指定短信渠道下的短信模板数量 + * + * @param channelId 短信渠道编号 + * @return 数量 + */ + Long countByChannelId(Long channelId); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsTemplateServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsTemplateServiceImpl.java new file mode 100644 index 0000000..e6ecaaa --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/sms/SmsTemplateServiceImpl.java @@ -0,0 +1,266 @@ +package com.jojubanking.boot.module.system.service.sms; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.sms.core.client.SmsClient; +import com.jojubanking.boot.framework.sms.core.client.SmsClientFactory; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; +import com.jojubanking.boot.module.system.convert.sms.SmsTemplateConvert; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsChannelDO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.jojubanking.boot.module.system.dal.mysql.sms.SmsTemplateMapper; +import com.jojubanking.boot.module.system.mq.producer.sms.SmsProducer; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.*; +import java.util.regex.Pattern; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 短信模板 Service 实现类 + * + * @author zzf + * @date 2021/1/25 9:25 + */ +@Service +@Slf4j +public class SmsTemplateServiceImpl implements SmsTemplateService { + + /** + * 定时执行 {@link #schedulePeriodicRefresh()} 的周期 + * 因为已经通过 Redis Pub/Sub 机制,所以频率不需要高 + */ + private static final long SCHEDULER_PERIOD = 5 * 60 * 1000L; + + /** + * 正则表达式,匹配 {} 中的变量 + */ + private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}"); + + @Resource + private SmsTemplateMapper smsTemplateMapper; + + @Resource + private SmsChannelService smsChannelService; + + @Resource + private SmsClientFactory smsClientFactory; + + @Resource + private SmsProducer smsProducer; + + /** + * 短信模板缓存 + * key:短信模板编码 {@link SmsTemplateDO#getCode()} + * + * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 + */ + private volatile Map smsTemplateCache; + /** + * 缓存短信模板的最大更新时间,用于后续的增量轮询,判断是否有更新 + */ + private volatile Date maxUpdateTime; + + @Override + @PostConstruct + public void initLocalCache() { + // 获取短信模板列表,如果有更新 + List smsTemplateList = this.loadSmsTemplateIfUpdate(maxUpdateTime); + if (CollUtil.isEmpty(smsTemplateList)) { + return; + } + + // 写入缓存 + smsTemplateCache = CollectionUtils.convertMap(smsTemplateList, SmsTemplateDO::getCode); + maxUpdateTime = CollectionUtils.getMaxValue(smsTemplateList, SmsTemplateDO::getUpdateTime); + log.info("[initLocalCache][初始化 SmsTemplate 数量为 {}]", smsTemplateList.size()); + } + + /** + * 如果短信模板发生变化,从数据库中获取最新的全量短信模板。 + * 如果未发生变化,则返回空 + * + * @param maxUpdateTime 当前短信模板的最大更新时间 + * @return 短信模板列表 + */ + private List loadSmsTemplateIfUpdate(Date maxUpdateTime) { + // 第一步,判断是否要更新。 + if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 + log.info("[loadSmsTemplateIfUpdate][首次加载全量短信模板]"); + } else { // 判断数据库中是否有更新的短信模板 + if (smsTemplateMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { + return null; + } + log.info("[loadSmsTemplateIfUpdate][增量加载全量短信模板]"); + } + // 第二步,如果有更新,则从数据库加载所有短信模板 + return smsTemplateMapper.selectList(); + } + + @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD) + public void schedulePeriodicRefresh() { + initLocalCache(); + } + + @Override + public SmsTemplateDO getSmsTemplateByCodeFromCache(String code) { + return smsTemplateCache.get(code); + } + + @Override + public String formatSmsTemplateContent(String content, Map params) { + return StrUtil.format(content, params); + } + + @Override + public SmsTemplateDO getSmsTemplateByCode(String code) { + return smsTemplateMapper.selectByCode(code); + } + + @VisibleForTesting + public List parseTemplateContentParams(String content) { + return ReUtil.findAllGroup1(PATTERN_PARAMS, content); + } + + @Override + public Long createSmsTemplate(SmsTemplateCreateReqVO createReqVO) { + // 校验短信渠道 + SmsChannelDO channelDO = checkSmsChannel(createReqVO.getChannelId()); + // 校验短信编码是否重复 + checkSmsTemplateCodeDuplicate(null, createReqVO.getCode()); + // 校验短信模板 + checkApiTemplate(createReqVO.getChannelId(), createReqVO.getApiTemplateId()); + + // 插入 + SmsTemplateDO template = SmsTemplateConvert.INSTANCE.convert(createReqVO); + template.setParams(parseTemplateContentParams(template.getContent())); + template.setChannelCode(channelDO.getCode()); + smsTemplateMapper.insert(template); + // 发送刷新消息 + smsProducer.sendSmsTemplateRefreshMessage(); + // 返回 + return template.getId(); + } + + @Override + public void updateSmsTemplate(SmsTemplateUpdateReqVO updateReqVO) { + // 校验存在 + this.validateSmsTemplateExists(updateReqVO.getId()); + // 校验短信渠道 + SmsChannelDO channelDO = checkSmsChannel(updateReqVO.getChannelId()); + // 校验短信编码是否重复 + checkSmsTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode()); + // 校验短信模板 + checkApiTemplate(updateReqVO.getChannelId(), updateReqVO.getApiTemplateId()); + + // 更新 + SmsTemplateDO updateObj = SmsTemplateConvert.INSTANCE.convert(updateReqVO); + updateObj.setParams(parseTemplateContentParams(updateObj.getContent())); + updateObj.setChannelCode(channelDO.getCode()); + smsTemplateMapper.updateById(updateObj); + // 发送刷新消息 + smsProducer.sendSmsTemplateRefreshMessage(); + } + + @Override + public void deleteSmsTemplate(Long id) { + // 校验存在 + this.validateSmsTemplateExists(id); + // 更新 + smsTemplateMapper.deleteById(id); + // 发送刷新消息 + smsProducer.sendSmsTemplateRefreshMessage(); + } + + private void validateSmsTemplateExists(Long id) { + if (smsTemplateMapper.selectById(id) == null) { + throw exception(SMS_TEMPLATE_NOT_EXISTS); + } + } + + @Override + public SmsTemplateDO getSmsTemplate(Long id) { + return smsTemplateMapper.selectById(id); + } + + @Override + public List getSmsTemplateList(Collection ids) { + return smsTemplateMapper.selectBatchIds(ids); + } + + @Override + public PageResult getSmsTemplatePage(SmsTemplatePageReqVO pageReqVO) { + return smsTemplateMapper.selectPage(pageReqVO); + } + + @Override + public List getSmsTemplateList(SmsTemplateExportReqVO exportReqVO) { + return smsTemplateMapper.selectList(exportReqVO); + } + + @Override + public Long countByChannelId(Long channelId) { + return smsTemplateMapper.selectCountByChannelId(channelId); + } + + @VisibleForTesting + public SmsChannelDO checkSmsChannel(Long channelId) { + SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId); + if (channelDO == null) { + throw exception(SMS_CHANNEL_NOT_EXISTS); + } + if (!Objects.equals(channelDO.getStatus(), CommonStatusEnum.ENABLE.getStatus())) { + throw exception(SMS_CHANNEL_DISABLE); + } + return channelDO; + } + + @VisibleForTesting + public void checkSmsTemplateCodeDuplicate(Long id, String code) { + SmsTemplateDO template = smsTemplateMapper.selectByCode(code); + if (template == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的字典类型 + if (id == null) { + throw exception(SMS_TEMPLATE_CODE_DUPLICATE, code); + } + if (!template.getId().equals(id)) { + throw exception(SMS_TEMPLATE_CODE_DUPLICATE, code); + } + } + + /** + * 校验 API 短信平台的模板是否有效 + * + * @param channelId 渠道编号 + * @param apiTemplateId API 模板编号 + */ + @VisibleForTesting + public void checkApiTemplate(Long channelId, String apiTemplateId) { + // 获得短信模板 + SmsClient smsClient = smsClientFactory.getSmsClient(channelId); + Assert.notNull(smsClient, String.format("短信客户端(%d) 不存在", channelId)); + SmsCommonResult templateResult = smsClient.getSmsTemplate(apiTemplateId); + // 校验短信模板是否正确 + templateResult.checkError(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/social/SocialUserService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/social/SocialUserService.java new file mode 100644 index 0000000..ccfc274 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/social/SocialUserService.java @@ -0,0 +1,78 @@ +package com.jojubanking.boot.module.system.service.social; + +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO; +import com.jojubanking.boot.module.system.dal.dataobject.social.SocialUserDO; +import com.jojubanking.boot.module.system.enums.social.SocialTypeEnum; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 社交用户 Service 接口,例如说社交平台的授权登录 + * + * @author TW + */ +public interface SocialUserService { + + /** + * 获得社交平台的授权 URL + * + * @param type 社交平台的类型 {@link SocialTypeEnum} + * @param redirectUri 重定向 URL + * @return 社交平台的授权 URL + */ + String getAuthorizeUrl(Integer type, String redirectUri); + + /** + * 授权获得对应的社交用户 + * 如果授权失败,则会抛出 {@link ServiceException} 异常 + * + * @param type 社交平台的类型 {@link SocialTypeEnum} + * @param code 授权码 + * @param state state + * @return 授权用户 + */ + @NotNull + SocialUserDO authSocialUser(Integer type, String code, String state); + + /** + * 获得指定用户的社交用户列表 + * + * @param userId 用户编号 + * @param userType 用户类型 + * @return 社交用户列表 + */ + List getSocialUserList(Long userId, Integer userType); + + /** + * 绑定社交用户 + * + * @param reqDTO 绑定信息 + */ + void bindSocialUser(@Valid SocialUserBindReqDTO reqDTO); + + /** + * 取消绑定社交用户 + * + * @param userId 用户编号 + * @param userType 全局用户类型 + * @param type 社交平台的类型 {@link SocialTypeEnum} + * @param openid 社交平台的 openid + */ + void unbindSocialUser(Long userId, Integer userType, Integer type, String openid); + + /** + * 获得社交用户的绑定用户编号 + * 注意,返回的是 MemberUser 或者 AdminUser 的 id 编号! + * 在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常 + * + * @param userType 用户类型 + * @param type 社交平台的类型 + * @param code 授权码 + * @param state state + * @return 绑定用户编号 + */ + Long getBindUserId(Integer userType, Integer type, String code, String state); +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/social/SocialUserServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/social/SocialUserServiceImpl.java new file mode 100644 index 0000000..686c36d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/social/SocialUserServiceImpl.java @@ -0,0 +1,167 @@ +package com.jojubanking.boot.module.system.service.social; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import com.jojubanking.boot.framework.common.util.http.HttpUtils; +import com.jojubanking.boot.framework.social.core.JojuAuthRequestFactory; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO; +import com.jojubanking.boot.module.system.dal.dataobject.social.SocialUserBindDO; +import com.jojubanking.boot.module.system.dal.dataobject.social.SocialUserDO; +import com.jojubanking.boot.module.system.dal.mysql.social.SocialUserBindMapper; +import com.jojubanking.boot.module.system.dal.mysql.social.SocialUserMapper; +import com.jojubanking.boot.module.system.enums.social.SocialTypeEnum; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthRequest; +import me.zhyd.oauth.utils.AuthStateUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.List; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertSet; +import static com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 社交用户 Service 实现类 + * + * @author TW + */ +@Service +@Validated +@Slf4j +public class SocialUserServiceImpl implements SocialUserService { + + @Resource// 由于自定义了 JojuAuthRequestFactory 无法覆盖默认的 AuthRequestFactory,所以只能注入它 + private JojuAuthRequestFactory jojuAuthRequestFactory; + + @Resource + private SocialUserBindMapper socialUserBindMapper; + @Resource + private SocialUserMapper socialUserMapper; + + @Override + public String getAuthorizeUrl(Integer type, String redirectUri) { + // 获得对应的 AuthRequest 实现 + AuthRequest authRequest = jojuAuthRequestFactory.get(SocialTypeEnum.valueOfType(type).getSource()); + // 生成跳转地址 + String authorizeUri = authRequest.authorize(AuthStateUtils.createState()); + return HttpUtils.replaceUrlQuery(authorizeUri, "redirect_uri", redirectUri); + } + + @Override + public SocialUserDO authSocialUser(Integer type, String code, String state) { + // 优先从 DB 中获取,因为 code 有且可以使用一次。 + // 在社交登录时,当未绑定 User 时,需要绑定登录,此时需要 code 使用两次 + SocialUserDO socialUser = socialUserMapper.selectByTypeAndCodeAnState(type, code, state); + if (socialUser != null) { + return socialUser; + } + + // 请求获取 + AuthUser authUser = getAuthUser(type, code, state); + Assert.notNull(authUser, "三方用户不能为空"); + + // 保存到 DB 中 + socialUser = socialUserMapper.selectByTypeAndOpenid(type, authUser.getUuid()); + if (socialUser == null) { + socialUser = new SocialUserDO(); + } + socialUser.setType(type).setCode(code).setState(state) // 需要保存 code + state 字段,保证后续可查询 + .setOpenid(authUser.getUuid()).setToken(authUser.getToken().getAccessToken()).setRawTokenInfo((toJsonString(authUser.getToken()))) + .setNickname(authUser.getNickname()).setAvatar(authUser.getAvatar()).setRawUserInfo(toJsonString(authUser.getRawUserInfo())); + if (socialUser.getId() == null) { + socialUserMapper.insert(socialUser); + } else { + socialUserMapper.updateById(socialUser); + } + return socialUser; + } + + @Override + public List getSocialUserList(Long userId, Integer userType) { + // 获得绑定 + List socialUserBinds = socialUserBindMapper.selectListByUserIdAndUserType(userId, userType); + if (CollUtil.isEmpty(socialUserBinds)) { + return Collections.emptyList(); + } + // 获得社交用户 + return socialUserMapper.selectBatchIds(convertSet(socialUserBinds, SocialUserBindDO::getSocialUserId)); + } + + @Override + @Transactional + public void bindSocialUser(SocialUserBindReqDTO reqDTO) { + // 获得社交用户 + SocialUserDO socialUser = authSocialUser(reqDTO.getType(), reqDTO.getCode(), reqDTO.getState()); + Assert.notNull(socialUser, "社交用户不能为空"); + + // 社交用户可能之前绑定过别的用户,需要进行解绑 + socialUserBindMapper.deleteByUserTypeAndSocialUserId(reqDTO.getUserType(), socialUser.getId()); + + // 用户可能之前已经绑定过该社交类型,需要进行解绑 + socialUserBindMapper.deleteByUserTypeAndUserIdAndSocialType(reqDTO.getUserType(), reqDTO.getUserId(), + socialUser.getType()); + + // 绑定当前登录的社交用户 + SocialUserBindDO socialUserBind = SocialUserBindDO.builder() + .userId(reqDTO.getUserId()).userType(reqDTO.getUserType()) + .socialUserId(socialUser.getId()).socialType(socialUser.getType()).build(); + socialUserBindMapper.insert(socialUserBind); + } + + @Override + public void unbindSocialUser(Long userId, Integer userType, Integer type, String openid) { + // 获得 openid 对应的 SocialUserDO 社交用户 + SocialUserDO socialUser = socialUserMapper.selectByTypeAndOpenid(type, openid); + if (socialUser == null) { + throw exception(SOCIAL_USER_NOT_FOUND); + } + + // 获得对应的社交绑定关系 + socialUserBindMapper.deleteByUserTypeAndUserIdAndSocialType(userType, userId, socialUser.getType()); + } + + @Override + public Long getBindUserId(Integer userType, Integer type, String code, String state) { + // 获得社交用户 + SocialUserDO socialUser = authSocialUser(type, code, state); + Assert.notNull(socialUser, "社交用户不能为空"); + + // 如果未绑定的社交用户,则无法自动登录,进行报错 + SocialUserBindDO socialUserBind = socialUserBindMapper.selectByUserTypeAndSocialUserId(userType, + socialUser.getId()); + if (socialUserBind == null) { + throw exception(AUTH_THIRD_LOGIN_NOT_BIND); + } + return socialUserBind.getUserId(); + } + + /** + * 请求社交平台,获得授权的用户 + * + * @param type 社交平台的类型 + * @param code 授权码 + * @param state 授权 state + * @return 授权的用户 + */ + private AuthUser getAuthUser(Integer type, String code, String state) { + AuthRequest authRequest = jojuAuthRequestFactory.get(SocialTypeEnum.valueOfType(type).getSource()); + AuthCallback authCallback = AuthCallback.builder().code(code).state(state).build(); + AuthResponse authResponse = authRequest.login(authCallback); + log.info("[getAuthUser][请求社交平台 type({}) request({}) response({})]", type, + toJsonString(authCallback), toJsonString(authResponse)); + if (!authResponse.ok()) { + throw exception(SOCIAL_USER_AUTH_FAILURE, authResponse.getMsg()); + } + return (AuthUser) authResponse.getData(); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/student/StudentService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/student/StudentService.java new file mode 100644 index 0000000..350b5a8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/student/StudentService.java @@ -0,0 +1,96 @@ +package com.jojubanking.boot.module.system.service.student; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.student.vo.*; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserImportExcelVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserImportRespVO; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainExportReqVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.studentJfListVO; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import com.jojubanking.boot.module.system.dal.dataobject.student.StudentDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.dal.dataobject.xymain.xyMainDO; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; + +/** + * 学生信息 Service 接口 + * + * @author admin + */ +public interface StudentService { + + /** + * 创建学生信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createStudent(@Valid StudentCreateReqVO createReqVO); + + /** + * 更新学生信息 + * + * @param updateReqVO 更新信息 + */ + void updateStudent(@Valid StudentUpdateReqVO updateReqVO); + public void updateOrderByNotify(StudentDO studentDO); + public void updateOrderByConfirm(StudentDO studentDO); + + void updateStudentXyrwName(StudentDO studentDO); + + /** + * 删除学生信息 + * + * @param id 编号 + */ + void deleteStudent(Long id); + + /** + * 获得学生信息 + * + * @param id 编号 + * @return 学生信息 + */ + StudentDO getStudent(Long id); + + /** + * 获得学生信息列表 + * + * @param ids 编号 + * @return 学生信息列表 + */ + List getStudentList(Collection ids); + List getStudentListSimple(String openid, String batchno); + + StudentDO getStudentListInit(String nationid, String batchno); + /** + * 获得学生信息分页 + * + * @param pageReqVO 分页查询 + * @return 学生信息分页 + */ + PageResult getStudentPage(StudentPageReqVO pageReqVO, XyrwDO xyrwDO); + + PageResult getStudentHisPage(StudentPageReqVO pageReqVO, XyrwDO xyrwDO); + /** + * 获得学生信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 学生信息列表 + */ + List getStudentList(StudentExportReqVO exportReqVO); + + + List getStudentListForXy(StudentExportReqVO exportReqVO); + + /** + * 批量导入用户 + * + * @param importStudent 导入用户列表 + * @param isUpdateSupport 是否支持更新 + * @return 导入结果 + */ + StudentImportRespVO importUsers(List importStudent, boolean isUpdateSupport, List listXyrw); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/student/StudentServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/student/StudentServiceImpl.java new file mode 100644 index 0000000..b4af790 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/student/StudentServiceImpl.java @@ -0,0 +1,178 @@ +package com.jojubanking.boot.module.system.service.student; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserImportExcelVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserImportRespVO; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainExportReqVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.studentJfListVO; +import com.jojubanking.boot.module.system.convert.user.UserConvert; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.dal.dataobject.xymain.xyMainDO; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; +import com.jojubanking.boot.module.system.util.xytj.VeDate; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; + +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.student.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.student.StudentDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.student.StudentConvert; +import com.jojubanking.boot.module.system.dal.mysql.student.StudentMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 学生信息 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class StudentServiceImpl implements StudentService { + + @Resource + private StudentMapper studentMapper; + + @Override + public Long createStudent(StudentCreateReqVO createReqVO) { + // 插入 + StudentDO student = StudentConvert.INSTANCE.convert(createReqVO); + studentMapper.insert(student); + // 返回 + return student.getId(); + } + + @Override + public void updateStudent(StudentUpdateReqVO updateReqVO) { + // 校验存在 + this.validateStudentExists(updateReqVO.getId()); + // 更新 + StudentDO updateObj = StudentConvert.INSTANCE.convert(updateReqVO); + studentMapper.updateById(updateObj); + } + + @Override + public void updateOrderByNotify(StudentDO studentDO){ + studentMapper.updateOrderByNotify(studentDO); + } + @Override + public void updateOrderByConfirm(StudentDO studentDO){ + studentMapper.updateOrderByConfirm(studentDO); + } + + + @Override + public void updateStudentXyrwName(StudentDO studentDO){ + studentMapper.updateXyrwName(studentDO); + } + + @Override + public void deleteStudent(Long id) { + // 校验存在 + this.validateStudentExists(id); + // 删除 + studentMapper.deleteById(id); + } + + private void validateStudentExists(Long id) { + if (studentMapper.selectById(id) == null) { + throw exception(STUDENT_NOT_EXISTS); + } + } + + @Override + public StudentDO getStudent(Long id) { + return studentMapper.selectById(id); + } + + @Override + public List getStudentList(Collection ids) { + return studentMapper.selectBatchIds(ids); + } + @Override + public List getStudentListSimple(String openid, String batchno) { + return studentMapper.selectbyopenid(openid, batchno); + } + @Override + public StudentDO getStudentListInit(String nationid, String batchno) { + return studentMapper.selectByNationidForTJ(nationid, batchno); + } + + @Override + public PageResult getStudentPage(StudentPageReqVO pageReqVO, XyrwDO xyrwDO) { + return studentMapper.selectPage(pageReqVO, xyrwDO); + } + @Override + public PageResult getStudentHisPage(StudentPageReqVO pageReqVO, XyrwDO xyrwDO) { + return studentMapper.selectHisPage(pageReqVO, xyrwDO); + } + + @Override + public List getStudentList(StudentExportReqVO exportReqVO) { + return studentMapper.selectList(exportReqVO); + } + + @Override + public List getStudentListForXy(StudentExportReqVO exportReqVO) { + return studentMapper.selectListXy(exportReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 + public StudentImportRespVO importUsers(List importStudents, boolean isUpdateSupport, List listXyrw) { + if (CollUtil.isEmpty(importStudents)) { + throw exception(USER_IMPORT_LIST_IS_EMPTY); + } + + StudentImportRespVO respVO = StudentImportRespVO.builder().createStudentnames(new ArrayList<>()) + .updateStudentnames(new ArrayList<>()).failureStudentnames(new LinkedHashMap<>()).build(); + + importStudents.forEach(importStudent -> { + // 校验,判断是否有不符合的原因 +// try { +// checkCreateOrUpdate(null, null, importStudent.getMobile(), importStudent.getEmail(), +// importUser.getDeptId(), null); +// } catch (ServiceException ex) { +// respVO.getFailureUsernames().put(importStudent.getName(), ex.getMessage()); +// return; +// } + + // 判断如果不存在,在进行插入 + StudentDO existStudent = studentMapper.selectByNationidForTJ(importStudent.getNationId(), listXyrw.get(0).getBatchno()); + if (existStudent == null) { + StudentDO newStudent = StudentConvert.INSTANCE.convert(importStudent); + newStudent.setStatus(0); + newStudent.setFeeflag(0); + newStudent.setDeleted(false); + newStudent.setCreateTime(VeDate.getNowDate()); + newStudent.setUpdateTime(VeDate.getNowDate()); + newStudent.setBatchno(listXyrw.get(0).getBatchno()); + newStudent.setBatchname(listXyrw.get(0).getBatchName()); + newStudent.setPatid("0"); + studentMapper.insert(newStudent); + respVO.getCreateStudentnames().add(importStudent.getName()); + return; + }else{ + // 如果存在,判断是否允许更新 + if (!isUpdateSupport) { + respVO.getFailureStudentnames().put(importStudent.getName(), TJR_STUDENT_EXISTS.getMsg()); + return; + } + StudentDO updateStudent = StudentConvert.INSTANCE.convert(importStudent); + updateStudent.setId(existStudent.getId()); + studentMapper.updateById(updateStudent); + respVO.getUpdateStudentnames().add(importStudent.getName()); + } + }); + return respVO; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/TenantPackageService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/TenantPackageService.java new file mode 100644 index 0000000..b59f8fa --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/TenantPackageService.java @@ -0,0 +1,73 @@ +package com.jojubanking.boot.module.system.service.tenant; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantPackageDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 租户套餐 Service 接口 + * + * @author TW + */ +public interface TenantPackageService { + + /** + * 创建租户套餐 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTenantPackage(@Valid TenantPackageCreateReqVO createReqVO); + + /** + * 更新租户套餐 + * + * @param updateReqVO 更新信息 + */ + void updateTenantPackage(@Valid TenantPackageUpdateReqVO updateReqVO); + + /** + * 删除租户套餐 + * + * @param id 编号 + */ + void deleteTenantPackage(Long id); + + /** + * 获得租户套餐 + * + * @param id 编号 + * @return 租户套餐 + */ + TenantPackageDO getTenantPackage(Long id); + + /** + * 获得租户套餐分页 + * + * @param pageReqVO 分页查询 + * @return 租户套餐分页 + */ + PageResult getTenantPackagePage(TenantPackagePageReqVO pageReqVO); + + /** + * 校验租户套餐 + * + * @param id 编号 + * @return 租户套餐 + */ + TenantPackageDO validTenantPackage(Long id); + + /** + * 获得指定状态的租户套餐列表 + * + * @param status 状态 + * @return 租户套餐 + */ + List getTenantPackageListByStatus(Integer status); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/TenantPackageServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/TenantPackageServiceImpl.java new file mode 100644 index 0000000..38de4de --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/TenantPackageServiceImpl.java @@ -0,0 +1,115 @@ +package com.jojubanking.boot.module.system.service.tenant; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageUpdateReqVO; +import com.jojubanking.boot.module.system.convert.tenant.TenantPackageConvert; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantDO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantPackageDO; +import com.jojubanking.boot.module.system.dal.mysql.tenant.TenantPackageMapper; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 租户套餐 Service 实现类 + * + * @author TW + */ +@Service +@Validated +public class TenantPackageServiceImpl implements TenantPackageService { + + @Resource + private TenantPackageMapper tenantPackageMapper; + + @Resource + @Lazy // 避免循环依赖的报错 + private TenantService tenantService; + + @Override + public Long createTenantPackage(TenantPackageCreateReqVO createReqVO) { + // 插入 + TenantPackageDO tenantPackage = TenantPackageConvert.INSTANCE.convert(createReqVO); + tenantPackageMapper.insert(tenantPackage); + // 返回 + return tenantPackage.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTenantPackage(TenantPackageUpdateReqVO updateReqVO) { + // 校验存在 + TenantPackageDO tenantPackage = validateTenantPackageExists(updateReqVO.getId()); + // 更新 + TenantPackageDO updateObj = TenantPackageConvert.INSTANCE.convert(updateReqVO); + tenantPackageMapper.updateById(updateObj); + // 如果菜单发生变化,则修改每个租户的菜单 + if (!CollUtil.isEqualList(tenantPackage.getMenuIds(), updateReqVO.getMenuIds())) { + List tenants = tenantService.getTenantListByPackageId(tenantPackage.getId()); + tenants.forEach(tenant -> tenantService.updateTenantRoleMenu(tenant.getId(), updateReqVO.getMenuIds())); + } + } + + @Override + public void deleteTenantPackage(Long id) { + // 校验存在 + this.validateTenantPackageExists(id); + // 校验正在使用 + this.validateTenantUsed(id); + // 删除 + tenantPackageMapper.deleteById(id); + } + + private TenantPackageDO validateTenantPackageExists(Long id) { + TenantPackageDO tenantPackage = tenantPackageMapper.selectById(id); + if (tenantPackage == null) { + throw exception(TENANT_PACKAGE_NOT_EXISTS); + } + return tenantPackage; + } + + private void validateTenantUsed(Long id) { + if (tenantService.getTenantCountByPackageId(id) > 0) { + throw exception(TENANT_PACKAGE_USED); + } + } + + @Override + public TenantPackageDO getTenantPackage(Long id) { + return tenantPackageMapper.selectById(id); + } + + @Override + public PageResult getTenantPackagePage(TenantPackagePageReqVO pageReqVO) { + return tenantPackageMapper.selectPage(pageReqVO); + } + + @Override + public TenantPackageDO validTenantPackage(Long id) { + TenantPackageDO tenantPackage = tenantPackageMapper.selectById(id); + if (tenantPackage == null) { + throw exception(TENANT_PACKAGE_NOT_EXISTS); + } + if (tenantPackage.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) { + throw exception(TENANT_PACKAGE_DISABLE, tenantPackage.getName()); + } + return tenantPackage; + } + + @Override + public List getTenantPackageListByStatus(Integer status) { + return tenantPackageMapper.selectListByStatus(status); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/TenantService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/TenantService.java new file mode 100644 index 0000000..3d8ce9e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/TenantService.java @@ -0,0 +1,131 @@ +package com.jojubanking.boot.module.system.service.tenant; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantDO; +import com.jojubanking.boot.module.system.service.tenant.handler.TenantInfoHandler; +import com.jojubanking.boot.module.system.service.tenant.handler.TenantMenuHandler; + +import javax.validation.Valid; +import java.util.List; +import java.util.Set; + +/** + * 租户 Service 接口 + * + * @author TW + */ +public interface TenantService { + + /** + * 创建租户 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTenant(@Valid TenantCreateReqVO createReqVO); + + /** + * 更新租户 + * + * @param updateReqVO 更新信息 + */ + void updateTenant(@Valid TenantUpdateReqVO updateReqVO); + + /** + * 更新租户的角色菜单 + * + * @param tenantId 租户编号 + * @param menuIds 菜单编号数组 + */ + void updateTenantRoleMenu(Long tenantId, Set menuIds); + + /** + * 删除租户 + * + * @param id 编号 + */ + void deleteTenant(Long id); + + /** + * 获得租户 + * + * @param id 编号 + * @return 租户 + */ + TenantDO getTenant(Long id); + + /** + * 获得租户分页 + * + * @param pageReqVO 分页查询 + * @return 租户分页 + */ + PageResult getTenantPage(TenantPageReqVO pageReqVO); + + /** + * 获得租户列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 租户列表 + */ + List getTenantList(TenantExportReqVO exportReqVO); + + /** + * 获得名字对应的租户 + * + * @param name 组户名 + * @return 租户 + */ + TenantDO getTenantByName(String name); + + /** + * 获得使用指定套餐的租户数量 + * + * @param packageId 租户套餐编号 + * @return 租户数量 + */ + Long getTenantCountByPackageId(Long packageId); + + /** + * 获得使用指定套餐的租户数组 + * + * @param packageId 租户套餐编号 + * @return 租户数组 + */ + List getTenantListByPackageId(Long packageId); + + /** + * 进行租户的信息处理逻辑 + * 其中,租户编号从 {@link TenantContextHolder} 上下文中获取 + * + * @param handler 处理器 + */ + void handleTenantInfo(TenantInfoHandler handler); + + /** + * 进行租户的菜单处理逻辑 + * 其中,租户编号从 {@link TenantContextHolder} 上下文中获取 + * + * @param handler 处理器 + */ + void handleTenantMenu(TenantMenuHandler handler); + + /** + * 获得所有租户 + * + * @return 租户编号数组 + */ + List getTenantIds(); + + /** + * 校验租户是否合法 + * + * @param id 租户编号 + */ + void validTenant(Long id); +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/TenantServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/TenantServiceImpl.java new file mode 100644 index 0000000..5284323 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/TenantServiceImpl.java @@ -0,0 +1,269 @@ +package com.jojubanking.boot.module.system.service.tenant; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.tenant.config.TenantProperties; +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; +import com.jojubanking.boot.framework.tenant.core.util.TenantUtils; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantUpdateReqVO; +import com.jojubanking.boot.module.system.convert.tenant.TenantConvert; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantDO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantPackageDO; +import com.jojubanking.boot.module.system.dal.mysql.tenant.TenantMapper; +import com.jojubanking.boot.module.system.enums.permission.RoleCodeEnum; +import com.jojubanking.boot.module.system.enums.permission.RoleTypeEnum; +import com.jojubanking.boot.module.system.service.permission.MenuService; +import com.jojubanking.boot.module.system.service.permission.PermissionService; +import com.jojubanking.boot.module.system.service.permission.RoleService; +import com.jojubanking.boot.module.system.service.tenant.handler.TenantInfoHandler; +import com.jojubanking.boot.module.system.service.tenant.handler.TenantMenuHandler; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static java.util.Collections.singleton; + +/** + * 租户 Service 实现类 + * + * @author TW + */ +@Service +@Validated +@Slf4j +public class TenantServiceImpl implements TenantService { + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired(required = false) // 由于 joju.tenant.enable 配置项,可以关闭多租户的功能,所以这里只能不强制注入 + private TenantProperties tenantProperties; + + @Resource + private TenantMapper tenantMapper; + + @Resource + private TenantPackageService tenantPackageService; + @Resource + @Lazy // 延迟,避免循环依赖报错 + private AdminUserService userService; + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + @Resource + private PermissionService permissionService; + + @Override + public List getTenantIds() { + List tenants = tenantMapper.selectList(); + return CollectionUtils.convertList(tenants, TenantDO::getId); + } + + @Override + public void validTenant(Long id) { + TenantDO tenant = getTenant(id); + if (tenant == null) { + throw exception(TENANT_NOT_EXISTS); + } + if (tenant.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) { + throw exception(TENANT_DISABLE, tenant.getName()); + } + if (DateUtils.isExpired(tenant.getExpireTime())) { + throw exception(TENANT_EXPIRE, tenant.getName()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createTenant(TenantCreateReqVO createReqVO) { + // 校验套餐被禁用 + TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(createReqVO.getPackageId()); + + // 创建租户 + TenantDO tenant = TenantConvert.INSTANCE.convert(createReqVO); + tenantMapper.insert(tenant); + + TenantUtils.execute(tenant.getId(), () -> { + // 创建角色 + Long roleId = createRole(tenantPackage); + // 创建用户,并分配角色 + Long userId = createUser(roleId, createReqVO); + // 修改租户的管理员 + tenantMapper.updateById(new TenantDO().setId(tenant.getId()).setContactUserId(userId)); + }); + return tenant.getId(); + } + + private Long createUser(Long roleId, TenantCreateReqVO createReqVO) { + // 创建用户 + Long userId = userService.createUser(TenantConvert.INSTANCE.convert02(createReqVO)); + // 分配角色 + permissionService.assignUserRole(userId, singleton(roleId)); + return userId; + } + + private Long createRole(TenantPackageDO tenantPackage) { + // 创建角色 + RoleCreateReqVO reqVO = new RoleCreateReqVO(); + reqVO.setName(RoleCodeEnum.TENANT_ADMIN.getName()); + reqVO.setCode(RoleCodeEnum.TENANT_ADMIN.getCode()); + reqVO.setSort(0); + reqVO.setRemark("系统自动生成"); + Long roleId = roleService.createRole(reqVO, RoleTypeEnum.SYSTEM.getType()); + // 分配权限 + permissionService.assignRoleMenu(roleId, tenantPackage.getMenuIds()); + return roleId; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTenant(TenantUpdateReqVO updateReqVO) { + // 校验存在 + TenantDO tenant = checkUpdateTenant(updateReqVO.getId()); + // 校验套餐被禁用 + TenantPackageDO tenantPackage = tenantPackageService.validTenantPackage(updateReqVO.getPackageId()); + + // 更新租户 + TenantDO updateObj = TenantConvert.INSTANCE.convert(updateReqVO); + tenantMapper.updateById(updateObj); + // 如果套餐发生变化,则修改其角色的权限 + if (ObjectUtil.notEqual(tenant.getPackageId(), updateReqVO.getPackageId())) { + updateTenantRoleMenu(tenant.getId(), tenantPackage.getMenuIds()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTenantRoleMenu(Long tenantId, Set menuIds) { + TenantUtils.execute(tenantId, () -> { + // 获得所有角色 + List roles = roleService.getRoles(null); + roles.forEach(role -> Assert.isTrue(tenantId.equals(role.getTenantId()), "角色({}/{}) 租户不匹配", + role.getId(), role.getTenantId(), tenantId)); // 兜底校验 + // 重新分配每个角色的权限 + roles.forEach(role -> { + // 如果是租户管理员,重新分配其权限为租户套餐的权限 + if (Objects.equals(role.getCode(), RoleCodeEnum.TENANT_ADMIN.getCode())) { + permissionService.assignRoleMenu(role.getId(), menuIds); + log.info("[updateTenantRoleMenu][租户管理员({}/{}) 的权限修改为({})]", role.getId(), role.getTenantId(), menuIds); + return; + } + // 如果是其他角色,则去掉超过套餐的权限 + Set roleMenuIds = permissionService.getRoleMenuIds(role.getId()); + roleMenuIds = CollUtil.intersectionDistinct(roleMenuIds, menuIds); + permissionService.assignRoleMenu(role.getId(), roleMenuIds); + log.info("[updateTenantRoleMenu][角色({}/{}) 的权限修改为({})]", role.getId(), role.getTenantId(), roleMenuIds); + }); + }); + } + + @Override + public void deleteTenant(Long id) { + // 校验存在 + checkUpdateTenant(id); + // 删除 + tenantMapper.deleteById(id); + } + + private TenantDO checkUpdateTenant(Long id) { + TenantDO tenant = tenantMapper.selectById(id); + if (tenant == null) { + throw exception(TENANT_NOT_EXISTS); + } + // 内置租户,不允许删除 + if (isSystemTenant(tenant)) { + throw exception(TENANT_CAN_NOT_UPDATE_SYSTEM); + } + return tenant; + } + + @Override + public TenantDO getTenant(Long id) { + return tenantMapper.selectById(id); + } + + @Override + public PageResult getTenantPage(TenantPageReqVO pageReqVO) { + return tenantMapper.selectPage(pageReqVO); + } + + @Override + public List getTenantList(TenantExportReqVO exportReqVO) { + return tenantMapper.selectList(exportReqVO); + } + + @Override + public TenantDO getTenantByName(String name) { + return tenantMapper.selectByName(name); + } + + @Override + public Long getTenantCountByPackageId(Long packageId) { + return tenantMapper.selectCountByPackageId(packageId); + } + + @Override + public List getTenantListByPackageId(Long packageId) { + return tenantMapper.selectListByPackageId(packageId); + } + + @Override + public void handleTenantInfo(TenantInfoHandler handler) { + // 如果禁用,则不执行逻辑 + if (isTenantDisable()) { + return; + } + // 获得租户 + TenantDO tenant = getTenant(TenantContextHolder.getRequiredTenantId()); + // 执行处理器 + handler.handle(tenant); + } + + @Override + public void handleTenantMenu(TenantMenuHandler handler) { + // 如果禁用,则不执行逻辑 + if (isTenantDisable()) { + return; + } + // 获得租户,然后获得菜单 + TenantDO tenant = getTenant(TenantContextHolder.getRequiredTenantId()); + Set menuIds; + if (isSystemTenant(tenant)) { // 系统租户,菜单是全量的 + menuIds = CollectionUtils.convertSet(menuService.getMenus(), MenuDO::getId); + } else { + menuIds = tenantPackageService.getTenantPackage(tenant.getPackageId()).getMenuIds(); + } + // 执行处理器 + handler.handle(menuIds); + } + + private static boolean isSystemTenant(TenantDO tenant) { + return Objects.equals(tenant.getPackageId(), TenantDO.PACKAGE_ID_SYSTEM); + } + + private boolean isTenantDisable() { + return tenantProperties == null || Boolean.FALSE.equals(tenantProperties.getEnable()); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/handler/TenantInfoHandler.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/handler/TenantInfoHandler.java new file mode 100644 index 0000000..01c6ce5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/handler/TenantInfoHandler.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.service.tenant.handler; + +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantDO; + +/** + * 租户信息处理 + * 目的:尽量减少租户逻辑耦合到系统中 + * + * @author TW + */ +public interface TenantInfoHandler { + + /** + * 基于传入的租户信息,进行相关逻辑的执行 + * 例如说,创建用户时,超过最大账户配额 + * + * @param tenant 租户信息 + */ + void handle(TenantDO tenant); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/handler/TenantMenuHandler.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/handler/TenantMenuHandler.java new file mode 100644 index 0000000..ed360d9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/tenant/handler/TenantMenuHandler.java @@ -0,0 +1,21 @@ +package com.jojubanking.boot.module.system.service.tenant.handler; + +import java.util.Set; + +/** + * 租户菜单处理 + * 目的:尽量减少租户逻辑耦合到系统中 + * + * @author TW + */ +public interface TenantMenuHandler { + + /** + * 基于传入的租户菜单【全】列表,进行相关逻辑的执行 + * 例如说,返回可分配菜单的时候,可以移除多余的 + * + * @param menuIds 菜单列表 + */ + void handle(Set menuIds); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/usecount/UseCountService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/usecount/UseCountService.java new file mode 100644 index 0000000..18c4001 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/usecount/UseCountService.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.usecount; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.usecount.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountToDO; +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountToDateDO; + +/** + * 统计 Service 接口 + * + * @author admin + */ +public interface UseCountService { + + /** + * 创建统计 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createUseCount(@Valid UseCountCreateReqVO createReqVO); + + /** + * 更新统计 + * + * @param updateReqVO 更新信息 + */ + void updateUseCount(@Valid UseCountUpdateReqVO updateReqVO); + + /** + * 删除统计 + * + * @param id 编号 + */ + void deleteUseCount(Integer id); + + /** + * 获得统计 + * + * @param id 编号 + * @return 统计 + */ + UseCountDO getUseCount(Integer id); + + /** + * 获得统计列表 + * + * @param ids 编号 + * @return 统计列表 + */ + List getUseCountList(Collection ids); + List getUseCountTo(); + List getUseCountTo1(); + List getUseCountTo2(); + List getUseCountTo3(); + List getUseCountTo4(); + List getUseCountTo5(); + List getUseCountTo6(); + List getUseCountToSection(Date startDate, Date endDate); + + List getUseCountToDate(); + + /** + * 获得统计分页 + * + * @param pageReqVO 分页查询 + * @return 统计分页 + */ + PageResult getUseCountPage(UseCountPageReqVO pageReqVO); + + /** + * 获得统计列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 统计列表 + */ + List getUseCountList(UseCountExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/usecount/UseCountServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/usecount/UseCountServiceImpl.java new file mode 100644 index 0000000..1edc0b5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/usecount/UseCountServiceImpl.java @@ -0,0 +1,168 @@ +package com.jojubanking.boot.module.system.service.usecount; + +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountToDO; +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountToDateDO; +import com.jojubanking.boot.module.system.dal.mysql.usecount.UseCountXMapper; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.text.SimpleDateFormat; +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.usecount.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.usecount.UseCountConvert; +import com.jojubanking.boot.module.system.dal.mysql.usecount.UseCountMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 统计 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class UseCountServiceImpl implements UseCountService { + + @Resource + private UseCountMapper useCountMapper; + + @Resource + private UseCountXMapper useCountXMapper; + @Override + public Integer createUseCount(UseCountCreateReqVO createReqVO) { + // 插入 + UseCountDO useCount = UseCountConvert.INSTANCE.convert(createReqVO); + useCountMapper.insert(useCount); + // 返回 + return useCount.getId(); + } + + @Override + public void updateUseCount(UseCountUpdateReqVO updateReqVO) { + // 校验存在 + this.validateUseCountExists(updateReqVO.getId()); + // 更新 + UseCountDO updateObj = UseCountConvert.INSTANCE.convert(updateReqVO); + useCountMapper.updateById(updateObj); + } + + @Override + public void deleteUseCount(Integer id) { + // 校验存在 + this.validateUseCountExists(id); + // 删除 + useCountMapper.deleteById(id); + } + + private void validateUseCountExists(Integer id) { + if (useCountMapper.selectById(id) == null) { + throw exception(USE_COUNT_NOT_EXISTS); + } + } + + @Override + public UseCountDO getUseCount(Integer id) { + return useCountMapper.selectById(id); + } + + @Override + public List getUseCountList(Collection ids) { + return useCountMapper.selectBatchIds(ids); + } + @Override + public List getUseCountTo() { + return useCountXMapper.selectCountTo(); + } + @Override + public List getUseCountTo1() { + return useCountXMapper.selectCountTo1(); + } + @Override + public List getUseCountTo2() { + return useCountXMapper.selectCountTo2(); + } + @Override + public List getUseCountTo3() { + return useCountXMapper.selectCountTo3(); + } + @Override + public List getUseCountTo4() { + return useCountXMapper.selectCountTo4(); + } + @Override + public List getUseCountTo5() { + return useCountXMapper.selectCountTo5(); + } + @Override + public List getUseCountTo6() { + return useCountXMapper.selectCountTo6(); + } + @Override + public List getUseCountToSection(Date startDate, Date endDate) { + return useCountXMapper.selectCountToSection(startDate, endDate); + } + @Override + public List getUseCountToDate() { + List lst = new ArrayList<>(); + UseCountToDateDO dateDO = new UseCountToDateDO(); + + //指定日期格式 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + //日历对象 + Calendar calendar = Calendar.getInstance(); + //获取当前日期 + calendar.setTime(new Date()); + System.out.println("当前时间:" + simpleDateFormat.format(calendar.getTime())); + dateDO.setDate(simpleDateFormat.format(calendar.getTime())); + + //当前时间减去一天,即一天前的时间 + calendar.add(Calendar.DAY_OF_MONTH,-1); + String day = simpleDateFormat.format(calendar.getTime()); + System.out.println("昨天日期:" + day); + dateDO.setDate1(simpleDateFormat.format(calendar.getTime())); + + calendar.add(Calendar.DAY_OF_MONTH,-1); + day = simpleDateFormat.format(calendar.getTime()); + System.out.println("昨天日期:" + day); + dateDO.setDate2(simpleDateFormat.format(calendar.getTime())); + + calendar.add(Calendar.DAY_OF_MONTH,-1); + day = simpleDateFormat.format(calendar.getTime()); + System.out.println("昨天日期:" + day); + dateDO.setDate3(simpleDateFormat.format(calendar.getTime())); + + calendar.add(Calendar.DAY_OF_MONTH,-1); + day = simpleDateFormat.format(calendar.getTime()); + System.out.println("昨天日期:" + day); + dateDO.setDate4(simpleDateFormat.format(calendar.getTime())); + + calendar.add(Calendar.DAY_OF_MONTH,-1); + day = simpleDateFormat.format(calendar.getTime()); + System.out.println("昨天日期:" + day); + dateDO.setDate5(simpleDateFormat.format(calendar.getTime())); + + calendar.add(Calendar.DAY_OF_MONTH,-1); + day = simpleDateFormat.format(calendar.getTime()); + System.out.println("昨天日期:" + day); + dateDO.setDate6(simpleDateFormat.format(calendar.getTime())); + + lst.add(dateDO); + + return lst; + } + @Override + public PageResult getUseCountPage(UseCountPageReqVO pageReqVO) { + return useCountMapper.selectPage(pageReqVO); + } + + @Override + public List getUseCountList(UseCountExportReqVO exportReqVO) { + return useCountMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/user/AdminUserService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/user/AdminUserService.java new file mode 100644 index 0000000..5c54899 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/user/AdminUserService.java @@ -0,0 +1,221 @@ +package com.jojubanking.boot.module.system.service.user; + +import cn.hutool.core.collection.CollUtil; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.*; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.*; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; + +import javax.validation.Valid; +import java.io.InputStream; +import java.util.*; + +/** + * 后台用户 Service 接口 + * + * @author TW + */ +public interface AdminUserService { + + /** + * 创建用户 + * + * @param reqVO 用户信息 + * @return 用户编号 + */ + Long createUser(@Valid UserCreateReqVO reqVO); + + /** + * 修改用户 + * + * @param reqVO 用户信息 + */ + void updateUser(@Valid UserUpdateReqVO reqVO); + + /** + * 更新用户的最后登陆信息 + * + * @param id 用户编号 + * @param loginIp 登陆 IP + */ + void updateUserLogin(Long id, String loginIp); + + /** + * 修改用户个人信息 + * + * @param id 用户编号 + * @param reqVO 用户个人信息 + */ + void updateUserProfile(Long id, @Valid UserProfileUpdateReqVO reqVO); + + /** + * 修改用户个人密码 + * + * @param id 用户编号 + * @param reqVO 更新用户个人密码 + */ + void updateUserPassword(Long id, @Valid UserProfileUpdatePasswordReqVO reqVO); + + /** + * 更新用户头像 + * + * @param id 用户 id + * @param avatarFile 头像文件 + */ + String updateUserAvatar(Long id, InputStream avatarFile) throws Exception; + + /** + * 修改密码 + * + * @param id 用户编号 + * @param password 密码 + */ + void updateUserPassword(Long id, String password); + + /** + * 修改状态 + * + * @param id 用户编号 + * @param status 状态 + */ + void updateUserStatus(Long id, Integer status); + + /** + * 删除用户 + * + * @param id 用户编号 + */ + void deleteUser(Long id); + + /** + * 通过用户名查询用户 + * + * @param username 用户名 + * @return 用户对象信息 + */ + AdminUserDO getUserByUsername(String username); + + /** + * 通过手机号获取用户 + * + * @param mobile 手机号 + * @return 用户对象信息 + */ + AdminUserDO getUserByMobile(String mobile); + + /** + * 获得用户分页列表 + * + * @param reqVO 分页条件 + * @return 分页列表 + */ + PageResult getUserPage(UserPageReqVO reqVO); + + /** + * 通过用户 ID 查询用户 + * + * @param id 用户ID + * @return 用户对象信息 + */ + AdminUserDO getUser(Long id); + + /** + * 获得指定部门的用户数组 + * + * @param deptIds 部门数组 + * @return 用户数组 + */ + List getUsersByDeptIds(Collection deptIds); + + /** + * 获得指定岗位的用户数组 + * + * @param postIds 岗位数组 + * @return 用户数组 + */ + List getUsersByPostIds(Collection postIds); + + /** + * 获得用户列表 + * + * @param ids 用户编号数组 + * @return 用户列表 + */ + List getUsers(Collection ids); + + /** + * 校验用户们是否有效。如下情况,视为无效: + * 1. 用户编号不存在 + * 2. 用户被禁用 + * + * @param ids 用户编号数组 + */ + void validUsers(Set ids); + + /** + * 获得用户 Map + * + * @param ids 用户编号数组 + * @return 用户 Map + */ + default Map getUserMap(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return new HashMap<>(); + } + return CollectionUtils.convertMap(getUsers(ids), AdminUserDO::getId); + } + + /** + * 获得用户列表 + * + * @param reqVO 列表请求 + * @return 用户列表 + */ + List getUsers(UserExportReqVO reqVO); + + /** + * 获得用户列表,基于昵称模糊匹配 + * + * @param nickname 昵称 + * @return 用户列表 + */ + List getUsersByNickname(String nickname); + + /** + * 获得用户列表,基于用户账号模糊匹配 + * + * @param username 用户账号 + * @return 用户列表 + */ + List getUsersByUsername(String username); + + /** + * 批量导入用户 + * + * @param importUsers 导入用户列表 + * @param isUpdateSupport 是否支持更新 + * @return 导入结果 + */ + UserImportRespVO importUsers(List importUsers, boolean isUpdateSupport); + + /** + * 获得指定状态的用户们 + * + * @param status 状态 + * @return 用户们 + */ + List getUsersByStatus(Integer status); + + /** + * 判断密码是否匹配 + * + * @param rawPassword 未加密的密码 + * @param encodedPassword 加密后的密码 + * @return 是否匹配 + */ + boolean isPasswordMatch(String rawPassword, String encodedPassword); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/user/AdminUserServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/user/AdminUserServiceImpl.java new file mode 100644 index 0000000..c267168 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/user/AdminUserServiceImpl.java @@ -0,0 +1,457 @@ +package com.jojubanking.boot.module.system.service.user; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.module.infra.api.file.FileApi; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.*; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.*; +import com.jojubanking.boot.module.system.convert.user.UserConvert; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.UserPostDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.dal.mysql.dept.UserPostMapper; +import com.jojubanking.boot.module.system.dal.mysql.user.AdminUserMapper; +import com.jojubanking.boot.module.system.service.dept.DeptService; +import com.jojubanking.boot.module.system.service.dept.PostService; +import com.jojubanking.boot.module.system.service.permission.PermissionService; +import com.jojubanking.boot.module.system.service.tenant.TenantService; +import com.google.common.annotations.VisibleForTesting; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.InputStream; +import java.util.*; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertList; +import static com.jojubanking.boot.framework.common.util.collection.CollectionUtils.convertSet; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 后台用户 Service 实现类 + * @author TW + */ +@Service("adminUserService") +@Slf4j +public class AdminUserServiceImpl implements AdminUserService { + + @Value("${sys.user.init-password:jojuyuanma}") + private String userInitPassword; + + @Resource + private AdminUserMapper userMapper; + + @Resource + private DeptService deptService; + @Resource + private PostService postService; + @Resource + private PermissionService permissionService; + @Resource + private PasswordEncoder passwordEncoder; + @Resource + @Lazy // 延迟,避免循环依赖报错 + private TenantService tenantService; + + @Resource + private UserPostMapper userPostMapper; + + @Resource + private FileApi fileApi; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createUser(UserCreateReqVO reqVO) { + // 校验账户配合 + tenantService.handleTenantInfo(tenant -> { + long count = userMapper.selectCount(); + if (count >= tenant.getAccountCount()) { + throw exception(USER_COUNT_MAX, tenant.getAccountCount()); + } + }); + // 校验正确性 + checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), + reqVO.getDeptId(), reqVO.getPostIds()); + // 插入用户 + AdminUserDO user = UserConvert.INSTANCE.convert(reqVO); + user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 + user.setPassword(encodePassword(reqVO.getPassword())); // 加密密码 + userMapper.insert(user); + // 插入关联岗位 + if (CollectionUtil.isNotEmpty(user.getPostIds())) { + userPostMapper.insertBatch(convertList(user.getPostIds(), + postId -> new UserPostDO().setUserId(user.getId()).setPostId(postId))); + } + return user.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateUser(UserUpdateReqVO reqVO) { + // 校验正确性 + checkCreateOrUpdate(reqVO.getId(), reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), + reqVO.getDeptId(), reqVO.getPostIds()); + // 更新用户 + AdminUserDO updateObj = UserConvert.INSTANCE.convert(reqVO); + userMapper.updateById(updateObj); + // 更新岗位 + updateUserPost(reqVO, updateObj); + } + + private void updateUserPost(UserUpdateReqVO reqVO, AdminUserDO updateObj) { + Long userId = reqVO.getId(); + Set dbPostIds = convertSet(userPostMapper.selectListByUserId(userId), UserPostDO::getPostId); + // 计算新增和删除的岗位编号 + Set postIds = updateObj.getPostIds(); + Collection createPostIds = CollUtil.subtract(postIds, dbPostIds); + Collection deletePostIds = CollUtil.subtract(dbPostIds, postIds); + // 执行新增和删除。对于已经授权的菜单,不用做任何处理 + if (!CollectionUtil.isEmpty(createPostIds)) { + userPostMapper.insertBatch(convertList(createPostIds, + postId -> new UserPostDO().setUserId(userId).setPostId(postId))); + } + if (!CollectionUtil.isEmpty(deletePostIds)) { + userPostMapper.deleteByUserIdAndPostId(userId, deletePostIds); + } + } + + @Override + public void updateUserLogin(Long id, String loginIp) { + userMapper.updateById(new AdminUserDO().setId(id).setLoginIp(loginIp).setLoginDate(new Date())); + } + + @Override + public void updateUserProfile(Long id, UserProfileUpdateReqVO reqVO) { + // 校验正确性 + checkUserExists(id); + checkEmailUnique(id, reqVO.getEmail()); + checkMobileUnique(id, reqVO.getMobile()); + // 执行更新 + userMapper.updateById(UserConvert.INSTANCE.convert(reqVO).setId(id)); + } + + @Override + public void updateUserPassword(Long id, UserProfileUpdatePasswordReqVO reqVO) { + // 校验旧密码密码 + checkOldPassword(id, reqVO.getOldPassword()); + // 执行更新 + AdminUserDO updateObj = new AdminUserDO().setId(id); + updateObj.setPassword(encodePassword(reqVO.getNewPassword())); // 加密密码 + userMapper.updateById(updateObj); + } + + @Override + public String updateUserAvatar(Long id, InputStream avatarFile) throws Exception { + checkUserExists(id); + // 存储文件 + String avatar = fileApi.createFile(IoUtil.readBytes(avatarFile)); + // 更新路径 + AdminUserDO sysUserDO = new AdminUserDO(); + sysUserDO.setId(id); + sysUserDO.setAvatar(avatar); + userMapper.updateById(sysUserDO); + return avatar; + } + + @Override + public void updateUserPassword(Long id, String password) { + // 校验用户存在 + checkUserExists(id); + // 更新密码 + AdminUserDO updateObj = new AdminUserDO(); + updateObj.setId(id); + updateObj.setPassword(encodePassword(password)); // 加密密码 + userMapper.updateById(updateObj); + } + + @Override + public void updateUserStatus(Long id, Integer status) { + // 校验用户存在 + checkUserExists(id); + // 更新状态 + AdminUserDO updateObj = new AdminUserDO(); + updateObj.setId(id); + updateObj.setStatus(status); + userMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteUser(Long id) { + // 校验用户存在 + checkUserExists(id); + // 删除用户 + userMapper.deleteById(id); + // 删除用户关联数据 + permissionService.processUserDeleted(id); + // 删除用户岗位 + userPostMapper.deleteByUserId(id); + } + + @Override + public AdminUserDO getUserByUsername(String username) { + return userMapper.selectByUsername(username); + } + + @Override + public AdminUserDO getUserByMobile(String mobile) { + return userMapper.selectByMobile(mobile); + } + + @Override + public PageResult getUserPage(UserPageReqVO reqVO) { + return userMapper.selectPage(reqVO, getDeptCondition(reqVO.getDeptId())); + } + + @Override + public AdminUserDO getUser(Long id) { + return userMapper.selectById(id); + } + + @Override + public List getUsersByDeptIds(Collection deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return Collections.emptyList(); + } + return userMapper.selectListByDeptIds(deptIds); + } + + @Override + public List getUsersByPostIds(Collection postIds) { + if (CollUtil.isEmpty(postIds)) { + return Collections.emptyList(); + } + Set userIds = convertSet(userPostMapper.selectListByPostIds(postIds), UserPostDO::getUserId); + if (CollUtil.isEmpty(userIds)) { + return Collections.emptyList(); + } + return userMapper.selectBatchIds(userIds); + } + + @Override + public List getUsers(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return userMapper.selectBatchIds(ids); + } + + @Override + public void validUsers(Set ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 获得岗位信息 + List users = userMapper.selectBatchIds(ids); + Map userMap = CollectionUtils.convertMap(users, AdminUserDO::getId); + // 校验 + ids.forEach(id -> { + AdminUserDO user = userMap.get(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(user.getStatus())) { + throw exception(USER_IS_DISABLE, user.getNickname()); + } + }); + } + + @Override + public List getUsers(UserExportReqVO reqVO) { + return userMapper.selectList(reqVO, getDeptCondition(reqVO.getDeptId())); + } + + @Override + public List getUsersByNickname(String nickname) { + return userMapper.selectListByNickname(nickname); + } + + @Override + public List getUsersByUsername(String username) { + return userMapper.selectListByUsername(username); + } + + /** + * 获得部门条件:查询指定部门的子部门编号们,包括自身 + * @param deptId 部门编号 + * @return 部门编号集合 + */ + private Set getDeptCondition(Long deptId) { + if (deptId == null) { + return Collections.emptySet(); + } + Set deptIds = convertSet(deptService.getDeptsByParentIdFromCache( + deptId, true), DeptDO::getId); + deptIds.add(deptId); // 包括自身 + return deptIds; + } + + private void checkCreateOrUpdate(Long id, String username, String mobile, String email, + Long deptId, Set postIds) { + // 校验用户存在 + checkUserExists(id); + // 校验用户名唯一 + checkUsernameUnique(id, username); + // 校验手机号唯一 + checkMobileUnique(id, mobile); + // 校验邮箱唯一 + checkEmailUnique(id, email); + // 校验部门处于开启状态 + deptService.validDepts(CollectionUtils.singleton(deptId)); + // 校验岗位处于开启状态 + postService.validPosts(postIds); + } + + @VisibleForTesting + public void checkUserExists(Long id) { + if (id == null) { + return; + } + AdminUserDO user = userMapper.selectById(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + } + + @VisibleForTesting + public void checkUsernameUnique(Long id, String username) { + if (StrUtil.isBlank(username)) { + return; + } + AdminUserDO user = userMapper.selectByUsername(username); + if (user == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的用户 + if (id == null) { + throw exception(USER_USERNAME_EXISTS); + } + if (!user.getId().equals(id)) { + throw exception(USER_USERNAME_EXISTS); + } + } + + @VisibleForTesting + public void checkEmailUnique(Long id, String email) { + if (StrUtil.isBlank(email)) { + return; + } + AdminUserDO user = userMapper.selectByEmail(email); + if (user == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的用户 + if (id == null) { + throw exception(USER_EMAIL_EXISTS); + } + if (!user.getId().equals(id)) { + throw exception(USER_EMAIL_EXISTS); + } + } + + @VisibleForTesting + public void checkMobileUnique(Long id, String mobile) { + if (StrUtil.isBlank(mobile)) { + return; + } + AdminUserDO user = userMapper.selectByMobile(mobile); + if (user == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的用户 + if (id == null) { + throw exception(USER_MOBILE_EXISTS); + } + if (!user.getId().equals(id)) { + throw exception(USER_MOBILE_EXISTS); + } + } + + /** + * 校验旧密码 + * @param id 用户 id + * @param oldPassword 旧密码 + */ + @VisibleForTesting + public void checkOldPassword(Long id, String oldPassword) { + AdminUserDO user = userMapper.selectById(id); + if (user == null) { + throw exception(USER_NOT_EXISTS); + } + if (!isPasswordMatch(oldPassword, user.getPassword())) { + throw exception(USER_PASSWORD_FAILED); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入 + public UserImportRespVO importUsers(List importUsers, boolean isUpdateSupport) { + if (CollUtil.isEmpty(importUsers)) { + throw exception(USER_IMPORT_LIST_IS_EMPTY); + } + UserImportRespVO respVO = UserImportRespVO.builder().createUsernames(new ArrayList<>()) + .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); + importUsers.forEach(importUser -> { + // 校验,判断是否有不符合的原因 + try { + checkCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(), + importUser.getDeptId(), null); + } catch (ServiceException ex) { + respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage()); + return; + } + // 判断如果不存在,在进行插入 + AdminUserDO existUser = userMapper.selectByUsername(importUser.getUsername()); + if (existUser == null) { + userMapper.insert(UserConvert.INSTANCE.convert(importUser) + .setPassword(encodePassword(userInitPassword))); // 设置默认密码 + respVO.getCreateUsernames().add(importUser.getUsername()); + return; + } + // 如果存在,判断是否允许更新 + if (!isUpdateSupport) { + respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMsg()); + return; + } + AdminUserDO updateUser = UserConvert.INSTANCE.convert(importUser); + updateUser.setId(existUser.getId()); + userMapper.updateById(updateUser); + respVO.getUpdateUsernames().add(importUser.getUsername()); + }); + return respVO; + } + + @Override + public List getUsersByStatus(Integer status) { + return userMapper.selectListByStatus(status); + } + + @Override + public boolean isPasswordMatch(String rawPassword, String encodedPassword) { + return passwordEncoder.matches(rawPassword, encodedPassword); + } + + /** + * 对密码进行加密 + * + * @param password 密码 + * @return 加密后的密码 + */ + private String encodePassword(String password) { + return passwordEncoder.encode(password); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/userinfo/UserInfoService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/userinfo/UserInfoService.java new file mode 100644 index 0000000..81d9432 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/userinfo/UserInfoService.java @@ -0,0 +1,90 @@ +package com.jojubanking.boot.module.system.service.userinfo; + +import java.util.*; +import javax.validation.*; + +import com.jojubanking.boot.framework.common.validation.Mobile; +import com.jojubanking.boot.module.system.controller.app.userinfo.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.userinfo.UserInfoDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 用户信息 Service 接口 + * + * @author admin + */ +public interface UserInfoService { + + /** + * 通过手机查询用户 + * + * @param mobile 手机 + * @return 用户对象 + */ + UserInfoDO getUserByMobile(String mobile); + + /** + * 基于手机号创建用户。 + * 如果用户已经存在,则直接进行返回 + * + * @param mobile 手机号 + * @param registerIp 注册 IP + * @return 用户对象 + */ + UserInfoDO createUserIfAbsent(@Mobile String mobile, String registerIp); + + /** + * 创建用户信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUserInfo(@Valid AppUserInfoCreateReqVO createReqVO); + + /** + * 更新用户信息 + * + * @param updateReqVO 更新信息 + */ + void updateUserInfo(@Valid AppUserInfoUpdateReqVO updateReqVO); + + /** + * 删除用户信息 + * + * @param id 编号 + */ + void deleteUserInfo(Long id); + + /** + * 获得用户信息 + * + * @param id 编号 + * @return 用户信息 + */ + UserInfoDO getUserInfo(Long id); + + /** + * 获得用户信息列表 + * + * @param ids 编号 + * @return 用户信息列表 + */ + List getUserInfoList(Collection ids); + + /** + * 获得用户信息分页 + * + * @param pageReqVO 分页查询 + * @return 用户信息分页 + */ + PageResult getUserInfoPage(AppUserInfoPageReqVO pageReqVO); + + /** + * 获得用户信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 用户信息列表 + */ + List getUserInfoList(AppUserInfoExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/userinfo/UserInfoServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/userinfo/UserInfoServiceImpl.java new file mode 100644 index 0000000..9a1f252 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/userinfo/UserInfoServiceImpl.java @@ -0,0 +1,124 @@ +package com.jojubanking.boot.module.system.service.userinfo; + +import cn.hutool.core.util.IdUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.app.userinfo.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.userinfo.UserInfoDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.userinfo.UserInfoConvert; +import com.jojubanking.boot.module.system.dal.mysql.userinfo.UserInfoMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 用户信息 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class UserInfoServiceImpl implements UserInfoService { + + @Resource + private UserInfoMapper userInfoMapper; + @Resource + private PasswordEncoder passwordEncoder; + + @Override + public UserInfoDO getUserByMobile(String mobile) { + return userInfoMapper.selectByMobile(mobile); + } + + @Override + public UserInfoDO createUserIfAbsent(String mobile, String registerIp) { + // 用户已经存在 + UserInfoDO user = userInfoMapper.selectByMobile(mobile); + if (user != null) { + return user; + } + // 用户不存在,则进行创建 + return this.createUser(mobile, registerIp); + } + private UserInfoDO createUser(String mobile, String registerIp) { + // 生成密码 + String password = IdUtil.fastSimpleUUID(); + // 插入用户 + UserInfoDO user = new UserInfoDO(); + user.setPhone(mobile); +// user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 + user.setPassword(encodePassword(password)); // 加密密码 +// user.setRegisterIp(registerIp); + userInfoMapper.insert(user); + return user; + } + /** + * 对密码进行加密 + * + * @param password 密码 + * @return 加密后的密码 + */ + private String encodePassword(String password) { + return passwordEncoder.encode(password); + } + + @Override + public Long createUserInfo(AppUserInfoCreateReqVO createReqVO) { + // 插入 + UserInfoDO userInfo = UserInfoConvert.INSTANCE.convert(createReqVO); + userInfoMapper.insert(userInfo); + // 返回 + return userInfo.getId(); + } + + @Override + public void updateUserInfo(AppUserInfoUpdateReqVO updateReqVO) { + // 校验存在 + this.validateUserInfoExists(updateReqVO.getId()); + // 更新 + UserInfoDO updateObj = UserInfoConvert.INSTANCE.convert(updateReqVO); + userInfoMapper.updateById(updateObj); + } + + @Override + public void deleteUserInfo(Long id) { + // 校验存在 + this.validateUserInfoExists(id); + // 删除 + userInfoMapper.deleteById(id); + } + + private void validateUserInfoExists(Long id) { + if (userInfoMapper.selectById(id) == null) { + throw exception(USER_INFO_NOT_EXISTS); + } + } + + @Override + public UserInfoDO getUserInfo(Long id) { + return userInfoMapper.selectById(id); + } + + @Override + public List getUserInfoList(Collection ids) { + return userInfoMapper.selectBatchIds(ids); + } + + @Override + public PageResult getUserInfoPage(AppUserInfoPageReqVO pageReqVO) { + return userInfoMapper.selectPage(pageReqVO); + } + + @Override + public List getUserInfoList(AppUserInfoExportReqVO exportReqVO) { + return userInfoMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/usersxq/UsersXqService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/usersxq/UsersXqService.java new file mode 100644 index 0000000..7821c51 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/usersxq/UsersXqService.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.service.usersxq; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.usersxq.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.usersxq.UsersXqDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 用户信息 Service 接口 + * + * @author admin + */ +public interface UsersXqService { + + /** + * 创建用户信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUsersXq(@Valid UsersXqCreateReqVO createReqVO); + + /** + * 更新用户信息 + * + * @param updateReqVO 更新信息 + */ + void updateUsersXq(@Valid UsersXqUpdateReqVO updateReqVO); + + /** + * 删除用户信息 + * + * @param id 编号 + */ + void deleteUsersXq(Long id); + + /** + * 获得用户信息 + * + * @param id 编号 + * @return 用户信息 + */ + UsersXqDO getUsersXq(Long id); + + /** + * 获得用户信息列表 + * + * @param ids 编号 + * @return 用户信息列表 + */ + List getUsersXqList(Collection ids); + + /** + * 获得用户信息分页 + * + * @param pageReqVO 分页查询 + * @return 用户信息分页 + */ + PageResult getUsersXqPage(UsersXqPageReqVO pageReqVO); + + /** + * 获得用户信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 用户信息列表 + */ + List getUsersXqList(UsersXqExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/usersxq/UsersXqServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/usersxq/UsersXqServiceImpl.java new file mode 100644 index 0000000..d86ae32 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/usersxq/UsersXqServiceImpl.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.usersxq; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.usersxq.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.usersxq.UsersXqDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.usersxq.UsersXqConvert; +import com.jojubanking.boot.module.system.dal.mysql.usersxq.UsersXqMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 用户信息 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class UsersXqServiceImpl implements UsersXqService { + + @Resource + private UsersXqMapper usersXqMapper; + + @Override + public Long createUsersXq(UsersXqCreateReqVO createReqVO) { + // 插入 + UsersXqDO usersXq = UsersXqConvert.INSTANCE.convert(createReqVO); + usersXqMapper.insert(usersXq); + // 返回 + return usersXq.getId(); + } + + @Override + public void updateUsersXq(UsersXqUpdateReqVO updateReqVO) { + // 校验存在 + this.validateUsersXqExists(updateReqVO.getId()); + // 更新 + UsersXqDO updateObj = UsersXqConvert.INSTANCE.convert(updateReqVO); + usersXqMapper.updateById(updateObj); + } + + @Override + public void deleteUsersXq(Long id) { + // 校验存在 + this.validateUsersXqExists(id); + // 删除 + usersXqMapper.deleteById(id); + } + + private void validateUsersXqExists(Long id) { + if (usersXqMapper.selectById(id) == null) { + throw exception(USERS_XQ_NOT_EXISTS); + } + } + + @Override + public UsersXqDO getUsersXq(Long id) { + return usersXqMapper.selectById(id); + } + + @Override + public List getUsersXqList(Collection ids) { + return usersXqMapper.selectBatchIds(ids); + } + + @Override + public PageResult getUsersXqPage(UsersXqPageReqVO pageReqVO) { + return usersXqMapper.selectPage(pageReqVO); + } + + @Override + public List getUsersXqList(UsersXqExportReqVO exportReqVO) { + return usersXqMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wq/WqService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wq/WqService.java new file mode 100644 index 0000000..046850d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wq/WqService.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.service.wq; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.wq.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wq.WqDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 问卷调查 Service 接口 + * + * @author admin + */ +public interface WqService { + + /** + * 创建问卷调查 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createWq(@Valid WqCreateReqVO createReqVO); + + /** + * 更新问卷调查 + * + * @param updateReqVO 更新信息 + */ + void updateWq(@Valid WqUpdateReqVO updateReqVO); + + /** + * 删除问卷调查 + * + * @param id 编号 + */ + void deleteWq(Integer id); + + /** + * 获得问卷调查 + * + * @param id 编号 + * @return 问卷调查 + */ + WqDO getWq(Integer id); + + /** + * 获得问卷调查列表 + * + * @param ids 编号 + * @return 问卷调查列表 + */ + List getWqList(Collection ids); + + /** + * 获得问卷调查分页 + * + * @param pageReqVO 分页查询 + * @return 问卷调查分页 + */ + PageResult getWqPage(WqPageReqVO pageReqVO); + + /** + * 获得问卷调查列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 问卷调查列表 + */ + List getWqList(WqExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wq/WqServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wq/WqServiceImpl.java new file mode 100644 index 0000000..9d684e0 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wq/WqServiceImpl.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.wq; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.wq.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wq.WqDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.wq.WqConvert; +import com.jojubanking.boot.module.system.dal.mysql.wq.WqMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 问卷调查 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class WqServiceImpl implements WqService { + + @Resource + private WqMapper wqMapper; + + @Override + public Integer createWq(WqCreateReqVO createReqVO) { + // 插入 + WqDO wq = WqConvert.INSTANCE.convert(createReqVO); + wqMapper.insert(wq); + // 返回 + return wq.getId(); + } + + @Override + public void updateWq(WqUpdateReqVO updateReqVO) { + // 校验存在 + this.validateWqExists(updateReqVO.getId()); + // 更新 + WqDO updateObj = WqConvert.INSTANCE.convert(updateReqVO); + wqMapper.updateById(updateObj); + } + + @Override + public void deleteWq(Integer id) { + // 校验存在 + this.validateWqExists(id); + // 删除 + wqMapper.deleteById(id); + } + + private void validateWqExists(Integer id) { + if (wqMapper.selectById(id) == null) { + throw exception(WQ_NOT_EXISTS); + } + } + + @Override + public WqDO getWq(Integer id) { + return wqMapper.selectById(id); + } + + @Override + public List getWqList(Collection ids) { + return wqMapper.selectBatchIds(ids); + } + + @Override + public PageResult getWqPage(WqPageReqVO pageReqVO) { + return wqMapper.selectPage(pageReqVO); + } + + @Override + public List getWqList(WqExportReqVO exportReqVO) { + return wqMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqda/WqdaService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqda/WqdaService.java new file mode 100644 index 0000000..be14079 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqda/WqdaService.java @@ -0,0 +1,78 @@ +package com.jojubanking.boot.module.system.service.wqda; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.wqda.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqda.WqdaDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.dal.dataobject.wqda.WqdaDOx; + +/** + * 问卷调查答案 Service 接口 + * + * @author admin + */ +public interface WqdaService { + + /** + * 创建问卷调查答案 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createWqda(@Valid WqdaCreateReqVO createReqVO); + + /** + * 更新问卷调查答案 + * + * @param updateReqVO 更新信息 + */ + void updateWqda(@Valid WqdaUpdateReqVO updateReqVO); + + /** + * 删除问卷调查答案 + * + * @param id 编号 + */ + void deleteWqda(Integer id); + + /** + * 获得问卷调查答案 + * + * @param id 编号 + * @return 问卷调查答案 + */ + WqdaDO getWqda(Integer id); + + /** + * 获得问卷调查答案列表 + * + * @param ids 编号 + * @return 问卷调查答案列表 + */ + List getWqdaList(Collection ids); + + /** + * 获得问卷调查答案统计 + * + * @param typeId 问卷编号 + * @return 问卷调查答案统计 + */ + String getWqdaSumList(String typeId, String startTime, String endTime); + /** + * 获得问卷调查答案分页 + * + * @param pageReqVO 分页查询 + * @return 问卷调查答案分页 + */ + PageResult getWqdaPage(WqdaPageReqVO pageReqVO); + + /** + * 获得问卷调查答案列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 问卷调查答案列表 + */ + List getWqdaList(WqdaExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqda/WqdaServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqda/WqdaServiceImpl.java new file mode 100644 index 0000000..ae565ef --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqda/WqdaServiceImpl.java @@ -0,0 +1,170 @@ +package com.jojubanking.boot.module.system.service.wqda; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.jojubanking.boot.module.system.dal.dataobject.wqda.WqdaDOx; +import com.jojubanking.boot.module.system.dal.dataobject.wqwt.WqwtDO; +import com.jojubanking.boot.module.system.dal.mysql.wq.WqMapper; +import com.jojubanking.boot.module.system.dal.mysql.wqda.WqdaxMapper; +import com.jojubanking.boot.module.system.dal.mysql.wqwt.WqwtMapper; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.text.DecimalFormat; +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.wqda.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqda.WqdaDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.wqda.WqdaConvert; +import com.jojubanking.boot.module.system.dal.mysql.wqda.WqdaMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 问卷调查答案 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class WqdaServiceImpl implements WqdaService { + + @Resource + private WqdaMapper wqdaMapper; + @Resource + private WqdaxMapper wqdaxMapper; + + @Resource + private WqwtMapper wqwtMapper; + + @Override + public Integer createWqda(WqdaCreateReqVO createReqVO) { + // 插入 + WqdaDO wqda = WqdaConvert.INSTANCE.convert(createReqVO); + wqdaMapper.insert(wqda); + // 返回 + return wqda.getId(); + } + + @Override + public void updateWqda(WqdaUpdateReqVO updateReqVO) { + // 校验存在 + this.validateWqdaExists(updateReqVO.getId()); + // 更新 + WqdaDO updateObj = WqdaConvert.INSTANCE.convert(updateReqVO); + wqdaMapper.updateById(updateObj); + } + + @Override + public void deleteWqda(Integer id) { + // 校验存在 + this.validateWqdaExists(id); + // 删除 + wqdaMapper.deleteById(id); + } + + private void validateWqdaExists(Integer id) { + if (wqdaMapper.selectById(id) == null) { + throw exception(WQDA_NOT_EXISTS); + } + } + + @Override + public WqdaDO getWqda(Integer id) { + return wqdaMapper.selectById(id); + } + + @Override + public List getWqdaList(Collection ids) { + return wqdaMapper.selectBatchIds(ids); + } + + @Override + public String getWqdaSumList(String typeId, String startTime, String endTime){ + //住院101,门诊102 + LambdaQueryWrapper wtwrapper = new LambdaQueryWrapper<>(); + wtwrapper.ne(WqwtDO::getQuestionType, "03").eq(WqwtDO::getTypeId, typeId).orderByAsc(WqwtDO::getQuestionId); + List list = wqwtMapper.selectList(wtwrapper); + + String all = "["; + for(int i=0; i wrapper = new LambdaQueryWrapper<>(); +// wrapper.eq(WqdaDO::getQuestionId, questionId).groupBy(WqdaDO::getQuestionAnswer).orderBy(true,true,WqdaDO::getQuestionId); +// List lsttmp = wqdaMapper.selectList(wrapper); + + List lsttmp = wqdaxMapper.selectSumList(questionId, typeId, startTime, endTime); + //计算progress + Long total = Long.valueOf(0); + for(int j=0; j getWqdaPage(WqdaPageReqVO pageReqVO) { + //按客户要求,需要将其他内容全部放到问题答案中 +// PageResult resPage; +// List lst = new ArrayList<>(); +// +// PageResult Page = wqdaMapper.selectPage(pageReqVO); + + + return wqdaMapper.selectPage(pageReqVO); + } + + @Override + public List getWqdaList(WqdaExportReqVO exportReqVO) { + return wqdaMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqdaview/WqdaViewService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqdaview/WqdaViewService.java new file mode 100644 index 0000000..2fd452c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqdaview/WqdaViewService.java @@ -0,0 +1,72 @@ +package com.jojubanking.boot.module.system.service.wqdaview; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.wqdaview.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqdaview.WqdaViewDO; +import com.jojubanking.boot.module.system.dal.dataobject.wqdaview.WqdaViewCustDO; + +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * VIEW Service 接口 + * + * @author admin + */ +public interface WqdaViewService { + + /** + * 创建VIEW + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createWqdaView(@Valid WqdaViewCreateReqVO createReqVO); + + /** + * 更新VIEW + * + * @param updateReqVO 更新信息 + */ + void updateWqdaView(@Valid WqdaViewUpdateReqVO updateReqVO); + + /** + * 删除VIEW + * + * @param id 编号 + */ + void deleteWqdaView(Integer id); + + /** + * 获得VIEW + * + * @param id 编号 + * @return VIEW + */ + WqdaViewDO getWqdaView(Integer id); + + /** + * 获得VIEW列表 + * + * @param ids 编号 + * @return VIEW列表 + */ + List getWqdaViewList(Collection ids); + + /** + * 获得VIEW分页 + * + * @param pageReqVO 分页查询 + * @return VIEW分页 + */ + PageResult getWqdaViewPage(WqdaViewPageReqVO pageReqVO); + + /** + * 获得VIEW列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return VIEW列表 + */ + List getWqdaViewList(WqdaViewExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqdaview/WqdaViewServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqdaview/WqdaViewServiceImpl.java new file mode 100644 index 0000000..cabe4d9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqdaview/WqdaViewServiceImpl.java @@ -0,0 +1,83 @@ +package com.jojubanking.boot.module.system.service.wqdaview; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.wqdaview.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqdaview.WqdaViewDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.wqdaview.WqdaViewConvert; +import com.jojubanking.boot.module.system.dal.mysql.wqdaview.WqdaViewMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqdaview.WqdaViewCustDO; + +/** + * VIEW Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class WqdaViewServiceImpl implements WqdaViewService { + + @Resource + private WqdaViewMapper wqdaViewMapper; + + @Override + public Integer createWqdaView(WqdaViewCreateReqVO createReqVO) { + // 插入 + WqdaViewDO wqdaView = WqdaViewConvert.INSTANCE.convert(createReqVO); + wqdaViewMapper.insert(wqdaView); + // 返回 + return wqdaView.getId(); + } + + @Override + public void updateWqdaView(WqdaViewUpdateReqVO updateReqVO) { + // 校验存在 + this.validateWqdaViewExists(updateReqVO.getId()); + // 更新 + WqdaViewDO updateObj = WqdaViewConvert.INSTANCE.convert(updateReqVO); + wqdaViewMapper.updateById(updateObj); + } + + @Override + public void deleteWqdaView(Integer id) { + // 校验存在 + this.validateWqdaViewExists(id); + // 删除 + wqdaViewMapper.deleteById(id); + } + + private void validateWqdaViewExists(Integer id) { + if (wqdaViewMapper.selectById(id) == null) { + throw exception(WQDA_VIEW_NOT_EXISTS); + } + } + + @Override + public WqdaViewDO getWqdaView(Integer id) { + return wqdaViewMapper.selectById(id); + } + + @Override + public List getWqdaViewList(Collection ids) { + return wqdaViewMapper.selectBatchIds(ids); + } + + @Override + public PageResult getWqdaViewPage(WqdaViewPageReqVO pageReqVO) { + return wqdaViewMapper.selectPage(pageReqVO); + } + + @Override + public List getWqdaViewList(WqdaViewExportReqVO exportReqVO) { + return wqdaViewMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqwt/WqwtService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqwt/WqwtService.java new file mode 100644 index 0000000..ea00dcf --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqwt/WqwtService.java @@ -0,0 +1,70 @@ +package com.jojubanking.boot.module.system.service.wqwt; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.wqwt.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqwt.WqwtDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 问卷调查问题 Service 接口 + * + * @author admin + */ +public interface WqwtService { + + /** + * 创建问卷调查问题 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createWqwt(@Valid WqwtCreateReqVO createReqVO); + + /** + * 更新问卷调查问题 + * + * @param updateReqVO 更新信息 + */ + void updateWqwt(@Valid WqwtUpdateReqVO updateReqVO); + + /** + * 删除问卷调查问题 + * + * @param id 编号 + */ + void deleteWqwt(Integer id); + + /** + * 获得问卷调查问题 + * + * @param id 编号 + * @return 问卷调查问题 + */ + WqwtDO getWqwt(Integer id); + + /** + * 获得问卷调查问题列表 + * + * @param ids 编号 + * @return 问卷调查问题列表 + */ + List getWqwtList(Collection ids); + + /** + * 获得问卷调查问题分页 + * + * @param pageReqVO 分页查询 + * @return 问卷调查问题分页 + */ + PageResult getWqwtPage(WqwtPageReqVO pageReqVO); + + /** + * 获得问卷调查问题列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 问卷调查问题列表 + */ + List getWqwtList(WqwtExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqwt/WqwtServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqwt/WqwtServiceImpl.java new file mode 100644 index 0000000..c47533a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/wqwt/WqwtServiceImpl.java @@ -0,0 +1,82 @@ +package com.jojubanking.boot.module.system.service.wqwt; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.wqwt.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.wqwt.WqwtDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.wqwt.WqwtConvert; +import com.jojubanking.boot.module.system.dal.mysql.wqwt.WqwtMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 问卷调查问题 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class WqwtServiceImpl implements WqwtService { + + @Resource + private WqwtMapper wqwtMapper; + + @Override + public Integer createWqwt(WqwtCreateReqVO createReqVO) { + // 插入 + WqwtDO wqwt = WqwtConvert.INSTANCE.convert(createReqVO); + wqwtMapper.insert(wqwt); + // 返回 + return wqwt.getId(); + } + + @Override + public void updateWqwt(WqwtUpdateReqVO updateReqVO) { + // 校验存在 + this.validateWqwtExists(updateReqVO.getId()); + // 更新 + WqwtDO updateObj = WqwtConvert.INSTANCE.convert(updateReqVO); + wqwtMapper.updateById(updateObj); + } + + @Override + public void deleteWqwt(Integer id) { + // 校验存在 + this.validateWqwtExists(id); + // 删除 + wqwtMapper.deleteById(id); + } + + private void validateWqwtExists(Integer id) { + if (wqwtMapper.selectById(id) == null) { + throw exception(WQWT_NOT_EXISTS); + } + } + + @Override + public WqwtDO getWqwt(Integer id) { + return wqwtMapper.selectById(id); + } + + @Override + public List getWqwtList(Collection ids) { + return wqwtMapper.selectBatchIds(ids); + } + + @Override + public PageResult getWqwtPage(WqwtPageReqVO pageReqVO) { + return wqwtMapper.selectPage(pageReqVO); + } + + @Override + public List getWqwtList(WqwtExportReqVO exportReqVO) { + return wqwtMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xymain/xyMainService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xymain/xyMainService.java new file mode 100644 index 0000000..8070111 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xymain/xyMainService.java @@ -0,0 +1,71 @@ +package com.jojubanking.boot.module.system.service.xymain; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.xymain.xyMainDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 体检信息 Service 接口 + * + * @author admin + */ +public interface xyMainService { + + /** + * 创建体检信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createxyMain(@Valid xyMainCreateReqVO createReqVO); + + /** + * 更新体检信息 + * + * @param updateReqVO 更新信息 + */ + void updatexyMain(@Valid xyMainUpdateReqVO updateReqVO); + + /** + * 删除体检信息 + * + * @param id 编号 + */ + void deletexyMain(Long id); + + /** + * 获得体检信息 + * + * @param id 编号 + * @return 体检信息 + */ + xyMainDO getxyMain(Long id); + + /** + * 获得体检信息列表 + * + * @param ids 编号 + * @return 体检信息列表 + */ + List getxyMainList(Collection ids); + List getxyMainListSimple(xyMainExportReqVO reqVO); + + /** + * 获得体检信息分页 + * + * @param pageReqVO 分页查询 + * @return 体检信息分页 + */ + PageResult getxyMainPage(xyMainPageReqVO pageReqVO); + + /** + * 获得体检信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 体检信息列表 + */ + List getxyMainList(xyMainExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xymain/xyMainServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xymain/xyMainServiceImpl.java new file mode 100644 index 0000000..d04d7ba --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xymain/xyMainServiceImpl.java @@ -0,0 +1,171 @@ +package com.jojubanking.boot.module.system.service.xymain; + +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.xymain.xyMainDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.xymain.xyMainConvert; +import com.jojubanking.boot.module.system.dal.mysql.xymain.xyMainMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 体检信息 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class xyMainServiceImpl implements xyMainService { + + @Resource + private xyMainMapper xyMainMapper; + + @Override + public Long createxyMain(xyMainCreateReqVO createReqVO) { + //每个身份证只能一条记录 + if(validateNationid(createReqVO.getNationId()) >= 1){ + throw exception(XY_MAIN_NATIONID_EXISTS); + } + + //如果新增的是默认体检人,把openid下的其他用户重置 + if(createReqVO.getDefaultflag() == 0){ + + UpdateWrapper updateWrapper = Wrappers.update(); + + updateWrapper.eq("openid", createReqVO.getOpenid()); + xyMainDO xyMainDO = new xyMainDO(); + xyMainDO.setDefaultflag(Long.getLong("1")); + + int update = xyMainMapper.update(xyMainDO, updateWrapper); + + } + + // 插入 + xyMainDO xyMain = xyMainConvert.INSTANCE.convert(createReqVO); + xyMainMapper.insert(xyMain); + + //检查是否是某位家长的第一体检人 + xyMainExportReqVO checkVO = new xyMainExportReqVO(); + checkVO.setOpenid(createReqVO.getOpenid()); + List list = getxyMainListSimple(checkVO); + + if(list.size() == 1){ + //新增1条记录,默认为默认就诊人 + UpdateWrapper updateWrapper = Wrappers.update(); + + updateWrapper.eq("openid", createReqVO.getOpenid()); + xyMainDO xyDO = new xyMainDO(); + xyDO.setDefaultflag(0L); + + int update = xyMainMapper.update(xyDO, updateWrapper); + } + + // 返回 + return xyMain.getId(); + } + + @Override + public void updatexyMain(xyMainUpdateReqVO updateReqVO) { + //已有缴费记录不允许修改 + if(validateFeeflag(updateReqVO.getId())){ + throw exception(XY_MAIN_FEE_EXISTS); + } + // 校验存在 + this.validatexyMainExists(updateReqVO.getId()); + + //如果新增的是默认体检人,把openid下的其他用户重置 + if(updateReqVO.getDefaultflag() == 0){ + + UpdateWrapper updateWrapper = Wrappers.update(); + + updateWrapper.eq("openid", updateReqVO.getOpenid()); + xyMainDO xyMainDO = new xyMainDO(); + xyMainDO.setDefaultflag(1L); + + int update = xyMainMapper.update(xyMainDO, updateWrapper); + + } + + // 更新 + xyMainDO updateObj = xyMainConvert.INSTANCE.convert(updateReqVO); + xyMainMapper.updateById(updateObj); + + //如果新增的是默认体检人,把openid下的其他用户重置 + + } + + @Override + public void deletexyMain(Long id) { + ////已有缴费记录不允许删除 + if(validateFeeflag(id)){ + throw exception(XY_MAIN_FEE_EXISTS); + } + + // 校验存在 + this.validatexyMainExists(id); + // 删除 + xyMainMapper.deleteById(id); + } + + private void validatexyMainExists(Long id) { + if (xyMainMapper.selectById(id) == null) { + throw exception(XY_MAIN_NOT_EXISTS); + } + } + + private int validateNationid(String nationid) { + xyMainExportReqVO reqVO = new xyMainExportReqVO(); + reqVO.setNationId(nationid); + List lst = xyMainMapper.selectList(reqVO); + if(lst.size() > 1) return 2; + else if(lst.size() == 1) return 1; + else return 0; + } + private boolean validateFeeflag(Long id) { + xyMainDO reqVO = new xyMainDO(); + + if (xyMainMapper.selectById(id) == null) { + throw exception(XY_MAIN_NOT_EXISTS); + } + + reqVO = xyMainMapper.selectById(id); + + if(reqVO.getFeeflag() == 0) return false; + else return true; + } + + @Override + public xyMainDO getxyMain(Long id) { + return xyMainMapper.selectById(id); + } + + @Override + public List getxyMainList(Collection ids) { + return xyMainMapper.selectBatchIds(ids); + } + + @Override + public List getxyMainListSimple(xyMainExportReqVO reqVO) { + return xyMainMapper.selectListSimple(reqVO); + } + + @Override + public PageResult getxyMainPage(xyMainPageReqVO pageReqVO) { + return xyMainMapper.selectPage(pageReqVO); + } + + @Override + public List getxyMainList(xyMainExportReqVO exportReqVO) { + return xyMainMapper.selectList(exportReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xyrw/XyrwService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xyrw/XyrwService.java new file mode 100644 index 0000000..0b26f92 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xyrw/XyrwService.java @@ -0,0 +1,73 @@ +package com.jojubanking.boot.module.system.service.xyrw; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.xyrw.vo.*; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.XyrwListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * 批次信息 Service 接口 + * + * @author admin + */ +public interface XyrwService { + + /** + * 创建批次信息 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createXyrw(@Valid XyrwCreateReqVO createReqVO); + + /** + * 更新批次信息 + * + * @param updateReqVO 更新信息 + */ + void updateXyrw(@Valid XyrwUpdateReqVO updateReqVO); + void updateXyrwByBatch(XyrwUpdateReqVO updateReqVO); + /** + * 删除批次信息 + * + * @param id 编号 + */ + void deleteXyrw(Long id); + + /** + * 获得批次信息 + * + * @param id 编号 + * @return 批次信息 + */ + XyrwDO getXyrw(Long id); + + /** + * 获得批次信息列表 + * + * @param ids 编号 + * @return 批次信息列表 + */ + List getXyrwList(Collection ids); + + List getXyrwSimpleList(XyrwListReqVO exportReqVO); + + /** + * 获得批次信息分页 + * + * @param pageReqVO 分页查询 + * @return 批次信息分页 + */ + PageResult getXyrwPage(XyrwPageReqVO pageReqVO); + + /** + * 获得批次信息列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 批次信息列表 + */ + List getXyrwList(XyrwExportReqVO exportReqVO); + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xyrw/XyrwServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xyrw/XyrwServiceImpl.java new file mode 100644 index 0000000..8e4d976 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xyrw/XyrwServiceImpl.java @@ -0,0 +1,104 @@ +package com.jojubanking.boot.module.system.service.xyrw; + +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.vo.XyrwListReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.xymain.xyMainDO; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.xyrw.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.xyrw.XyrwConvert; +import com.jojubanking.boot.module.system.dal.mysql.xyrw.XyrwMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * 批次信息 Service 实现类 + * + * @author admin + */ +@Service +@Validated +public class XyrwServiceImpl implements XyrwService { + + @Resource + private XyrwMapper xyrwMapper; + + @Override + public Long createXyrw(XyrwCreateReqVO createReqVO) { + // 插入 + XyrwDO xyrw = XyrwConvert.INSTANCE.convert(createReqVO); + xyrwMapper.insert(xyrw); + // 返回 + return xyrw.getId(); + } + + @Override + public void updateXyrw(XyrwUpdateReqVO updateReqVO) { + // 校验存在 + this.validateXyrwExists(updateReqVO.getId()); + // 更新 + XyrwDO updateObj = XyrwConvert.INSTANCE.convert(updateReqVO); + xyrwMapper.updateById(updateObj); + } + + public void updateXyrwByBatch(XyrwUpdateReqVO updateReqVO) { + + UpdateWrapper updateWrapper = Wrappers.update(); + + updateWrapper.ne("batchno", updateReqVO.getBatchno()); + XyrwDO xyrwDO = new XyrwDO(); + xyrwDO.setBatchStatus(updateReqVO.getBatchStatus()); + + int update = xyrwMapper.update(xyrwDO, updateWrapper); + + } + + + @Override + public void deleteXyrw(Long id) { + // 校验存在 + this.validateXyrwExists(id); + // 删除 + xyrwMapper.deleteById(id); + } + + private void validateXyrwExists(Long id) { + if (xyrwMapper.selectById(id) == null) { + throw exception(XYRW_NOT_EXISTS); + } + } + + @Override + public XyrwDO getXyrw(Long id) { + return xyrwMapper.selectById(id); + } + + @Override + public List getXyrwList(Collection ids) { + return xyrwMapper.selectBatchIds(ids); + } + + @Override + public PageResult getXyrwPage(XyrwPageReqVO pageReqVO) { + return xyrwMapper.selectPage(pageReqVO); + } + + @Override + public List getXyrwList(XyrwExportReqVO exportReqVO) { + return xyrwMapper.selectList(exportReqVO); + } + + @Override + public List getXyrwSimpleList(XyrwListReqVO listReqVO) { + return xyrwMapper.selectList(listReqVO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xytjjg/XytjjgService.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xytjjg/XytjjgService.java new file mode 100644 index 0000000..44533a5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xytjjg/XytjjgService.java @@ -0,0 +1,74 @@ +package com.jojubanking.boot.module.system.service.xytjjg; + +import java.util.*; +import javax.validation.*; +import com.jojubanking.boot.module.system.controller.admin.xytjjg.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.xytjjg.XytjjgDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +/** + * HIS项目 Service 接口 + * + * @author admin + */ +public interface XytjjgService { + + /** + * 创建HIS项目 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createXytjjg(@Valid XytjjgCreateReqVO createReqVO); + + /** + * 更新HIS项目 + * + * @param updateReqVO 更新信息 + */ + void updateXytjjg(@Valid XytjjgUpdateReqVO updateReqVO); + + /** + * 删除HIS项目 + * + * @param id 编号 + */ + void deleteXytjjg(Long id); + + /** + * 获得HIS项目 + * + * @param id 编号 + * @return HIS项目 + */ + XytjjgDO getXytjjg(Long id); + + /** + * 获得HIS项目列表 + * + * @param ids 编号 + * @return HIS项目列表 + */ + List getXytjjgList(Collection ids); + + /** + * 获得HIS项目分页 + * + * @param pageReqVO 分页查询 + * @return HIS项目分页 + */ + PageResult getXytjjgPage(XytjjgPageReqVO pageReqVO); + + /** + * 获得HIS项目列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return HIS项目列表 + */ + List getXytjjgList(XytjjgExportReqVO exportReqVO); + + List getXytjjgFilterList(XytjjgExportReqVO exportReqVO); + List getXytjjgFilterList01(XytjjgExportReqVO exportReqVO); + + String updateItemsFromHIS(); +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xytjjg/XytjjgServiceImpl.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xytjjg/XytjjgServiceImpl.java new file mode 100644 index 0000000..c02417a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/service/xytjjg/XytjjgServiceImpl.java @@ -0,0 +1,222 @@ +package com.jojubanking.boot.module.system.service.xytjjg; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jojubanking.boot.module.system.dal.mysql.xytjjg.XytjjgBatchInsertMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.sql.*; +import java.util.*; +import com.jojubanking.boot.module.system.controller.admin.xytjjg.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.xytjjg.XytjjgDO; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import com.jojubanking.boot.module.system.convert.xytjjg.XytjjgConvert; +import com.jojubanking.boot.module.system.dal.mysql.xytjjg.XytjjgMapper; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; + +/** + * HIS项目 Service 实现类 + * + * @author admin + */ +@Service +@Validated +@Slf4j +public class XytjjgServiceImpl implements XytjjgService { + + @Resource + private XytjjgMapper xytjjgMapper; + + @Resource + private XytjjgBatchInsertMapper xytjjgBatchInsertMapper; + @Override + public Long createXytjjg(XytjjgCreateReqVO createReqVO) { + // 插入 + XytjjgDO xytjjg = XytjjgConvert.INSTANCE.convert(createReqVO); + xytjjgMapper.insert(xytjjg); + // 返回 + return xytjjg.getId(); + } + + @Override + public void updateXytjjg(XytjjgUpdateReqVO updateReqVO) { + // 校验存在 + this.validateXytjjgExists(updateReqVO.getId()); + // 更新 + XytjjgDO updateObj = XytjjgConvert.INSTANCE.convert(updateReqVO); + xytjjgMapper.updateById(updateObj); + } + + @Override + public void deleteXytjjg(Long id) { + // 校验存在 + this.validateXytjjgExists(id); + // 删除 + xytjjgMapper.deleteById(id); + } + + private void validateXytjjgExists(Long id) { + if (xytjjgMapper.selectById(id) == null) { + throw exception(XYTJJG_NOT_EXISTS); + } + } + + @Override + public XytjjgDO getXytjjg(Long id) { + return xytjjgMapper.selectById(id); + } + + @Override + public List getXytjjgList(Collection ids) { + return xytjjgMapper.selectBatchIds(ids); + } + + @Override + public PageResult getXytjjgPage(XytjjgPageReqVO pageReqVO) { + return xytjjgMapper.selectPage(pageReqVO); + } + + @Override + public List getXytjjgList(XytjjgExportReqVO exportReqVO) { + return xytjjgMapper.selectList(exportReqVO); + } + + @Override + public List getXytjjgFilterList(XytjjgExportReqVO exportReqVO) { + return xytjjgMapper.selectFilterList(exportReqVO); + } + +// return selectList(new LambdaQueryWrapper() +// .like(XytjjgDO::getItemno, reqVO.getItemno()) +// .or().like(XytjjgDO::getItemname, reqVO.getItemname()) +// .orderByAsc(XytjjgDO::getItemno)); + public List getXytjjgFilterList01(XytjjgExportReqVO exportReqVO) { + log.info("getXytjjgFilterList01"); + String URL = "jdbc:sqlserver://168.168.0.10:1433;databaseName=THIS4"; + String USER = "joju"; + String PASSWORD = "Joju@123"; + List list = new ArrayList<>(); + // 1.加载驱动程序 + try { + Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + // 2.获得数据库链接 + log.info("开始链接数据库"); + Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); + log.info("打印链接状态:" + conn); + // 3.通过数据库的连接操作数据库,实现增删改查(使用Statement类) + String sql = "select * from joju_lcxm where name like '%" + exportReqVO.getItemname() + + "%' or id like '%" + exportReqVO.getItemno() + "%' order by id asc"; + log.info("打印joju_lcxm sql:" + sql); + Statement statement = conn.createStatement(); + ResultSet rs = statement.executeQuery(sql); + log.info("返回结果是:" + rs); + // 4.处理数据库的返回结果(使用ResultSet类) + while (rs.next()) { + //log.info("开始处理数据"); + XytjjgDO xytjjgDO = new XytjjgDO(); + //标识(1小项目 2临床 ) + xytjjgDO.setItemflag("2"); + xytjjgDO.setItemname(rs.getString("name")); + xytjjgDO.setItemno(rs.getString("id")); + xytjjgDO.setItemprice(rs.getString("xmdj")); + list.add(xytjjgDO); + } + log.info("list size: " + list.size()); + + // 关闭资源【多谢指正】 + rs.close(); + statement.close(); + + // 4.查询小项目表 + //两个表都要查,数据合并一起返回 + { + sql = "select * from joju_sfxxm where name like '%" + exportReqVO.getItemname() + + "%' or id like '%" + exportReqVO.getItemno() + "%' order by id asc"; + log.info("joju_sfxxm sql:" + sql); + statement = conn.createStatement(); + rs = statement.executeQuery(sql); + log.info("xxm返回结果是:" + rs); + // 5.处理数据库的返回结果(使用ResultSet类) + while (rs.next()) { + //log.info("开始处理数据"); + XytjjgDO xytjjgDO = new XytjjgDO(); + //标识(1小项目 2临床 ) + xytjjgDO.setItemflag("1"); + xytjjgDO.setItemname(rs.getString("name")); + xytjjgDO.setItemno(rs.getString("id")); + xytjjgDO.setItemprice(rs.getString("xmdj")); + list.add(xytjjgDO); + } + log.info("xxm list size: " + list.size()); + } + + // 关闭资源【多谢指正】 + rs.close(); + statement.close(); + conn.close(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } + + + return list; + + } + + @Override + public String updateItemsFromHIS(){ + log.info("拼接数据"); +// String URL = "jdbc:sqlserver:thin:@//168.168.0.10:1433/THIS4"; + String URL = "jdbc:sqlserver://168.168.0.10:1433;databaseName=THIS4"; + String USER = "joju"; + String PASSWORD = "1"; + //List> list = null; + List jgItemsList = new ArrayList<>(); + // 1.加载驱动程序 + try { + Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + // 2.获得数据库链接 + log.info("开始链接数据库"); + Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); + log.info("打印链接状态:" + conn); + // 3.通过数据库的连接操作数据库,实现增删改查(使用Statement类) + + String sql = "select * from JOJU_XYTJJG where 1 = 1"; + log.info("打印sql" + sql); + Statement statement = conn.createStatement(); + ResultSet rs = statement.executeQuery(sql); + log.info("返回结果是:" + rs); + // 4.处理数据库的返回结果(使用ResultSet类) + while (rs.next()) { + log.info("开始处理数据"); + XytjjgDO xytjjgDO = new XytjjgDO(); + xytjjgDO.setItemno(rs.getString("itemno")); + xytjjgDO.setItemname(rs.getString("itemno")); + xytjjgDO.setItemprice(rs.getString("itemno")); + xytjjgDO.setItemflag(rs.getString("itemno")); + jgItemsList.add(xytjjgDO); + } + + // 关闭资源【多谢指正】 + rs.close(); + statement.close(); + conn.close(); + + if(jgItemsList.size() != 0){ + xytjjgBatchInsertMapper.saveOrUpdateBatch(jgItemsList, jgItemsList.size()); + } + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } + return ""; + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/collection/SimpleTrie.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/collection/SimpleTrie.java new file mode 100644 index 0000000..5a3af16 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/collection/SimpleTrie.java @@ -0,0 +1,145 @@ +package com.jojubanking.boot.module.system.util.collection; + +import cn.hutool.core.collection.CollUtil; + +import java.util.*; + +/** + * 基于前缀树,实现敏感词的校验 + *

+ * 相比 Apache Common 提供的 PatriciaTrie 来说,性能可能会更加好一些。 + * + * @author TW + */ +@SuppressWarnings("unchecked") +public class SimpleTrie { + + /** + * 一个敏感词结束后对应的 key + */ + private static final Character CHARACTER_END = '\0'; + + /** + * 使用敏感词,构建的前缀树 + */ + private final Map children; + + /** + * 基于字符串,构建前缀树 + * + * @param strs 字符串数组 + */ + public SimpleTrie(Collection strs) { + children = new HashMap<>(); + // 构建树 + CollUtil.sort(strs, String::compareTo); // 排序,优先使用较短的前缀 + for (String str : strs) { + Map child = children; + // 遍历每个字符 + for (Character c : str.toCharArray()) { + // 如果已经到达结束,就没必要在添加更长的敏感词。 + // 例如说,有两个敏感词是:吃饭啊、吃饭。输入一句话是 “我要吃饭啊”,则只要匹配到 “吃饭” 这个敏感词即可。 + if (child.containsKey(CHARACTER_END)) { + break; + } + if (!child.containsKey(c)) { + child.put(c, new HashMap<>()); + } + child = (Map) child.get(c); + } + // 结束 + child.put(CHARACTER_END, null); + } + } + + /** + * 验证文本是否合法,即不包含敏感词 + * + * @param text 文本 + * @return 是否 ok + */ + public boolean isValid(String text) { + // 遍历 text,使用每一个 [i, n) 段的字符串,使用 children 前缀树匹配,是否包含敏感词 + for (int i = 0; i < text.length() - 1; i++) { + Map child = (Map) children.get(text.charAt(i)); + if (child == null) { + continue; + } + boolean ok = recursion(text, i + 1, child); + if (!ok) { + return false; + } + } + return true; + } + + /** + * 验证文本从指定位置开始,是否包含某个敏感词 + * + * @param text 文本 + * @param index 开始位置 + * @param child 节点(当前遍历到的) + * @return 是否包含 + */ + private boolean recursion(String text, int index, Map child) { + if (index == text.length()) { + return true; + } + child = (Map) child.get(text.charAt(index)); + return child == null || !child.containsKey(CHARACTER_END) && recursion(text, ++index, child); + } + + /** + * 获得文本所包含的不合法的敏感词 + * + * 注意,才当即最短匹配原则。例如说:当敏感词存在 “煞笔”,“煞笔二货 ”时,只会返回 “煞笔”。 + * + * @param text 文本 + * @return 匹配的敏感词 + */ + public List validate(String text) { + Set results = new HashSet<>(); + for (int i = 0; i < text.length() - 1; i++) { + Character c = text.charAt(i); + Map child = (Map) children.get(c); + if (child == null) { + continue; + } + StringBuilder result = new StringBuilder().append(c); + boolean ok = recursionWithResult(text, i + 1, child, result); + if (!ok) { + results.add(result.toString()); + } + } + return new ArrayList<>(results); + } + + /** + * 返回文本从 index 开始的敏感词,并使用 StringBuilder 参数进行返回 + * + * 逻辑和 {@link #recursion(String, int, Map)} 是一致,只是多了 result 返回结果 + * + * @param text 文本 + * @param index 开始未知 + * @param child 节点(当前遍历到的) + * @param result 返回敏感词 + * @return 是否有敏感词 + */ + @SuppressWarnings("unchecked") + private static boolean recursionWithResult(String text, int index, Map child, StringBuilder result) { + if (index == text.length()) { + return true; + } + Character c = text.charAt(index); + child = (Map) child.get(c); + if (child == null) { + return true; + } + if (child.containsKey(CHARACTER_END)) { + result.append(c); + return false; + } + return recursionWithResult(text, ++index, child, result.append(c)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/oauth2/OAuth2Utils.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/oauth2/OAuth2Utils.java new file mode 100644 index 0000000..4bdfbf5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/oauth2/OAuth2Utils.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.util.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.common.util.http.HttpUtils; +import com.jojubanking.boot.framework.security.core.util.SecurityFrameworkUtils; + +import java.util.*; + +/** + * OAuth2 相关的工具类 + * + * @author TW + */ +public class OAuth2Utils { + + /** + * 构建授权码模式下,重定向的 URI + * + * copy from Spring Security OAuth2 的 AuthorizationEndpoint 类的 getSuccessfulRedirect 方法 + * + * @param redirectUri 重定向 URI + * @param authorizationCode 授权码 + * @param state 状态 + * @return 授权码模式下的重定向 URI + */ + public static String buildAuthorizationCodeRedirectUri(String redirectUri, String authorizationCode, String state) { + Map query = new LinkedHashMap<>(); + query.put("code", authorizationCode); + if (state != null) { + query.put("state", state); + } + return HttpUtils.append(redirectUri, query, null, false); + } + + /** + * 构建简化模式下,重定向的 URI + * + * copy from Spring Security OAuth2 的 AuthorizationEndpoint 类的 appendAccessToken 方法 + * + * @param redirectUri 重定向 URI + * @param accessToken 访问令牌 + * @param state 状态 + * @param expireTime 过期时间 + * @param scopes 授权范围 + * @param additionalInformation 附加信息 + * @return 简化授权模式下的重定向 URI + */ + public static String buildImplicitRedirectUri(String redirectUri, String accessToken, String state, Date expireTime, + Collection scopes, Map additionalInformation) { + Map vars = new LinkedHashMap(); + Map keys = new HashMap(); + vars.put("access_token", accessToken); + vars.put("token_type", SecurityFrameworkUtils.AUTHORIZATION_BEARER.toLowerCase()); + if (state != null) { + vars.put("state", state); + } + if (expireTime != null) { + vars.put("expires_in", getExpiresIn(expireTime)); + } + if (CollUtil.isNotEmpty(scopes)) { + vars.put("scope", buildScopeStr(scopes)); + } + if (CollUtil.isNotEmpty(additionalInformation)) { + for (String key : additionalInformation.keySet()) { + Object value = additionalInformation.get(key); + if (value != null) { + keys.put("extra_" + key, key); + vars.put("extra_" + key, value); + } + } + } + // Do not include the refresh token (even if there is one) + return HttpUtils.append(redirectUri, vars, keys, true); + } + + public static String buildUnsuccessfulRedirect(String redirectUri, String responseType, String state, + String error, String description) { + Map query = new LinkedHashMap(); + query.put("error", error); + query.put("error_description", description); + if (state != null) { + query.put("state", state); + } + return HttpUtils.append(redirectUri, query, null, !responseType.contains("code")); + } + + public static long getExpiresIn(Date expireTime) { + return (expireTime.getTime() - System.currentTimeMillis()) / 1000; + } + + public static String buildScopeStr(Collection scopes) { + return CollUtil.join(scopes, " "); + } + + public static List buildScopes(String scope) { + return StrUtil.split(scope, ' '); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/package-info.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/package-info.java new file mode 100644 index 0000000..83f50ac --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/package-info.java @@ -0,0 +1,4 @@ +/** + * 每个模块的 util 包,放专属当前模块的 Utils 工具类 + */ +package com.jojubanking.boot.module.system.util; diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/AgeCalculator.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/AgeCalculator.java new file mode 100644 index 0000000..c840c8f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/AgeCalculator.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system.util.xytj; + +import java.time.LocalDate; +import java.time.Period; + +public class AgeCalculator { + private String birthDate; + + public AgeCalculator(String birthDate) { + this.birthDate = birthDate; + } + + public int calculateAge() { + // 解析出生日期字符串为LocalDate对象 + LocalDate birthDate = LocalDate.parse(this.birthDate); + + // 计算年龄 + LocalDate currentDate = LocalDate.now(); + Period period = Period.between(birthDate, currentDate); + + return period.getYears(); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/BarCodeUtils.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/BarCodeUtils.java new file mode 100644 index 0000000..10fbe49 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/BarCodeUtils.java @@ -0,0 +1,177 @@ +package com.jojubanking.boot.module.system.util.xytj; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.oned.Code128Writer; +import org.apache.commons.lang3.StringUtils; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +/** + * + * 条形码+文字 生成 + * @author terry + * @version v1.0 + * @since 2024/1/29 11:43 + */ +public class BarCodeUtils { + + /** 条形码宽度 */ + private static final int WIDTH = 300; + + /** 条形码高度 */ + private static final int HEIGHT = 50; + + /** 加文字 条形码 */ + private static final int WORDHEIGHT = 75; + + /** + * 设置 条形码参数 + */ + private static Map hints = new HashMap() { + private static final long serialVersionUID = 1L; + { + // 设置编码方式 + put(EncodeHintType.CHARACTER_SET, "utf-8"); + } + }; + + /** + * 生成 图片缓冲 + * @author fxbin + * @param vaNumber VA 码 + * @return 返回BufferedImage + */ + public static BufferedImage getBarCode(String vaNumber) throws WriterException { + Code128Writer writer = new Code128Writer(); + MultiFormatWriter wr = new MultiFormatWriter(); + + //二维码图片大小 + int size = 200; + + // 编码内容, 编码类型, 宽度, 高度, 设置参数 + BitMatrix bitMatrix = wr.encode(vaNumber, BarcodeFormat.CODE_128, WIDTH, HEIGHT, hints); + //自定义白边边框宽度 + int margin = 5; + //生成新的bitMatrix + bitMatrix = updateBit(bitMatrix, margin); + //因为二维码生成时,白边无法控制,去掉原有的白边,再添加自定义白边后,二维码大小与size大小就存在差异了, + //为了让新生成的二维码大小还是size大小,根据size重新生成图片 + BufferedImage bi = MatrixToImageWriter.toBufferedImage(bitMatrix); + //根据size放大、缩小生成的二维码 + bi = zoomInImage(bi,WIDTH,HEIGHT); + return bi; + // return MatrixToImageWriter.toBufferedImage(bitMatrix); + } + + /** + * 把带logo的二维码下面加上文字 + * @author fxbin + * @param image 条形码图片 + * @param words 文字 + * @return 返回BufferedImage + */ + public static BufferedImage insertWords(BufferedImage image, String words){ + // 新的图片,把带logo的二维码下面加上文字 + if (StringUtils.isNotEmpty(words)) { + + BufferedImage outImage = new BufferedImage(WIDTH, WORDHEIGHT, BufferedImage.TYPE_INT_RGB); + + Graphics2D g2d = outImage.createGraphics(); + + // 抗锯齿 + setGraphics2D(g2d); + // 设置白色 + setColorWhite(g2d); + + // 画条形码到新的面板 + g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null); + + // 画文字到新的面板 + Color color=new Color(0, 0, 0); + g2d.setColor(color); + // 字体、字型、字号 + g2d.setFont(new Font("微软雅黑", Font.PLAIN, 18)); + //文字长度 + int strWidth = g2d.getFontMetrics().stringWidth(words); + //总长度减去文字长度的一半 (居中显示) + int wordStartX=(WIDTH - strWidth) / 2; + //height + (outImage.getHeight() - height) / 2 + 12 + int wordStartY=HEIGHT+20; + + // 画文字 + g2d.drawString(words, wordStartX, wordStartY); + g2d.dispose(); + outImage.flush(); + return outImage; + } + return null; + } + + /** + * 设置 Graphics2D 属性 (抗锯齿) + * @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制 + */ + private static void setGraphics2D(Graphics2D g2d){ + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); + Stroke s = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER); + g2d.setStroke(s); + } + + /** + * 设置背景为白色 + * @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制 + */ + private static void setColorWhite(Graphics2D g2d){ + g2d.setColor(Color.WHITE); + //填充整个屏幕 + g2d.fillRect(0,0,600,600); + //设置笔刷 + g2d.setColor(Color.BLACK); + } + + /** + *因为二维码边框设置那里不起作用,不管设置多少,都会生成白边,所以根据网上 + *的例子进行修改,自定义控制白边宽度,该方法生成自定义白边框后的bitMatrix; + */ + private static BitMatrix updateBit(BitMatrix matrix, int margin){ + int tempM = margin*2; + //获取二维码图案的属性 + int[] rec = matrix.getEnclosingRectangle(); + int resWidth = rec[2] + tempM; + int resHeight = rec[3] + tempM; + // 按照自定义边框生成新的BitMatrix + BitMatrix resMatrix = new BitMatrix(resWidth, resHeight); + resMatrix.clear(); + //循环,将二维码图案绘制到新的bitMatrix中 + for(int i= margin; i < resWidth- margin; i++){ + for(int j=margin; j < resHeight-margin; j++){ + if(matrix.get(i-margin + rec[0], j-margin + rec[1])){ + resMatrix.set(i,j); + } + } + } + return resMatrix; + } + /** + * 图片放大缩小 + */ + public static BufferedImage zoomInImage(BufferedImage originalImage, int width, int height) { + BufferedImage newImage = new BufferedImage(width, height, originalImage.getType()); + Graphics g = newImage.getGraphics(); + g.drawImage(originalImage, 0, 0, width, height, null); + g.dispose(); + return newImage; + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/DateDUtil.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/DateDUtil.java new file mode 100644 index 0000000..7f2442f --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/DateDUtil.java @@ -0,0 +1,336 @@ +package com.jojubanking.boot.module.system.util.xytj; + + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +public class DateDUtil { + + + public static String yyyy_MM_dd = "yyyy-MM-dd"; + public static String yyyyMMdd = "yyyyMMdd"; + public static String yyyyMM = "yyyyMM"; + public static String yyyy_MM = "yyyy-MM"; + public static String yyyy_MM_dd_HH_00 = "yyyy-MM-dd HH:00"; + public static String yyyy_MM_dd_HH_mm = "yyyy-MM-dd HH:mm"; + public static String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss"; + public static String yyyy_MM_dd_HH_mm_ss_SS = "yyyy-MM-dd HH:mm:ss.SS"; + public static String yyyyMMddHHmm = "yyyyMMddHHmm"; + public static String yyyyMMddHHmmss = "yyyyMMddHHmmss"; + public static String yyyyMMddHHmmssSS = "yyyyMMddHHmmssSS"; + public static String yyMMdd = "yyMMdd"; + public static String yyyy_MM_dd_00_00 = "yyyy-MM-dd 00:00"; + + /** + * 将字符串时间改成Date类型 + * @param format + * @param dateStr + * @return + */ + public static Date strToDate(String format,String dateStr) { + + Date date = null; + + try { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); + date = simpleDateFormat.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + } + + return date; + } + + + /** + * 将Date时间转成字符串 + * @param format + * @param date + * @return + */ + public static String DateToStrPlus(String format,Date date){ + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); + + return simpleDateFormat.format(date); + } + + + + /** + * 获取2个字符日期的天数差 + * @param p_startDate + * @param p_endDate + * @return 天数差 + */ + public static long getDaysOfTowDiffDate( String p_startDate, String p_endDate ){ + + Date l_startDate = DateDUtil.strToDate(DateDUtil.yyyy_MM_dd, p_startDate); + Date l_endDate = DateDUtil.strToDate(DateDUtil.yyyy_MM_dd, p_endDate); + long l_startTime = l_startDate.getTime(); + long l_endTime = l_endDate.getTime(); + long betweenDays = (long) ( ( l_endTime - l_startTime ) / ( 1000 * 60 * 60 * 24 ) ); + return betweenDays; + } + + + /** + * 获取2个字符日期的天数差 + * @param l_startDate + * @param l_endDate + * @return 天数差 + */ + public static long getDaysOfTowDiffDate( Date l_startDate, Date l_endDate ){ + + long l_startTime = l_startDate.getTime(); + long l_endTime = l_endDate.getTime(); + long betweenDays = (long) ( ( l_endTime - l_startTime ) / ( 1000 * 60 * 60 * 24 ) ); + return betweenDays; + } + + + /** + * 给出日期添加一段时间后的日期 + * @param dateStr + * @param plus + * @return + */ + public static String getPlusDays(String format,String dateStr,long plus){ + + Date date = DateDUtil.strToDate(format, dateStr); + + long time = date.getTime()+ plus*24*60*60*1000; + + + return DateDUtil.DateToStrPlus(format,new Date(time)); + } + + + /** + * 给出日期添加一段时间后的日期 + * @param format + * @param date + * @param plus + * @return + */ + public static String getPlusDays(String format,Date date,long plus){ + + + long time = date.getTime()+ plus*24*60*60*1000; + + + return DateDUtil.DateToStrPlus(format,new Date(time)); + } + + /** + * 给出日期添加一段时间前的日期 + * @param format + * @param date + * @param forth + * @return + */ + public static String getForthDays(String format,Date date,long forth){ + + + long time = date.getTime()- forth*24*60*60*1000; + + + return DateDUtil.DateToStrPlus(format,new Date(time)); + } + + /** + * 给出时间添加几个小时后的时间 + * @param format + * @param dateStr + * @param plus + * @return + */ + public static String getPlusHours(String format,String dateStr,long plus){ + + Date date = DateDUtil.strToDate(format, dateStr); + + long time = date.getTime()+ plus*60*60*1000; + + + return DateDUtil.DateToStrPlus(format,new Date(time)); + } + + /** + * 给出时间添加几个分钟后的时间 + * @param format + * @param dateStr + * @param plus + * @return + */ + public static String getPlusMinutes(String format,String dateStr,long plus){ + + Date date = DateDUtil.strToDate(format, dateStr); + + long time = date.getTime()+ plus*60*1000; + + + return DateDUtil.DateToStrPlus(format,new Date(time)); + } + + /** + * 得到当前时间,格式如:yyyy-MM-dd HH:mm:ss:SS + * @return + */ + public static String getCurrentTime(){ + + String nowTime = DateDUtil.DateToStrPlus(DateDUtil.yyyy_MM_dd_HH_mm_ss_SS, new Date()); + return nowTime; + } + + /** + * 得到当前时间,格式如:yyyy-MM-dd HH:mm:ss + * @return + */ + public static String getTheCurrentTime(){ + + String nowTime = DateDUtil.DateToStrPlus(DateDUtil.yyyy_MM_dd_HH_mm_ss, new Date()); + return nowTime; + } + + /** + * 得到当前日期,格式如:yyyyMMdd + * @return + */ + public static String getCurrentDate(){ + + String nowDate = DateDUtil.DateToStrPlus(DateDUtil.yyyyMMdd, new Date()); + return nowDate; + } + + public static String getCurrentDateTime(){ + + String nowDate = DateDUtil.DateToStrPlus(DateDUtil.yyyyMMddHHmmss, new Date()); + return nowDate; + } + + /** + * 得到当前日期,格式如:yyyyMMdd + * @return + */ + public static String getCurrentDate(String format){ + + String nowDate = DateDUtil.DateToStrPlus(format, new Date()); + return nowDate; + } + + /** + * 获取2个字符日期的分钟数差 + * @param p_startDate + * @param p_endDate + * @return 相差的分钟 + */ + public static long getMinutesOfTowDiffDate(String p_startDate, String p_endDate ){ + + Date l_startDate = DateDUtil.strToDate(DateDUtil.yyyy_MM_dd_HH_mm_ss_SS, p_startDate); + Date l_endDate = DateDUtil.strToDate(DateDUtil.yyyy_MM_dd_HH_mm_ss_SS, p_endDate); + long l_startTime = l_startDate.getTime(); + long l_endTime = l_endDate.getTime(); + long betweenMinutes = (long) ( ( l_endTime - l_startTime ) / ( 1000 * 60) ); + return betweenMinutes; + } + + /** + * 获取2个字符日期的分钟数差 + * @param p_startDate + * @param p_endDate + * @return 相差的分钟 + */ + public static long getMinutesOfTowDiffDateMin(String format,String p_startDate, String p_endDate ){ + + Date l_startDate = DateDUtil.strToDate(format, p_startDate); + Date l_endDate = DateDUtil.strToDate(format, p_endDate); + long l_startTime = l_startDate.getTime(); + long l_endTime = l_endDate.getTime(); + long betweenMinutes = (long) ( ( l_endTime - l_startTime ) / ( 1000 * 60) ); + return betweenMinutes; + } + public static long getMonthIntervalOfTowDiffDate(String p_startMonth, String p_endMonth){ + + Date l_startDate = DateDUtil.strToDate(DateDUtil.yyyy_MM, p_startMonth); + Date l_endDate = DateDUtil.strToDate(DateDUtil.yyyy_MM, p_endMonth); + + + Calendar calender = Calendar.getInstance(); + calender.setTime(l_startDate); + + long l_startMonth = calender.get(Calendar.MONTH)+1; + long l_startYear = calender.get(Calendar.YEAR); + + calender.setTime(l_endDate); + + long l_endMonth =calender.get(Calendar.MONTH)+1; + long l_endYear = calender.get(Calendar.YEAR); + + long betweenYear = l_endYear - l_startYear; + long betweenMonth = (long) ( l_endMonth - l_startMonth ) ; + + return betweenYear * 12 + betweenMonth; + } + + /** + * 将字符串日期转为cron表达式 + */ + public static String getCron(String execute_time) throws Exception{ + + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(yyyy_MM_dd_HH_mm_ss); + Date date = simpleDateFormat.parse(execute_time); + SimpleDateFormat dateFormat = new SimpleDateFormat("ss mm HH dd MM ? yyyy"); + return dateFormat.format(date); + } + /** + * 获取当前年月日日期 + */ + + public static String getCDate(){ + Calendar now = Calendar.getInstance(); + String year=now.get(Calendar.YEAR)+""; + String month=(now.get(Calendar.MONTH) + 1) + ""; + String day=now.get(Calendar.DAY_OF_MONTH)+""; + if ((now.get(Calendar.MONTH) + 1) < 10) month = "0" + month; + if (now.get(Calendar.DAY_OF_MONTH) < 10) day= "0" + day; + String nowDate = year+"年"+month+"月"+day+"日"; + return nowDate; + } + + public static List findWeekDays(String week) { + List list = new ArrayList(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Calendar c = Calendar.getInstance(); + // 今天是一周中的第几天 + int dayOfWeek = c.get(Calendar.DAY_OF_WEEK); + + if (c.getFirstDayOfWeek() == Calendar.SUNDAY) { + c.add(Calendar.DAY_OF_MONTH, 1); + } + + if("lastWeek".equals(week)){ + dayOfWeek = -dayOfWeek-7; + }else if("thisWeek".equals(week)){ + dayOfWeek = -dayOfWeek; + }else if("nextWeek".equals(week)){ + dayOfWeek = -dayOfWeek+7; + } + // 计算一周开始的日期 + c.add(Calendar.DAY_OF_MONTH, dayOfWeek); + + for (int i = 1; i <= 7; i++) { + c.add(Calendar.DAY_OF_MONTH, 1); + list.add(sdf.format(c.getTime())); + } + return list; + } + + public static void main(String[] args) { + System.out.println("111"); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/EncryptUtil.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/EncryptUtil.java new file mode 100644 index 0000000..2c909ef --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/EncryptUtil.java @@ -0,0 +1,69 @@ +package com.jojubanking.boot.module.system.util.xytj; + + +import org.apache.commons.codec.binary.Base64; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class EncryptUtil { + + // AES ecb模式解密 key:秘钥 initVector:偏移量 encrypted:加密内容 + public static String decrypt(String key,String initVector,String encrypted) { + try { + IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8")); + SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); + cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); + byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted)); + + return new String(original); + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + + public static void main(String[] args) throws Exception { + System.out.println(decrypt("a6xdabhysfescfbu","encryptionIntVec","oYzamqnnyJ8GG6646PDYBQ==")); + } + + public static String getSHA256Str(String str){ + MessageDigest messageDigest; + String encodeStr = ""; + try { + messageDigest = MessageDigest.getInstance("SHA-256"); + messageDigest.update(str.getBytes("UTF-8")); + encodeStr = byte2Hex(messageDigest.digest()); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return encodeStr; + } + /** + * 将byte转为16进制 + * @param bytes + * @return + */ + private static String byte2Hex(byte[] bytes){ + StringBuffer stringBuffer = new StringBuffer(); + String temp = null; + for (int i=0;i map){ + public static String doPost(String url, Object param){ + String charset = "utf-8"; + HttpClient httpClient = null; + HttpPost httpPost = null; + String result = null; + try{ + httpClient = new DefaultHttpClient(); + httpPost = new HttpPost(url); + httpPost.setHeader("Content-Type", "application/json;charset=UTF-8"); + + httpPost.setConfig(requestConfig); + String parameter = JSON.toJSONString(param); + + StringEntity se = null; + System.out.println(parameter); + se = new StringEntity(parameter, "utf-8"); + se.setContentType(CONTENT_TYPE_TEXT_JSON); + se.setContentEncoding("utf-8"); + httpPost.setEntity(se); + + HttpResponse response = httpClient.execute(httpPost); + if(response != null){ + HttpEntity resEntity = response.getEntity(); + if(resEntity != null){ + result = EntityUtils.toString(resEntity,charset); + } + } + }catch(Exception ex){ + ex.printStackTrace(); + }finally{ + httpClient.getConnectionManager().shutdown(); + } + return result; + } + + @SuppressWarnings("resource") + public static String doGet(String url, Map map){ + String charset = "utf-8"; + HttpClient httpClient = null; + HttpGet httpPost = null; + String result = null; + try{ + httpClient = new DefaultHttpClient(); + List list = new ArrayList(); + if (map!=null) { + Iterator> iterator = map.entrySet().iterator(); + while(iterator.hasNext()){ + Entry elem = iterator.next(); + list.add(new BasicNameValuePair(elem.getKey(),elem.getValue())); + } + } + if(list.size() > 0){ + String paramString = URLEncodedUtils.format(list, HTTP.UTF_8); + url = url +"?"+ paramString; + } + httpPost = new HttpGet(url); + HttpResponse response = httpClient.execute(httpPost); + if(response != null){ + HttpEntity resEntity = response.getEntity(); + if(resEntity != null){ + result = EntityUtils.toString(resEntity,charset); + } + } + }catch(Exception ex){ + ex.printStackTrace(); + } + return result; + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/IDCardParser.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/IDCardParser.java new file mode 100644 index 0000000..d9dedd8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/IDCardParser.java @@ -0,0 +1,60 @@ +package com.jojubanking.boot.module.system.util.xytj; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class IDCardParser { + private String idCardNumber; + private String birthDate; + private int gender; + + public IDCardParser(String idCardNumber) { + this.idCardNumber = idCardNumber; + } + + public void parse() { + // 定义身份证号码的正则表达式 + String regex = "^\\d{17}(\\d{1}|[Xx])$"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(idCardNumber); + + // 如果身份证号码格式匹配 + if (matcher.matches()) { + // 提取出生日期和性别信息 + String birthDatePart = idCardNumber.substring(6, 14); + this.birthDate = formatDate(birthDatePart); + this.gender = getGender(idCardNumber); + } else { + System.out.println("身份证号码格式不正确!"); + } + } + + private String formatDate(String datePart) { + // 格式化日期字符串为年月日格式 + String year = datePart.substring(0, 4); + String month = datePart.substring(4, 6); + String day = datePart.substring(6, 8); + + return year + "-" + month + "-" + day; + } + + private int getGender(String idCardNumber) { + // 获取倒数第二位的数字 + int genderDigit = Integer.parseInt(idCardNumber.substring(16, 17)); + + // 判断奇偶性别 + if (genderDigit % 2 == 0) { + return 2; //2 女 + } else { + return 1; //1 男 + } + } + + public String getBirthDate() { + return birthDate; + } + + public int getGender() { + return gender; + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/MD5Util.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/MD5Util.java new file mode 100644 index 0000000..3cff118 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/MD5Util.java @@ -0,0 +1,47 @@ +package com.jojubanking.boot.module.system.util.xytj; + + +import java.security.MessageDigest; + +public class MD5Util { + public static void main(String[] args) { + System.out.println(MD5Encode("123456s","UTF-8")); + } + + private static String byteArrayToHexString(byte b[]) { + StringBuffer resultSb = new StringBuffer(); + for (int i = 0; i < b.length; i++) + resultSb.append(byteToHexString(b[i])); + + return resultSb.toString(); + } + + private static String byteToHexString(byte b) { + int n = b; + if (n < 0) + n += 256; + int d1 = n / 16; + int d2 = n % 16; + return hexDigits[d1] + hexDigits[d2]; + } + + public static String MD5Encode(String origin, String charsetname) { + String resultString = null; + try { + resultString = new String(origin); + MessageDigest md = MessageDigest.getInstance("MD5"); + if (charsetname == null || "".equals(charsetname)) + resultString = byteArrayToHexString(md.digest(resultString + .getBytes())); + else + resultString = byteArrayToHexString(md.digest(resultString + .getBytes(charsetname))); + } catch (Exception exception) { + } + return resultString; + } + + private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/SoapUtil.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/SoapUtil.java new file mode 100644 index 0000000..299f761 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/SoapUtil.java @@ -0,0 +1,65 @@ +package com.jojubanking.boot.module.system.util.xytj; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.methods.PostMethod; + +import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.TJ_SYSTEM_ERROR; + +/** + * 访问远程SOAP Web Service 协议接口 + */ +public class SoapUtil { + //外网测试地址 +// private static String url = "http://222.128.90.115:8010/BtGhYytWebService.asmx"; + //测试库地址 +// private static String url = "http://192.168.150.17:8002/BtGhYytWebService.asmx"; + + //生成库地址 + private static String url = "http://192.168.150.15:8001/BtGhYytWebService.asmx"; + + /** + * @param xml + * @return + * @throws Exception + */ + public static String soapMethod(String xml) throws Exception { + HttpClient client = new HttpClient(); + PostMethod method = new PostMethod(url); + // 设置请求头头 + method.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); + // 设置请求体 + method.setRequestBody(xml); + // 获取响应状态码 + int code = client.executeMethod(method); + if (code == 200) { + return method.getResponseBodyAsString(); + } else { + throw exception(TJ_SYSTEM_ERROR); + } + } + + /** + * 定时任务发送请求 + * + * @param xml + * @return + * @throws Exception + */ + public static String taskSoapMethod(String xml) throws Exception { + HttpClient client = new HttpClient(); + PostMethod method = new PostMethod(url); + // 设置请求头头 + method.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); + // 设置请求体 + method.setRequestBody(xml); + // 获取响应状态码 + int code = client.executeMethod(method); + if (code == 200) { + return method.getResponseBodyAsString(); + } else { + return ""; + } + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/StringDUtil.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/StringDUtil.java new file mode 100644 index 0000000..bd35cd5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/StringDUtil.java @@ -0,0 +1,429 @@ +package com.jojubanking.boot.module.system.util.xytj; + + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.regex.Pattern; + +public class StringDUtil { + + /** + * 去掉给定字符串前和后的空格,返回干净的字符串 + * @param args + * @return String + */ + public static String removeSpaces(Object args) { + + String argsStr = changeNullToEmpty(args); + if(args!=null){ + args = argsStr.trim(); + while (argsStr.startsWith(" ")) { + argsStr = argsStr.substring(1, argsStr.length()).trim(); + } + while (argsStr.endsWith(" ")) { + argsStr = argsStr.substring(0, argsStr.length() - 1).trim(); + } + }else{ + argsStr = ""; + } + + return argsStr; + } + + + /** + * 转全角的函数 + * @param + * @return String + */ + public static String toSBC(String input) { + //半角转全角: + char[] c = input.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (c[i] == 32) { + c[i] = (char) 12288; + continue; + } + if (c[i] < 127) { + c[i] = (char) (c[i] + 65248); + } + } + return new String(c); + } + + + /** + * 转半角的函数 + * @param + * @return String + */ + public static String toDBC(String input) { + char[] c = input.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (c[i] == 12288) { + c[i] = (char) 32; + continue; + } + if (c[i] > 65280 && c[i] < 65375){ + c[i] = (char) (c[i] - 65248); + } + } + return new String(c); + } + + + /** + * 为每添加一个元素前面增加指定的分隔 除第一个元素之外 + * @param + * @param appStr + * @param compart + * @return + */ + public static StringBuffer appendElement(StringBuffer strB,String appStr,String compart){ + + //当出入参数为NULL时 + if(strB == null){ + return new StringBuffer(appStr); + } + + //当没有元素时直接添加追加元素 否则先添加分隔符 + if(strB.length() == 0){ + strB.append(appStr); + }else{ + strB.append(compart); + strB.append(appStr); + } + + return strB; + } + + + /** + * 移除元素 + * @param + * @param moveStr + * @param compart + * @return + */ + public static StringBuffer moveElement(StringBuffer strB,String moveStr,String compart){ + + //当出入参数为NULL时 + if(strB == null){ + return strB; + } + + StringBuffer newStrB = new StringBuffer(); + + String[] strArray = strB.toString().split(compart); + for(int i=0;i 0 && begin != -1 && end == -1){ + end = i; + } + + + //如果已经找到中文的开始 但直到最后也没找到中文的结束,则将字符的结束位当成中文的截止位 + if(begin != -1 && i == srcLength - 1){ + end = i; + } + + + //将中文提取出来 + if(begin != -1 && end != -1){ + + + int tempLength = end-begin+1; + if(tempLength % 2 != 0){ + tempLength = tempLength - 1; + } + + + byte[] tempByte = new byte[tempLength]; + System.arraycopy(srcByte, begin, tempByte, 0, tempLength); + + list.add(new String(tempByte)); + + begin = -1; + end = -1; + } + + } + + + //将中文以数组输出 + int size = list.size(); + String[] chineseArray = new String[size]; + for(int i=0;i hm, String fieldString) { + + String[] strArr = fieldString.split(","); + for (int i = 0; i < strArr.length; i++) { + + String key = strArr[i]; + Object obj = hm.get(key); + if(isEmpty(obj)){ + + return key; + } + } + + return ""; + } + + /** + * 判断字符串是否为正整数 + * @param str + * @return + */ + public static boolean isPositiveInteger (String str){ + Pattern pattern = Pattern.compile("^[0-9]*[1-9][0-9]*$"); + return pattern.matcher(str).matches(); + } + + /** + * 判断字符串是否为正整数或正浮点数 + * @param str + * @return + */ + public static boolean isPositiveIntegerOrPositiveFloat (String str){ + Pattern pattern = Pattern.compile("^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"); + return pattern.matcher(str).matches(); + } + + /** + * + * @description 截取字符串 + * @author mczheng + * @created 2016-6-25 下午6:13:29 + * @param str 要截取的字符串 + * @param maxLength 字符长度,英文字符算0.5个长度,当截取剩下最后一位是0.5个长度而最后一个字符是中文时,则舍弃掉。 + * @return + */ + public static String substring(String str, int maxLength) { + if (!hasLength(str)) + return str; + + int subSLength = maxLength * 2; + int tempSubLength = subSLength;//截取字符数 + String subStr = ""; + try { + int strLen = str.getBytes("GBK").length; + if (strLen <= subSLength) return str; + subStr = str.substring(0, str.length() < subSLength ? str.length() : subSLength); //截取的子串 + int subStrByetsL = subStr.getBytes("GBK").length; //截取子串的字节长度 + //说明截取的字符串中包含有汉字 + while (subStrByetsL > tempSubLength) { + int subSLengthTemp = --subSLength; + subStr = str.substring(0, subSLengthTemp > str.length() ? str.length() : subSLengthTemp); + subStrByetsL = subStr.getBytes("GBK").length; + } + subStr += "..."; + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return subStr; + } + + public static boolean hasLength(String str) { + return (str != null) && (str.length() > 0); + } + + public static void main(String[] args) { +// +// StringBuffer str = new StringBuffer("a,c,d,c"); +// str = StringDUtil.moveFirstElement(str, "c", ","); +// System.out.println(str.toString()); +// +// System.out.println(isEmpty("\"null\"")); + System.out.println(StringDUtil.substring("一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十", 15)); + } + + /** + * @description 判断字符串是否有值且值不为空格 + * @author thuang + * @created 2020年1月7日 下午1:09:49 + * @param str + * @return + */ + public static boolean isNotBlank(String str) { + if (str != null && str.length() > 0 && str.trim().length() > 0) { + return true; + } + return false; + } + + public static final String randomInt(int length) { + if (length < 1) { + return null; + } + Random randGen = new Random(); + char[] numbersAndLetters = "0123456789abcdefghijklmnopqrstuvwxyz".toCharArray(); + char[] randBuffer = new char[length]; + for (int i = 0; i < randBuffer.length; i++) { + randBuffer[i] = numbersAndLetters[randGen.nextInt(36)]; + } + return new String(randBuffer); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/StringUtil.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/StringUtil.java new file mode 100644 index 0000000..c1a7735 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/StringUtil.java @@ -0,0 +1,83 @@ +package com.jojubanking.boot.module.system.util.xytj; + +import java.util.List; +import java.util.Map; + +/** + * @Author: Lee CE + * @Description:常用的字符串相关的工具类 + * @Date: 2018/7/12 15:19 + * @Modified: + */ +public final class StringUtil { + + /** + * 判断是否是空字符串 null和"" 都返回 true + * + * @param str 判断的字符串 + * @return 是否有效 + */ + public static boolean isEmpty(String str) { + return str == null || str.equals(""); + } + + /** + * 把string array or list用给定的符号symbol连接成一个字符串 + * + * @param list 需要处理的列表 + * @param symbol 链接的符号 + * @return 处理后的字符串 + */ + public static String joinString(List list, String symbol) { + String result = ""; + if (list != null) { + for (Object o : list) { + String temp = o.toString(); + if (temp.trim().length() > 0) + result += (temp + symbol); + } + if (result.length() > 1) { + result = result.substring(0, result.length() - 1); + } + } + return result; + } + + /** + * @description: null转空处理 + * @param obj + * @return java.lang.String + * @author zmc + * @date 2019-06-10 10:47 + */ + public static String changeNullToEmpty(Object obj) { + if(null == obj) { + return ""; + } + return obj.toString(); + } + + /** + * @description: 字符串去左右空格 + * @param obj + * @return java.lang.String + * @author zmc + * @date 2019-09-10 17:17 + */ + public static String trim(Object obj) { + String str = changeNullToEmpty(obj); + str = str.trim(); + return str; + } + public static String checkKeyword(Map map, String keyword) { + if (!StringUtil.isEmpty(keyword)){ + keyword = keyword.trim(); + if (!keyword.equals("")){ + map.put("keyword", keyword); + return keyword; + } + } + return null; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/VeDate.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/VeDate.java new file mode 100644 index 0000000..21e68d5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/VeDate.java @@ -0,0 +1,555 @@ +package com.jojubanking.boot.module.system.util.xytj; + + +import java.text.ParseException; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.*; + +public class VeDate { + + /** + * 获取七天前的日期 + * + * @return 返回时间类型 yyyy-MM-dd + */ + public static String getSevenDaysAgo() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DATE, -7); + Date Date = cal.getTime(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + String dateString = formatter.format(Date); + return dateString; + } + + + /** + * 获取现在时间 + * + * @return 返回时间类型 yyyy-MM-dd HH:mm:ss + */ + public static Date getNowDate() { + Date currentTime = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateString = formatter.format(currentTime); + System.out.println(dateString); + ParsePosition pos = new ParsePosition(0); + Date currentTime_2 = formatter.parse(dateString, pos); + return currentTime_2; + } + + /** + * 大方式大法师打发 + * 获取现在时间 + * + * @return返回短时间格式 yyyy-MM-dd + */ + public static Date getNowDateShort() { + Date currentTime = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + String dateString = formatter.format(currentTime); + ParsePosition pos = new ParsePosition(8); + Date currentTime_2 = formatter.parse(dateString, pos); + return currentTime_2; + } + + /** + * 获取现在时间 + * + * @return返回字符串格式 yyyy-MM-dd HH:mm:ss + */ + public static String getStringDate() { + Date currentTime = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateString = formatter.format(currentTime); + return dateString; + } + + + /** + * 获取现在时间 + * + * @return 返回短时间字符串格式yyyy-MM-dd + */ + public static String getStringDateShort() { + Date currentTime = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + String dateString = formatter.format(currentTime); + return dateString; + } + + /** + * 获取时间 小时:分;秒 HH:mm:ss + * + * @return + */ + public static String getTimeShort() { + SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); + Date currentTime = new Date(); + String dateString = formatter.format(currentTime); + return dateString; + } + + /** + * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss + * + * @param strDate + * @return + */ + public static Date strToDateLong(String strDate) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + ParsePosition pos = new ParsePosition(0); + Date strtodate = formatter.parse(strDate, pos); + return strtodate; + } + + /** + * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss + * + * @param dateDate + * @return + */ + public static String dateToStrLong(Date dateDate) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateString = formatter.format(dateDate); + return dateString; + } + + /** + * 将短时间格式时间转换为字符串 yyyy-MM-dd + * + * @param dateDate + * @param k + * @return + */ + public static String dateToStr(Date dateDate) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + String dateString = formatter.format(dateDate); + return dateString; + } + + /** + * 将短时间格式字符串转换为时间 yyyy-MM-dd + * + * @param strDate + * @return + */ + public static Date strToDate(String strDate) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + ParsePosition pos = new ParsePosition(0); + Date strtodate = formatter.parse(strDate, pos); + return strtodate; + } + + /** + * 得到现在时间 + * + * @return + */ + public static Date getNow() { + Date currentTime = new Date(); + return currentTime; + } + + /** + * 提取一个月中的最后一天 + * + * @param day + * @return + */ + public static Date getLastDate(long day) { + Date date = new Date(); + long date_3_hm = date.getTime() - 3600000 * 34 * day; + Date date_3_hm_date = new Date(date_3_hm); + return date_3_hm_date; + } + + /** + * 得到现在时间 + * + * @return 字符串 yyyyMMdd HHmmss + */ + public static String getStringToday() { + Date currentTime = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd HHmmss"); + String dateString = formatter.format(currentTime); + return dateString; + } + + /** + * 得到现在小时 + */ + public static String getHour() { + Date currentTime = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateString = formatter.format(currentTime); + String hour; + hour = dateString.substring(11, 13); + return hour; + } + + /** + * 得到现在分钟 + * + * @return + */ + public static String getTime() { + Date currentTime = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateString = formatter.format(currentTime); + String min; + min = dateString.substring(14, 16); + return min; + } + + /** + * 根据用户传入的时间表示格式,返回当前时间的格式 如果是yyyyMMdd,注意字母y不能大写。 + * + * @param sformat yyyyMMddhhmmss + * @return + */ + public static String getUserDate(String sformat) { + Date currentTime = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat(sformat); + String dateString = formatter.format(currentTime); + return dateString; + } + + /** + * 二个小时时间间的差值,必须保证二个时间都是"HH:MM"的格式,返回字符型的分钟 + */ + public static String getTwoHour(String st1, String st2) { + String[] kk = null; + String[] jj = null; + kk = st1.split(":"); + jj = st2.split(":"); + if (Integer.parseInt(kk[0]) < Integer.parseInt(jj[0])) + return "0"; + else { + double y = Double.parseDouble(kk[0]) + Double.parseDouble(kk[1]) / 60; + double u = Double.parseDouble(jj[0]) + Double.parseDouble(jj[1]) / 60; + if ((y - u) > 0) + return y - u + ""; + else + return "0"; + } + } + + /** + * 得到二个日期间的间隔天数 + */ + public static String getTwoDay(String sj1, String sj2) { + SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); + long day = 0; + try { + Date date = myFormatter.parse(sj1); + Date mydate = myFormatter.parse(sj2); + day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000); + } catch (Exception e) { + return ""; + } + return day + ""; + } + + /** + * 时间前推或后推分钟,其中JJ表示分钟. + */ + public static String getPreTime(String sj1, String jj) { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String mydate1 = ""; + try { + Date date1 = format.parse(sj1); + long Time = (date1.getTime() / 1000) + Integer.parseInt(jj) * 60; + date1.setTime(Time * 1000); + mydate1 = format.format(date1); + } catch (Exception e) { + } + return mydate1; + } + + /** + * 得到一个时间延后或前移几天的时间,nowdate为时间,delay为前移或后延的天数 + */ + public static String getNextDay(String nowdate, String delay) { + try { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + String mdate = ""; + Date d = strToDate(nowdate); + long myTime = (d.getTime() / 1000) + Integer.parseInt(delay) * 24 * 60 * 60; + d.setTime(myTime * 1000); + mdate = format.format(d); + return mdate; + } catch (Exception e) { + return ""; + } + } + + /** + * 判断是否润年 + * + * @param ddate + * @return + */ + public static boolean isLeapYear(String ddate) { + + /** + * 详细设计: 1.被400整除是闰年,否则: 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年 + * 3.能被4整除同时能被100整除则不是闰年 + */ + Date d = strToDate(ddate); + GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance(); + gc.setTime(d); + int year = gc.get(Calendar.YEAR); + if ((year % 400) == 0) + return true; + else if ((year % 4) == 0) { + if ((year % 100) == 0) + return false; + else + return true; + } else + return false; + } + + /** + * 返回美国时间格式 26 Apr 2006 + * + * @param str + * @return + */ + public static String getEDate(String str) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + ParsePosition pos = new ParsePosition(0); + Date strtodate = formatter.parse(str, pos); + String j = strtodate.toString(); + String[] k = j.split(" "); + return k[2] + k[1].toUpperCase() + k[5].substring(2, 4); + } + + /** + * 获取一个月的最后一天 + * + * @param dat + * @return + */ + public static String getEndDateOfMonth(String dat) {// yyyy-MM-dd + String str = dat.substring(0, 8); + String month = dat.substring(5, 7); + int mon = Integer.parseInt(month); + if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8 || mon == 10 || mon == 12) { + str += "31"; + } else if (mon == 4 || mon == 6 || mon == 9 || mon == 11) { + str += "30"; + } else { + if (isLeapYear(dat)) { + str += "29"; + } else { + str += "28"; + } + } + return str; + } + + /** + * 判断二个时间是否在同一个周 + * + * @param date1 + * @param date2 + * @return + */ + public static boolean isSameWeekDates(Date date1, Date date2) { + Calendar cal1 = Calendar.getInstance(); + Calendar cal2 = Calendar.getInstance(); + cal1.setTime(date1); + cal2.setTime(date2); + int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR); + if (0 == subYear) { + if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR)) + return true; + } else if (1 == subYear && 11 == cal2.get(Calendar.MONTH)) { + // 如果12月的最后一周横跨来年第一周的话则最后一周即算做来年的第一周 + if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR)) + return true; + } else if (-1 == subYear && 11 == cal1.get(Calendar.MONTH)) { + if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR)) + return true; + } + return false; + } + + /** + * 产生周序列,即得到当前时间所在的年度是第几周 + * + * @return + */ + public static String getSeqWeek() { + Calendar c = Calendar.getInstance(Locale.CHINA); + String week = Integer.toString(c.get(Calendar.WEEK_OF_YEAR)); + if (week.length() == 1) + week = "0" + week; + String year = Integer.toString(c.get(Calendar.YEAR)); + return year + week; + } + + /** + * 获得一个日期所在的周的星期几的日期,如要找出2002年2月3日所在周的星期一是几号 + * + * @param sdate + * @param num + * @return + */ + public static String getWeek(String sdate, String num) { + // 再转换为时间 + Date dd = VeDate.strToDate(sdate); + Calendar c = Calendar.getInstance(); + c.setTime(dd); + if (num.equals("1")) // 返回星期一所在的日期 + c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + else if (num.equals("2")) // 返回星期二所在的日期 + c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY); + else if (num.equals("3")) // 返回星期三所在的日期 + c.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY); + else if (num.equals("4")) // 返回星期四所在的日期 + c.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY); + else if (num.equals("5")) // 返回星期五所在的日期 + c.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); + else if (num.equals("6")) // 返回星期六所在的日期 + c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); + else if (num.equals("0")) // 返回星期日所在的日期 + c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); + return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime()); + } + + /** + * 根据一个日期,返回是星期几的字符串 + * + * @param sdate + * @return + */ + public static String getWeek(String sdate) { + // 再转换为时间 + Date date = VeDate.strToDate(sdate); + Calendar c = Calendar.getInstance(); + c.setTime(date); + // int hour=c.get(Calendar.DAY_OF_WEEK); + // hour中存的就是星期几了,其范围 1~7 + // 1=星期日 7=星期六,其他类推 + return new SimpleDateFormat("EEEE").format(c.getTime()); + } + + public static String getWeekStr(String sdate) { + String str = ""; + str = VeDate.getWeek(sdate); + if ("1".equals(str)) { + str = "星期日"; + } else if ("2".equals(str)) { + str = "星期一"; + } else if ("3".equals(str)) { + str = "星期二"; + } else if ("4".equals(str)) { + str = "星期三"; + } else if ("5".equals(str)) { + str = "星期四"; + } else if ("6".equals(str)) { + str = "星期五"; + } else if ("7".equals(str)) { + str = "星期六"; + } + return str; + } + + /** + * 两个时间之间的天数 + * + * @param date1 + * @param date2 + * @return + */ + public static long getDays(String date1, String date2) { + if (date1 == null || date1.equals("")) + return 0; + if (date2 == null || date2.equals("")) + return 0; + // 转换为标准时间 + SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); + Date date = null; + Date mydate = null; + try { + date = myFormatter.parse(date1); + mydate = myFormatter.parse(date2); + } catch (Exception e) { + } + long day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000); + return day; + } + + /** + * 形成如下的日历 , 根据传入的一个时间返回一个结构 星期日 星期一 星期二 星期三 星期四 星期五 星期六 下面是当月的各个时间 + * 此函数返回该日历第一行星期日所在的日期 + * + * @param sdate + * @return + */ + public static String getNowMonth(String sdate) { + // 取该时间所在月的一号 + sdate = sdate.substring(0, 8) + "01"; + + // 得到这个月的1号是星期几 + Date date = VeDate.strToDate(sdate); + Calendar c = Calendar.getInstance(); + c.setTime(date); + int u = c.get(Calendar.DAY_OF_WEEK); + String newday = VeDate.getNextDay(sdate, (1 - u) + ""); + return newday; + } + + /** + * 取得数据库主键 生成格式为yyyymmddhhmmss+k位随机数 + * + * @param k 表示是取几位随机数,可以自己定 + */ + + public static String getNo(int k) { + return getUserDate("yyyyMMddHHmmss") + getRandom(k); + } + + /** + * 返回一个随机数 + * + * @param i + * @return + */ + public static String getRandom(int i) { + Random jjj = new Random(); + // int suiJiShu = jjj.nextInt(9); + if (i == 0) + return ""; + String jj = ""; + for (int k = 0; k < i; k++) { + jj = jj + jjj.nextInt(9); + } + return jj; + } + + /** + * @param date + */ + public static boolean RightDate(String date) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + ; + if (date == null) + return false; + if (date.length() > 10) { + sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + } else { + sdf = new SimpleDateFormat("yyyy-MM-dd"); + } + try { + sdf.parse(date); + } catch (ParseException pe) { + return false; + } + return true; + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/WSUtil.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/WSUtil.java new file mode 100644 index 0000000..c6fb09a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/WSUtil.java @@ -0,0 +1,1720 @@ +package com.jojubanking.boot.module.system.util.xytj; + + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +//import com.saye.hrs.dto.PatientFeeSettledQuery; +//import com.saye.hrs.dto.Result; +//import com.saye.hrs.vo.FeeInfoVO; +//import com.saye.hrs.vo.FeeSettledInfoVO; +import com.jojubanking.boot.module.system.controller.app.xytjinfo.StatusDefine; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import com.alibaba.fastjson.JSON; +//import com.saye.hrs.commons.date.DateDUtil; +//import com.saye.hrs.model.StatusDefine; + + +public class WSUtil { + + private static final Logger logger = LoggerFactory.getLogger(WSUtil.class); + public static RestTemplate restTemplate = new RestTemplate(); + + //外网生产地址 +// public static String soapUrl = "http://12.0.2.1:10062/KWSService.asmx"; + //内网生产地址 + public static String soapUrl = "http://168.168.0.43:9192/WebService.asmx"; + + //通过39转发的测试地址 +// public static String soapUrl = "http://218.84.202.146:58080/WebService.asmx"; + + static HttpHeaders headers; + static { + headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + } + private static String czyh = "0421"; + /** + * 调用webservice接口 his系统的 + * @param url + * @param tranCode + * @param inputXml + * @return + */ + public static HashMap webserviceRequest(String url, String tranCode, String inputXml) { + logger.info("请求参数----------"+inputXml); + HashMap resultMap=new HashMap<>(); + String errCode="0"; + String errMsg=""; + try { + HttpHeaders headers = new HttpHeaders(); + MediaType type = MediaType.parseMediaType("text/xml;charset=UTF-8"); + // 请求类型ContentType text/xml;charset=UTF-8 + headers.setContentType(type); + + //请求数据体 + StringBuffer soapRequestData = new StringBuffer(""); + soapRequestData.append(""); + soapRequestData.append(""); + soapRequestData.append(""); + soapRequestData.append(""); + soapRequestData.append(""); + + //交易码 + soapRequestData.append(tranCode); + + soapRequestData.append(""); + soapRequestData.append(""); + + //<>符号要转码 + inputXml=inputXml.replaceAll("<","<"); + inputXml=inputXml.replaceAll(">",">"); + + soapRequestData.append(inputXml); + + soapRequestData.append(""); + soapRequestData.append(""); + soapRequestData.append(""); + soapRequestData.append(""); + + // 请求 + HttpEntity request = new HttpEntity(soapRequestData + "", headers); + + // 返回结果 + String str = restTemplate.postForObject(url, request, String.class); + logger.info("返回结果----------"+str); + Document document= DocumentHelper.parseText(str); + Element rootElt = document.getRootElement(); + + //解析 + Iterator body = rootElt.elementIterator("Body"); + Element recordEless = (Element) body.next(); + + Iterator callHisResponse = recordEless.elementIterator("WebBusinessResponse"); + Element hisResponse = (Element) callHisResponse.next(); + + Iterator callHisResult = hisResponse.elementIterator("OutXml"); + Element hisResult = (Element)callHisResult.next(); + + String text = hisResult.getText(); + + resultMap.put("outXml",text); + } catch (Exception e) { + logger.info("返回结果异常----------"+e.toString()); + errCode="999"; + errMsg=e.getMessage(); + } + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + /** + * 调用webservice接口 his系统的 + * @param url + * @param tranCode + * @param inputXml + * @return + */ + public static HashMap webserviceRequestTest(String url, String tranCode, String inputXml) { + logger.info("请求参数----------"+inputXml); + HashMap resultMap=new HashMap<>(); + String errCode="0"; + String errMsg=""; + try { + HttpHeaders headers = new HttpHeaders(); + MediaType type = MediaType.parseMediaType("text/xml;charset=UTF-8"); + // 请求类型ContentType text/xml;charset=UTF-8 + headers.setContentType(type); + + //请求数据体 + StringBuffer soapRequestData = new StringBuffer(""); + soapRequestData.append(""); + soapRequestData.append(""); + soapRequestData.append(""); + soapRequestData.append(""); + soapRequestData.append(""); + + //交易码 + soapRequestData.append(tranCode); + + soapRequestData.append(""); + soapRequestData.append(""); + + //<>符号要转码 + inputXml=inputXml.replaceAll("<","<"); + inputXml=inputXml.replaceAll(">",">"); + + soapRequestData.append(inputXml); + + soapRequestData.append(""); + soapRequestData.append(""); + soapRequestData.append(""); + soapRequestData.append(""); + + // 请求 + HttpEntity request = new HttpEntity(soapRequestData + "", headers); + + // 返回结果 + String str = restTemplate.postForObject(url, request, String.class); + logger.info("返回结果----------"+str); + Document document= DocumentHelper.parseText(str); + Element rootElt = document.getRootElement(); + + //解析 + Iterator body = rootElt.elementIterator("Body"); + Element recordEless = (Element) body.next(); + + Iterator callHisResponse = recordEless.elementIterator("WebBusinessResponse"); + Element hisResponse = (Element) callHisResponse.next(); + + Iterator callHisResult = hisResponse.elementIterator("OutXml"); + Element hisResult = (Element)callHisResult.next(); + + String text = hisResult.getText().replaceAll("\\p{C}", ""); + + resultMap.put("outXml",text); + } catch (Exception e) { + logger.info("返回结果异常----------"+e.toString()); + errCode="999"; + errMsg=e.getMessage(); + } + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + /** 获取患者信息 + * @param + * @return + */ + public static HashMap getPatient(String cardno,String cardtype) throws Exception { + + String errMsg = ""; + List> list = new ArrayList<>();; + String inputXml = "32058246722323220170704000513" + + "01" + + ""+cardno+"" + //卡号 + ""+cardtype+"" + //卡类型 + ""+czyh+""; + HashMap map = webserviceRequestTest(soapUrl,"101",inputXml); +// addHisLog("根据卡号获取患者",inputXml,map.get("outXml")); + String errCode = map.get("errCode"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + String code = codeElm.getText(); + String msg = msgElm.getText(); + + if (!"0".equals(code)){ + errCode=code; + errMsg=msg; + } + + if ("0".equals(code)){ + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + + while (itemIterator.hasNext()){ + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + + Element brztEl = item.element("brzt"); + String brzt = brztEl==null?"":brztEl.getText(); + + Element patidEl = item.element("patid"); + String patid = patidEl==null?"":patidEl.getText(); + + Element cardnoEl = item.element("cardno"); + String cardno1 = cardnoEl==null?"":cardnoEl.getText(); + + Element cardtypeEl = item.element("cardtype"); + String cardtype1 = cardtypeEl==null?"":cardtypeEl.getText(); + + Element pzlxEl = item.element("pzlx"); + String pzlx = pzlxEl==null?"":pzlxEl.getText(); + + Element hzxmEl = item.element("hzxm"); + String hzxm = hzxmEl==null?"":hzxmEl.getText(); + + Element ybdmEl = item.element("ybdm"); + String ybdm = ybdmEl==null?"":ybdmEl.getText(); + + Element sexEl = item.element("sex"); + String sex = sexEl==null?"":sexEl.getText(); + + Element sfzhEl = item.element("sfzh"); + String sfzh = sfzhEl==null?"":sfzhEl.getText(); + + Element lxdzEl = item.element("lxdz"); + String lxdz = lxdzEl==null?"":lxdzEl.getText(); + + Element ghbzEl = item.element("ghbz"); + String ghbz = ghbzEl==null?"":ghbzEl.getText(); + + Element lxdhEl = item.element("lxdh"); + String lxdh = lxdhEl==null?"":lxdhEl.getText(); + + Element zhyeEl = item.element("zhye"); + String zhye = zhyeEl==null?"":zhyeEl.getText(); + + BigDecimal bd = new BigDecimal(zhye); + bd = bd.setScale(2, RoundingMode.HALF_UP); + zhye = bd.toString(); + + Element ispwdEl = item.element("ispwd"); + String ispwd = ispwdEl==null?"":ispwdEl.getText(); + + Element djrqEl = item.element("djrq"); + String djrq = djrqEl==null?"":djrqEl.getText(); + + Element lrrqEl = item.element("lrrq"); + String lrrq = lrrqEl==null?"":lrrqEl.getText(); + + Element gsbzEl = item.element("gsbz"); + String gsbz = gsbzEl==null?"":gsbzEl.getText(); + + Element blhEl = item.element("blh"); + String blh = blhEl==null?"":blhEl.getText(); + + Element birthEl = item.element("birth"); + String birth = birthEl==null?"":birthEl.getText(); + + Element zhbzEl = item.element("zhbz"); + String zhbz = zhbzEl==null?"":zhbzEl.getText(); + + addMap.put("brzt",brzt); + addMap.put("patid",patid); + addMap.put("cardno",cardno1); + addMap.put("cardtype",cardtype1); + addMap.put("pzlx",pzlx); + addMap.put("hzxm",hzxm); + addMap.put("ybdm",ybdm); + addMap.put("sex",sex); + addMap.put("sfzh",sfzh); + addMap.put("lxdz",lxdz); + addMap.put("ghbz",ghbz); + addMap.put("lxdh",lxdh); + addMap.put("zhye",zhye); + addMap.put("ispwd",ispwd); + addMap.put("djrq",djrq); + addMap.put("lrrq",lrrq); + addMap.put("gsbz",gsbz); + addMap.put("blh",blh); + addMap.put("birth",birth); + addMap.put("zhbz",zhbz); + list.add(addMap); + } + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + + /** 获取科室信息 + * @param + * @return + */ + public static HashMap getOffice(String ksrq, String jsrq, String lb) throws DocumentException { + + List> list = null; + String inputXml = "32058246722323220170704000513" + + "01" + + ""+ksrq+"" + //开始日期 + ""+jsrq+"" + //结束日期 + ""+lb+"" + //类别 + ""; + HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","301",inputXml); + addHisLog("获取科室",inputXml,map.get("outXml")); + String errCode = map.get("errCode"); + String errMsg = map.get("errMsg"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + errCode = codeElm.getText(); + errMsg = msgElm.getText(); + + if ("0".equals(errCode)){ + list = new ArrayList<>(); + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + + while (itemIterator.hasNext()){ + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + + Element ksdmEl = item.element("ksdm"); + String ksdm = ksdmEl==null?"":ksdmEl.getText(); + + Element ksmcEl = item.element("ksmc"); + String ksmc = ksmcEl==null?"":ksmcEl.getText(); + + Element ysdmEl = item.element("ysdm"); + String ysdm = ysdmEl==null?"":ysdmEl.getText(); + + Element ysmcEl = item.element("ysmc"); + String ysmc = ysmcEl==null?"":ysmcEl.getText(); + + addMap.put("ksdm",ksdm); + addMap.put("ksmc",ksmc); + addMap.put("ysdm",ysdm); + addMap.put("ysmc",ysmc); + list.add(addMap); + } + /*for(int i=0;i<20;i++) { + HashMap addMap=new HashMap<>(); + addMap.put("ksdm",1); + addMap.put("ksmc","外科"+i); + addMap.put("ysdm",""); + addMap.put("ysmc",""); + list.add(addMap); + }*/ + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + /** 获取某些天科室排班信息 + * @param + * @return + */ + public static HashMap getOfficeSchedule(String ksrq, String jsrq, String lb,String kmdm) throws DocumentException { + + List> list = new ArrayList<>(); + String inputXml = "32058246722323220170704000513" + + "01" + + ""+ksrq+"" + //开始日期 + ""+jsrq+"" + //结束日期 + ""+lb+"" + //类别 + ""+kmdm+"" + //科室代码 + ""; + HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","302",inputXml); + addHisLog("获取科室排班",inputXml,map.get("outXml")); + String errCode = map.get("errCode"); + String errMsg = map.get("errMsg"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + errCode = codeElm.getText(); + errMsg = msgElm.getText(); + + if ("0".equals(errCode)){ + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + + while (itemIterator.hasNext()){ + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + + Element kyysEl = item.element("kyys"); + String kyys = kyysEl==null?"":kyysEl.getText(); + + Element yyzsEl = item.element("yyzs"); + String yyzs = yyzsEl==null?"":yyzsEl.getText(); + + Element pbmxidEl = item.element("pbmxid"); + String pbmxid = pbmxidEl==null?"":pbmxidEl.getText(); + + Element zxrqEl = item.element("zxrq"); + String zxrq = zxrqEl==null?"":zxrqEl.getText(); + + Element kssjEl = item.element("kssj"); + String kssj = kssjEl==null?"":kssjEl.getText(); + + Element jssjEl = item.element("jssj"); + String jssj = jssjEl==null?"":jssjEl.getText(); + + Element weekdayEl = item.element("weekday"); + String weekday = weekdayEl==null?"":weekdayEl.getText(); + + Element ghfEl = item.element("ghf"); + String ghf = ghfEl==null?"":ghfEl.getText(); + + Element zlfEl = item.element("zlf"); + String zlf = zlfEl==null?"":zlfEl.getText(); + + addMap.put("kyys",kyys); + addMap.put("yyzs",yyzs); + addMap.put("pbmxid",pbmxid); + addMap.put("zxrq",zxrq); + addMap.put("kssj",kssj); + addMap.put("jssj",jssj); + addMap.put("weekday",weekday); + addMap.put("ghf",ghf); + addMap.put("zlf",zlf); + String hour = DateDUtil.getCurrentDate("HH:mm"); + String date = DateDUtil.getCurrentDate("yyyyMMdd"); + if(date.equals(zxrq) && jssj.compareTo(hour)>0) { + list.add(addMap); + }else if(!date.equals(zxrq)){ + list.add(addMap); + } + } + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + /** 预约登记 + * @param + * @return + */ + public static HashMap order(String patid, String pbmxid, String yyhx, String sjdjl) throws DocumentException { + + List> list = null; + String inputXml = "32058246722323220170704000513" + + "01" + + ""+patid+"" + //病人唯一码 + ""+pbmxid+"" + //排班明细 id 序号 + ""+czyh+"" + //操作员号 + ""+yyhx+"" + //预约号序类型(0 时间段预约 1 时间点预约) + ""+sjdjl+"" + //时间段(302 交易返回 kssj) + ""; + HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","303",inputXml); + addHisLog("预约",inputXml,map.get("outXml")); + String errCode = map.get("errCode"); + String errMsg = map.get("errMsg"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + String code = codeElm.getText().toString(); + String msg = msgElm.getText().toString(); + + errCode = codeElm.getText(); + errMsg = msgElm.getText(); + + if ("0".equals(errCode)){ + list = new ArrayList<>(); + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + + while (itemIterator.hasNext()){ + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + + Element yyrqEl = item.element("yyrq"); + String yyrq = yyrqEl==null?"":yyrqEl.getText(); + + Element yyhxEl = item.element("yyhx"); + String yyhx1 = yyhxEl==null?"":yyhxEl.getText(); + + Element xhEl = item.element("xh"); + String xh = xhEl==null?"":xhEl.getText(); + + Element sjdEl = item.element("sjd"); + String sjd = sjdEl==null?"":sjdEl.getText(); + + addMap.put("yyrq",yyrq); + addMap.put("yyhx",yyhx1); + addMap.put("xh",xh); + addMap.put("sjd",sjd); + list.add(addMap); + } + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + /** 取消预约 + * @param + * @return + */ + public static HashMap cancelOrder(String yylsh) throws DocumentException { + + List> list = null; + String inputXml = "32058246722323220170704000513" + + "01" + + ""+yylsh+"" + //303返回的预约流水号 + ""; + HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","305",inputXml); + addHisLog("取消预约",inputXml,map.get("outXml")); + String errCode = map.get("errCode"); + String errMsg = map.get("errMsg"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + errCode = codeElm.getText(); + errMsg = msgElm.getText(); + + if ("0".equals(errCode)){ + list = new ArrayList<>(); + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + + while (itemIterator.hasNext()){ + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + + Element yylshEl = item.element("yylsh"); + String yylsh1 = yylshEl==null?"":yylshEl.getText(); + + addMap.put("yylsh",yylsh1); + list.add(addMap); + } + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + /** 获取某人预约登记信息 + * @param + * @return + */ + public static HashMap getOrder(String patid) throws Exception { + + String errMsg = ""; + List> list = new ArrayList<>(); + String inputXml = "32058246722323220170704000513" + + "01" + + ""+patid+"" + //病人唯一码 + ""+czyh+""; + HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","304",inputXml); + addHisLog("预约记录",inputXml,map.get("outXml")); + String errCode = map.get("errCode"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + errCode = codeElm.getText(); + errMsg = msgElm.getText(); + + if ("0".equals(errCode)){ + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + + while (itemIterator.hasNext()){ + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + + Element yyrqEl = item.element("yyrq"); + String yyrq = yyrqEl==null?"":yyrqEl.getText(); + + Element yyxhEl = item.element("yyxh"); + String yyxh = yyxhEl==null?"":yyxhEl.getText(); + + Element yyhxEl = item.element("yyhx"); + String yyhx = yyhxEl==null?"":yyhxEl.getText(); + + Element yylshEl = item.element("yylsh"); + String yylsh = yylshEl==null?"":yylshEl.getText(); + + Element sjdEl = item.element("sjd"); + String sjd = sjdEl==null?"":sjdEl.getText(); + + Element yyksmcEl = item.element("yyksmc"); + String yyksmc = yyksmcEl==null?"":yyksmcEl.getText(); + + Element yyysmcEl = item.element("yyysmc"); + String yyysmc = yyysmcEl==null?"":yyysmcEl.getText(); + + Element yylbEl = item.element("yylb"); + String yylb = yylbEl==null?"":yylbEl.getText(); + + Element ksdmEl = item.element("ksdm"); + String ksdm = ksdmEl==null?"":ksdmEl.getText(); + + Element ysdmEl = item.element("ysdm"); + String ysdm = ysdmEl==null?"":ysdmEl.getText(); + + Element pbmxxhEl = item.element("pbmxxh"); + String pbmxxh = pbmxxhEl==null?"":pbmxxhEl.getText(); + + Element jlztEl = item.element("jlzt"); + String jlzt = jlztEl==null?"":jlztEl.getText(); + + addMap.put("yyrq",yyrq);//预约日期 + addMap.put("yyxh",yyxh);//预约序号 + addMap.put("yyhx",yyhx);//预约号序 + addMap.put("yylsh",yylsh);//预约登记流水号(预约取消时使用) + addMap.put("sjd",sjd);//预约时间段 + addMap.put("yyksmc",yyksmc);//预约科室名称 + addMap.put("yyysmc",yyysmc);//预约医生名称 + addMap.put("yylb",yylb);//预约类别(科室、与家、特需等) + addMap.put("ksdm",ksdm);//科室代码 + addMap.put("ysdm",ysdm);//医生代码 + addMap.put("pbmxxh",pbmxxh); //排班明细序号 + addMap.put("jlzt",jlzt); //预约状态 + list.add(addMap); + } + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + + /** 获取某人检查报告 + * @param + * @return + */ + public static HashMap getInspectReport(String cardno,String ksrq,String jsrq,String repno,String lb,String brlx,String bglx) throws Exception { + + String errMsg = ""; + List> list =new ArrayList<>();; + String inputXml = "32058246722323220170704000513" + + "01" + + ""+cardno+"" + //卡号 + ""+ksrq+"" + //开始日期 + ""+jsrq+"" + //结束日期 + ""+repno+"" + //报告序号@lb=0 该值可为空 @lb=1 该值为必填 + ""+lb+"" + //类别 0 主记录 1 结果明细 + ""+brlx+"" + //1 门诊 2 住院 + ""; + HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","109",inputXml); + addHisLog("检查报告",inputXml,map.get("outXml")); + String errCode = map.get("errCode"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + errCode = codeElm.getText(); + errMsg = msgElm.getText(); + + + if ("0".equals(errCode)){ + + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + if("0".equals(lb)) { //主记录 + while (itemIterator.hasNext()){ + + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + + Element cardnoEl = item.element("cardno"); + String cardno1 = cardnoEl==null?"":cardnoEl.getText(); + + Element hzxmEl = item.element("hzxm"); + String hzxm = hzxmEl==null?"":hzxmEl.getText(); + + Element sexEl = item.element("sex"); + String sex = sexEl==null?"":sexEl.getText(); + + Element ageEl = item.element("age"); + String age = ageEl==null?"":ageEl.getText(); + + Element sjksmcEl = item.element("sjksmc"); + String sjksmc = sjksmcEl==null?"":sjksmcEl.getText(); + + Element HisOrderNameEl = item.element("HisOrderName"); + String HisOrderName = HisOrderNameEl==null?"":HisOrderNameEl.getText(); + + Element jcksmcEl = item.element("jcksmc"); + String jcksmc = jcksmcEl==null?"":jcksmcEl.getText(); + + Element reprqEl = item.element("reprq"); + String reprq = reprqEl==null?"":reprqEl.getText(); + + Element repnoEl = item.element("repno"); + String repno1 = repnoEl==null?"":repnoEl.getText(); + + Element bglxEl = item.element("bglx"); + String bglx1 = bglxEl==null?"":bglxEl.getText(); + + if(bglx.equals(bglx1)) { + addMap.put("cardno",cardno1); + addMap.put("bglx",bglx1); + addMap.put("hzxm",hzxm); + addMap.put("sex",sex); + addMap.put("age",age); + addMap.put("sjksmc",sjksmc); + addMap.put("HisOrderName",HisOrderName); + addMap.put("jcksmc",jcksmc); + addMap.put("reprq",reprq); + addMap.put("repno",repno1); + addMap.put("bglx",bglx1); + list.add(addMap); + } + } + + }else if("1".equals(lb)){ //明细 + while (itemIterator.hasNext()){ + + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + // + Element xmmcEl = item.element("xmmc"); + String xmmc = xmmcEl==null?"":xmmcEl.getText(); + // + Element xmdmEl = item.element("xmdm"); + String xmdm = xmdmEl==null?"":xmdmEl.getText(); + // + Element xmjgEl = item.element("xmjg"); + String xmjg = xmjgEl==null?"":xmjgEl.getText(); + // + Element xmdwEl = item.element("xmdw"); + String xmdw = xmdwEl==null?"":xmdwEl.getText(); + // + Element jgckzEl = item.element("jgckz"); + String jgckz = jgckzEl==null?"":jgckzEl.getText(); + + addMap.put("xmmc",xmmc); + addMap.put("xmdm",xmdm); + addMap.put("xmjg",xmjg); + addMap.put("xmdw",xmdw); + addMap.put("jgckz",jgckz); + list.add(addMap); + } + } + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + /** 获取某人充值记录 + * @param + * @return + */ + public static HashMap getRecharge(String cardno,String cardtype,String kssj,String jssj) throws Exception { + + String errMsg = ""; + List> list = new ArrayList<>();; + String inputXml = "32058246722323220170704000513" + + "01" + + ""+cardno+"" + //卡号 + ""+cardtype+"" + //卡类型:1、磁卡 2、保障卡 3、IC 卡 + ""+kssj+"" + //开始日期 + ""+jssj+"" + //结束日期 + ""; + HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","703",inputXml); + addHisLog("充值记录",inputXml,map.get("outXml")); + String errCode = map.get("errCode"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + String code = codeElm.getText(); + String msg = msgElm.getText(); + + if (!"0".equals(code)){ + errCode=code; + errMsg=msg; + } + + if ("0".equals(code)){ + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + + while (itemIterator.hasNext()){ + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + + Element patidEl = item.element("patid"); + String patid = patidEl==null?"":patidEl.getText(); + + Element cardnoEl = item.element("cardno"); + String cardno1 = cardnoEl==null?"":cardnoEl.getText(); + + Element cardtypeEl = item.element("cardtype"); + String cardtype1 = cardtypeEl==null?"":cardtypeEl.getText(); + + Element hzxmEl = item.element("hzxm"); + String hzxm = hzxmEl==null?"":hzxmEl.getText(); + + Element sexEl = item.element("sex"); + String sex = sexEl==null?"":sexEl.getText(); + + Element jzxhEl = item.element("jzxh"); + String jzxh = jzxhEl==null?"":jzxhEl.getText(); + + Element czlxEl = item.element("czlx"); + String czlx = czlxEl==null?"":czlxEl.getText(); + + Element czyhEl = item.element("czyh"); + String czyh = czyhEl==null?"":czyhEl.getText(); + + Element lrrqEl = item.element("lrrq"); + String lrrq = lrrqEl==null?"":lrrqEl.getText(); + + Element lshEl = item.element("lsh"); + String lsh = lshEl==null?"":lshEl.getText(); + + Element fphEl = item.element("fph"); + String fph = fphEl==null?"":fphEl.getText(); + + Element jyjeEl = item.element("jyje"); + String jyje = jyjeEl==null?"":jyjeEl.getText(); + + BigDecimal bd = new BigDecimal(jyje); + bd = bd.setScale(2, RoundingMode.HALF_UP); + jyje = bd.toString(); + + Element yjyeEl = item.element("yjye"); + String yjye = yjyeEl==null?"":yjyeEl.getText(); + + Element memoEl = item.element("memo"); + String memo = memoEl==null?"":memoEl.getText(); + addMap.put("patid",patid); + addMap.put("cardno",cardno1); + addMap.put("cardtype",cardtype1); + addMap.put("hzxm",hzxm); + addMap.put("sex",sex); + addMap.put("jzxh",jzxh); + addMap.put("czlx",czlx); + addMap.put("czyh",czyh); + addMap.put("lrrq",lrrq); + addMap.put("lsh",lsh); + addMap.put("fph",fph); + addMap.put("jyje",jyje); + addMap.put("yjye",yjye); + addMap.put("memo",memo); + list.add(addMap); + } + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + /** + * @description 获取某人缴费主信息 + */ + public static HashMap getPayList(String patid,String ksrq,String jsrq) throws Exception { + + String errMsg = ""; + List> list =new ArrayList<>();; + String inputXml = "32058246722323220170704000513" + + "01" + + ""+patid+"" + //患者id + ""+ksrq+"" + //开始日期 + ""+jsrq+"" + //结束日期 + ""+czyh+"" + //操作员号 + ""; + HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","606",inputXml); + addHisLog("缴费主信息",inputXml,map.get("outXml")); + String errCode = map.get("errCode"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + errCode = codeElm.getText(); + errMsg = msgElm.getText(); + + + if ("0".equals(errCode)){ + + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + while (itemIterator.hasNext()){ + + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + //预约日期 + Element sjhEl = item.element("sjh"); + String sjh = sjhEl==null?"":sjhEl.getText(); + //预约序号 + Element fphEl = item.element("fph"); + String fph = fphEl==null?"":fphEl.getText(); + //预约号序 + Element sfczyEl = item.element("sfczy"); + String sfczy = sfczyEl==null?"":sfczyEl.getText(); + + Element sfrqEl = item.element("sfrq"); + String sfrq = sfrqEl==null?"":sfrqEl.getText(); + + Element ksmcEl = item.element("ksmc"); + String ksmc = ksmcEl==null?"":ksmcEl.getText(); + + Element brlxEl = item.element("brlx"); + String brlx = brlxEl==null?"":brlxEl.getText(); + + Element fyzeEl = item.element("fyze"); + String fyze = fyzeEl==null?"":fyzeEl.getText(); + + BigDecimal bd = new BigDecimal(fyze); + bd = bd.setScale(2, RoundingMode.HALF_UP); + fyze = bd.toString(); + + Element jlztEl = item.element("jlzt"); + String jlzt = jlztEl==null?"":jlztEl.getText(); + + Element sflbEl = item.element("sflb"); + String sflb = sflbEl==null?"":sflbEl.getText(); + + addMap.put("sjh",sjh); + addMap.put("fph",fph); + addMap.put("sfczy",sfczy); + addMap.put("sfrq",sfrq); + addMap.put("ksmc",ksmc); + addMap.put("brlx",brlx); + addMap.put("fyze",fyze); + addMap.put("jlzt",jlzt); + addMap.put("sflb",sflb); + list.add(addMap); + } + } + } + /*HashMap addMap=new HashMap<>(); + addMap.put("sjh","123457"); + addMap.put("fph","2467213"); + addMap.put("sfczy","01"); + addMap.put("sfrq","20210501"); + addMap.put("ksmc","耳鼻喉科"); + addMap.put("brlx","自费"); + addMap.put("fyze","3.0000"); + addMap.put("jlzt","正常"); + addMap.put("sflb","挂号"); + list.add(addMap);*/ + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + + /** + * @description 获取缴费明细信息 + */ + public static HashMap getPayDetailList(String cxlb,String sjh) throws Exception { + + String errMsg = ""; + List> list =new ArrayList<>();; + String inputXml = "32058246722323220170704000513" + + "01" + + ""+cxlb+"" + //查询类别传 1、按收费项目查询 + ""+sjh+"" + //收据号(604 交易返回 + ""+czyh+"" + //操作员号 + ""; + HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","605",inputXml); + addHisLog("缴费明细信息",inputXml,map.get("outXml")); + String errCode = map.get("errCode"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + errCode = codeElm.getText(); + errMsg = msgElm.getText(); + + + if ("0".equals(errCode)){ + + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + while (itemIterator.hasNext()){ + + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + // + Element cfxhEl = item.element("cfxh"); + String cfxh = cfxhEl==null?"":cfxhEl.getText(); + // + Element cfrqEl = item.element("cfrq"); + String cfrq = cfrqEl==null?"":cfrqEl.getText(); + // + Element xmmcEl = item.element("xmmc"); + String xmmc = xmmcEl==null?"":xmmcEl.getText(); + + Element cfslEl = item.element("cfsl"); + String cfsl = cfslEl==null?"":cfslEl.getText(); + + Element cfdjEl = item.element("cfdj"); + String cfdj = cfdjEl==null?"":cfdjEl.getText(); + + BigDecimal bd = new BigDecimal(cfdj); + + BigDecimal total_price = bd.multiply(new BigDecimal(cfsl)); + String totalPrice = total_price.setScale(2, RoundingMode.HALF_UP).toString(); + + bd = bd.setScale(2, RoundingMode.HALF_UP); + cfdj = bd.toString(); + + Element cfysEl = item.element("cfys"); + String cfys = cfysEl==null?"":cfysEl.getText(); + + Element cfksEl = item.element("cfks"); + String cfks = cfksEl==null?"":cfksEl.getText(); + + Element ypggEl = item.element("ypgg"); + String ypgg = ypggEl==null?"":ypggEl.getText(); + + Element ypdwEl = item.element("ypdw"); + String ypdw = ypdwEl==null?"":ypdwEl.getText(); + + Element czyhEl = item.element("czyh"); + String czyh1 = czyhEl==null?"":czyhEl.getText(); + + + addMap.put("totalPrice",totalPrice); + addMap.put("cfxh",cfxh); + addMap.put("cfrq",cfrq); + addMap.put("xmmc",xmmc); + addMap.put("cfsl",cfsl); + addMap.put("cfdj",cfdj); + addMap.put("cfys",cfys); + addMap.put("cfks",cfks); + addMap.put("ypgg",ypgg); + addMap.put("ypdw",ypdw); + addMap.put("czyh",czyh1); + list.add(addMap); + } + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + /** + * @description 门诊充值 + */ + public static HashMap mzRecharge(String patid, String czje, String czlx, String cardno, + String cardtype,String zzjjylsh, String czlsh, String tradeNo, String outerOrderNo, + String innerOrderNo, String paytype) throws Exception{ + + String errMsg = ""; + List> list =new ArrayList<>();; + String inputXml = "32058246722323220170704000513" + + "01" + + ""+patid+"" + //病人id + ""+czje+"" + //充值金额 + ""+czlx+"" + //1 自助机现金,4 软 POS 戒扫码付 + ""+cardno+"" + //卡号 + ""+cardtype+"" + //卡类型:1、磁卡 2、保障卡 3、IC卡 + ""+czyh+"" + //操作员号 + ""+zzjjylsh+"" + //自助机交易流水号,902 接口返回,非卫宁付可为空 + ""+czlsh+"" + //充值流水号,每次交易必须唯一 + ""+tradeNo+"" + //三方支付流水号 + ""+outerOrderNo+"" + //商户订单号(商户传给支付平台的单据号,卫宁付和 zzjjylsh 相同) + ""+innerOrderNo+"" + //平台订单号 + ""+paytype+"" + //支付方式(卫宁支付平台,8:支付宝 9:微信,其他支付方式如软POS,由 HIS 分配) + ""; + HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","501",inputXml); + addHisLog("充值",inputXml,map.get("outXml")); + String errCode = map.get("errCode"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + errCode = codeElm.getText(); + errMsg = msgElm.getText(); + + + if ("0".equals(errCode)){ + + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + while (itemIterator.hasNext()){ + + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + // + Element lshEl = item.element("lsh"); + String lsh = lshEl==null?"":lshEl.getText(); + // + Element lrrqEl = item.element("lrrq"); + String lrrq = lrrqEl==null?"":lrrqEl.getText(); + // + Element yjyeEl = item.element("yjye"); + String yjye = yjyeEl==null?"":yjyeEl.getText(); + + Element kyjlshEl = item.element("kyjlsh"); + String kyjlsh = kyjlshEl==null?"":kyjlshEl.getText(); + + Element kyjjeEl = item.element("kyjje"); + String kyjje = kyjjeEl==null?"":kyjjeEl.getText(); + + Element kyjzffsEl = item.element("kyjzffs"); + String kyjzffs = kyjzffsEl==null?"":kyjzffsEl.getText(); + + addMap.put("lsh",lsh); + addMap.put("lrrq",lrrq); + addMap.put("yjye",yjye); + addMap.put("kyjlsh",kyjlsh); + addMap.put("kyjje",kyjje); + addMap.put("kyjzffs",kyjzffs); + list.add(addMap); + } + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + /** + * @description 获取住院患者信息 + */ + public static HashMap getZYPatient(String cardno, String cardtype) throws Exception{ + + String errMsg = ""; + List> list =new ArrayList<>();; + String inputXml = "32058246722323220170704000513" + + "01" + + "" + + ""+cardno+"" + //卡号 + ""+cardtype+"" + //卡类型:1、磁卡 2、保障卡 3、IC卡 + ""+czyh+"" + //操作员号 + ""; + HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","804",inputXml); + String errCode = map.get("errCode"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + errCode = codeElm.getText(); + errMsg = msgElm.getText(); + + + if ("0".equals(errCode)){ + + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + while (itemIterator.hasNext()){ + + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + + Element patidEl = item.element("patid"); + String patid = patidEl==null?"":patidEl.getText(); + + Element syxhEl = item.element("syxh"); + String syxh = syxhEl==null?"":syxhEl.getText(); + + Element jsxhEl = item.element("jsxh"); + String jsxh = jsxhEl==null?"":jsxhEl.getText(); + + Element hzxmEl = item.element("hzxm"); + String hzxm = hzxmEl==null?"":hzxmEl.getText(); + + Element sfzhEl = item.element("sfzh"); + String sfzh = sfzhEl==null?"":sfzhEl.getText(); + + Element lxdhEl = item.element("lxdh"); + String lxdh = lxdhEl==null?"":lxdhEl.getText(); + + + addMap.put("patid",patid); + addMap.put("jsxh",jsxh); + addMap.put("syxh",syxh); + addMap.put("hzxm",hzxm); + addMap.put("sfzh",sfzh); + addMap.put("lxdh",lxdh); + list.add(addMap); + } + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + /** + * @description 住院充值 + */ + public static HashMap zyRecharge(String czlx, String syxh, String jsxh, String czje, + String zzjjylsh, String czlsh, String tradeNo, String outerOrderNo, String innerOrderNo, String paytype) throws Exception{ + + String errMsg = ""; + List> list =new ArrayList<>();; + String inputXml = "32058246722323220170704000513" + + "01" + + ""+czlx+"" + //1 自助机现金,4 软 POS 戒扫码付 + ""+syxh+"" + //首页序号 + ""+jsxh+"" + //结算序号 + ""+czje+"" + //充值金额 + ""+czyh+"" + //操作员号 + ""+zzjjylsh+"" + //自助机交易流水号,902 接口返回,非卫宁付可为空 + ""+czlsh+"" + //充值流水号,每次交易必须唯一 + ""+tradeNo+"" + //三方支付流水号 + ""+outerOrderNo+"" + //商户订单号(商户传给支付平台的单据号,卫宁付和 zzjjylsh 相同) + ""+innerOrderNo+"" + //平台订单号 + ""+paytype+"" + //支付方式(卫宁支付平台,8:支付宝 9:微信,其他支付方式如软POS,由 HIS 分配) + ""; + HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","803",inputXml); + String errCode = map.get("errCode"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + errCode = codeElm.getText(); + errMsg = msgElm.getText(); + + + if ("0".equals(errCode)){ + + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + while (itemIterator.hasNext()){ + + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + // + Element lshEl = item.element("lsh"); + String lsh = lshEl==null?"":lshEl.getText(); + // + Element lrrqEl = item.element("lrrq"); + String lrrq = lrrqEl==null?"":lrrqEl.getText(); + // + Element yjyeEl = item.element("yjye"); + String yjye = yjyeEl==null?"":yjyeEl.getText(); + + Element czyhEl = item.element("czyh"); + String czyh1 = czyhEl==null?"":czyhEl.getText(); + + Element zffsEl = item.element("zffs"); + String zffs = zffsEl==null?"":zffsEl.getText(); + + addMap.put("lsh",lsh); + addMap.put("lrrq",lrrq); + addMap.put("yjye",yjye); + addMap.put("czyh",czyh1); + addMap.put("zffs",zffs); + list.add(addMap); + } + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + + public static void addHisLog(String title,String requestContent,String responseContent) { + + HashMap map = new HashMap(); + map.put("title", title); + map.put("requestContent", requestContent); + map.put("responseContent", responseContent); + String url = StatusDefine.IP_PORT+"/api/addHisLog"; + HttpEntity entity = new HttpEntity(JSON.toJSONString(map), headers) ; + ResponseEntity resp =restTemplate.exchange(url, HttpMethod.POST, entity, String.class); + } + + /** 自动开单(下园体检) + * @param + * @return + */ + public static HashMap zdkd(String patid, String ypdm, String lcxmdm, String lcxmbz, + String itemname, String zxks) throws DocumentException { + +// List> list = new ArrayList<>();; + + String inputXml = "32058246722323220170704000513" + + "01" + + ""+ + "" + patid + ""+ //患者唯一信息码 + "" + ypdm + ""+ //收费小项目代码 + "" + lcxmdm + ""+ //临床项目代码 + "" + lcxmbz + ""+ //临床项目标志 + "1"+ //收费项目数量 + "1071"+ //开单科室代码 + ""+ //操作员号 + "0568"+ //医生代码 + "" + zxks + ""+ //执行科室代码 + ""; + HashMap map = webserviceRequestTest(soapUrl,"999",inputXml); + // addHisLog("自动开单",inputXml,map.get("outXml")); + logger.info("inxml:" + inputXml); + logger.info("outXml:" + map.get("outXml")); + + String errCode = map.get("errCode"); + String errMsg = map.get("errMsg"); + if("0".equals(errCode)){ + String outXml = map.get("outXml"); + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + String code = codeElm.getText().toString(); + String msg = msgElm.getText().toString(); + + errCode = codeElm.getText(); + errMsg = msgElm.getText(); + + } + HashMap resultMap = new HashMap(); + if(lcxmbz.equals("1")) { + resultMap.put("xmdm",ypdm); + resultMap.put("itemname", itemname); + }else { + resultMap.put("xmdm",lcxmdm); + resultMap.put("itemname", itemname); + } + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + + /** 建档(患者基本信息登记) + * @param + * @return + */ + public static HashMap addUser(String hzxm, String sfzh, String lxdh, String mzdm) throws DocumentException { + + String sex = sfzh.substring(sfzh.length()-2, sfzh.length()-1); + String birth = sfzh.substring(6, 14); + sex = Integer.valueOf(sex)%2==0?"女":"男"; + + List> list = new ArrayList<>();; + + String inputXml = "32058246722323220170704000513" + + "01" + + ""+ + "" + //病历号 + ""+hzxm+"" + //患者姓名 + "0421" + //操作员号 + "1" + //卡类型 + ""+sfzh+"" + //卡号 + ""+sex+"" + //性别 + ""+sfzh+"" + //身份证号 + ""+birth+"" + //出生年月 + "05" + //医保代码 + "" + //个人编号 + "" + // + "" + // + ""+lxdh+"" + //联系电话 + "" + // + "" + // + "" + // + "" + // + "" + // + "" + // + "" + // + "" + // + "" + // + "" + // + "" + // + "" + // + "" + // + "" + // + "0" + //充值金额 + "" + mzdm + "" + //民族代码 + ""; + HashMap map = webserviceRequestTest(soapUrl,"102",inputXml); + //addHisLog("预约",inputXml,map.get("outXml")); + String errCode = map.get("errCode"); + String errMsg = map.get("errMsg"); + if("0".equals(errCode)){ + String outXml = map.get("outXml").replaceAll("\\p{C}", "");; + Document document= DocumentHelper.parseText(outXml); + + Element rootElt = document.getRootElement(); + + Iterator iterator = rootElt.elementIterator(); + + Element codeElm = (Element) iterator.next(); + Element msgElm = (Element) iterator.next(); + + String code = codeElm.getText().toString(); + String msg = msgElm.getText().toString(); + + if (!"0".equals(code)){ + errCode=code; + errMsg=msg; + } +// errCode = codeElm.getText(); +// errMsg = msgElm.getText(); + if ("0".equals(code)){ + Element Items = (Element) iterator.next(); + + Iterator itemIterator = Items.elementIterator(); + + while (itemIterator.hasNext()){ + HashMap addMap=new HashMap<>(); + Element item = (Element) itemIterator.next(); + + Element patidEl = item.element("patid"); + String patid = patidEl==null?"":patidEl.getText(); + + Element blhEl = item.element("blh"); + String blh = blhEl==null?"":blhEl.getText(); + + Element lrrqEl = item.element("lrrq"); + String lrrq = lrrqEl==null?"":lrrqEl.getText(); + + Element zhyeEl = item.element("zhye"); + String zhye = zhyeEl==null?"":zhyeEl.getText(); + + Element gbfeiEl = item.element("gbfei"); + String gbfei = gbfeiEl==null?"":gbfeiEl.getText(); + + addMap.put("patid",patid); + addMap.put("blh",blh); + addMap.put("lrrq",lrrq); + addMap.put("zhye",zhye); + addMap.put("gbfei",gbfei); + list.add(addMap); + } + } + } + HashMap resultMap = new HashMap(); + resultMap.put("list",list); + resultMap.put("errCode",errCode); + resultMap.put("errMsg",errMsg); + return resultMap; + } + +// +// public static Result> FindPatientFeeSettled(PatientFeeSettledQuery reqDTO) throws Exception { +// +// Result> resultObj=null; +// String errCode="0"; +// String errMsg=""; +// try{ +// List list = new ArrayList<>();; +// String inputXml = "32058246722323220170704000513" + +// "01" + +// ""+reqDTO.getPatid()+"" + //患者id +// ""+reqDTO.getKsrq()+"" + //开始日期 +// ""+reqDTO.getJsrq()+"" + //结束日期 +// ""+czyh+""; +// HashMap map = webserviceRequest("http://12.0.2.1:10062/KWSService.asmx","606",inputXml); +// addHisLog("根据患者id获取患者结算记录",inputXml,map.get("outXml")); +// errCode = map.get("errCode"); +// if("0".equals(errCode)){ +// String outXml = map.get("outXml"); +// Document document= DocumentHelper.parseText(outXml); +// +// Element rootElt = document.getRootElement(); +// +// Iterator iterator = rootElt.elementIterator(); +// +// Element codeElm = (Element) iterator.next(); +// Element msgElm = (Element) iterator.next(); +// +// String code = codeElm.getText(); +// String msg = msgElm.getText(); +// +// if (!"0".equals(code)){ +// errCode=code; +// errMsg=msg; +// +// logger.error("返回结果异常----------"+ map.get("errCode")); +// resultObj=Result.returnError(errCode,errMsg); +// } +// +// if ("0".equals(code)){ +// Element Items = (Element) iterator.next(); +// +// Iterator itemIterator = Items.elementIterator(); +// +// while (itemIterator.hasNext()){ +// FeeSettledInfoVO feeSettledInfoVO=new FeeSettledInfoVO(); +// +// Element item = (Element) itemIterator.next(); +// +// Element sjhEl = item.element("sjh"); +// String sjh = sjhEl==null?"":sjhEl.getText(); +// +// Element fphEl = item.element("fph"); +// String fph = fphEl==null?"":fphEl.getText(); +// +// Element sfczyEl = item.element("sfczy"); +// String sfczy = sfczyEl==null?"":sfczyEl.getText(); +// +// Element sfrqEl = item.element("sfrq"); +// String sfrq = sfrqEl==null?"":sfrqEl.getText(); +// +// Element ksmcEl = item.element("ksmc"); +// String ksmc = ksmcEl==null?"":ksmcEl.getText(); +// +// Element brlxEl = item.element("brlx"); +// String brlx = brlxEl==null?"":brlxEl.getText(); +// +// Element fyzeEl = item.element("fyze"); +// String fyze = fyzeEl==null?"":fyzeEl.getText(); +// +// Element jlztEl = item.element("jlzt"); +// String jlzt = jlztEl==null?"":jlztEl.getText(); +// +// Element sflbEl = item.element("sflb"); +// String sflb = sflbEl==null?"":sflbEl.getText(); +// +// feeSettledInfoVO.setSjh(sjh); +// feeSettledInfoVO.setFph(fph); +// feeSettledInfoVO.setSfczy(sfczy); +// feeSettledInfoVO.setSfrq(sfrq); +// feeSettledInfoVO.setKsmc(ksmc); +// feeSettledInfoVO.setJlzt(jlzt); +// feeSettledInfoVO.setFyze(fyze); +// feeSettledInfoVO.setBrlx(brlx); +// feeSettledInfoVO.setSflb(sflb); +// list.add(feeSettledInfoVO); +// } +// resultObj = Result.returnSuccess(list); +// } +// }else { +// logger.error("返回结果异常----------"+ map.get("errCode")); +// errMsg="获取已结算信息失败"; +// resultObj=Result.returnError(errCode,errMsg); +// } +// } catch (Exception e) { +// logger.error("返回结果异常----------"+e.toString()); +// errCode="999"; +// errMsg=e.getMessage(); +// resultObj=Result.returnError(errCode,errMsg); +// } +// +// return resultObj; +// } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/XmlUtil.java b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/XmlUtil.java new file mode 100644 index 0000000..775245b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/java/com/jojubanking/boot/module/system/util/xytj/XmlUtil.java @@ -0,0 +1,329 @@ +package com.jojubanking.boot.module.system.util.xytj; + +import cn.hutool.extra.qrcode.QrCodeUtil; +import cn.hutool.extra.qrcode.QrConfig; +import org.apache.commons.lang3.StringEscapeUtils; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; + +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.List; +import java.util.*; + +public class XmlUtil { + public static void main(String[] args) { +// Reserve8Vo vo = new Reserve8Vo(); +// System.out.println(getOpAppAppoint(vo)); + } + + /** + * 生成二维码 + * @param content 内容 + * @param logourl logo + */ + public static void createQrCodeN(String content, String logourl, int width, int height, HttpServletResponse response){ + QrConfig config = new QrConfig(width, height); +// File file = null; +// try { +// file = ResourceUtils.getFile(logourl); +// } catch (FileNotFoundException e) { +// e.printStackTrace(); +// } +// //附带logo +// config.setImg(file); + // 设置边距,既二维码和背景之间的边距 + config.setMargin(3); + // 高纠错级别 +// config.setErrorCorrection(ErrorCorrectionLevel.H); + // 设置前景色,既二维码颜色(青色) + config.setForeColor(new Color(0,60,130).getRGB()); + // 设置背景色(灰色) + config.setBackColor(new Color(242,242,242).getRGB()); + /* try { + OutputStream out = new FileOutputStream(""); + } catch (FileNotFoundException e) { + e.printStackTrace(); + }*/ + + BufferedImage bufferedImage = QrCodeUtil.generate(// + content, //二维码内容 + config + ); + try { + //以JPEG格式向客户端发送 + ServletOutputStream os = response.getOutputStream(); + ImageIO.write(bufferedImage, "PNG",os); + os.flush(); + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + /** + * 省份证的正则表达式^(\d{15}|\d{17}[\dx])$ + * @param id 省份证号 + * @return 生日(yyyy-MM-dd) + */ + public static String extractYearMonthDayOfIdCard(String id) { + String year = null; + String month = null; + String day = null; + //正则匹配身份证号是否是正确的,15位或者17位数字+数字/x/X + if (id.matches("^\\d{15}|\\d{17}[\\dxX]$")) { + year = id.substring(6, 10); + month = id.substring(10,12); + day = id.substring(12,14); + }else { + System.out.println("身份证号码不匹配!"); + return null; + } + return year + "-" + month + "-" + day; + } + + + + /** + * xml上下封装 + */ + public static String getRequestXMl(StringBuffer strXML) { + StringBuffer str = new StringBuffer(); + str.append(""); + str.append(""); + str.append(""); + str.append(strXML.toString()); + str.append(""); + str.append(""); + return str.toString(); + } + + + // 获取返回的报文统一处理 +// public static Map map = new HashMap(); + + public static Map parse(String soap) throws DocumentException { + //map.clear(); + String soapWeb = StringEscapeUtils.unescapeXml(soap); + soapWeb = soapWeb.replace("", ""); + Document doc = DocumentHelper.parseText(soapWeb);// 报文 转成 xml + Element root = doc.getRootElement();//获取根元素,准备递归解析这个XML树 + + Map map = getCodeNC(root); + return map; + } + + // 非递归遍历所有的 节点 和 数据 + public static Map getCodeNC(Element root) { + Map map = new HashMap(); + + Stack a = null; + a = new Stack<>(); + a.push(root); + + if(root.elements().size() == 0 || root.elements() == null){ + return map; + } + //top 是栈顶元素 + Element top = null; + while(!a.empty()){ + top = (Element) a.peek(); + a.pop(); + + //如果当前跟节点有子节点,找到子节点 + List list = top.elements(); + int size = top.elements().size(); + + for (Element e : list) { + //遍历每个节点 + if (e.elements().size() > 0) { + //对栈顶元素进行反向遍历,入栈 + a.push((Element)e); + } + if (e.elements().size() == 0) { + map.put(e.getName(), e.getTextTrim()); + }//如果为叶子节点,那么直接把名称和值放入map + } + } + + return map; + } + + + public static List> getPacsRes(String soap, String name) throws DocumentException { + String res1 = name + "Response"; + String res2 = name + "Result"; + String soapWeb = org.apache.commons.lang.StringEscapeUtils.unescapeXml(soap); + soapWeb = soapWeb.replace("", ""); + // 字符串转xml + Document doc = DocumentHelper.parseText(soapWeb); + + //获取根节点 + Element root = doc.getRootElement(); + Element body = root.element("Body").element(res1).element(res2).element("response"); + + Element elresult = body.element("returnresult"); + Element eldata = body.element("data"); + + System.out.println("根节点 为 : " + elresult.element("returncode").getText()); + + List> list = new ArrayList>(); + //判断返回值 + String soapcode = elresult.element("returncode").getText(); + if(soapcode.equals("1")){ + // 获取Body下的所有子节点 + + List bodyChild = eldata.elements(); + for(Iterator it = bodyChild.iterator();it.hasNext();){ + Map soapMap = new HashMap(); + soapMap.put("returncode", soapcode); + + Element elm1= (Element) it.next(); + List responseChild = elm1.elements(); + for(Iterator it1 = responseChild.iterator();it1.hasNext();){ + Element elm2= (Element) it1.next(); + soapMap.put(elm2.getName(), elm2.getTextTrim()); + } + + list.add(soapMap); + } + }else{ + Map soapMap = new HashMap(); + soapMap.put("returncode",soapcode); + soapMap.put("errormsg", elresult.element("errormsg").getText()); + list.add(soapMap); + } + return list; + } + + /** + * 定时任务解析 xml + * */ + public static List> getTasks(String soap) throws DocumentException { + String soapWeb = StringEscapeUtils.unescapeXml(soap); + soapWeb = soapWeb.replace("", ""); + Document doc = DocumentHelper.parseText(soapWeb); // 字符串转xml + Element root = doc.getRootElement();//获取根节点 + Element body = root.element("Body"); // 获取所需节点 + Element response = body.element("queryAppRegistRecordsNewResponse"); + Element result = response.element("queryAppRegistRecordsNewResult"); + Element Response = result.element("Response"); + + String Result_Code = Response.elementTextTrim("Result_Code"); + + List> list = new ArrayList>(); + if (Result_Code.equals("0000")) { + Element resultData = Response.element("Result_Data"); + Element recordList = resultData.element("Record_List"); + List elements = recordList.elements(); + Iterator iterator = elements.iterator(); + while (iterator.hasNext()) { + Element element = iterator.next(); + Map soapMap = new HashMap(); + soapMap.put("Result_Code","0000"); + soapMap.put("HIS_ORDER_NO", element.elementTextTrim("HIS_ORDER_NO")); // 交易流水号 + soapMap.put("REGIST_TYPE", element.elementTextTrim("REGIST_TYPE")); // 预约单状态 1 已退费 0 正常 + soapMap.put("ALLOWREFUNDFLAG", element.elementTextTrim("ALLOWREFUNDFLAG")); // 允许退号标志 N 不允许 Y 允许 + list.add(soapMap); + } + } else { + Map soapMap = new HashMap(); + soapMap.put("Result_Code",Result_Code); + soapMap.put("Error_Msg",Response.elementTextTrim("Error_Msg")); + list.add(soapMap); + } + return list; + } + + /** + * 查询解析xml + * */ + + public static List> getDeptQueryXml(String resp1,String resp2,String soap) throws DocumentException { + String soapWeb = StringEscapeUtils.unescapeXml(soap); + soapWeb = soapWeb.replace("", ""); + Document doc = DocumentHelper.parseText(soapWeb); // 字符串转xml + Element root = doc.getRootElement();//获取根节点 + Element body = root.element("Body"); // 获取所需节点 + Element response = body.element(resp1); + Element result = response.element(resp2); + Element Response = result.element("Response"); + + String Result_Code = Response.elementTextTrim("Result_Code"); + + List> list = new ArrayList>(); + if (Result_Code.equals("0000")) { + Element resultData = Response.element("Result_Data"); + Element recordList = resultData.element("Record_List"); + List elements = recordList.elements(); + Iterator iterator = elements.iterator(); + while (iterator.hasNext()) { + Element element = iterator.next(); + Map soapMap = new HashMap(); + soapMap.put("Result_Code","0000"); + soapMap.put("DEPT_CODE", element.elementTextTrim("DEPT_CODE")); + soapMap.put("DEPT_NAME", element.elementTextTrim("DEPT_NAME")); + soapMap.put("IS_ONLINE", element.elementTextTrim("IS_ONLINE")); + list.add(soapMap); + } + } else { + Map soapMap = new HashMap(); + soapMap.put("Result_Code",Result_Code); + soapMap.put("Error_Msg",Response.elementTextTrim("Error_Msg")); + list.add(soapMap); + } + return list; + } + + public static List> getHidsQueryXml(String resp1,String resp2,String soap) throws DocumentException { + String soapWeb = StringEscapeUtils.unescapeXml(soap); + soapWeb = soapWeb.replace("", ""); + Document doc = DocumentHelper.parseText(soapWeb); // 字符串转xml + Element root = doc.getRootElement();//获取根节点 + Element body = root.element("Body"); // 获取所需节点 + Element response = body.element(resp1); + Element result = response.element(resp2); + Element Response = result.element("Response"); + + String Result_Code = Response.elementTextTrim("Result_Code"); + + List> list = new ArrayList>(); + if (Result_Code.equals("0000")) { + Element resultData = Response.element("Result_Data"); + Element recordList = resultData.element("Record_List"); + List elements = recordList.elements(); + Iterator iterator = elements.iterator(); + while (iterator.hasNext()) { + Element element = iterator.next(); + Map soapMap = new HashMap(); + soapMap.put("Result_Code","0000"); + soapMap.put("HID", element.elementTextTrim("HID")); + soapMap.put("DEPT_CODE", element.elementTextTrim("DEPT_CODE")); + soapMap.put("DOCTOR_CODE", element.elementTextTrim("DOCTOR_CODE")); + soapMap.put("DOCTOR_NAME", element.elementTextTrim("DOCTOR_NAME")); + soapMap.put("CLINIC_DATE", element.elementTextTrim("CLINIC_DATE")); + soapMap.put("HB_TIME", element.elementTextTrim("HB_TIME")); + soapMap.put("CLINIC_DURATION", element.elementTextTrim("CLINIC_DURATION")); + soapMap.put("REGISTERED_FEE", element.elementTextTrim("REGISTERED_FEE")); + soapMap.put("PHARMACY_FEE", element.elementTextTrim("PHARMACY_FEE")); + soapMap.put("DIAG_FEE", element.elementTextTrim("DIAG_FEE")); + soapMap.put("IS_ONLINE", element.elementTextTrim("IS_ONLINE")); + soapMap.put("HB_TYPE", element.elementTextTrim("HB_TYPE")); + list.add(soapMap); + } + } else { + Map soapMap = new HashMap(); + soapMap.put("Result_Code",Result_Code); + soapMap.put("Error_Msg",Response.elementTextTrim("Error_Msg")); + list.add(soapMap); + } + return list; + } +} diff --git a/joju-module-system/joju-module-system-biz/src/main/resources/excel-license.xml b/joju-module-system/joju-module-system-biz/src/main/resources/excel-license.xml new file mode 100644 index 0000000..2a69d76 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/resources/excel-license.xml @@ -0,0 +1,13 @@ + + + + Aspose.Total for Java + Aspose.Words for Java + + Enterprise + 20991231 + 20991231 + 8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7 + + sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU= + \ No newline at end of file diff --git a/joju-module-system/joju-module-system-biz/src/main/resources/mapper/userinfo/UserInfoMapper.xml b/joju-module-system/joju-module-system-biz/src/main/resources/mapper/userinfo/UserInfoMapper.xml new file mode 100644 index 0000000..2f75117 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/main/resources/mapper/userinfo/UserInfoMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/job/SchedulerManagerTest.java b/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/job/SchedulerManagerTest.java new file mode 100644 index 0000000..0b69385 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/job/SchedulerManagerTest.java @@ -0,0 +1,53 @@ +package com.jojubanking.boot.module.system.job; + +import cn.hutool.core.util.StrUtil; +import com.jojubanking.boot.framework.quartz.core.scheduler.SchedulerManager; +import com.jojubanking.boot.module.system.job.auth.UserSessionTimeoutJob; +import com.jojubanking.boot.module.system.test.BaseDbUnitTest; +import org.junit.jupiter.api.Test; +import org.quartz.SchedulerException; + +import javax.annotation.Resource; + +public class SchedulerManagerTest extends BaseDbUnitTest { + + @Resource + private SchedulerManager schedulerManager; + + @Test + public void testAddJob() throws SchedulerException { + String jobHandlerName = StrUtil.lowerFirst(UserSessionTimeoutJob.class.getSimpleName()); + schedulerManager.addJob(1L, jobHandlerName, "test", "0/10 * * * * ? *", 0, 0); + } + + @Test + public void testUpdateJob() throws SchedulerException { + String jobHandlerName = StrUtil.lowerFirst(UserSessionTimeoutJob.class.getSimpleName()); + schedulerManager.updateJob(jobHandlerName, "hahaha", "0/20 * * * * ? *", 0, 0); + } + + @Test + public void testDeleteJob() throws SchedulerException { + String jobHandlerName = StrUtil.lowerFirst(UserSessionTimeoutJob.class.getSimpleName()); + schedulerManager.deleteJob(jobHandlerName); + } + + @Test + public void testPauseJob() throws SchedulerException { + String jobHandlerName = StrUtil.lowerFirst(UserSessionTimeoutJob.class.getSimpleName()); + schedulerManager.pauseJob(jobHandlerName); + } + + @Test + public void testResumeJob() throws SchedulerException { + String jobHandlerName = StrUtil.lowerFirst(UserSessionTimeoutJob.class.getSimpleName()); + schedulerManager.resumeJob(jobHandlerName); + } + + @Test + public void testTriggerJob() throws SchedulerException { + String jobHandlerName = StrUtil.lowerFirst(UserSessionTimeoutJob.class.getSimpleName()); + schedulerManager.triggerJob(1L, jobHandlerName, "niubi!!!"); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/mq/RedisStreamTest.java b/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/mq/RedisStreamTest.java new file mode 100644 index 0000000..bf25358 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/mq/RedisStreamTest.java @@ -0,0 +1,62 @@ +package com.jojubanking.boot.module.system.mq; + +import cn.hutool.core.thread.ThreadUtil; +import com.jojubanking.boot.framework.mq.core.RedisMQTemplate; +import com.jojubanking.boot.module.system.mq.consumer.mail.MailSendConsumer; +import com.jojubanking.boot.module.system.mq.consumer.sms.SmsSendConsumer; +import com.jojubanking.boot.module.system.mq.message.mail.MailSendMessage; +import com.jojubanking.boot.module.system.mq.message.sms.SmsSendMessage; +import com.jojubanking.boot.module.system.test.BaseRedisIntegrationTest; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; +import org.springframework.data.redis.core.RedisTemplate; + +import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; + +public class RedisStreamTest { + + @Import({SmsSendConsumer.class, MailSendConsumer.class}) + @Disabled + public static class ConsumerTest extends BaseRedisIntegrationTest { + + @Test + public void testConsumer() { + ThreadUtil.sleep(1, TimeUnit.DAYS); + } + + } + + @Disabled + public static class ProducerTest extends BaseRedisIntegrationTest { + + @Resource + private RedisMQTemplate redisMQTemplate; + + @Resource + private RedisTemplate redisTemplate; + + @Test + public void testProducer01() { + for (int i = 0; i < 100; i++) { + // 创建消息 + SmsSendMessage message = new SmsSendMessage(); + message.setMobile("15601691300").setApiTemplateId("test:" + i); + // 发送消息 + redisMQTemplate.send(message); + } + } + + @Test + public void testProducer02() { + // 创建消息 + MailSendMessage message = new MailSendMessage(); + message.setAddress("fangfang@mihayou.com").setTemplateCode("test"); + // 发送消息 + redisMQTemplate.send(message); + } + + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/service/package-info.java b/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/service/package-info.java new file mode 100644 index 0000000..32b4a23 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/service/package-info.java @@ -0,0 +1,4 @@ +/** + * 占位 + */ +package com.jojubanking.boot.module.system.service; diff --git a/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/service/sms/SmsServiceIntegrationTest.java b/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/service/sms/SmsServiceIntegrationTest.java new file mode 100644 index 0000000..bc1004e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/service/sms/SmsServiceIntegrationTest.java @@ -0,0 +1,71 @@ +package com.jojubanking.boot.module.system.service.sms; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.thread.ThreadUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.sms.config.JojuSmsAutoConfiguration; +import com.jojubanking.boot.module.system.test.BaseDbAndRedisIntegrationTest; +import com.jojubanking.boot.module.system.mq.consumer.sms.SmsSendConsumer; +import com.jojubanking.boot.module.system.mq.producer.sms.SmsProducer; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +// TODO @芋艿:需要迁移 +@Import({JojuSmsAutoConfiguration.class, + SmsChannelServiceImpl.class, SmsSendServiceImpl.class, SmsTemplateServiceImpl.class, SmsLogServiceImpl.class, + SmsProducer.class, SmsSendConsumer.class}) +public class SmsServiceIntegrationTest extends BaseDbAndRedisIntegrationTest { + + @Resource + private SmsSendServiceImpl smsService; + @Resource + private SmsChannelServiceImpl smsChannelService; + + @MockBean + private AdminUserService userService; + + @Test + public void testSendSingleSms_yunpianSuccess() { + // 参数准备 + String mobile = "15601691399"; + Long userId = 1L; + Integer userType = UserTypeEnum.ADMIN.getValue(); + String templateCode = "test_01"; + Map templateParams = MapUtil.builder() + .put("operation", "登录").put("code", "1234").build(); + // 调用 + smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); + + // 等待 MQ 消费 + ThreadUtil.sleep(1, TimeUnit.HOURS); + } + + @Test + public void testSendSingleSms_aliyunSuccess() { + // 参数准备 + String mobile = "15601691399"; + Long userId = 1L; + Integer userType = UserTypeEnum.ADMIN.getValue(); + String templateCode = "test_02"; + Map templateParams = MapUtil.builder() + .put("code", "1234").build(); + // 调用 + smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); + + // 等待 MQ 消费 + ThreadUtil.sleep(1, TimeUnit.HOURS); + } + +// @Test +// public void testDoSendSms() { +// // 等待 MQ 消费 +// ThreadUtil.sleep(1, TimeUnit.HOURS); +// } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/test/BaseDbAndRedisIntegrationTest.java b/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/test/BaseDbAndRedisIntegrationTest.java new file mode 100644 index 0000000..45d3012 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/test/BaseDbAndRedisIntegrationTest.java @@ -0,0 +1,38 @@ +package com.jojubanking.boot.module.system.test; + +import com.jojubanking.boot.framework.datasource.config.JojuDataSourceAutoConfiguration; +import com.jojubanking.boot.framework.mybatis.config.JojuMybatisAutoConfiguration; +import com.jojubanking.boot.framework.redis.config.JojuRedisAutoConfiguration; +import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisIntegrationTest.Application.class) +@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 +public class BaseDbAndRedisIntegrationTest { + + @Import({ + // DB 配置类 + DynamicDataSourceAutoConfiguration.class, // Dynamic Datasource 配置类 + JojuDataSourceAutoConfiguration.class, // 自己的 DB 配置类 + DataSourceAutoConfiguration.class, // Spring DB 自动配置类 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类 + // MyBatis 配置类 + JojuMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类 + MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类 + + // Redis 配置类 + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + JojuRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/test/BaseRedisIntegrationTest.java b/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/test/BaseRedisIntegrationTest.java new file mode 100644 index 0000000..02080d4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test-integration/java/cn/joju/fx/module/system/test/BaseRedisIntegrationTest.java @@ -0,0 +1,23 @@ +package com.jojubanking.boot.module.system.test; + +import com.jojubanking.boot.framework.redis.config.JojuRedisAutoConfiguration; +import org.redisson.spring.starter.RedissonAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisIntegrationTest.Application.class) +@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件 +public class BaseRedisIntegrationTest { + + @Import({ + // Redis 配置类 + RedisAutoConfiguration.class, // Spring Redis 自动配置类 + JojuRedisAutoConfiguration.class, // 自己的 Redis 配置类 + RedissonAutoConfiguration.class, // Redisson 自动高配置类 + }) + public static class Application { + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test-integration/resources/application-integration-test.yaml b/joju-module-system/joju-module-system-biz/src/test-integration/resources/application-integration-test.yaml new file mode 100644 index 0000000..68f99e6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test-integration/resources/application-integration-test.yaml @@ -0,0 +1,108 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + autoconfigure: + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 + datasource: + druid: # Druid 【监控】相关的全局配置 + web-stat-filter: + enabled: true + stat-view-servlet: + enabled: true + allow: # 设置白名单,不填则允许所有访问 + url-pattern: /druid/* + login-username: # 控制台管理用户名和密码 + login-password: + filter: + stat: + enabled: true + log-slow-sql: true # 慢 SQL 记录 + slow-sql-millis: 100 + merge-sql: true + wall: + config: + multi-statement-allow: true + dynamic: # 多数据源配置 + druid: # Druid 【连接池】相关的全局配置 + initial-size: 5 # 初始连接数 + min-idle: 10 # 最小连接池数量 + max-active: 20 # 最大连接池数量 + max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒 + time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒 + min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒 + max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒 + validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效 + test-while-idle: true + test-on-borrow: false + test-on-return: false + primary: master + datasource: + master: + name: ruoyi-vue-pro + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT + driver-class-name: com.mysql.jdbc.Driver + username: root + password: 123456 + slave: # 模拟从库,可根据自己需要修改 + name: ruoyi-vue-pro + url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT + driver-class-name: com.mysql.jdbc.Driver + username: root + password: 123456 + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 6379 # 端口 + database: 0 # 数据库索引 + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 +resilience4j: + ratelimiter: + instances: + backendA: + limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50 + limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500 + timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s + register-health-indicator: true # 是否注册到健康监测 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +joju: + security: + token-header: Authorization + token-secret: abcdefghijklmnopqrstuvwxyz + token-timeout: 1d + session-timeout: 30m + mock-enable: true + mock-secret: test + swagger: + enable: false # 单元测试,禁用 Swagger + file: + base-path: http://127.0.0.1:${server.port}/${joju.web.api-prefix}/file/get/ + xss: + enable: false + exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 + - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 + - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenControllerTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenControllerTest.java new file mode 100644 index 0000000..732fffd --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenControllerTest.java @@ -0,0 +1,330 @@ +package com.jojubanking.boot.module.system.controller.admin.oauth2; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.map.MapUtil; +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.framework.common.util.collection.SetUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAccessTokenRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAuthorizeInfoRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open.OAuth2OpenCheckTokenRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.jojubanking.boot.module.system.enums.oauth2.OAuth2GrantTypeEnum; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2ApproveService; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2ClientService; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2GrantService; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2TokenService; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import javax.servlet.http.HttpServletRequest; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.collection.SetUtils.asSet; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.addTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomString; +import static java.util.Arrays.asList; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * {@link OAuth2OpenController} 的单元测试 + * + * @author TW + */ +public class OAuth2OpenControllerTest extends BaseMockitoUnitTest { + + @InjectMocks + private OAuth2OpenController oauth2OpenController; + + @Mock + private OAuth2GrantService oauth2GrantService; + @Mock + private OAuth2ClientService oauth2ClientService; + @Mock + private OAuth2ApproveService oauth2ApproveService; + @Mock + private OAuth2TokenService oauth2TokenService; + + @Test + public void testPostAccessToken_authorizationCode() { + // 准备参数 + String granType = OAuth2GrantTypeEnum.AUTHORIZATION_CODE.getGrantType(); + String code = randomString(); + String redirectUri = randomString(); + String state = randomString(); + HttpServletRequest request = mockRequest("test_client_id", "test_client_secret"); + // mock 方法(client) + OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("test_client_id"); + when(oauth2ClientService.validOAuthClientFromCache(eq("test_client_id"), eq("test_client_secret"), eq(granType), eq(new ArrayList<>()), eq(redirectUri))).thenReturn(client); + + // mock 方法(访问令牌) + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) + .setExpiresTime(addTime(Duration.ofMillis(30050L))); // 多给 10 毫秒,保证可执行完 + when(oauth2GrantService.grantAuthorizationCodeForAccessToken(eq("test_client_id"), + eq(code), eq(redirectUri), eq(state))).thenReturn(accessTokenDO); + + // 调用 + CommonResult result = oauth2OpenController.postAccessToken(request, granType, + code, redirectUri, state, null, null, null, null); + // 断言 + assertEquals(0, result.getCode()); + assertPojoEquals(accessTokenDO, result.getData()); + assertEquals(30L, result.getData().getExpiresIn()); // 执行过程会过去几毫秒 + } + + @Test + public void testPostAccessToken_password() { + // 准备参数 + String granType = OAuth2GrantTypeEnum.PASSWORD.getGrantType(); + String username = randomString(); + String password = randomString(); + String scope = "write read"; + HttpServletRequest request = mockRequest("test_client_id", "test_client_secret"); + // mock 方法(client) + OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("test_client_id"); + when(oauth2ClientService.validOAuthClientFromCache(eq("test_client_id"), eq("test_client_secret"), + eq(granType), eq(Lists.newArrayList("write", "read")), isNull())).thenReturn(client); + + // mock 方法(访问令牌) + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) + .setExpiresTime(addTime(Duration.ofMillis(30050L))); // 多给 10 毫秒,保证可执行完 + when(oauth2GrantService.grantPassword(eq(username), eq(password), eq("test_client_id"), + eq(Lists.newArrayList("write", "read")))).thenReturn(accessTokenDO); + + // 调用 + CommonResult result = oauth2OpenController.postAccessToken(request, granType, + null, null, null, username, password, scope, null); + // 断言 + assertEquals(0, result.getCode()); + assertPojoEquals(accessTokenDO, result.getData()); + assertEquals(30L, result.getData().getExpiresIn()); // 执行过程会过去几毫秒 + } + + @Test + public void testPostAccessToken_refreshToken() { + // 准备参数 + String granType = OAuth2GrantTypeEnum.REFRESH_TOKEN.getGrantType(); + String refreshToken = randomString(); + String password = randomString(); + HttpServletRequest request = mockRequest("test_client_id", "test_client_secret"); + // mock 方法(client) + OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("test_client_id"); + when(oauth2ClientService.validOAuthClientFromCache(eq("test_client_id"), eq("test_client_secret"), + eq(granType), eq(Lists.newArrayList()), isNull())).thenReturn(client); + + // mock 方法(访问令牌) + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) + .setExpiresTime(addTime(Duration.ofMillis(30010L))); // 多给 10 毫秒,保证可执行完 + when(oauth2GrantService.grantRefreshToken(eq(refreshToken), eq("test_client_id"))).thenReturn(accessTokenDO); + + // 调用 + CommonResult result = oauth2OpenController.postAccessToken(request, granType, + null, null, null, null, password, null, refreshToken); + // 断言 + assertEquals(0, result.getCode()); + assertPojoEquals(accessTokenDO, result.getData()); + assertEquals(30L, result.getData().getExpiresIn()); // 执行过程会过去几毫秒 + } + + @Test + public void testPostAccessToken_implicit() { + // 调用,并断言 + assertServiceException(() -> oauth2OpenController.postAccessToken(null, + OAuth2GrantTypeEnum.IMPLICIT.getGrantType(), null, null, null, + null, null, null, null), + new ErrorCode(400, "Token 接口不支持 implicit 授权模式")); + } + + @Test + public void testRevokeToken() { + // 准备参数 + HttpServletRequest request = mockRequest("demo_client_id", "demo_client_secret"); + String token = randomString(); + // mock 方法(client) + OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("demo_client_id"); + when(oauth2ClientService.validOAuthClientFromCache(eq("demo_client_id"), + eq("demo_client_secret"), isNull(), isNull(), isNull())).thenReturn(client); + // mock 方法(移除) + when(oauth2GrantService.revokeToken(eq("demo_client_id"), eq(token))).thenReturn(true); + + // 调用 + CommonResult result = oauth2OpenController.revokeToken(request, token); + // 断言 + assertEquals(0, result.getCode()); + assertTrue(result.getData()); + } + + @Test + public void testCheckToken() { + // 准备参数 + HttpServletRequest request = mockRequest("demo_client_id", "demo_client_secret"); + String token = randomString(); + // mock 方法 + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class).setUserType(UserTypeEnum.ADMIN.getValue()).setExpiresTime(new Date(1653485731195L)); + when(oauth2TokenService.checkAccessToken(eq(token))).thenReturn(accessTokenDO); + + // 调用 + CommonResult result = oauth2OpenController.checkToken(request, token); + // 断言 + assertEquals(0, result.getCode()); + assertPojoEquals(accessTokenDO, result.getData()); + assertEquals(1653485731L, result.getData().getExp()); // 执行过程会过去几毫秒 + } + + @Test + public void testAuthorize() { + // 准备参数 + String clientId = randomString(); + // mock 方法(client) + OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("demo_client_id").setScopes(ListUtil.toList("read", "write", "all")); + when(oauth2ClientService.validOAuthClientFromCache(eq(clientId))).thenReturn(client); + // mock 方法(approve) + List approves = asList( + randomPojo(OAuth2ApproveDO.class).setScope("read").setApproved(true), + randomPojo(OAuth2ApproveDO.class).setScope("write").setApproved(false)); + when(oauth2ApproveService.getApproveList(isNull(), eq(UserTypeEnum.ADMIN.getValue()), eq(clientId))).thenReturn(approves); + + // 调用 + CommonResult result = oauth2OpenController.authorize(clientId); + // 断言 + assertEquals(0, result.getCode()); + assertPojoEquals(client, result.getData().getClient()); + assertEquals(new KeyValue<>("read", true), result.getData().getScopes().get(0)); + assertEquals(new KeyValue<>("write", false), result.getData().getScopes().get(1)); + assertEquals(new KeyValue<>("all", false), result.getData().getScopes().get(2)); + } + + @Test + public void testApproveOrDeny_grantTypeError() { + // 调用,并断言 + assertServiceException(() -> oauth2OpenController.approveOrDeny(randomString(), null, + null, null, null, null), + new ErrorCode(400, "response_type 参数值只允许 code 和 token")); + } + + @Test // autoApprove = true,但是不通过 + public void testApproveOrDeny_autoApproveNo() { + // 准备参数 + String responseType = "code"; + String clientId = randomString(); + String scope = "{\"read\": true, \"write\": false}"; + String redirectUri = randomString(); + String state = randomString(); + // mock 方法 + OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class); + when(oauth2ClientService.validOAuthClientFromCache(eq(clientId), isNull(), eq("authorization_code"), + eq(asSet("read", "write")), eq(redirectUri))).thenReturn(client); + + // 调用 + CommonResult result = oauth2OpenController.approveOrDeny(responseType, clientId, + scope, redirectUri, true, state); + // 断言 + assertEquals(0, result.getCode()); + assertNull(result.getData()); + } + + @Test // autoApprove = false,但是不通过 + public void testApproveOrDeny_ApproveNo() { + // 准备参数 + String responseType = "token"; + String clientId = randomString(); + String scope = "{\"read\": true, \"write\": false}"; + String redirectUri = "https://www.iocoder.cn"; + String state = "test"; + // mock 方法 + OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class); + when(oauth2ClientService.validOAuthClientFromCache(eq(clientId), isNull(), eq("implicit"), + eq(asSet("read", "write")), eq(redirectUri))).thenReturn(client); + + // 调用 + CommonResult result = oauth2OpenController.approveOrDeny(responseType, clientId, + scope, redirectUri, false, state); + // 断言 + assertEquals(0, result.getCode()); + assertEquals("https://www.iocoder.cn#error=access_denied&error_description=User%20denied%20access&state=test", result.getData()); + } + + @Test // autoApprove = true,通过 + token + public void testApproveOrDeny_autoApproveWithToken() { + // 准备参数 + String responseType = "token"; + String clientId = randomString(); + String scope = "{\"read\": true, \"write\": false}"; + String redirectUri = "https://www.iocoder.cn"; + String state = "test"; + // mock 方法(client) + OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId(clientId).setAdditionalInformation(null); + when(oauth2ClientService.validOAuthClientFromCache(eq(clientId), isNull(), eq("implicit"), + eq(asSet("read", "write")), eq(redirectUri))).thenReturn(client); + // mock 方法(场景一) + when(oauth2ApproveService.checkForPreApproval(isNull(), eq(UserTypeEnum.ADMIN.getValue()), + eq(clientId), eq(SetUtils.asSet("read", "write")))).thenReturn(true); + // mock 方法(访问令牌) + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) + .setAccessToken("test_access_token").setExpiresTime(addTime(Duration.ofMillis(30010L))); + when(oauth2GrantService.grantImplicit(isNull(), eq(UserTypeEnum.ADMIN.getValue()), + eq(clientId), eq(ListUtil.toList("read")))).thenReturn(accessTokenDO); + + // 调用 + CommonResult result = oauth2OpenController.approveOrDeny(responseType, clientId, + scope, redirectUri, true, state); + // 断言 + assertEquals(0, result.getCode()); + assertEquals("https://www.iocoder.cn#access_token=test_access_token&token_type=bearer&state=test&expires_in=30&scope=read", result.getData()); + } + + @Test // autoApprove = false,通过 + code + public void testApproveOrDeny_approveWithCode() { + // 准备参数 + String responseType = "code"; + String clientId = randomString(); + String scope = "{\"read\": true, \"write\": false}"; + String redirectUri = "https://www.iocoder.cn"; + String state = "test"; + // mock 方法(client) + OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId(clientId).setAdditionalInformation(null); + when(oauth2ClientService.validOAuthClientFromCache(eq(clientId), isNull(), eq("authorization_code"), + eq(asSet("read", "write")), eq(redirectUri))).thenReturn(client); + // mock 方法(场景二) + when(oauth2ApproveService.updateAfterApproval(isNull(), eq(UserTypeEnum.ADMIN.getValue()), eq(clientId), + eq(MapUtil.builder(new LinkedHashMap()).put("read", true).put("write", false).build()))) + .thenReturn(true); + // mock 方法(访问令牌) + String authorizationCode = "test_code"; + when(oauth2GrantService.grantAuthorizationCodeForCode(isNull(), eq(UserTypeEnum.ADMIN.getValue()), + eq(clientId), eq(ListUtil.toList("read")), eq(redirectUri), eq(state))).thenReturn(authorizationCode); + + // 调用 + CommonResult result = oauth2OpenController.approveOrDeny(responseType, clientId, + scope, redirectUri, false, state); + // 断言 + assertEquals(0, result.getCode()); + assertEquals("https://www.iocoder.cn?code=test_code&state=test", result.getData()); + } + + private HttpServletRequest mockRequest(String clientId, String secret) { + HttpServletRequest request = mock(HttpServletRequest.class); + when(request.getParameter(eq("client_id"))).thenReturn(clientId); + when(request.getParameter(eq("client_secret"))).thenReturn(secret); + return request; + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/auth/AdminAuthServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/auth/AdminAuthServiceImplTest.java new file mode 100644 index 0000000..85db770 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/auth/AdminAuthServiceImplTest.java @@ -0,0 +1,246 @@ +package com.jojubanking.boot.module.system.service.auth; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.framework.test.core.util.AssertUtils; +import com.jojubanking.boot.module.system.api.sms.SmsCodeApi; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.AuthLoginReqVO; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.AuthLoginRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.enums.logger.LoginLogTypeEnum; +import com.jojubanking.boot.module.system.enums.logger.LoginResultEnum; +import com.jojubanking.boot.module.system.service.common.CaptchaService; +import com.jojubanking.boot.module.system.service.logger.LoginLogService; +import com.jojubanking.boot.module.system.service.member.MemberService; +import com.jojubanking.boot.module.system.service.oauth2.OAuth2TokenService; +import com.jojubanking.boot.module.system.service.social.SocialUserService; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import javax.validation.Validator; + +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomString; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +@Import(AdminAuthServiceImpl.class) +public class AdminAuthServiceImplTest extends BaseDbUnitTest { + + @Resource + private AdminAuthServiceImpl authService; + + @MockBean + private AdminUserService userService; + @MockBean + private CaptchaService captchaService; + @MockBean + private LoginLogService loginLogService; + @MockBean + private SocialUserService socialService; + @MockBean + private SmsCodeApi smsCodeApi; + @MockBean + private OAuth2TokenService oauth2TokenService; + @MockBean + private MemberService memberService; + + @MockBean + private Validator validator; + + @BeforeEach + public void setUp() { + when(captchaService.isCaptchaEnable()).thenReturn(true); + } + + @Test + public void testAuthenticate_success() { + // 准备参数 + String username = randomString(); + String password = randomString(); + // mock user 数据 + AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setUsername(username) + .setPassword(password).setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(userService.getUserByUsername(eq(username))).thenReturn(user); + // mock password 匹配 + when(userService.isPasswordMatch(eq(password), eq(user.getPassword()))).thenReturn(true); + + // 调用 + AdminUserDO loginUser = authService.authenticate(username, password); + // 校验 + assertPojoEquals(user, loginUser); + } + + @Test + public void testAuthenticate_userNotFound() { + // 准备参数 + String username = randomString(); + String password = randomString(); + + // 调用, 并断言异常 + AssertUtils.assertServiceException(() -> authService.authenticate(username, password), + AUTH_LOGIN_BAD_CREDENTIALS); + verify(loginLogService).createLoginLog( + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(LoginResultEnum.BAD_CREDENTIALS.getResult()) + && o.getUserId() == null) + ); + } + + @Test + public void testAuthenticate_badCredentials() { + // 准备参数 + String username = randomString(); + String password = randomString(); + // mock user 数据 + AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setUsername(username) + .setPassword(password).setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(userService.getUserByUsername(eq(username))).thenReturn(user); + + // 调用, 并断言异常 + AssertUtils.assertServiceException(() -> authService.authenticate(username, password), + AUTH_LOGIN_BAD_CREDENTIALS); + verify(loginLogService).createLoginLog( + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(LoginResultEnum.BAD_CREDENTIALS.getResult()) + && o.getUserId().equals(user.getId())) + ); + } + + @Test + public void testAuthenticate_userDisabled() { + // 准备参数 + String username = randomString(); + String password = randomString(); + // mock user 数据 + AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setUsername(username) + .setPassword(password).setStatus(CommonStatusEnum.DISABLE.getStatus())); + when(userService.getUserByUsername(eq(username))).thenReturn(user); + // mock password 匹配 + when(userService.isPasswordMatch(eq(password), eq(user.getPassword()))).thenReturn(true); + + // 调用, 并断言异常 + AssertUtils.assertServiceException(() -> authService.authenticate(username, password), + AUTH_LOGIN_USER_DISABLED); + verify(loginLogService).createLoginLog( + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(LoginResultEnum.USER_DISABLED.getResult()) + && o.getUserId().equals(user.getId())) + ); + } + + @Test + public void testCaptcha_success() { + // 准备参数 + AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); + + // mock 验证码正确 + when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); + + // 调用 + authService.verifyCaptcha(reqVO); + // 断言 + verify(captchaService).deleteCaptchaCode(reqVO.getUuid()); + } + + @Test + public void testCaptcha_notFound() { + // 准备参数 + AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> authService.verifyCaptcha(reqVO), AUTH_LOGIN_CAPTCHA_NOT_FOUND); + // 校验调用参数 + verify(loginLogService, times(1)).createLoginLog( + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(LoginResultEnum.CAPTCHA_NOT_FOUND.getResult())) + ); + } + + @Test + public void testCaptcha_codeError() { + // 准备参数 + AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class); + + // mock 验证码不正确 + String code = randomString(); + when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(code); + + // 调用, 并断言异常 + assertServiceException(() -> authService.verifyCaptcha(reqVO), AUTH_LOGIN_CAPTCHA_CODE_ERROR); + // 校验调用参数 + verify(loginLogService).createLoginLog( + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(LoginResultEnum.CAPTCHA_CODE_ERROR.getResult())) + ); + } + + @Test + public void testLogin_success() { + // 准备参数 + AuthLoginReqVO reqVO = randomPojo(AuthLoginReqVO.class, o -> + o.setUsername("test_username").setPassword("test_password")); + + // mock 验证码正确 + when(captchaService.getCaptchaCode(reqVO.getUuid())).thenReturn(reqVO.getCode()); + // mock user 数据 + AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setId(1L).setUsername("test_username") + .setPassword("test_password").setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(userService.getUserByUsername(eq("test_username"))).thenReturn(user); + // mock password 匹配 + when(userService.isPasswordMatch(eq("test_password"), eq(user.getPassword()))).thenReturn(true); + // mock 缓存登录用户到 Redis + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class, o -> o.setUserId(1L) + .setUserType(UserTypeEnum.ADMIN.getValue())); + when(oauth2TokenService.createAccessToken(eq(1L), eq(UserTypeEnum.ADMIN.getValue()), eq("default"), isNull())) + .thenReturn(accessTokenDO); + + // 调用, 并断言异常 + AuthLoginRespVO loginRespVO = authService.login(reqVO); + assertPojoEquals(accessTokenDO, loginRespVO); + // 校验调用参数 + verify(loginLogService).createLoginLog( + argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGIN_USERNAME.getType()) + && o.getResult().equals(LoginResultEnum.SUCCESS.getResult()) + && o.getUserId().equals(user.getId())) + ); + } + + @Test + public void testLogout_success() { + // 准备参数 + String token = randomString(); + // mock + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class, o -> o.setUserId(1L) + .setUserType(UserTypeEnum.ADMIN.getValue())); + when(oauth2TokenService.removeAccessToken(eq(token))).thenReturn(accessTokenDO); + + // 调用 + authService.logout(token, LoginLogTypeEnum.LOGOUT_SELF.getType()); + // 校验调用参数 + verify(loginLogService).createLoginLog(argThat(o -> o.getLogType().equals(LoginLogTypeEnum.LOGOUT_SELF.getType()) + && o.getResult().equals(LoginResultEnum.SUCCESS.getResult())) + ); + } + + @Test + public void testLogout_fail() { + // 准备参数 + String token = randomString(); + + // 调用 + authService.logout(token, LoginLogTypeEnum.LOGOUT_SELF.getType()); + // 校验调用参数 + verify(loginLogService, never()).createLoginLog(any()); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/common/CaptchaServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/common/CaptchaServiceTest.java new file mode 100644 index 0000000..0138350 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/common/CaptchaServiceTest.java @@ -0,0 +1,65 @@ +package com.jojubanking.boot.module.system.service.common; + +import com.jojubanking.boot.module.system.controller.admin.common.vo.CaptchaImageRespVO; +import com.jojubanking.boot.module.system.dal.redis.common.CaptchaRedisDAO; +import com.jojubanking.boot.module.system.framework.captcha.config.CaptchaProperties; +import com.jojubanking.boot.framework.test.core.ut.BaseRedisUnitTest; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomString; +import static org.junit.jupiter.api.Assertions.*; + +@Import({CaptchaServiceImpl.class, CaptchaProperties.class, CaptchaRedisDAO.class}) +public class CaptchaServiceTest extends BaseRedisUnitTest { + + @Resource + private CaptchaServiceImpl captchaService; + + @Resource + private CaptchaRedisDAO captchaRedisDAO; + @Resource + private CaptchaProperties captchaProperties; + + @Test + public void testGetCaptchaImage() { + // 调用 + CaptchaImageRespVO respVO = captchaService.getCaptchaImage(); + // 断言 + assertNotNull(respVO.getUuid()); + assertNotNull(respVO.getImg()); + String captchaCode = captchaRedisDAO.get(respVO.getUuid()); + assertNotNull(captchaCode); + } + + @Test + public void testGetCaptchaCode() { + // 准备参数 + String uuid = randomString(); + String code = randomString(); + // mock 数据 + captchaRedisDAO.set(uuid, code, captchaProperties.getTimeout()); + + // 调用 + String resultCode = captchaService.getCaptchaCode(uuid); + // 断言 + assertEquals(code, resultCode); + } + + @Test + public void testDeleteCaptchaCode() { + // 准备参数 + String uuid = randomString(); + String code = randomString(); + // mock 数据 + captchaRedisDAO.set(uuid, code, captchaProperties.getTimeout()); + + // 调用 + captchaService.deleteCaptchaCode(uuid); + // 断言 + assertNull(captchaRedisDAO.get(uuid)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/dept/DeptServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/dept/DeptServiceTest.java new file mode 100644 index 0000000..ab2a1b3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/dept/DeptServiceTest.java @@ -0,0 +1,272 @@ +package com.jojubanking.boot.module.system.service.dept; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptListReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.mysql.dept.DeptMapper; +import com.jojubanking.boot.module.system.enums.dept.DeptIdEnum; +import com.jojubanking.boot.module.system.mq.producer.dept.DeptProducer; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.google.common.collect.Multimap; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import static cn.hutool.core.bean.BeanUtil.getFieldValue; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +/** + * {@link DeptServiceImpl} 的单元测试类 + * + * @author niudehua + */ +@Import(DeptServiceImpl.class) +public class DeptServiceTest extends BaseDbUnitTest { + + @Resource + private DeptServiceImpl deptService; + @Resource + private DeptMapper deptMapper; + @MockBean + private DeptProducer deptProducer; + + @Test + @SuppressWarnings("unchecked") + void testInitLocalCache() { + // mock 数据 + DeptDO deptDO1 = randomDeptDO(); + deptMapper.insert(deptDO1); + DeptDO deptDO2 = randomDeptDO(); + deptMapper.insert(deptDO2); + + // 调用 + deptService.initLocalCache(); + // 断言 deptCache 缓存 + Map deptCache = (Map) getFieldValue(deptService, "deptCache"); + assertEquals(2, deptCache.size()); + assertPojoEquals(deptDO1, deptCache.get(deptDO1.getId())); + assertPojoEquals(deptDO2, deptCache.get(deptDO2.getId())); + // 断言 parentDeptCache 缓存 + Multimap parentDeptCache = (Multimap) getFieldValue(deptService, "parentDeptCache"); + assertEquals(2, parentDeptCache.size()); + assertPojoEquals(deptDO1, parentDeptCache.get(deptDO1.getParentId())); + assertPojoEquals(deptDO2, parentDeptCache.get(deptDO2.getParentId())); + // 断言 maxUpdateTime 缓存 + Date maxUpdateTime = (Date) getFieldValue(deptService, "maxUpdateTime"); + assertEquals(ObjectUtils.max(deptDO1.getUpdateTime(), deptDO2.getUpdateTime()), maxUpdateTime); + } + + @Test + void testListDepts() { + // mock 数据 + DeptDO dept = randomPojo(DeptDO.class, o -> { // 等会查询到 + o.setName("开发部"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + deptMapper.insert(dept); + // 测试 name 不匹配 + deptMapper.insert(ObjectUtils.cloneIgnoreId(dept, o -> o.setName("发"))); + // 测试 status 不匹配 + deptMapper.insert(ObjectUtils.cloneIgnoreId(dept, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + DeptListReqVO reqVO = new DeptListReqVO(); + reqVO.setName("开"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + // 调用 + List sysDeptDOS = deptService.getSimpleDepts(reqVO); + // 断言 + assertEquals(1, sysDeptDOS.size()); + assertPojoEquals(dept, sysDeptDOS.get(0)); + } + + @Test + void testCreateDept_success() { + // 准备参数 + DeptCreateReqVO reqVO = randomPojo(DeptCreateReqVO.class, + o -> { + o.setParentId(DeptIdEnum.ROOT.getId()); + o.setStatus(randomCommonStatus()); + }); + // 调用 + Long deptId = deptService.createDept(reqVO); + // 断言 + assertNotNull(deptId); + // 校验记录的属性是否正确 + DeptDO deptDO = deptMapper.selectById(deptId); + assertPojoEquals(reqVO, deptDO); + // 校验调用 + verify(deptProducer, times(1)).sendDeptRefreshMessage(); + } + + @Test + void testUpdateDept_success() { + // mock 数据 + DeptDO dbDeptDO = randomPojo(DeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + DeptUpdateReqVO reqVO = randomPojo(DeptUpdateReqVO.class, o -> { + // 设置更新的 ID + o.setParentId(DeptIdEnum.ROOT.getId()); + o.setId(dbDeptDO.getId()); + o.setStatus(randomCommonStatus()); + }); + // 调用 + deptService.updateDept(reqVO); + // 校验是否更新正确 + DeptDO deptDO = deptMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, deptDO); + } + + @Test + void testDeleteDept_success() { + // mock 数据 + DeptDO dbDeptDO = randomPojo(DeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDeptDO.getId(); + // 调用 + deptService.deleteDept(id); + // 校验数据不存在了 + assertNull(deptMapper.selectById(id)); + } + + @Test + void testCheckDept_nameDuplicateForUpdate() { + // mock 数据 + DeptDO deptDO = randomDeptDO(); + // 设置根节点部门 + deptDO.setParentId(DeptIdEnum.ROOT.getId()); + deptMapper.insert(deptDO); + // mock 数据 稍后模拟重复它的 name + DeptDO nameDeptDO = randomDeptDO(); + // 设置根节点部门 + nameDeptDO.setParentId(DeptIdEnum.ROOT.getId()); + deptMapper.insert(nameDeptDO); + // 准备参数 + DeptUpdateReqVO reqVO = randomPojo(DeptUpdateReqVO.class, + o -> { + // 设置根节点部门 + o.setParentId(DeptIdEnum.ROOT.getId()); + // 设置更新的 ID + o.setId(deptDO.getId()); + // 模拟 name 重复 + o.setName(nameDeptDO.getName()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.updateDept(reqVO), DEPT_NAME_DUPLICATE); + } + + @Test + void testCheckDept_parentNotExitsForCreate() { + DeptCreateReqVO reqVO = randomPojo(DeptCreateReqVO.class, + o -> o.setStatus(randomCommonStatus())); + // 调用,并断言异常 + assertServiceException(() -> deptService.createDept(reqVO), DEPT_PARENT_NOT_EXITS); + } + + @Test + void testCheckDept_notFoundForDelete() { + // 准备参数 + Long id = randomLongId(); + // 调用, 并断言异常 + assertServiceException(() -> deptService.deleteDept(id), DEPT_NOT_FOUND); + } + + @Test + void testCheckDept_exitsChildrenForDelete() { + // mock 数据 + DeptDO parentDept = randomPojo(DeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(parentDept);// @Sql: 先插入出一条存在的数据 + // 准备参数 + DeptDO childrenDeptDO = randomPojo(DeptDO.class, o -> { + o.setParentId(parentDept.getId()); + o.setStatus(randomCommonStatus()); + }); + // 插入子部门 + deptMapper.insert(childrenDeptDO); + // 调用, 并断言异常 + assertServiceException(() -> deptService.deleteDept(parentDept.getId()), DEPT_EXITS_CHILDREN); + } + + @Test + void testCheckDept_parentErrorForUpdate() { + // mock 数据 + DeptDO dbDeptDO = randomPojo(DeptDO.class, o -> o.setStatus(randomCommonStatus())); + deptMapper.insert(dbDeptDO); + // 准备参数 + DeptUpdateReqVO reqVO = randomPojo(DeptUpdateReqVO.class, + o -> { + // 设置自己为父部门 + o.setParentId(dbDeptDO.getId()); + // 设置更新的 ID + o.setId(dbDeptDO.getId()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.updateDept(reqVO), DEPT_PARENT_ERROR); + } + + @Test + void testCheckDept_notEnableForCreate() { + // mock 数据 + DeptDO deptDO = randomPojo(DeptDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); + deptMapper.insert(deptDO); + // 准备参数 + DeptCreateReqVO reqVO = randomPojo(DeptCreateReqVO.class, + o -> { + // 设置未启用的部门为副部门 + o.setParentId(deptDO.getId()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.createDept(reqVO), DEPT_NOT_ENABLE); + } + + @Test + void testCheckDept_parentIsChildForUpdate() { + // mock 数据 + DeptDO parentDept = randomPojo(DeptDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); + deptMapper.insert(parentDept); + DeptDO childDept = randomPojo(DeptDO.class, o -> { + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setParentId(parentDept.getId()); + }); + deptMapper.insert(childDept); + // 初始化本地缓存 + deptService.initLocalCache(); + // 准备参数 + DeptUpdateReqVO reqVO = randomPojo(DeptUpdateReqVO.class, + o -> { + // 设置自己的子部门为父部门 + o.setParentId(childDept.getId()); + // 设置更新的 ID + o.setId(parentDept.getId()); + }); + // 调用, 并断言异常 + assertServiceException(() -> deptService.updateDept(reqVO), DEPT_PARENT_IS_CHILD); + } + + @SafeVarargs + private static DeptDO randomDeptDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(DeptDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/dept/PostServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/dept/PostServiceTest.java new file mode 100644 index 0000000..a449caf --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/dept/PostServiceTest.java @@ -0,0 +1,194 @@ +package com.jojubanking.boot.module.system.service.dept; + +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; +import com.jojubanking.boot.module.system.dal.mysql.dept.PostMapper; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomLongId; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static org.junit.jupiter.api.Assertions.*; + +@Import(PostServiceImpl.class) +public class PostServiceTest extends BaseDbUnitTest { + + @Resource + private PostServiceImpl postService; + @Resource + private PostMapper postMapper; + + @Test + void testPagePosts() { + // mock 数据 + PostDO postDO = randomPojo(PostDO.class, o -> { + o.setName("码仔"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + postMapper.insert(postDO); + // 测试 name 不匹配 + postMapper.insert(ObjectUtils.cloneIgnoreId(postDO, o -> o.setName("程序员"))); + // 测试 status 不匹配 + postMapper.insert(ObjectUtils.cloneIgnoreId(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + + // 准备参数 + PostPageReqVO reqVO = new PostPageReqVO(); + reqVO.setName("码"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + PageResult pageResult = postService.getPostPage(reqVO); + + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(postDO, pageResult.getList().get(0)); + } + + @Test + void testListPosts() { + // mock 数据 + PostDO postDO = randomPojo(PostDO.class, o -> { + o.setName("码仔"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + postMapper.insert(postDO); + // 测试 name 不匹配 + postMapper.insert(ObjectUtils.cloneIgnoreId(postDO, o -> o.setName("程序员"))); + // 测试 status 不匹配 + postMapper.insert(ObjectUtils.cloneIgnoreId(postDO, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + PostExportReqVO reqVO = new PostExportReqVO(); + reqVO.setName("码"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + List list = postService.getPosts(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(postDO, list.get(0)); + } + + @Test + void testGetPost() { + // mock 数据 + PostDO dbPostDO = randomPostDO(); + postMapper.insert(dbPostDO); + // 准备参数 + Long id = dbPostDO.getId(); + // 调用 + PostDO post = postService.getPost(id); + // 断言 + assertNotNull(post); + assertPojoEquals(dbPostDO, post); + } + + @Test + void testCreatePost_success() { + // 准备参数 + PostCreateReqVO reqVO = randomPojo(PostCreateReqVO.class, + o -> o.setStatus(randomEle(CommonStatusEnum.values()).getStatus())); + // 调用 + Long postId = postService.createPost(reqVO); + // 断言 + assertNotNull(postId); + // 校验记录的属性是否正确 + PostDO post = postMapper.selectById(postId); + assertPojoEquals(reqVO, post); + } + + @Test + void testUpdatePost_success() { + // mock 数据 + PostDO postDO = randomPostDO(); + postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + PostUpdateReqVO reqVO = randomPojo(PostUpdateReqVO.class, + o -> { + // 设置更新的 ID + o.setId(postDO.getId()); + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); + }); + // 调用 + postService.updatePost(reqVO); + // 校验是否更新正确 + PostDO post = postMapper.selectById(reqVO.getId());// 获取最新的 + assertPojoEquals(reqVO, post); + } + + @Test + void testDeletePost_success() { + // mock 数据 + PostDO postDO = randomPostDO(); + postMapper.insert(postDO); + // 准备参数 + Long id = postDO.getId(); + // 调用 + postService.deletePost(id); + assertNull(postMapper.selectById(id)); + } + + @Test + void testCheckPost_notFoundForDelete() { + // 准备参数 + Long id = randomLongId(); + // 调用, 并断言异常 + assertServiceException(() -> postService.deletePost(id), POST_NOT_FOUND); + } + + @Test + void testCheckPost_nameDuplicateForCreate() { + // mock 数据 + PostDO postDO = randomPostDO(); + postMapper.insert(postDO);// @Sql: 先插入出一条存在的数据 + // 准备参数 + PostCreateReqVO reqVO = randomPojo(PostCreateReqVO.class, + // 模拟 name 重复 + o -> o.setName(postDO.getName())); + assertServiceException(() -> postService.createPost(reqVO), POST_NAME_DUPLICATE); + } + + @Test + void testCheckPost_codeDuplicateForUpdate() { + // mock 数据 + PostDO postDO = randomPostDO(); + postMapper.insert(postDO); + // mock 数据 稍后模拟重复它的 code + PostDO codePostDO = randomPostDO(); + postMapper.insert(codePostDO); + // 准备参数 + PostUpdateReqVO reqVO = randomPojo(PostUpdateReqVO.class, + o -> { + // 设置更新的 ID + o.setId(postDO.getId()); + // 模拟 code 重复 + o.setCode(codePostDO.getCode()); + }); + // 调用, 并断言异常 + assertServiceException(() -> postService.updatePost(reqVO), POST_CODE_DUPLICATE); + } + + @SafeVarargs + private static PostDO randomPostDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(PostDO.class, ArrayUtils.append(consumer, consumers)); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/dict/DictDataServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/dict/DictDataServiceTest.java new file mode 100644 index 0000000..e725e3d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/dict/DictDataServiceTest.java @@ -0,0 +1,253 @@ +package com.jojubanking.boot.module.system.service.dict; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictDataDO; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictTypeDO; +import com.jojubanking.boot.module.system.dal.mysql.dict.DictDataMapper; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; +import java.util.function.Consumer; + +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +@Import(DictDataServiceImpl.class) +public class DictDataServiceTest extends BaseDbUnitTest { + + @Resource + private DictDataServiceImpl dictDataService; + + @Resource + private DictDataMapper dictDataMapper; + @MockBean + private DictTypeService dictTypeService; + + @Test + public void testGetDictDataPage() { + // mock 数据 + DictDataDO dbDictData = randomPojo(DictDataDO.class, o -> { // 等会查询到 + o.setLabel("芋艿"); + o.setDictType("yunai"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + dictDataMapper.insert(dbDictData); + // 测试 label 不匹配 + dictDataMapper.insert(ObjectUtils.cloneIgnoreId(dbDictData, o -> o.setLabel("艿"))); + // 测试 dictType 不匹配 + dictDataMapper.insert(ObjectUtils.cloneIgnoreId(dbDictData, o -> o.setDictType("nai"))); + // 测试 status 不匹配 + dictDataMapper.insert(ObjectUtils.cloneIgnoreId(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + DictDataPageReqVO reqVO = new DictDataPageReqVO(); + reqVO.setLabel("芋"); + reqVO.setDictType("yu"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + PageResult pageResult = dictDataService.getDictDataPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbDictData, pageResult.getList().get(0)); + } + + @Test + public void testGetDictDataList() { + // mock 数据 + DictDataDO dbDictData = randomPojo(DictDataDO.class, o -> { // 等会查询到 + o.setLabel("芋艿"); + o.setDictType("yunai"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + dictDataMapper.insert(dbDictData); + // 测试 label 不匹配 + dictDataMapper.insert(ObjectUtils.cloneIgnoreId(dbDictData, o -> o.setLabel("艿"))); + // 测试 dictType 不匹配 + dictDataMapper.insert(ObjectUtils.cloneIgnoreId(dbDictData, o -> o.setDictType("nai"))); + // 测试 status 不匹配 + dictDataMapper.insert(ObjectUtils.cloneIgnoreId(dbDictData, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + DictDataExportReqVO reqVO = new DictDataExportReqVO(); + reqVO.setLabel("芋"); + reqVO.setDictType("yu"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + List list = dictDataService.getDictDatas(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbDictData, list.get(0)); + } + + @Test + public void testCreateDictData_success() { + // 准备参数 + DictDataCreateReqVO reqVO = randomPojo(DictDataCreateReqVO.class, + o -> o.setStatus(randomCommonStatus())); + // mock 方法 + when(dictTypeService.getDictType(eq(reqVO.getDictType()))).thenReturn(randomDictTypeDO(reqVO.getDictType())); + + // 调用 + Long dictDataId = dictDataService.createDictData(reqVO); + // 断言 + assertNotNull(dictDataId); + // 校验记录的属性是否正确 + DictDataDO dictData = dictDataMapper.selectById(dictDataId); + assertPojoEquals(reqVO, dictData); + } + + @Test + public void testUpdateDictData_success() { + // mock 数据 + DictDataDO dbDictData = randomDictDataDO(); + dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 + // 准备参数 + DictDataUpdateReqVO reqVO = randomPojo(DictDataUpdateReqVO.class, o -> { + o.setId(dbDictData.getId()); // 设置更新的 ID + o.setStatus(randomCommonStatus()); + }); + // mock 方法,字典类型 + when(dictTypeService.getDictType(eq(reqVO.getDictType()))).thenReturn(randomDictTypeDO(reqVO.getDictType())); + + // 调用 + dictDataService.updateDictData(reqVO); + // 校验是否更新正确 + DictDataDO dictData = dictDataMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, dictData); + } + + @Test + public void testDeleteDictData_success() { + // mock 数据 + DictDataDO dbDictData = randomDictDataDO(); + dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDictData.getId(); + + // 调用 + dictDataService.deleteDictData(id); + // 校验数据不存在了 + assertNull(dictDataMapper.selectById(id)); + } + + @Test + public void testCheckDictDataExists_success() { + // mock 数据 + DictDataDO dbDictData = randomDictDataDO(); + dictDataMapper.insert(dbDictData);// @Sql: 先插入出一条存在的数据 + + // 调用成功 + dictDataService.checkDictDataExists(dbDictData.getId()); + } + + @Test + public void testCheckDictDataExists_notExists() { + assertServiceException(() -> dictDataService.checkDictDataExists(randomLongId()), DICT_DATA_NOT_EXISTS); + } + + @Test + public void testCheckDictTypeValid_success() { + // mock 方法,数据类型被禁用 + String type = randomString(); + when(dictTypeService.getDictType(eq(type))).thenReturn(randomDictTypeDO(type)); + + // 调用, 成功 + dictDataService.checkDictTypeValid(type); + } + + @Test + public void testCheckDictTypeValid_notExists() { + assertServiceException(() -> dictDataService.checkDictTypeValid(randomString()), DICT_TYPE_NOT_EXISTS); + } + + @Test + public void testCheckDictTypeValid_notEnable() { + // mock 方法,数据类型被禁用 + String dictType = randomString(); + when(dictTypeService.getDictType(eq(dictType))).thenReturn( + randomPojo(DictTypeDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + + // 调用, 并断言异常 + assertServiceException(() -> dictDataService.checkDictTypeValid(dictType), DICT_TYPE_NOT_ENABLE); + } + + @Test + public void testCheckDictDataValueUnique_success() { + // 调用,成功 + dictDataService.checkDictDataValueUnique(randomLongId(), randomString(), randomString()); + } + + @Test + public void testCheckDictDataValueUnique_valueDuplicateForCreate() { + // 准备参数 + String dictType = randomString(); + String value = randomString(); + // mock 数据 + dictDataMapper.insert(randomDictDataDO(o -> { + o.setDictType(dictType); + o.setValue(value); + })); + + // 调用,校验异常 + assertServiceException(() -> dictDataService.checkDictDataValueUnique(null, dictType, value), + DICT_DATA_VALUE_DUPLICATE); + } + + @Test + public void testCheckDictDataValueUnique_valueDuplicateForUpdate() { + // 准备参数 + Long id = randomLongId(); + String dictType = randomString(); + String value = randomString(); + // mock 数据 + dictDataMapper.insert(randomDictDataDO(o -> { + o.setDictType(dictType); + o.setValue(value); + })); + + // 调用,校验异常 + assertServiceException(() -> dictDataService.checkDictDataValueUnique(id, dictType, value), + DICT_DATA_VALUE_DUPLICATE); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static DictDataDO randomDictDataDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomCommonStatus()); // 保证 status 的范围 + }; + return randomPojo(DictDataDO.class, ArrayUtils.append(consumer, consumers)); + } + + /** + * 生成一个有效的字典类型 + * + * @param type 字典类型 + * @return DictTypeDO 对象 + */ + private static DictTypeDO randomDictTypeDO(String type) { + return randomPojo(DictTypeDO.class, o -> { + o.setType(type); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 是开启 + }); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/dict/DictTypeServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/dict/DictTypeServiceTest.java new file mode 100644 index 0000000..f99dd48 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/dict/DictTypeServiceTest.java @@ -0,0 +1,272 @@ +package com.jojubanking.boot.module.system.service.dict; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeUpdateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictTypeDO; +import com.jojubanking.boot.module.system.dal.mysql.dict.DictTypeMapper; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +@Import(DictTypeServiceImpl.class) +public class DictTypeServiceTest extends BaseDbUnitTest { + + @Resource + private DictTypeServiceImpl dictTypeService; + + @Resource + private DictTypeMapper dictTypeMapper; + @MockBean + private DictDataService dictDataService; + + @Test + public void testGetDictTypePage() { + // mock 数据 + DictTypeDO dbDictType = randomPojo(DictTypeDO.class, o -> { // 等会查询到 + o.setName("yunai"); + o.setType("芋艿"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(buildTime(2021, 1, 15)); + }); + dictTypeMapper.insert(dbDictType); + // 测试 name 不匹配 + dictTypeMapper.insert(ObjectUtils.cloneIgnoreId(dbDictType, o -> o.setName("tudou"))); + // 测试 type 不匹配 + dictTypeMapper.insert(ObjectUtils.cloneIgnoreId(dbDictType, o -> o.setType("土豆"))); + // 测试 status 不匹配 + dictTypeMapper.insert(ObjectUtils.cloneIgnoreId(dbDictType, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + dictTypeMapper.insert(ObjectUtils.cloneIgnoreId(dbDictType, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + DictTypePageReqVO reqVO = new DictTypePageReqVO(); + reqVO.setName("nai"); + reqVO.setType("艿"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2021, 1, 10),buildTime(2021, 1, 20)})); + + // 调用 + PageResult pageResult = dictTypeService.getDictTypePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbDictType, pageResult.getList().get(0)); + } + + @Test + public void testGetDictTypeList() { + // mock 数据 + DictTypeDO dbDictType = randomPojo(DictTypeDO.class, o -> { // 等会查询到 + o.setName("yunai"); + o.setType("芋艿"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(buildTime(2021, 1, 15)); + }); + dictTypeMapper.insert(dbDictType); + // 测试 name 不匹配 + dictTypeMapper.insert(ObjectUtils.cloneIgnoreId(dbDictType, o -> o.setName("tudou"))); + // 测试 type 不匹配 + dictTypeMapper.insert(ObjectUtils.cloneIgnoreId(dbDictType, o -> o.setType("土豆"))); + // 测试 status 不匹配 + dictTypeMapper.insert(ObjectUtils.cloneIgnoreId(dbDictType, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + dictTypeMapper.insert(ObjectUtils.cloneIgnoreId(dbDictType, o -> o.setCreateTime(buildTime(2021, 1, 1)))); + // 准备参数 + DictTypeExportReqVO reqVO = new DictTypeExportReqVO(); + reqVO.setName("nai"); + reqVO.setType("艿"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2021, 1, 10),buildTime(2021, 1, 20)})); + + // 调用 + List list = dictTypeService.getDictTypeList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbDictType, list.get(0)); + } + + @Test + public void testGetDictType() { + // mock 数据 + DictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType); + // 准备参数 + String type = dbDictType.getType(); + + // 调用 + DictTypeDO dictType = dictTypeService.getDictType(type); + // 断言 + assertNotNull(dictType); + assertPojoEquals(dbDictType, dictType); + } + + @Test + public void testCreateDictType_success() { + // 准备参数 + DictTypeCreateReqVO reqVO = randomPojo(DictTypeCreateReqVO.class, + o -> o.setStatus(randomEle(CommonStatusEnum.values()).getStatus())); + + // 调用 + Long dictTypeId = dictTypeService.createDictType(reqVO); + // 断言 + assertNotNull(dictTypeId); + // 校验记录的属性是否正确 + DictTypeDO dictType = dictTypeMapper.selectById(dictTypeId); + assertPojoEquals(reqVO, dictType); + } + + @Test + public void testUpdateDictType_success() { + // mock 数据 + DictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + DictTypeUpdateReqVO reqVO = randomPojo(DictTypeUpdateReqVO.class, o -> { + o.setId(dbDictType.getId()); // 设置更新的 ID + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); + }); + + // 调用 + dictTypeService.updateDictType(reqVO); + // 校验是否更新正确 + DictTypeDO dictType = dictTypeMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, dictType); + } + + @Test + public void testDeleteDictType_success() { + // mock 数据 + DictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDictType.getId(); + + // 调用 + dictTypeService.deleteDictType(id); + // 校验数据不存在了 + assertNull(dictTypeMapper.selectById(id)); + } + + @Test + public void testDeleteDictType_hasChildren() { + // mock 数据 + DictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbDictType.getId(); + // mock 方法 + when(dictDataService.countByDictType(eq(dbDictType.getType()))).thenReturn(1L); + + // 调用, 并断言异常 + assertServiceException(() -> dictTypeService.deleteDictType(id), DICT_TYPE_HAS_CHILDREN); + } + + @Test + public void testCheckDictDataExists_success() { + // mock 数据 + DictTypeDO dbDictType = randomDictTypeDO(); + dictTypeMapper.insert(dbDictType);// @Sql: 先插入出一条存在的数据 + + // 调用成功 + dictTypeService.checkDictTypeExists(dbDictType.getId()); + } + + @Test + public void testCheckDictDataExists_notExists() { + assertServiceException(() -> dictTypeService.checkDictTypeExists(randomLongId()), DICT_TYPE_NOT_EXISTS); + } + + @Test + public void testCheckDictTypeUnique_success() { + // 调用,成功 + dictTypeService.checkDictTypeUnique(randomLongId(), randomString()); + } + + @Test + public void testCheckDictTypeUnique_valueDuplicateForCreate() { + // 准备参数 + String type = randomString(); + // mock 数据 + dictTypeMapper.insert(randomDictTypeDO(o -> o.setType(type))); + + // 调用,校验异常 + assertServiceException(() -> dictTypeService.checkDictTypeUnique(null, type), + DICT_TYPE_TYPE_DUPLICATE); + } + + @Test + public void testCheckDictTypeUnique_valueDuplicateForUpdate() { + // 准备参数 + Long id = randomLongId(); + String type = randomString(); + // mock 数据 + dictTypeMapper.insert(randomDictTypeDO(o -> o.setType(type))); + + // 调用,校验异常 + assertServiceException(() -> dictTypeService.checkDictTypeUnique(id, type), + DICT_TYPE_TYPE_DUPLICATE); + } + + @Test + public void testCheckDictTypNameUnique_success() { + // 调用,成功 + dictTypeService.checkDictTypeNameUnique(randomLongId(), randomString()); + } + + @Test + public void testCheckDictTypeNameUnique_nameDuplicateForCreate() { + // 准备参数 + String name = randomString(); + // mock 数据 + dictTypeMapper.insert(randomDictTypeDO(o -> o.setName(name))); + + // 调用,校验异常 + assertServiceException(() -> dictTypeService.checkDictTypeNameUnique(null, name), + DICT_TYPE_NAME_DUPLICATE); + } + + @Test + public void testCheckDictTypeNameUnique_nameDuplicateForUpdate() { + // 准备参数 + Long id = randomLongId(); + String name = randomString(); + // mock 数据 + dictTypeMapper.insert(randomDictTypeDO(o -> o.setName(name))); + + // 调用,校验异常 + assertServiceException(() -> dictTypeService.checkDictTypeNameUnique(id, name), + DICT_TYPE_NAME_DUPLICATE); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static DictTypeDO randomDictTypeDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(DictTypeDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeServiceTest.java new file mode 100644 index 0000000..36a08c7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeServiceTest.java @@ -0,0 +1,292 @@ +package com.jojubanking.boot.module.system.service.errorcode; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.errorcode.ErrorCodeDO; +import com.jojubanking.boot.module.system.dal.mysql.errorcode.ErrorCodeMapper; +import com.jojubanking.boot.module.system.enums.errorcode.ErrorCodeTypeEnum; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.ERROR_CODE_DUPLICATE; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.ERROR_CODE_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; + +@Import(ErrorCodeServiceImpl.class) +public class ErrorCodeServiceTest extends BaseDbUnitTest { + + @Resource + private ErrorCodeServiceImpl errorCodeService; + + @Resource + private ErrorCodeMapper errorCodeMapper; + + @Test + public void testCreateErrorCode_success() { + // 准备参数 + ErrorCodeCreateReqVO reqVO = randomPojo(ErrorCodeCreateReqVO.class); + + // 调用 + Long errorCodeId = errorCodeService.createErrorCode(reqVO); + // 断言 + assertNotNull(errorCodeId); + // 校验记录的属性是否正确 + ErrorCodeDO errorCode = errorCodeMapper.selectById(errorCodeId); + assertPojoEquals(reqVO, errorCode); + assertEquals(ErrorCodeTypeEnum.MANUAL_OPERATION.getType(), errorCode.getType()); + } + + @Test + public void testUpdateErrorCode_success() { + // mock 数据 + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(); + errorCodeMapper.insert(dbErrorCode);// @Sql: 先插入出一条存在的数据 + // 准备参数 + ErrorCodeUpdateReqVO reqVO = randomPojo(ErrorCodeUpdateReqVO.class, o -> { + o.setId(dbErrorCode.getId()); // 设置更新的 ID + }); + + // 调用 + errorCodeService.updateErrorCode(reqVO); + // 校验是否更新正确 + ErrorCodeDO errorCode = errorCodeMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, errorCode); + assertEquals(ErrorCodeTypeEnum.MANUAL_OPERATION.getType(), errorCode.getType()); + } + + @Test + public void testDeleteErrorCode_success() { + // mock 数据 + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(); + errorCodeMapper.insert(dbErrorCode);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbErrorCode.getId(); + + // 调用 + errorCodeService.deleteErrorCode(id); + // 校验数据不存在了 + assertNull(errorCodeMapper.selectById(id)); + } + + @Test + public void testGetErrorCodePage() { + // mock 数据 + ErrorCodeDO dbErrorCode = initGetErrorCodePage(); + // 准备参数 + ErrorCodePageReqVO reqVO = new ErrorCodePageReqVO(); + reqVO.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType()); + reqVO.setApplicationName("tu"); + reqVO.setCode(1); + reqVO.setMessage("ma"); + reqVO.setCreateTime((new Date[]{buildTime(2020, 11, 1),buildTime(2020, 11, 30)})); + + // 调用 + PageResult pageResult = errorCodeService.getErrorCodePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbErrorCode, pageResult.getList().get(0)); + } + + /** + * 初始化 getErrorCodePage 方法的测试数据 + */ + private ErrorCodeDO initGetErrorCodePage() { + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> { // 等会查询到 + o.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType()); + o.setApplicationName("tudou"); + o.setCode(1); + o.setMessage("yuanma"); + o.setCreateTime(buildTime(2020, 11, 11)); + }); + errorCodeMapper.insert(dbErrorCode); + // 测试 type 不匹配 + errorCodeMapper.insert(ObjectUtils.cloneIgnoreId(dbErrorCode, o -> o.setType(ErrorCodeTypeEnum.MANUAL_OPERATION.getType()))); + // 测试 applicationName 不匹配 + errorCodeMapper.insert(ObjectUtils.cloneIgnoreId(dbErrorCode, o -> o.setApplicationName("yuan"))); + // 测试 code 不匹配 + errorCodeMapper.insert(ObjectUtils.cloneIgnoreId(dbErrorCode, o -> o.setCode(2))); + // 测试 message 不匹配 + errorCodeMapper.insert(ObjectUtils.cloneIgnoreId(dbErrorCode, o -> o.setMessage("nai"))); + // 测试 createTime 不匹配 + errorCodeMapper.insert(ObjectUtils.cloneIgnoreId(dbErrorCode, o -> o.setCreateTime(buildTime(2020, 12, 12)))); + return dbErrorCode; + } + + @Test + public void testGetErrorCodeList() { + // mock 数据 + ErrorCodeDO dbErrorCode = initGetErrorCodePage(); + // 准备参数 + ErrorCodeExportReqVO reqVO = new ErrorCodeExportReqVO(); + reqVO.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType()); + reqVO.setApplicationName("tu"); + reqVO.setCode(1); + reqVO.setMessage("ma"); + reqVO.setCreateTime((new Date[]{buildTime(2020, 11, 1),buildTime(2020, 11, 30)})); + + // 调用 + List list = errorCodeService.getErrorCodeList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbErrorCode, list.get(0)); + } + + @Test + public void testValidateCodeDuplicate_codeDuplicateForCreate() { + // 准备参数 + Integer code = randomInteger(); + // mock 数据 + errorCodeMapper.insert(randomInfErrorCodeDO(o -> o.setCode(code))); + + // 调用,校验异常 + assertServiceException(() -> errorCodeService.validateCodeDuplicate(code, null), + ERROR_CODE_DUPLICATE); + } + + @Test + public void testValidateCodeDuplicate_codeDuplicateForUpdate() { + // 准备参数 + Long id = randomLongId(); + Integer code = randomInteger(); + // mock 数据 + errorCodeMapper.insert(randomInfErrorCodeDO(o -> o.setCode(code))); + + // 调用,校验异常 + assertServiceException(() -> errorCodeService.validateCodeDuplicate(code, id), + ERROR_CODE_DUPLICATE); + } + + @Test + public void testValidateErrorCodeExists_notExists() { + assertServiceException(() -> errorCodeService.validateErrorCodeExists(null), + ERROR_CODE_NOT_EXISTS); + } + + /** + * 情况 1,错误码不存在的情况 + */ + @Test + public void testAutoGenerateErrorCodes_01() { + // 准备参数 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class); + // mock 方法 + + // 调用 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); + // 断言 + ErrorCodeDO errorCode = errorCodeMapper.selectOne(null); + assertPojoEquals(generateReqDTO, errorCode); + assertEquals(ErrorCodeTypeEnum.AUTO_GENERATION.getType(), errorCode.getType()); + } + + /** + * 情况 2.1,错误码存在,但是是 ErrorCodeTypeEnum.MANUAL_OPERATION 类型 + */ + @Test + public void testAutoGenerateErrorCodes_021() { + // mock 数据 + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(ErrorCodeTypeEnum.MANUAL_OPERATION.getType())); + errorCodeMapper.insert(dbErrorCode); + // 准备参数 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, + o -> o.setCode(dbErrorCode.getCode())); + // mock 方法 + + // 调用 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); + // 断言,相等,说明不会更新 + ErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); + assertPojoEquals(dbErrorCode, errorCode); + } + + /** + * 情况 2.2,错误码存在,但是是 applicationName 不匹配 + */ + @Test + public void testAutoGenerateErrorCodes_022() { + // mock 数据 + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType())); + errorCodeMapper.insert(dbErrorCode); + // 准备参数 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, + o -> o.setCode(dbErrorCode.getCode()).setApplicationName(randomString())); + // mock 方法 + + // 调用 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); + // 断言,相等,说明不会更新 + ErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); + assertPojoEquals(dbErrorCode, errorCode); + } + + /** + * 情况 2.3,错误码存在,但是是 message 相同 + */ + @Test + public void testAutoGenerateErrorCodes_023() { + // mock 数据 + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType())); + errorCodeMapper.insert(dbErrorCode); + // 准备参数 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, + o -> o.setCode(dbErrorCode.getCode()).setApplicationName(dbErrorCode.getApplicationName()) + .setMessage(dbErrorCode.getMessage())); + // mock 方法 + + // 调用 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); + // 断言,相等,说明不会更新 + ErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); + assertPojoEquals(dbErrorCode, errorCode); + } + + /** + * 情况 2.3,错误码存在,但是是 message 不同,则进行更新 + */ + @Test + public void testAutoGenerateErrorCodes_024() { + // mock 数据 + ErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(ErrorCodeTypeEnum.AUTO_GENERATION.getType())); + errorCodeMapper.insert(dbErrorCode); + // 准备参数 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class, + o -> o.setCode(dbErrorCode.getCode()).setApplicationName(dbErrorCode.getApplicationName())); + // mock 方法 + + // 调用 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO)); + // 断言,匹配 + ErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId()); + assertPojoEquals(generateReqDTO, errorCode); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static ErrorCodeDO randomInfErrorCodeDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setType(randomEle(ErrorCodeTypeEnum.values()).getType()); // 保证 key 的范围 + }; + return randomPojo(ErrorCodeDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/logger/LoginLogServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/logger/LoginLogServiceImplTest.java new file mode 100644 index 0000000..3b924e2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/logger/LoginLogServiceImplTest.java @@ -0,0 +1,140 @@ +package com.jojubanking.boot.module.system.service.logger; + +import cn.hutool.core.util.RandomUtil; +import com.jojubanking.boot.module.system.dal.dataobject.logger.LoginLogDO; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.monitor.TracerUtils; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogPageReqVO; +import com.jojubanking.boot.module.system.dal.mysql.logger.LoginLogMapper; +import com.jojubanking.boot.framework.test.core.util.RandomUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.module.system.enums.logger.LoginLogTypeEnum; +import com.jojubanking.boot.module.system.enums.logger.LoginResultEnum; +import com.jojubanking.boot.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Import(LoginLogServiceImpl.class) +public class LoginLogServiceImplTest extends BaseDbUnitTest { + + @Resource + private LoginLogServiceImpl loginLogService; + + @Resource + private LoginLogMapper loginLogMapper; + + @Test + public void testGetLoginLogPage() { + // 构造测试数据 + // 登录成功的 + LoginLogDO loginLogDO = RandomUtils.randomPojo(LoginLogDO.class, logDO -> { + logDO.setLogType(RandomUtil.randomEle(com.jojubanking.boot.module.system.enums.logger.LoginLogTypeEnum.values()).getType()); + logDO.setTraceId(TracerUtils.getTraceId()); + logDO.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()); + + logDO.setUserIp("192.168.199.16"); + logDO.setUsername("wangkai"); + logDO.setCreateTime(buildTime(2021, 3, 6)); + logDO.setResult(com.jojubanking.boot.module.system.enums.logger.LoginResultEnum.SUCCESS.getResult()); + }); + loginLogMapper.insert(loginLogDO); + + // 下面几个都是不匹配的数据 + // 登录失败的 + loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setResult(com.jojubanking.boot.module.system.enums.logger.LoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); + // 不同ip段的 + loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18"))); + // 不同username + loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setUsername("yunai"))); + // 构造一个早期时间 2021-02-06 00:00:00 + loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setCreateTime(buildTime(2021, 2, 6)))); + + + // 构造调用参数 + LoginLogPageReqVO reqVO = new LoginLogPageReqVO(); + reqVO.setUsername("wangkai"); + reqVO.setUserIp("192.168.199"); + reqVO.setStatus(true); + reqVO.setCreateTime((new Date[]{buildTime(2021, 3, 5),buildTime(2021, 3, 5)})); + + // 调用service方法 + PageResult pageResult = loginLogService.getLoginLogPage(reqVO); + + // 断言,只查到了一条符合条件的 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(loginLogDO, pageResult.getList().get(0)); + } + + @Test + public void testGetLoginLogList() { + // 构造测试数据 + + // 登录成功的 + LoginLogDO loginLogDO = RandomUtils.randomPojo(LoginLogDO.class, logDO -> { + logDO.setLogType(RandomUtil.randomEle(com.jojubanking.boot.module.system.enums.logger.LoginLogTypeEnum.values()).getType()); + logDO.setTraceId(TracerUtils.getTraceId()); + logDO.setUserType(RandomUtil.randomEle(UserTypeEnum.values()).getValue()); + + logDO.setUserIp("192.168.111.16"); + logDO.setUsername("wangxiaokai"); + logDO.setCreateTime(buildTime(2021, 3, 6)); + logDO.setResult(com.jojubanking.boot.module.system.enums.logger.LoginResultEnum.SUCCESS.getResult()); + }); + loginLogMapper.insert(loginLogDO); + + // 下面几个都是不匹配的数据 + // 登录失败的 + loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setResult(com.jojubanking.boot.module.system.enums.logger.LoginResultEnum.CAPTCHA_CODE_ERROR.getResult()))); + // 不同ip段的 + loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18"))); + // 不同username + loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setUsername("yunai"))); + // 构造一个早期时间 2021-02-06 00:00:00 + loginLogMapper.insert(ObjectUtils.cloneIgnoreId(loginLogDO, logDO -> logDO.setCreateTime(buildTime(2021, 2, 6)))); + + // 构造调用参数 + LoginLogExportReqVO reqVO = new LoginLogExportReqVO(); + reqVO.setUsername("wangxiaokai"); + reqVO.setUserIp("192.168.111"); + reqVO.setStatus(true); + reqVO.setCreateTime((new Date[]{buildTime(2021, 3, 5),buildTime(2021, 3, 5)})); + + // 调用service方法 + List loginLogList = loginLogService.getLoginLogList(reqVO); + + // 断言 + assertEquals(1, loginLogList.size()); + assertPojoEquals(loginLogDO, loginLogList.get(0)); + } + + @Test + public void testCreateLoginLog() { + LoginLogCreateReqDTO reqDTO = RandomUtils.randomPojo(LoginLogCreateReqDTO.class, vo -> { + // 指定随机的范围,避免超出范围入库失败 + vo.setUserType(randomEle(UserTypeEnum.values()).getValue()); + vo.setLogType(randomEle(LoginLogTypeEnum.values()).getType()); + vo.setResult(randomEle(LoginResultEnum.values()).getResult()); + vo.setTraceId(TracerUtils.getTraceId()); + }); + + // 调用 + loginLogService.createLoginLog(reqDTO); + // 断言,忽略基本字段 + LoginLogDO sysLoginLogDO = loginLogMapper.selectOne(null); + assertPojoEquals(reqDTO, sysLoginLogDO); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/logger/OperateLogServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/logger/OperateLogServiceImplTest.java new file mode 100644 index 0000000..51d52a8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/logger/OperateLogServiceImplTest.java @@ -0,0 +1,168 @@ +package com.jojubanking.boot.module.system.service.logger; + +import cn.hutool.core.map.MapUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.monitor.TracerUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.operatelog.core.enums.OperateTypeEnum; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.framework.test.core.util.RandomUtils; +import com.jojubanking.boot.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.logger.OperateLogDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.dal.mysql.logger.OperateLogMapper; +import com.jojubanking.boot.module.system.enums.common.SexEnum; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomLongId; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +@Import({OperateLogServiceImpl.class}) +public class OperateLogServiceImplTest extends BaseDbUnitTest { + + @Resource + private OperateLogService operateLogServiceImpl; + + @Resource + private OperateLogMapper operateLogMapper; + + @MockBean + private AdminUserService userService; + + @Test + public void testCreateOperateLogAsync() { + String traceId = TracerUtils.getTraceId(); + OperateLogCreateReqDTO reqVO = RandomUtils.randomPojo(OperateLogCreateReqDTO.class, o -> { + o.setTraceId(traceId); + o.setUserId(randomLongId()); + o.setUserType(randomEle(UserTypeEnum.values()).getValue()); + o.setExts(MapUtil.builder("orderId", randomLongId()).build()); + }); + + // 执行service方法 + operateLogServiceImpl.createOperateLog(reqVO); + // 断言插入是否正确 + OperateLogDO sysOperateLogDO = operateLogMapper.selectOne("trace_id", traceId); + assertPojoEquals(reqVO, sysOperateLogDO); + } + + @Test + public void testGetOperateLogPage() { + // 构造测试数据 + // 先构造用户 + AdminUserDO user = RandomUtils.randomPojo(AdminUserDO.class, o -> { + o.setNickname("wangkai"); + o.setSex(SexEnum.MALE.getSex()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user)); + Long userId = user.getId(); + // 构造操作日志 + OperateLogDO sysOperateLogDO = RandomUtils.randomPojo(OperateLogDO.class, o -> { + o.setUserId(userId); + o.setUserType(randomEle(UserTypeEnum.values()).getValue()); + o.setModule("order"); + o.setType(OperateTypeEnum.CREATE.getType()); + o.setStartTime(buildTime(2021, 3, 6)); + o.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()); + o.setExts(MapUtil.builder("orderId", randomLongId()).build()); + }); + operateLogMapper.insert(sysOperateLogDO); + + // 下面几个是不匹配的数据 + // 随机 userId + operateLogMapper.insert(ObjectUtils.cloneIgnoreId(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1))); + // module 不同 + operateLogMapper.insert(ObjectUtils.cloneIgnoreId(sysOperateLogDO, logDO -> logDO.setModule("user"))); + // type 不同 + operateLogMapper.insert(ObjectUtils.cloneIgnoreId(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType()))); + // createTime 不同 + operateLogMapper.insert(ObjectUtils.cloneIgnoreId(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6)))); + // resultCode 不同 + operateLogMapper.insert(ObjectUtils.cloneIgnoreId(sysOperateLogDO, logDO -> logDO.setResultCode(BAD_REQUEST.getCode()))); + + // 构造调用参数 + OperateLogPageReqVO reqVO = new OperateLogPageReqVO(); + reqVO.setUserNickname("wangkai"); + reqVO.setModule("order"); + reqVO.setType(OperateTypeEnum.CREATE.getType()); + reqVO.setStartTime((new Date[]{buildTime(2021, 3, 5),buildTime(2021, 3, 7)})); + reqVO.setSuccess(true); + + // 调用service方法 + PageResult pageResult = operateLogServiceImpl.getOperateLogPage(reqVO); + // 断言,只查到了一条符合条件的 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(sysOperateLogDO, pageResult.getList().get(0)); + } + + @Test + public void testGetOperateLogs() { + // 构造测试数据 + // 先构造用户 + AdminUserDO user = RandomUtils.randomPojo(AdminUserDO.class, o -> { + o.setNickname("wangkai"); + o.setSex(SexEnum.MALE.getSex()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(userService.getUsersByNickname("wangkai")).thenReturn(Collections.singletonList(user)); + Long userId = user.getId(); + // 构造操作日志 + OperateLogDO sysOperateLogDO = RandomUtils.randomPojo(OperateLogDO.class, o -> { + o.setUserId(userId); + o.setUserType(randomEle(UserTypeEnum.values()).getValue()); + o.setModule("order"); + o.setType(OperateTypeEnum.CREATE.getType()); + o.setStartTime(buildTime(2021, 3, 6)); + o.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()); + o.setExts(MapUtil.builder("orderId", randomLongId()).build()); + }); + operateLogMapper.insert(sysOperateLogDO); + + // 下面几个是不匹配的数据 + // 随机 userId + operateLogMapper.insert(ObjectUtils.cloneIgnoreId(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1))); + // module 不同 + operateLogMapper.insert(ObjectUtils.cloneIgnoreId(sysOperateLogDO, logDO -> logDO.setModule("user"))); + // type 不同 + operateLogMapper.insert(ObjectUtils.cloneIgnoreId(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType()))); + // createTime 不同 + operateLogMapper.insert(ObjectUtils.cloneIgnoreId(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6)))); + // resultCode 不同 + operateLogMapper.insert(ObjectUtils.cloneIgnoreId(sysOperateLogDO, logDO -> logDO.setResultCode(BAD_REQUEST.getCode()))); + + // 构造调用参数 + OperateLogExportReqVO reqVO = new OperateLogExportReqVO(); + reqVO.setUserNickname("wangkai"); + reqVO.setModule("order"); + reqVO.setType(OperateTypeEnum.CREATE.getType()); + reqVO.setStartTime((new Date[]{buildTime(2021, 3, 5),buildTime(2021, 3, 7)})); + reqVO.setSuccess(true); + + // 调用 service 方法 + List list = operateLogServiceImpl.getOperateLogs(reqVO); + // 断言,只查到了一条符合条件的 + assertEquals(1, list.size()); + assertPojoEquals(sysOperateLogDO, list.get(0)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/notice/NoticeServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/notice/NoticeServiceImplTest.java new file mode 100644 index 0000000..99f7760 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/notice/NoticeServiceImplTest.java @@ -0,0 +1,163 @@ +package com.jojubanking.boot.module.system.service.notice; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.notice.NoticeDO; +import com.jojubanking.boot.module.system.dal.mysql.notice.NoticeMapper; +import com.jojubanking.boot.module.system.enums.notice.NoticeTypeEnum; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.NOTICE_NOT_FOUND; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomLongId; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static org.junit.jupiter.api.Assertions.*; + +@Import(NoticeServiceImpl.class) +class NoticeServiceImplTest extends BaseDbUnitTest { + + @Resource + private NoticeServiceImpl sysNoticeService; + + @Resource + private NoticeMapper sysNoticeMapper; + + @Test + public void testPageNotices_success() { + // 插入前置数据 + NoticeDO dbNotice = randomPojo(NoticeDO.class, o -> { + o.setTitle("尼古拉斯赵四来啦!"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setType(randomEle(NoticeTypeEnum.values()).getType()); + }); + sysNoticeMapper.insert(dbNotice); + + // 测试 title 不匹配 + sysNoticeMapper.insert(ObjectUtils.cloneIgnoreId(dbNotice, o -> o.setTitle("尼古拉斯凯奇也来啦!"))); + // 测试 status 不匹配 + sysNoticeMapper.insert(ObjectUtils.cloneIgnoreId(dbNotice, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + + + // 查询 + NoticePageReqVO reqVO = new NoticePageReqVO(); + reqVO.setTitle("尼古拉斯赵四来啦!"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + PageResult pageResult = sysNoticeService.pageNotices(reqVO); + + // 验证查询结果经过筛选 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbNotice, pageResult.getList().get(0)); + + } + + @Test + public void testGetNotice_success() { + // 插入前置数据 + NoticeDO dbNotice = randomNoticeDO(); + sysNoticeMapper.insert(dbNotice); + + // 查询 + NoticeDO notice = sysNoticeService.getNotice(dbNotice.getId()); + + // 验证插入与读取对象是否一致 + assertNotNull(notice); + assertPojoEquals(dbNotice, notice); + } + + @Test + public void testCreateNotice_success() { + // 准备参数 + NoticeCreateReqVO reqVO = randomNoticeCreateReqVO(); + + // 校验插入是否成功 + Long noticeId = sysNoticeService.createNotice(reqVO); + assertNotNull(noticeId); + + // 校验插入属性是否正确 + NoticeDO notice = sysNoticeMapper.selectById(noticeId); + assertPojoEquals(reqVO, notice); + } + + @Test + public void testUpdateNotice_success() { + // 插入前置数据 + NoticeDO dbNoticeDO = randomNoticeDO(); + sysNoticeMapper.insert(dbNoticeDO); + + // 准备更新参数 + NoticeUpdateReqVO reqVO = randomNoticeUpdateReqVO(o -> o.setId(dbNoticeDO.getId())); + + // 更新 + sysNoticeService.updateNotice(reqVO); + + // 检验是否更新成功 + NoticeDO notice = sysNoticeMapper.selectById(reqVO.getId()); + assertPojoEquals(reqVO, notice); + } + + @Test + public void testDeleteNotice_success() { + // 插入前置数据 + NoticeDO dbNotice = randomNoticeDO(); + sysNoticeMapper.insert(dbNotice); + + // 删除 + sysNoticeService.deleteNotice(dbNotice.getId()); + + // 检查是否删除成功 + assertNull(sysNoticeMapper.selectById(dbNotice.getId())); + } + + @Test + public void checkNoticeExists_success() { + // 插入前置数据 + NoticeDO dbNotice = randomNoticeDO(); + sysNoticeMapper.insert(dbNotice); + + // 成功调用 + sysNoticeService.checkNoticeExists(dbNotice.getId()); + } + + @Test + public void checkNoticeExists_noExists() { + assertServiceException(() -> sysNoticeService.checkNoticeExists(randomLongId()), NOTICE_NOT_FOUND); + } + + @SafeVarargs + private static NoticeDO randomNoticeDO(Consumer... consumers) { + NoticeDO notice = randomPojo(NoticeDO.class, consumers); + notice.setType(randomEle(NoticeTypeEnum.values()).getType()); + notice.setStatus(CommonStatusEnum.ENABLE.getStatus()); + return notice; + } + + @SafeVarargs + private static NoticeUpdateReqVO randomNoticeUpdateReqVO(Consumer... consumers) { + NoticeUpdateReqVO reqVO = randomPojo(NoticeUpdateReqVO.class, consumers); + reqVO.setType(randomEle(NoticeTypeEnum.values()).getType()); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + return reqVO; + } + + private static NoticeCreateReqVO randomNoticeCreateReqVO() { + NoticeCreateReqVO reqVO = randomPojo(NoticeCreateReqVO.class); + reqVO.setType(randomEle(NoticeTypeEnum.values()).getType()); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + return reqVO; + } + + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveServiceImplTest.java new file mode 100644 index 0000000..a03ae7e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveServiceImplTest.java @@ -0,0 +1,267 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import cn.hutool.core.util.ObjectUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ApproveDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.jojubanking.boot.module.system.dal.mysql.oauth2.OAuth2ApproveMapper; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.time.Duration; +import java.util.*; + +import static cn.hutool.core.util.RandomUtil.*; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.addTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomString; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +/** + * {@link OAuth2ApproveServiceImpl} 的单元测试类 + * + * @author TW + */ +@Import(OAuth2ApproveServiceImpl.class) +public class OAuth2ApproveServiceImplTest extends BaseDbUnitTest { + + @Resource + private OAuth2ApproveServiceImpl oauth2ApproveService; + + @Resource + private OAuth2ApproveMapper oauth2ApproveMapper; + + @MockBean + private OAuth2ClientService oauth2ClientService; + + @Test + public void checkForPreApproval_clientAutoApprove() { + // 准备参数 + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String clientId = randomString(); + List requestedScopes = Lists.newArrayList("read"); + // mock 方法 + when(oauth2ClientService.validOAuthClientFromCache(eq(clientId))) + .thenReturn(randomPojo(OAuth2ClientDO.class).setAutoApproveScopes(requestedScopes)); + + // 调用 + boolean success = oauth2ApproveService.checkForPreApproval(userId, userType, + clientId, requestedScopes); + // 断言 + assertTrue(success); + List result = oauth2ApproveMapper.selectList(); + assertEquals(1, result.size()); + assertEquals(userId, result.get(0).getUserId()); + assertEquals(userType, result.get(0).getUserType()); + assertEquals(clientId, result.get(0).getClientId()); + assertEquals("read", result.get(0).getScope()); + assertTrue(result.get(0).getApproved()); + assertFalse(DateUtils.isExpired(result.get(0).getExpiresTime())); + } + + @Test + public void checkForPreApproval_approve() { + // 准备参数 + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String clientId = randomString(); + List requestedScopes = Lists.newArrayList("read"); + // mock 方法 + when(oauth2ClientService.validOAuthClientFromCache(eq(clientId))) + .thenReturn(randomPojo(OAuth2ClientDO.class).setAutoApproveScopes(null)); + // mock 数据 + OAuth2ApproveDO approve = randomPojo(OAuth2ApproveDO.class).setUserId(userId) + .setUserType(userType).setClientId(clientId).setScope("read") + .setExpiresTime(addTime(Duration.ofDays(1))).setApproved(true); // 同意 + oauth2ApproveMapper.insert(approve); + + // 调用 + boolean success = oauth2ApproveService.checkForPreApproval(userId, userType, + clientId, requestedScopes); + // 断言 + assertTrue(success); + } + + @Test + public void checkForPreApproval_reject() { + // 准备参数 + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String clientId = randomString(); + List requestedScopes = Lists.newArrayList("read"); + // mock 方法 + when(oauth2ClientService.validOAuthClientFromCache(eq(clientId))) + .thenReturn(randomPojo(OAuth2ClientDO.class).setAutoApproveScopes(null)); + // mock 数据 + OAuth2ApproveDO approve = randomPojo(OAuth2ApproveDO.class).setUserId(userId) + .setUserType(userType).setClientId(clientId).setScope("read") + .setExpiresTime(addTime(Duration.ofDays(1))).setApproved(false); // 拒绝 + oauth2ApproveMapper.insert(approve); + + // 调用 + boolean success = oauth2ApproveService.checkForPreApproval(userId, userType, + clientId, requestedScopes); + // 断言 + assertFalse(success); + } + + @Test + public void testUpdateAfterApproval_none() { + // 准备参数 + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String clientId = randomString(); + + // 调用 + boolean success = oauth2ApproveService.updateAfterApproval(userId, userType, clientId, + null); + // 断言 + assertTrue(success); + List result = oauth2ApproveMapper.selectList(); + assertEquals(0, result.size()); + } + + @Test + public void testUpdateAfterApproval_approved() { + // 准备参数 + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String clientId = randomString(); + Map requestedScopes = new LinkedHashMap<>(); // 有序,方便判断 + requestedScopes.put("read", true); + requestedScopes.put("write", false); + // mock 方法 + + // 调用 + boolean success = oauth2ApproveService.updateAfterApproval(userId, userType, clientId, + requestedScopes); + // 断言 + assertTrue(success); + List result = oauth2ApproveMapper.selectList(); + assertEquals(2, result.size()); + // read + assertEquals(userId, result.get(0).getUserId()); + assertEquals(userType, result.get(0).getUserType()); + assertEquals(clientId, result.get(0).getClientId()); + assertEquals("read", result.get(0).getScope()); + assertTrue(result.get(0).getApproved()); + assertFalse(DateUtils.isExpired(result.get(0).getExpiresTime())); + // write + assertEquals(userId, result.get(1).getUserId()); + assertEquals(userType, result.get(1).getUserType()); + assertEquals(clientId, result.get(1).getClientId()); + assertEquals("write", result.get(1).getScope()); + assertFalse(result.get(1).getApproved()); + assertFalse(DateUtils.isExpired(result.get(1).getExpiresTime())); + } + + @Test + public void testUpdateAfterApproval_reject() { + // 准备参数 + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String clientId = randomString(); + Map requestedScopes = new LinkedHashMap<>(); + requestedScopes.put("write", false); + // mock 方法 + + // 调用 + boolean success = oauth2ApproveService.updateAfterApproval(userId, userType, clientId, + requestedScopes); + // 断言 + assertFalse(success); + List result = oauth2ApproveMapper.selectList(); + assertEquals(1, result.size()); + // write + assertEquals(userId, result.get(0).getUserId()); + assertEquals(userType, result.get(0).getUserType()); + assertEquals(clientId, result.get(0).getClientId()); + assertEquals("write", result.get(0).getScope()); + assertFalse(result.get(0).getApproved()); + assertFalse(DateUtils.isExpired(result.get(0).getExpiresTime())); + } + + @Test + public void testGetApproveList() { + // 准备参数 + Long userId = 10L; + Integer userType = UserTypeEnum.ADMIN.getValue(); + String clientId = randomString(); + // mock 数据 + OAuth2ApproveDO approve = randomPojo(OAuth2ApproveDO.class).setUserId(userId) + .setUserType(userType).setClientId(clientId).setExpiresTime(addTime(Duration.ofDays(1L))); + oauth2ApproveMapper.insert(approve); // 未过期 + oauth2ApproveMapper.insert(ObjectUtil.clone(approve).setId(null) + .setExpiresTime(addTime(Duration.ofDays(-1L)))); // 已过期 + + // 调用 + List result = oauth2ApproveService.getApproveList(userId, userType, clientId); + // 断言 + assertEquals(1, result.size()); + assertPojoEquals(approve, result.get(0)); + } + + @Test + public void testSaveApprove_insert() { + // 准备参数 + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String clientId = randomString(); + String scope = randomString(); + Boolean approved = randomBoolean(); + Date expireTime = randomDay(1, 30); + // mock 方法 + + // 调用 + oauth2ApproveService.saveApprove(userId, userType, clientId, + scope, approved, expireTime); + // 断言 + List result = oauth2ApproveMapper.selectList(); + assertEquals(1, result.size()); + assertEquals(userId, result.get(0).getUserId()); + assertEquals(userType, result.get(0).getUserType()); + assertEquals(clientId, result.get(0).getClientId()); + assertEquals(scope, result.get(0).getScope()); + assertEquals(approved, result.get(0).getApproved()); + assertEquals(expireTime, result.get(0).getExpiresTime()); + } + + @Test + public void testSaveApprove_update() { + // mock 数据 + OAuth2ApproveDO approve = randomPojo(OAuth2ApproveDO.class); + oauth2ApproveMapper.insert(approve); + // 准备参数 + Long userId = approve.getUserId(); + Integer userType = approve.getUserType(); + String clientId = approve.getClientId(); + String scope = approve.getScope(); + Boolean approved = randomBoolean(); + Date expireTime = randomDay(1, 30); + // mock 方法 + + // 调用 + oauth2ApproveService.saveApprove(userId, userType, clientId, + scope, approved, expireTime); + // 断言 + List result = oauth2ApproveMapper.selectList(); + assertEquals(1, result.size()); + assertEquals(approve.getId(), result.get(0).getId()); + assertEquals(userId, result.get(0).getUserId()); + assertEquals(userType, result.get(0).getUserType()); + assertEquals(clientId, result.get(0).getClientId()); + assertEquals(scope, result.get(0).getScope()); + assertEquals(approved, result.get(0).getApproved()); + assertEquals(expireTime, result.get(0).getExpiresTime()); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientServiceImplTest.java new file mode 100644 index 0000000..f93c70c --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientServiceImplTest.java @@ -0,0 +1,215 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import cn.hutool.core.map.MapUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.jojubanking.boot.module.system.dal.mysql.oauth2.OAuth2ClientMapper; +import com.jojubanking.boot.module.system.mq.producer.auth.OAuth2ClientProducer; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Collections; +import java.util.Map; + +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.max; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.verify; + +/** +* {@link OAuth2ClientServiceImpl} 的单元测试类 +* +* @author TW +*/ +@Import(OAuth2ClientServiceImpl.class) +public class OAuth2ClientServiceImplTest extends BaseDbUnitTest { + + @Resource + private OAuth2ClientServiceImpl oauth2ClientService; + + @Resource + private OAuth2ClientMapper oauth2ClientMapper; + + @MockBean + private OAuth2ClientProducer oauth2ClientProducer; + + @Test + public void testInitLocalCache() { + // mock 数据 + OAuth2ClientDO clientDO1 = randomPojo(OAuth2ClientDO.class); + oauth2ClientMapper.insert(clientDO1); + OAuth2ClientDO clientDO2 = randomPojo(OAuth2ClientDO.class); + oauth2ClientMapper.insert(clientDO2); + + // 调用 + oauth2ClientService.initLocalCache(); + // 断言 clientCache 缓存 + Map clientCache = oauth2ClientService.getClientCache(); + assertEquals(2, clientCache.size()); + assertPojoEquals(clientDO1, clientCache.get(clientDO1.getClientId())); + assertPojoEquals(clientDO2, clientCache.get(clientDO2.getClientId())); + // 断言 maxUpdateTime 缓存 + assertEquals(max(clientDO1.getUpdateTime(), clientDO2.getUpdateTime()), oauth2ClientService.getMaxUpdateTime()); + } + + @Test + public void testCreateOAuth2Client_success() { + // 准备参数 + OAuth2ClientCreateReqVO reqVO = randomPojo(OAuth2ClientCreateReqVO.class, + o -> o.setLogo(randomString())); + + // 调用 + Long oauth2ClientId = oauth2ClientService.createOAuth2Client(reqVO); + // 断言 + assertNotNull(oauth2ClientId); + // 校验记录的属性是否正确 + OAuth2ClientDO oAuth2Client = oauth2ClientMapper.selectById(oauth2ClientId); + assertPojoEquals(reqVO, oAuth2Client); + verify(oauth2ClientProducer).sendOAuth2ClientRefreshMessage(); + } + + @Test + public void testUpdateOAuth2Client_success() { + // mock 数据 + OAuth2ClientDO dbOAuth2Client = randomPojo(OAuth2ClientDO.class); + oauth2ClientMapper.insert(dbOAuth2Client);// @Sql: 先插入出一条存在的数据 + // 准备参数 + OAuth2ClientUpdateReqVO reqVO = randomPojo(OAuth2ClientUpdateReqVO.class, o -> { + o.setId(dbOAuth2Client.getId()); // 设置更新的 ID + o.setLogo(randomString()); + }); + + // 调用 + oauth2ClientService.updateOAuth2Client(reqVO); + // 校验是否更新正确 + OAuth2ClientDO oAuth2Client = oauth2ClientMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, oAuth2Client); + verify(oauth2ClientProducer).sendOAuth2ClientRefreshMessage(); + } + + @Test + public void testUpdateOAuth2Client_notExists() { + // 准备参数 + OAuth2ClientUpdateReqVO reqVO = randomPojo(OAuth2ClientUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> oauth2ClientService.updateOAuth2Client(reqVO), OAUTH2_CLIENT_NOT_EXISTS); + } + + @Test + public void testDeleteOAuth2Client_success() { + // mock 数据 + OAuth2ClientDO dbOAuth2Client = randomPojo(OAuth2ClientDO.class); + oauth2ClientMapper.insert(dbOAuth2Client);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbOAuth2Client.getId(); + + // 调用 + oauth2ClientService.deleteOAuth2Client(id); + // 校验数据不存在了 + assertNull(oauth2ClientMapper.selectById(id)); + verify(oauth2ClientProducer).sendOAuth2ClientRefreshMessage(); + } + + @Test + public void testDeleteOAuth2Client_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> oauth2ClientService.deleteOAuth2Client(id), OAUTH2_CLIENT_NOT_EXISTS); + } + + @Test + public void testValidateClientIdExists_withId() { + // mock 数据 + OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("tudou"); + oauth2ClientMapper.insert(client); + // 准备参数 + Long id = randomLongId(); + String clientId = "tudou"; + + // 调用,不会报错 + assertServiceException(() -> oauth2ClientService.validateClientIdExists(id, clientId), OAUTH2_CLIENT_EXISTS); + } + + @Test + public void testValidateClientIdExists_noId() { + // mock 数据 + OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("tudou"); + oauth2ClientMapper.insert(client); + // 准备参数 + String clientId = "tudou"; + + // 调用,不会报错 + assertServiceException(() -> oauth2ClientService.validateClientIdExists(null, clientId), OAUTH2_CLIENT_EXISTS); + } + + @Test + public void testGetOAuth2ClientPage() { + // mock 数据 + OAuth2ClientDO dbOAuth2Client = randomPojo(OAuth2ClientDO.class, o -> { // 等会查询到 + o.setName("潜龙"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + oauth2ClientMapper.insert(dbOAuth2Client); + // 测试 name 不匹配 + oauth2ClientMapper.insert(cloneIgnoreId(dbOAuth2Client, o -> o.setName("凤凰"))); + // 测试 status 不匹配 + oauth2ClientMapper.insert(cloneIgnoreId(dbOAuth2Client, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 准备参数 + OAuth2ClientPageReqVO reqVO = new OAuth2ClientPageReqVO(); + reqVO.setName("龙"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + PageResult pageResult = oauth2ClientService.getOAuth2ClientPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbOAuth2Client, pageResult.getList().get(0)); + } + + @Test + public void testValidOAuthClientFromCache() { + // mock 方法 + OAuth2ClientDO client = randomPojo(OAuth2ClientDO.class).setClientId("default") + .setStatus(CommonStatusEnum.ENABLE.getStatus()); + OAuth2ClientDO client02 = randomPojo(OAuth2ClientDO.class).setClientId("disable") + .setStatus(CommonStatusEnum.DISABLE.getStatus()); + Map clientCache = MapUtil.builder() + .put(client.getClientId(), client) + .put(client02.getClientId(), client02).build(); + oauth2ClientService.setClientCache(clientCache); + + // 调用,并断言 + assertServiceException(() -> oauth2ClientService.validOAuthClientFromCache(randomString(), + null, null, null, null), OAUTH2_CLIENT_NOT_EXISTS); + assertServiceException(() -> oauth2ClientService.validOAuthClientFromCache("disable", + null, null, null, null), OAUTH2_CLIENT_DISABLE); + assertServiceException(() -> oauth2ClientService.validOAuthClientFromCache("default", + randomString(), null, null, null), OAUTH2_CLIENT_CLIENT_SECRET_ERROR); + assertServiceException(() -> oauth2ClientService.validOAuthClientFromCache("default", + null, randomString(), null, null), OAUTH2_CLIENT_AUTHORIZED_GRANT_TYPE_NOT_EXISTS); + assertServiceException(() -> oauth2ClientService.validOAuthClientFromCache("default", + null, null, Collections.singleton(randomString()), null), OAUTH2_CLIENT_SCOPE_OVER); + assertServiceException(() -> oauth2ClientService.validOAuthClientFromCache("default", + null, null, null, "test"), OAUTH2_CLIENT_REDIRECT_URI_NOT_MATCH, "test"); + // 成功调用 + OAuth2ClientDO result = oauth2ClientService.validOAuthClientFromCache(client.getClientId(), client.getSecret(), + client.getAuthorizedGrantTypes().get(0), client.getScopes(), client.getRedirectUris().get(0)); + assertPojoEquals(client, result); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeServiceImplTest.java new file mode 100644 index 0000000..81a3103 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeServiceImplTest.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import cn.hutool.core.util.RandomUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2CodeDO; +import com.jojubanking.boot.module.system.dal.mysql.oauth2.OAuth2CodeMapper; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.time.Duration; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.addTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.OAUTH2_CODE_EXPIRE; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.OAUTH2_CODE_NOT_EXISTS; +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link OAuth2CodeServiceImpl} 的单元测试类 + * + * @author TW + */ +@Import(OAuth2CodeServiceImpl.class) +class OAuth2CodeServiceImplTest extends BaseDbUnitTest { + + @Resource + private OAuth2CodeServiceImpl oauth2CodeService; + + @Resource + private OAuth2CodeMapper oauth2CodeMapper; + + @Test + public void testCreateAuthorizationCode() { + // 准备参数 + Long userId = randomLongId(); + Integer userType = RandomUtil.randomEle(UserTypeEnum.values()).getValue(); + String clientId = randomString(); + List scopes = Lists.newArrayList("read", "write"); + String redirectUri = randomString(); + String state = randomString(); + + // 调用 + OAuth2CodeDO codeDO = oauth2CodeService.createAuthorizationCode(userId, userType, clientId, + scopes, redirectUri, state); + // 断言 + OAuth2CodeDO dbCodeDO = oauth2CodeMapper.selectByCode(codeDO.getCode()); + assertPojoEquals(codeDO, dbCodeDO, "createTime", "updateTime", "deleted"); + assertEquals(userId, codeDO.getUserId()); + assertEquals(userType, codeDO.getUserType()); + assertEquals(clientId, codeDO.getClientId()); + assertEquals(scopes, codeDO.getScopes()); + assertEquals(redirectUri, codeDO.getRedirectUri()); + assertEquals(state, codeDO.getState()); + assertFalse(DateUtils.isExpired(codeDO.getExpiresTime())); + } + + @Test + public void testConsumeAuthorizationCode_null() { + // 调用,并断言 + assertServiceException(() -> oauth2CodeService.consumeAuthorizationCode(randomString()), + OAUTH2_CODE_NOT_EXISTS); + } + + @Test + public void testConsumeAuthorizationCode_expired() { + // 准备参数 + String code = "test_code"; + // mock 数据 + OAuth2CodeDO codeDO = randomPojo(OAuth2CodeDO.class).setCode(code) + .setExpiresTime(addTime(Duration.ofDays(-1))); + oauth2CodeMapper.insert(codeDO); + + // 调用,并断言 + assertServiceException(() -> oauth2CodeService.consumeAuthorizationCode(code), + OAUTH2_CODE_EXPIRE); + } + + @Test + public void testConsumeAuthorizationCode_success() { + // 准备参数 + String code = "test_code"; + // mock 数据 + OAuth2CodeDO codeDO = randomPojo(OAuth2CodeDO.class).setCode(code) + .setExpiresTime(addTime(Duration.ofDays(1))); + oauth2CodeMapper.insert(codeDO); + + // 调用 + OAuth2CodeDO result = oauth2CodeService.consumeAuthorizationCode(code); + assertPojoEquals(codeDO, result); + assertNull(oauth2CodeMapper.selectByCode(code)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantServiceImplTest.java new file mode 100644 index 0000000..7344575 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantServiceImplTest.java @@ -0,0 +1,165 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2CodeDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.service.auth.AdminAuthService; +import com.google.common.collect.Lists; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.List; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +/** + * {@link OAuth2GrantServiceImpl} 的单元测试 + * + * @author TW + */ +public class OAuth2GrantServiceImplTest extends BaseMockitoUnitTest { + + @InjectMocks + private OAuth2GrantServiceImpl oauth2GrantService; + + @Mock + private OAuth2TokenService oauth2TokenService; + @Mock + private OAuth2CodeService oauth2CodeService; + @Mock + private AdminAuthService adminAuthService; + + @Test + public void testGrantImplicit() { + // 准备参数 + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String clientId = randomString(); + List scopes = Lists.newArrayList("read", "write"); + // mock 方法 + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class); + when(oauth2TokenService.createAccessToken(eq(userId), eq(userType), + eq(clientId), eq(scopes))).thenReturn(accessTokenDO); + + // 调用,并断言 + assertPojoEquals(accessTokenDO, oauth2GrantService.grantImplicit( + userId, userType, clientId, scopes)); + } + + @Test + public void testGrantAuthorizationCodeForCode() { + // 准备参数 + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String clientId = randomString(); + List scopes = Lists.newArrayList("read", "write"); + String redirectUri = randomString(); + String state = randomString(); + // mock 方法 + OAuth2CodeDO codeDO = randomPojo(OAuth2CodeDO.class); + when(oauth2CodeService.createAuthorizationCode(eq(userId), eq(userType), + eq(clientId), eq(scopes), eq(redirectUri), eq(state))).thenReturn(codeDO); + + // 调用,并断言 + assertEquals(codeDO.getCode(), oauth2GrantService.grantAuthorizationCodeForCode(userId, userType, + clientId, scopes, redirectUri, state)); + } + + @Test + public void testGrantAuthorizationCodeForAccessToken() { + // 准备参数 + String clientId = randomString(); + String code = randomString(); + List scopes = Lists.newArrayList("read", "write"); + String redirectUri = randomString(); + String state = randomString(); + // mock 方法(code) + OAuth2CodeDO codeDO = randomPojo(OAuth2CodeDO.class, o -> { + o.setClientId(clientId); + o.setRedirectUri(redirectUri); + o.setState(state); + o.setScopes(scopes); + }); + when(oauth2CodeService.consumeAuthorizationCode(eq(code))).thenReturn(codeDO); + // mock 方法(创建令牌) + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class); + when(oauth2TokenService.createAccessToken(eq(codeDO.getUserId()), eq(codeDO.getUserType()), + eq(codeDO.getClientId()), eq(codeDO.getScopes()))).thenReturn(accessTokenDO); + + // 调用,并断言 + assertPojoEquals(accessTokenDO, oauth2GrantService.grantAuthorizationCodeForAccessToken( + clientId, code, redirectUri, state)); + } + + @Test + public void testGrantPassword() { + // 准备参数 + String username = randomString(); + String password = randomString(); + String clientId = randomString(); + List scopes = Lists.newArrayList("read", "write"); + // mock 方法(认证) + AdminUserDO user = randomPojo(AdminUserDO.class); + when(adminAuthService.authenticate(eq(username), eq(password))).thenReturn(user); + // mock 方法(访问令牌) + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class); + when(oauth2TokenService.createAccessToken(eq(user.getId()), eq(UserTypeEnum.ADMIN.getValue()), + eq(clientId), eq(scopes))).thenReturn(accessTokenDO); + + // 调用,并断言 + assertPojoEquals(accessTokenDO, oauth2GrantService.grantPassword( + username, password, clientId, scopes)); + } + + @Test + public void testGrantRefreshToken() { + // 准备参数 + String refreshToken = randomString(); + String clientId = randomString(); + // mock 方法 + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class); + when(oauth2TokenService.refreshAccessToken(eq(refreshToken), eq(clientId))) + .thenReturn(accessTokenDO); + + // 调用,并断言 + assertPojoEquals(accessTokenDO, oauth2GrantService.grantRefreshToken( + refreshToken, clientId)); + } + + @Test + public void testRevokeToken_clientIdError() { + // 准备参数 + String clientId = randomString(); + String accessToken = randomString(); + // mock 方法 + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class); + when(oauth2TokenService.getAccessToken(eq(accessToken))).thenReturn(accessTokenDO); + + // 调用,并断言 + assertFalse(oauth2GrantService.revokeToken(clientId, accessToken)); + } + + @Test + public void testRevokeToken_success() { + // 准备参数 + String clientId = randomString(); + String accessToken = randomString(); + // mock 方法(访问令牌) + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class).setClientId(clientId); + when(oauth2TokenService.getAccessToken(eq(accessToken))).thenReturn(accessTokenDO); + // mock 方法(移除) + when(oauth2TokenService.removeAccessToken(eq(accessToken))).thenReturn(accessTokenDO); + + // 调用,并断言 + assertTrue(oauth2GrantService.revokeToken(clientId, accessToken)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenServiceImplTest.java new file mode 100644 index 0000000..c93c79d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenServiceImplTest.java @@ -0,0 +1,290 @@ +package com.jojubanking.boot.module.system.service.oauth2; + +import cn.hutool.core.util.RandomUtil; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.exception.ErrorCode; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; +import com.jojubanking.boot.framework.test.core.ut.BaseDbAndRedisUnitTest; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenDO; +import com.jojubanking.boot.module.system.dal.mysql.oauth2.OAuth2AccessTokenMapper; +import com.jojubanking.boot.module.system.dal.mysql.oauth2.OAuth2RefreshTokenMapper; +import com.jojubanking.boot.module.system.dal.redis.oauth2.OAuth2AccessTokenRedisDAO; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.time.Duration; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.addTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +/** + * {@link OAuth2TokenServiceImpl} 的单元测试类 + * + * @author TW + */ +@Import({OAuth2TokenServiceImpl.class, OAuth2AccessTokenRedisDAO.class}) +public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { + + @Resource + private OAuth2TokenServiceImpl oauth2TokenService; + + @Resource + private OAuth2AccessTokenMapper oauth2AccessTokenMapper; + @Resource + private OAuth2RefreshTokenMapper oauth2RefreshTokenMapper; + + @Resource + private OAuth2AccessTokenRedisDAO oauth2AccessTokenRedisDAO; + + @MockBean + private OAuth2ClientService oauth2ClientService; + + @Test + public void testCreateAccessToken() { + TenantContextHolder.setTenantId(0L); + // 准备参数 + Long userId = randomLongId(); + Integer userType = RandomUtil.randomEle(UserTypeEnum.values()).getValue(); + String clientId = randomString(); + List scopes = Lists.newArrayList("read", "write"); + // mock 方法 + OAuth2ClientDO clientDO = randomPojo(OAuth2ClientDO.class).setClientId(clientId) + .setAccessTokenValiditySeconds(30).setRefreshTokenValiditySeconds(60); + when(oauth2ClientService.validOAuthClientFromCache(eq(clientId))).thenReturn(clientDO); + + // 调用 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, userType, clientId, scopes); + // 断言访问令牌 + OAuth2AccessTokenDO dbAccessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken()); + assertPojoEquals(accessTokenDO, dbAccessTokenDO, "createTime", "updateTime", "deleted"); + assertEquals(userId, accessTokenDO.getUserId()); + assertEquals(userType, accessTokenDO.getUserType()); + assertEquals(clientId, accessTokenDO.getClientId()); + assertEquals(scopes, accessTokenDO.getScopes()); + assertFalse(DateUtils.isExpired(accessTokenDO.getExpiresTime())); + // 断言访问令牌的缓存 + OAuth2AccessTokenDO redisAccessTokenDO = oauth2AccessTokenRedisDAO.get(accessTokenDO.getAccessToken()); + assertPojoEquals(accessTokenDO, redisAccessTokenDO, "createTime", "updateTime", "deleted"); + // 断言刷新令牌 + OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectList().get(0); + assertPojoEquals(accessTokenDO, refreshTokenDO, "id", "expiresTime", "createTime", "updateTime", "deleted"); + assertFalse(DateUtils.isExpired(refreshTokenDO.getExpiresTime())); + } + + @Test + public void testRefreshAccessToken_null() { + // 准备参数 + String refreshToken = randomString(); + String clientId = randomString(); + // mock 方法 + + // 调用,并断言 + assertServiceException(() -> oauth2TokenService.refreshAccessToken(refreshToken, clientId), + new ErrorCode(400, "无效的刷新令牌")); + } + + @Test + public void testRefreshAccessToken_clientIdError() { + // 准备参数 + String refreshToken = randomString(); + String clientId = randomString(); + // mock 方法 + OAuth2ClientDO clientDO = randomPojo(OAuth2ClientDO.class).setClientId(clientId); + when(oauth2ClientService.validOAuthClientFromCache(eq(clientId))).thenReturn(clientDO); + // mock 数据(访问令牌) + OAuth2RefreshTokenDO refreshTokenDO = randomPojo(OAuth2RefreshTokenDO.class) + .setRefreshToken(refreshToken).setClientId("error"); + oauth2RefreshTokenMapper.insert(refreshTokenDO); + + // 调用,并断言 + assertServiceException(() -> oauth2TokenService.refreshAccessToken(refreshToken, clientId), + new ErrorCode(400, "刷新令牌的客户端编号不正确")); + } + + @Test + public void testRefreshAccessToken_expired() { + // 准备参数 + String refreshToken = randomString(); + String clientId = randomString(); + // mock 方法 + OAuth2ClientDO clientDO = randomPojo(OAuth2ClientDO.class).setClientId(clientId); + when(oauth2ClientService.validOAuthClientFromCache(eq(clientId))).thenReturn(clientDO); + // mock 数据(访问令牌) + OAuth2RefreshTokenDO refreshTokenDO = randomPojo(OAuth2RefreshTokenDO.class) + .setRefreshToken(refreshToken).setClientId(clientId) + .setExpiresTime(addTime(Duration.ofDays(-1))); + oauth2RefreshTokenMapper.insert(refreshTokenDO); + + // 调用,并断言 + assertServiceException(() -> oauth2TokenService.refreshAccessToken(refreshToken, clientId), + new ErrorCode(401, "刷新令牌已过期")); + assertEquals(0, oauth2RefreshTokenMapper.selectCount()); + } + + @Test + public void testRefreshAccessToken_success() { + TenantContextHolder.setTenantId(0L); + // 准备参数 + String refreshToken = randomString(); + String clientId = randomString(); + // mock 方法 + OAuth2ClientDO clientDO = randomPojo(OAuth2ClientDO.class).setClientId(clientId) + .setAccessTokenValiditySeconds(30); + when(oauth2ClientService.validOAuthClientFromCache(eq(clientId))).thenReturn(clientDO); + // mock 数据(访问令牌) + OAuth2RefreshTokenDO refreshTokenDO = randomPojo(OAuth2RefreshTokenDO.class) + .setRefreshToken(refreshToken).setClientId(clientId) + .setExpiresTime(addTime(Duration.ofDays(1))); + oauth2RefreshTokenMapper.insert(refreshTokenDO); + // mock 数据(访问令牌) + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class).setRefreshToken(refreshToken); + oauth2AccessTokenMapper.insert(accessTokenDO); + oauth2AccessTokenRedisDAO.set(accessTokenDO); + + // 调用 + OAuth2AccessTokenDO newAccessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, clientId); + // 断言,老的访问令牌被删除 + assertNull(oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken())); + assertNull(oauth2AccessTokenRedisDAO.get(accessTokenDO.getAccessToken())); + // 断言,新的访问令牌 + OAuth2AccessTokenDO dbAccessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(newAccessTokenDO.getAccessToken()); + assertPojoEquals(newAccessTokenDO, dbAccessTokenDO, "createTime", "updateTime", "deleted"); + assertPojoEquals(newAccessTokenDO, refreshTokenDO, "id", "expiresTime", "createTime", "updateTime", "deleted", + "creator", "updater"); + assertFalse(DateUtils.isExpired(newAccessTokenDO.getExpiresTime())); + // 断言,新的访问令牌的缓存 + OAuth2AccessTokenDO redisAccessTokenDO = oauth2AccessTokenRedisDAO.get(newAccessTokenDO.getAccessToken()); + assertPojoEquals(newAccessTokenDO, redisAccessTokenDO, "createTime", "updateTime", "deleted"); + } + + @Test + public void testGetAccessToken() { + // mock 数据(访问令牌) + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) + .setExpiresTime(addTime(Duration.ofDays(1))); + oauth2AccessTokenMapper.insert(accessTokenDO); + // 准备参数 + String accessToken = accessTokenDO.getAccessToken(); + + // 调用 + OAuth2AccessTokenDO result = oauth2TokenService.getAccessToken(accessToken); + // 断言 + assertPojoEquals(accessTokenDO, result, "createTime", "updateTime", "deleted", + "creator", "updater"); + assertPojoEquals(accessTokenDO, oauth2AccessTokenRedisDAO.get(accessToken), "createTime", "updateTime", "deleted", + "creator", "updater"); + } + + @Test + public void testCheckAccessToken_null() { + // 调研,并断言 + assertServiceException(() -> oauth2TokenService.checkAccessToken(randomString()), + new ErrorCode(401, "访问令牌不存在")); + } + + @Test + public void testCheckAccessToken_expired() { + // mock 数据(访问令牌) + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) + .setExpiresTime(addTime(Duration.ofDays(-1))); + oauth2AccessTokenMapper.insert(accessTokenDO); + // 准备参数 + String accessToken = accessTokenDO.getAccessToken(); + + // 调研,并断言 + assertServiceException(() -> oauth2TokenService.checkAccessToken(accessToken), + new ErrorCode(401, "访问令牌已过期")); + } + + @Test + public void testCheckAccessToken_success() { + // mock 数据(访问令牌) + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) + .setExpiresTime(addTime(Duration.ofDays(1))); + oauth2AccessTokenMapper.insert(accessTokenDO); + // 准备参数 + String accessToken = accessTokenDO.getAccessToken(); + + // 调研,并断言 + OAuth2AccessTokenDO result = oauth2TokenService.getAccessToken(accessToken); + // 断言 + assertPojoEquals(accessTokenDO, result, "createTime", "updateTime", "deleted", + "creator", "updater"); + } + + @Test + public void testRemoveAccessToken_null() { + // 调用,并断言 + assertNull(oauth2TokenService.removeAccessToken(randomString())); + } + + @Test + public void testRemoveAccessToken_success() { + // mock 数据(访问令牌) + OAuth2AccessTokenDO accessTokenDO = randomPojo(OAuth2AccessTokenDO.class) + .setExpiresTime(addTime(Duration.ofDays(1))); + oauth2AccessTokenMapper.insert(accessTokenDO); + // mock 数据(刷新令牌) + OAuth2RefreshTokenDO refreshTokenDO = randomPojo(OAuth2RefreshTokenDO.class) + .setRefreshToken(accessTokenDO.getRefreshToken()); + oauth2RefreshTokenMapper.insert(refreshTokenDO); + // 调用 + OAuth2AccessTokenDO result = oauth2TokenService.removeAccessToken(accessTokenDO.getAccessToken()); + assertPojoEquals(accessTokenDO, result, "createTime", "updateTime", "deleted", + "creator", "updater"); + // 断言数据 + assertNull(oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken())); + assertNull(oauth2RefreshTokenMapper.selectByRefreshToken(accessTokenDO.getRefreshToken())); + assertNull(oauth2AccessTokenRedisDAO.get(accessTokenDO.getAccessToken())); + } + + + @Test + public void testGetAccessTokenPage() { + // mock 数据 + OAuth2AccessTokenDO dbAccessToken = randomPojo(OAuth2AccessTokenDO.class, o -> { // 等会查询到 + o.setUserId(10L); + o.setUserType(1); + o.setClientId("test_client"); + o.setExpiresTime(DateUtils.addTime(Duration.ofDays(1))); + }); + oauth2AccessTokenMapper.insert(dbAccessToken); + // 测试 userId 不匹配 + oauth2AccessTokenMapper.insert(cloneIgnoreId(dbAccessToken, o -> o.setUserId(20L))); + // 测试 userType 不匹配 + oauth2AccessTokenMapper.insert(cloneIgnoreId(dbAccessToken, o -> o.setUserType(2))); + // 测试 userType 不匹配 + oauth2AccessTokenMapper.insert(cloneIgnoreId(dbAccessToken, o -> o.setClientId("it_client"))); + // 测试 expireTime 不匹配 + oauth2AccessTokenMapper.insert(cloneIgnoreId(dbAccessToken, o -> o.setExpiresTime(new Date()))); + // 准备参数 + OAuth2AccessTokenPageReqVO reqVO = new OAuth2AccessTokenPageReqVO(); + reqVO.setUserId(10L); + reqVO.setUserType(1); + reqVO.setClientId("test"); + + // 调用 + PageResult pageResult = oauth2TokenService.getAccessTokenPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbAccessToken, pageResult.getList().get(0)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/permission/MenuServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/permission/MenuServiceTest.java new file mode 100644 index 0000000..cae22ca --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/permission/MenuServiceTest.java @@ -0,0 +1,393 @@ +package com.jojubanking.boot.module.system.service.permission; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.common.util.spring.SpringAopUtils; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import com.jojubanking.boot.module.system.dal.mysql.permission.MenuMapper; +import com.jojubanking.boot.module.system.enums.permission.MenuTypeEnum; +import com.jojubanking.boot.module.system.mq.producer.permission.MenuProducer; +import com.jojubanking.boot.module.system.service.tenant.TenantService; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.google.common.collect.Multimap; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.*; + +import static com.jojubanking.boot.framework.common.util.collection.SetUtils.asSet; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.verify; + +// TODO @芋艿:单测的代码质量可以提升下 +@Import(MenuServiceImpl.class) +public class MenuServiceTest extends BaseDbUnitTest { + + @Resource + private MenuServiceImpl menuService; + + @Resource + private MenuMapper menuMapper; + + @MockBean + private PermissionService permissionService; + @MockBean + private MenuProducer menuProducer; + @MockBean + private TenantService tenantService; + + @Test + public void testInitLocalCache_success() throws Exception { + MenuDO menuDO1 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L); + menuMapper.insert(menuDO1); + MenuDO menuDO2 = createMenuDO(MenuTypeEnum.MENU, "xxxx", 0L); + menuMapper.insert(menuDO2); + + // 调用 + menuService.initLocalCache(); + + // 获取代理对象 + MenuServiceImpl target = (MenuServiceImpl) SpringAopUtils.getTarget(menuService); + + Map menuCache = + (Map) BeanUtil.getFieldValue(target, "menuCache"); + Assert.isTrue(menuCache.size() == 2); + assertPojoEquals(menuDO1, menuCache.get(menuDO1.getId())); + assertPojoEquals(menuDO2, menuCache.get(menuDO2.getId())); + + Multimap permissionMenuCache = + (Multimap) BeanUtil.getFieldValue(target, "permissionMenuCache"); + Assert.isTrue(permissionMenuCache.size() == 2); + assertPojoEquals(menuDO1, permissionMenuCache.get(menuDO1.getPermission())); + assertPojoEquals(menuDO2, permissionMenuCache.get(menuDO2.getPermission())); + + Date maxUpdateTime = (Date) BeanUtil.getFieldValue(target, "maxUpdateTime"); + assertEquals(ObjectUtils.max(menuDO1.getUpdateTime(), menuDO2.getUpdateTime()), maxUpdateTime); + } + + @Test + public void testCreateMenu_success() { + //构造父目录 + MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); + menuMapper.insert(menuDO); + Long parentId = menuDO.getId(); + + //调用 + MenuCreateReqVO vo = randomPojo(MenuCreateReqVO.class, o -> { + o.setParentId(parentId); + o.setName("testSonName"); + o.setType(MenuTypeEnum.MENU.getType()); + o.setStatus(randomCommonStatus()); + }); + Long menuId = menuService.createMenu(vo); + + //断言 + assertNotNull(menuId); + // 校验记录的属性是否正确 + MenuDO ret = menuMapper.selectById(menuId); + assertPojoEquals(vo, ret); + // 校验调用 + verify(menuProducer).sendMenuRefreshMessage(); + } + + @Test + public void testUpdateMenu_success() { + //构造父子目录 + MenuDO sonMenuDO = initParentAndSonMenuDO(); + Long sonId = sonMenuDO.getId(); + Long parentId = sonMenuDO.getParentId(); + + //调用 + MenuUpdateReqVO vo = randomPojo(MenuUpdateReqVO.class, o -> { + o.setId(sonId); + o.setParentId(parentId); + o.setType(MenuTypeEnum.MENU.getType()); + o.setStatus(randomCommonStatus()); + o.setName("pppppp"); //修改名字 + }); + menuService.updateMenu(vo); + + //断言 + // 校验记录的属性是否正确 + MenuDO ret = menuMapper.selectById(sonId); + assertPojoEquals(vo, ret); + // 校验调用 + verify(menuProducer).sendMenuRefreshMessage(); + } + + @Test + public void testUpdateMenu_sonIdNotExist() { + Long sonId = 99999L; + Long parentId = 10000L; + + //调用 + MenuUpdateReqVO vo = randomPojo(MenuUpdateReqVO.class, o -> { + o.setId(sonId); + o.setParentId(parentId); + o.setType(MenuTypeEnum.MENU.getType()); + o.setStatus(randomCommonStatus()); + }); + //断言 + assertServiceException(() -> menuService.updateMenu(vo), MENU_NOT_EXISTS); + } + + @Test + public void testDeleteMenu_success() { + MenuDO sonMenuDO = initParentAndSonMenuDO(); + Long sonId = sonMenuDO.getId(); + + // 调用 + menuService.deleteMenu(sonId); + + // 断言 + MenuDO menuDO = menuMapper.selectById(sonId); + assertNull(menuDO); + verify(permissionService).processMenuDeleted(sonId); + verify(menuProducer).sendMenuRefreshMessage(); + } + + @Test + public void testDeleteMenu_menuNotExist() { + Long sonId = 99999L; + + assertServiceException(() -> menuService.deleteMenu(sonId), MENU_NOT_EXISTS); + } + + @Test + public void testDeleteMenu_existChildren() { + MenuDO sonMenu = initParentAndSonMenuDO(); + Long parentId = sonMenu.getParentId(); + + assertServiceException(() -> menuService.deleteMenu(parentId), MENU_EXISTS_CHILDREN); + } + + @Test + public void testGetMenus() { + // mock 数据 + MenuDO menu100 = randomPojo(MenuDO.class, o -> o.setId(100L).setStatus(CommonStatusEnum.ENABLE.getStatus())); + menuMapper.insert(menu100); + MenuDO menu101 = randomPojo(MenuDO.class, o -> o.setId(101L).setStatus(CommonStatusEnum.DISABLE.getStatus())); + menuMapper.insert(menu101); + // 准备参数 + MenuListReqVO reqVO = new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + List result = menuService.getMenus(reqVO); + // 断言 + assertEquals(1, result.size()); + assertPojoEquals(menu100, result.get(0)); + } + + @Test + public void testTenantMenus() { + // mock 数据 + MenuDO menu100 = randomPojo(MenuDO.class, o -> o.setId(100L).setStatus(CommonStatusEnum.ENABLE.getStatus())); + menuMapper.insert(menu100); + MenuDO menu101 = randomPojo(MenuDO.class, o -> o.setId(101L).setStatus(CommonStatusEnum.DISABLE.getStatus())); + menuMapper.insert(menu101); + MenuDO menu102 = randomPojo(MenuDO.class, o -> o.setId(102L).setStatus(CommonStatusEnum.ENABLE.getStatus())); + menuMapper.insert(menu102); + // mock 过滤菜单 + // mock 账户额度充足 + Set menuIds = asSet(100L, 101L); + doNothing().when(tenantService).handleTenantMenu(argThat(handler -> { + handler.handle(menuIds); + return true; + })); + // 准备参数 + MenuListReqVO reqVO = new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()); + + // 调用 + List result = menuService.getTenantMenus(reqVO); + // 断言 + assertEquals(1, result.size()); + assertPojoEquals(menu100, result.get(0)); + } + + @Test + public void testGetMenusReqVo_success() { + Map idMenuMap = new HashMap<>(); + // 用于验证可以模糊搜索名称包含"name",状态为1的menu + MenuDO menu = createMenuDO(MenuTypeEnum.MENU, "name2", 0L, 1); + menuMapper.insert(menu); + idMenuMap.put(menu.getId(), menu); + + menu = createMenuDO(MenuTypeEnum.MENU, "11name111", 0L, 1); + menuMapper.insert(menu); + idMenuMap.put(menu.getId(), menu); + + menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 1); + menuMapper.insert(menu); + idMenuMap.put(menu.getId(), menu); + + // 以下是不符合搜索条件的的menu + menu = createMenuDO(MenuTypeEnum.MENU, "xxxxxx", 0L, 1); + menuMapper.insert(menu); + menu = createMenuDO(MenuTypeEnum.MENU, "name", 0L, 2); + menuMapper.insert(menu); + + // 调用 + MenuListReqVO reqVO = new MenuListReqVO(); + reqVO.setStatus(1); + reqVO.setName("name"); + List menuDOS = menuService.getMenus(reqVO); + + // 断言 + assertEquals(menuDOS.size(), idMenuMap.size()); + menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m)); + } + + @Test + public void testListMenusFromCache_success() throws Exception { + Map mockCacheMap = new HashMap<>(); + // 获取代理对象 + MenuServiceImpl target = (MenuServiceImpl) SpringAopUtils.getTarget(menuService); + BeanUtil.setFieldValue(target, "menuCache", mockCacheMap); + + Map idMenuMap = new HashMap<>(); + // 用于验证搜索类型为MENU,状态为1的menu + MenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1); + mockCacheMap.put(menuDO.getId(), menuDO); + idMenuMap.put(menuDO.getId(), menuDO); + + menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1); + mockCacheMap.put(menuDO.getId(), menuDO); + idMenuMap.put(menuDO.getId(), menuDO); + + // 以下是不符合搜索条件的menu + menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1); + mockCacheMap.put(menuDO.getId(), menuDO); + menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2); + mockCacheMap.put(menuDO.getId(), menuDO); + + List menuDOS = menuService.getMenuListFromCache(Collections.singletonList(MenuTypeEnum.MENU.getType()), + Collections.singletonList(CommonStatusEnum.DISABLE.getStatus())); + assertEquals(menuDOS.size(), idMenuMap.size()); + menuDOS.forEach(m -> assertPojoEquals(idMenuMap.get(m.getId()), m)); + } + + @Test + public void testListMenusFromCache2_success() throws Exception { + Map mockCacheMap = new HashMap<>(); + // 获取代理对象 + MenuServiceImpl target = (MenuServiceImpl) SpringAopUtils.getTarget(menuService); + BeanUtil.setFieldValue(target, "menuCache", mockCacheMap); + + Map idMenuMap = new HashMap<>(); + // 验证搜索id为1, 类型为MENU, 状态为1 的menu + MenuDO menuDO = createMenuDO(1L, MenuTypeEnum.MENU, "name", 0L, 1); + mockCacheMap.put(menuDO.getId(), menuDO); + idMenuMap.put(menuDO.getId(), menuDO); + + // 以下是不符合搜索条件的menu + menuDO = createMenuDO(2L, MenuTypeEnum.MENU, "name", 0L, 1); + mockCacheMap.put(menuDO.getId(), menuDO); + menuDO = createMenuDO(3L, MenuTypeEnum.BUTTON, "name", 0L, 1); + mockCacheMap.put(menuDO.getId(), menuDO); + menuDO = createMenuDO(4L, MenuTypeEnum.MENU, "name", 0L, 2); + mockCacheMap.put(menuDO.getId(), menuDO); + + List menuDOS = menuService.getMenuListFromCache(Collections.singletonList(1L), + Collections.singletonList(MenuTypeEnum.MENU.getType()), Collections.singletonList(1)); + assertEquals(menuDOS.size(), idMenuMap.size()); + menuDOS.forEach(menu -> assertPojoEquals(idMenuMap.get(menu.getId()), menu)); + } + + @Test + public void testCheckParentResource_success() { + MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); + menuMapper.insert(menuDO); + Long parentId = menuDO.getId(); + + menuService.checkParentResource(parentId, null); + } + + @Test + public void testCheckParentResource_canNotSetSelfToBeParent() { + assertServiceException(() -> menuService.checkParentResource(1L, 1L), MENU_PARENT_ERROR); + } + + @Test + public void testCheckParentResource_parentNotExist() { + assertServiceException(() -> menuService.checkParentResource(randomLongId(), null), MENU_PARENT_NOT_EXISTS); + } + + @Test + public void testCheckParentResource_parentTypeError() { + MenuDO menuDO = createMenuDO(MenuTypeEnum.BUTTON, "parent", 0L); + menuMapper.insert(menuDO); + Long parentId = menuDO.getId(); + + assertServiceException(() -> menuService.checkParentResource(parentId, null), MENU_PARENT_NOT_DIR_OR_MENU); + } + + @Test + public void testCheckResource_success() { + MenuDO sonMenu = initParentAndSonMenuDO(); + Long parentId = sonMenu.getParentId(); + + Long otherSonMenuId = randomLongId(); + String otherSonMenuName = randomString(); + + menuService.checkResource(parentId, otherSonMenuName, otherSonMenuId); + } + + @Test + public void testCheckResource_sonMenuNameDuplicate(){ + MenuDO sonMenu=initParentAndSonMenuDO(); + Long parentId=sonMenu.getParentId(); + + Long otherSonMenuId=randomLongId(); + String otherSonMenuName=sonMenu.getName(); //相同名称 + + assertServiceException(() -> menuService.checkResource(parentId, otherSonMenuName, otherSonMenuId), MENU_NAME_DUPLICATE); + } + + /** + * 构造父子目录,返回子目录 + * + * @return + */ + private MenuDO initParentAndSonMenuDO() { + //构造父子目录 + MenuDO menuDO = createMenuDO(MenuTypeEnum.MENU, "parent", 0L); + menuMapper.insert(menuDO); + Long parentId = menuDO.getId(); + + MenuDO sonMenuDO = createMenuDO(MenuTypeEnum.MENU, "testSonName", parentId); + menuMapper.insert(sonMenuDO); + return sonMenuDO; + } + + private MenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId) { + return createMenuDO(typeEnum, menuName, parentId, randomCommonStatus()); + } + + private MenuDO createMenuDO(MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) { + return createMenuDO(null, typeEnum, menuName, parentId, status); + } + + private MenuDO createMenuDO(Long id, MenuTypeEnum typeEnum, String menuName, Long parentId, Integer status) { + return randomPojo(MenuDO.class, o -> { + o.setId(id); + o.setParentId(parentId); + o.setType(typeEnum.getType()); + o.setStatus(status); + o.setName(menuName); + }); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/permission/PermissionServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/permission/PermissionServiceTest.java new file mode 100644 index 0000000..5cebb56 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/permission/PermissionServiceTest.java @@ -0,0 +1,556 @@ +package com.jojubanking.boot.module.system.service.permission; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleMenuDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.UserRoleDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.dal.mysql.permission.RoleMenuBatchInsertMapper; +import com.jojubanking.boot.module.system.dal.mysql.permission.RoleMenuMapper; +import com.jojubanking.boot.module.system.dal.mysql.permission.UserRoleBatchInsertMapper; +import com.jojubanking.boot.module.system.dal.mysql.permission.UserRoleMapper; +import com.jojubanking.boot.module.system.enums.permission.DataScopeEnum; +import com.jojubanking.boot.module.system.mq.producer.permission.PermissionProducer; +import com.jojubanking.boot.module.system.service.dept.DeptService; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.*; + +import static com.jojubanking.boot.framework.common.util.collection.SetUtils.asSet; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static java.util.Arrays.asList; +import static java.util.Collections.singleton; +import static java.util.Collections.singletonList; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.same; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@Import({PermissionServiceImpl.class, + RoleMenuBatchInsertMapper.class, UserRoleBatchInsertMapper.class}) +public class PermissionServiceTest extends BaseDbUnitTest { + + @Resource + private PermissionServiceImpl permissionService; + + @Resource + private RoleMenuMapper roleMenuMapper; + @Resource + private RoleMenuBatchInsertMapper roleMenuBatchInsertMapper; + @Resource + private UserRoleMapper userRoleMapper; + @Resource + private UserRoleBatchInsertMapper userRoleBatchInsertMapper; + + @MockBean + private RoleService roleService; + @MockBean + private MenuService menuService; + @MockBean + private DeptService deptService; + @MockBean + private AdminUserService userService; + + @MockBean + private PermissionProducer permissionProducer; + + @Test + public void testInitRoleMenuLocalCache() { + // mock 数据 + RoleMenuDO roleMenuDO01 = randomPojo(RoleMenuDO.class, o -> o.setRoleId(1L).setMenuId(10L)); + roleMenuMapper.insert(roleMenuDO01); + RoleMenuDO roleMenuDO02 = randomPojo(RoleMenuDO.class, o -> o.setRoleId(1L).setMenuId(20L)); + roleMenuMapper.insert(roleMenuDO02); + + // 调用 + permissionService.initRoleMenuLocalCache(); + // 断言 roleMenuCache 缓存 + assertEquals(1, permissionService.getRoleMenuCache().keySet().size()); + assertEquals(asList(10L, 20L), permissionService.getRoleMenuCache().get(1L)); + // 断言 menuRoleCache 缓存 + assertEquals(2, permissionService.getMenuRoleCache().size()); + assertEquals(singletonList(1L), permissionService.getMenuRoleCache().get(10L)); + assertEquals(singletonList(1L), permissionService.getMenuRoleCache().get(20L)); + // 断言 maxUpdateTime 缓存 + Date maxUpdateTime = permissionService.getRoleMenuMaxUpdateTime(); + assertEquals(ObjectUtils.max(roleMenuDO01.getUpdateTime(), roleMenuDO02.getUpdateTime()), maxUpdateTime); + } + + @Test + public void testInitUserRoleLocalCache() { + // mock 数据 + UserRoleDO userRoleDO01 = randomPojo(UserRoleDO.class, o -> o.setUserId(1L).setRoleId(10L)); + userRoleMapper.insert(userRoleDO01); + UserRoleDO roleMenuDO02 = randomPojo(UserRoleDO.class, o -> o.setUserId(1L).setRoleId(20L)); + userRoleMapper.insert(roleMenuDO02); + + // 调用 + permissionService.initUserRoleLocalCache(); + // 断言 roleMenuCache 缓存 + assertEquals(1, permissionService.getUserRoleCache().size()); + assertEquals(asSet(10L, 20L), permissionService.getUserRoleCache().get(1L)); + // 断言 maxUpdateTime 缓存 + Date maxUpdateTime = permissionService.getUserRoleMaxUpdateTime(); + assertEquals(ObjectUtils.max(userRoleDO01.getUpdateTime(), roleMenuDO02.getUpdateTime()), maxUpdateTime); + } + + @Test + public void testGetRoleMenuListFromCache_superAdmin() { + // 准备参数 + Collection roleIds = singletonList(100L); + Collection menuTypes = asList(2, 3); + Collection menusStatuses = asList(0, 1); + // mock 方法 + List roleList = singletonList(randomPojo(RoleDO.class, o -> o.setId(100L))); + when(roleService.getRolesFromCache(eq(roleIds))).thenReturn(roleList); + when(roleService.hasAnySuperAdmin(same(roleList))).thenReturn(true); + List menuList = randomPojoList(MenuDO.class); + when(menuService.getMenuListFromCache(eq(menuTypes), eq(menusStatuses))).thenReturn(menuList); + + // 调用 + List result = permissionService.getRoleMenuListFromCache(roleIds, menuTypes, menusStatuses); + // 断言 + assertSame(menuList, result); + } + + @Test + public void testGetRoleMenuListFromCache_normal() { + // 准备参数 + Collection roleIds = asSet(100L, 200L); + Collection menuTypes = asList(2, 3); + Collection menusStatuses = asList(0, 1); + // mock 方法 + Multimap roleMenuCache = ImmutableMultimap.builder().put(100L, 1000L) + .put(200L, 2000L).put(200L, 2001L).build(); + permissionService.setRoleMenuCache(roleMenuCache); + List menuList = randomPojoList(MenuDO.class); + when(menuService.getMenuListFromCache(eq(asList(1000L, 2000L, 2001L)), eq(menuTypes), eq(menusStatuses))).thenReturn(menuList); + + // 调用 + List result = permissionService.getRoleMenuListFromCache(roleIds, menuTypes, menusStatuses); + // 断言 + assertSame(menuList, result); + } + + @Test + public void testGetUserRoleIdsFromCache() { + // 准备参数 + Long userId = 1L; + Collection roleStatuses = singleton(CommonStatusEnum.ENABLE.getStatus()); + // mock 方法 + Map> userRoleCache = MapUtil.>builder() + .put(1L, asSet(10L, 20L)).build(); + permissionService.setUserRoleCache(userRoleCache); + RoleDO roleDO01 = randomPojo(RoleDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(roleService.getRoleFromCache(eq(10L))).thenReturn(roleDO01); + RoleDO roleDO02 = randomPojo(RoleDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); + when(roleService.getRoleFromCache(eq(20L))).thenReturn(roleDO02); + + // 调用 + Set roleIds = permissionService.getUserRoleIdsFromCache(userId, roleStatuses); + // 断言 + assertEquals(asSet(10L), roleIds); + } + + @Test + public void testGetRoleMenuIds_superAdmin() { + // 准备参数 + Long roleId = 100L; + // mock 方法 + when(roleService.hasAnySuperAdmin(eq(singleton(100L)))).thenReturn(true); + List menuList = singletonList(randomPojo(MenuDO.class).setId(1L)); + when(menuService.getMenus()).thenReturn(menuList); + + // 调用 + Set menuIds = permissionService.getRoleMenuIds(roleId); + // 断言 + assertEquals(singleton(1L), menuIds); + } + + @Test + public void testGetRoleMenuIds_normal() { + // 准备参数 + Long roleId = 100L; + // mock 数据 + RoleMenuDO roleMenu01 = randomPojo(RoleMenuDO.class).setRoleId(100L).setMenuId(1L); + roleMenuMapper.insert(roleMenu01); + RoleMenuDO roleMenu02 = randomPojo(RoleMenuDO.class).setRoleId(100L).setMenuId(2L); + roleMenuMapper.insert(roleMenu02); + + // 调用 + Set menuIds = permissionService.getRoleMenuIds(roleId); + // 断言 + assertEquals(asSet(1L, 2L), menuIds); + } + + @Test + public void testAssignRoleMenu() { + // 准备参数 + Long roleId = 1L; + Set menuIds = asSet(200L, 300L); + // mock 数据 + RoleMenuDO roleMenu01 = randomPojo(RoleMenuDO.class).setRoleId(1L).setMenuId(100L); + roleMenuMapper.insert(roleMenu01); + RoleMenuDO roleMenu02 = randomPojo(RoleMenuDO.class).setRoleId(1L).setMenuId(200L); + roleMenuMapper.insert(roleMenu02); + + // 调用 + permissionService.assignRoleMenu(roleId, menuIds); + // 断言 + List roleMenuList = roleMenuMapper.selectList(); + assertEquals(2, roleMenuList.size()); + assertEquals(1L, roleMenuList.get(0).getRoleId()); + assertEquals(200L, roleMenuList.get(0).getMenuId()); + assertEquals(1L, roleMenuList.get(1).getRoleId()); + assertEquals(300L, roleMenuList.get(1).getMenuId()); + verify(permissionProducer).sendRoleMenuRefreshMessage(); + } + + @Test + public void testAssignUserRole() { + // 准备参数 + Long userId = 1L; + Set roleIds = asSet(200L, 300L); + // mock 数据 + UserRoleDO userRole01 = randomPojo(UserRoleDO.class).setUserId(1L).setRoleId(100L); + userRoleMapper.insert(userRole01); + UserRoleDO userRole02 = randomPojo(UserRoleDO.class).setUserId(1L).setRoleId(200L); + userRoleMapper.insert(userRole02); + + // 调用 + permissionService.assignUserRole(userId, roleIds); + // 断言 + List userRoleDOList = userRoleMapper.selectList(); + assertEquals(2, userRoleDOList.size()); + assertEquals(1L, userRoleDOList.get(0).getUserId()); + assertEquals(200L, userRoleDOList.get(0).getRoleId()); + assertEquals(1L, userRoleDOList.get(1).getUserId()); + assertEquals(300L, userRoleDOList.get(1).getRoleId()); + verify(permissionProducer).sendUserRoleRefreshMessage(); + } + + @Test + public void testGetUserRoleIdListByUserId() { + // 准备参数 + Long userId = 1L; + // mock 数据 + UserRoleDO userRoleDO01 = randomPojo(UserRoleDO.class, o -> o.setUserId(1L).setRoleId(10L)); + userRoleMapper.insert(userRoleDO01); + UserRoleDO roleMenuDO02 = randomPojo(UserRoleDO.class, o -> o.setUserId(1L).setRoleId(20L)); + userRoleMapper.insert(roleMenuDO02); + + // 调用 + Set result = permissionService.getUserRoleIdListByUserId(userId); + // 断言 + assertEquals(asSet(10L, 20L), result); + } + + @Test + public void testGetUserRoleIdListByRoleIds() { + // 准备参数 + Collection roleIds = asSet(10L, 20L); + // mock 数据 + UserRoleDO userRoleDO01 = randomPojo(UserRoleDO.class, o -> o.setUserId(1L).setRoleId(10L)); + userRoleMapper.insert(userRoleDO01); + UserRoleDO roleMenuDO02 = randomPojo(UserRoleDO.class, o -> o.setUserId(2L).setRoleId(20L)); + userRoleMapper.insert(roleMenuDO02); + + // 调用 + Set result = permissionService.getUserRoleIdListByRoleIds(roleIds); + // 断言 + assertEquals(asSet(1L, 2L), result); + } + + @Test + public void testAssignRoleDataScope() { + // 准备参数 + Long roleId = 1L; + Integer dataScope = 2; + Set dataScopeDeptIds = asSet(10L, 20L); + + // 调用 + permissionService.assignRoleDataScope(roleId, dataScope, dataScopeDeptIds); + // 断言 + verify(roleService).updateRoleDataScope(eq(roleId), eq(dataScope), eq(dataScopeDeptIds)); + } + + @Test + public void testProcessRoleDeleted() { + // 准备参数 + Long roleId = randomLongId(); + // mock 数据 UserRole + UserRoleDO userRoleDO01 = randomPojo(UserRoleDO.class, o -> o.setRoleId(roleId)); // 被删除 + userRoleMapper.insert(userRoleDO01); + UserRoleDO userRoleDO02 = randomPojo(UserRoleDO.class); // 不被删除 + userRoleMapper.insert(userRoleDO02); + // mock 数据 RoleMenu + RoleMenuDO roleMenuDO01 = randomPojo(RoleMenuDO.class, o -> o.setRoleId(roleId)); // 被删除 + roleMenuMapper.insert(roleMenuDO01); + RoleMenuDO roleMenuDO02 = randomPojo(RoleMenuDO.class); // 不被删除 + roleMenuMapper.insert(roleMenuDO02); + + // 调用 + permissionService.processRoleDeleted(roleId); + // 断言数据 RoleMenuDO + List dbRoleMenus = roleMenuMapper.selectList(); + assertEquals(1, dbRoleMenus.size()); + assertPojoEquals(dbRoleMenus.get(0), roleMenuDO02); + // 断言数据 UserRoleDO + List dbUserRoles = userRoleMapper.selectList(); + assertEquals(1, dbUserRoles.size()); + assertPojoEquals(dbUserRoles.get(0), userRoleDO02); + // 断言调用 + verify(permissionProducer).sendRoleMenuRefreshMessage(); + verify(permissionProducer).sendUserRoleRefreshMessage(); + } + + @Test + public void testProcessMenuDeleted() { + // 准备参数 + Long menuId = randomLongId(); + // mock 数据 + RoleMenuDO roleMenuDO01 = randomPojo(RoleMenuDO.class, o -> o.setMenuId(menuId)); // 被删除 + roleMenuMapper.insert(roleMenuDO01); + RoleMenuDO roleMenuDO02 = randomPojo(RoleMenuDO.class); // 不被删除 + roleMenuMapper.insert(roleMenuDO02); + + // 调用 + permissionService.processMenuDeleted(menuId); + // 断言数据 + List dbRoleMenus = roleMenuMapper.selectList(); + assertEquals(1, dbRoleMenus.size()); + assertPojoEquals(dbRoleMenus.get(0), roleMenuDO02); + // 断言调用 + verify(permissionProducer).sendRoleMenuRefreshMessage(); + } + + @Test + public void testProcessUserDeleted() { + // 准备参数 + Long userId = randomLongId(); + // mock 数据 + UserRoleDO userRoleDO01 = randomPojo(UserRoleDO.class, o -> o.setUserId(userId)); // 被删除 + userRoleMapper.insert(userRoleDO01); + UserRoleDO userRoleDO02 = randomPojo(UserRoleDO.class); // 不被删除 + userRoleMapper.insert(userRoleDO02); + + // 调用 + permissionService.processUserDeleted(userId); + // 断言数据 + List dbUserRoles = userRoleMapper.selectList(); + assertEquals(1, dbUserRoles.size()); + assertPojoEquals(dbUserRoles.get(0), userRoleDO02); + // 断言调用 + verify(permissionProducer).sendUserRoleRefreshMessage(); + } + + @Test + public void testHasAnyPermissions_superAdmin() { + // 准备参数 + Long userId = 1L; + String[] roles = new String[]{"system:user:query", "system:user:create"}; + // mock 用户与角色的缓存 + permissionService.setUserRoleCache(MapUtil.>builder().put(1L, asSet(100L)).build()); + RoleDO role = randomPojo(RoleDO.class, o -> o.setId(100L) + .setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(roleService.getRoleFromCache(eq(100L))).thenReturn(role); + // mock 其它方法 + when(roleService.hasAnySuperAdmin(eq(asSet(100L)))).thenReturn(true); + + // 调用 + boolean has = permissionService.hasAnyPermissions(userId, roles); + // 断言 + assertTrue(has); + } + + @Test + public void testHasAnyPermissions_normal() { + // 准备参数 + Long userId = 1L; + String[] roles = new String[]{"system:user:query", "system:user:create"}; + // mock 用户与角色的缓存 + permissionService.setUserRoleCache(MapUtil.>builder().put(1L, asSet(100L)).build()); + RoleDO role = randomPojo(RoleDO.class, o -> o.setId(100L) + .setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(roleService.getRoleFromCache(eq(100L))).thenReturn(role); + // mock 其它方法 + MenuDO menu = randomPojo(MenuDO.class, o -> o.setId(1000L)); + when(menuService.getMenuListByPermissionFromCache(eq("system:user:create"))).thenReturn(singletonList(menu)); + permissionService.setMenuRoleCache(ImmutableMultimap.builder().put(1000L, 100L).build()); + + + // 调用 + boolean has = permissionService.hasAnyPermissions(userId, roles); + // 断言 + assertTrue(has); + } + + @Test + public void testHasAnyRoles_superAdmin() { + // 准备参数 + Long userId = 1L; + String[] roles = new String[]{"yunai", "tudou"}; + // mock 用户与角色的缓存 + permissionService.setUserRoleCache(MapUtil.>builder().put(1L, asSet(100L)).build()); + RoleDO role = randomPojo(RoleDO.class, o -> o.setId(100L) + .setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(roleService.getRoleFromCache(eq(100L))).thenReturn(role); + // mock 其它方法 + when(roleService.hasAnySuperAdmin(eq(asSet(100L)))).thenReturn(true); + + // 调用 + boolean has = permissionService.hasAnyRoles(userId, roles); + // 断言 + assertTrue(has); + } + + @Test + public void testHasAnyRoles_normal() { + // 准备参数 + Long userId = 1L; + String[] roles = new String[]{"yunai", "tudou"}; + // mock 用户与角色的缓存 + permissionService.setUserRoleCache(MapUtil.>builder().put(1L, asSet(100L)).build()); + RoleDO role = randomPojo(RoleDO.class, o -> o.setId(100L).setCode("yunai") + .setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(roleService.getRoleFromCache(eq(100L))).thenReturn(role); + // mock 其它方法 + when(roleService.getRolesFromCache(eq(asSet(100L)))).thenReturn(singletonList(role)); + + // 调用 + boolean has = permissionService.hasAnyRoles(userId, roles); + // 断言 + assertTrue(has); + } + + @Test + public void testGetDeptDataPermission_All() { + // 准备参数 + Long userId = 1L; + // mock 用户的角色编号 + permissionService.setUserRoleCache(MapUtil.>builder().put(1L, asSet(2L)).build()); + // mock 获得用户的角色 + RoleDO roleDO = randomPojo(RoleDO.class, o -> o.setDataScope(DataScopeEnum.ALL.getScope()) + .setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(roleService.getRolesFromCache(eq(singleton(2L)))).thenReturn(singletonList(roleDO)); + when(roleService.getRoleFromCache(eq(2L))).thenReturn(roleDO); + + // 调用 + DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(userId); + // 断言 + assertTrue(result.getAll()); + assertFalse(result.getSelf()); + assertTrue(CollUtil.isEmpty(result.getDeptIds())); + } + + @Test + public void testGetDeptDataPermission_DeptCustom() { + // 准备参数 + Long userId = 1L; + // mock 用户的角色编号 + permissionService.setUserRoleCache(MapUtil.>builder().put(1L, asSet(2L)).build()); + // mock 获得用户的角色 + RoleDO roleDO = randomPojo(RoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_CUSTOM.getScope()) + .setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(roleService.getRolesFromCache(eq(singleton(2L)))).thenReturn(singletonList(roleDO)); + when(roleService.getRoleFromCache(eq(2L))).thenReturn(roleDO); + // mock 部门的返回 + when(userService.getUser(eq(1L))).thenReturn(new AdminUserDO().setDeptId(3L), null, null); // 最后返回 null 的目的,看看会不会重复调用 + + // 调用 + DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(userId); + // 断言 + assertFalse(result.getAll()); + assertFalse(result.getSelf()); + assertEquals(roleDO.getDataScopeDeptIds().size() + 1, result.getDeptIds().size()); + assertTrue(CollUtil.containsAll(result.getDeptIds(), roleDO.getDataScopeDeptIds())); + assertTrue(CollUtil.contains(result.getDeptIds(), 3L)); + } + + @Test + public void testGetDeptDataPermission_DeptOnly() { + // 准备参数 + Long userId = 1L; + // mock 用户的角色编号 + permissionService.setUserRoleCache(MapUtil.>builder().put(1L, asSet(2L)).build()); + // mock 获得用户的角色 + RoleDO roleDO = randomPojo(RoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_ONLY.getScope()) + .setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(roleService.getRolesFromCache(eq(singleton(2L)))).thenReturn(singletonList(roleDO)); + when(roleService.getRoleFromCache(eq(2L))).thenReturn(roleDO); + // mock 部门的返回 + when(userService.getUser(eq(1L))).thenReturn(new AdminUserDO().setDeptId(3L), null, null); // 最后返回 null 的目的,看看会不会重复调用 + + // 调用 + DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(userId); + // 断言 + assertFalse(result.getAll()); + assertFalse(result.getSelf()); + assertEquals(1, result.getDeptIds().size()); + assertTrue(CollUtil.contains(result.getDeptIds(), 3L)); + } + + @Test + public void testGetDeptDataPermission_DeptAndChild() { + // 准备参数 + Long userId = 1L; + // mock 用户的角色编号 + permissionService.setUserRoleCache(MapUtil.>builder().put(1L, asSet(2L)).build()); + // mock 获得用户的角色 + RoleDO roleDO = randomPojo(RoleDO.class, o -> o.setDataScope(DataScopeEnum.DEPT_AND_CHILD.getScope()) + .setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(roleService.getRolesFromCache(eq(singleton(2L)))).thenReturn(singletonList(roleDO)); + when(roleService.getRoleFromCache(eq(2L))).thenReturn(roleDO); + // mock 部门的返回 + when(userService.getUser(eq(1L))).thenReturn(new AdminUserDO().setDeptId(3L), null, null); // 最后返回 null 的目的,看看会不会重复调用 + // mock 方法(部门) + DeptDO deptDO = randomPojo(DeptDO.class); + when(deptService.getDeptsByParentIdFromCache(eq(3L), eq(true))) + .thenReturn(singletonList(deptDO)); + + // 调用 + DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(userId); + // 断言 + assertFalse(result.getAll()); + assertFalse(result.getSelf()); + assertEquals(2, result.getDeptIds().size()); + assertTrue(CollUtil.contains(result.getDeptIds(), deptDO.getId())); + assertTrue(CollUtil.contains(result.getDeptIds(), 3L)); + } + + @Test + public void testGetDeptDataPermission_Self() { + // 准备参数 + Long userId = 1L; + // mock 用户的角色编号 + permissionService.setUserRoleCache(MapUtil.>builder().put(1L, asSet(2L)).build()); + // mock 获得用户的角色 + RoleDO roleDO = randomPojo(RoleDO.class, o -> o.setDataScope(DataScopeEnum.SELF.getScope()) + .setStatus(CommonStatusEnum.ENABLE.getStatus())); + when(roleService.getRolesFromCache(eq(singleton(2L)))).thenReturn(singletonList(roleDO)); + when(roleService.getRoleFromCache(eq(2L))).thenReturn(roleDO); + + // 调用 + DeptDataPermissionRespDTO result = permissionService.getDeptDataPermission(userId); + // 断言 + assertFalse(result.getAll()); + assertTrue(result.getSelf()); + assertTrue(CollUtil.isEmpty(result.getDeptIds())); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/permission/RoleServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/permission/RoleServiceTest.java new file mode 100644 index 0000000..46bfa38 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/permission/RoleServiceTest.java @@ -0,0 +1,305 @@ +package com.jojubanking.boot.module.system.service.permission; + +import cn.hutool.core.util.RandomUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RolePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.dal.mysql.permission.RoleMapper; +import com.jojubanking.boot.module.system.enums.permission.DataScopeEnum; +import com.jojubanking.boot.module.system.enums.permission.RoleTypeEnum; +import com.jojubanking.boot.module.system.mq.producer.permission.RoleProducer; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.max; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.verify; + +// TODO @芋艿:单测的代码质量可以提升下 +@Import(RoleServiceImpl.class) +public class RoleServiceTest extends BaseDbUnitTest { + + @Resource + private RoleServiceImpl roleService; + + @Resource + private RoleMapper roleMapper; + + @MockBean + private PermissionService permissionService; + @MockBean + private RoleProducer roleProducer; + + @Test + public void testInitLocalCache() { + RoleDO roleDO1 = randomRole(); + roleMapper.insert(roleDO1); + RoleDO roleDO2 = randomRole(); + roleMapper.insert(roleDO2); + + // 调用 + roleService.initLocalCache(); + // 断言 roleCache 缓存 + Map roleCache = roleService.getRoleCache(); + assertPojoEquals(roleDO1, roleCache.get(roleDO1.getId())); + assertPojoEquals(roleDO2, roleCache.get(roleDO2.getId())); + // 断言 maxUpdateTime 缓存 + assertEquals(max(roleDO1.getUpdateTime(), roleDO2.getUpdateTime()), roleService.getMaxUpdateTime()); + } + + @Test + public void testCreateRole_success() { + // 准备参数 + RoleCreateReqVO reqVO = randomPojo(RoleCreateReqVO.class); + + // 调用 + Long roleId = roleService.createRole(reqVO, null); + // 断言 + assertNotNull(roleId); + RoleDO roleDO = roleMapper.selectById(roleId); + assertPojoEquals(reqVO, roleDO); + assertEquals(RoleTypeEnum.CUSTOM.getType(), roleDO.getType()); + assertEquals(CommonStatusEnum.ENABLE.getStatus(), roleDO.getStatus()); + assertEquals(DataScopeEnum.ALL.getScope(), roleDO.getDataScope()); + // verify 发送刷新消息 + verify(roleProducer).sendRoleRefreshMessage(); + } + + @Test + public void testUpdateRole_success() { + // mock 数据 + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + roleMapper.insert(roleDO); + Long roleId = roleDO.getId(); + + //调用 + RoleUpdateReqVO reqVO = randomPojo(RoleUpdateReqVO.class, o -> { + o.setId(roleId); + o.setCode("role_code"); + o.setName("update_name"); + o.setSort(999); + }); + roleService.updateRole(reqVO); + + //断言 + RoleDO newRoleDO = roleMapper.selectById(roleId); + assertPojoEquals(reqVO, newRoleDO); + + verify(roleProducer).sendRoleRefreshMessage(); + } + + @Test + public void testUpdateRoleStatus_success() { + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL, CommonStatusEnum.ENABLE.getStatus()); + roleMapper.insert(roleDO); + Long roleId = roleDO.getId(); + + //调用 + roleService.updateRoleStatus(roleId, CommonStatusEnum.DISABLE.getStatus()); + + //断言 + RoleDO newRoleDO = roleMapper.selectById(roleId); + assertEquals(CommonStatusEnum.DISABLE.getStatus(), newRoleDO.getStatus()); + + verify(roleProducer).sendRoleRefreshMessage(); + } + + @Test + public void testUpdateRoleDataScope_success() { + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + roleMapper.insert(roleDO); + Long roleId = roleDO.getId(); + + //调用 + Set deptIdSet = Arrays.asList(1L, 2L, 3L, 4L, 5L).stream().collect(Collectors.toSet()); + roleService.updateRoleDataScope(roleId, DataScopeEnum.DEPT_CUSTOM.getScope(), deptIdSet); + + //断言 + RoleDO newRoleDO = roleMapper.selectById(roleId); + assertEquals(DataScopeEnum.DEPT_CUSTOM.getScope(), newRoleDO.getDataScope()); + + Set newDeptIdSet = newRoleDO.getDataScopeDeptIds(); + assertTrue(deptIdSet.size() == newDeptIdSet.size()); + deptIdSet.stream().forEach(d -> assertTrue(newDeptIdSet.contains(d))); + + verify(roleProducer).sendRoleRefreshMessage(); + } + + @Test + public void testDeleteRole_success() { + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + roleMapper.insert(roleDO); + Long roleId = roleDO.getId(); + + //调用 + roleService.deleteRole(roleId); + + //断言 + RoleDO newRoleDO = roleMapper.selectById(roleId); + assertNull(newRoleDO); + + verify(roleProducer).sendRoleRefreshMessage(); + } + + @Test + public void testGetRoles() { + // mock 数据 + RoleDO dbRole = randomPojo(RoleDO.class, o -> { // 等会查询到 + o.setName("土豆"); + o.setCode("tudou"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(DateUtils.buildTime(2022, 2, 8)); + }); + roleMapper.insert(dbRole); + // 测试 name 不匹配 + roleMapper.insert(cloneIgnoreId(dbRole, o -> o.setName("红薯"))); + // 测试 code 不匹配 + roleMapper.insert(cloneIgnoreId(dbRole, o -> o.setCode("hong"))); + // 测试 createTime 不匹配 + roleMapper.insert(cloneIgnoreId(dbRole, o -> o.setCreateTime(DateUtils.buildTime(2022, 2, 16)))); + // 准备参数 + RoleExportReqVO reqVO = new RoleExportReqVO(); + reqVO.setName("土豆"); + reqVO.setCode("tu"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2022, 2, 1),buildTime(2022, 2, 12)})); + + // 调用 + List list = roleService.getRoleList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbRole, list.get(0)); + } + + @Test + public void testGetRolePage() { + // mock 数据 + RoleDO dbRole = randomPojo(RoleDO.class, o -> { // 等会查询到 + o.setName("土豆"); + o.setCode("tudou"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(DateUtils.buildTime(2022, 2, 8)); + }); + roleMapper.insert(dbRole); + // 测试 name 不匹配 + roleMapper.insert(cloneIgnoreId(dbRole, o -> o.setName("红薯"))); + // 测试 code 不匹配 + roleMapper.insert(cloneIgnoreId(dbRole, o -> o.setCode("hong"))); + // 测试 createTime 不匹配 + roleMapper.insert(cloneIgnoreId(dbRole, o -> o.setCreateTime(DateUtils.buildTime(2022, 2, 16)))); + // 准备参数 + RolePageReqVO reqVO = new RolePageReqVO(); + reqVO.setName("土豆"); + reqVO.setCode("tu"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2022, 2, 1),buildTime(2022, 2, 12)})); + + // 调用 + PageResult pageResult = roleService.getRolePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbRole, pageResult.getList().get(0)); + } + + @Test + public void testCheckDuplicateRole_success() { + roleService.checkDuplicateRole(randomString(), randomString(), null); + } + + @Test + public void testCheckDuplicateRole_nameDuplicate() { + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + roleMapper.insert(roleDO); + + String duplicateName = "role_name"; + + assertServiceException(() -> roleService.checkDuplicateRole(duplicateName, randomString(), null), ROLE_NAME_DUPLICATE, duplicateName); + } + + @Test + public void testCheckDuplicateRole_codeDuplicate() { + RoleDO roleDO = randomPojo(RoleDO.class, o -> { + o.setName("role_999"); + o.setCode("code"); + o.setType(RoleTypeEnum.CUSTOM.getType()); + o.setStatus(1); + o.setDataScope(DataScopeEnum.ALL.getScope()); + }); + roleMapper.insert(roleDO); + + String randomName = randomString(); + String duplicateCode = "code"; + + assertServiceException(() -> roleService.checkDuplicateRole(randomName, duplicateCode, null), ROLE_CODE_DUPLICATE, duplicateCode); + } + + @Test + public void testCheckUpdateRole_success() { + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.CUSTOM, DataScopeEnum.ALL); + roleMapper.insert(roleDO); + Long roleId = roleDO.getId(); + + roleService.checkUpdateRole(roleId); + } + + @Test + public void testCheckUpdateRole_roleIdNotExist() { + assertServiceException(() -> roleService.checkUpdateRole(randomLongId()), ROLE_NOT_EXISTS); + } + + @Test + public void testCheckUpdateRole_systemRoleCanNotBeUpdate() { + RoleDO roleDO = createRoleDO("role_name", RoleTypeEnum.SYSTEM, DataScopeEnum.ALL); + roleMapper.insert(roleDO); + Long roleId = roleDO.getId(); + + assertServiceException(() -> roleService.checkUpdateRole(roleId), ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE); + } + + private RoleDO createRoleDO(String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status) { + return createRoleDO( name, typeEnum, scopeEnum, status, randomString()); + } + + private RoleDO createRoleDO(String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { + return createRoleDO(null, name, typeEnum, scopeEnum, status, code); + } + + private RoleDO createRoleDO(String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum) { + return createRoleDO(null, name, typeEnum, scopeEnum, randomCommonStatus(), randomString()); + } + + private RoleDO createRoleDO(Long id, String name, RoleTypeEnum typeEnum, DataScopeEnum scopeEnum, Integer status, String code) { + return randomPojo(RoleDO.class, o -> { + o.setId(id); + o.setName(name); + o.setType(typeEnum.getType()); + o.setStatus(status); + o.setDataScope(scopeEnum.getScope()); + o.setCode(code); + }); + } + + private RoleDO randomRole() { + return randomPojo(RoleDO.class, + o -> o.setDataScope(RandomUtil.randomEle(DataScopeEnum.values()).getScope())); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordServiceImplTest.java new file mode 100644 index 0000000..302ea60 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordServiceImplTest.java @@ -0,0 +1,246 @@ +package com.jojubanking.boot.module.system.service.sensitiveword; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.SetUtils; +import com.jojubanking.boot.framework.common.util.date.DateUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; +import com.jojubanking.boot.module.system.dal.mysql.sensitiveword.SensitiveWordMapper; +import com.jojubanking.boot.module.system.mq.producer.sensitiveword.SensitiveWordProducer; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.max; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomLongId; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.SENSITIVE_WORD_NOT_EXISTS; +import static java.util.Collections.singletonList; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.verify; + +/** + * {@link SensitiveWordServiceImpl} 的单元测试类 + * + * @author 永不言败 + */ +@Import(SensitiveWordServiceImpl.class) +public class SensitiveWordServiceImplTest extends BaseDbUnitTest { + + @Resource + private SensitiveWordServiceImpl sensitiveWordService; + + @Resource + private SensitiveWordMapper sensitiveWordMapper; + + @MockBean + private SensitiveWordProducer sensitiveWordProducer; + + @Test + public void testInitLocalCache() { + SensitiveWordDO wordDO1 = randomPojo(SensitiveWordDO.class, o -> o.setName("傻瓜") + .setTags(singletonList("论坛")).setStatus(CommonStatusEnum.ENABLE.getStatus())); + sensitiveWordMapper.insert(wordDO1); + SensitiveWordDO wordDO2 = randomPojo(SensitiveWordDO.class, o -> o.setName("笨蛋") + .setTags(singletonList("蔬菜")).setStatus(CommonStatusEnum.ENABLE.getStatus())); + sensitiveWordMapper.insert(wordDO2); + + // 调用 + sensitiveWordService.initLocalCache(); + // 断言 maxUpdateTime 缓存 + assertEquals(max(wordDO1.getUpdateTime(), wordDO2.getUpdateTime()), sensitiveWordService.getMaxUpdateTime()); + // 断言 sensitiveWordTagsCache 缓存 + assertEquals(SetUtils.asSet("论坛", "蔬菜"), sensitiveWordService.getSensitiveWordTags()); + // 断言 tagSensitiveWordTries 缓存 + assertNotNull(sensitiveWordService.getDefaultSensitiveWordTrie()); + assertEquals(2, sensitiveWordService.getTagSensitiveWordTries().size()); + assertNotNull(sensitiveWordService.getTagSensitiveWordTries().get("论坛")); + assertNotNull(sensitiveWordService.getTagSensitiveWordTries().get("蔬菜")); + } + + @Test + public void testCreateSensitiveWord_success() { + // 准备参数 + SensitiveWordCreateReqVO reqVO = randomPojo(SensitiveWordCreateReqVO.class); + + // 调用 + Long sensitiveWordId = sensitiveWordService.createSensitiveWord(reqVO); + // 断言 + assertNotNull(sensitiveWordId); + // 校验记录的属性是否正确 + SensitiveWordDO sensitiveWord = sensitiveWordMapper.selectById(sensitiveWordId); + assertPojoEquals(reqVO, sensitiveWord); + verify(sensitiveWordProducer).sendSensitiveWordRefreshMessage(); + } + + @Test + public void testUpdateSensitiveWord_success() { + // mock 数据 + SensitiveWordDO dbSensitiveWord = randomPojo(SensitiveWordDO.class); + sensitiveWordMapper.insert(dbSensitiveWord);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SensitiveWordUpdateReqVO reqVO = randomPojo(SensitiveWordUpdateReqVO.class, o -> { + o.setId(dbSensitiveWord.getId()); // 设置更新的 ID + }); + + // 调用 + sensitiveWordService.updateSensitiveWord(reqVO); + // 校验是否更新正确 + SensitiveWordDO sensitiveWord = sensitiveWordMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, sensitiveWord); + verify(sensitiveWordProducer).sendSensitiveWordRefreshMessage(); + } + + @Test + public void testUpdateSensitiveWord_notExists() { + // 准备参数 + SensitiveWordUpdateReqVO reqVO = randomPojo(SensitiveWordUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> sensitiveWordService.updateSensitiveWord(reqVO), SENSITIVE_WORD_NOT_EXISTS); + } + + @Test + public void testDeleteSensitiveWord_success() { + // mock 数据 + SensitiveWordDO dbSensitiveWord = randomPojo(SensitiveWordDO.class); + sensitiveWordMapper.insert(dbSensitiveWord);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbSensitiveWord.getId(); + + // 调用 + sensitiveWordService.deleteSensitiveWord(id); + // 校验数据不存在了 + assertNull(sensitiveWordMapper.selectById(id)); + verify(sensitiveWordProducer).sendSensitiveWordRefreshMessage(); + } + + @Test + public void testDeleteSensitiveWord_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> sensitiveWordService.deleteSensitiveWord(id), SENSITIVE_WORD_NOT_EXISTS); + } + + @Test + public void testGetSensitiveWordPage() { + // mock 数据 + SensitiveWordDO dbSensitiveWord = randomPojo(SensitiveWordDO.class, o -> { // 等会查询到 + o.setName("笨蛋"); + o.setTags(Arrays.asList("论坛", "蔬菜")); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(DateUtils.buildTime(2022, 2, 8)); + }); + sensitiveWordMapper.insert(dbSensitiveWord); + // 测试 name 不匹配 + sensitiveWordMapper.insert(cloneIgnoreId(dbSensitiveWord, o -> o.setName("傻瓜"))); + // 测试 tags 不匹配 + sensitiveWordMapper.insert(cloneIgnoreId(dbSensitiveWord, o -> o.setTags(Arrays.asList("短信", "日用品")))); + // 测试 createTime 不匹配 + sensitiveWordMapper.insert(cloneIgnoreId(dbSensitiveWord, o -> o.setCreateTime(DateUtils.buildTime(2022, 2, 16)))); + // 准备参数 + SensitiveWordPageReqVO reqVO = new SensitiveWordPageReqVO(); + reqVO.setName("笨"); + reqVO.setTag("论坛"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2022, 2, 1),buildTime(2022, 2, 12)})); + + // 调用 + PageResult pageResult = sensitiveWordService.getSensitiveWordPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbSensitiveWord, pageResult.getList().get(0)); + } + + @Test + public void testGetSensitiveWordList() { + // mock 数据 + SensitiveWordDO dbSensitiveWord = randomPojo(SensitiveWordDO.class, o -> { // 等会查询到 + o.setName("笨蛋"); + o.setTags(Arrays.asList("论坛", "蔬菜")); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(DateUtils.buildTime(2022, 2, 8)); + }); + sensitiveWordMapper.insert(dbSensitiveWord); + // 测试 name 不匹配 + sensitiveWordMapper.insert(cloneIgnoreId(dbSensitiveWord, o -> o.setName("傻瓜"))); + // 测试 tags 不匹配 + sensitiveWordMapper.insert(cloneIgnoreId(dbSensitiveWord, o -> o.setTags(Arrays.asList("短信", "日用品")))); + // 测试 createTime 不匹配 + sensitiveWordMapper.insert(cloneIgnoreId(dbSensitiveWord, o -> o.setCreateTime(DateUtils.buildTime(2022, 2, 16)))); + // 准备参数 + SensitiveWordExportReqVO reqVO = new SensitiveWordExportReqVO(); + reqVO.setName("笨"); + reqVO.setTag("论坛"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2022, 2, 1),buildTime(2022, 2, 12)})); + + // 调用 + List list = sensitiveWordService.getSensitiveWordList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbSensitiveWord, list.get(0)); + } + + @Test + public void testValidateText_noTag() { + testInitLocalCache(); + // 准备参数 + String text = "你是傻瓜,你是笨蛋"; + + // 调用 + List result = sensitiveWordService.validateText(text, null); + // 断言 + assertEquals(Arrays.asList("傻瓜", "笨蛋"), result); + } + + @Test + public void testValidateText_hasTag() { + testInitLocalCache(); + // 准备参数 + String text = "你是傻瓜,你是笨蛋"; + + // 调用 + List result = sensitiveWordService.validateText(text, singletonList("论坛")); + // 断言 + assertEquals(singletonList("傻瓜"), result); + } + + @Test + public void testIsTestValid_noTag() { + testInitLocalCache(); + // 准备参数 + String text = "你是傻瓜,你是笨蛋"; + + // 调用,断言 + assertFalse(sensitiveWordService.isTextValid(text, null)); + } + + @Test + public void testIsTestValid_hasTag() { + testInitLocalCache(); + // 准备参数 + String text = "你是傻瓜,你是笨蛋"; + + // 调用,断言 + assertFalse(sensitiveWordService.isTextValid(text, singletonList("论坛"))); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sms/SmsChannelServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sms/SmsChannelServiceTest.java new file mode 100644 index 0000000..8e99571 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sms/SmsChannelServiceTest.java @@ -0,0 +1,195 @@ +package com.jojubanking.boot.module.system.service.sms; + +import cn.hutool.core.bean.BeanUtil; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; +import com.jojubanking.boot.module.system.dal.mysql.sms.SmsChannelMapper; +import com.jojubanking.boot.module.system.mq.producer.sms.SmsProducer; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsChannelDO; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.sms.core.client.SmsClientFactory; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_HAS_CHILDREN; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.max; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.*; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +@Import(SmsChannelServiceImpl.class) +public class SmsChannelServiceTest extends BaseDbUnitTest { + + @Resource + private SmsChannelServiceImpl smsChannelService; + + @Resource + private SmsChannelMapper smsChannelMapper; + + @MockBean + private SmsClientFactory smsClientFactory; + @MockBean + private SmsTemplateService smsTemplateService; + @MockBean + private SmsProducer smsProducer; + + @Test + public void testInitLocalCache_success() { + // mock 数据 + SmsChannelDO smsChannelDO01 = randomSmsChannelDO(); + smsChannelMapper.insert(smsChannelDO01); + SmsChannelDO smsChannelDO02 = randomSmsChannelDO(); + smsChannelMapper.insert(smsChannelDO02); + + // 调用 + smsChannelService.initSmsClients(); + // 校验 maxUpdateTime 属性 + Date maxUpdateTime = (Date) BeanUtil.getFieldValue(smsChannelService, "maxUpdateTime"); + assertEquals(max(smsChannelDO01.getUpdateTime(), smsChannelDO02.getUpdateTime()), maxUpdateTime); + // 校验调用 + verify(smsClientFactory, times(1)).createOrUpdateSmsClient( + argThat(properties -> isPojoEquals(smsChannelDO01, properties))); + verify(smsClientFactory, times(1)).createOrUpdateSmsClient( + argThat(properties -> isPojoEquals(smsChannelDO02, properties))); + } + + @Test + public void testCreateSmsChannel_success() { + // 准备参数 + SmsChannelCreateReqVO reqVO = randomPojo(SmsChannelCreateReqVO.class, o -> o.setStatus(randomCommonStatus())); + + // 调用 + Long smsChannelId = smsChannelService.createSmsChannel(reqVO); + // 断言 + assertNotNull(smsChannelId); + // 校验记录的属性是否正确 + SmsChannelDO smsChannel = smsChannelMapper.selectById(smsChannelId); + assertPojoEquals(reqVO, smsChannel); + // 校验调用 + verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); + } + + @Test + public void testUpdateSmsChannel_success() { + // mock 数据 + SmsChannelDO dbSmsChannel = randomSmsChannelDO(); + smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SmsChannelUpdateReqVO reqVO = randomPojo(SmsChannelUpdateReqVO.class, o -> { + o.setId(dbSmsChannel.getId()); // 设置更新的 ID + o.setStatus(randomCommonStatus()); + o.setCallbackUrl(randomString()); + }); + + // 调用 + smsChannelService.updateSmsChannel(reqVO); + // 校验是否更新正确 + SmsChannelDO smsChannel = smsChannelMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, smsChannel); + // 校验调用 + verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); + } + + @Test + public void testUpdateSmsChannel_notExists() { + // 准备参数 + SmsChannelUpdateReqVO reqVO = randomPojo(SmsChannelUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> smsChannelService.updateSmsChannel(reqVO), SMS_CHANNEL_NOT_EXISTS); + } + + @Test + public void testDeleteSmsChannel_success() { + // mock 数据 + SmsChannelDO dbSmsChannel = randomSmsChannelDO(); + smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbSmsChannel.getId(); + + // 调用 + smsChannelService.deleteSmsChannel(id); + // 校验数据不存在了 + assertNull(smsChannelMapper.selectById(id)); + // 校验调用 + verify(smsProducer, times(1)).sendSmsChannelRefreshMessage(); + } + + @Test + public void testDeleteSmsChannel_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> smsChannelService.deleteSmsChannel(id), SMS_CHANNEL_NOT_EXISTS); + } + + @Test + public void testDeleteSmsChannel_hasChildren() { + // mock 数据 + SmsChannelDO dbSmsChannel = randomSmsChannelDO(); + smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbSmsChannel.getId(); + // mock 方法 + when(smsTemplateService.countByChannelId(eq(id))).thenReturn(10L); + + // 调用, 并断言异常 + assertServiceException(() -> smsChannelService.deleteSmsChannel(id), SMS_CHANNEL_HAS_CHILDREN); + } + + @Test + public void testGetSmsChannelPage() { + // mock 数据 + SmsChannelDO dbSmsChannel = randomPojo(SmsChannelDO.class, o -> { // 等会查询到 + o.setSignature("TW"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(buildTime(2020, 12, 12)); + }); + smsChannelMapper.insert(dbSmsChannel); + // 测试 signature 不匹配 + smsChannelMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsChannel, o -> o.setSignature("源码"))); + // 测试 status 不匹配 + smsChannelMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsChannel, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + smsChannelMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsChannel, o -> o.setCreateTime(buildTime(2020, 11, 11)))); + // 准备参数 + SmsChannelPageReqVO reqVO = new SmsChannelPageReqVO(); + reqVO.setSignature("芋道"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2020, 12, 1),buildTime(2020, 12, 24)})); + + // 调用 + PageResult pageResult = smsChannelService.getSmsChannelPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbSmsChannel, pageResult.getList().get(0)); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static SmsChannelDO randomSmsChannelDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + }; + return randomPojo(SmsChannelDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sms/SmsLogServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sms/SmsLogServiceTest.java new file mode 100644 index 0000000..2a9f7f8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sms/SmsLogServiceTest.java @@ -0,0 +1,239 @@ +package com.jojubanking.boot.module.system.service.sms; + +import cn.hutool.core.map.MapUtil; +import com.jojubanking.boot.framework.common.pojo.CommonResult; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogPageReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsLogDO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.jojubanking.boot.module.system.dal.mysql.sms.SmsLogMapper; +import com.jojubanking.boot.module.system.enums.sms.SmsReceiveStatusEnum; +import com.jojubanking.boot.module.system.enums.sms.SmsSendStatusEnum; +import com.jojubanking.boot.module.system.enums.sms.SmsTemplateTypeEnum; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomBoolean; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@Import(SmsLogServiceImpl.class) +public class SmsLogServiceTest extends BaseDbUnitTest { + + @Resource + private SmsLogServiceImpl smsLogService; + + @Resource + private SmsLogMapper smsLogMapper; + + @Test + public void testGetSmsLogPage() { + // mock 数据 + SmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到 + o.setChannelId(1L); + o.setTemplateId(10L); + o.setMobile("15601691300"); + o.setSendStatus(SmsSendStatusEnum.INIT.getStatus()); + o.setSendTime(buildTime(2020, 11, 11)); + o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); + o.setReceiveTime(buildTime(2021, 11, 11)); + }); + smsLogMapper.insert(dbSmsLog); + // 测试 channelId 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setChannelId(2L))); + // 测试 templateId 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setTemplateId(20L))); + // 测试 mobile 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setMobile("18818260999"))); + // 测试 sendStatus 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus()))); + // 测试 sendTime 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12)))); + // 测试 receiveStatus 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SmsReceiveStatusEnum.SUCCESS.getStatus()))); + // 测试 receiveTime 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12)))); + // 准备参数 + SmsLogPageReqVO reqVO = new SmsLogPageReqVO(); + reqVO.setChannelId(1L); + reqVO.setTemplateId(10L); + reqVO.setMobile("156"); + reqVO.setSendStatus(SmsSendStatusEnum.INIT.getStatus()); + reqVO.setSendTime((new Date[]{buildTime(2020, 11, 1),buildTime(2020, 11, 30)})); + reqVO.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); + reqVO.setReceiveTime((new Date[]{buildTime(2021, 11, 1),buildTime(2021, 11, 30)})); + + // 调用 + PageResult pageResult = smsLogService.getSmsLogPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbSmsLog, pageResult.getList().get(0)); + } + + @Test + public void testGetSmsLogList() { + // mock 数据 + SmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到 + o.setChannelId(1L); + o.setTemplateId(10L); + o.setMobile("15601691300"); + o.setSendStatus(SmsSendStatusEnum.INIT.getStatus()); + o.setSendTime(buildTime(2020, 11, 11)); + o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); + o.setReceiveTime(buildTime(2021, 11, 11)); + }); + smsLogMapper.insert(dbSmsLog); + // 测试 channelId 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setChannelId(2L))); + // 测试 templateId 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setTemplateId(20L))); + // 测试 mobile 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setMobile("18818260999"))); + // 测试 sendStatus 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus()))); + // 测试 sendTime 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12)))); + // 测试 receiveStatus 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setReceiveStatus(SmsReceiveStatusEnum.SUCCESS.getStatus()))); + // 测试 receiveTime 不匹配 + smsLogMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12)))); + // 准备参数 + SmsLogExportReqVO reqVO = new SmsLogExportReqVO(); + reqVO.setChannelId(1L); + reqVO.setTemplateId(10L); + reqVO.setMobile("156"); + reqVO.setSendStatus(SmsSendStatusEnum.INIT.getStatus()); + reqVO.setSendTime((new Date[]{buildTime(2020, 11, 1),buildTime(2020, 11, 30)})); + reqVO.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); + reqVO.setReceiveTime((new Date[]{buildTime(2021, 11, 1),buildTime(2021, 11, 30)})); + + // 调用 + List list = smsLogService.getSmsLogList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbSmsLog, list.get(0)); + } + + @Test + public void testCreateSmsLog() { + // 准备参数 + String mobile = randomString(); + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + Boolean isSend = randomBoolean(); + SmsTemplateDO templateDO = randomPojo(SmsTemplateDO.class, + o -> o.setType(randomEle(SmsTemplateTypeEnum.values()).getType())); + String templateContent = randomString(); + Map templateParams = randomTemplateParams(); + // mock 方法 + + // 调用 + Long logId = smsLogService.createSmsLog(mobile, userId, userType, isSend, + templateDO, templateContent, templateParams); + // 断言 + SmsLogDO logDO = smsLogMapper.selectById(logId); + assertEquals(isSend ? SmsSendStatusEnum.INIT.getStatus() : SmsSendStatusEnum.IGNORE.getStatus(), + logDO.getSendStatus()); + assertEquals(mobile, logDO.getMobile()); + assertEquals(userType, logDO.getUserType()); + assertEquals(userId, logDO.getUserId()); + assertEquals(templateDO.getId(), logDO.getTemplateId()); + assertEquals(templateDO.getCode(), logDO.getTemplateCode()); + assertEquals(templateDO.getType(), logDO.getTemplateType()); + assertEquals(templateDO.getChannelId(), logDO.getChannelId()); + assertEquals(templateDO.getChannelCode(), logDO.getChannelCode()); + assertEquals(templateContent, logDO.getTemplateContent()); + assertEquals(templateParams, logDO.getTemplateParams()); + assertEquals(SmsReceiveStatusEnum.INIT.getStatus(), logDO.getReceiveStatus()); + } + + @Test + public void testUpdateSmsSendResult() { + // mock 数据 + SmsLogDO dbSmsLog = randomSmsLogDO( + o -> o.setSendStatus(SmsSendStatusEnum.IGNORE.getStatus())); + smsLogMapper.insert(dbSmsLog); + // 准备参数 + Long id = dbSmsLog.getId(); + Integer sendCode = randomInteger(); + String sendMsg = randomString(); + String apiSendCode = randomString(); + String apiSendMsg = randomString(); + String apiRequestId = randomString(); + String apiSerialNo = randomString(); + + // 调用 + smsLogService.updateSmsSendResult(id, sendCode, sendMsg, + apiSendCode, apiSendMsg, apiRequestId, apiSerialNo); + // 断言 + dbSmsLog = smsLogMapper.selectById(id); + assertEquals(CommonResult.isSuccess(sendCode) ? SmsSendStatusEnum.SUCCESS.getStatus() + : SmsSendStatusEnum.FAILURE.getStatus(), dbSmsLog.getSendStatus()); + assertNotNull(dbSmsLog.getSendTime()); + assertEquals(sendMsg, dbSmsLog.getSendMsg()); + assertEquals(apiSendCode, dbSmsLog.getApiSendCode()); + assertEquals(apiSendMsg, dbSmsLog.getApiSendMsg()); + assertEquals(apiRequestId, dbSmsLog.getApiRequestId()); + assertEquals(apiSerialNo, dbSmsLog.getApiSerialNo()); + } + + @Test + public void testUpdateSmsReceiveResult() { + // mock 数据 + SmsLogDO dbSmsLog = randomSmsLogDO( + o -> o.setReceiveStatus(SmsReceiveStatusEnum.INIT.getStatus())); + smsLogMapper.insert(dbSmsLog); + // 准备参数 + Long id = dbSmsLog.getId(); + Boolean success = randomBoolean(); + Date receiveTime = randomDate(); + String apiReceiveCode = randomString(); + String apiReceiveMsg = randomString(); + + // 调用 + smsLogService.updateSmsReceiveResult(id, success, receiveTime, apiReceiveCode, apiReceiveMsg); + // 断言 + dbSmsLog = smsLogMapper.selectById(id); + assertEquals(success ? SmsReceiveStatusEnum.SUCCESS.getStatus() + : SmsReceiveStatusEnum.FAILURE.getStatus(), dbSmsLog.getReceiveStatus()); + assertEquals(receiveTime, dbSmsLog.getReceiveTime()); + assertEquals(apiReceiveCode, dbSmsLog.getApiReceiveCode()); + assertEquals(apiReceiveMsg, dbSmsLog.getApiReceiveMsg()); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static SmsLogDO randomSmsLogDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setTemplateParams(randomTemplateParams()); + o.setTemplateType(randomEle(SmsTemplateTypeEnum.values()).getType()); // 保证 templateType 的范围 + o.setUserType(randomEle(UserTypeEnum.values()).getValue()); // 保证 userType 的范围 + o.setSendStatus(randomEle(SmsSendStatusEnum.values()).getStatus()); // 保证 sendStatus 的范围 + o.setReceiveStatus(randomEle(SmsReceiveStatusEnum.values()).getStatus()); // 保证 receiveStatus 的范围 + }; + return randomPojo(SmsLogDO.class, ArrayUtils.append(consumer, consumers)); + } + + + private static Map randomTemplateParams() { + return MapUtil.builder().put(randomString(), randomString()) + .put(randomString(), randomString()).build(); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sms/SmsSendServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sms/SmsSendServiceTest.java new file mode 100644 index 0000000..62b6c84 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sms/SmsSendServiceTest.java @@ -0,0 +1,193 @@ +package com.jojubanking.boot.module.system.service.sms; + +import cn.hutool.core.map.MapUtil; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.jojubanking.boot.module.system.mq.message.sms.SmsSendMessage; +import com.jojubanking.boot.module.system.mq.producer.sms.SmsProducer; +import com.jojubanking.boot.framework.common.core.KeyValue; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.sms.core.client.SmsClient; +import com.jojubanking.boot.framework.sms.core.client.SmsClientFactory; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsReceiveRespDTO; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsSendRespDTO; +import com.jojubanking.boot.framework.test.core.ut.BaseMockitoUnitTest; +import org.assertj.core.util.Lists; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +public class SmsSendServiceTest extends BaseMockitoUnitTest { + + @InjectMocks + private SmsSendServiceImpl smsService; + + @Mock + private SmsTemplateService smsTemplateService; + @Mock + private SmsLogService smsLogService; + @Mock + private SmsProducer smsProducer; + @Mock + private SmsClientFactory smsClientFactory; + + /** + * 发送成功,当短信模板开启时 + */ + @Test + public void testSendSingleSms_successWhenSmsTemplateEnable() { + // 准备参数 + String mobile = randomString(); + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String templateCode = randomString(); + Map templateParams = MapUtil.builder().put("code", "1234") + .put("op", "login").build(); + // mock SmsTemplateService 的方法 + SmsTemplateDO template = randomPojo(SmsTemplateDO.class, o -> { + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setContent("验证码为{code}, 操作为{op}"); + o.setParams(Lists.newArrayList("code", "op")); + }); + when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template); + String content = randomString(); + when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams))) + .thenReturn(content); + // mock SmsLogService 的方法 + Long smsLogId = randomLongId(); + when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.TRUE), eq(template), + eq(content), eq(templateParams))).thenReturn(smsLogId); + + // 调用 + Long resultSmsLogId = smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); + // 断言 + assertEquals(smsLogId, resultSmsLogId); + // 断言调用 + verify(smsProducer, times(1)).sendSmsSendMessage(eq(smsLogId), eq(mobile), + eq(template.getChannelId()), eq(template.getApiTemplateId()), + eq(Lists.newArrayList(new KeyValue<>("code", "1234"), new KeyValue<>("op", "login")))); + } + + /** + * 发送成功,当短信模板关闭时 + */ + @Test + public void testSendSingleSms_successWhenSmsTemplateDisable() { + // 准备参数 + String mobile = randomString(); + Long userId = randomLongId(); + Integer userType = randomEle(UserTypeEnum.values()).getValue(); + String templateCode = randomString(); + Map templateParams = MapUtil.builder().put("code", "1234") + .put("op", "login").build(); + // mock SmsTemplateService 的方法 + SmsTemplateDO template = randomPojo(SmsTemplateDO.class, o -> { + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); + o.setContent("验证码为{code}, 操作为{op}"); + o.setParams(Lists.newArrayList("code", "op")); + }); + when(smsTemplateService.getSmsTemplateByCodeFromCache(eq(templateCode))).thenReturn(template); + String content = randomString(); + when(smsTemplateService.formatSmsTemplateContent(eq(template.getContent()), eq(templateParams))) + .thenReturn(content); + // mock SmsLogService 的方法 + Long smsLogId = randomLongId(); + when(smsLogService.createSmsLog(eq(mobile), eq(userId), eq(userType), eq(Boolean.FALSE), eq(template), + eq(content), eq(templateParams))).thenReturn(smsLogId); + + // 调用 + Long resultSmsLogId = smsService.sendSingleSms(mobile, userId, userType, templateCode, templateParams); + // 断言 + assertEquals(smsLogId, resultSmsLogId); + // 断言调用 + verify(smsProducer, times(0)).sendSmsSendMessage(anyLong(), anyString(), + anyLong(), any(), anyList()); + } + + @Test + public void testCheckSmsTemplateValid_notExists() { + // 准备参数 + String templateCode = randomString(); + // mock 方法 + + // 调用,并断言异常 + assertServiceException(() -> smsService.checkSmsTemplateValid(templateCode), + SMS_SEND_TEMPLATE_NOT_EXISTS); + } + + @Test + public void testBuildTemplateParams_paramMiss() { + // 准备参数 + SmsTemplateDO template = randomPojo(SmsTemplateDO.class, + o -> o.setParams(Lists.newArrayList("code"))); + Map templateParams = new HashMap<>(); + // mock 方法 + + // 调用,并断言异常 + assertServiceException(() -> smsService.buildTemplateParams(template, templateParams), + SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS, "code"); + } + + @Test + public void testCheckMobile_notExists() { + // 准备参数 + // mock 方法 + + // 调用,并断言异常 + assertServiceException(() -> smsService.checkMobile(null), + SMS_SEND_MOBILE_NOT_EXISTS); + } + + @Test + @SuppressWarnings("unchecked") + public void testDoSendSms() { + // 准备参数 + SmsSendMessage message = randomPojo(SmsSendMessage.class); + // mock SmsClientFactory 的方法 + SmsClient smsClient = spy(SmsClient.class); + when(smsClientFactory.getSmsClient(eq(message.getChannelId()))).thenReturn(smsClient); + // mock SmsClient 的方法 + SmsCommonResult sendResult = randomPojo(SmsCommonResult.class, SmsSendRespDTO.class); + when(smsClient.sendSms(eq(message.getLogId()), eq(message.getMobile()), eq(message.getApiTemplateId()), + eq(message.getTemplateParams()))).thenReturn(sendResult); + + // 调用 + smsService.doSendSms(message); + // 断言 + verify(smsLogService, times(1)).updateSmsSendResult(eq(message.getLogId()), + eq(sendResult.getCode()), eq(sendResult.getMsg()), eq(sendResult.getApiCode()), + eq(sendResult.getApiMsg()), eq(sendResult.getApiRequestId()), eq(sendResult.getData().getSerialNo())); + } + + @Test + public void testReceiveSmsStatus() throws Throwable { + // 准备参数 + String channelCode = randomString(); + String text = randomString(); + // mock SmsClientFactory 的方法 + SmsClient smsClient = spy(SmsClient.class); + when(smsClientFactory.getSmsClient(eq(channelCode))).thenReturn(smsClient); + // mock SmsClient 的方法 + List receiveResults = randomPojoList(SmsReceiveRespDTO.class); + + // 调用 + smsService.receiveSmsStatus(channelCode, text); + // 断言 + receiveResults.forEach(result -> smsLogService.updateSmsReceiveResult(eq(result.getLogId()), eq(result.getSuccess()), + eq(result.getReceiveTime()), eq(result.getErrorCode()), eq(result.getErrorCode()))); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sms/SmsTemplateServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sms/SmsTemplateServiceTest.java new file mode 100644 index 0000000..8c52b7d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/sms/SmsTemplateServiceTest.java @@ -0,0 +1,372 @@ +package com.jojubanking.boot.module.system.service.sms; + +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplatePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsChannelDO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsTemplateDO; +import com.jojubanking.boot.module.system.dal.mysql.sms.SmsTemplateMapper; +import com.jojubanking.boot.module.system.mq.producer.sms.SmsProducer; +import com.jojubanking.boot.module.system.enums.sms.SmsTemplateTypeEnum; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.exception.enums.GlobalErrorCodeConstants; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.sms.core.client.SmsClient; +import com.jojubanking.boot.framework.sms.core.client.SmsClientFactory; +import com.jojubanking.boot.framework.sms.core.client.SmsCommonResult; +import com.jojubanking.boot.framework.sms.core.client.dto.SmsTemplateRespDTO; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.google.common.collect.Lists; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import static cn.hutool.core.bean.BeanUtil.getFieldValue; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.max; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.*; + +@Import(SmsTemplateServiceImpl.class) +public class SmsTemplateServiceTest extends BaseDbUnitTest { + + @Resource + private SmsTemplateServiceImpl smsTemplateService; + + @Resource + private SmsTemplateMapper smsTemplateMapper; + + @MockBean + private SmsChannelService smsChannelService; + @MockBean + private SmsClientFactory smsClientFactory; + @MockBean + private SmsClient smsClient; + @MockBean + private SmsProducer smsProducer; + + @Test + @SuppressWarnings("unchecked") + void testInitLocalCache() { + // mock 数据 + SmsTemplateDO smsTemplate01 = randomSmsTemplateDO(); + smsTemplateMapper.insert(smsTemplate01); + SmsTemplateDO smsTemplate02 = randomSmsTemplateDO(); + smsTemplateMapper.insert(smsTemplate02); + + // 调用 + smsTemplateService.initLocalCache(); + // 断言 deptCache 缓存 + Map smsTemplateCache = (Map) getFieldValue(smsTemplateService, "smsTemplateCache"); + assertEquals(2, smsTemplateCache.size()); + assertPojoEquals(smsTemplate01, smsTemplateCache.get(smsTemplate01.getCode())); + assertPojoEquals(smsTemplate02, smsTemplateCache.get(smsTemplate02.getCode())); + // 断言 maxUpdateTime 缓存 + Date maxUpdateTime = (Date) getFieldValue(smsTemplateService, "maxUpdateTime"); + assertEquals(max(smsTemplate01.getUpdateTime(), smsTemplate02.getUpdateTime()), maxUpdateTime); + } + + @Test + public void testParseTemplateContentParams() { + // 准备参数 + String content = "正在进行登录操作{operation},您的验证码是{code}"; + // mock 方法 + + // 调用 + List params = smsTemplateService.parseTemplateContentParams(content); + // 断言 + assertEquals(Lists.newArrayList("operation", "code"), params); + } + + @Test + @SuppressWarnings("unchecked") + public void testCreateSmsTemplate_success() { + // 准备参数 + SmsTemplateCreateReqVO reqVO = randomPojo(SmsTemplateCreateReqVO.class, o -> { + o.setContent("正在进行登录操作{operation},您的验证码是{code}"); + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setType(randomEle(SmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 + }); + // mock Channel 的方法 + SmsChannelDO channelDO = randomPojo(SmsChannelDO.class, o -> { + o.setId(reqVO.getChannelId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 + }); + when(smsChannelService.getSmsChannel(eq(channelDO.getId()))).thenReturn(channelDO); + // mock 获得 API 短信模板成功 + when(smsClientFactory.getSmsClient(eq(reqVO.getChannelId()))).thenReturn(smsClient); + when(smsClient.getSmsTemplate(eq(reqVO.getApiTemplateId()))).thenReturn(randomPojo(SmsCommonResult.class, SmsTemplateRespDTO.class, + o -> o.setCode(GlobalErrorCodeConstants.SUCCESS.getCode()))); + + // 调用 + Long smsTemplateId = smsTemplateService.createSmsTemplate(reqVO); + // 断言 + assertNotNull(smsTemplateId); + // 校验记录的属性是否正确 + SmsTemplateDO smsTemplate = smsTemplateMapper.selectById(smsTemplateId); + assertPojoEquals(reqVO, smsTemplate); + assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams()); + assertEquals(channelDO.getCode(), smsTemplate.getChannelCode()); + // 校验调用 + verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage(); + } + + @Test + @SuppressWarnings("unchecked") + public void testUpdateSmsTemplate_success() { + // mock 数据 + SmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); + smsTemplateMapper.insert(dbSmsTemplate);// @Sql: 先插入出一条存在的数据 + // 准备参数 + SmsTemplateUpdateReqVO reqVO = randomPojo(SmsTemplateUpdateReqVO.class, o -> { + o.setId(dbSmsTemplate.getId()); // 设置更新的 ID + o.setContent("正在进行登录操作{operation},您的验证码是{code}"); + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setType(randomEle(SmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 + }); + // mock 方法 + SmsChannelDO channelDO = randomPojo(SmsChannelDO.class, o -> { + o.setId(reqVO.getChannelId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 + }); + when(smsChannelService.getSmsChannel(eq(channelDO.getId()))).thenReturn(channelDO); + // mock 获得 API 短信模板成功 + when(smsClientFactory.getSmsClient(eq(reqVO.getChannelId()))).thenReturn(smsClient); + when(smsClient.getSmsTemplate(eq(reqVO.getApiTemplateId()))).thenReturn(randomPojo(SmsCommonResult.class, SmsTemplateRespDTO.class, + o -> o.setCode(GlobalErrorCodeConstants.SUCCESS.getCode()))); + + // 调用 + smsTemplateService.updateSmsTemplate(reqVO); + // 校验是否更新正确 + SmsTemplateDO smsTemplate = smsTemplateMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, smsTemplate); + assertEquals(Lists.newArrayList("operation", "code"), smsTemplate.getParams()); + assertEquals(channelDO.getCode(), smsTemplate.getChannelCode()); + // 校验调用 + verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage(); + } + + @Test + public void testUpdateSmsTemplate_notExists() { + // 准备参数 + SmsTemplateUpdateReqVO reqVO = randomPojo(SmsTemplateUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> smsTemplateService.updateSmsTemplate(reqVO), SMS_TEMPLATE_NOT_EXISTS); + } + + @Test + public void testDeleteSmsTemplate_success() { + // mock 数据 + SmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); + smsTemplateMapper.insert(dbSmsTemplate);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbSmsTemplate.getId(); + + // 调用 + smsTemplateService.deleteSmsTemplate(id); + // 校验数据不存在了 + assertNull(smsTemplateMapper.selectById(id)); + // 校验调用 + verify(smsProducer, times(1)).sendSmsTemplateRefreshMessage(); + } + + @Test + public void testDeleteSmsTemplate_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> smsTemplateService.deleteSmsTemplate(id), SMS_TEMPLATE_NOT_EXISTS); + } + + @Test + public void testGetSmsTemplatePage() { + // mock 数据 + SmsTemplateDO dbSmsTemplate = randomPojo(SmsTemplateDO.class, o -> { // 等会查询到 + o.setType(SmsTemplateTypeEnum.PROMOTION.getType()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCode("tudou"); + o.setContent("TW"); + o.setApiTemplateId("yunai"); + o.setChannelId(1L); + o.setCreateTime(buildTime(2021, 11, 11)); + }); + smsTemplateMapper.insert(dbSmsTemplate); + // 测试 type 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setType(SmsTemplateTypeEnum.VERIFICATION_CODE.getType()))); + // 测试 status 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 code 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setCode("yuanma"))); + // 测试 content 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setContent("源码"))); + // 测试 apiTemplateId 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setApiTemplateId("nai"))); + // 测试 channelId 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setChannelId(2L))); + // 测试 createTime 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setCreateTime(buildTime(2021, 12, 12)))); + // 准备参数 + SmsTemplatePageReqVO reqVO = new SmsTemplatePageReqVO(); + reqVO.setType(SmsTemplateTypeEnum.PROMOTION.getType()); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCode("tu"); + reqVO.setContent("芋道"); + reqVO.setApiTemplateId("yu"); + reqVO.setChannelId(1L); + reqVO.setCreateTime((new Date[]{buildTime(2021, 11, 1),buildTime(2021, 12, 1)})); + + // 调用 + PageResult pageResult = smsTemplateService.getSmsTemplatePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbSmsTemplate, pageResult.getList().get(0)); + } + + @Test + public void testGetSmsTemplateList() { + // mock 数据 + SmsTemplateDO dbSmsTemplate = randomPojo(SmsTemplateDO.class, o -> { // 等会查询到 + o.setType(SmsTemplateTypeEnum.PROMOTION.getType()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCode("tudou"); + o.setContent("TW"); + o.setApiTemplateId("yunai"); + o.setChannelId(1L); + o.setCreateTime(buildTime(2021, 11, 11)); + }); + smsTemplateMapper.insert(dbSmsTemplate); + // 测试 type 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setType(SmsTemplateTypeEnum.VERIFICATION_CODE.getType()))); + // 测试 status 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 code 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setCode("yuanma"))); + // 测试 content 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setContent("源码"))); + // 测试 apiTemplateId 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setApiTemplateId("nai"))); + // 测试 channelId 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setChannelId(2L))); + // 测试 createTime 不匹配 + smsTemplateMapper.insert(ObjectUtils.cloneIgnoreId(dbSmsTemplate, o -> o.setCreateTime(buildTime(2021, 12, 12)))); + // 准备参数 + SmsTemplateExportReqVO reqVO = new SmsTemplateExportReqVO(); + reqVO.setType(SmsTemplateTypeEnum.PROMOTION.getType()); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCode("tu"); + reqVO.setContent("芋道"); + reqVO.setApiTemplateId("yu"); + reqVO.setChannelId(1L); + reqVO.setCreateTime((new Date[]{buildTime(2021, 11, 1),buildTime(2021, 12, 1)})); + + // 调用 + List list = smsTemplateService.getSmsTemplateList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbSmsTemplate, list.get(0)); + } + + @Test + public void testCheckSmsChannel_success() { + // 准备参数 + Long channelId = randomLongId(); + // mock 方法 + SmsChannelDO channelDO = randomPojo(SmsChannelDO.class, o -> { + o.setId(channelId); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 + }); + when(smsChannelService.getSmsChannel(eq(channelId))).thenReturn(channelDO); + + // 调用 + SmsChannelDO returnChannelDO = smsTemplateService.checkSmsChannel(channelId); + // 断言 + assertPojoEquals(returnChannelDO, channelDO); + } + + @Test + public void testCheckSmsChannel_notExists() { + // 准备参数 + Long channelId = randomLongId(); + + // 调用,校验异常 + assertServiceException(() -> smsTemplateService.checkSmsChannel(channelId), + SMS_CHANNEL_NOT_EXISTS); + } + + @Test + public void testCheckSmsChannel_disable() { + // 准备参数 + Long channelId = randomLongId(); + // mock 方法 + SmsChannelDO channelDO = randomPojo(SmsChannelDO.class, o -> { + o.setId(channelId); + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); // 保证 status 禁用,触发失败 + }); + when(smsChannelService.getSmsChannel(eq(channelId))).thenReturn(channelDO); + + // 调用,校验异常 + assertServiceException(() -> smsTemplateService.checkSmsChannel(channelId), + SMS_CHANNEL_DISABLE); + } + + @Test + public void testCheckDictDataValueUnique_success() { + // 调用,成功 + smsTemplateService.checkSmsTemplateCodeDuplicate(randomLongId(), randomString()); + } + + @Test + public void testCheckSmsTemplateCodeDuplicate_valueDuplicateForCreate() { + // 准备参数 + String code = randomString(); + // mock 数据 + smsTemplateMapper.insert(randomSmsTemplateDO(o -> o.setCode(code))); + + // 调用,校验异常 + assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(null, code), + SMS_TEMPLATE_CODE_DUPLICATE, code); + } + + @Test + public void testCheckDictDataValueUnique_valueDuplicateForUpdate() { + // 准备参数 + Long id = randomLongId(); + String code = randomString(); + // mock 数据 + smsTemplateMapper.insert(randomSmsTemplateDO(o -> o.setCode(code))); + + // 调用,校验异常 + assertServiceException(() -> smsTemplateService.checkSmsTemplateCodeDuplicate(id, code), + SMS_TEMPLATE_CODE_DUPLICATE, code); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static SmsTemplateDO randomSmsTemplateDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setType(randomEle(SmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 + }; + return randomPojo(SmsTemplateDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/social/SocialUserServiceTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/social/SocialUserServiceTest.java new file mode 100644 index 0000000..0be6276 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/social/SocialUserServiceTest.java @@ -0,0 +1,256 @@ +package com.jojubanking.boot.module.system.service.social; + +import com.jojubanking.boot.framework.common.enums.UserTypeEnum; +import com.jojubanking.boot.framework.test.core.ut.BaseDbAndRedisUnitTest; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO; +import com.jojubanking.boot.module.system.dal.dataobject.social.SocialUserBindDO; +import com.jojubanking.boot.module.system.dal.dataobject.social.SocialUserDO; +import com.jojubanking.boot.module.system.dal.mysql.social.SocialUserBindMapper; +import com.jojubanking.boot.module.system.dal.mysql.social.SocialUserMapper; +import com.jojubanking.boot.module.system.enums.social.SocialTypeEnum; +import com.xkcoding.justauth.AuthRequestFactory; +import me.zhyd.oauth.enums.AuthResponseStatus; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthRequest; +import me.zhyd.oauth.utils.AuthStateUtils; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.List; + +import static cn.hutool.core.util.RandomUtil.randomLong; +import static cn.hutool.core.util.RandomUtil.randomString; +import static com.jojubanking.boot.framework.common.util.json.JsonUtils.toJsonString; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.SOCIAL_USER_AUTH_FAILURE; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.SOCIAL_USER_NOT_FOUND; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +@Import(SocialUserServiceImpl.class) +public class SocialUserServiceTest extends BaseDbAndRedisUnitTest { + + @Resource + private SocialUserServiceImpl socialUserService; + + @Resource + private SocialUserMapper socialUserMapper; + @Resource + private SocialUserBindMapper socialUserBindMapper; + + @MockBean + private AuthRequestFactory authRequestFactory; + + @Test + public void testGetAuthorizeUrl() { + try (MockedStatic authStateUtilsMock = mockStatic(AuthStateUtils.class)) { + // 准备参数 + Integer type = SocialTypeEnum.WECHAT_MP.getType(); + String redirectUri = "sss"; + // mock 获得对应的 AuthRequest 实现 + AuthRequest authRequest = mock(AuthRequest.class); + when(authRequestFactory.get(eq("WECHAT_MP"))).thenReturn(authRequest); + // mock 方法 + authStateUtilsMock.when(AuthStateUtils::createState).thenReturn("aoteman"); + when(authRequest.authorize(eq("aoteman"))).thenReturn("https://www.iocoder.cn?redirect_uri=yyy"); + + // 调用 + String url = socialUserService.getAuthorizeUrl(type, redirectUri); + // 断言 + assertEquals("https://www.iocoder.cn/?redirect_uri=sss", url); + } + } + + @Test + public void testAuthSocialUser_exists() { + // 准备参数 + Integer type = SocialTypeEnum.GITEE.getType(); + String code = "tudou"; + String state = "yuanma"; + // mock 方法 + SocialUserDO socialUser = randomPojo(SocialUserDO.class).setType(type).setCode(code).setState(state); + socialUserMapper.insert(socialUser); + + // 调用 + SocialUserDO result = socialUserService.authSocialUser(type, code, state); + // 断言 + assertPojoEquals(socialUser, result); + } + + @Test + public void testAuthSocialUser_authFailure() { + // 准备参数 + Integer type = SocialTypeEnum.GITEE.getType(); + // mock 方法 + AuthRequest authRequest = mock(AuthRequest.class); + when(authRequestFactory.get(anyString())).thenReturn(authRequest); + AuthResponse authResponse = new AuthResponse<>(0, "模拟失败", null); + when(authRequest.login(any(AuthCallback.class))).thenReturn(authResponse); + + // 调用并断言 + assertServiceException( + () -> socialUserService.authSocialUser(type, randomString(10), randomString(10)), + SOCIAL_USER_AUTH_FAILURE, "模拟失败"); + } + + @Test + public void testAuthSocialUser_insert() { + // 准备参数 + Integer type = SocialTypeEnum.GITEE.getType(); + String code = "tudou"; + String state = "yuanma"; + // mock 方法 + AuthRequest authRequest = mock(AuthRequest.class); + when(authRequestFactory.get(eq(SocialTypeEnum.GITEE.getSource()))).thenReturn(authRequest); + AuthUser authUser = randomPojo(AuthUser.class); + AuthResponse authResponse = new AuthResponse<>(AuthResponseStatus.SUCCESS.getCode(), null, authUser); + when(authRequest.login(any(AuthCallback.class))).thenReturn(authResponse); + + // 调用 + SocialUserDO result = socialUserService.authSocialUser(type, code, state); + // 断言 + assertBindSocialUser(type, result, authResponse.getData()); + assertEquals(code, result.getCode()); + assertEquals(state, result.getState()); + } + + @Test + public void testAuthSocialUser_update() { + // 准备参数 + Integer type = SocialTypeEnum.GITEE.getType(); + String code = "tudou"; + String state = "yuanma"; + // mock 数据 + socialUserMapper.insert(randomPojo(SocialUserDO.class).setType(type).setOpenid("test_openid")); + // mock 方法 + AuthRequest authRequest = mock(AuthRequest.class); + when(authRequestFactory.get(eq(SocialTypeEnum.GITEE.getSource()))).thenReturn(authRequest); + AuthUser authUser = randomPojo(AuthUser.class); + authUser.getToken().setOpenId("test_openid"); + AuthResponse authResponse = new AuthResponse<>(AuthResponseStatus.SUCCESS.getCode(), null, authUser); + when(authRequest.login(any(AuthCallback.class))).thenReturn(authResponse); + + // 调用 + SocialUserDO result = socialUserService.authSocialUser(type, code, state); + // 断言 + assertBindSocialUser(type, result, authResponse.getData()); + assertEquals(code, result.getCode()); + assertEquals(state, result.getState()); + } + + private void assertBindSocialUser(Integer type, SocialUserDO socialUser, AuthUser authUser) { + assertEquals(authUser.getToken().getAccessToken(), socialUser.getToken()); + assertEquals(toJsonString(authUser.getToken()), socialUser.getRawTokenInfo()); + assertEquals(authUser.getNickname(), socialUser.getNickname()); + assertEquals(authUser.getAvatar(), socialUser.getAvatar()); + assertEquals(toJsonString(authUser.getRawUserInfo()), socialUser.getRawUserInfo()); + assertEquals(type, socialUser.getType()); + assertEquals(authUser.getUuid(), socialUser.getOpenid()); + } + + @Test + public void testGetSocialUserList() { + Long userId = 1L; + Integer userType = UserTypeEnum.ADMIN.getValue(); + // mock 获得社交用户 + SocialUserDO socialUser = randomPojo(SocialUserDO.class).setType(SocialTypeEnum.GITEE.getType()); + socialUserMapper.insert(socialUser); // 可被查到 + socialUserMapper.insert(randomPojo(SocialUserDO.class)); // 不可被查到 + // mock 获得绑定 + socialUserBindMapper.insert(randomPojo(SocialUserBindDO.class) // 可被查询到 + .setUserId(userId).setUserType(userType).setSocialType(SocialTypeEnum.GITEE.getType()) + .setSocialUserId(socialUser.getId())); + socialUserBindMapper.insert(randomPojo(SocialUserBindDO.class) // 不可被查询到 + .setUserId(2L).setUserType(userType).setSocialType(SocialTypeEnum.DINGTALK.getType())); + + // 调用 + List result = socialUserService.getSocialUserList(userId, userType); + // 断言 + assertEquals(1, result.size()); + assertPojoEquals(socialUser, result.get(0)); + } + + @Test + public void testBindSocialUser() { + // 准备参数 + SocialUserBindReqDTO reqDTO = new SocialUserBindReqDTO() + .setUserId(1L).setUserType(UserTypeEnum.ADMIN.getValue()) + .setType(SocialTypeEnum.GITEE.getType()).setCode("test_code").setState("test_state"); + // mock 数据:获得社交用户 + SocialUserDO socialUser = randomPojo(SocialUserDO.class).setType(reqDTO.getType()) + .setCode(reqDTO.getCode()).setState(reqDTO.getState()); + socialUserMapper.insert(socialUser); + // mock 数据:用户可能之前已经绑定过该社交类型 + socialUserBindMapper.insert(randomPojo(SocialUserBindDO.class).setUserId(1L).setUserType(UserTypeEnum.ADMIN.getValue()) + .setSocialType(SocialTypeEnum.GITEE.getType()).setSocialUserId(-1L)); + // mock 数据:社交用户可能之前绑定过别的用户 + socialUserBindMapper.insert(randomPojo(SocialUserBindDO.class).setUserType(UserTypeEnum.ADMIN.getValue()) + .setSocialType(SocialTypeEnum.GITEE.getType()).setSocialUserId(socialUser.getId())); + + // 调用 + socialUserService.bindSocialUser(reqDTO); + // 断言 + List socialUserBinds = socialUserBindMapper.selectList(); + assertEquals(1, socialUserBinds.size()); + } + + @Test + public void testUnbindSocialUser_success() { + // 准备参数 + Long userId = 1L; + Integer userType = UserTypeEnum.ADMIN.getValue(); + Integer type = SocialTypeEnum.GITEE.getType(); + String openid = "test_openid"; + // mock 数据:社交用户 + SocialUserDO socialUser = randomPojo(SocialUserDO.class).setType(type).setOpenid(openid); + socialUserMapper.insert(socialUser); + // mock 数据:社交绑定关系 + SocialUserBindDO socialUserBind = randomPojo(SocialUserBindDO.class).setUserType(userType) + .setUserId(userId).setSocialType(type); + socialUserBindMapper.insert(socialUserBind); + + // 调用 + socialUserService.unbindSocialUser(userId, userType, type, openid); + // 断言 + assertEquals(0, socialUserBindMapper.selectCount(null).intValue()); + } + + @Test + public void testUnbindSocialUser_notFound() { + // 调用,并断言 + assertServiceException( + () -> socialUserService.unbindSocialUser(randomLong(), UserTypeEnum.ADMIN.getValue(), + SocialTypeEnum.GITEE.getType(), "test_openid"), + SOCIAL_USER_NOT_FOUND); + } + + @Test + public void testGetBindUserId() { + // 准备参数 + Integer userType = UserTypeEnum.ADMIN.getValue(); + Integer type = SocialTypeEnum.GITEE.getType(); + String code = "tudou"; + String state = "yuanma"; + // mock 社交用户 + SocialUserDO socialUser = randomPojo(SocialUserDO.class).setType(type).setCode(code).setState(state); + socialUserMapper.insert(socialUser); + // mock 社交用户的绑定 + Long userId = randomLong(); + SocialUserBindDO socialUserBind = randomPojo(SocialUserBindDO.class).setUserType(userType).setUserId(userId) + .setSocialType(type).setSocialUserId(socialUser.getId()); + socialUserBindMapper.insert(socialUserBind); + + // 调用 + Long result = socialUserService.getBindUserId(userType, type, code, state); + // 断言 + assertEquals(userId, result); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/tenant/TenantPackageServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/tenant/TenantPackageServiceImplTest.java new file mode 100644 index 0000000..9693e8d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/tenant/TenantPackageServiceImplTest.java @@ -0,0 +1,204 @@ +package com.jojubanking.boot.module.system.service.tenant; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackagePageReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantDO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantPackageDO; +import com.jojubanking.boot.module.system.dal.mysql.tenant.TenantPackageMapper; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import java.util.Date; + +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomLongId; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.randomPojo; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static java.util.Arrays.asList; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** +* {@link TenantPackageServiceImpl} 的单元测试类 +* +* @author TW +*/ +@Import(TenantPackageServiceImpl.class) +public class TenantPackageServiceImplTest extends BaseDbUnitTest { + + @Resource + private TenantPackageServiceImpl tenantPackageService; + + @Resource + private TenantPackageMapper tenantPackageMapper; + + @MockBean + private TenantService tenantService; + + @Test + public void testCreateTenantPackage_success() { + // 准备参数 + TenantPackageCreateReqVO reqVO = randomPojo(TenantPackageCreateReqVO.class); + + // 调用 + Long tenantPackageId = tenantPackageService.createTenantPackage(reqVO); + // 断言 + assertNotNull(tenantPackageId); + // 校验记录的属性是否正确 + TenantPackageDO tenantPackage = tenantPackageMapper.selectById(tenantPackageId); + assertPojoEquals(reqVO, tenantPackage); + } + + @Test + public void testUpdateTenantPackage_success() { + // mock 数据 + TenantPackageDO dbTenantPackage = randomPojo(TenantPackageDO.class); + tenantPackageMapper.insert(dbTenantPackage);// @Sql: 先插入出一条存在的数据 + // 准备参数 + TenantPackageUpdateReqVO reqVO = randomPojo(TenantPackageUpdateReqVO.class, o -> { + o.setId(dbTenantPackage.getId()); // 设置更新的 ID + }); + // mock 方法 + Long tenantId01 = randomLongId(); + Long tenantId02 = randomLongId(); + when(tenantService.getTenantListByPackageId(eq(reqVO.getId()))).thenReturn( + asList(randomPojo(TenantDO.class, o -> o.setId(tenantId01)), + randomPojo(TenantDO.class, o -> o.setId(tenantId02)))); + + // 调用 + tenantPackageService.updateTenantPackage(reqVO); + // 校验是否更新正确 + TenantPackageDO tenantPackage = tenantPackageMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, tenantPackage); + // 校验调用租户的菜单 + verify(tenantService).updateTenantRoleMenu(eq(tenantId01), eq(reqVO.getMenuIds())); + verify(tenantService).updateTenantRoleMenu(eq(tenantId02), eq(reqVO.getMenuIds())); + } + + @Test + public void testUpdateTenantPackage_notExists() { + // 准备参数 + TenantPackageUpdateReqVO reqVO = randomPojo(TenantPackageUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> tenantPackageService.updateTenantPackage(reqVO), TENANT_PACKAGE_NOT_EXISTS); + } + + @Test + public void testDeleteTenantPackage_success() { + // mock 数据 + TenantPackageDO dbTenantPackage = randomPojo(TenantPackageDO.class); + tenantPackageMapper.insert(dbTenantPackage);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbTenantPackage.getId(); + // mock 租户未使用该套餐 + when(tenantService.getTenantCountByPackageId(eq(id))).thenReturn(0L); + + // 调用 + tenantPackageService.deleteTenantPackage(id); + // 校验数据不存在了 + assertNull(tenantPackageMapper.selectById(id)); + } + + @Test + public void testDeleteTenantPackage_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> tenantPackageService.deleteTenantPackage(id), TENANT_PACKAGE_NOT_EXISTS); + } + + @Test + public void testDeleteTenantPackage_used() { + // mock 数据 + TenantPackageDO dbTenantPackage = randomPojo(TenantPackageDO.class); + tenantPackageMapper.insert(dbTenantPackage);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbTenantPackage.getId(); + // mock 租户在使用该套餐 + when(tenantService.getTenantCountByPackageId(eq(id))).thenReturn(1L); + + // 调用, 并断言异常 + assertServiceException(() -> tenantPackageService.deleteTenantPackage(id), TENANT_PACKAGE_USED); + } + + @Test + public void testGetTenantPackagePage() { + // mock 数据 + TenantPackageDO dbTenantPackage = randomPojo(TenantPackageDO.class, o -> { // 等会查询到 + o.setName("TW"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setRemark("源码解析"); + o.setCreateTime(buildTime(2022, 10, 10)); + }); + tenantPackageMapper.insert(dbTenantPackage); + // 测试 name 不匹配 + tenantPackageMapper.insert(cloneIgnoreId(dbTenantPackage, o -> o.setName("源码"))); + // 测试 status 不匹配 + tenantPackageMapper.insert(cloneIgnoreId(dbTenantPackage, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 remark 不匹配 + tenantPackageMapper.insert(cloneIgnoreId(dbTenantPackage, o -> o.setRemark("解析"))); + // 测试 createTime 不匹配 + tenantPackageMapper.insert(cloneIgnoreId(dbTenantPackage, o -> o.setCreateTime(buildTime(2022, 11, 11)))); + // 准备参数 + TenantPackagePageReqVO reqVO = new TenantPackagePageReqVO(); + reqVO.setName("芋道"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setRemark("源码"); + reqVO.setCreateTime((new Date[]{buildTime(2022, 10, 9),buildTime(2022, 10, 11)})); + + // 调用 + PageResult pageResult = tenantPackageService.getTenantPackagePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbTenantPackage, pageResult.getList().get(0)); + } + + @Test + public void testValidTenantPackage_success() { + // mock 数据 + TenantPackageDO dbTenantPackage = randomPojo(TenantPackageDO.class, + o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus())); + tenantPackageMapper.insert(dbTenantPackage);// @Sql: 先插入出一条存在的数据 + + // 调用 + TenantPackageDO result = tenantPackageService.validTenantPackage(dbTenantPackage.getId()); + // 断言 + assertPojoEquals(dbTenantPackage, result); + } + + @Test + public void testValidTenantPackage_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> tenantPackageService.validTenantPackage(id), TENANT_PACKAGE_NOT_EXISTS); + } + + @Test + public void testValidTenantPackage_disable() { + // mock 数据 + TenantPackageDO dbTenantPackage = randomPojo(TenantPackageDO.class, + o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); + tenantPackageMapper.insert(dbTenantPackage);// @Sql: 先插入出一条存在的数据 + + // 调用, 并断言异常 + assertServiceException(() -> tenantPackageService.validTenantPackage(dbTenantPackage.getId()), + TENANT_PACKAGE_DISABLE, dbTenantPackage.getName()); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/tenant/TenantServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/tenant/TenantServiceImplTest.java new file mode 100644 index 0000000..3b34a05 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/tenant/TenantServiceImplTest.java @@ -0,0 +1,485 @@ +package com.jojubanking.boot.module.system.service.tenant; + +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.tenant.config.TenantProperties; +import com.jojubanking.boot.framework.tenant.core.context.TenantContextHolder; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantExportReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantPageReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantDO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantPackageDO; +import com.jojubanking.boot.module.system.dal.mysql.tenant.TenantMapper; +import com.jojubanking.boot.module.system.enums.permission.RoleCodeEnum; +import com.jojubanking.boot.module.system.enums.permission.RoleTypeEnum; +import com.jojubanking.boot.module.system.service.permission.MenuService; +import com.jojubanking.boot.module.system.service.permission.PermissionService; +import com.jojubanking.boot.module.system.service.permission.RoleService; +import com.jojubanking.boot.module.system.service.tenant.handler.TenantInfoHandler; +import com.jojubanking.boot.module.system.service.tenant.handler.TenantMenuHandler; +import com.jojubanking.boot.module.system.service.user.AdminUserService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.time.Duration; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import static com.jojubanking.boot.framework.common.util.collection.SetUtils.asSet; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.addTime; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static java.util.Arrays.asList; +import static java.util.Collections.singleton; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +/** + * {@link TenantServiceImpl} 的单元测试类 + * + * @author TW + */ +@Import(TenantServiceImpl.class) +public class TenantServiceImplTest extends BaseDbUnitTest { + + @Resource + private TenantServiceImpl tenantService; + + @Resource + private TenantMapper tenantMapper; + + @MockBean + private TenantProperties tenantProperties; + @MockBean + private TenantPackageService tenantPackageService; + @MockBean + private AdminUserService userService; + @MockBean + private RoleService roleService; + @MockBean + private MenuService menuService; + @MockBean + private PermissionService permissionService; + + @BeforeEach + public void setUp() { + // 清理租户上下文 + TenantContextHolder.clear(); + } + + @Test + public void testGetTenantIds() { + // mock 数据 + TenantDO tenant = randomPojo(TenantDO.class, o -> o.setId(1L)); + tenantMapper.insert(tenant); + + // 调用,并断言业务异常 + List result = tenantService.getTenantIds(); + assertEquals(Collections.singletonList(1L), result); + } + + @Test + public void testValidTenant_notExists() { + assertServiceException(() -> tenantService.validTenant(randomLongId()), TENANT_NOT_EXISTS); + } + + @Test + public void testValidTenant_disable() { + // mock 数据 + TenantDO tenant = randomPojo(TenantDO.class, o -> o.setId(1L).setStatus(CommonStatusEnum.DISABLE.getStatus())); + tenantMapper.insert(tenant); + + // 调用,并断言业务异常 + assertServiceException(() -> tenantService.validTenant(1L), TENANT_DISABLE, tenant.getName()); + } + + @Test + public void testValidTenant_expired() { + // mock 数据 + TenantDO tenant = randomPojo(TenantDO.class, o -> o.setId(1L).setStatus(CommonStatusEnum.ENABLE.getStatus()) + .setExpireTime(buildTime(2020, 2, 2))); + tenantMapper.insert(tenant); + + // 调用,并断言业务异常 + assertServiceException(() -> tenantService.validTenant(1L), TENANT_EXPIRE, tenant.getName()); + } + + @Test + public void testValidTenant_success() { + // mock 数据 + TenantDO tenant = randomPojo(TenantDO.class, o -> o.setId(1L).setStatus(CommonStatusEnum.ENABLE.getStatus()) + .setExpireTime(addTime(Duration.ofDays(1)))); + tenantMapper.insert(tenant); + + // 调用,并断言业务异常 + tenantService.validTenant(1L); + } + + @Test + public void testCreateTenant() { + // mock 套餐 100L + TenantPackageDO tenantPackage = randomPojo(TenantPackageDO.class, o -> o.setId(100L)); + when(tenantPackageService.validTenantPackage(eq(100L))).thenReturn(tenantPackage); + // mock 角色 200L + when(roleService.createRole(argThat(role -> { + assertEquals(RoleCodeEnum.TENANT_ADMIN.getName(), role.getName()); + assertEquals(RoleCodeEnum.TENANT_ADMIN.getCode(), role.getCode()); + assertEquals(0, role.getSort()); + assertEquals("系统自动生成", role.getRemark()); + return true; + }), eq(RoleTypeEnum.SYSTEM.getType()))).thenReturn(200L); + // mock 用户 300L + when(userService.createUser(argThat(user -> { + assertEquals("yunai", user.getUsername()); + assertEquals("yuanma", user.getPassword()); + assertEquals("芋道", user.getNickname()); + assertEquals("15601691300", user.getMobile()); + return true; + }))).thenReturn(300L); + + // 准备参数 + TenantCreateReqVO reqVO = randomPojo(TenantCreateReqVO.class, o -> { + o.setContactName("芋道"); + o.setContactMobile("15601691300"); + o.setPackageId(100L); + o.setStatus(randomCommonStatus()); + o.setDomain("https://www.iocoder.cn"); + o.setUsername("yunai"); + o.setPassword("yuanma"); + }); + + // 调用 + Long tenantId = tenantService.createTenant(reqVO); + // 断言 + assertNotNull(tenantId); + // 校验记录的属性是否正确 + TenantDO tenant = tenantMapper.selectById(tenantId); + assertPojoEquals(reqVO, tenant); + assertEquals(300L, tenant.getContactUserId()); + // verify 分配权限 + verify(permissionService).assignRoleMenu(eq(200L), same(tenantPackage.getMenuIds())); + // verify 分配角色 + verify(permissionService).assignUserRole(eq(300L), eq(singleton(200L))); + } + + @Test + public void testUpdateTenant_success() { + // mock 数据 + TenantDO dbTenant = randomPojo(TenantDO.class, o -> o.setStatus(randomCommonStatus())); + tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 + // 准备参数 + TenantUpdateReqVO reqVO = randomPojo(TenantUpdateReqVO.class, o -> { + o.setId(dbTenant.getId()); // 设置更新的 ID + o.setStatus(randomCommonStatus()); + o.setDomain(randomString()); + }); + + // mock 套餐 + TenantPackageDO tenantPackage = randomPojo(TenantPackageDO.class, + o -> o.setMenuIds(asSet(200L, 201L))); + when(tenantPackageService.validTenantPackage(eq(reqVO.getPackageId()))).thenReturn(tenantPackage); + // mock 所有角色 + RoleDO role100 = randomPojo(RoleDO.class, o -> o.setId(100L).setCode(RoleCodeEnum.TENANT_ADMIN.getCode())); + role100.setTenantId(dbTenant.getId()); + RoleDO role101 = randomPojo(RoleDO.class, o -> o.setId(101L)); + role101.setTenantId(dbTenant.getId()); + when(roleService.getRoles(isNull())).thenReturn(asList(role100, role101)); + // mock 每个角色的权限 + when(permissionService.getRoleMenuIds(eq(101L))).thenReturn(asSet(201L, 202L)); + + // 调用 + tenantService.updateTenant(reqVO); + // 校验是否更新正确 + TenantDO tenant = tenantMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, tenant); + // verify 设置角色权限 + verify(permissionService).assignRoleMenu(eq(100L), eq(asSet(200L, 201L))); + verify(permissionService).assignRoleMenu(eq(101L), eq(asSet(201L))); + } + + @Test + public void testUpdateTenant_notExists() { + // 准备参数 + TenantUpdateReqVO reqVO = randomPojo(TenantUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> tenantService.updateTenant(reqVO), TENANT_NOT_EXISTS); + } + + @Test + public void testUpdateTenant_system() { + // mock 数据 + TenantDO dbTenant = randomPojo(TenantDO.class, o -> o.setPackageId(TenantDO.PACKAGE_ID_SYSTEM)); + tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 + // 准备参数 + TenantUpdateReqVO reqVO = randomPojo(TenantUpdateReqVO.class, o -> { + o.setId(dbTenant.getId()); // 设置更新的 ID + }); + + // 调用,校验业务异常 + assertServiceException(() -> tenantService.updateTenant(reqVO), TENANT_CAN_NOT_UPDATE_SYSTEM); + } + + @Test + public void testDeleteTenant_success() { + // mock 数据 + TenantDO dbTenant = randomPojo(TenantDO.class, + o -> o.setStatus(randomCommonStatus())); + tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbTenant.getId(); + + // 调用 + tenantService.deleteTenant(id); + // 校验数据不存在了 + assertNull(tenantMapper.selectById(id)); + } + + @Test + public void testDeleteTenant_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> tenantService.deleteTenant(id), TENANT_NOT_EXISTS); + } + + @Test + public void testDeleteTenant_system() { + // mock 数据 + TenantDO dbTenant = randomPojo(TenantDO.class, o -> o.setPackageId(TenantDO.PACKAGE_ID_SYSTEM)); + tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbTenant.getId(); + + // 调用, 并断言异常 + assertServiceException(() -> tenantService.deleteTenant(id), TENANT_CAN_NOT_UPDATE_SYSTEM); + } + + @Test + public void testGetTenant() { + // mock 数据 + TenantDO dbTenant = randomPojo(TenantDO.class); + tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbTenant.getId(); + + // 调用 + TenantDO result = tenantService.getTenant(id); + // 校验存在 + assertPojoEquals(result, dbTenant); + } + + @Test + public void testGetTenantPage() { + // mock 数据 + TenantDO dbTenant = randomPojo(TenantDO.class, o -> { // 等会查询到 + o.setName("TW"); + o.setContactName("芋艿"); + o.setContactMobile("15601691300"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(buildTime(2020, 12, 12)); + }); + tenantMapper.insert(dbTenant); + // 测试 name 不匹配 + tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setName(randomString()))); + // 测试 contactName 不匹配 + tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setContactName(randomString()))); + // 测试 contactMobile 不匹配 + tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setContactMobile(randomString()))); + // 测试 status 不匹配 + tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setCreateTime(buildTime(2021, 12, 12)))); + // 准备参数 + TenantPageReqVO reqVO = new TenantPageReqVO(); + reqVO.setName("芋道"); + reqVO.setContactName("艿"); + reqVO.setContactMobile("1560"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCreateTime(new Date[]{buildTime(2020, 12, 1),buildTime(2020, 12, 24)}); + + // 调用 + PageResult pageResult = tenantService.getTenantPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbTenant, pageResult.getList().get(0)); + } + + @Test + public void testGetTenantList() { + // mock 数据 + TenantDO dbTenant = randomPojo(TenantDO.class, o -> { // 等会查询到 + o.setName("TW"); + o.setContactName("芋艿"); + o.setContactMobile("15601691300"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(buildTime(2020, 12, 12)); + }); + tenantMapper.insert(dbTenant); + // 测试 name 不匹配 + tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setName(randomString()))); + // 测试 contactName 不匹配 + tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setContactName(randomString()))); + // 测试 contactMobile 不匹配 + tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setContactMobile(randomString()))); + // 测试 status 不匹配 + tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + tenantMapper.insert(cloneIgnoreId(dbTenant, o -> o.setCreateTime(buildTime(2021, 12, 12)))); + // 准备参数 + TenantExportReqVO reqVO = new TenantExportReqVO(); + reqVO.setName("芋道"); + reqVO.setContactName("艿"); + reqVO.setContactMobile("1560"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCreateTime(new Date[]{buildTime(2020, 12, 1),buildTime(2020, 12, 24)}); + + // 调用 + List list = tenantService.getTenantList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbTenant, list.get(0)); + } + + + @Test + public void testGetTenantByName() { + // mock 数据 + TenantDO dbTenant = randomPojo(TenantDO.class, o -> o.setName("芋道")); + tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 + + // 调用 + TenantDO result = tenantService.getTenantByName("芋道"); + // 校验存在 + assertPojoEquals(result, dbTenant); + } + + @Test + public void testGetTenantListByPackageId() { + // mock 数据 + TenantDO dbTenant1 = randomPojo(TenantDO.class, o -> o.setPackageId(1L)); + tenantMapper.insert(dbTenant1);// @Sql: 先插入出一条存在的数据 + TenantDO dbTenant2 = randomPojo(TenantDO.class, o -> o.setPackageId(2L)); + tenantMapper.insert(dbTenant2);// @Sql: 先插入出一条存在的数据 + + // 调用 + List result = tenantService.getTenantListByPackageId(1L); + assertEquals(1, result.size()); + assertPojoEquals(dbTenant1, result.get(0)); + } + + @Test + public void testGetTenantCountByPackageId() { + // mock 数据 + TenantDO dbTenant1 = randomPojo(TenantDO.class, o -> o.setPackageId(1L)); + tenantMapper.insert(dbTenant1);// @Sql: 先插入出一条存在的数据 + TenantDO dbTenant2 = randomPojo(TenantDO.class, o -> o.setPackageId(2L)); + tenantMapper.insert(dbTenant2);// @Sql: 先插入出一条存在的数据 + + // 调用 + Long count = tenantService.getTenantCountByPackageId(1L); + assertEquals(1, count); + } + + @Test + public void testHandleTenantInfo_disable() { + // 准备参数 + TenantInfoHandler handler = mock(TenantInfoHandler.class); + // mock 禁用 + when(tenantProperties.getEnable()).thenReturn(false); + + // 调用 + tenantService.handleTenantInfo(handler); + // 断言 + verify(handler, never()).handle(any()); + } + + @Test + public void testHandleTenantInfo_success() { + // 准备参数 + TenantInfoHandler handler = mock(TenantInfoHandler.class); + // mock 未禁用 + when(tenantProperties.getEnable()).thenReturn(true); + // mock 租户 + TenantDO dbTenant = randomPojo(TenantDO.class); + tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 + TenantContextHolder.setTenantId(dbTenant.getId()); + + // 调用 + tenantService.handleTenantInfo(handler); + // 断言 + verify(handler).handle(argThat(argument -> { + assertPojoEquals(dbTenant, argument); + return true; + })); + } + + @Test + public void testHandleTenantMenu_disable() { + // 准备参数 + TenantMenuHandler handler = mock(TenantMenuHandler.class); + // mock 禁用 + when(tenantProperties.getEnable()).thenReturn(false); + + // 调用 + tenantService.handleTenantMenu(handler); + // 断言 + verify(handler, never()).handle(any()); + } + + @Test // 系统租户的情况 + public void testHandleTenantMenu_system() { + // 准备参数 + TenantMenuHandler handler = mock(TenantMenuHandler.class); + // mock 未禁用 + when(tenantProperties.getEnable()).thenReturn(true); + // mock 租户 + TenantDO dbTenant = randomPojo(TenantDO.class, o -> o.setPackageId(TenantDO.PACKAGE_ID_SYSTEM)); + tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 + TenantContextHolder.setTenantId(dbTenant.getId()); + // mock 菜单 + when(menuService.getMenus()).thenReturn(Arrays.asList(randomPojo(MenuDO.class, o -> o.setId(100L)), + randomPojo(MenuDO.class, o -> o.setId(101L)))); + + // 调用 + tenantService.handleTenantMenu(handler); + // 断言 + verify(handler).handle(asSet(100L, 101L)); + } + + @Test // 普通租户的情况 + public void testHandleTenantMenu_normal() { + // 准备参数 + TenantMenuHandler handler = mock(TenantMenuHandler.class); + // mock 未禁用 + when(tenantProperties.getEnable()).thenReturn(true); + // mock 租户 + TenantDO dbTenant = randomPojo(TenantDO.class, o -> o.setPackageId(200L)); + tenantMapper.insert(dbTenant);// @Sql: 先插入出一条存在的数据 + TenantContextHolder.setTenantId(dbTenant.getId()); + // mock 菜单 + when(tenantPackageService.getTenantPackage(eq(200L))).thenReturn(randomPojo(TenantPackageDO.class, + o -> o.setMenuIds(asSet(100L, 101L)))); + + // 调用 + tenantService.handleTenantMenu(handler); + // 断言 + verify(handler).handle(asSet(100L, 101L)); + } +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/user/AdminUserServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/user/AdminUserServiceImplTest.java new file mode 100644 index 0000000..62dd95b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/user/AdminUserServiceImplTest.java @@ -0,0 +1,606 @@ +package com.jojubanking.boot.module.system.service.user; + +import cn.hutool.core.util.RandomUtil; +import com.jojubanking.boot.framework.common.enums.CommonStatusEnum; +import com.jojubanking.boot.framework.common.exception.ServiceException; +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.common.util.collection.ArrayUtils; +import com.jojubanking.boot.framework.common.util.collection.CollectionUtils; +import com.jojubanking.boot.framework.common.util.object.ObjectUtils; +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; +import com.jojubanking.boot.module.infra.api.file.FileApi; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.*; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.UserPostDO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import com.jojubanking.boot.module.system.dal.mysql.dept.UserPostMapper; +import com.jojubanking.boot.module.system.dal.mysql.user.AdminUserMapper; +import com.jojubanking.boot.module.system.enums.common.SexEnum; +import com.jojubanking.boot.module.system.service.dept.DeptService; +import com.jojubanking.boot.module.system.service.dept.PostService; +import com.jojubanking.boot.module.system.service.permission.PermissionService; +import com.jojubanking.boot.module.system.service.tenant.TenantService; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.*; +import org.junit.jupiter.api.Test; +import org.mockito.stubbing.Answer; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; +import org.springframework.security.crypto.password.PasswordEncoder; + +import javax.annotation.Resource; +import java.io.ByteArrayInputStream; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.function.Consumer; + +import static cn.hutool.core.util.RandomUtil.randomBytes; +import static cn.hutool.core.util.RandomUtil.randomEle; +import static com.jojubanking.boot.framework.common.util.collection.SetUtils.asSet; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.buildTime; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.assertServiceException; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static java.util.Collections.singleton; +import static org.assertj.core.util.Lists.newArrayList; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +@Import(AdminUserServiceImpl.class) +public class AdminUserServiceImplTest extends BaseDbUnitTest { + + @Resource + private AdminUserServiceImpl userService; + + @Resource + private AdminUserMapper userMapper; + @Resource + private UserPostMapper userPostMapper; + + @MockBean + private DeptService deptService; + @MockBean + private PostService postService; + @MockBean + private PermissionService permissionService; + @MockBean + private PasswordEncoder passwordEncoder; + @MockBean + private TenantService tenantService; + @MockBean + private FileApi fileApi; + + @Test + public void testCreatUser_success() { + // 准备参数 + UserCreateReqVO reqVO = randomPojo(UserCreateReqVO.class, o -> { + o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex()); + o.setMobile(randomString()); + o.setPostIds(asSet(1L, 2L)); + }); + // mock 账户额度充足 + TenantDO tenant = randomPojo(TenantDO.class, o -> o.setAccountCount(1)); + doNothing().when(tenantService).handleTenantInfo(argThat(handler -> { + handler.handle(tenant); + return true; + })); + // mock deptService 的方法 + DeptDO dept = randomPojo(DeptDO.class, o -> { + o.setId(reqVO.getDeptId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + // mock postService 的方法 + List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> + randomPojo(PostDO.class, o -> { + o.setId(postId); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + })); + when(postService.getPosts(eq(reqVO.getPostIds()), isNull())).thenReturn(posts); + // mock passwordEncoder 的方法 + when(passwordEncoder.encode(eq(reqVO.getPassword()))).thenReturn("jojuyuanma"); + + // 调用 + Long userId = userService.createUser(reqVO); + // 断言 + AdminUserDO user = userMapper.selectById(userId); + assertPojoEquals(reqVO, user, "password"); + assertEquals("jojuyuanma", user.getPassword()); + assertEquals(CommonStatusEnum.ENABLE.getStatus(), user.getStatus()); + // 断言关联岗位 + List userPosts = userPostMapper.selectListByUserId(user.getId()); + assertEquals(1L, userPosts.get(0).getPostId()); + assertEquals(2L, userPosts.get(1).getPostId()); + } + + @Test + public void testCreatUser_max() { + // 准备参数 + UserCreateReqVO reqVO = randomPojo(UserCreateReqVO.class); + // mock 账户额度不足 + TenantDO tenant = randomPojo(TenantDO.class, o -> o.setAccountCount(-1)); + doNothing().when(tenantService).handleTenantInfo(argThat(handler -> { + handler.handle(tenant); + return true; + })); + + // 调用,并断言异常 + assertServiceException(() -> userService.createUser(reqVO), USER_COUNT_MAX, -1); + } + + @Test + public void testUpdateUser_success() { + // mock 数据 + AdminUserDO dbUser = randomAdminUserDO(o -> o.setPostIds(asSet(1L, 2L))); + userMapper.insert(dbUser); + userPostMapper.insert(new UserPostDO().setUserId(dbUser.getId()).setPostId(1L)); + userPostMapper.insert(new UserPostDO().setUserId(dbUser.getId()).setPostId(2L)); + // 准备参数 + UserUpdateReqVO reqVO = randomPojo(UserUpdateReqVO.class, o -> { + o.setId(dbUser.getId()); + o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex()); + o.setMobile(randomString()); + o.setPostIds(asSet(2L, 3L)); + }); + // mock deptService 的方法 + DeptDO dept = randomPojo(DeptDO.class, o -> { + o.setId(reqVO.getDeptId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + // mock postService 的方法 + List posts = CollectionUtils.convertList(reqVO.getPostIds(), postId -> + randomPojo(PostDO.class, o -> { + o.setId(postId); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + })); + when(postService.getPosts(eq(reqVO.getPostIds()), isNull())).thenReturn(posts); + + // 调用 + userService.updateUser(reqVO); + // 断言 + AdminUserDO user = userMapper.selectById(reqVO.getId()); + assertPojoEquals(reqVO, user); + // 断言关联岗位 + List userPosts = userPostMapper.selectListByUserId(user.getId()); + assertEquals(2L, userPosts.get(0).getPostId()); + assertEquals(3L, userPosts.get(1).getPostId()); + } + + @Test + public void testUpdateUserProfile_success() { + // mock 数据 + AdminUserDO dbUser = randomAdminUserDO(); + userMapper.insert(dbUser); + // 准备参数 + Long userId = dbUser.getId(); + UserProfileUpdateReqVO reqVO = randomPojo(UserProfileUpdateReqVO.class, o -> { + o.setMobile(randomString()); + o.setSex(RandomUtil.randomEle(SexEnum.values()).getSex()); + }); + + // 调用 + userService.updateUserProfile(userId, reqVO); + // 断言 + AdminUserDO user = userMapper.selectById(userId); + assertPojoEquals(reqVO, user); + } + + @Test + public void testUpdateUserPassword_success() { + // mock 数据 + AdminUserDO dbUser = randomAdminUserDO(o -> o.setPassword("encode:tudou")); + userMapper.insert(dbUser); + // 准备参数 + Long userId = dbUser.getId(); + UserProfileUpdatePasswordReqVO reqVO = randomPojo(UserProfileUpdatePasswordReqVO.class, o -> { + o.setOldPassword("tudou"); + o.setNewPassword("yuanma"); + }); + // mock 方法 + when(passwordEncoder.encode(anyString())).then( + (Answer) invocationOnMock -> "encode:" + invocationOnMock.getArgument(0)); + when(passwordEncoder.matches(eq(reqVO.getOldPassword()), eq(dbUser.getPassword()))).thenReturn(true); + + // 调用 + userService.updateUserPassword(userId, reqVO); + // 断言 + AdminUserDO user = userMapper.selectById(userId); + assertEquals("encode:yuanma", user.getPassword()); + } + + @Test + public void testUpdateUserAvatar_success() throws Exception { + // mock 数据 + AdminUserDO dbUser = randomAdminUserDO(); + userMapper.insert(dbUser); + // 准备参数 + Long userId = dbUser.getId(); + byte[] avatarFileBytes = randomBytes(10); + ByteArrayInputStream avatarFile = new ByteArrayInputStream(avatarFileBytes); + // mock 方法 + String avatar = randomString(); + when(fileApi.createFile(eq( avatarFileBytes))).thenReturn(avatar); + + // 调用 + userService.updateUserAvatar(userId, avatarFile); + // 断言 + AdminUserDO user = userMapper.selectById(userId); + assertEquals(avatar, user.getAvatar()); + } + + @Test + public void testUpdateUserPassword02_success() { + // mock 数据 + AdminUserDO dbUser = randomAdminUserDO(); + userMapper.insert(dbUser); + // 准备参数 + Long userId = dbUser.getId(); + String password = "joju"; + // mock 方法 + when(passwordEncoder.encode(anyString())).then( + (Answer) invocationOnMock -> "encode:" + invocationOnMock.getArgument(0)); + + // 调用 + userService.updateUserPassword(userId, password); + // 断言 + AdminUserDO user = userMapper.selectById(userId); + assertEquals("encode:" + password, user.getPassword()); + } + + @Test + public void testUpdateUserStatus() { + // mock 数据 + AdminUserDO dbUser = randomAdminUserDO(); + userMapper.insert(dbUser); + // 准备参数 + Long userId = dbUser.getId(); + Integer status = randomCommonStatus(); + + // 调用 + userService.updateUserStatus(userId, status); + // 断言 + AdminUserDO user = userMapper.selectById(userId); + assertEquals(status, user.getStatus()); + } + + @Test + public void testDeleteUser_success(){ + // mock 数据 + AdminUserDO dbUser = randomAdminUserDO(); + userMapper.insert(dbUser); + // 准备参数 + Long userId = dbUser.getId(); + + // 调用数据 + userService.deleteUser(userId); + // 校验结果 + assertNull(userMapper.selectById(userId)); + // 校验调用次数 + verify(permissionService, times(1)).processUserDeleted(eq(userId)); + } + + @Test + public void testGetUserPage() { + // mock 数据 + AdminUserDO dbUser = initGetUserPageData(); + // 准备参数 + UserPageReqVO reqVO = new UserPageReqVO(); + reqVO.setUsername("tu"); + reqVO.setMobile("1560"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2020, 12, 1),buildTime(2020, 12, 24)})); + reqVO.setDeptId(1L); // 其中,1L 是 2L 的父部门 + // mock 方法 + List deptList = newArrayList(randomPojo(DeptDO.class, o -> o.setId(2L))); + when(deptService.getDeptsByParentIdFromCache(eq(reqVO.getDeptId()), eq(true))).thenReturn(deptList); + + // 调用 + PageResult pageResult = userService.getUserPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUser, pageResult.getList().get(0)); + } + + @Test + public void testGetUsers() { + // mock 数据 + AdminUserDO dbUser = initGetUserPageData(); + // 准备参数 + UserExportReqVO reqVO = new UserExportReqVO(); + reqVO.setUsername("tu"); + reqVO.setMobile("1560"); + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + reqVO.setCreateTime((new Date[]{buildTime(2020, 12, 1),buildTime(2020, 12, 24)})); + reqVO.setDeptId(1L); // 其中,1L 是 2L 的父部门 + // mock 方法 + List deptList = newArrayList(randomPojo(DeptDO.class, o -> o.setId(2L))); + when(deptService.getDeptsByParentIdFromCache(eq(reqVO.getDeptId()), eq(true))).thenReturn(deptList); + + // 调用 + List list = userService.getUsers(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbUser, list.get(0)); + } + + /** + * 初始化 getUserPage 方法的测试数据 + */ + private AdminUserDO initGetUserPageData() { + // mock 数据 + AdminUserDO dbUser = randomAdminUserDO(o -> { // 等会查询到 + o.setUsername("tudou"); + o.setMobile("15601691300"); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + o.setCreateTime(buildTime(2020, 12, 12)); + o.setDeptId(2L); + }); + userMapper.insert(dbUser); + // 测试 username 不匹配 + userMapper.insert(ObjectUtils.cloneIgnoreId(dbUser, o -> o.setUsername("dou"))); + // 测试 mobile 不匹配 + userMapper.insert(ObjectUtils.cloneIgnoreId(dbUser, o -> o.setMobile("18818260888"))); + // 测试 status 不匹配 + userMapper.insert(ObjectUtils.cloneIgnoreId(dbUser, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); + // 测试 createTime 不匹配 + userMapper.insert(ObjectUtils.cloneIgnoreId(dbUser, o -> o.setCreateTime(buildTime(2020, 11, 11)))); + // 测试 dept 不匹配 + userMapper.insert(ObjectUtils.cloneIgnoreId(dbUser, o -> o.setDeptId(0L))); + return dbUser; + } + + /** + * 情况一,校验不通过,导致插入失败 + */ + @Test + public void testImportUsers_01() { + // 准备参数 + UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { + }); + // mock 方法,模拟失败 + doThrow(new ServiceException(DEPT_NOT_FOUND)).when(deptService).validDepts(any()); + + // 调用 + UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); + // 断言 + assertEquals(0, respVO.getCreateUsernames().size()); + assertEquals(0, respVO.getUpdateUsernames().size()); + assertEquals(1, respVO.getFailureUsernames().size()); + assertEquals(DEPT_NOT_FOUND.getMsg(), respVO.getFailureUsernames().get(importUser.getUsername())); + } + + /** + * 情况二,不存在,进行插入 + */ + @Test + public void testImportUsers_02() { + // 准备参数 + UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 + }); + // mock deptService 的方法 + DeptDO dept = randomPojo(DeptDO.class, o -> { + o.setId(importUser.getDeptId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + // mock passwordEncoder 的方法 + when(passwordEncoder.encode(eq("jojuyuanma"))).thenReturn("java"); + + // 调用 + UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); + // 断言 + assertEquals(1, respVO.getCreateUsernames().size()); + AdminUserDO user = userMapper.selectByUsername(respVO.getCreateUsernames().get(0)); + assertPojoEquals(importUser, user); + assertEquals("java", user.getPassword()); + assertEquals(0, respVO.getUpdateUsernames().size()); + assertEquals(0, respVO.getFailureUsernames().size()); + } + + /** + * 情况三,存在,但是不强制更新 + */ + @Test + public void testImportUsers_03() { + // mock 数据 + AdminUserDO dbUser = randomAdminUserDO(); + userMapper.insert(dbUser); + // 准备参数 + UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 + o.setUsername(dbUser.getUsername()); + }); + // mock deptService 的方法 + DeptDO dept = randomPojo(DeptDO.class, o -> { + o.setId(importUser.getDeptId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + + // 调用 + UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), false); + // 断言 + assertEquals(0, respVO.getCreateUsernames().size()); + assertEquals(0, respVO.getUpdateUsernames().size()); + assertEquals(1, respVO.getFailureUsernames().size()); + assertEquals(USER_USERNAME_EXISTS.getMsg(), respVO.getFailureUsernames().get(importUser.getUsername())); + } + + /** + * 情况四,存在,强制更新 + */ + @Test + public void testImportUsers_04() { + // mock 数据 + AdminUserDO dbUser = randomAdminUserDO(); + userMapper.insert(dbUser); + // 准备参数 + UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 + o.setUsername(dbUser.getUsername()); + }); + // mock deptService 的方法 + DeptDO dept = randomPojo(DeptDO.class, o -> { + o.setId(importUser.getDeptId()); + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); + }); + when(deptService.getDept(eq(dept.getId()))).thenReturn(dept); + + // 调用 + UserImportRespVO respVO = userService.importUsers(newArrayList(importUser), true); + // 断言 + assertEquals(0, respVO.getCreateUsernames().size()); + assertEquals(1, respVO.getUpdateUsernames().size()); + AdminUserDO user = userMapper.selectByUsername(respVO.getUpdateUsernames().get(0)); + assertPojoEquals(importUser, user); + assertEquals(0, respVO.getFailureUsernames().size()); + } + + @Test + public void testCheckUserExists_notExists() { + assertServiceException(() -> userService.checkUserExists(randomLongId()), USER_NOT_EXISTS); + } + + @Test + public void testCheckUsernameUnique_usernameExistsForCreate() { + // 准备参数 + String username = randomString(); + // mock 数据 + userMapper.insert(randomAdminUserDO(o -> o.setUsername(username))); + + // 调用,校验异常 + assertServiceException(() -> userService.checkUsernameUnique(null, username), + USER_USERNAME_EXISTS); + } + + @Test + public void testCheckUsernameUnique_usernameExistsForUpdate() { + // 准备参数 + Long id = randomLongId(); + String username = randomString(); + // mock 数据 + userMapper.insert(randomAdminUserDO(o -> o.setUsername(username))); + + // 调用,校验异常 + assertServiceException(() -> userService.checkUsernameUnique(id, username), + USER_USERNAME_EXISTS); + } + + @Test + public void testCheckEmailUnique_emailExistsForCreate() { + // 准备参数 + String email = randomString(); + // mock 数据 + userMapper.insert(randomAdminUserDO(o -> o.setEmail(email))); + + // 调用,校验异常 + assertServiceException(() -> userService.checkEmailUnique(null, email), + USER_EMAIL_EXISTS); + } + + @Test + public void testCheckEmailUnique_emailExistsForUpdate() { + // 准备参数 + Long id = randomLongId(); + String email = randomString(); + // mock 数据 + userMapper.insert(randomAdminUserDO(o -> o.setEmail(email))); + + // 调用,校验异常 + assertServiceException(() -> userService.checkEmailUnique(id, email), + USER_EMAIL_EXISTS); + } + + @Test + public void testCheckMobileUnique_mobileExistsForCreate() { + // 准备参数 + String mobile = randomString(); + // mock 数据 + userMapper.insert(randomAdminUserDO(o -> o.setMobile(mobile))); + + // 调用,校验异常 + assertServiceException(() -> userService.checkMobileUnique(null, mobile), + USER_MOBILE_EXISTS); + } + + @Test + public void testCheckMobileUnique_mobileExistsForUpdate() { + // 准备参数 + Long id = randomLongId(); + String mobile = randomString(); + // mock 数据 + userMapper.insert(randomAdminUserDO(o -> o.setMobile(mobile))); + + // 调用,校验异常 + assertServiceException(() -> userService.checkMobileUnique(id, mobile), + USER_MOBILE_EXISTS); + } + + @Test + public void testCheckOldPassword_notExists() { + assertServiceException(() -> userService.checkOldPassword(randomLongId(), randomString()), + USER_NOT_EXISTS); + } + + @Test + public void testCheckOldPassword_passwordFailed() { + // mock 数据 + AdminUserDO user = randomAdminUserDO(); + userMapper.insert(user); + // 准备参数 + Long id = user.getId(); + String oldPassword = user.getPassword(); + + // 调用,校验异常 + assertServiceException(() -> userService.checkOldPassword(id, oldPassword), + USER_PASSWORD_FAILED); + // 校验调用 + verify(passwordEncoder, times(1)).matches(eq(oldPassword), eq(user.getPassword())); + } + + @Test + public void testUsersByPostIds() { + // 准备参数 + Collection postIds = asSet(10L, 20L); + // mock user1 数据 + AdminUserDO user1 = randomAdminUserDO(o -> o.setPostIds(asSet(10L, 30L))); + userMapper.insert(user1); + userPostMapper.insert(new UserPostDO().setUserId(user1.getId()).setPostId(10L)); + userPostMapper.insert(new UserPostDO().setUserId(user1.getId()).setPostId(30L)); + // mock user2 数据 + AdminUserDO user2 = randomAdminUserDO(o -> o.setPostIds(singleton(100L))); + userMapper.insert(user2); + userPostMapper.insert(new UserPostDO().setUserId(user2.getId()).setPostId(100L)); + + // 调用 + List result = userService.getUsersByPostIds(postIds); + // 断言 + assertEquals(1, result.size()); + assertEquals(user1, result.get(0)); + } + + // ========== 随机对象 ========== + + @SafeVarargs + private static AdminUserDO randomAdminUserDO(Consumer... consumers) { + Consumer consumer = (o) -> { + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 + o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围 + }; + return randomPojo(AdminUserDO.class, ArrayUtils.append(consumer, consumers)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/userinfo/UserInfoServiceImplTest.java b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/userinfo/UserInfoServiceImplTest.java new file mode 100644 index 0000000..0b33af9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/java/com/jojubanking/boot/module/system/service/userinfo/UserInfoServiceImplTest.java @@ -0,0 +1,269 @@ +package com.jojubanking.boot.module.system.service.userinfo; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + +import javax.annotation.Resource; + +import com.jojubanking.boot.framework.test.core.ut.BaseDbUnitTest; + +import com.jojubanking.boot.module.system.controller.app.userinfo.vo.*; +import com.jojubanking.boot.module.system.dal.dataobject.userinfo.UserInfoDO; +import com.jojubanking.boot.module.system.dal.mysql.userinfo.UserInfoMapper; +import com.jojubanking.boot.framework.common.pojo.PageResult; + +import javax.annotation.Resource; +import org.springframework.context.annotation.Import; +import java.util.*; + +import static cn.hutool.core.util.RandomUtil.*; +import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*; +import static com.jojubanking.boot.framework.test.core.util.AssertUtils.*; +import static com.jojubanking.boot.framework.test.core.util.RandomUtils.*; +import static com.jojubanking.boot.framework.common.util.object.ObjectUtils.*; +import static com.jojubanking.boot.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link UserInfoServiceImpl} 的单元测试类 + * + * @author admin + */ +@Import(UserInfoServiceImpl.class) +public class UserInfoServiceImplTest extends BaseDbUnitTest { + + @Resource + private UserInfoServiceImpl userInfoService; + + @Resource + private UserInfoMapper userInfoMapper; + + @Test + public void testCreateUserInfo_success() { + // 准备参数 + AppUserInfoCreateReqVO reqVO = randomPojo(AppUserInfoCreateReqVO.class); + + // 调用 + Long userInfoId = userInfoService.createUserInfo(reqVO); + // 断言 + assertNotNull(userInfoId); + // 校验记录的属性是否正确 + UserInfoDO userInfo = userInfoMapper.selectById(userInfoId); + assertPojoEquals(reqVO, userInfo); + } + + @Test + public void testUpdateUserInfo_success() { + // mock 数据 + UserInfoDO dbUserInfo = randomPojo(UserInfoDO.class); + userInfoMapper.insert(dbUserInfo);// @Sql: 先插入出一条存在的数据 + // 准备参数 + AppUserInfoUpdateReqVO reqVO = randomPojo(AppUserInfoUpdateReqVO.class, o -> { + o.setId(dbUserInfo.getId()); // 设置更新的 ID + }); + + // 调用 + userInfoService.updateUserInfo(reqVO); + // 校验是否更新正确 + UserInfoDO userInfo = userInfoMapper.selectById(reqVO.getId()); // 获取最新的 + assertPojoEquals(reqVO, userInfo); + } + + @Test + public void testUpdateUserInfo_notExists() { + // 准备参数 + AppUserInfoUpdateReqVO reqVO = randomPojo(AppUserInfoUpdateReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> userInfoService.updateUserInfo(reqVO), USER_INFO_NOT_EXISTS); + } + + @Test + public void testDeleteUserInfo_success() { + // mock 数据 + UserInfoDO dbUserInfo = randomPojo(UserInfoDO.class); + userInfoMapper.insert(dbUserInfo);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbUserInfo.getId(); + + // 调用 + userInfoService.deleteUserInfo(id); + // 校验数据不存在了 + assertNull(userInfoMapper.selectById(id)); + } + + @Test + public void testDeleteUserInfo_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> userInfoService.deleteUserInfo(id), USER_INFO_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserInfoPage() { + // mock 数据 + UserInfoDO dbUserInfo = randomPojo(UserInfoDO.class, o -> { // 等会查询到 + o.setOpenid(null); + o.setName(null); + o.setUser(null); + o.setPassword(null); + o.setPhone(null); + o.setIdno(null); + o.setEmail(null); + o.setRemark(null); + o.setHeadurl(null); + o.setBirthdate(null); + o.setNativeplace(null); + o.setCountry(null); + o.setProvince(null); + o.setCity(null); + o.setSex(null); + o.setCreateTime(null); + }); + userInfoMapper.insert(dbUserInfo); + // 测试 openid 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setOpenid(null))); + // 测试 name 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setName(null))); + // 测试 user 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setUser(null))); + // 测试 password 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setPassword(null))); + // 测试 phone 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setPhone(null))); + // 测试 idNo 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setIdno(null))); + // 测试 email 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setEmail(null))); + // 测试 remark 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setRemark(null))); + // 测试 headUrl 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setHeadurl(null))); + // 测试 birthDate 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setBirthdate(null))); + // 测试 nativePlace 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setNativeplace(null))); + // 测试 country 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setCountry(null))); + // 测试 province 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setProvince(null))); + // 测试 city 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setCity(null))); + // 测试 sex 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setSex(null))); + // 测试 createTime 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setCreateTime(null))); + // 准备参数 + AppUserInfoPageReqVO reqVO = new AppUserInfoPageReqVO(); + reqVO.setOpenid(null); + reqVO.setName(null); + reqVO.setUser(null); + reqVO.setPassword(null); + reqVO.setPhone(null); + reqVO.setIdno(null); + reqVO.setEmail(null); + reqVO.setRemark(null); + reqVO.setHeadurl(null); +// reqVO.setBirthDate((new Date[]{})); + reqVO.setNativeplace(null); + reqVO.setCountry(null); + reqVO.setProvince(null); + reqVO.setCity(null); + reqVO.setSex(null); + reqVO.setCreateTime((new Date[]{})); + + // 调用 + PageResult pageResult = userInfoService.getUserInfoPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbUserInfo, pageResult.getList().get(0)); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetUserInfoList() { + // mock 数据 + UserInfoDO dbUserInfo = randomPojo(UserInfoDO.class, o -> { // 等会查询到 + o.setOpenid(null); + o.setName(null); + o.setUser(null); + o.setPassword(null); + o.setPhone(null); + o.setIdno(null); + o.setEmail(null); + o.setRemark(null); + o.setHeadurl(null); + o.setBirthdate(null); + o.setNativeplace(null); + o.setCountry(null); + o.setProvince(null); + o.setCity(null); + o.setSex(null); + o.setCreateTime(null); + }); + userInfoMapper.insert(dbUserInfo); + // 测试 openid 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setOpenid(null))); + // 测试 name 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setName(null))); + // 测试 user 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setUser(null))); + // 测试 password 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setPassword(null))); + // 测试 phone 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setPhone(null))); + // 测试 idNo 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setIdno(null))); + // 测试 email 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setEmail(null))); + // 测试 remark 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setRemark(null))); + // 测试 headUrl 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setHeadurl(null))); + // 测试 birthDate 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setBirthdate(null))); + // 测试 nativePlace 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setNativeplace(null))); + // 测试 country 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setCountry(null))); + // 测试 province 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setProvince(null))); + // 测试 city 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setCity(null))); + // 测试 sex 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setSex(null))); + // 测试 createTime 不匹配 + userInfoMapper.insert(cloneIgnoreId(dbUserInfo, o -> o.setCreateTime(null))); + // 准备参数 + AppUserInfoExportReqVO reqVO = new AppUserInfoExportReqVO(); + reqVO.setOpenid(null); + reqVO.setName(null); + reqVO.setUser(null); + reqVO.setPassword(null); + reqVO.setPhone(null); + reqVO.setIdno(null); + reqVO.setEmail(null); + reqVO.setRemark(null); + reqVO.setHeadurl(null); +// reqVO.setBirthDate((new Date[]{})); + reqVO.setNativeplace(null); + reqVO.setCountry(null); + reqVO.setProvince(null); + reqVO.setCity(null); + reqVO.setSex(null); + reqVO.setCreateTime((new Date[]{})); + + // 调用 + List list = userInfoService.getUserInfoList(reqVO); + // 断言 + assertEquals(1, list.size()); + assertPojoEquals(dbUserInfo, list.get(0)); + } + +} diff --git a/joju-module-system/joju-module-system-biz/src/test/resources/application-unit-test.yaml b/joju-module-system/joju-module-system-biz/src/test/resources/application-unit-test.yaml new file mode 100644 index 0000000..ab991b6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/resources/application-unit-test.yaml @@ -0,0 +1,55 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + sql: + init: + schema-locations: classpath:/sql/create_tables.sql + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +joju: + info: + base-package: com.jojubanking.boot.module + captcha: + timeout: 5m + width: 160 + height: 60 + enable: true diff --git a/joju-module-system/joju-module-system-biz/src/test/resources/logback.xml b/joju-module-system/joju-module-system-biz/src/test/resources/logback.xml new file mode 100644 index 0000000..daf756b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/resources/logback.xml @@ -0,0 +1,4 @@ + + + + diff --git a/joju-module-system/joju-module-system-biz/src/test/resources/sql/clean.sql b/joju-module-system/joju-module-system-biz/src/test/resources/sql/clean.sql new file mode 100644 index 0000000..b13b191 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/resources/sql/clean.sql @@ -0,0 +1,27 @@ +DELETE FROM "system_dept"; +DELETE FROM "system_dict_data"; +DELETE FROM "system_role"; +DELETE FROM "system_role_menu"; +DELETE FROM "system_menu"; +DELETE FROM "system_user_role"; +DELETE FROM "system_user_post"; +DELETE FROM "system_dict_type"; +DELETE FROM "system_user_session"; +DELETE FROM "system_post"; +DELETE FROM "system_login_log"; +DELETE FROM "system_operate_log"; +DELETE FROM "system_users"; +DELETE FROM "system_sms_channel"; +DELETE FROM "system_sms_template"; +DELETE FROM "system_sms_log"; +DELETE FROM "system_error_code"; +DELETE FROM "system_social_user"; +DELETE FROM "system_social_user_bind"; +DELETE FROM "system_tenant"; +DELETE FROM "system_tenant_package"; +DELETE FROM "system_sensitive_word"; +DELETE FROM "system_oauth2_client"; +DELETE FROM "system_oauth2_approve"; +DELETE FROM "system_oauth2_access_token"; +DELETE FROM "system_oauth2_refresh_token"; +DELETE FROM "system_oauth2_code"; diff --git a/joju-module-system/joju-module-system-biz/src/test/resources/sql/create_tables.sql b/joju-module-system/joju-module-system-biz/src/test/resources/sql/create_tables.sql new file mode 100644 index 0000000..56fc427 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/src/test/resources/sql/create_tables.sql @@ -0,0 +1,567 @@ +CREATE TABLE IF NOT EXISTS "system_dept" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL DEFAULT '', + "parent_id" bigint NOT NULL DEFAULT '0', + "sort" int NOT NULL DEFAULT '0', + "leader_user_id" bigint DEFAULT NULL, + "phone" varchar(11) DEFAULT NULL, + "email" varchar(50) DEFAULT NULL, + "status" tinyint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '部门表'; + +CREATE TABLE IF NOT EXISTS "system_dict_data" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "sort" int NOT NULL DEFAULT '0', + "label" varchar(100) NOT NULL DEFAULT '', + "value" varchar(100) NOT NULL DEFAULT '', + "dict_type" varchar(100) NOT NULL DEFAULT '', + "status" tinyint NOT NULL DEFAULT '0', + "color_type" varchar(100) NOT NULL DEFAULT '', + "css_class" varchar(100) NOT NULL DEFAULT '', + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典数据表'; + +CREATE TABLE IF NOT EXISTS "system_role" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL, + "code" varchar(100) NOT NULL, + "sort" int NOT NULL, + "data_scope" tinyint NOT NULL DEFAULT '1', + "data_scope_dept_ids" varchar(500) NOT NULL DEFAULT '', + "status" tinyint NOT NULL, + "type" tinyint NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '角色信息表'; + +CREATE TABLE IF NOT EXISTS "system_role_menu" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "role_id" bigint NOT NULL, + "menu_id" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '角色和菜单关联表'; + +CREATE TABLE IF NOT EXISTS "system_menu" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(50) NOT NULL, + "permission" varchar(100) NOT NULL DEFAULT '', + "type" tinyint NOT NULL, + "sort" int NOT NULL DEFAULT '0', + "parent_id" bigint NOT NULL DEFAULT '0', + "path" varchar(200) DEFAULT '', + "icon" varchar(100) DEFAULT '#', + "component" varchar(255) DEFAULT NULL, + "status" tinyint NOT NULL DEFAULT '0', + "visible" bit NOT NULL DEFAULT TRUE, + "keep_alive" bit NOT NULL DEFAULT TRUE, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '菜单权限表'; + +CREATE TABLE IF NOT EXISTS "system_user_role" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "role_id" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp DEFAULT NULL, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp DEFAULT NULL, + "deleted" bit DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '用户和角色关联表'; + +CREATE TABLE IF NOT EXISTS "system_dict_type" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(100) NOT NULL DEFAULT '', + "type" varchar(100) NOT NULL DEFAULT '', + "status" tinyint NOT NULL DEFAULT '0', + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典类型表'; + +CREATE TABLE IF NOT EXISTS `system_user_session` ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `token` varchar(32) NOT NULL, + `user_id` bigint DEFAULT NULL, + "user_type" tinyint NOT NULL, + `username` varchar(50) NOT NULL DEFAULT '', + `user_ip` varchar(50) DEFAULT NULL, + `user_agent` varchar(512) DEFAULT NULL, + `session_timeout` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '' , + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT '用户在线 Session'; + +CREATE TABLE IF NOT EXISTS "system_post" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(64) NOT NULL, + "name" varchar(50) NOT NULL, + "sort" integer NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '岗位信息表'; + +CREATE TABLE IF NOT EXISTS `system_user_post`( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint DEFAULT NULL, + "post_id" bigint DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT ='用户岗位表'; + + +CREATE TABLE IF NOT EXISTS "system_notice" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "title" varchar(50) NOT NULL COMMENT '公告标题', + "content" text NOT NULL COMMENT '公告内容', + "type" tinyint NOT NULL COMMENT '公告类型(1通知 2公告)', + "status" tinyint NOT NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit NOT NULL DEFAULT 0 COMMENT '是否删除', + "tenant_id" bigint not null default '0', + PRIMARY KEY("id") +) COMMENT '通知公告表'; + +CREATE TABLE IF NOT EXISTS `system_login_log` ( + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `log_type` bigint(4) NOT NULL, + "user_id" bigint not null default '0', + "user_type" tinyint NOT NULL, + `trace_id` varchar(64) NOT NULL DEFAULT '', + `username` varchar(50) NOT NULL DEFAULT '', + `result` tinyint(4) NOT NULL, + `user_ip` varchar(50) NOT NULL, + `user_agent` varchar(512) NOT NULL, + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) COMMENT ='系统访问记录'; + +CREATE TABLE IF NOT EXISTS `system_operate_log` ( + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `trace_id` varchar(64) NOT NULL DEFAULT '', + `user_id` bigint(20) NOT NULL, + "user_type" tinyint not null default '0', + `module` varchar(50) NOT NULL, + `name` varchar(50) NOT NULL, + `type` bigint(4) NOT NULL DEFAULT '0', + `content` varchar(2000) NOT NULL DEFAULT '', + `exts` varchar(512) NOT NULL DEFAULT '', + `request_method` varchar(16) DEFAULT '', + `request_url` varchar(255) DEFAULT '', + `user_ip` varchar(50) DEFAULT NULL, + `user_agent` varchar(200) DEFAULT NULL, + `java_method` varchar(512) NOT NULL DEFAULT '', + `java_method_args` varchar(8000) DEFAULT '', + `start_time` datetime NOT NULL, + `duration` int(11) NOT NULL, + `result_code` int(11) NOT NULL DEFAULT '0', + `result_msg` varchar(512) DEFAULT '', + `result_data` varchar(4000) DEFAULT '', + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT '0', + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT ='操作日志记录'; + +CREATE TABLE IF NOT EXISTS "system_users" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "username" varchar(30) not null, + "password" varchar(100) not null default '', + "nickname" varchar(30) not null, + "remark" varchar(500) default null, + "dept_id" bigint default null, + "post_ids" varchar(255) default null, + "email" varchar(50) default '', + "mobile" varchar(11) default '', + "sex" tinyint default '0', + "avatar" varchar(100) default '', + "status" tinyint not null default '0', + "login_ip" varchar(50) default '', + "login_date" timestamp default null, + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) comment '用户信息表'; + +CREATE TABLE IF NOT EXISTS "inf_api_access_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null default '', + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null default '', + "request_url" varchar(255) not null default '', + "request_params" varchar(8000) not null default '', + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "begin_time" timestamp not null, + "end_time" timestamp not null, + "duration" integer not null, + "result_code" integer not null default '0', + "result_msg" varchar(512) default '', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) COMMENT 'API 访问日志表'; + +CREATE TABLE IF NOT EXISTS "inf_api_error_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null, + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null, + "request_url" varchar(255) not null, + "request_params" varchar(8000) not null, + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "exception_time" timestamp not null, + "exception_name" varchar(128) not null default '', + "exception_message" clob not null, + "exception_root_cause_message" clob not null, + "exception_stack_trace" clob not null, + "exception_class_name" varchar(512) not null, + "exception_file_name" varchar(512) not null, + "exception_method_name" varchar(512) not null, + "exception_line_number" integer not null, + "process_status" tinyint not null, + "process_time" timestamp default null, + "process_user_id" bigint default '0', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) COMMENT '系统异常日志'; + +CREATE TABLE IF NOT EXISTS "system_sms_channel" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "signature" varchar(10) NOT NULL, + "code" varchar(63) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "api_key" varchar(63) NOT NULL, + "api_secret" varchar(63) DEFAULT NULL, + "callback_url" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信渠道'; + +CREATE TABLE IF NOT EXISTS "system_sms_template" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL, + "status" tinyint NOT NULL, + "code" varchar(63) NOT NULL, + "name" varchar(63) NOT NULL, + "content" varchar(255) NOT NULL, + "params" varchar(255) NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "api_template_id" varchar(63) NOT NULL, + "channel_id" bigint NOT NULL, + "channel_code" varchar(63) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信模板'; + +CREATE TABLE IF NOT EXISTS "system_sms_log" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "channel_id" bigint NOT NULL, + "channel_code" varchar(63) NOT NULL, + "template_id" bigint NOT NULL, + "template_code" varchar(63) NOT NULL, + "template_type" tinyint NOT NULL, + "template_content" varchar(255) NOT NULL, + "template_params" varchar(255) NOT NULL, + "api_template_id" varchar(63) NOT NULL, + "mobile" varchar(11) NOT NULL, + "user_id" bigint DEFAULT '0', + "user_type" tinyint DEFAULT '0', + "send_status" tinyint NOT NULL DEFAULT '0', + "send_time" timestamp DEFAULT NULL, + "send_code" int DEFAULT NULL, + "send_msg" varchar(255) DEFAULT NULL, + "api_send_code" varchar(63) DEFAULT NULL, + "api_send_msg" varchar(255) DEFAULT NULL, + "api_request_id" varchar(255) DEFAULT NULL, + "api_serial_no" varchar(255) DEFAULT NULL, + "receive_status" tinyint NOT NULL DEFAULT '0', + "receive_time" timestamp DEFAULT NULL, + "api_receive_code" varchar(63) DEFAULT NULL, + "api_receive_msg" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信日志'; + +CREATE TABLE IF NOT EXISTS "system_error_code" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL DEFAULT '0', + "application_name" varchar(50) NOT NULL, + "code" int NOT NULL DEFAULT '0', + "message" varchar(512) NOT NULL DEFAULT '', + "memo" varchar(512) DEFAULT '', + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '错误码表'; + +CREATE TABLE IF NOT EXISTS "system_social_user" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL, + "openid" varchar(64) NOT NULL, + "token" varchar(256) DEFAULT NULL, + "raw_token_info" varchar(1024) NOT NULL, + "nickname" varchar(32) NOT NULL, + "avatar" varchar(255) DEFAULT NULL, + "raw_user_info" varchar(1024) NOT NULL, + "code" varchar(64) NOT NULL, + "state" varchar(64), + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '社交用户'; + +CREATE TABLE IF NOT EXISTS "system_social_user_bind" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "social_type" tinyint NOT NULL, + "social_user_id" number NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '社交用户的绑定'; + +CREATE TABLE IF NOT EXISTS "system_tenant" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "contact_user_id" bigint NOT NULL DEFAULT '0', + "contact_name" varchar(255) NOT NULL, + "contact_mobile" varchar(255), + "status" tinyint NOT NULL, + "domain" varchar(63) DEFAULT '', + "package_id" bigint NOT NULL, + "expire_time" timestamp NOT NULL, + "account_count" int NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '租户'; + +CREATE TABLE IF NOT EXISTS "system_tenant_package" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(256), + "menu_ids" varchar(2048) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '租户套餐表'; + +CREATE TABLE IF NOT EXISTS "system_sensitive_word" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(255) NOT NULL, + "tags" varchar(1024) NOT NULL, + "status" bit NOT NULL DEFAULT FALSE, + "description" varchar(512), + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '系统敏感词'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_client" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "client_id" varchar NOT NULL, + "secret" varchar NOT NULL, + "name" varchar NOT NULL, + "logo" varchar NOT NULL, + "description" varchar, + "status" int NOT NULL, + "access_token_validity_seconds" int NOT NULL, + "refresh_token_validity_seconds" int NOT NULL, + "redirect_uris" varchar NOT NULL, + "authorized_grant_types" varchar NOT NULL, + "scopes" varchar NOT NULL DEFAULT '', + "auto_approve_scopes" varchar NOT NULL DEFAULT '', + "authorities" varchar NOT NULL DEFAULT '', + "resource_ids" varchar NOT NULL DEFAULT '', + "additional_information" varchar NOT NULL DEFAULT '', + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 客户端表'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_approve" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "client_id" varchar NOT NULL, + "scope" varchar NOT NULL, + "approved" bit NOT NULL DEFAULT FALSE, + "expires_time" datetime NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 批准表'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_access_token" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "access_token" varchar NOT NULL, + "refresh_token" varchar NOT NULL, + "client_id" varchar NOT NULL, + "scopes" varchar NOT NULL, + "approved" bit NOT NULL DEFAULT FALSE, + "expires_time" datetime NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 访问令牌'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_refresh_token" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "refresh_token" varchar NOT NULL, + "client_id" varchar NOT NULL, + "scopes" varchar NOT NULL, + "approved" bit NOT NULL DEFAULT FALSE, + "expires_time" datetime NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 刷新令牌'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_code" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "code" varchar NOT NULL, + "client_id" varchar NOT NULL, + "scopes" varchar NOT NULL, + "expires_time" datetime NOT NULL, + "redirect_uri" varchar NOT NULL, + "state" varchar NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 刷新令牌'; diff --git a/joju-module-system/joju-module-system-biz/target/classes/aspose-cells-8.5.2.jar b/joju-module-system/joju-module-system-biz/target/classes/aspose-cells-8.5.2.jar new file mode 100644 index 0000000..d0e1aca Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/aspose-cells-8.5.2.jar differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/aspose-words-15.8.0.jar b/joju-module-system/joju-module-system-biz/target/classes/aspose-words-15.8.0.jar new file mode 100644 index 0000000..c0e699f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/aspose-words-15.8.0.jar differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/WebLog.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/WebLog.class new file mode 100644 index 0000000..b4ad411 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/WebLog.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/WebLogAspect.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/WebLogAspect.class new file mode 100644 index 0000000..9cbc8b2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/WebLogAspect.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/dept/DeptApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/dept/DeptApiImpl.class new file mode 100644 index 0000000..89732b1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/dept/DeptApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/dept/PostApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/dept/PostApiImpl.class new file mode 100644 index 0000000..a4e8983 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/dept/PostApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/dict/DictDataApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/dict/DictDataApiImpl.class new file mode 100644 index 0000000..fc82bc2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/dict/DictDataApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/errorcode/ErrorCodeApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/errorcode/ErrorCodeApiImpl.class new file mode 100644 index 0000000..1f14f8e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/errorcode/ErrorCodeApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/logger/LoginLogApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/logger/LoginLogApiImpl.class new file mode 100644 index 0000000..af38cf4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/logger/LoginLogApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/logger/OperateLogApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/logger/OperateLogApiImpl.class new file mode 100644 index 0000000..44c8bf8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/logger/OperateLogApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/oauth2/OAuth2TokenApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/oauth2/OAuth2TokenApiImpl.class new file mode 100644 index 0000000..e89977d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/oauth2/OAuth2TokenApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/permission/PermissionApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/permission/PermissionApiImpl.class new file mode 100644 index 0000000..ef5c30b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/permission/PermissionApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/permission/RoleApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/permission/RoleApiImpl.class new file mode 100644 index 0000000..f34d9e0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/permission/RoleApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/sensitiveword/SensitiveWordApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/sensitiveword/SensitiveWordApiImpl.class new file mode 100644 index 0000000..cd0b153 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/sensitiveword/SensitiveWordApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/sms/SmsCodeApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/sms/SmsCodeApiImpl.class new file mode 100644 index 0000000..9c7d8ab Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/sms/SmsCodeApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/sms/SmsSendApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/sms/SmsSendApiImpl.class new file mode 100644 index 0000000..e18a99b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/sms/SmsSendApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/social/SocialUserApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/social/SocialUserApiImpl.class new file mode 100644 index 0000000..4eed923 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/social/SocialUserApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/tenant/TenantApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/tenant/TenantApiImpl.class new file mode 100644 index 0000000..bd4b7d6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/tenant/TenantApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/user/AdminUserApiImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/user/AdminUserApiImpl.class new file mode 100644 index 0000000..a4f43d2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/api/user/AdminUserApiImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/AuthController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/AuthController.class new file mode 100644 index 0000000..4860be4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/AuthController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginReqVO$AuthLoginReqVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginReqVO$AuthLoginReqVOBuilder.class new file mode 100644 index 0000000..9065b8e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginReqVO$AuthLoginReqVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginReqVO$CodeEnableGroup.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginReqVO$CodeEnableGroup.class new file mode 100644 index 0000000..f032fd4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginReqVO$CodeEnableGroup.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginReqVO.class new file mode 100644 index 0000000..8e08cf2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginRespVO$AuthLoginRespVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginRespVO$AuthLoginRespVOBuilder.class new file mode 100644 index 0000000..8c9d128 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginRespVO$AuthLoginRespVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginRespVO.class new file mode 100644 index 0000000..c041198 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthLoginRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthMenuRespVO$AuthMenuRespVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthMenuRespVO$AuthMenuRespVOBuilder.class new file mode 100644 index 0000000..1ea0aa4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthMenuRespVO$AuthMenuRespVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthMenuRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthMenuRespVO.class new file mode 100644 index 0000000..11c434a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthMenuRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO$AuthPermissionInfoRespVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO$AuthPermissionInfoRespVOBuilder.class new file mode 100644 index 0000000..88d36db Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO$AuthPermissionInfoRespVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO$UserVO$UserVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO$UserVO$UserVOBuilder.class new file mode 100644 index 0000000..250760f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO$UserVO$UserVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO$UserVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO$UserVO.class new file mode 100644 index 0000000..fdd6652 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO$UserVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.class new file mode 100644 index 0000000..df85e5d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO$AuthSmsLoginReqVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO$AuthSmsLoginReqVOBuilder.class new file mode 100644 index 0000000..a828635 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO$AuthSmsLoginReqVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO.class new file mode 100644 index 0000000..25b2f0c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsLoginReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsSendReqVO$AuthSmsSendReqVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsSendReqVO$AuthSmsSendReqVOBuilder.class new file mode 100644 index 0000000..10367b9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsSendReqVO$AuthSmsSendReqVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.class new file mode 100644 index 0000000..e563dbc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSmsSendReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO$AuthSocialLoginReqVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO$AuthSocialLoginReqVOBuilder.class new file mode 100644 index 0000000..6d57fac Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO$AuthSocialLoginReqVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO.class new file mode 100644 index 0000000..93d746e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/auth/vo/AuthSocialLoginReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/BuildingController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/BuildingController.class new file mode 100644 index 0000000..28d0ad6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/BuildingController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingBaseVO.class new file mode 100644 index 0000000..c309fc6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingCreateReqVO.class new file mode 100644 index 0000000..174ad6f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingExcelVO.class new file mode 100644 index 0000000..59c614a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingExportReqVO.class new file mode 100644 index 0000000..c545760 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingListReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingListReqVO.class new file mode 100644 index 0000000..7b344ca Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingListReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingPageReqVO.class new file mode 100644 index 0000000..7547a25 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingRespVO.class new file mode 100644 index 0000000..abdc89a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingSimpleRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingSimpleRespVO.class new file mode 100644 index 0000000..e37ac59 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingSimpleRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingUpdateReqVO.class new file mode 100644 index 0000000..4b7d111 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/building/vo/BuildingUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/CarouselController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/CarouselController.class new file mode 100644 index 0000000..2748fec Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/CarouselController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselBaseVO.class new file mode 100644 index 0000000..903f597 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselCreateReqVO.class new file mode 100644 index 0000000..0c76ec9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselExcelVO.class new file mode 100644 index 0000000..a26ca8f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselExportReqVO.class new file mode 100644 index 0000000..998445d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselPageReqVO.class new file mode 100644 index 0000000..596f7ad Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselRespVO.class new file mode 100644 index 0000000..6a53807 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselUpdateReqVO.class new file mode 100644 index 0000000..9c9043a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/carousel/vo/CarouselUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/ChilditemController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/ChilditemController.class new file mode 100644 index 0000000..e0299d0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/ChilditemController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemBaseVO.class new file mode 100644 index 0000000..4aa8e86 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemCreateReqVO.class new file mode 100644 index 0000000..62652a4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemExcelVO.class new file mode 100644 index 0000000..b697a85 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemExportReqVO.class new file mode 100644 index 0000000..7ea68dd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemPageReqVO.class new file mode 100644 index 0000000..5f4c894 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemRespVO.class new file mode 100644 index 0000000..cc1629d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemUpdateReqVO.class new file mode 100644 index 0000000..3070e93 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/childitem/vo/ChilditemUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/common/CaptchaController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/common/CaptchaController.class new file mode 100644 index 0000000..41f2981 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/common/CaptchaController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/common/vo/CaptchaImageRespVO$CaptchaImageRespVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/common/vo/CaptchaImageRespVO$CaptchaImageRespVOBuilder.class new file mode 100644 index 0000000..56228e3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/common/vo/CaptchaImageRespVO$CaptchaImageRespVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/common/vo/CaptchaImageRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/common/vo/CaptchaImageRespVO.class new file mode 100644 index 0000000..939663d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/common/vo/CaptchaImageRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/DeptController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/DeptController.class new file mode 100644 index 0000000..c39042d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/DeptController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/PostController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/PostController.class new file mode 100644 index 0000000..67b1428 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/PostController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptBaseVO.class new file mode 100644 index 0000000..34d3fea Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptCreateReqVO.class new file mode 100644 index 0000000..53c7cc1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptExcelVO.class new file mode 100644 index 0000000..509d549 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptExportReqVO.class new file mode 100644 index 0000000..bacacec Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptPageReqVO.class new file mode 100644 index 0000000..396b803 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptRespVO.class new file mode 100644 index 0000000..949ee73 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptUpdateReqVO.class new file mode 100644 index 0000000..ac8d112 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/DeptUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptBaseVO.class new file mode 100644 index 0000000..6b5b4d7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptCreateReqVO.class new file mode 100644 index 0000000..9ec772c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptListReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptListReqVO.class new file mode 100644 index 0000000..b64f6a8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptListReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptRespVO.class new file mode 100644 index 0000000..f52e45b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.class new file mode 100644 index 0000000..3b812ff Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptSimpleRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptUpdateReqVO.class new file mode 100644 index 0000000..6ea9543 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/dept/DeptUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostBaseVO.class new file mode 100644 index 0000000..5a0b0d3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostCreateReqVO.class new file mode 100644 index 0000000..4331712 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostExcelVO.class new file mode 100644 index 0000000..ffe206a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostExportReqVO.class new file mode 100644 index 0000000..266fdc5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostListReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostListReqVO.class new file mode 100644 index 0000000..82a10b9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostListReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostPageReqVO.class new file mode 100644 index 0000000..fc56d5e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostRespVO.class new file mode 100644 index 0000000..9a104c8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.class new file mode 100644 index 0000000..a87d48c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostSimpleRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostUpdateReqVO.class new file mode 100644 index 0000000..adac059 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dept/vo/post/PostUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/DeptXqController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/DeptXqController.class new file mode 100644 index 0000000..5e36fa9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/DeptXqController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqBaseVO.class new file mode 100644 index 0000000..1194fa0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqCreateReqVO.class new file mode 100644 index 0000000..cb0bfaa Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqExcelVO.class new file mode 100644 index 0000000..d5d178b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqExportReqVO.class new file mode 100644 index 0000000..4537a95 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqListReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqListReqVO.class new file mode 100644 index 0000000..568d008 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqListReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqPageReqVO.class new file mode 100644 index 0000000..87aac8f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqRespVO.class new file mode 100644 index 0000000..56507b1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqSimpleRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqSimpleRespVO.class new file mode 100644 index 0000000..97499f9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqSimpleRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqUpdateReqVO.class new file mode 100644 index 0000000..2195b65 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/deptxq/vo/DeptXqUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/DictDataController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/DictDataController.class new file mode 100644 index 0000000..7fdd52f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/DictDataController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/DictTypeController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/DictTypeController.class new file mode 100644 index 0000000..72d6365 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/DictTypeController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataBaseVO.class new file mode 100644 index 0000000..e0dc9d7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataCreateReqVO.class new file mode 100644 index 0000000..618a521 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataExcelVO.class new file mode 100644 index 0000000..e9467a0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.class new file mode 100644 index 0000000..e82c008 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.class new file mode 100644 index 0000000..3da5da1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataRespVO.class new file mode 100644 index 0000000..ee52ed0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.class new file mode 100644 index 0000000..010cc45 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataUpdateReqVO.class new file mode 100644 index 0000000..ba717b1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/data/DictDataUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeBaseVO.class new file mode 100644 index 0000000..ff5eb84 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeCreateReqVO.class new file mode 100644 index 0000000..df8a9a0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.class new file mode 100644 index 0000000..33339f5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.class new file mode 100644 index 0000000..7d7f019 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.class new file mode 100644 index 0000000..04d88c8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypePageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeRespVO.class new file mode 100644 index 0000000..05100e1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.class new file mode 100644 index 0000000..26a6621 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeSimpleRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeUpdateReqVO.class new file mode 100644 index 0000000..e79a0da Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dict/vo/type/DictTypeUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/DoctorController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/DoctorController.class new file mode 100644 index 0000000..e68f594 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/DoctorController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorBaseVO.class new file mode 100644 index 0000000..a3d921e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorCreateReqVO.class new file mode 100644 index 0000000..698b0bd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorExcelVO.class new file mode 100644 index 0000000..ff2f6cf Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorExportReqVO.class new file mode 100644 index 0000000..42f7828 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorPageReqVO.class new file mode 100644 index 0000000..8cac7ce Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorRespVO.class new file mode 100644 index 0000000..fe2011f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorUpdateReqVO.class new file mode 100644 index 0000000..701b5e8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/doctor/vo/DoctorUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/DzQuestionController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/DzQuestionController.class new file mode 100644 index 0000000..aa5d7a3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/DzQuestionController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionBaseVO.class new file mode 100644 index 0000000..971d30f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionCreateReqVO.class new file mode 100644 index 0000000..188eb10 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionExcelVO.class new file mode 100644 index 0000000..f923f73 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionExportReqVO.class new file mode 100644 index 0000000..3100824 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionPageReqVO.class new file mode 100644 index 0000000..1091bb5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionRespVO.class new file mode 100644 index 0000000..277bd1e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionUpdateReqVO.class new file mode 100644 index 0000000..6b64499 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dzquestion/vo/DzQuestionUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/DzTypeController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/DzTypeController.class new file mode 100644 index 0000000..c53b1f1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/DzTypeController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeBaseVO.class new file mode 100644 index 0000000..6c66191 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeCreateReqVO.class new file mode 100644 index 0000000..5501575 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeExcelVO.class new file mode 100644 index 0000000..eaffa2b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeExportReqVO.class new file mode 100644 index 0000000..45f5b02 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypePageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypePageReqVO.class new file mode 100644 index 0000000..8abf960 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypePageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeRespVO.class new file mode 100644 index 0000000..43ec84e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeUpdateReqVO.class new file mode 100644 index 0000000..6769233 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/dztype/vo/DzTypeUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/ErrorCodeController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/ErrorCodeController.class new file mode 100644 index 0000000..f6562a2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/ErrorCodeController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeBaseVO.class new file mode 100644 index 0000000..84efed3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeCreateReqVO.class new file mode 100644 index 0000000..28e21fe Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeExcelVO.class new file mode 100644 index 0000000..7506bdf Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeExportReqVO.class new file mode 100644 index 0000000..b3a0e08 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.class new file mode 100644 index 0000000..12e10b4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodePageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.class new file mode 100644 index 0000000..431b856 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeUpdateReqVO.class new file mode 100644 index 0000000..23995f7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/errorcode/vo/ErrorCodeUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/HospitalController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/HospitalController.class new file mode 100644 index 0000000..d427c6d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/HospitalController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalBaseVO.class new file mode 100644 index 0000000..fc3be44 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalCreateReqVO.class new file mode 100644 index 0000000..f93d930 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalExcelVO.class new file mode 100644 index 0000000..c4c626f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalExportReqVO.class new file mode 100644 index 0000000..b7e3293 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalPageReqVO.class new file mode 100644 index 0000000..ce890be Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalRespVO.class new file mode 100644 index 0000000..10cdb72 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalUpdateReqVO.class new file mode 100644 index 0000000..a34b0dc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/hospital/vo/HospitalUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/InformationController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/InformationController.class new file mode 100644 index 0000000..dd48274 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/InformationController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationBaseVO.class new file mode 100644 index 0000000..af7fcb3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationCreateReqVO.class new file mode 100644 index 0000000..1d79275 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationExcelVO.class new file mode 100644 index 0000000..357276b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationExportReqVO.class new file mode 100644 index 0000000..0a8bc5d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationPageReqVO.class new file mode 100644 index 0000000..6d1ea89 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationRespVO.class new file mode 100644 index 0000000..e0fbd56 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationUpdateReqVO.class new file mode 100644 index 0000000..bebe0c9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/information/vo/InformationUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/ItemController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/ItemController.class new file mode 100644 index 0000000..53aadde Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/ItemController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemBaseVO.class new file mode 100644 index 0000000..7cb2b50 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemCreateReqVO.class new file mode 100644 index 0000000..5e006a9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemExcelVO.class new file mode 100644 index 0000000..692c322 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemExportReqVO.class new file mode 100644 index 0000000..b471cca Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemPageReqVO.class new file mode 100644 index 0000000..9f9884b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemRespVO.class new file mode 100644 index 0000000..55a44e9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemUpdateReqVO.class new file mode 100644 index 0000000..1642613 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/item/vo/ItemUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/KsInfoController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/KsInfoController.class new file mode 100644 index 0000000..ebb32af Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/KsInfoController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoBaseVO.class new file mode 100644 index 0000000..4224963 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoCreateReqVO.class new file mode 100644 index 0000000..56d6ae6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoExcelVO.class new file mode 100644 index 0000000..7854004 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoExportReqVO.class new file mode 100644 index 0000000..509886b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoPageReqVO.class new file mode 100644 index 0000000..417eea0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoRespVO.class new file mode 100644 index 0000000..ebfd021 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoUpdateReqVO.class new file mode 100644 index 0000000..7ff1a4b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/ksinfo/vo/KsInfoUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/KsTypeController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/KsTypeController.class new file mode 100644 index 0000000..b3fa84c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/KsTypeController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeBaseVO.class new file mode 100644 index 0000000..8b58be0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeCreateReqVO.class new file mode 100644 index 0000000..ad0de81 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeExcelVO.class new file mode 100644 index 0000000..9fda12a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeExportReqVO.class new file mode 100644 index 0000000..a880268 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypePageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypePageReqVO.class new file mode 100644 index 0000000..a17f894 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypePageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeRespVO.class new file mode 100644 index 0000000..edf2d4d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeUpdateReqVO.class new file mode 100644 index 0000000..066bfa2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/kstype/vo/KsTypeUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/LabelController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/LabelController.class new file mode 100644 index 0000000..e15eb6c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/LabelController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelBaseVO.class new file mode 100644 index 0000000..1cf9073 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelCreateReqVO.class new file mode 100644 index 0000000..e36081a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelExcelVO.class new file mode 100644 index 0000000..07f53ea Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelExportReqVO.class new file mode 100644 index 0000000..c555e86 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelPageReqVO.class new file mode 100644 index 0000000..20fa6ce Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelRespVO.class new file mode 100644 index 0000000..a835467 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelUpdateReqVO.class new file mode 100644 index 0000000..512ed82 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/label/vo/LabelUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/LoginLogController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/LoginLogController.class new file mode 100644 index 0000000..1a37174 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/LoginLogController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/OperateLogController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/OperateLogController.class new file mode 100644 index 0000000..9ec13ce Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/OperateLogController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.class new file mode 100644 index 0000000..d45f93a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.class new file mode 100644 index 0000000..f008aa0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogExportReqVO.class new file mode 100644 index 0000000..fcbbef5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.class new file mode 100644 index 0000000..a82b4a5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.class new file mode 100644 index 0000000..ac72b9c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/loginlog/LoginLogRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.class new file mode 100644 index 0000000..a8832ed Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.class new file mode 100644 index 0000000..ed0b346 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.class new file mode 100644 index 0000000..56e6ff6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.class new file mode 100644 index 0000000..962f7ae Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.class new file mode 100644 index 0000000..588bd37 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/MzdmController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/MzdmController.class new file mode 100644 index 0000000..027462b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/MzdmController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmBaseVO.class new file mode 100644 index 0000000..fd1e581 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmCreateReqVO.class new file mode 100644 index 0000000..a8e9ba4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmExcelVO.class new file mode 100644 index 0000000..28a01cf Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmExportReqVO.class new file mode 100644 index 0000000..96d7fed Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmPageReqVO.class new file mode 100644 index 0000000..8f223ac Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmRespVO.class new file mode 100644 index 0000000..7b4605b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmUpdateReqVO.class new file mode 100644 index 0000000..efb4d7a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzdm/vo/MzdmUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/MzjfController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/MzjfController.class new file mode 100644 index 0000000..97885d1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/MzjfController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfBaseVO.class new file mode 100644 index 0000000..7061d35 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfCreateReqVO.class new file mode 100644 index 0000000..c636656 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfExcelVO.class new file mode 100644 index 0000000..0a0305d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfExportReqVO.class new file mode 100644 index 0000000..e6486ca Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfPageReqVO.class new file mode 100644 index 0000000..1c2d0ad Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfRespVO.class new file mode 100644 index 0000000..a402c1e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfUpdateReqVO.class new file mode 100644 index 0000000..469568b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/mzjf/vo/MzjfUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/NoticeController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/NoticeController.class new file mode 100644 index 0000000..ca19780 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/NoticeController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeBaseVO.class new file mode 100644 index 0000000..e347305 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeCreateReqVO.class new file mode 100644 index 0000000..4eb1dfc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticePageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticePageReqVO.class new file mode 100644 index 0000000..3b27a1c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticePageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeRespVO.class new file mode 100644 index 0000000..24ccaa1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeUpdateReqVO.class new file mode 100644 index 0000000..4238ff7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/notice/vo/NoticeUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2ClientController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2ClientController.class new file mode 100644 index 0000000..8904528 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2ClientController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenController$1.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenController$1.class new file mode 100644 index 0000000..efb21ce Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenController$1.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenController.class new file mode 100644 index 0000000..b1db40d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2TokenController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2TokenController.class new file mode 100644 index 0000000..f385db3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2TokenController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2UserController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2UserController.class new file mode 100644 index 0000000..61272f7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2UserController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientBaseVO.class new file mode 100644 index 0000000..e2ea24a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientCreateReqVO.class new file mode 100644 index 0000000..5c940cd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientPageReqVO.class new file mode 100644 index 0000000..5939521 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientRespVO.class new file mode 100644 index 0000000..9c31656 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientUpdateReqVO.class new file mode 100644 index 0000000..ccbbce0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/client/OAuth2ClientUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.class new file mode 100644 index 0000000..8deea31 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAccessTokenRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO$Client.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO$Client.class new file mode 100644 index 0000000..5ae185a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO$Client.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.class new file mode 100644 index 0000000..3655ab8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenAuthorizeInfoRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.class new file mode 100644 index 0000000..66d0d99 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenPageReqVO.class new file mode 100644 index 0000000..ffd7f17 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenRespVO.class new file mode 100644 index 0000000..3fd9801 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/token/OAuth2AccessTokenRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO$Dept.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO$Dept.class new file mode 100644 index 0000000..94d0f0f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO$Dept.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO$Post.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO$Post.class new file mode 100644 index 0000000..8f34435 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO$Post.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO.class new file mode 100644 index 0000000..03923c2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserInfoRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserUpdateReqVO.class new file mode 100644 index 0000000..4b20007 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/oauth2/vo/user/OAuth2UserUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/OrderController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/OrderController.class new file mode 100644 index 0000000..23b7134 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/OrderController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderBaseVO.class new file mode 100644 index 0000000..67efc10 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderCreateReqVO.class new file mode 100644 index 0000000..6f751c9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderExcelVO.class new file mode 100644 index 0000000..bd7e3ed Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderExportReqVO.class new file mode 100644 index 0000000..b64115e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderPageReqVO.class new file mode 100644 index 0000000..657b5b5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderRespVO.class new file mode 100644 index 0000000..ae79765 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumExcelVO.class new file mode 100644 index 0000000..203162c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumPageReqVO.class new file mode 100644 index 0000000..5ac5d89 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumRespVO.class new file mode 100644 index 0000000..9a235d9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderSumRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderUpdateReqVO.class new file mode 100644 index 0000000..0391dac Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/order/vo/OrderUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/OrderViewController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/OrderViewController.class new file mode 100644 index 0000000..bd8381f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/OrderViewController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewBaseVO.class new file mode 100644 index 0000000..c0e1a37 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewCreateReqVO.class new file mode 100644 index 0000000..f7335ce Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewExcelVO.class new file mode 100644 index 0000000..848a2a2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewExportReqVO.class new file mode 100644 index 0000000..012d57e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewPageReqVO.class new file mode 100644 index 0000000..e5c6728 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewRespVO.class new file mode 100644 index 0000000..92e07e8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewUpdateReqVO.class new file mode 100644 index 0000000..2673ac4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/orderview/vo/OrderViewUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/MenuController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/MenuController.class new file mode 100644 index 0000000..d5c6cb0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/MenuController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/PermissionController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/PermissionController.class new file mode 100644 index 0000000..69be989 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/PermissionController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/RoleController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/RoleController.class new file mode 100644 index 0000000..bc9b7ab Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/RoleController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuBaseVO.class new file mode 100644 index 0000000..d736b48 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuCreateReqVO.class new file mode 100644 index 0000000..c38ffb2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuListReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuListReqVO.class new file mode 100644 index 0000000..12c93d1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuListReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuRespVO.class new file mode 100644 index 0000000..af41133 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.class new file mode 100644 index 0000000..f32af22 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuSimpleRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuUpdateReqVO.class new file mode 100644 index 0000000..b45c0c6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/menu/MenuUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.class new file mode 100644 index 0000000..d896771 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.class new file mode 100644 index 0000000..47175d5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleMenuReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.class new file mode 100644 index 0000000..f59b1ba Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/permission/PermissionAssignUserRoleReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleBaseVO.class new file mode 100644 index 0000000..16f97c8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleCreateReqVO.class new file mode 100644 index 0000000..657869e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleExcelVO.class new file mode 100644 index 0000000..32e08c0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleExportReqVO.class new file mode 100644 index 0000000..42ae34d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RolePageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RolePageReqVO.class new file mode 100644 index 0000000..43f5e60 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RolePageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleRespVO.class new file mode 100644 index 0000000..2a7ec42 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.class new file mode 100644 index 0000000..f8eb67c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleSimpleRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleUpdateReqVO.class new file mode 100644 index 0000000..815821e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.class new file mode 100644 index 0000000..2d4fcd7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/permission/vo/role/RoleUpdateStatusReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/RefundApplyController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/RefundApplyController.class new file mode 100644 index 0000000..2dd8035 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/RefundApplyController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyBaseVO.class new file mode 100644 index 0000000..a27e34c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyCreateReqVO.class new file mode 100644 index 0000000..c9e9be9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyExcelVO.class new file mode 100644 index 0000000..df9930c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyExportReqVO.class new file mode 100644 index 0000000..9a4a602 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyPageReqVO.class new file mode 100644 index 0000000..cb225b1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyRespVO.class new file mode 100644 index 0000000..01dbd3c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyUpdateReqVO.class new file mode 100644 index 0000000..51ef735 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/refundapply/vo/RefundApplyUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/Reserve8Controller.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/Reserve8Controller.class new file mode 100644 index 0000000..1bafa0b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/Reserve8Controller.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8BaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8BaseVO.class new file mode 100644 index 0000000..7434f39 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8BaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8CreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8CreateReqVO.class new file mode 100644 index 0000000..14c17c4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8CreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8ExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8ExcelVO.class new file mode 100644 index 0000000..6c3f68f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8ExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8ExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8ExportReqVO.class new file mode 100644 index 0000000..1ca0fdf Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8ExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8PageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8PageReqVO.class new file mode 100644 index 0000000..d7100e5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8PageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8RespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8RespVO.class new file mode 100644 index 0000000..7f40cc9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8RespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8UpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8UpdateReqVO.class new file mode 100644 index 0000000..12a248e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/reserve8/vo/Reserve8UpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/SensitiveWordController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/SensitiveWordController.class new file mode 100644 index 0000000..e01881c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/SensitiveWordController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordBaseVO.class new file mode 100644 index 0000000..f7e8a3f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordCreateReqVO.class new file mode 100644 index 0000000..6e97bd8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordExcelVO.class new file mode 100644 index 0000000..b70f916 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordExportReqVO.class new file mode 100644 index 0000000..bf13a86 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordPageReqVO.class new file mode 100644 index 0000000..54cb15d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordRespVO.class new file mode 100644 index 0000000..1e34300 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordUpdateReqVO.class new file mode 100644 index 0000000..ad6af5d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sensitiveword/vo/SensitiveWordUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/SmsCallbackController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/SmsCallbackController.class new file mode 100644 index 0000000..c50b6c9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/SmsCallbackController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/SmsChannelController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/SmsChannelController.class new file mode 100644 index 0000000..f1a5b0e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/SmsChannelController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/SmsLogController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/SmsLogController.class new file mode 100644 index 0000000..b070779 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/SmsLogController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/SmsTemplateController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/SmsTemplateController.class new file mode 100644 index 0000000..fa93e6e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/SmsTemplateController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelBaseVO.class new file mode 100644 index 0000000..a09978a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelCreateReqVO.class new file mode 100644 index 0000000..76eb950 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.class new file mode 100644 index 0000000..03a9e2b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.class new file mode 100644 index 0000000..147f10c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.class new file mode 100644 index 0000000..9b98353 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelSimpleRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelUpdateReqVO.class new file mode 100644 index 0000000..e536f79 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/channel/SmsChannelUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.class new file mode 100644 index 0000000..2a825ec Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.class new file mode 100644 index 0000000..9d112dc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.class new file mode 100644 index 0000000..a75c121 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogRespVO.class new file mode 100644 index 0000000..1228a0a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/log/SmsLogRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.class new file mode 100644 index 0000000..dc4ccdb Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateCreateReqVO.class new file mode 100644 index 0000000..097155d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.class new file mode 100644 index 0000000..4439148 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.class new file mode 100644 index 0000000..48a386b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.class new file mode 100644 index 0000000..8da7c42 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplatePageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.class new file mode 100644 index 0000000..b445f7f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.class new file mode 100644 index 0000000..8a75f6c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateSendReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateUpdateReqVO.class new file mode 100644 index 0000000..07bfc2c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/sms/vo/template/SmsTemplateUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/SocialUserController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/SocialUserController.class new file mode 100644 index 0000000..707594b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/SocialUserController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserBindReqVO$SocialUserBindReqVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserBindReqVO$SocialUserBindReqVOBuilder.class new file mode 100644 index 0000000..c47fca4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserBindReqVO$SocialUserBindReqVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserBindReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserBindReqVO.class new file mode 100644 index 0000000..ad0edb0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserBindReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserUnbindReqVO$SocialUserUnbindReqVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserUnbindReqVO$SocialUserUnbindReqVOBuilder.class new file mode 100644 index 0000000..6f915e8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserUnbindReqVO$SocialUserUnbindReqVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserUnbindReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserUnbindReqVO.class new file mode 100644 index 0000000..42d063c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/socail/vo/SocialUserUnbindReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/StudentController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/StudentController.class new file mode 100644 index 0000000..e2de236 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/StudentController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentBaseVO.class new file mode 100644 index 0000000..2497207 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentCreateReqVO.class new file mode 100644 index 0000000..7f0f3b1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelBaseVO$StudentExcelBaseVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelBaseVO$StudentExcelBaseVOBuilder.class new file mode 100644 index 0000000..9d74e65 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelBaseVO$StudentExcelBaseVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelBaseVO.class new file mode 100644 index 0000000..4df5c4e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelVO.class new file mode 100644 index 0000000..adc255e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExportReqVO.class new file mode 100644 index 0000000..d88f114 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportExcelVO$StudentImportExcelVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportExcelVO$StudentImportExcelVOBuilder.class new file mode 100644 index 0000000..2f6a88b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportExcelVO$StudentImportExcelVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportExcelVO.class new file mode 100644 index 0000000..899d264 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportRespVO$StudentImportRespVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportRespVO$StudentImportRespVOBuilder.class new file mode 100644 index 0000000..b6c5dd8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportRespVO$StudentImportRespVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportRespVO.class new file mode 100644 index 0000000..7e6fc38 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentImportRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageItemRespVO$Dept.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageItemRespVO$Dept.class new file mode 100644 index 0000000..47bf4d5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageItemRespVO$Dept.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageItemRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageItemRespVO.class new file mode 100644 index 0000000..3fa5ab1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageItemRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageReqVO.class new file mode 100644 index 0000000..7155871 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentRespVO.class new file mode 100644 index 0000000..dd6dea0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentUpdateReqVO.class new file mode 100644 index 0000000..3b641ab Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/student/vo/StudentUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/TenantController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/TenantController.class new file mode 100644 index 0000000..1ad7c95 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/TenantController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/TenantPackageController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/TenantPackageController.class new file mode 100644 index 0000000..3c97884 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/TenantPackageController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageBaseVO.class new file mode 100644 index 0000000..98a9dc6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageCreateReqVO.class new file mode 100644 index 0000000..1ff6fd1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackagePageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackagePageReqVO.class new file mode 100644 index 0000000..e6608a1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackagePageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageRespVO.class new file mode 100644 index 0000000..d086189 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageSimpleRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageSimpleRespVO.class new file mode 100644 index 0000000..735b982 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageSimpleRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageUpdateReqVO.class new file mode 100644 index 0000000..544f041 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/packages/TenantPackageUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantBaseVO.class new file mode 100644 index 0000000..715648b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantCreateReqVO.class new file mode 100644 index 0000000..61aa1c4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantExcelVO.class new file mode 100644 index 0000000..b1fb5ff Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantExportReqVO.class new file mode 100644 index 0000000..378f628 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.class new file mode 100644 index 0000000..d96a89b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.class new file mode 100644 index 0000000..3fe65af Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantUpdateReqVO.class new file mode 100644 index 0000000..9d5bf9b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/tenant/vo/tenant/TenantUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/UseCountController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/UseCountController.class new file mode 100644 index 0000000..fe8319b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/UseCountController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountBaseVO.class new file mode 100644 index 0000000..11ede4b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountCreateReqVO.class new file mode 100644 index 0000000..bf2be97 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountExcelVO.class new file mode 100644 index 0000000..215bb73 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountExportReqVO.class new file mode 100644 index 0000000..f4fe832 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountPageReqVO.class new file mode 100644 index 0000000..f7ef457 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountRespVO.class new file mode 100644 index 0000000..96635f9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountToDateRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountToDateRespVO.class new file mode 100644 index 0000000..0701fb0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountToDateRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountUpdateReqVO.class new file mode 100644 index 0000000..1ce3137 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usecount/vo/UseCountUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/UserController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/UserController.class new file mode 100644 index 0000000..13ce1b8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/UserController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/UserProfileController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/UserProfileController.class new file mode 100644 index 0000000..458da20 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/UserProfileController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO$Dept.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO$Dept.class new file mode 100644 index 0000000..798a8c3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO$Dept.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO$Post.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO$Post.class new file mode 100644 index 0000000..b53c116 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO$Post.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO$Role.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO$Role.class new file mode 100644 index 0000000..2b48465 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO$Role.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO$SocialUser.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO$SocialUser.class new file mode 100644 index 0000000..dcc35ed Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO$SocialUser.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO.class new file mode 100644 index 0000000..a458419 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.class new file mode 100644 index 0000000..4f43874 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileUpdatePasswordReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.class new file mode 100644 index 0000000..b884b79 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserBaseVO.class new file mode 100644 index 0000000..f898326 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserCreateReqVO.class new file mode 100644 index 0000000..053b8cc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserExcelVO.class new file mode 100644 index 0000000..411c545 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserExportReqVO.class new file mode 100644 index 0000000..3511203 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportExcelVO$UserImportExcelVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportExcelVO$UserImportExcelVOBuilder.class new file mode 100644 index 0000000..e3b7656 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportExcelVO$UserImportExcelVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportExcelVO.class new file mode 100644 index 0000000..09dab9c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportRespVO$UserImportRespVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportRespVO$UserImportRespVOBuilder.class new file mode 100644 index 0000000..2cbd00d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportRespVO$UserImportRespVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportRespVO.class new file mode 100644 index 0000000..e921f78 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserImportRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageItemRespVO$Dept.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageItemRespVO$Dept.class new file mode 100644 index 0000000..d5387ef Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageItemRespVO$Dept.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageItemRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageItemRespVO.class new file mode 100644 index 0000000..3631163 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageItemRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageReqVO.class new file mode 100644 index 0000000..220f311 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserRespVO.class new file mode 100644 index 0000000..70c192c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserSimpleRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserSimpleRespVO.class new file mode 100644 index 0000000..2916818 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserSimpleRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.class new file mode 100644 index 0000000..9407d36 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdatePasswordReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdateReqVO.class new file mode 100644 index 0000000..f769c54 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.class new file mode 100644 index 0000000..68181d8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/user/vo/user/UserUpdateStatusReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/UsersXqController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/UsersXqController.class new file mode 100644 index 0000000..7e5289e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/UsersXqController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqBaseVO.class new file mode 100644 index 0000000..c606505 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqCreateReqVO.class new file mode 100644 index 0000000..bdec0bd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqExcelVO.class new file mode 100644 index 0000000..1691ba7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqExportReqVO.class new file mode 100644 index 0000000..e978c77 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqPageReqVO.class new file mode 100644 index 0000000..3f52862 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqRespVO.class new file mode 100644 index 0000000..dc1aca6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqUpdateReqVO.class new file mode 100644 index 0000000..6cfd2a5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/usersxq/vo/UsersXqUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/WqController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/WqController.class new file mode 100644 index 0000000..9a077e4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/WqController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqBaseVO.class new file mode 100644 index 0000000..29dea60 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqCreateReqVO.class new file mode 100644 index 0000000..b46df2f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqExcelVO.class new file mode 100644 index 0000000..e1ca4f2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqExportReqVO.class new file mode 100644 index 0000000..128c36a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqPageReqVO.class new file mode 100644 index 0000000..7f2a44f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqRespVO.class new file mode 100644 index 0000000..51373d8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqUpdateReqVO.class new file mode 100644 index 0000000..60e9ea6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wq/vo/WqUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/WqdaController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/WqdaController.class new file mode 100644 index 0000000..3f30318 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/WqdaController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqSumReqVo.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqSumReqVo.class new file mode 100644 index 0000000..4cdae6f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqSumReqVo.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaBaseVO.class new file mode 100644 index 0000000..29bc15b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaCreateReqVO.class new file mode 100644 index 0000000..10f8266 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaExcelVO.class new file mode 100644 index 0000000..02023eb Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaExportReqVO.class new file mode 100644 index 0000000..8f8b47c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaPageReqVO.class new file mode 100644 index 0000000..bdfe84f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaRespVO.class new file mode 100644 index 0000000..5392e67 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaUpdateReqVO.class new file mode 100644 index 0000000..b21aed7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqda/vo/WqdaUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/WqdaViewController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/WqdaViewController.class new file mode 100644 index 0000000..c6f505b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/WqdaViewController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewBaseVO.class new file mode 100644 index 0000000..2245f53 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewCreateReqVO.class new file mode 100644 index 0000000..c24725f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExcel01VO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExcel01VO.class new file mode 100644 index 0000000..2949244 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExcel01VO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExcelVO.class new file mode 100644 index 0000000..7c91825 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExportReqVO.class new file mode 100644 index 0000000..3179c7f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewPageReqVO.class new file mode 100644 index 0000000..43e9f99 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewRespVO.class new file mode 100644 index 0000000..9b70828 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewUpdateReqVO.class new file mode 100644 index 0000000..0481810 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqdaview/vo/WqdaViewUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/WqwtController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/WqwtController.class new file mode 100644 index 0000000..e2a1642 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/WqwtController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtBaseVO.class new file mode 100644 index 0000000..e28db22 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtCreateReqVO.class new file mode 100644 index 0000000..c651a68 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtExcelVO.class new file mode 100644 index 0000000..0ad25f5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtExportReqVO.class new file mode 100644 index 0000000..4c23f11 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtPageReqVO.class new file mode 100644 index 0000000..726e269 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtRespVO.class new file mode 100644 index 0000000..41ecf53 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtUpdateReqVO.class new file mode 100644 index 0000000..5ccbb3d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/wqwt/vo/WqwtUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainBaseVO.class new file mode 100644 index 0000000..7cc58aa Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainCreateReqVO.class new file mode 100644 index 0000000..46194d2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainExcelVO.class new file mode 100644 index 0000000..ae2f960 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainExportReqVO.class new file mode 100644 index 0000000..8f0b7ba Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageItemRespVO$Dept.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageItemRespVO$Dept.class new file mode 100644 index 0000000..341c2b6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageItemRespVO$Dept.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageItemRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageItemRespVO.class new file mode 100644 index 0000000..9255194 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageItemRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageReqVO.class new file mode 100644 index 0000000..83d101d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainRespVO.class new file mode 100644 index 0000000..88350c5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainUpdateReqVO.class new file mode 100644 index 0000000..0d9ee85 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/vo/xyMainUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/xyMainController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/xyMainController.class new file mode 100644 index 0000000..bd17b58 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xymain/xyMainController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/XyrwController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/XyrwController.class new file mode 100644 index 0000000..01a4e35 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/XyrwController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwBaseVO.class new file mode 100644 index 0000000..9c25886 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwCreateReqVO.class new file mode 100644 index 0000000..f9798bc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwExcelVO.class new file mode 100644 index 0000000..890048f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwExportReqVO.class new file mode 100644 index 0000000..e22f871 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwPageReqVO.class new file mode 100644 index 0000000..3ffccbb Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwRespVO.class new file mode 100644 index 0000000..e4b4e02 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwUpdateReqVO.class new file mode 100644 index 0000000..d7cf13c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xyrw/vo/XyrwUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/XytjjgController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/XytjjgController.class new file mode 100644 index 0000000..f48b636 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/XytjjgController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgBaseVO.class new file mode 100644 index 0000000..9965821 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgCreateReqVO.class new file mode 100644 index 0000000..0e6ecce Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgExcelVO.class new file mode 100644 index 0000000..39fe056 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgExportReqVO.class new file mode 100644 index 0000000..108c4eb Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgHisItems.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgHisItems.class new file mode 100644 index 0000000..70e97ee Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgHisItems.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgPageReqVO.class new file mode 100644 index 0000000..e0230b1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgRespVO.class new file mode 100644 index 0000000..150dbb5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgUpdateReqVO.class new file mode 100644 index 0000000..4a2855a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/admin/xytjjg/vo/XytjjgUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/AppAuthController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/AppAuthController.class new file mode 100644 index 0000000..107abf1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/AppAuthController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginReqVO$AppAuthLoginReqVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginReqVO$AppAuthLoginReqVOBuilder.class new file mode 100644 index 0000000..55ac745 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginReqVO$AppAuthLoginReqVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginReqVO.class new file mode 100644 index 0000000..f7737a7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginRespVO$AppAuthLoginRespVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginRespVO$AppAuthLoginRespVOBuilder.class new file mode 100644 index 0000000..d49d5d4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginRespVO$AppAuthLoginRespVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginRespVO.class new file mode 100644 index 0000000..e7c2058 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthLoginRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthSocialLoginReqVO$AppAuthSocialLoginReqVOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthSocialLoginReqVO$AppAuthSocialLoginReqVOBuilder.class new file mode 100644 index 0000000..c7e18ed Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthSocialLoginReqVO$AppAuthSocialLoginReqVOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthSocialLoginReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthSocialLoginReqVO.class new file mode 100644 index 0000000..a1cf348 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/auth/vo/AppAuthSocialLoginReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/carousel/AppCarouselController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/carousel/AppCarouselController.class new file mode 100644 index 0000000..7079764 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/carousel/AppCarouselController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/dict/AppDictDataController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/dict/AppDictDataController.class new file mode 100644 index 0000000..18bec09 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/dict/AppDictDataController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/AppUserInfoController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/AppUserInfoController.class new file mode 100644 index 0000000..db71da5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/AppUserInfoController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoBaseVO.class new file mode 100644 index 0000000..d21a943 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoCreateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoCreateReqVO.class new file mode 100644 index 0000000..d93faa5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoCreateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoExcelVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoExcelVO.class new file mode 100644 index 0000000..a695ffd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoExcelVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoExportReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoExportReqVO.class new file mode 100644 index 0000000..c05553f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoExportReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoPageReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoPageReqVO.class new file mode 100644 index 0000000..ab94331 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoPageReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoRespVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoRespVO.class new file mode 100644 index 0000000..dd9e7e3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoRespVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoUpdateReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoUpdateReqVO.class new file mode 100644 index 0000000..da17b66 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/userinfo/vo/AppUserInfoUpdateReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/AppDeptInfoController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/AppDeptInfoController.class new file mode 100644 index 0000000..dc6d2be Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/AppDeptInfoController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/AppPayOrderController.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/AppPayOrderController.class new file mode 100644 index 0000000..025ba27 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/AppPayOrderController.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/StatusDefine.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/StatusDefine.class new file mode 100644 index 0000000..1a4c276 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/StatusDefine.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/DeptXqtjBaseVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/DeptXqtjBaseVO.class new file mode 100644 index 0000000..90f8726 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/DeptXqtjBaseVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/DeptXqtjListReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/DeptXqtjListReqVO.class new file mode 100644 index 0000000..af9a34c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/DeptXqtjListReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeInfoDetailVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeInfoDetailVO.class new file mode 100644 index 0000000..787d7f8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeInfoDetailVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeInfoVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeInfoVO.class new file mode 100644 index 0000000..c6202a4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeInfoVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeListVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeListVO.class new file mode 100644 index 0000000..b939735 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeListVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeUpdateVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeUpdateVO.class new file mode 100644 index 0000000..1d596fc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/FeeUpdateVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/ItemListReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/ItemListReqVO.class new file mode 100644 index 0000000..b917f81 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/ItemListReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/XyrwListReqVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/XyrwListReqVO.class new file mode 100644 index 0000000..ce359ad Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/XyrwListReqVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/studentJfListVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/studentJfListVO.class new file mode 100644 index 0000000..2b20d31 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/studentJfListVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/xyMainOrderVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/xyMainOrderVO.class new file mode 100644 index 0000000..09d9c56 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/xyMainOrderVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/xyMainUpdateByOpenidVO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/xyMainUpdateByOpenidVO.class new file mode 100644 index 0000000..8cffc12 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/controller/app/xytjinfo/vo/xyMainUpdateByOpenidVO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/AuthConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/AuthConvert.class new file mode 100644 index 0000000..599a999 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/AuthConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/AuthConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/AuthConvertImpl.class new file mode 100644 index 0000000..3dd5a09 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/AuthConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/AuthGzConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/AuthGzConvert.class new file mode 100644 index 0000000..ded57af Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/AuthGzConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/AuthGzConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/AuthGzConvertImpl.class new file mode 100644 index 0000000..d003d72 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/AuthGzConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/OAuth2ClientConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/OAuth2ClientConvert.class new file mode 100644 index 0000000..a64dc9d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/OAuth2ClientConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/OAuth2ClientConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/OAuth2ClientConvertImpl.class new file mode 100644 index 0000000..b58d635 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/OAuth2ClientConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/OAuth2TokenConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/OAuth2TokenConvert.class new file mode 100644 index 0000000..3fb94b7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/OAuth2TokenConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/OAuth2TokenConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/OAuth2TokenConvertImpl.class new file mode 100644 index 0000000..ca8cb04 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/auth/OAuth2TokenConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/building/BuildingConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/building/BuildingConvert.class new file mode 100644 index 0000000..bbb5e44 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/building/BuildingConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/building/BuildingConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/building/BuildingConvertImpl.class new file mode 100644 index 0000000..bb754f5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/building/BuildingConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/carousel/CarouselConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/carousel/CarouselConvert.class new file mode 100644 index 0000000..ed6b67c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/carousel/CarouselConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/carousel/CarouselConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/carousel/CarouselConvertImpl.class new file mode 100644 index 0000000..2d72dcd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/carousel/CarouselConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/childitem/ChilditemConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/childitem/ChilditemConvert.class new file mode 100644 index 0000000..6ff1fc7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/childitem/ChilditemConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/childitem/ChilditemConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/childitem/ChilditemConvertImpl.class new file mode 100644 index 0000000..1ce3334 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/childitem/ChilditemConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/common/CaptchaConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/common/CaptchaConvert.class new file mode 100644 index 0000000..225ccab Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/common/CaptchaConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/common/CaptchaConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/common/CaptchaConvertImpl.class new file mode 100644 index 0000000..267d167 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/common/CaptchaConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dept/DeptConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dept/DeptConvert.class new file mode 100644 index 0000000..2177487 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dept/DeptConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dept/DeptConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dept/DeptConvertImpl.class new file mode 100644 index 0000000..fe00554 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dept/DeptConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dept/PostConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dept/PostConvert.class new file mode 100644 index 0000000..a1369be Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dept/PostConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dept/PostConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dept/PostConvertImpl.class new file mode 100644 index 0000000..dd6a784 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dept/PostConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/deptxq/DeptXqConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/deptxq/DeptXqConvert.class new file mode 100644 index 0000000..9502a42 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/deptxq/DeptXqConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/deptxq/DeptXqConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/deptxq/DeptXqConvertImpl.class new file mode 100644 index 0000000..7b00dbc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/deptxq/DeptXqConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dict/DictDataConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dict/DictDataConvert.class new file mode 100644 index 0000000..e0316ce Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dict/DictDataConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dict/DictDataConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dict/DictDataConvertImpl.class new file mode 100644 index 0000000..18bf529 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dict/DictDataConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dict/DictTypeConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dict/DictTypeConvert.class new file mode 100644 index 0000000..072c896 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dict/DictTypeConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dict/DictTypeConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dict/DictTypeConvertImpl.class new file mode 100644 index 0000000..314fb68 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dict/DictTypeConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/doctor/DoctorConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/doctor/DoctorConvert.class new file mode 100644 index 0000000..d56248d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/doctor/DoctorConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/doctor/DoctorConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/doctor/DoctorConvertImpl.class new file mode 100644 index 0000000..4d71aec Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/doctor/DoctorConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dzquestion/DzQuestionConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dzquestion/DzQuestionConvert.class new file mode 100644 index 0000000..7435063 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dzquestion/DzQuestionConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dzquestion/DzQuestionConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dzquestion/DzQuestionConvertImpl.class new file mode 100644 index 0000000..25a5b56 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dzquestion/DzQuestionConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dztype/DzTypeConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dztype/DzTypeConvert.class new file mode 100644 index 0000000..69cca4b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dztype/DzTypeConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dztype/DzTypeConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dztype/DzTypeConvertImpl.class new file mode 100644 index 0000000..bd2db5e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/dztype/DzTypeConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/errorcode/ErrorCodeConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/errorcode/ErrorCodeConvert.class new file mode 100644 index 0000000..c36eadd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/errorcode/ErrorCodeConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/errorcode/ErrorCodeConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/errorcode/ErrorCodeConvertImpl.class new file mode 100644 index 0000000..47da2e8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/errorcode/ErrorCodeConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/hospital/HospitalConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/hospital/HospitalConvert.class new file mode 100644 index 0000000..42ab86b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/hospital/HospitalConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/hospital/HospitalConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/hospital/HospitalConvertImpl.class new file mode 100644 index 0000000..56dc8c7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/hospital/HospitalConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/information/InformationConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/information/InformationConvert.class new file mode 100644 index 0000000..b849cbb Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/information/InformationConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/information/InformationConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/information/InformationConvertImpl.class new file mode 100644 index 0000000..723fe10 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/information/InformationConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/item/ItemConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/item/ItemConvert.class new file mode 100644 index 0000000..cad0ba0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/item/ItemConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/item/ItemConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/item/ItemConvertImpl.class new file mode 100644 index 0000000..3e72761 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/item/ItemConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/ksinfo/KsInfoConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/ksinfo/KsInfoConvert.class new file mode 100644 index 0000000..6a2a6fc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/ksinfo/KsInfoConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/ksinfo/KsInfoConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/ksinfo/KsInfoConvertImpl.class new file mode 100644 index 0000000..cd1db51 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/ksinfo/KsInfoConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/kstype/KsTypeConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/kstype/KsTypeConvert.class new file mode 100644 index 0000000..6928ff3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/kstype/KsTypeConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/kstype/KsTypeConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/kstype/KsTypeConvertImpl.class new file mode 100644 index 0000000..8994815 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/kstype/KsTypeConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/label/LabelConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/label/LabelConvert.class new file mode 100644 index 0000000..d6f9d0f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/label/LabelConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/label/LabelConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/label/LabelConvertImpl.class new file mode 100644 index 0000000..adebb7d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/label/LabelConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/logger/LoginLogConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/logger/LoginLogConvert.class new file mode 100644 index 0000000..0418eaf Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/logger/LoginLogConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/logger/LoginLogConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/logger/LoginLogConvertImpl.class new file mode 100644 index 0000000..ec14f2e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/logger/LoginLogConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/logger/OperateLogConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/logger/OperateLogConvert.class new file mode 100644 index 0000000..1d103eb Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/logger/OperateLogConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/logger/OperateLogConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/logger/OperateLogConvertImpl.class new file mode 100644 index 0000000..cd9f576 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/logger/OperateLogConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/mzdm/MzdmConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/mzdm/MzdmConvert.class new file mode 100644 index 0000000..70cc293 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/mzdm/MzdmConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/mzdm/MzdmConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/mzdm/MzdmConvertImpl.class new file mode 100644 index 0000000..e0eba75 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/mzdm/MzdmConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/mzjf/MzjfConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/mzjf/MzjfConvert.class new file mode 100644 index 0000000..4584f35 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/mzjf/MzjfConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/mzjf/MzjfConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/mzjf/MzjfConvertImpl.class new file mode 100644 index 0000000..2a3c9dd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/mzjf/MzjfConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/notice/NoticeConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/notice/NoticeConvert.class new file mode 100644 index 0000000..8ec78b1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/notice/NoticeConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/notice/NoticeConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/notice/NoticeConvertImpl.class new file mode 100644 index 0000000..f1452a7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/notice/NoticeConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/oauth2/OAuth2OpenConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/oauth2/OAuth2OpenConvert.class new file mode 100644 index 0000000..5075ab4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/oauth2/OAuth2OpenConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/oauth2/OAuth2OpenConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/oauth2/OAuth2OpenConvertImpl.class new file mode 100644 index 0000000..e327ef6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/oauth2/OAuth2OpenConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/oauth2/OAuth2UserConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/oauth2/OAuth2UserConvert.class new file mode 100644 index 0000000..5f36139 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/oauth2/OAuth2UserConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/oauth2/OAuth2UserConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/oauth2/OAuth2UserConvertImpl.class new file mode 100644 index 0000000..7e89b05 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/oauth2/OAuth2UserConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/order/OrderConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/order/OrderConvert.class new file mode 100644 index 0000000..18c7ded Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/order/OrderConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/order/OrderConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/order/OrderConvertImpl.class new file mode 100644 index 0000000..f001b81 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/order/OrderConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/orderview/OrderViewConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/orderview/OrderViewConvert.class new file mode 100644 index 0000000..c57ba92 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/orderview/OrderViewConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/orderview/OrderViewConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/orderview/OrderViewConvertImpl.class new file mode 100644 index 0000000..627da73 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/orderview/OrderViewConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/permission/MenuConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/permission/MenuConvert.class new file mode 100644 index 0000000..61cd5bc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/permission/MenuConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/permission/MenuConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/permission/MenuConvertImpl.class new file mode 100644 index 0000000..a36cb0f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/permission/MenuConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/permission/RoleConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/permission/RoleConvert.class new file mode 100644 index 0000000..c2efe48 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/permission/RoleConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/permission/RoleConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/permission/RoleConvertImpl.class new file mode 100644 index 0000000..80cb05f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/permission/RoleConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/refundapply/RefundApplyConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/refundapply/RefundApplyConvert.class new file mode 100644 index 0000000..9f37756 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/refundapply/RefundApplyConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/refundapply/RefundApplyConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/refundapply/RefundApplyConvertImpl.class new file mode 100644 index 0000000..52f4e08 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/refundapply/RefundApplyConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/reserve8/Reserve8Convert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/reserve8/Reserve8Convert.class new file mode 100644 index 0000000..a923d57 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/reserve8/Reserve8Convert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/reserve8/Reserve8ConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/reserve8/Reserve8ConvertImpl.class new file mode 100644 index 0000000..bfdff5c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/reserve8/Reserve8ConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sensitiveword/SensitiveWordConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sensitiveword/SensitiveWordConvert.class new file mode 100644 index 0000000..a4ca384 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sensitiveword/SensitiveWordConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sensitiveword/SensitiveWordConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sensitiveword/SensitiveWordConvertImpl.class new file mode 100644 index 0000000..ee7b5e4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sensitiveword/SensitiveWordConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsChannelConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsChannelConvert.class new file mode 100644 index 0000000..e0647ce Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsChannelConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsChannelConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsChannelConvertImpl.class new file mode 100644 index 0000000..9d5a159 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsChannelConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsLogConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsLogConvert.class new file mode 100644 index 0000000..60194db Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsLogConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsLogConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsLogConvertImpl.class new file mode 100644 index 0000000..b02bcc7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsLogConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsTemplateConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsTemplateConvert.class new file mode 100644 index 0000000..a83fca4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsTemplateConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsTemplateConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsTemplateConvertImpl.class new file mode 100644 index 0000000..b72bfa3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/sms/SmsTemplateConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/social/SocialUserConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/social/SocialUserConvert.class new file mode 100644 index 0000000..767768c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/social/SocialUserConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/social/SocialUserConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/social/SocialUserConvertImpl.class new file mode 100644 index 0000000..5319c68 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/social/SocialUserConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/student/StudentConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/student/StudentConvert.class new file mode 100644 index 0000000..474658a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/student/StudentConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/student/StudentConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/student/StudentConvertImpl.class new file mode 100644 index 0000000..f7da193 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/student/StudentConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/tenant/TenantConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/tenant/TenantConvert.class new file mode 100644 index 0000000..3119fd4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/tenant/TenantConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/tenant/TenantConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/tenant/TenantConvertImpl.class new file mode 100644 index 0000000..d288412 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/tenant/TenantConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/tenant/TenantPackageConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/tenant/TenantPackageConvert.class new file mode 100644 index 0000000..3aff95b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/tenant/TenantPackageConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/tenant/TenantPackageConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/tenant/TenantPackageConvertImpl.class new file mode 100644 index 0000000..e3a45b6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/tenant/TenantPackageConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/usecount/UseCountConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/usecount/UseCountConvert.class new file mode 100644 index 0000000..d44a8ad Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/usecount/UseCountConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/usecount/UseCountConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/usecount/UseCountConvertImpl.class new file mode 100644 index 0000000..c03b178 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/usecount/UseCountConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/user/UserConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/user/UserConvert.class new file mode 100644 index 0000000..3ed2468 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/user/UserConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/user/UserConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/user/UserConvertImpl.class new file mode 100644 index 0000000..c218dd2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/user/UserConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/userinfo/UserInfoConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/userinfo/UserInfoConvert.class new file mode 100644 index 0000000..f8d782c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/userinfo/UserInfoConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/userinfo/UserInfoConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/userinfo/UserInfoConvertImpl.class new file mode 100644 index 0000000..1cdebea Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/userinfo/UserInfoConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/usersxq/UsersXqConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/usersxq/UsersXqConvert.class new file mode 100644 index 0000000..c8566d5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/usersxq/UsersXqConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/usersxq/UsersXqConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/usersxq/UsersXqConvertImpl.class new file mode 100644 index 0000000..cdc8432 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/usersxq/UsersXqConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wq/WqConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wq/WqConvert.class new file mode 100644 index 0000000..4b57eba Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wq/WqConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wq/WqConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wq/WqConvertImpl.class new file mode 100644 index 0000000..5b3edd6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wq/WqConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqda/WqdaConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqda/WqdaConvert.class new file mode 100644 index 0000000..ef7d998 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqda/WqdaConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqda/WqdaConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqda/WqdaConvertImpl.class new file mode 100644 index 0000000..7a7a61e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqda/WqdaConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqdaview/WqdaViewConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqdaview/WqdaViewConvert.class new file mode 100644 index 0000000..8e6e836 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqdaview/WqdaViewConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqdaview/WqdaViewConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqdaview/WqdaViewConvertImpl.class new file mode 100644 index 0000000..673b08e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqdaview/WqdaViewConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqwt/WqwtConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqwt/WqwtConvert.class new file mode 100644 index 0000000..0d3244c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqwt/WqwtConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqwt/WqwtConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqwt/WqwtConvertImpl.class new file mode 100644 index 0000000..b68bf41 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/wqwt/WqwtConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xymain/xyMainConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xymain/xyMainConvert.class new file mode 100644 index 0000000..a55ca84 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xymain/xyMainConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xymain/xyMainConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xymain/xyMainConvertImpl.class new file mode 100644 index 0000000..2d9c0d2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xymain/xyMainConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xyrw/XyrwConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xyrw/XyrwConvert.class new file mode 100644 index 0000000..49ac9bd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xyrw/XyrwConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xyrw/XyrwConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xyrw/XyrwConvertImpl.class new file mode 100644 index 0000000..dd782a1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xyrw/XyrwConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xytjjg/XytjjgConvert.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xytjjg/XytjjgConvert.class new file mode 100644 index 0000000..c8c0f9f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xytjjg/XytjjgConvert.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xytjjg/XytjjgConvertImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xytjjg/XytjjgConvertImpl.class new file mode 100644 index 0000000..70bf733 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/convert/xytjjg/XytjjgConvertImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/building/BuildingDO$BuildingDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/building/BuildingDO$BuildingDOBuilder.class new file mode 100644 index 0000000..48dd5b6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/building/BuildingDO$BuildingDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/building/BuildingDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/building/BuildingDO.class new file mode 100644 index 0000000..9d6ba53 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/building/BuildingDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/carousel/CarouselDO$CarouselDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/carousel/CarouselDO$CarouselDOBuilder.class new file mode 100644 index 0000000..378748f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/carousel/CarouselDO$CarouselDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/carousel/CarouselDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/carousel/CarouselDO.class new file mode 100644 index 0000000..89b2a55 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/carousel/CarouselDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/childitem/ChilditemDO$ChilditemDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/childitem/ChilditemDO$ChilditemDOBuilder.class new file mode 100644 index 0000000..68149ef Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/childitem/ChilditemDO$ChilditemDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/childitem/ChilditemDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/childitem/ChilditemDO.class new file mode 100644 index 0000000..37167fe Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/childitem/ChilditemDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dept/DeptDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dept/DeptDO.class new file mode 100644 index 0000000..c2b3ea8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dept/DeptDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dept/PostDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dept/PostDO.class new file mode 100644 index 0000000..6017c43 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dept/PostDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dept/UserPostDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dept/UserPostDO.class new file mode 100644 index 0000000..4931087 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dept/UserPostDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/deptxq/DeptXqDO$DeptXqDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/deptxq/DeptXqDO$DeptXqDOBuilder.class new file mode 100644 index 0000000..83a0c33 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/deptxq/DeptXqDO$DeptXqDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/deptxq/DeptXqDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/deptxq/DeptXqDO.class new file mode 100644 index 0000000..79e6840 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/deptxq/DeptXqDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dict/DictDataDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dict/DictDataDO.class new file mode 100644 index 0000000..cd1b4c5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dict/DictDataDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dict/DictTypeDO$DictTypeDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dict/DictTypeDO$DictTypeDOBuilder.class new file mode 100644 index 0000000..9e8af46 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dict/DictTypeDO$DictTypeDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dict/DictTypeDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dict/DictTypeDO.class new file mode 100644 index 0000000..7f973ae Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dict/DictTypeDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/doctor/DoctorDO$DoctorDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/doctor/DoctorDO$DoctorDOBuilder.class new file mode 100644 index 0000000..04848ba Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/doctor/DoctorDO$DoctorDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/doctor/DoctorDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/doctor/DoctorDO.class new file mode 100644 index 0000000..30a55c1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/doctor/DoctorDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dzquestion/DzQuestionDO$DzQuestionDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dzquestion/DzQuestionDO$DzQuestionDOBuilder.class new file mode 100644 index 0000000..cfefd7b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dzquestion/DzQuestionDO$DzQuestionDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dzquestion/DzQuestionDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dzquestion/DzQuestionDO.class new file mode 100644 index 0000000..293fc0d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dzquestion/DzQuestionDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dztype/DzTypeDO$DzTypeDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dztype/DzTypeDO$DzTypeDOBuilder.class new file mode 100644 index 0000000..36c7557 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dztype/DzTypeDO$DzTypeDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dztype/DzTypeDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dztype/DzTypeDO.class new file mode 100644 index 0000000..725f24e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/dztype/DzTypeDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/errorcode/ErrorCodeDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/errorcode/ErrorCodeDO.class new file mode 100644 index 0000000..d9d1c6c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/errorcode/ErrorCodeDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/hospital/HospitalDO$HospitalDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/hospital/HospitalDO$HospitalDOBuilder.class new file mode 100644 index 0000000..945b995 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/hospital/HospitalDO$HospitalDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/hospital/HospitalDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/hospital/HospitalDO.class new file mode 100644 index 0000000..c2de777 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/hospital/HospitalDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/information/InformationDO$InformationDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/information/InformationDO$InformationDOBuilder.class new file mode 100644 index 0000000..57169af Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/information/InformationDO$InformationDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/information/InformationDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/information/InformationDO.class new file mode 100644 index 0000000..9e289cd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/information/InformationDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/item/ItemDO$ItemDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/item/ItemDO$ItemDOBuilder.class new file mode 100644 index 0000000..442b816 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/item/ItemDO$ItemDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/item/ItemDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/item/ItemDO.class new file mode 100644 index 0000000..21f089d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/item/ItemDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/ksinfo/KsInfoDO$KsInfoDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/ksinfo/KsInfoDO$KsInfoDOBuilder.class new file mode 100644 index 0000000..adb7e69 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/ksinfo/KsInfoDO$KsInfoDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/ksinfo/KsInfoDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/ksinfo/KsInfoDO.class new file mode 100644 index 0000000..1b95a87 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/ksinfo/KsInfoDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/kstype/KsTypeDO$KsTypeDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/kstype/KsTypeDO$KsTypeDOBuilder.class new file mode 100644 index 0000000..f36af0e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/kstype/KsTypeDO$KsTypeDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/kstype/KsTypeDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/kstype/KsTypeDO.class new file mode 100644 index 0000000..258a79f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/kstype/KsTypeDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/label/LabelDO$LabelDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/label/LabelDO$LabelDOBuilder.class new file mode 100644 index 0000000..73c91e8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/label/LabelDO$LabelDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/label/LabelDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/label/LabelDO.class new file mode 100644 index 0000000..3630d1c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/label/LabelDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/logger/LoginLogDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/logger/LoginLogDO.class new file mode 100644 index 0000000..1b6970e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/logger/LoginLogDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/logger/OperateLogDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/logger/OperateLogDO.class new file mode 100644 index 0000000..626b7db Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/logger/OperateLogDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/mzdm/MzdmDO$MzdmDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/mzdm/MzdmDO$MzdmDOBuilder.class new file mode 100644 index 0000000..fdfd1df Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/mzdm/MzdmDO$MzdmDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/mzdm/MzdmDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/mzdm/MzdmDO.class new file mode 100644 index 0000000..d1eac37 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/mzdm/MzdmDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/mzjf/MzjfDO$MzjfDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/mzjf/MzjfDO$MzjfDOBuilder.class new file mode 100644 index 0000000..40dae87 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/mzjf/MzjfDO$MzjfDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/mzjf/MzjfDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/mzjf/MzjfDO.class new file mode 100644 index 0000000..cb9ea89 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/mzjf/MzjfDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/notice/NoticeDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/notice/NoticeDO.class new file mode 100644 index 0000000..55aecdd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/notice/NoticeDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.class new file mode 100644 index 0000000..b2d8e8f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2AccessTokenDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.class new file mode 100644 index 0000000..d98bfe1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2ApproveDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2ClientDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2ClientDO.class new file mode 100644 index 0000000..4866e58 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2ClientDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2CodeDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2CodeDO.class new file mode 100644 index 0000000..3bd0a45 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2CodeDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.class new file mode 100644 index 0000000..8095b12 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/order/OrderDO$OrderDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/order/OrderDO$OrderDOBuilder.class new file mode 100644 index 0000000..3f55c83 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/order/OrderDO$OrderDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/order/OrderDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/order/OrderDO.class new file mode 100644 index 0000000..3b10016 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/order/OrderDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/orderview/OrderViewDO$OrderViewDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/orderview/OrderViewDO$OrderViewDOBuilder.class new file mode 100644 index 0000000..25afde2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/orderview/OrderViewDO$OrderViewDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/orderview/OrderViewDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/orderview/OrderViewDO.class new file mode 100644 index 0000000..c5ed828 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/orderview/OrderViewDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/permission/MenuDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/permission/MenuDO.class new file mode 100644 index 0000000..b221434 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/permission/MenuDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/permission/RoleDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/permission/RoleDO.class new file mode 100644 index 0000000..ee7bbc8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/permission/RoleDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/permission/RoleMenuDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/permission/RoleMenuDO.class new file mode 100644 index 0000000..48426bd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/permission/RoleMenuDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/permission/UserRoleDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/permission/UserRoleDO.class new file mode 100644 index 0000000..0d68f7c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/permission/UserRoleDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/refundapply/RefundApplyDO$RefundApplyDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/refundapply/RefundApplyDO$RefundApplyDOBuilder.class new file mode 100644 index 0000000..18e3747 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/refundapply/RefundApplyDO$RefundApplyDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/refundapply/RefundApplyDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/refundapply/RefundApplyDO.class new file mode 100644 index 0000000..0496dd8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/refundapply/RefundApplyDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/reserve8/Reserve8DO$Reserve8DOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/reserve8/Reserve8DO$Reserve8DOBuilder.class new file mode 100644 index 0000000..908e31a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/reserve8/Reserve8DO$Reserve8DOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/reserve8/Reserve8DO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/reserve8/Reserve8DO.class new file mode 100644 index 0000000..dc3e817 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/reserve8/Reserve8DO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sensitiveword/SensitiveWordDO$SensitiveWordDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sensitiveword/SensitiveWordDO$SensitiveWordDOBuilder.class new file mode 100644 index 0000000..f104c11 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sensitiveword/SensitiveWordDO$SensitiveWordDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.class new file mode 100644 index 0000000..2330ff1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sensitiveword/SensitiveWordDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsChannelDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsChannelDO.class new file mode 100644 index 0000000..6e1005d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsChannelDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsCodeDO$SmsCodeDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsCodeDO$SmsCodeDOBuilder.class new file mode 100644 index 0000000..287c28e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsCodeDO$SmsCodeDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsCodeDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsCodeDO.class new file mode 100644 index 0000000..0a4c4d0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsCodeDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsLogDO$SmsLogDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsLogDO$SmsLogDOBuilder.class new file mode 100644 index 0000000..bca21d5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsLogDO$SmsLogDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsLogDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsLogDO.class new file mode 100644 index 0000000..474b093 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsLogDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsTemplateDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsTemplateDO.class new file mode 100644 index 0000000..2effbbc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/sms/SmsTemplateDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserBindDO$SocialUserBindDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserBindDO$SocialUserBindDOBuilder.class new file mode 100644 index 0000000..c09039c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserBindDO$SocialUserBindDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserBindDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserBindDO.class new file mode 100644 index 0000000..f455ac7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserBindDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserDO$SocialUserDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserDO$SocialUserDOBuilder.class new file mode 100644 index 0000000..b8d4b57 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserDO$SocialUserDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserDO.class new file mode 100644 index 0000000..b419d2a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/social/SocialUserDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/student/StudentDO$StudentDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/student/StudentDO$StudentDOBuilder.class new file mode 100644 index 0000000..3ee5b74 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/student/StudentDO$StudentDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/student/StudentDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/student/StudentDO.class new file mode 100644 index 0000000..d03b24b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/student/StudentDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantDO$TenantDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantDO$TenantDOBuilder.class new file mode 100644 index 0000000..88599ac Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantDO$TenantDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantDO.class new file mode 100644 index 0000000..acfccc5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantPackageDO$TenantPackageDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantPackageDO$TenantPackageDOBuilder.class new file mode 100644 index 0000000..2df029f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantPackageDO$TenantPackageDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantPackageDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantPackageDO.class new file mode 100644 index 0000000..c387983 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/tenant/TenantPackageDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountDO$UseCountDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountDO$UseCountDOBuilder.class new file mode 100644 index 0000000..1e40da8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountDO$UseCountDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountDO.class new file mode 100644 index 0000000..f9d9275 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDO$UseCountToDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDO$UseCountToDOBuilder.class new file mode 100644 index 0000000..2c8ccfe Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDO$UseCountToDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDO.class new file mode 100644 index 0000000..79a59e2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDateDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDateDO.class new file mode 100644 index 0000000..8ab5a97 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usecount/UseCountToDateDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/user/AdminUserDO$AdminUserDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/user/AdminUserDO$AdminUserDOBuilder.class new file mode 100644 index 0000000..58bb866 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/user/AdminUserDO$AdminUserDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/user/AdminUserDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/user/AdminUserDO.class new file mode 100644 index 0000000..cf4fd2d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/user/AdminUserDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/userinfo/UserInfoDO$UserInfoDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/userinfo/UserInfoDO$UserInfoDOBuilder.class new file mode 100644 index 0000000..38fc405 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/userinfo/UserInfoDO$UserInfoDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/userinfo/UserInfoDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/userinfo/UserInfoDO.class new file mode 100644 index 0000000..5c8aebc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/userinfo/UserInfoDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usersxq/UsersXqDO$UsersXqDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usersxq/UsersXqDO$UsersXqDOBuilder.class new file mode 100644 index 0000000..55692ac Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usersxq/UsersXqDO$UsersXqDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usersxq/UsersXqDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usersxq/UsersXqDO.class new file mode 100644 index 0000000..d7a3753 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/usersxq/UsersXqDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wq/WqDO$WqDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wq/WqDO$WqDOBuilder.class new file mode 100644 index 0000000..f8b0d26 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wq/WqDO$WqDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wq/WqDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wq/WqDO.class new file mode 100644 index 0000000..aa226d2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wq/WqDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDO$WqdaDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDO$WqdaDOBuilder.class new file mode 100644 index 0000000..83c053e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDO$WqdaDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDO.class new file mode 100644 index 0000000..1b2ba44 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDOx$WqdaDOxBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDOx$WqdaDOxBuilder.class new file mode 100644 index 0000000..31bd7c8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDOx$WqdaDOxBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDOx.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDOx.class new file mode 100644 index 0000000..06f052b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqda/WqdaDOx.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewCustDO$WqdaViewCustDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewCustDO$WqdaViewCustDOBuilder.class new file mode 100644 index 0000000..6f17484 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewCustDO$WqdaViewCustDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewCustDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewCustDO.class new file mode 100644 index 0000000..af6add1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewCustDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewDO$WqdaViewDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewDO$WqdaViewDOBuilder.class new file mode 100644 index 0000000..bec470c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewDO$WqdaViewDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewDO.class new file mode 100644 index 0000000..dc46e3e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqdaview/WqdaViewDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqwt/WqwtDO$WqwtDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqwt/WqwtDO$WqwtDOBuilder.class new file mode 100644 index 0000000..a9eb429 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqwt/WqwtDO$WqwtDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqwt/WqwtDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqwt/WqwtDO.class new file mode 100644 index 0000000..3711648 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/wqwt/WqwtDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xymain/xyMainDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xymain/xyMainDO.class new file mode 100644 index 0000000..15aa67b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xymain/xyMainDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xyrw/XyrwDO$XyrwDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xyrw/XyrwDO$XyrwDOBuilder.class new file mode 100644 index 0000000..d38e4e0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xyrw/XyrwDO$XyrwDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xyrw/XyrwDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xyrw/XyrwDO.class new file mode 100644 index 0000000..4515930 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xyrw/XyrwDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xytjjg/XytjjgDO$XytjjgDOBuilder.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xytjjg/XytjjgDO$XytjjgDOBuilder.class new file mode 100644 index 0000000..ac345cf Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xytjjg/XytjjgDO$XytjjgDOBuilder.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xytjjg/XytjjgDO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xytjjg/XytjjgDO.class new file mode 100644 index 0000000..a2f3d11 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/dataobject/xytjjg/XytjjgDO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/building/BuildingMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/building/BuildingMapper.class new file mode 100644 index 0000000..bca51bc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/building/BuildingMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/carousel/CarouselMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/carousel/CarouselMapper.class new file mode 100644 index 0000000..56688f1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/carousel/CarouselMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/childitem/ChilditemMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/childitem/ChilditemMapper.class new file mode 100644 index 0000000..564dc6b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/childitem/ChilditemMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dept/DeptMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dept/DeptMapper.class new file mode 100644 index 0000000..3337603 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dept/DeptMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dept/PostMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dept/PostMapper.class new file mode 100644 index 0000000..365a985 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dept/PostMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dept/UserPostMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dept/UserPostMapper.class new file mode 100644 index 0000000..76bc12e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dept/UserPostMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/deptxq/DeptXqMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/deptxq/DeptXqMapper.class new file mode 100644 index 0000000..aa9916b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/deptxq/DeptXqMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dict/DictDataMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dict/DictDataMapper.class new file mode 100644 index 0000000..89ff81a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dict/DictDataMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dict/DictTypeMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dict/DictTypeMapper.class new file mode 100644 index 0000000..f092825 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dict/DictTypeMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/doctor/DoctorMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/doctor/DoctorMapper.class new file mode 100644 index 0000000..5207c4b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/doctor/DoctorMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dzquestion/DzQuestionMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dzquestion/DzQuestionMapper.class new file mode 100644 index 0000000..0859007 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dzquestion/DzQuestionMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dztype/DzTypeMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dztype/DzTypeMapper.class new file mode 100644 index 0000000..ec4ebc9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/dztype/DzTypeMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/errorcode/ErrorCodeMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/errorcode/ErrorCodeMapper.class new file mode 100644 index 0000000..0541b12 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/errorcode/ErrorCodeMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/hospital/HospitalMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/hospital/HospitalMapper.class new file mode 100644 index 0000000..70253e3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/hospital/HospitalMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/information/InformationMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/information/InformationMapper.class new file mode 100644 index 0000000..c287f1f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/information/InformationMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/item/ItemMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/item/ItemMapper.class new file mode 100644 index 0000000..d531397 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/item/ItemMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/ksinfo/KsInfoMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/ksinfo/KsInfoMapper.class new file mode 100644 index 0000000..097dc7f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/ksinfo/KsInfoMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/kstype/KsTypeMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/kstype/KsTypeMapper.class new file mode 100644 index 0000000..931ce69 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/kstype/KsTypeMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/label/LabelMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/label/LabelMapper.class new file mode 100644 index 0000000..84654c5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/label/LabelMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/logger/LoginLogMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/logger/LoginLogMapper.class new file mode 100644 index 0000000..5a10174 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/logger/LoginLogMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/logger/OperateLogMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/logger/OperateLogMapper.class new file mode 100644 index 0000000..b212344 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/logger/OperateLogMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/mzdm/MzdmMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/mzdm/MzdmMapper.class new file mode 100644 index 0000000..efe5d6a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/mzdm/MzdmMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/mzjf/MzjfMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/mzjf/MzjfMapper.class new file mode 100644 index 0000000..b820253 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/mzjf/MzjfMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/notice/NoticeMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/notice/NoticeMapper.class new file mode 100644 index 0000000..0279c2b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/notice/NoticeMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.class new file mode 100644 index 0000000..c47b342 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.class new file mode 100644 index 0000000..018fc1f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2ApproveMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2ClientMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2ClientMapper.class new file mode 100644 index 0000000..c4a1487 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2ClientMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2CodeMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2CodeMapper.class new file mode 100644 index 0000000..0f7761c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2CodeMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.class new file mode 100644 index 0000000..d4355e0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/order/OrderMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/order/OrderMapper.class new file mode 100644 index 0000000..f45aba9 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/order/OrderMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/orderSum/OrderSumMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/orderSum/OrderSumMapper.class new file mode 100644 index 0000000..729047d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/orderSum/OrderSumMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/orderview/OrderViewMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/orderview/OrderViewMapper.class new file mode 100644 index 0000000..2b75e2b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/orderview/OrderViewMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/MenuMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/MenuMapper.class new file mode 100644 index 0000000..6b13fdf Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/MenuMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMapper.class new file mode 100644 index 0000000..dbb8d25 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuBatchInsertMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuBatchInsertMapper.class new file mode 100644 index 0000000..6f021f5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuBatchInsertMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuMapper$BatchInsertMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuMapper$BatchInsertMapper.class new file mode 100644 index 0000000..5766b7e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuMapper$BatchInsertMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuMapper.class new file mode 100644 index 0000000..985947e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/RoleMenuMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/UserRoleBatchInsertMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/UserRoleBatchInsertMapper.class new file mode 100644 index 0000000..c34cce6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/UserRoleBatchInsertMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/UserRoleMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/UserRoleMapper.class new file mode 100644 index 0000000..1f4de6b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/permission/UserRoleMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/refundapply/RefundApplyMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/refundapply/RefundApplyMapper.class new file mode 100644 index 0000000..070b9ec Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/refundapply/RefundApplyMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/reserve8/Reserve8Mapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/reserve8/Reserve8Mapper.class new file mode 100644 index 0000000..0bd6d62 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/reserve8/Reserve8Mapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sensitiveword/SensitiveWordMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sensitiveword/SensitiveWordMapper.class new file mode 100644 index 0000000..8cad9a6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sensitiveword/SensitiveWordMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sms/SmsChannelMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sms/SmsChannelMapper.class new file mode 100644 index 0000000..44fe91c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sms/SmsChannelMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sms/SmsCodeMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sms/SmsCodeMapper.class new file mode 100644 index 0000000..89ab294 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sms/SmsCodeMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sms/SmsLogMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sms/SmsLogMapper.class new file mode 100644 index 0000000..6569f7a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sms/SmsLogMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sms/SmsTemplateMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sms/SmsTemplateMapper.class new file mode 100644 index 0000000..6a4bf6d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/sms/SmsTemplateMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/social/SocialUserBindMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/social/SocialUserBindMapper.class new file mode 100644 index 0000000..ac5ae50 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/social/SocialUserBindMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/social/SocialUserMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/social/SocialUserMapper.class new file mode 100644 index 0000000..bd697b1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/social/SocialUserMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/student/StudentMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/student/StudentMapper.class new file mode 100644 index 0000000..6e6abe4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/student/StudentMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/tenant/TenantMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/tenant/TenantMapper.class new file mode 100644 index 0000000..25212de Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/tenant/TenantMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/tenant/TenantPackageMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/tenant/TenantPackageMapper.class new file mode 100644 index 0000000..8357442 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/tenant/TenantPackageMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/usecount/UseCountMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/usecount/UseCountMapper.class new file mode 100644 index 0000000..a795889 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/usecount/UseCountMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/usecount/UseCountXMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/usecount/UseCountXMapper.class new file mode 100644 index 0000000..1adf036 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/usecount/UseCountXMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/user/AdminUserMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/user/AdminUserMapper.class new file mode 100644 index 0000000..27ba0ac Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/user/AdminUserMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/userinfo/UserInfoMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/userinfo/UserInfoMapper.class new file mode 100644 index 0000000..f78e3d6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/userinfo/UserInfoMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/usersxq/UsersXqMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/usersxq/UsersXqMapper.class new file mode 100644 index 0000000..fa40085 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/usersxq/UsersXqMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wq/WqMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wq/WqMapper.class new file mode 100644 index 0000000..7494968 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wq/WqMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wqda/WqdaMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wqda/WqdaMapper.class new file mode 100644 index 0000000..889a3a2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wqda/WqdaMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wqda/WqdaxMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wqda/WqdaxMapper.class new file mode 100644 index 0000000..84946af Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wqda/WqdaxMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wqdaview/WqdaViewMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wqdaview/WqdaViewMapper.class new file mode 100644 index 0000000..28d29d3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wqdaview/WqdaViewMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wqwt/WqwtMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wqwt/WqwtMapper.class new file mode 100644 index 0000000..af67be8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/wqwt/WqwtMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/xymain/xyMainMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/xymain/xyMainMapper.class new file mode 100644 index 0000000..1f811cf Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/xymain/xyMainMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/xyrw/XyrwMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/xyrw/XyrwMapper.class new file mode 100644 index 0000000..da8d274 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/xyrw/XyrwMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/xytjjg/XytjjgBatchInsertMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/xytjjg/XytjjgBatchInsertMapper.class new file mode 100644 index 0000000..26c87ae Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/xytjjg/XytjjgBatchInsertMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/xytjjg/XytjjgMapper.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/xytjjg/XytjjgMapper.class new file mode 100644 index 0000000..fdca484 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/mysql/xytjjg/XytjjgMapper.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/redis/RedisKeyConstants.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/redis/RedisKeyConstants.class new file mode 100644 index 0000000..729df8f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/redis/RedisKeyConstants.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/redis/common/CaptchaRedisDAO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/redis/common/CaptchaRedisDAO.class new file mode 100644 index 0000000..a14c1a0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/redis/common/CaptchaRedisDAO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.class new file mode 100644 index 0000000..11a8ec1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/dal/redis/oauth2/OAuth2AccessTokenRedisDAO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/captcha/config/CaptchaConfig.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/captcha/config/CaptchaConfig.class new file mode 100644 index 0000000..e9e5e5c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/captcha/config/CaptchaConfig.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/captcha/config/CaptchaProperties.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/captcha/config/CaptchaProperties.class new file mode 100644 index 0000000..fb1553e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/captcha/config/CaptchaProperties.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/datapermission/config/DataPermissionConfiguration.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/datapermission/config/DataPermissionConfiguration.class new file mode 100644 index 0000000..98d143e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/datapermission/config/DataPermissionConfiguration.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/sms/SmsCodeConfiguration.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/sms/SmsCodeConfiguration.class new file mode 100644 index 0000000..8d0e819 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/sms/SmsCodeConfiguration.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/sms/SmsCodeProperties.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/sms/SmsCodeProperties.class new file mode 100644 index 0000000..346f4aa Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/sms/SmsCodeProperties.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/tjfiles/TjfilesConfig.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/tjfiles/TjfilesConfig.class new file mode 100644 index 0000000..068d993 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/tjfiles/TjfilesConfig.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/tjfiles/TjfilesProperties.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/tjfiles/TjfilesProperties.class new file mode 100644 index 0000000..4e1c587 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/framework/tjfiles/TjfilesProperties.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/job/GetKsinfoDaily.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/job/GetKsinfoDaily.class new file mode 100644 index 0000000..6aec073 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/job/GetKsinfoDaily.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/job/UpdateOrderDaily.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/job/UpdateOrderDaily.class new file mode 100644 index 0000000..b03c424 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/job/UpdateOrderDaily.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/job/UpdatePriceDaily.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/job/UpdatePriceDaily.class new file mode 100644 index 0000000..3dead45 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/job/UpdatePriceDaily.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/auth/OAuth2ClientRefreshConsumer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/auth/OAuth2ClientRefreshConsumer.class new file mode 100644 index 0000000..41b8ba3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/auth/OAuth2ClientRefreshConsumer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/dept/DeptRefreshConsumer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/dept/DeptRefreshConsumer.class new file mode 100644 index 0000000..c217e67 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/dept/DeptRefreshConsumer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/deptXq/DeptXqRefreshConsumer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/deptXq/DeptXqRefreshConsumer.class new file mode 100644 index 0000000..302d2c3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/deptXq/DeptXqRefreshConsumer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/mail/MailSendConsumer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/mail/MailSendConsumer.class new file mode 100644 index 0000000..a7b48c0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/mail/MailSendConsumer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/permission/MenuRefreshConsumer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/permission/MenuRefreshConsumer.class new file mode 100644 index 0000000..b80eb79 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/permission/MenuRefreshConsumer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/permission/RoleMenuRefreshConsumer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/permission/RoleMenuRefreshConsumer.class new file mode 100644 index 0000000..b170315 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/permission/RoleMenuRefreshConsumer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/permission/RoleRefreshConsumer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/permission/RoleRefreshConsumer.class new file mode 100644 index 0000000..736f432 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/permission/RoleRefreshConsumer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/permission/UserRoleRefreshConsumer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/permission/UserRoleRefreshConsumer.class new file mode 100644 index 0000000..cddd8f0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/permission/UserRoleRefreshConsumer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/sensitiveword/SensitiveWordRefreshConsumer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/sensitiveword/SensitiveWordRefreshConsumer.class new file mode 100644 index 0000000..6103ae7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/sensitiveword/SensitiveWordRefreshConsumer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/sms/SmsChannelRefreshConsumer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/sms/SmsChannelRefreshConsumer.class new file mode 100644 index 0000000..64fe963 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/sms/SmsChannelRefreshConsumer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/sms/SmsSendConsumer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/sms/SmsSendConsumer.class new file mode 100644 index 0000000..1b9afff Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/sms/SmsSendConsumer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.class new file mode 100644 index 0000000..ff58f4d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/consumer/sms/SmsTemplateRefreshConsumer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/auth/OAuth2ClientRefreshMessage.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/auth/OAuth2ClientRefreshMessage.class new file mode 100644 index 0000000..3e87f19 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/auth/OAuth2ClientRefreshMessage.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/dept/DeptRefreshMessage.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/dept/DeptRefreshMessage.class new file mode 100644 index 0000000..541916a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/dept/DeptRefreshMessage.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/deptXq/DeptXqRefreshMessage.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/deptXq/DeptXqRefreshMessage.class new file mode 100644 index 0000000..eb7110c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/deptXq/DeptXqRefreshMessage.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/mail/MailSendMessage.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/mail/MailSendMessage.class new file mode 100644 index 0000000..2ff9668 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/mail/MailSendMessage.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/permission/MenuRefreshMessage.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/permission/MenuRefreshMessage.class new file mode 100644 index 0000000..d7aa728 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/permission/MenuRefreshMessage.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/permission/RoleMenuRefreshMessage.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/permission/RoleMenuRefreshMessage.class new file mode 100644 index 0000000..8ca46e7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/permission/RoleMenuRefreshMessage.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/permission/RoleRefreshMessage.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/permission/RoleRefreshMessage.class new file mode 100644 index 0000000..9f32861 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/permission/RoleRefreshMessage.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/permission/UserRoleRefreshMessage.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/permission/UserRoleRefreshMessage.class new file mode 100644 index 0000000..86d8969 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/permission/UserRoleRefreshMessage.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/sensitiveword/SensitiveWordRefreshMessage.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/sensitiveword/SensitiveWordRefreshMessage.class new file mode 100644 index 0000000..1760876 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/sensitiveword/SensitiveWordRefreshMessage.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/sms/SmsChannelRefreshMessage.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/sms/SmsChannelRefreshMessage.class new file mode 100644 index 0000000..b994d64 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/sms/SmsChannelRefreshMessage.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/sms/SmsSendMessage.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/sms/SmsSendMessage.class new file mode 100644 index 0000000..e73c364 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/sms/SmsSendMessage.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/sms/SmsTemplateRefreshMessage.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/sms/SmsTemplateRefreshMessage.class new file mode 100644 index 0000000..477af5e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/message/sms/SmsTemplateRefreshMessage.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/auth/OAuth2ClientProducer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/auth/OAuth2ClientProducer.class new file mode 100644 index 0000000..2bfd328 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/auth/OAuth2ClientProducer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/dept/DeptProducer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/dept/DeptProducer.class new file mode 100644 index 0000000..873b83b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/dept/DeptProducer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/deptXq/DeptXqProducer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/deptXq/DeptXqProducer.class new file mode 100644 index 0000000..deb46b3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/deptXq/DeptXqProducer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/permission/MenuProducer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/permission/MenuProducer.class new file mode 100644 index 0000000..3481953 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/permission/MenuProducer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/permission/PermissionProducer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/permission/PermissionProducer.class new file mode 100644 index 0000000..ff0428f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/permission/PermissionProducer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/permission/RoleProducer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/permission/RoleProducer.class new file mode 100644 index 0000000..51ed86a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/permission/RoleProducer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/sensitiveword/SensitiveWordProducer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/sensitiveword/SensitiveWordProducer.class new file mode 100644 index 0000000..a242bf6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/sensitiveword/SensitiveWordProducer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/sms/SmsProducer.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/sms/SmsProducer.class new file mode 100644 index 0000000..4a9c0a6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/mq/producer/sms/SmsProducer.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/auth/AdminAuthService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/auth/AdminAuthService.class new file mode 100644 index 0000000..6afee0c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/auth/AdminAuthService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/auth/AdminAuthServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/auth/AdminAuthServiceImpl.class new file mode 100644 index 0000000..8ba6f81 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/auth/AdminAuthServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/authgz/GzAuthService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/authgz/GzAuthService.class new file mode 100644 index 0000000..507138b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/authgz/GzAuthService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/authgz/GzAuthServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/authgz/GzAuthServiceImpl.class new file mode 100644 index 0000000..68b73a2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/authgz/GzAuthServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/building/BuildingService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/building/BuildingService.class new file mode 100644 index 0000000..2d1a1b6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/building/BuildingService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/building/BuildingServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/building/BuildingServiceImpl.class new file mode 100644 index 0000000..3dfc9e6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/building/BuildingServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/carousel/CarouselService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/carousel/CarouselService.class new file mode 100644 index 0000000..cbbfe1d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/carousel/CarouselService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/carousel/CarouselServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/carousel/CarouselServiceImpl.class new file mode 100644 index 0000000..c92b553 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/carousel/CarouselServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/childitem/ChilditemService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/childitem/ChilditemService.class new file mode 100644 index 0000000..96f9c34 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/childitem/ChilditemService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/childitem/ChilditemServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/childitem/ChilditemServiceImpl.class new file mode 100644 index 0000000..819e3ac Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/childitem/ChilditemServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/common/CaptchaService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/common/CaptchaService.class new file mode 100644 index 0000000..a411f5d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/common/CaptchaService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/common/CaptchaServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/common/CaptchaServiceImpl.class new file mode 100644 index 0000000..f2e5dae Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/common/CaptchaServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dept/DeptService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dept/DeptService.class new file mode 100644 index 0000000..b83c725 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dept/DeptService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dept/DeptServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dept/DeptServiceImpl.class new file mode 100644 index 0000000..a0ee9c6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dept/DeptServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dept/PostService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dept/PostService.class new file mode 100644 index 0000000..512f8af Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dept/PostService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dept/PostServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dept/PostServiceImpl.class new file mode 100644 index 0000000..d593eaf Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dept/PostServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/deptxq/DeptXqService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/deptxq/DeptXqService.class new file mode 100644 index 0000000..c26774f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/deptxq/DeptXqService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/deptxq/DeptXqServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/deptxq/DeptXqServiceImpl.class new file mode 100644 index 0000000..42f0a13 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/deptxq/DeptXqServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dict/DictDataService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dict/DictDataService.class new file mode 100644 index 0000000..8d2075f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dict/DictDataService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dict/DictDataServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dict/DictDataServiceImpl.class new file mode 100644 index 0000000..b5fcd3e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dict/DictDataServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dict/DictTypeService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dict/DictTypeService.class new file mode 100644 index 0000000..16cd6d5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dict/DictTypeService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dict/DictTypeServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dict/DictTypeServiceImpl.class new file mode 100644 index 0000000..efb7dc6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dict/DictTypeServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/doctor/DoctorService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/doctor/DoctorService.class new file mode 100644 index 0000000..3b42bfa Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/doctor/DoctorService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/doctor/DoctorServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/doctor/DoctorServiceImpl.class new file mode 100644 index 0000000..40d12f3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/doctor/DoctorServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dzquestion/DzQuestionService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dzquestion/DzQuestionService.class new file mode 100644 index 0000000..83da6ab Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dzquestion/DzQuestionService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dzquestion/DzQuestionServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dzquestion/DzQuestionServiceImpl.class new file mode 100644 index 0000000..2ed911e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dzquestion/DzQuestionServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dztype/DzTypeService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dztype/DzTypeService.class new file mode 100644 index 0000000..5346e0a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dztype/DzTypeService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dztype/DzTypeServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dztype/DzTypeServiceImpl.class new file mode 100644 index 0000000..42de3d6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/dztype/DzTypeServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeService.class new file mode 100644 index 0000000..e52c85d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeServiceImpl.class new file mode 100644 index 0000000..8621cdb Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/hospital/HospitalService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/hospital/HospitalService.class new file mode 100644 index 0000000..0cc7fdc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/hospital/HospitalService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/hospital/HospitalServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/hospital/HospitalServiceImpl.class new file mode 100644 index 0000000..4771a42 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/hospital/HospitalServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/information/InformationService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/information/InformationService.class new file mode 100644 index 0000000..49f528a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/information/InformationService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/information/InformationServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/information/InformationServiceImpl.class new file mode 100644 index 0000000..567151f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/information/InformationServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/item/ItemService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/item/ItemService.class new file mode 100644 index 0000000..23d0d77 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/item/ItemService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/item/ItemServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/item/ItemServiceImpl.class new file mode 100644 index 0000000..78d9bd2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/item/ItemServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/ksinfo/KsInfoService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/ksinfo/KsInfoService.class new file mode 100644 index 0000000..d1c2ba6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/ksinfo/KsInfoService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/ksinfo/KsInfoServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/ksinfo/KsInfoServiceImpl.class new file mode 100644 index 0000000..af88813 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/ksinfo/KsInfoServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/kstype/KsTypeService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/kstype/KsTypeService.class new file mode 100644 index 0000000..46cd6ff Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/kstype/KsTypeService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/kstype/KsTypeServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/kstype/KsTypeServiceImpl.class new file mode 100644 index 0000000..1b803ac Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/kstype/KsTypeServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/label/LabelService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/label/LabelService.class new file mode 100644 index 0000000..c41f68b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/label/LabelService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/label/LabelServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/label/LabelServiceImpl.class new file mode 100644 index 0000000..3bb5bd6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/label/LabelServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/logger/LoginLogService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/logger/LoginLogService.class new file mode 100644 index 0000000..6debdd0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/logger/LoginLogService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/logger/LoginLogServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/logger/LoginLogServiceImpl.class new file mode 100644 index 0000000..be36a97 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/logger/LoginLogServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/logger/OperateLogService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/logger/OperateLogService.class new file mode 100644 index 0000000..408d04b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/logger/OperateLogService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/logger/OperateLogServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/logger/OperateLogServiceImpl.class new file mode 100644 index 0000000..860d9a2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/logger/OperateLogServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/member/MemberService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/member/MemberService.class new file mode 100644 index 0000000..9f5c6ca Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/member/MemberService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/member/MemberServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/member/MemberServiceImpl.class new file mode 100644 index 0000000..27809b8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/member/MemberServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/mzdm/MzdmService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/mzdm/MzdmService.class new file mode 100644 index 0000000..32816c6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/mzdm/MzdmService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/mzdm/MzdmServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/mzdm/MzdmServiceImpl.class new file mode 100644 index 0000000..fb152ad Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/mzdm/MzdmServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/mzjf/MzjfService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/mzjf/MzjfService.class new file mode 100644 index 0000000..531614a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/mzjf/MzjfService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/mzjf/MzjfServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/mzjf/MzjfServiceImpl.class new file mode 100644 index 0000000..8972fdb Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/mzjf/MzjfServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/notice/NoticeService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/notice/NoticeService.class new file mode 100644 index 0000000..29d3c0b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/notice/NoticeService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/notice/NoticeServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/notice/NoticeServiceImpl.class new file mode 100644 index 0000000..8198130 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/notice/NoticeServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveService.class new file mode 100644 index 0000000..694f60d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveServiceImpl.class new file mode 100644 index 0000000..8932d56 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientService.class new file mode 100644 index 0000000..bf0f78b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientServiceImpl.class new file mode 100644 index 0000000..d656026 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeService.class new file mode 100644 index 0000000..34b2bb4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeServiceImpl.class new file mode 100644 index 0000000..83c529b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantService.class new file mode 100644 index 0000000..50f4a0b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantServiceImpl.class new file mode 100644 index 0000000..9a13f00 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenService.class new file mode 100644 index 0000000..39f0d6e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenServiceImpl.class new file mode 100644 index 0000000..f1da407 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/order/OrderService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/order/OrderService.class new file mode 100644 index 0000000..25d1dde Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/order/OrderService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/order/OrderServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/order/OrderServiceImpl.class new file mode 100644 index 0000000..7349c78 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/order/OrderServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/orderview/OrderViewService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/orderview/OrderViewService.class new file mode 100644 index 0000000..713c95a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/orderview/OrderViewService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/orderview/OrderViewServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/orderview/OrderViewServiceImpl.class new file mode 100644 index 0000000..02cd696 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/orderview/OrderViewServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/MenuService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/MenuService.class new file mode 100644 index 0000000..69caf91 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/MenuService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/MenuServiceImpl$1.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/MenuServiceImpl$1.class new file mode 100644 index 0000000..f0fffe3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/MenuServiceImpl$1.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/MenuServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/MenuServiceImpl.class new file mode 100644 index 0000000..73335d1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/MenuServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionService.class new file mode 100644 index 0000000..d779b48 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$1.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$1.class new file mode 100644 index 0000000..88c11c4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$1.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$2.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$2.class new file mode 100644 index 0000000..7cb23c6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$2.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$3.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$3.class new file mode 100644 index 0000000..86b00c1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$3.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$4.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$4.class new file mode 100644 index 0000000..9a50a36 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$4.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$5.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$5.class new file mode 100644 index 0000000..c8bfb4e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl$5.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl.class new file mode 100644 index 0000000..5468a3e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/RoleService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/RoleService.class new file mode 100644 index 0000000..cf4c2cd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/RoleService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/RoleServiceImpl$1.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/RoleServiceImpl$1.class new file mode 100644 index 0000000..9d66086 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/RoleServiceImpl$1.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/RoleServiceImpl$2.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/RoleServiceImpl$2.class new file mode 100644 index 0000000..97d1536 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/RoleServiceImpl$2.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/RoleServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/RoleServiceImpl.class new file mode 100644 index 0000000..1c21788 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/RoleServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/bo/RoleCreateReqBO.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/bo/RoleCreateReqBO.class new file mode 100644 index 0000000..11d23ed Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/permission/bo/RoleCreateReqBO.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/refundapply/RefundApplyService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/refundapply/RefundApplyService.class new file mode 100644 index 0000000..5cc28b6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/refundapply/RefundApplyService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/refundapply/RefundApplyServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/refundapply/RefundApplyServiceImpl.class new file mode 100644 index 0000000..2b63dc1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/refundapply/RefundApplyServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/reserve8/Reserve8Service.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/reserve8/Reserve8Service.class new file mode 100644 index 0000000..1ef2b2f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/reserve8/Reserve8Service.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/reserve8/Reserve8ServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/reserve8/Reserve8ServiceImpl.class new file mode 100644 index 0000000..676aeb0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/reserve8/Reserve8ServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordService.class new file mode 100644 index 0000000..7620c38 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordServiceImpl.class new file mode 100644 index 0000000..cad8124 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsChannelService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsChannelService.class new file mode 100644 index 0000000..e8991dd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsChannelService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsChannelServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsChannelServiceImpl.class new file mode 100644 index 0000000..691b2d4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsChannelServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsCodeService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsCodeService.class new file mode 100644 index 0000000..5c2a89a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsCodeService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsCodeServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsCodeServiceImpl.class new file mode 100644 index 0000000..a9105d7 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsCodeServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsLogService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsLogService.class new file mode 100644 index 0000000..4569e9a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsLogService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsLogServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsLogServiceImpl.class new file mode 100644 index 0000000..b1c44bd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsLogServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsSendService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsSendService.class new file mode 100644 index 0000000..e2165fb Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsSendService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsSendServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsSendServiceImpl.class new file mode 100644 index 0000000..bd3c467 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsSendServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsTemplateService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsTemplateService.class new file mode 100644 index 0000000..e481e31 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsTemplateService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsTemplateServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsTemplateServiceImpl.class new file mode 100644 index 0000000..8556d1b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/sms/SmsTemplateServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/social/SocialUserService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/social/SocialUserService.class new file mode 100644 index 0000000..df2aacb Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/social/SocialUserService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/social/SocialUserServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/social/SocialUserServiceImpl.class new file mode 100644 index 0000000..ce65871 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/social/SocialUserServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/student/StudentService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/student/StudentService.class new file mode 100644 index 0000000..20b5c8b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/student/StudentService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/student/StudentServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/student/StudentServiceImpl.class new file mode 100644 index 0000000..8dce234 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/student/StudentServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/TenantPackageService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/TenantPackageService.class new file mode 100644 index 0000000..cd67fe8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/TenantPackageService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/TenantPackageServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/TenantPackageServiceImpl.class new file mode 100644 index 0000000..40bf807 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/TenantPackageServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/TenantService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/TenantService.class new file mode 100644 index 0000000..e49227d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/TenantService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/TenantServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/TenantServiceImpl.class new file mode 100644 index 0000000..7a9d1b6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/TenantServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/handler/TenantInfoHandler.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/handler/TenantInfoHandler.class new file mode 100644 index 0000000..649ea50 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/handler/TenantInfoHandler.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/handler/TenantMenuHandler.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/handler/TenantMenuHandler.class new file mode 100644 index 0000000..3f8bf3c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/tenant/handler/TenantMenuHandler.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/usecount/UseCountService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/usecount/UseCountService.class new file mode 100644 index 0000000..e3bf2b3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/usecount/UseCountService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/usecount/UseCountServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/usecount/UseCountServiceImpl.class new file mode 100644 index 0000000..cbce41e Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/usecount/UseCountServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/user/AdminUserService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/user/AdminUserService.class new file mode 100644 index 0000000..d2dc188 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/user/AdminUserService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/user/AdminUserServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/user/AdminUserServiceImpl.class new file mode 100644 index 0000000..316a772 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/user/AdminUserServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/userinfo/UserInfoService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/userinfo/UserInfoService.class new file mode 100644 index 0000000..e944162 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/userinfo/UserInfoService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/userinfo/UserInfoServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/userinfo/UserInfoServiceImpl.class new file mode 100644 index 0000000..3997991 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/userinfo/UserInfoServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/usersxq/UsersXqService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/usersxq/UsersXqService.class new file mode 100644 index 0000000..b09d13d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/usersxq/UsersXqService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/usersxq/UsersXqServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/usersxq/UsersXqServiceImpl.class new file mode 100644 index 0000000..aeef298 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/usersxq/UsersXqServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wq/WqService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wq/WqService.class new file mode 100644 index 0000000..25b7fae Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wq/WqService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wq/WqServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wq/WqServiceImpl.class new file mode 100644 index 0000000..cca4d64 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wq/WqServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqda/WqdaService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqda/WqdaService.class new file mode 100644 index 0000000..dc122ee Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqda/WqdaService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqda/WqdaServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqda/WqdaServiceImpl.class new file mode 100644 index 0000000..4b16012 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqda/WqdaServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqdaview/WqdaViewService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqdaview/WqdaViewService.class new file mode 100644 index 0000000..32bd067 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqdaview/WqdaViewService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqdaview/WqdaViewServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqdaview/WqdaViewServiceImpl.class new file mode 100644 index 0000000..13b1310 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqdaview/WqdaViewServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqwt/WqwtService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqwt/WqwtService.class new file mode 100644 index 0000000..e9e3e98 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqwt/WqwtService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqwt/WqwtServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqwt/WqwtServiceImpl.class new file mode 100644 index 0000000..c2a5227 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/wqwt/WqwtServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xymain/xyMainService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xymain/xyMainService.class new file mode 100644 index 0000000..18efa0d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xymain/xyMainService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xymain/xyMainServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xymain/xyMainServiceImpl.class new file mode 100644 index 0000000..10f2a56 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xymain/xyMainServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xyrw/XyrwService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xyrw/XyrwService.class new file mode 100644 index 0000000..2c78570 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xyrw/XyrwService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xyrw/XyrwServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xyrw/XyrwServiceImpl.class new file mode 100644 index 0000000..8aa0a9f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xyrw/XyrwServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xytjjg/XytjjgService.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xytjjg/XytjjgService.class new file mode 100644 index 0000000..f061d10 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xytjjg/XytjjgService.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xytjjg/XytjjgServiceImpl.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xytjjg/XytjjgServiceImpl.class new file mode 100644 index 0000000..3176c6a Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/service/xytjjg/XytjjgServiceImpl.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/collection/SimpleTrie.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/collection/SimpleTrie.class new file mode 100644 index 0000000..6fb6cd3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/collection/SimpleTrie.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/oauth2/OAuth2Utils.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/oauth2/OAuth2Utils.class new file mode 100644 index 0000000..9810a48 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/oauth2/OAuth2Utils.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/AgeCalculator.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/AgeCalculator.class new file mode 100644 index 0000000..1d3fe5c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/AgeCalculator.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/BarCodeUtils$1.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/BarCodeUtils$1.class new file mode 100644 index 0000000..05d0155 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/BarCodeUtils$1.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/BarCodeUtils.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/BarCodeUtils.class new file mode 100644 index 0000000..fe410ca Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/BarCodeUtils.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/DateDUtil.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/DateDUtil.class new file mode 100644 index 0000000..3f205f0 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/DateDUtil.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/EncryptUtil.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/EncryptUtil.class new file mode 100644 index 0000000..70860e5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/EncryptUtil.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/Excel2PdfUtil.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/Excel2PdfUtil.class new file mode 100644 index 0000000..6f52dff Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/Excel2PdfUtil.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/HttpClientUtil.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/HttpClientUtil.class new file mode 100644 index 0000000..b867e86 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/HttpClientUtil.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/IDCardParser.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/IDCardParser.class new file mode 100644 index 0000000..d881cca Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/IDCardParser.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/MD5Util.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/MD5Util.class new file mode 100644 index 0000000..6d99213 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/MD5Util.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/SoapUtil.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/SoapUtil.class new file mode 100644 index 0000000..6bbc11f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/SoapUtil.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/StringDUtil.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/StringDUtil.class new file mode 100644 index 0000000..65e968b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/StringDUtil.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/StringUtil.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/StringUtil.class new file mode 100644 index 0000000..30a0449 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/StringUtil.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/VeDate.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/VeDate.class new file mode 100644 index 0000000..9c0d881 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/VeDate.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/WSUtil.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/WSUtil.class new file mode 100644 index 0000000..9073722 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/WSUtil.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/XmlUtil.class b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/XmlUtil.class new file mode 100644 index 0000000..f73eef2 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/classes/com/jojubanking/boot/module/system/util/xytj/XmlUtil.class differ diff --git a/joju-module-system/joju-module-system-biz/target/classes/excel-license.xml b/joju-module-system/joju-module-system-biz/target/classes/excel-license.xml new file mode 100644 index 0000000..2a69d76 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/classes/excel-license.xml @@ -0,0 +1,13 @@ + + + + Aspose.Total for Java + Aspose.Words for Java + + Enterprise + 20991231 + 20991231 + 8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7 + + sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU= + \ No newline at end of file diff --git a/joju-module-system/joju-module-system-biz/target/classes/mapper/userinfo/UserInfoMapper.xml b/joju-module-system/joju-module-system-biz/target/classes/mapper/userinfo/UserInfoMapper.xml new file mode 100644 index 0000000..2f75117 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/classes/mapper/userinfo/UserInfoMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/joju-module-system/joju-module-system-biz/target/classes/word-license.xml b/joju-module-system/joju-module-system-biz/target/classes/word-license.xml new file mode 100644 index 0000000..2cbce45 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/classes/word-license.xml @@ -0,0 +1,15 @@ + + + + Aspose.Total for Java + Aspose.Words for Java + + Enterprise + 20991231 + 20991231 + 8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7 + + + sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU= + + diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/auth/AuthConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/auth/AuthConvertImpl.java new file mode 100644 index 0000000..8ba4ac1 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/auth/AuthConvertImpl.java @@ -0,0 +1,116 @@ +package com.jojubanking.boot.module.system.convert.auth; + +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeSendReqDTO; +import com.jojubanking.boot.module.system.api.sms.dto.code.SmsCodeUseReqDTO; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.AuthLoginRespVO; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.AuthMenuRespVO; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.AuthSmsLoginReqVO; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.AuthSmsSendReqVO; +import com.jojubanking.boot.module.system.controller.admin.auth.vo.AuthSocialLoginReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class AuthConvertImpl implements AuthConvert { + + @Override + public AuthLoginRespVO convert(OAuth2AccessTokenDO bean) { + if ( bean == null ) { + return null; + } + + AuthLoginRespVO authLoginRespVO = new AuthLoginRespVO(); + + authLoginRespVO.setUserId( bean.getUserId() ); + authLoginRespVO.setAccessToken( bean.getAccessToken() ); + authLoginRespVO.setRefreshToken( bean.getRefreshToken() ); + authLoginRespVO.setExpiresTime( bean.getExpiresTime() ); + + return authLoginRespVO; + } + + @Override + public AuthMenuRespVO convertTreeNode(MenuDO menu) { + if ( menu == null ) { + return null; + } + + AuthMenuRespVO authMenuRespVO = new AuthMenuRespVO(); + + authMenuRespVO.setId( menu.getId() ); + authMenuRespVO.setParentId( menu.getParentId() ); + authMenuRespVO.setName( menu.getName() ); + authMenuRespVO.setPath( menu.getPath() ); + authMenuRespVO.setComponent( menu.getComponent() ); + authMenuRespVO.setIcon( menu.getIcon() ); + authMenuRespVO.setVisible( menu.getVisible() ); + authMenuRespVO.setKeepAlive( menu.getKeepAlive() ); + + return authMenuRespVO; + } + + @Override + public SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialLoginReqVO reqVO) { + if ( userId == null && userType == null && reqVO == null ) { + return null; + } + + SocialUserBindReqDTO socialUserBindReqDTO = new SocialUserBindReqDTO(); + + if ( userId != null ) { + socialUserBindReqDTO.setUserId( userId ); + } + if ( userType != null ) { + socialUserBindReqDTO.setUserType( userType ); + } + if ( reqVO != null ) { + socialUserBindReqDTO.setType( reqVO.getType() ); + socialUserBindReqDTO.setCode( reqVO.getCode() ); + socialUserBindReqDTO.setState( reqVO.getState() ); + } + + return socialUserBindReqDTO; + } + + @Override + public SmsCodeSendReqDTO convert(AuthSmsSendReqVO reqVO) { + if ( reqVO == null ) { + return null; + } + + SmsCodeSendReqDTO smsCodeSendReqDTO = new SmsCodeSendReqDTO(); + + smsCodeSendReqDTO.setMobile( reqVO.getMobile() ); + smsCodeSendReqDTO.setScene( reqVO.getScene() ); + + return smsCodeSendReqDTO; + } + + @Override + public SmsCodeUseReqDTO convert(AuthSmsLoginReqVO reqVO, Integer scene, String usedIp) { + if ( reqVO == null && scene == null && usedIp == null ) { + return null; + } + + SmsCodeUseReqDTO smsCodeUseReqDTO = new SmsCodeUseReqDTO(); + + if ( reqVO != null ) { + smsCodeUseReqDTO.setMobile( reqVO.getMobile() ); + smsCodeUseReqDTO.setCode( reqVO.getCode() ); + } + if ( scene != null ) { + smsCodeUseReqDTO.setScene( scene ); + } + if ( usedIp != null ) { + smsCodeUseReqDTO.setUsedIp( usedIp ); + } + + return smsCodeUseReqDTO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/auth/AuthGzConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/auth/AuthGzConvertImpl.java new file mode 100644 index 0000000..ac643ac --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/auth/AuthGzConvertImpl.java @@ -0,0 +1,46 @@ +package com.jojubanking.boot.module.system.convert.auth; + +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; +import com.jojubanking.boot.module.system.controller.app.auth.vo.AppAuthLoginRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class AuthGzConvertImpl implements AuthGzConvert { + + @Override + public AppAuthLoginRespVO convert(OAuth2AccessTokenDO bean) { + if ( bean == null ) { + return null; + } + + AppAuthLoginRespVO appAuthLoginRespVO = new AppAuthLoginRespVO(); + + appAuthLoginRespVO.setUserId( bean.getUserId() ); + appAuthLoginRespVO.setAccessToken( bean.getAccessToken() ); + appAuthLoginRespVO.setRefreshToken( bean.getRefreshToken() ); + appAuthLoginRespVO.setExpiresTime( bean.getExpiresTime() ); + + return appAuthLoginRespVO; + } + + @Override + public AppAuthLoginRespVO convert(OAuth2AccessTokenRespDTO bean) { + if ( bean == null ) { + return null; + } + + AppAuthLoginRespVO appAuthLoginRespVO = new AppAuthLoginRespVO(); + + appAuthLoginRespVO.setUserId( bean.getUserId() ); + appAuthLoginRespVO.setAccessToken( bean.getAccessToken() ); + appAuthLoginRespVO.setRefreshToken( bean.getRefreshToken() ); + appAuthLoginRespVO.setExpiresTime( bean.getExpiresTime() ); + + return appAuthLoginRespVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/auth/OAuth2ClientConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/auth/OAuth2ClientConvertImpl.java new file mode 100644 index 0000000..d818dfe --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/auth/OAuth2ClientConvertImpl.java @@ -0,0 +1,184 @@ +package com.jojubanking.boot.module.system.convert.auth; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.client.OAuth2ClientUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2ClientDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class OAuth2ClientConvertImpl implements OAuth2ClientConvert { + + @Override + public OAuth2ClientDO convert(OAuth2ClientCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + OAuth2ClientDO oAuth2ClientDO = new OAuth2ClientDO(); + + oAuth2ClientDO.setClientId( bean.getClientId() ); + oAuth2ClientDO.setSecret( bean.getSecret() ); + oAuth2ClientDO.setName( bean.getName() ); + oAuth2ClientDO.setLogo( bean.getLogo() ); + oAuth2ClientDO.setDescription( bean.getDescription() ); + oAuth2ClientDO.setStatus( bean.getStatus() ); + oAuth2ClientDO.setAccessTokenValiditySeconds( bean.getAccessTokenValiditySeconds() ); + oAuth2ClientDO.setRefreshTokenValiditySeconds( bean.getRefreshTokenValiditySeconds() ); + List list = bean.getRedirectUris(); + if ( list != null ) { + oAuth2ClientDO.setRedirectUris( new ArrayList( list ) ); + } + List list1 = bean.getAuthorizedGrantTypes(); + if ( list1 != null ) { + oAuth2ClientDO.setAuthorizedGrantTypes( new ArrayList( list1 ) ); + } + List list2 = bean.getScopes(); + if ( list2 != null ) { + oAuth2ClientDO.setScopes( new ArrayList( list2 ) ); + } + List list3 = bean.getAutoApproveScopes(); + if ( list3 != null ) { + oAuth2ClientDO.setAutoApproveScopes( new ArrayList( list3 ) ); + } + List list4 = bean.getAuthorities(); + if ( list4 != null ) { + oAuth2ClientDO.setAuthorities( new ArrayList( list4 ) ); + } + List list5 = bean.getResourceIds(); + if ( list5 != null ) { + oAuth2ClientDO.setResourceIds( new ArrayList( list5 ) ); + } + oAuth2ClientDO.setAdditionalInformation( bean.getAdditionalInformation() ); + + return oAuth2ClientDO; + } + + @Override + public OAuth2ClientDO convert(OAuth2ClientUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + OAuth2ClientDO oAuth2ClientDO = new OAuth2ClientDO(); + + oAuth2ClientDO.setId( bean.getId() ); + oAuth2ClientDO.setClientId( bean.getClientId() ); + oAuth2ClientDO.setSecret( bean.getSecret() ); + oAuth2ClientDO.setName( bean.getName() ); + oAuth2ClientDO.setLogo( bean.getLogo() ); + oAuth2ClientDO.setDescription( bean.getDescription() ); + oAuth2ClientDO.setStatus( bean.getStatus() ); + oAuth2ClientDO.setAccessTokenValiditySeconds( bean.getAccessTokenValiditySeconds() ); + oAuth2ClientDO.setRefreshTokenValiditySeconds( bean.getRefreshTokenValiditySeconds() ); + List list = bean.getRedirectUris(); + if ( list != null ) { + oAuth2ClientDO.setRedirectUris( new ArrayList( list ) ); + } + List list1 = bean.getAuthorizedGrantTypes(); + if ( list1 != null ) { + oAuth2ClientDO.setAuthorizedGrantTypes( new ArrayList( list1 ) ); + } + List list2 = bean.getScopes(); + if ( list2 != null ) { + oAuth2ClientDO.setScopes( new ArrayList( list2 ) ); + } + List list3 = bean.getAutoApproveScopes(); + if ( list3 != null ) { + oAuth2ClientDO.setAutoApproveScopes( new ArrayList( list3 ) ); + } + List list4 = bean.getAuthorities(); + if ( list4 != null ) { + oAuth2ClientDO.setAuthorities( new ArrayList( list4 ) ); + } + List list5 = bean.getResourceIds(); + if ( list5 != null ) { + oAuth2ClientDO.setResourceIds( new ArrayList( list5 ) ); + } + oAuth2ClientDO.setAdditionalInformation( bean.getAdditionalInformation() ); + + return oAuth2ClientDO; + } + + @Override + public OAuth2ClientRespVO convert(OAuth2ClientDO bean) { + if ( bean == null ) { + return null; + } + + OAuth2ClientRespVO oAuth2ClientRespVO = new OAuth2ClientRespVO(); + + oAuth2ClientRespVO.setClientId( bean.getClientId() ); + oAuth2ClientRespVO.setSecret( bean.getSecret() ); + oAuth2ClientRespVO.setName( bean.getName() ); + oAuth2ClientRespVO.setLogo( bean.getLogo() ); + oAuth2ClientRespVO.setDescription( bean.getDescription() ); + oAuth2ClientRespVO.setStatus( bean.getStatus() ); + oAuth2ClientRespVO.setAccessTokenValiditySeconds( bean.getAccessTokenValiditySeconds() ); + oAuth2ClientRespVO.setRefreshTokenValiditySeconds( bean.getRefreshTokenValiditySeconds() ); + List list = bean.getRedirectUris(); + if ( list != null ) { + oAuth2ClientRespVO.setRedirectUris( new ArrayList( list ) ); + } + List list1 = bean.getAuthorizedGrantTypes(); + if ( list1 != null ) { + oAuth2ClientRespVO.setAuthorizedGrantTypes( new ArrayList( list1 ) ); + } + List list2 = bean.getScopes(); + if ( list2 != null ) { + oAuth2ClientRespVO.setScopes( new ArrayList( list2 ) ); + } + List list3 = bean.getAutoApproveScopes(); + if ( list3 != null ) { + oAuth2ClientRespVO.setAutoApproveScopes( new ArrayList( list3 ) ); + } + List list4 = bean.getAuthorities(); + if ( list4 != null ) { + oAuth2ClientRespVO.setAuthorities( new ArrayList( list4 ) ); + } + List list5 = bean.getResourceIds(); + if ( list5 != null ) { + oAuth2ClientRespVO.setResourceIds( new ArrayList( list5 ) ); + } + oAuth2ClientRespVO.setAdditionalInformation( bean.getAdditionalInformation() ); + oAuth2ClientRespVO.setId( bean.getId() ); + oAuth2ClientRespVO.setCreateTime( bean.getCreateTime() ); + + return oAuth2ClientRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( OAuth2ClientDO oAuth2ClientDO : list ) { + list1.add( convert( oAuth2ClientDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/auth/OAuth2TokenConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/auth/OAuth2TokenConvertImpl.java new file mode 100644 index 0000000..9b20f51 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/auth/OAuth2TokenConvertImpl.java @@ -0,0 +1,100 @@ +package com.jojubanking.boot.module.system.convert.auth; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import com.jojubanking.boot.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class OAuth2TokenConvertImpl implements OAuth2TokenConvert { + + @Override + public OAuth2AccessTokenCheckRespDTO convert(OAuth2AccessTokenDO bean) { + if ( bean == null ) { + return null; + } + + OAuth2AccessTokenCheckRespDTO oAuth2AccessTokenCheckRespDTO = new OAuth2AccessTokenCheckRespDTO(); + + oAuth2AccessTokenCheckRespDTO.setUserId( bean.getUserId() ); + oAuth2AccessTokenCheckRespDTO.setUserType( bean.getUserType() ); + oAuth2AccessTokenCheckRespDTO.setTenantId( bean.getTenantId() ); + List list = bean.getScopes(); + if ( list != null ) { + oAuth2AccessTokenCheckRespDTO.setScopes( new ArrayList( list ) ); + } + + return oAuth2AccessTokenCheckRespDTO; + } + + @Override + public PageResult convert(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( oAuth2AccessTokenDOListToOAuth2AccessTokenRespVOList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public OAuth2AccessTokenRespDTO convert2(OAuth2AccessTokenDO bean) { + if ( bean == null ) { + return null; + } + + OAuth2AccessTokenRespDTO oAuth2AccessTokenRespDTO = new OAuth2AccessTokenRespDTO(); + + oAuth2AccessTokenRespDTO.setAccessToken( bean.getAccessToken() ); + oAuth2AccessTokenRespDTO.setRefreshToken( bean.getRefreshToken() ); + oAuth2AccessTokenRespDTO.setUserId( bean.getUserId() ); + oAuth2AccessTokenRespDTO.setUserType( bean.getUserType() ); + oAuth2AccessTokenRespDTO.setExpiresTime( bean.getExpiresTime() ); + + return oAuth2AccessTokenRespDTO; + } + + protected OAuth2AccessTokenRespVO oAuth2AccessTokenDOToOAuth2AccessTokenRespVO(OAuth2AccessTokenDO oAuth2AccessTokenDO) { + if ( oAuth2AccessTokenDO == null ) { + return null; + } + + OAuth2AccessTokenRespVO oAuth2AccessTokenRespVO = new OAuth2AccessTokenRespVO(); + + oAuth2AccessTokenRespVO.setId( oAuth2AccessTokenDO.getId() ); + oAuth2AccessTokenRespVO.setAccessToken( oAuth2AccessTokenDO.getAccessToken() ); + oAuth2AccessTokenRespVO.setRefreshToken( oAuth2AccessTokenDO.getRefreshToken() ); + oAuth2AccessTokenRespVO.setUserId( oAuth2AccessTokenDO.getUserId() ); + oAuth2AccessTokenRespVO.setUserType( oAuth2AccessTokenDO.getUserType() ); + oAuth2AccessTokenRespVO.setClientId( oAuth2AccessTokenDO.getClientId() ); + oAuth2AccessTokenRespVO.setCreateTime( oAuth2AccessTokenDO.getCreateTime() ); + oAuth2AccessTokenRespVO.setExpiresTime( oAuth2AccessTokenDO.getExpiresTime() ); + + return oAuth2AccessTokenRespVO; + } + + protected List oAuth2AccessTokenDOListToOAuth2AccessTokenRespVOList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( OAuth2AccessTokenDO oAuth2AccessTokenDO : list ) { + list1.add( oAuth2AccessTokenDOToOAuth2AccessTokenRespVO( oAuth2AccessTokenDO ) ); + } + + return list1; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/building/BuildingConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/building/BuildingConvertImpl.java new file mode 100644 index 0000000..c0bd02b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/building/BuildingConvertImpl.java @@ -0,0 +1,158 @@ +package com.jojubanking.boot.module.system.convert.building; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.building.vo.BuildingCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.building.vo.BuildingExcelVO; +import com.jojubanking.boot.module.system.controller.admin.building.vo.BuildingRespVO; +import com.jojubanking.boot.module.system.controller.admin.building.vo.BuildingSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.building.vo.BuildingUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.building.BuildingDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class BuildingConvertImpl implements BuildingConvert { + + @Override + public BuildingDO convert(BuildingCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + BuildingDO buildingDO = new BuildingDO(); + + buildingDO.setName( bean.getName() ); + buildingDO.setParentId( bean.getParentId() ); + buildingDO.setStatus( bean.getStatus() ); + buildingDO.setFid( bean.getFid() ); + + return buildingDO; + } + + @Override + public BuildingDO convert(BuildingUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + BuildingDO buildingDO = new BuildingDO(); + + buildingDO.setId( bean.getId() ); + buildingDO.setName( bean.getName() ); + buildingDO.setParentId( bean.getParentId() ); + buildingDO.setStatus( bean.getStatus() ); + buildingDO.setFid( bean.getFid() ); + + return buildingDO; + } + + @Override + public BuildingRespVO convert(BuildingDO bean) { + if ( bean == null ) { + return null; + } + + BuildingRespVO buildingRespVO = new BuildingRespVO(); + + buildingRespVO.setName( bean.getName() ); + buildingRespVO.setParentId( bean.getParentId() ); + buildingRespVO.setStatus( bean.getStatus() ); + buildingRespVO.setFid( bean.getFid() ); + buildingRespVO.setId( bean.getId() ); + buildingRespVO.setCreateTime( bean.getCreateTime() ); + + return buildingRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( BuildingDO buildingDO : list ) { + list1.add( convert( buildingDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( BuildingDO buildingDO : list ) { + list1.add( buildingDOToBuildingExcelVO( buildingDO ) ); + } + + return list1; + } + + @Override + public List convertList03(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( BuildingDO buildingDO : list ) { + list1.add( buildingDOToBuildingSimpleRespVO( buildingDO ) ); + } + + return list1; + } + + protected BuildingExcelVO buildingDOToBuildingExcelVO(BuildingDO buildingDO) { + if ( buildingDO == null ) { + return null; + } + + BuildingExcelVO buildingExcelVO = new BuildingExcelVO(); + + buildingExcelVO.setId( buildingDO.getId() ); + buildingExcelVO.setName( buildingDO.getName() ); + buildingExcelVO.setParentId( buildingDO.getParentId() ); + buildingExcelVO.setStatus( buildingDO.getStatus() ); + buildingExcelVO.setFid( buildingDO.getFid() ); + buildingExcelVO.setCreateTime( buildingDO.getCreateTime() ); + + return buildingExcelVO; + } + + protected BuildingSimpleRespVO buildingDOToBuildingSimpleRespVO(BuildingDO buildingDO) { + if ( buildingDO == null ) { + return null; + } + + BuildingSimpleRespVO buildingSimpleRespVO = new BuildingSimpleRespVO(); + + buildingSimpleRespVO.setId( buildingDO.getId() ); + buildingSimpleRespVO.setName( buildingDO.getName() ); + buildingSimpleRespVO.setParentId( buildingDO.getParentId() ); + + return buildingSimpleRespVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/carousel/CarouselConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/carousel/CarouselConvertImpl.java new file mode 100644 index 0000000..04020f5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/carousel/CarouselConvertImpl.java @@ -0,0 +1,125 @@ +package com.jojubanking.boot.module.system.convert.carousel; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.carousel.vo.CarouselCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.carousel.vo.CarouselExcelVO; +import com.jojubanking.boot.module.system.controller.admin.carousel.vo.CarouselRespVO; +import com.jojubanking.boot.module.system.controller.admin.carousel.vo.CarouselUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.carousel.CarouselDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class CarouselConvertImpl implements CarouselConvert { + + @Override + public CarouselDO convert(CarouselCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + CarouselDO carouselDO = new CarouselDO(); + + carouselDO.setTitle( bean.getTitle() ); + carouselDO.setImg( bean.getImg() ); + carouselDO.setType( bean.getType() ); + + return carouselDO; + } + + @Override + public CarouselDO convert(CarouselUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + CarouselDO carouselDO = new CarouselDO(); + + carouselDO.setId( bean.getId() ); + carouselDO.setTitle( bean.getTitle() ); + carouselDO.setImg( bean.getImg() ); + carouselDO.setType( bean.getType() ); + + return carouselDO; + } + + @Override + public CarouselRespVO convert(CarouselDO bean) { + if ( bean == null ) { + return null; + } + + CarouselRespVO carouselRespVO = new CarouselRespVO(); + + carouselRespVO.setId( bean.getId() ); + carouselRespVO.setTitle( bean.getTitle() ); + carouselRespVO.setImg( bean.getImg() ); + carouselRespVO.setType( bean.getType() ); + carouselRespVO.setCreateTime( bean.getCreateTime() ); + + return carouselRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( CarouselDO carouselDO : list ) { + list1.add( convert( carouselDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( CarouselDO carouselDO : list ) { + list1.add( carouselDOToCarouselExcelVO( carouselDO ) ); + } + + return list1; + } + + protected CarouselExcelVO carouselDOToCarouselExcelVO(CarouselDO carouselDO) { + if ( carouselDO == null ) { + return null; + } + + CarouselExcelVO carouselExcelVO = new CarouselExcelVO(); + + carouselExcelVO.setId( carouselDO.getId() ); + carouselExcelVO.setTitle( carouselDO.getTitle() ); + carouselExcelVO.setImg( carouselDO.getImg() ); + carouselExcelVO.setType( carouselDO.getType() ); + carouselExcelVO.setCreateTime( carouselDO.getCreateTime() ); + + return carouselExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/childitem/ChilditemConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/childitem/ChilditemConvertImpl.java new file mode 100644 index 0000000..723d2d3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/childitem/ChilditemConvertImpl.java @@ -0,0 +1,145 @@ +package com.jojubanking.boot.module.system.convert.childitem; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.ChilditemCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.ChilditemExcelVO; +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.ChilditemRespVO; +import com.jojubanking.boot.module.system.controller.admin.childitem.vo.ChilditemUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.childitem.ChilditemDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class ChilditemConvertImpl implements ChilditemConvert { + + @Override + public ChilditemDO convert(ChilditemCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + ChilditemDO childitemDO = new ChilditemDO(); + + childitemDO.setPackageno( bean.getPackageno() ); + childitemDO.setItemflag( bean.getItemflag() ); + childitemDO.setItemno( bean.getItemno() ); + childitemDO.setItemname( bean.getItemname() ); + childitemDO.setItemprice( bean.getItemprice() ); + childitemDO.setZxks( bean.getZxks() ); + childitemDO.setZxksname( bean.getZxksname() ); + childitemDO.setKdks( bean.getKdks() ); + childitemDO.setKdksname( bean.getKdksname() ); + + return childitemDO; + } + + @Override + public ChilditemDO convert(ChilditemUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + ChilditemDO childitemDO = new ChilditemDO(); + + childitemDO.setId( bean.getId() ); + childitemDO.setPackageno( bean.getPackageno() ); + childitemDO.setItemflag( bean.getItemflag() ); + childitemDO.setItemno( bean.getItemno() ); + childitemDO.setItemname( bean.getItemname() ); + childitemDO.setItemprice( bean.getItemprice() ); + childitemDO.setZxks( bean.getZxks() ); + childitemDO.setZxksname( bean.getZxksname() ); + childitemDO.setKdks( bean.getKdks() ); + childitemDO.setKdksname( bean.getKdksname() ); + + return childitemDO; + } + + @Override + public ChilditemRespVO convert(ChilditemDO bean) { + if ( bean == null ) { + return null; + } + + ChilditemRespVO childitemRespVO = new ChilditemRespVO(); + + childitemRespVO.setPackageno( bean.getPackageno() ); + childitemRespVO.setItemflag( bean.getItemflag() ); + childitemRespVO.setItemno( bean.getItemno() ); + childitemRespVO.setItemname( bean.getItemname() ); + childitemRespVO.setItemprice( bean.getItemprice() ); + childitemRespVO.setZxks( bean.getZxks() ); + childitemRespVO.setZxksname( bean.getZxksname() ); + childitemRespVO.setKdks( bean.getKdks() ); + childitemRespVO.setKdksname( bean.getKdksname() ); + childitemRespVO.setId( bean.getId() ); + childitemRespVO.setCreateTime( bean.getCreateTime() ); + + return childitemRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ChilditemDO childitemDO : list ) { + list1.add( convert( childitemDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ChilditemDO childitemDO : list ) { + list1.add( childitemDOToChilditemExcelVO( childitemDO ) ); + } + + return list1; + } + + protected ChilditemExcelVO childitemDOToChilditemExcelVO(ChilditemDO childitemDO) { + if ( childitemDO == null ) { + return null; + } + + ChilditemExcelVO childitemExcelVO = new ChilditemExcelVO(); + + childitemExcelVO.setId( childitemDO.getId() ); + childitemExcelVO.setPackageno( childitemDO.getPackageno() ); + childitemExcelVO.setItemflag( childitemDO.getItemflag() ); + childitemExcelVO.setItemno( childitemDO.getItemno() ); + childitemExcelVO.setItemname( childitemDO.getItemname() ); + childitemExcelVO.setItemprice( childitemDO.getItemprice() ); + childitemExcelVO.setCreateTime( childitemDO.getCreateTime() ); + + return childitemExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/common/CaptchaConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/common/CaptchaConvertImpl.java new file mode 100644 index 0000000..d09d8c6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/common/CaptchaConvertImpl.java @@ -0,0 +1,11 @@ +package com.jojubanking.boot.module.system.convert.common; + +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class CaptchaConvertImpl implements CaptchaConvert { +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dept/DeptConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dept/DeptConvertImpl.java new file mode 100644 index 0000000..baba4af --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dept/DeptConvertImpl.java @@ -0,0 +1,152 @@ +package com.jojubanking.boot.module.system.convert.dept; + +import com.jojubanking.boot.module.system.api.dept.dto.DeptRespDTO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptRespVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.dept.DeptUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class DeptConvertImpl implements DeptConvert { + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DeptDO deptDO : list ) { + list1.add( convert( deptDO ) ); + } + + return list1; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DeptDO deptDO : list ) { + list1.add( deptDOToDeptSimpleRespVO( deptDO ) ); + } + + return list1; + } + + @Override + public DeptRespVO convert(DeptDO bean) { + if ( bean == null ) { + return null; + } + + DeptRespVO deptRespVO = new DeptRespVO(); + + deptRespVO.setName( bean.getName() ); + deptRespVO.setParentId( bean.getParentId() ); + deptRespVO.setSort( bean.getSort() ); + deptRespVO.setLeaderUserId( bean.getLeaderUserId() ); + deptRespVO.setPhone( bean.getPhone() ); + deptRespVO.setEmail( bean.getEmail() ); + deptRespVO.setId( bean.getId() ); + deptRespVO.setStatus( bean.getStatus() ); + deptRespVO.setCreateTime( bean.getCreateTime() ); + + return deptRespVO; + } + + @Override + public DeptDO convert(DeptCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + DeptDO deptDO = new DeptDO(); + + deptDO.setName( bean.getName() ); + deptDO.setParentId( bean.getParentId() ); + deptDO.setSort( bean.getSort() ); + deptDO.setLeaderUserId( bean.getLeaderUserId() ); + deptDO.setPhone( bean.getPhone() ); + deptDO.setEmail( bean.getEmail() ); + deptDO.setStatus( bean.getStatus() ); + + return deptDO; + } + + @Override + public DeptDO convert(DeptUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + DeptDO deptDO = new DeptDO(); + + deptDO.setId( bean.getId() ); + deptDO.setName( bean.getName() ); + deptDO.setParentId( bean.getParentId() ); + deptDO.setSort( bean.getSort() ); + deptDO.setLeaderUserId( bean.getLeaderUserId() ); + deptDO.setPhone( bean.getPhone() ); + deptDO.setEmail( bean.getEmail() ); + deptDO.setStatus( bean.getStatus() ); + + return deptDO; + } + + @Override + public List convertList03(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DeptDO deptDO : list ) { + list1.add( convert03( deptDO ) ); + } + + return list1; + } + + @Override + public DeptRespDTO convert03(DeptDO bean) { + if ( bean == null ) { + return null; + } + + DeptRespDTO deptRespDTO = new DeptRespDTO(); + + deptRespDTO.setId( bean.getId() ); + deptRespDTO.setName( bean.getName() ); + deptRespDTO.setParentId( bean.getParentId() ); + deptRespDTO.setLeaderUserId( bean.getLeaderUserId() ); + deptRespDTO.setStatus( bean.getStatus() ); + + return deptRespDTO; + } + + protected DeptSimpleRespVO deptDOToDeptSimpleRespVO(DeptDO deptDO) { + if ( deptDO == null ) { + return null; + } + + DeptSimpleRespVO deptSimpleRespVO = new DeptSimpleRespVO(); + + deptSimpleRespVO.setId( deptDO.getId() ); + deptSimpleRespVO.setName( deptDO.getName() ); + deptSimpleRespVO.setParentId( deptDO.getParentId() ); + + return deptSimpleRespVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dept/PostConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dept/PostConvertImpl.java new file mode 100644 index 0000000..0eae4a6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dept/PostConvertImpl.java @@ -0,0 +1,160 @@ +package com.jojubanking.boot.module.system.convert.dept; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostExcelVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostRespVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.dept.vo.post.PostUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class PostConvertImpl implements PostConvert { + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PostDO postDO : list ) { + list1.add( postDOToPostSimpleRespVO( postDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( postDOListToPostRespVOList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public PostRespVO convert(PostDO id) { + if ( id == null ) { + return null; + } + + PostRespVO postRespVO = new PostRespVO(); + + postRespVO.setName( id.getName() ); + postRespVO.setCode( id.getCode() ); + postRespVO.setSort( id.getSort() ); + postRespVO.setStatus( id.getStatus() ); + postRespVO.setRemark( id.getRemark() ); + postRespVO.setId( id.getId() ); + postRespVO.setCreateTime( id.getCreateTime() ); + + return postRespVO; + } + + @Override + public PostDO convert(PostCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + PostDO postDO = new PostDO(); + + postDO.setName( bean.getName() ); + postDO.setCode( bean.getCode() ); + postDO.setSort( bean.getSort() ); + postDO.setStatus( bean.getStatus() ); + postDO.setRemark( bean.getRemark() ); + + return postDO; + } + + @Override + public PostDO convert(PostUpdateReqVO reqVO) { + if ( reqVO == null ) { + return null; + } + + PostDO postDO = new PostDO(); + + postDO.setId( reqVO.getId() ); + postDO.setName( reqVO.getName() ); + postDO.setCode( reqVO.getCode() ); + postDO.setSort( reqVO.getSort() ); + postDO.setStatus( reqVO.getStatus() ); + postDO.setRemark( reqVO.getRemark() ); + + return postDO; + } + + @Override + public List convertList03(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PostDO postDO : list ) { + list1.add( postDOToPostExcelVO( postDO ) ); + } + + return list1; + } + + protected PostSimpleRespVO postDOToPostSimpleRespVO(PostDO postDO) { + if ( postDO == null ) { + return null; + } + + PostSimpleRespVO postSimpleRespVO = new PostSimpleRespVO(); + + postSimpleRespVO.setId( postDO.getId() ); + postSimpleRespVO.setName( postDO.getName() ); + + return postSimpleRespVO; + } + + protected List postDOListToPostRespVOList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PostDO postDO : list ) { + list1.add( convert( postDO ) ); + } + + return list1; + } + + protected PostExcelVO postDOToPostExcelVO(PostDO postDO) { + if ( postDO == null ) { + return null; + } + + PostExcelVO postExcelVO = new PostExcelVO(); + + postExcelVO.setId( postDO.getId() ); + postExcelVO.setCode( postDO.getCode() ); + postExcelVO.setName( postDO.getName() ); + postExcelVO.setSort( postDO.getSort() ); + if ( postDO.getStatus() != null ) { + postExcelVO.setStatus( String.valueOf( postDO.getStatus() ) ); + } + + return postExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/deptxq/DeptXqConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/deptxq/DeptXqConvertImpl.java new file mode 100644 index 0000000..b60bdb2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/deptxq/DeptXqConvertImpl.java @@ -0,0 +1,170 @@ +package com.jojubanking.boot.module.system.convert.deptxq; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.deptxq.vo.DeptXqCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.deptxq.vo.DeptXqExcelVO; +import com.jojubanking.boot.module.system.controller.admin.deptxq.vo.DeptXqRespVO; +import com.jojubanking.boot.module.system.controller.admin.deptxq.vo.DeptXqSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.deptxq.vo.DeptXqUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.deptxq.DeptXqDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class DeptXqConvertImpl implements DeptXqConvert { + + @Override + public DeptXqDO convert(DeptXqCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + DeptXqDO deptXqDO = new DeptXqDO(); + + deptXqDO.setName( bean.getName() ); + deptXqDO.setParentId( bean.getParentId() ); + deptXqDO.setSort( bean.getSort() ); + deptXqDO.setLeaderUserId( bean.getLeaderUserId() ); + deptXqDO.setPhone( bean.getPhone() ); + deptXqDO.setEmail( bean.getEmail() ); + deptXqDO.setStatus( bean.getStatus() ); + + return deptXqDO; + } + + @Override + public DeptXqDO convert(DeptXqUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + DeptXqDO deptXqDO = new DeptXqDO(); + + deptXqDO.setId( bean.getId() ); + deptXqDO.setName( bean.getName() ); + deptXqDO.setParentId( bean.getParentId() ); + deptXqDO.setSort( bean.getSort() ); + deptXqDO.setLeaderUserId( bean.getLeaderUserId() ); + deptXqDO.setPhone( bean.getPhone() ); + deptXqDO.setEmail( bean.getEmail() ); + deptXqDO.setStatus( bean.getStatus() ); + + return deptXqDO; + } + + @Override + public DeptXqRespVO convert(DeptXqDO bean) { + if ( bean == null ) { + return null; + } + + DeptXqRespVO deptXqRespVO = new DeptXqRespVO(); + + deptXqRespVO.setName( bean.getName() ); + deptXqRespVO.setParentId( bean.getParentId() ); + deptXqRespVO.setSort( bean.getSort() ); + deptXqRespVO.setLeaderUserId( bean.getLeaderUserId() ); + deptXqRespVO.setPhone( bean.getPhone() ); + deptXqRespVO.setEmail( bean.getEmail() ); + deptXqRespVO.setStatus( bean.getStatus() ); + deptXqRespVO.setId( bean.getId() ); + deptXqRespVO.setCreateTime( bean.getCreateTime() ); + + return deptXqRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DeptXqDO deptXqDO : list ) { + list1.add( convert( deptXqDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DeptXqDO deptXqDO : list ) { + list1.add( deptXqDOToDeptXqExcelVO( deptXqDO ) ); + } + + return list1; + } + + @Override + public List convertList03(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DeptXqDO deptXqDO : list ) { + list1.add( deptXqDOToDeptXqSimpleRespVO( deptXqDO ) ); + } + + return list1; + } + + protected DeptXqExcelVO deptXqDOToDeptXqExcelVO(DeptXqDO deptXqDO) { + if ( deptXqDO == null ) { + return null; + } + + DeptXqExcelVO deptXqExcelVO = new DeptXqExcelVO(); + + deptXqExcelVO.setId( deptXqDO.getId() ); + deptXqExcelVO.setName( deptXqDO.getName() ); + deptXqExcelVO.setParentId( deptXqDO.getParentId() ); + deptXqExcelVO.setSort( deptXqDO.getSort() ); + deptXqExcelVO.setLeaderUserId( deptXqDO.getLeaderUserId() ); + deptXqExcelVO.setPhone( deptXqDO.getPhone() ); + deptXqExcelVO.setEmail( deptXqDO.getEmail() ); + deptXqExcelVO.setStatus( deptXqDO.getStatus() ); + deptXqExcelVO.setCreateTime( deptXqDO.getCreateTime() ); + + return deptXqExcelVO; + } + + protected DeptXqSimpleRespVO deptXqDOToDeptXqSimpleRespVO(DeptXqDO deptXqDO) { + if ( deptXqDO == null ) { + return null; + } + + DeptXqSimpleRespVO deptXqSimpleRespVO = new DeptXqSimpleRespVO(); + + deptXqSimpleRespVO.setId( deptXqDO.getId() ); + deptXqSimpleRespVO.setName( deptXqDO.getName() ); + deptXqSimpleRespVO.setParentId( deptXqDO.getParentId() ); + + return deptXqSimpleRespVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dict/DictDataConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dict/DictDataConvertImpl.java new file mode 100644 index 0000000..eab7c08 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dict/DictDataConvertImpl.java @@ -0,0 +1,188 @@ +package com.jojubanking.boot.module.system.convert.dict; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.dict.dto.DictDataRespDTO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataExcelVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataRespVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.data.DictDataUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictDataDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class DictDataConvertImpl implements DictDataConvert { + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DictDataDO dictDataDO : list ) { + list1.add( dictDataDOToDictDataSimpleRespVO( dictDataDO ) ); + } + + return list1; + } + + @Override + public DictDataRespVO convert(DictDataDO bean) { + if ( bean == null ) { + return null; + } + + DictDataRespVO dictDataRespVO = new DictDataRespVO(); + + dictDataRespVO.setSort( bean.getSort() ); + dictDataRespVO.setLabel( bean.getLabel() ); + dictDataRespVO.setValue( bean.getValue() ); + dictDataRespVO.setDictType( bean.getDictType() ); + dictDataRespVO.setStatus( bean.getStatus() ); + dictDataRespVO.setColorType( bean.getColorType() ); + dictDataRespVO.setCssClass( bean.getCssClass() ); + dictDataRespVO.setRemark( bean.getRemark() ); + dictDataRespVO.setId( bean.getId() ); + dictDataRespVO.setCreateTime( bean.getCreateTime() ); + + return dictDataRespVO; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( dictDataDOListToDictDataRespVOList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public DictDataDO convert(DictDataUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + DictDataDO dictDataDO = new DictDataDO(); + + dictDataDO.setId( bean.getId() ); + dictDataDO.setSort( bean.getSort() ); + dictDataDO.setLabel( bean.getLabel() ); + dictDataDO.setValue( bean.getValue() ); + dictDataDO.setDictType( bean.getDictType() ); + dictDataDO.setStatus( bean.getStatus() ); + dictDataDO.setColorType( bean.getColorType() ); + dictDataDO.setCssClass( bean.getCssClass() ); + dictDataDO.setRemark( bean.getRemark() ); + + return dictDataDO; + } + + @Override + public DictDataDO convert(DictDataCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + DictDataDO dictDataDO = new DictDataDO(); + + dictDataDO.setSort( bean.getSort() ); + dictDataDO.setLabel( bean.getLabel() ); + dictDataDO.setValue( bean.getValue() ); + dictDataDO.setDictType( bean.getDictType() ); + dictDataDO.setStatus( bean.getStatus() ); + dictDataDO.setColorType( bean.getColorType() ); + dictDataDO.setCssClass( bean.getCssClass() ); + dictDataDO.setRemark( bean.getRemark() ); + + return dictDataDO; + } + + @Override + public List convertList02(List bean) { + if ( bean == null ) { + return null; + } + + List list = new ArrayList( bean.size() ); + for ( DictDataDO dictDataDO : bean ) { + list.add( dictDataDOToDictDataExcelVO( dictDataDO ) ); + } + + return list; + } + + @Override + public DictDataRespDTO convert02(DictDataDO bean) { + if ( bean == null ) { + return null; + } + + DictDataRespDTO dictDataRespDTO = new DictDataRespDTO(); + + dictDataRespDTO.setLabel( bean.getLabel() ); + dictDataRespDTO.setValue( bean.getValue() ); + dictDataRespDTO.setDictType( bean.getDictType() ); + dictDataRespDTO.setStatus( bean.getStatus() ); + + return dictDataRespDTO; + } + + protected DictDataSimpleRespVO dictDataDOToDictDataSimpleRespVO(DictDataDO dictDataDO) { + if ( dictDataDO == null ) { + return null; + } + + DictDataSimpleRespVO dictDataSimpleRespVO = new DictDataSimpleRespVO(); + + dictDataSimpleRespVO.setDictType( dictDataDO.getDictType() ); + dictDataSimpleRespVO.setValue( dictDataDO.getValue() ); + dictDataSimpleRespVO.setLabel( dictDataDO.getLabel() ); + dictDataSimpleRespVO.setColorType( dictDataDO.getColorType() ); + dictDataSimpleRespVO.setCssClass( dictDataDO.getCssClass() ); + + return dictDataSimpleRespVO; + } + + protected List dictDataDOListToDictDataRespVOList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DictDataDO dictDataDO : list ) { + list1.add( convert( dictDataDO ) ); + } + + return list1; + } + + protected DictDataExcelVO dictDataDOToDictDataExcelVO(DictDataDO dictDataDO) { + if ( dictDataDO == null ) { + return null; + } + + DictDataExcelVO dictDataExcelVO = new DictDataExcelVO(); + + dictDataExcelVO.setId( dictDataDO.getId() ); + dictDataExcelVO.setSort( dictDataDO.getSort() ); + dictDataExcelVO.setLabel( dictDataDO.getLabel() ); + dictDataExcelVO.setValue( dictDataDO.getValue() ); + dictDataExcelVO.setDictType( dictDataDO.getDictType() ); + dictDataExcelVO.setStatus( dictDataDO.getStatus() ); + + return dictDataExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dict/DictTypeConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dict/DictTypeConvertImpl.java new file mode 100644 index 0000000..ec5f252 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dict/DictTypeConvertImpl.java @@ -0,0 +1,154 @@ +package com.jojubanking.boot.module.system.convert.dict; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeExcelVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeRespVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.dict.vo.type.DictTypeUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dict.DictTypeDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class DictTypeConvertImpl implements DictTypeConvert { + + @Override + public PageResult convertPage(PageResult bean) { + if ( bean == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( dictTypeDOListToDictTypeRespVOList( bean.getList() ) ); + pageResult.setTotal( bean.getTotal() ); + + return pageResult; + } + + @Override + public DictTypeRespVO convert(DictTypeDO bean) { + if ( bean == null ) { + return null; + } + + DictTypeRespVO dictTypeRespVO = new DictTypeRespVO(); + + dictTypeRespVO.setName( bean.getName() ); + dictTypeRespVO.setStatus( bean.getStatus() ); + dictTypeRespVO.setRemark( bean.getRemark() ); + dictTypeRespVO.setId( bean.getId() ); + dictTypeRespVO.setType( bean.getType() ); + dictTypeRespVO.setCreateTime( bean.getCreateTime() ); + + return dictTypeRespVO; + } + + @Override + public DictTypeDO convert(DictTypeCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + DictTypeDO dictTypeDO = new DictTypeDO(); + + dictTypeDO.setName( bean.getName() ); + dictTypeDO.setType( bean.getType() ); + dictTypeDO.setStatus( bean.getStatus() ); + dictTypeDO.setRemark( bean.getRemark() ); + + return dictTypeDO; + } + + @Override + public DictTypeDO convert(DictTypeUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + DictTypeDO dictTypeDO = new DictTypeDO(); + + dictTypeDO.setId( bean.getId() ); + dictTypeDO.setName( bean.getName() ); + dictTypeDO.setStatus( bean.getStatus() ); + dictTypeDO.setRemark( bean.getRemark() ); + + return dictTypeDO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DictTypeDO dictTypeDO : list ) { + list1.add( dictTypeDOToDictTypeSimpleRespVO( dictTypeDO ) ); + } + + return list1; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DictTypeDO dictTypeDO : list ) { + list1.add( dictTypeDOToDictTypeExcelVO( dictTypeDO ) ); + } + + return list1; + } + + protected List dictTypeDOListToDictTypeRespVOList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DictTypeDO dictTypeDO : list ) { + list1.add( convert( dictTypeDO ) ); + } + + return list1; + } + + protected DictTypeSimpleRespVO dictTypeDOToDictTypeSimpleRespVO(DictTypeDO dictTypeDO) { + if ( dictTypeDO == null ) { + return null; + } + + DictTypeSimpleRespVO dictTypeSimpleRespVO = new DictTypeSimpleRespVO(); + + dictTypeSimpleRespVO.setId( dictTypeDO.getId() ); + dictTypeSimpleRespVO.setName( dictTypeDO.getName() ); + dictTypeSimpleRespVO.setType( dictTypeDO.getType() ); + + return dictTypeSimpleRespVO; + } + + protected DictTypeExcelVO dictTypeDOToDictTypeExcelVO(DictTypeDO dictTypeDO) { + if ( dictTypeDO == null ) { + return null; + } + + DictTypeExcelVO dictTypeExcelVO = new DictTypeExcelVO(); + + dictTypeExcelVO.setId( dictTypeDO.getId() ); + dictTypeExcelVO.setName( dictTypeDO.getName() ); + dictTypeExcelVO.setType( dictTypeDO.getType() ); + dictTypeExcelVO.setStatus( dictTypeDO.getStatus() ); + + return dictTypeExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/doctor/DoctorConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/doctor/DoctorConvertImpl.java new file mode 100644 index 0000000..39b524a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/doctor/DoctorConvertImpl.java @@ -0,0 +1,144 @@ +package com.jojubanking.boot.module.system.convert.doctor; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.doctor.vo.DoctorCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.doctor.vo.DoctorExcelVO; +import com.jojubanking.boot.module.system.controller.admin.doctor.vo.DoctorRespVO; +import com.jojubanking.boot.module.system.controller.admin.doctor.vo.DoctorUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.doctor.DoctorDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class DoctorConvertImpl implements DoctorConvert { + + @Override + public DoctorDO convert(DoctorCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + DoctorDO doctorDO = new DoctorDO(); + + doctorDO.setSort( bean.getSort() ); + doctorDO.setName( bean.getName() ); + doctorDO.setImg( bean.getImg() ); + doctorDO.setMid( bean.getMid() ); + doctorDO.setInfo( bean.getInfo() ); + doctorDO.setGrsc( bean.getGrsc() ); + doctorDO.setZztime( bean.getZztime() ); + doctorDO.setLabel( bean.getLabel() ); + + return doctorDO; + } + + @Override + public DoctorDO convert(DoctorUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + DoctorDO doctorDO = new DoctorDO(); + + doctorDO.setId( bean.getId() ); + doctorDO.setSort( bean.getSort() ); + doctorDO.setName( bean.getName() ); + doctorDO.setImg( bean.getImg() ); + doctorDO.setMid( bean.getMid() ); + doctorDO.setInfo( bean.getInfo() ); + doctorDO.setGrsc( bean.getGrsc() ); + doctorDO.setZztime( bean.getZztime() ); + doctorDO.setLabel( bean.getLabel() ); + + return doctorDO; + } + + @Override + public DoctorRespVO convert(DoctorDO bean) { + if ( bean == null ) { + return null; + } + + DoctorRespVO doctorRespVO = new DoctorRespVO(); + + doctorRespVO.setSort( bean.getSort() ); + doctorRespVO.setName( bean.getName() ); + doctorRespVO.setImg( bean.getImg() ); + doctorRespVO.setMid( bean.getMid() ); + doctorRespVO.setInfo( bean.getInfo() ); + doctorRespVO.setGrsc( bean.getGrsc() ); + doctorRespVO.setZztime( bean.getZztime() ); + doctorRespVO.setLabel( bean.getLabel() ); + doctorRespVO.setId( bean.getId() ); + doctorRespVO.setCreateTime( bean.getCreateTime() ); + + return doctorRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DoctorDO doctorDO : list ) { + list1.add( convert( doctorDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DoctorDO doctorDO : list ) { + list1.add( doctorDOToDoctorExcelVO( doctorDO ) ); + } + + return list1; + } + + protected DoctorExcelVO doctorDOToDoctorExcelVO(DoctorDO doctorDO) { + if ( doctorDO == null ) { + return null; + } + + DoctorExcelVO doctorExcelVO = new DoctorExcelVO(); + + doctorExcelVO.setId( doctorDO.getId() ); + doctorExcelVO.setName( doctorDO.getName() ); + doctorExcelVO.setImg( doctorDO.getImg() ); + doctorExcelVO.setMid( doctorDO.getMid() ); + doctorExcelVO.setInfo( doctorDO.getInfo() ); + doctorExcelVO.setGrsc( doctorDO.getGrsc() ); + doctorExcelVO.setZztime( doctorDO.getZztime() ); + doctorExcelVO.setLabel( doctorDO.getLabel() ); + doctorExcelVO.setCreateTime( doctorDO.getCreateTime() ); + + return doctorExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dzquestion/DzQuestionConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dzquestion/DzQuestionConvertImpl.java new file mode 100644 index 0000000..fef7203 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dzquestion/DzQuestionConvertImpl.java @@ -0,0 +1,141 @@ +package com.jojubanking.boot.module.system.convert.dzquestion; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.dzquestion.vo.DzQuestionCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dzquestion.vo.DzQuestionExcelVO; +import com.jojubanking.boot.module.system.controller.admin.dzquestion.vo.DzQuestionRespVO; +import com.jojubanking.boot.module.system.controller.admin.dzquestion.vo.DzQuestionUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dzquestion.DzQuestionDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class DzQuestionConvertImpl implements DzQuestionConvert { + + @Override + public DzQuestionDO convert(DzQuestionCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + DzQuestionDO dzQuestionDO = new DzQuestionDO(); + + dzQuestionDO.setQuestion( bean.getQuestion() ); + dzQuestionDO.setDepartmentName( bean.getDepartmentName() ); + dzQuestionDO.setDepartmentNo( bean.getDepartmentNo() ); + dzQuestionDO.setBodyAreaType( bean.getBodyAreaType() ); + dzQuestionDO.setBodyArerName( bean.getBodyArerName() ); + dzQuestionDO.setQuestionType( bean.getQuestionType() ); + dzQuestionDO.setQuestionTypeName( bean.getQuestionTypeName() ); + + return dzQuestionDO; + } + + @Override + public DzQuestionDO convert(DzQuestionUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + DzQuestionDO dzQuestionDO = new DzQuestionDO(); + + dzQuestionDO.setId( bean.getId() ); + dzQuestionDO.setQuestion( bean.getQuestion() ); + dzQuestionDO.setDepartmentName( bean.getDepartmentName() ); + dzQuestionDO.setDepartmentNo( bean.getDepartmentNo() ); + dzQuestionDO.setBodyAreaType( bean.getBodyAreaType() ); + dzQuestionDO.setBodyArerName( bean.getBodyArerName() ); + dzQuestionDO.setQuestionType( bean.getQuestionType() ); + dzQuestionDO.setQuestionTypeName( bean.getQuestionTypeName() ); + + return dzQuestionDO; + } + + @Override + public DzQuestionRespVO convert(DzQuestionDO bean) { + if ( bean == null ) { + return null; + } + + DzQuestionRespVO dzQuestionRespVO = new DzQuestionRespVO(); + + dzQuestionRespVO.setQuestion( bean.getQuestion() ); + dzQuestionRespVO.setDepartmentName( bean.getDepartmentName() ); + dzQuestionRespVO.setDepartmentNo( bean.getDepartmentNo() ); + dzQuestionRespVO.setBodyAreaType( bean.getBodyAreaType() ); + dzQuestionRespVO.setBodyArerName( bean.getBodyArerName() ); + dzQuestionRespVO.setQuestionType( bean.getQuestionType() ); + dzQuestionRespVO.setQuestionTypeName( bean.getQuestionTypeName() ); + dzQuestionRespVO.setId( bean.getId() ); + dzQuestionRespVO.setCreateTime( bean.getCreateTime() ); + + return dzQuestionRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DzQuestionDO dzQuestionDO : list ) { + list1.add( convert( dzQuestionDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DzQuestionDO dzQuestionDO : list ) { + list1.add( dzQuestionDOToDzQuestionExcelVO( dzQuestionDO ) ); + } + + return list1; + } + + protected DzQuestionExcelVO dzQuestionDOToDzQuestionExcelVO(DzQuestionDO dzQuestionDO) { + if ( dzQuestionDO == null ) { + return null; + } + + DzQuestionExcelVO dzQuestionExcelVO = new DzQuestionExcelVO(); + + dzQuestionExcelVO.setId( dzQuestionDO.getId() ); + dzQuestionExcelVO.setQuestion( dzQuestionDO.getQuestion() ); + dzQuestionExcelVO.setDepartmentName( dzQuestionDO.getDepartmentName() ); + dzQuestionExcelVO.setDepartmentNo( dzQuestionDO.getDepartmentNo() ); + dzQuestionExcelVO.setBodyAreaType( dzQuestionDO.getBodyAreaType() ); + dzQuestionExcelVO.setBodyArerName( dzQuestionDO.getBodyArerName() ); + dzQuestionExcelVO.setQuestionType( dzQuestionDO.getQuestionType() ); + dzQuestionExcelVO.setQuestionTypeName( dzQuestionDO.getQuestionTypeName() ); + dzQuestionExcelVO.setCreateTime( dzQuestionDO.getCreateTime() ); + + return dzQuestionExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dztype/DzTypeConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dztype/DzTypeConvertImpl.java new file mode 100644 index 0000000..414278e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/dztype/DzTypeConvertImpl.java @@ -0,0 +1,129 @@ +package com.jojubanking.boot.module.system.convert.dztype; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.dztype.vo.DzTypeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.dztype.vo.DzTypeExcelVO; +import com.jojubanking.boot.module.system.controller.admin.dztype.vo.DzTypeRespVO; +import com.jojubanking.boot.module.system.controller.admin.dztype.vo.DzTypeUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dztype.DzTypeDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class DzTypeConvertImpl implements DzTypeConvert { + + @Override + public DzTypeDO convert(DzTypeCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + DzTypeDO dzTypeDO = new DzTypeDO(); + + dzTypeDO.setBodyAreaType( bean.getBodyAreaType() ); + dzTypeDO.setBodyAreaName( bean.getBodyAreaName() ); + dzTypeDO.setQuestionType( bean.getQuestionType() ); + dzTypeDO.setQuestionTypeName( bean.getQuestionTypeName() ); + + return dzTypeDO; + } + + @Override + public DzTypeDO convert(DzTypeUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + DzTypeDO dzTypeDO = new DzTypeDO(); + + dzTypeDO.setId( bean.getId() ); + dzTypeDO.setBodyAreaType( bean.getBodyAreaType() ); + dzTypeDO.setBodyAreaName( bean.getBodyAreaName() ); + dzTypeDO.setQuestionType( bean.getQuestionType() ); + dzTypeDO.setQuestionTypeName( bean.getQuestionTypeName() ); + + return dzTypeDO; + } + + @Override + public DzTypeRespVO convert(DzTypeDO bean) { + if ( bean == null ) { + return null; + } + + DzTypeRespVO dzTypeRespVO = new DzTypeRespVO(); + + dzTypeRespVO.setBodyAreaType( bean.getBodyAreaType() ); + dzTypeRespVO.setBodyAreaName( bean.getBodyAreaName() ); + dzTypeRespVO.setQuestionType( bean.getQuestionType() ); + dzTypeRespVO.setQuestionTypeName( bean.getQuestionTypeName() ); + dzTypeRespVO.setId( bean.getId() ); + dzTypeRespVO.setCreateTime( bean.getCreateTime() ); + + return dzTypeRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DzTypeDO dzTypeDO : list ) { + list1.add( convert( dzTypeDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( DzTypeDO dzTypeDO : list ) { + list1.add( dzTypeDOToDzTypeExcelVO( dzTypeDO ) ); + } + + return list1; + } + + protected DzTypeExcelVO dzTypeDOToDzTypeExcelVO(DzTypeDO dzTypeDO) { + if ( dzTypeDO == null ) { + return null; + } + + DzTypeExcelVO dzTypeExcelVO = new DzTypeExcelVO(); + + dzTypeExcelVO.setId( dzTypeDO.getId() ); + dzTypeExcelVO.setBodyAreaType( dzTypeDO.getBodyAreaType() ); + dzTypeExcelVO.setBodyAreaName( dzTypeDO.getBodyAreaName() ); + dzTypeExcelVO.setQuestionType( dzTypeDO.getQuestionType() ); + dzTypeExcelVO.setQuestionTypeName( dzTypeDO.getQuestionTypeName() ); + dzTypeExcelVO.setCreateTime( dzTypeDO.getCreateTime() ); + + return dzTypeExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/errorcode/ErrorCodeConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/errorcode/ErrorCodeConvertImpl.java new file mode 100644 index 0000000..f90a648 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/errorcode/ErrorCodeConvertImpl.java @@ -0,0 +1,176 @@ +package com.jojubanking.boot.module.system.convert.errorcode; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO; +import com.jojubanking.boot.module.system.api.errorcode.dto.ErrorCodeRespDTO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeExcelVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeRespVO; +import com.jojubanking.boot.module.system.controller.admin.errorcode.vo.ErrorCodeUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.errorcode.ErrorCodeDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class ErrorCodeConvertImpl implements ErrorCodeConvert { + + @Override + public ErrorCodeDO convert(ErrorCodeCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + ErrorCodeDO errorCodeDO = new ErrorCodeDO(); + + errorCodeDO.setApplicationName( bean.getApplicationName() ); + errorCodeDO.setCode( bean.getCode() ); + errorCodeDO.setMessage( bean.getMessage() ); + errorCodeDO.setMemo( bean.getMemo() ); + + return errorCodeDO; + } + + @Override + public ErrorCodeDO convert(ErrorCodeUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + ErrorCodeDO errorCodeDO = new ErrorCodeDO(); + + errorCodeDO.setId( bean.getId() ); + errorCodeDO.setApplicationName( bean.getApplicationName() ); + errorCodeDO.setCode( bean.getCode() ); + errorCodeDO.setMessage( bean.getMessage() ); + errorCodeDO.setMemo( bean.getMemo() ); + + return errorCodeDO; + } + + @Override + public ErrorCodeRespVO convert(ErrorCodeDO bean) { + if ( bean == null ) { + return null; + } + + ErrorCodeRespVO errorCodeRespVO = new ErrorCodeRespVO(); + + errorCodeRespVO.setApplicationName( bean.getApplicationName() ); + errorCodeRespVO.setCode( bean.getCode() ); + errorCodeRespVO.setMessage( bean.getMessage() ); + errorCodeRespVO.setMemo( bean.getMemo() ); + errorCodeRespVO.setId( bean.getId() ); + errorCodeRespVO.setType( bean.getType() ); + errorCodeRespVO.setCreateTime( bean.getCreateTime() ); + + return errorCodeRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ErrorCodeDO errorCodeDO : list ) { + list1.add( convert( errorCodeDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ErrorCodeDO errorCodeDO : list ) { + list1.add( errorCodeDOToErrorCodeExcelVO( errorCodeDO ) ); + } + + return list1; + } + + @Override + public ErrorCodeDO convert(ErrorCodeAutoGenerateReqDTO bean) { + if ( bean == null ) { + return null; + } + + ErrorCodeDO errorCodeDO = new ErrorCodeDO(); + + errorCodeDO.setApplicationName( bean.getApplicationName() ); + errorCodeDO.setCode( bean.getCode() ); + errorCodeDO.setMessage( bean.getMessage() ); + + return errorCodeDO; + } + + @Override + public List convertList03(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ErrorCodeDO errorCodeDO : list ) { + list1.add( errorCodeDOToErrorCodeRespDTO( errorCodeDO ) ); + } + + return list1; + } + + protected ErrorCodeExcelVO errorCodeDOToErrorCodeExcelVO(ErrorCodeDO errorCodeDO) { + if ( errorCodeDO == null ) { + return null; + } + + ErrorCodeExcelVO errorCodeExcelVO = new ErrorCodeExcelVO(); + + errorCodeExcelVO.setId( errorCodeDO.getId() ); + errorCodeExcelVO.setType( errorCodeDO.getType() ); + errorCodeExcelVO.setApplicationName( errorCodeDO.getApplicationName() ); + errorCodeExcelVO.setCode( errorCodeDO.getCode() ); + errorCodeExcelVO.setMessage( errorCodeDO.getMessage() ); + errorCodeExcelVO.setMemo( errorCodeDO.getMemo() ); + errorCodeExcelVO.setCreateTime( errorCodeDO.getCreateTime() ); + + return errorCodeExcelVO; + } + + protected ErrorCodeRespDTO errorCodeDOToErrorCodeRespDTO(ErrorCodeDO errorCodeDO) { + if ( errorCodeDO == null ) { + return null; + } + + ErrorCodeRespDTO errorCodeRespDTO = new ErrorCodeRespDTO(); + + errorCodeRespDTO.setCode( errorCodeDO.getCode() ); + errorCodeRespDTO.setMessage( errorCodeDO.getMessage() ); + errorCodeRespDTO.setUpdateTime( errorCodeDO.getUpdateTime() ); + + return errorCodeRespDTO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/hospital/HospitalConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/hospital/HospitalConvertImpl.java new file mode 100644 index 0000000..828691e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/hospital/HospitalConvertImpl.java @@ -0,0 +1,141 @@ +package com.jojubanking.boot.module.system.convert.hospital; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.hospital.vo.HospitalCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.hospital.vo.HospitalExcelVO; +import com.jojubanking.boot.module.system.controller.admin.hospital.vo.HospitalRespVO; +import com.jojubanking.boot.module.system.controller.admin.hospital.vo.HospitalUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.hospital.HospitalDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class HospitalConvertImpl implements HospitalConvert { + + @Override + public HospitalDO convert(HospitalCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + HospitalDO hospitalDO = new HospitalDO(); + + hospitalDO.setName( bean.getName() ); + hospitalDO.setLogo( bean.getLogo() ); + hospitalDO.setLabel( bean.getLabel() ); + hospitalDO.setTel( bean.getTel() ); + hospitalDO.setAddress( bean.getAddress() ); + hospitalDO.setContent( bean.getContent() ); + hospitalDO.setImg( bean.getImg() ); + + return hospitalDO; + } + + @Override + public HospitalDO convert(HospitalUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + HospitalDO hospitalDO = new HospitalDO(); + + hospitalDO.setId( bean.getId() ); + hospitalDO.setName( bean.getName() ); + hospitalDO.setLogo( bean.getLogo() ); + hospitalDO.setLabel( bean.getLabel() ); + hospitalDO.setTel( bean.getTel() ); + hospitalDO.setAddress( bean.getAddress() ); + hospitalDO.setContent( bean.getContent() ); + hospitalDO.setImg( bean.getImg() ); + + return hospitalDO; + } + + @Override + public HospitalRespVO convert(HospitalDO bean) { + if ( bean == null ) { + return null; + } + + HospitalRespVO hospitalRespVO = new HospitalRespVO(); + + hospitalRespVO.setName( bean.getName() ); + hospitalRespVO.setLogo( bean.getLogo() ); + hospitalRespVO.setLabel( bean.getLabel() ); + hospitalRespVO.setTel( bean.getTel() ); + hospitalRespVO.setAddress( bean.getAddress() ); + hospitalRespVO.setContent( bean.getContent() ); + hospitalRespVO.setImg( bean.getImg() ); + hospitalRespVO.setId( bean.getId() ); + hospitalRespVO.setCreateTime( bean.getCreateTime() ); + + return hospitalRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( HospitalDO hospitalDO : list ) { + list1.add( convert( hospitalDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( HospitalDO hospitalDO : list ) { + list1.add( hospitalDOToHospitalExcelVO( hospitalDO ) ); + } + + return list1; + } + + protected HospitalExcelVO hospitalDOToHospitalExcelVO(HospitalDO hospitalDO) { + if ( hospitalDO == null ) { + return null; + } + + HospitalExcelVO hospitalExcelVO = new HospitalExcelVO(); + + hospitalExcelVO.setId( hospitalDO.getId() ); + hospitalExcelVO.setName( hospitalDO.getName() ); + hospitalExcelVO.setLogo( hospitalDO.getLogo() ); + hospitalExcelVO.setLabel( hospitalDO.getLabel() ); + hospitalExcelVO.setTel( hospitalDO.getTel() ); + hospitalExcelVO.setAddress( hospitalDO.getAddress() ); + hospitalExcelVO.setContent( hospitalDO.getContent() ); + hospitalExcelVO.setImg( hospitalDO.getImg() ); + hospitalExcelVO.setCreateTime( hospitalDO.getCreateTime() ); + + return hospitalExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/information/InformationConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/information/InformationConvertImpl.java new file mode 100644 index 0000000..9096e74 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/information/InformationConvertImpl.java @@ -0,0 +1,129 @@ +package com.jojubanking.boot.module.system.convert.information; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.information.vo.InformationCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.information.vo.InformationExcelVO; +import com.jojubanking.boot.module.system.controller.admin.information.vo.InformationRespVO; +import com.jojubanking.boot.module.system.controller.admin.information.vo.InformationUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.information.InformationDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class InformationConvertImpl implements InformationConvert { + + @Override + public InformationDO convert(InformationCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + InformationDO informationDO = new InformationDO(); + + informationDO.setTitle( bean.getTitle() ); + informationDO.setImg( bean.getImg() ); + informationDO.setContent( bean.getContent() ); + informationDO.setType( bean.getType() ); + + return informationDO; + } + + @Override + public InformationDO convert(InformationUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + InformationDO informationDO = new InformationDO(); + + informationDO.setId( bean.getId() ); + informationDO.setTitle( bean.getTitle() ); + informationDO.setImg( bean.getImg() ); + informationDO.setContent( bean.getContent() ); + informationDO.setType( bean.getType() ); + + return informationDO; + } + + @Override + public InformationRespVO convert(InformationDO bean) { + if ( bean == null ) { + return null; + } + + InformationRespVO informationRespVO = new InformationRespVO(); + + informationRespVO.setTitle( bean.getTitle() ); + informationRespVO.setImg( bean.getImg() ); + informationRespVO.setContent( bean.getContent() ); + informationRespVO.setType( bean.getType() ); + informationRespVO.setId( bean.getId() ); + informationRespVO.setCreateTime( bean.getCreateTime() ); + + return informationRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( InformationDO informationDO : list ) { + list1.add( convert( informationDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( InformationDO informationDO : list ) { + list1.add( informationDOToInformationExcelVO( informationDO ) ); + } + + return list1; + } + + protected InformationExcelVO informationDOToInformationExcelVO(InformationDO informationDO) { + if ( informationDO == null ) { + return null; + } + + InformationExcelVO informationExcelVO = new InformationExcelVO(); + + informationExcelVO.setId( informationDO.getId() ); + informationExcelVO.setTitle( informationDO.getTitle() ); + informationExcelVO.setImg( informationDO.getImg() ); + informationExcelVO.setContent( informationDO.getContent() ); + informationExcelVO.setType( informationDO.getType() ); + informationExcelVO.setCreateTime( informationDO.getCreateTime() ); + + return informationExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/item/ItemConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/item/ItemConvertImpl.java new file mode 100644 index 0000000..da3da89 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/item/ItemConvertImpl.java @@ -0,0 +1,154 @@ +package com.jojubanking.boot.module.system.convert.item; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.item.vo.ItemCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.item.vo.ItemExcelVO; +import com.jojubanking.boot.module.system.controller.admin.item.vo.ItemRespVO; +import com.jojubanking.boot.module.system.controller.admin.item.vo.ItemUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.item.ItemDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class ItemConvertImpl implements ItemConvert { + + @Override + public ItemDO convert(ItemCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + ItemDO itemDO = new ItemDO(); + + itemDO.setPackageflag( bean.getPackageflag() ); + itemDO.setPackageno( bean.getPackageno() ); + itemDO.setItemflag( bean.getItemflag() ); + itemDO.setItemno( bean.getItemno() ); + itemDO.setItemname( bean.getItemname() ); + itemDO.setItemprice( bean.getItemprice() ); + itemDO.setShowflag( bean.getShowflag() ); + itemDO.setZxks( bean.getZxks() ); + itemDO.setZxksname( bean.getZxksname() ); + itemDO.setKdks( bean.getKdks() ); + itemDO.setKdksname( bean.getKdksname() ); + + return itemDO; + } + + @Override + public ItemDO convert(ItemUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + ItemDO itemDO = new ItemDO(); + + itemDO.setId( bean.getId() ); + itemDO.setSort( bean.getSort() ); + itemDO.setPackageflag( bean.getPackageflag() ); + itemDO.setPackageno( bean.getPackageno() ); + itemDO.setItemflag( bean.getItemflag() ); + itemDO.setItemno( bean.getItemno() ); + itemDO.setItemname( bean.getItemname() ); + itemDO.setItemprice( bean.getItemprice() ); + itemDO.setShowflag( bean.getShowflag() ); + itemDO.setZxks( bean.getZxks() ); + itemDO.setZxksname( bean.getZxksname() ); + itemDO.setKdks( bean.getKdks() ); + itemDO.setKdksname( bean.getKdksname() ); + + return itemDO; + } + + @Override + public ItemRespVO convert(ItemDO bean) { + if ( bean == null ) { + return null; + } + + ItemRespVO itemRespVO = new ItemRespVO(); + + itemRespVO.setPackageflag( bean.getPackageflag() ); + itemRespVO.setPackageno( bean.getPackageno() ); + itemRespVO.setItemflag( bean.getItemflag() ); + itemRespVO.setItemno( bean.getItemno() ); + itemRespVO.setItemname( bean.getItemname() ); + itemRespVO.setItemprice( bean.getItemprice() ); + itemRespVO.setShowflag( bean.getShowflag() ); + itemRespVO.setZxks( bean.getZxks() ); + itemRespVO.setZxksname( bean.getZxksname() ); + itemRespVO.setKdks( bean.getKdks() ); + itemRespVO.setKdksname( bean.getKdksname() ); + itemRespVO.setId( bean.getId() ); + itemRespVO.setSort( bean.getSort() ); + itemRespVO.setCreateTime( bean.getCreateTime() ); + + return itemRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ItemDO itemDO : list ) { + list1.add( convert( itemDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( ItemDO itemDO : list ) { + list1.add( itemDOToItemExcelVO( itemDO ) ); + } + + return list1; + } + + protected ItemExcelVO itemDOToItemExcelVO(ItemDO itemDO) { + if ( itemDO == null ) { + return null; + } + + ItemExcelVO itemExcelVO = new ItemExcelVO(); + + itemExcelVO.setId( itemDO.getId() ); + itemExcelVO.setPackageflag( itemDO.getPackageflag() ); + itemExcelVO.setPackageno( itemDO.getPackageno() ); + itemExcelVO.setItemflag( itemDO.getItemflag() ); + itemExcelVO.setItemno( itemDO.getItemno() ); + itemExcelVO.setItemname( itemDO.getItemname() ); + itemExcelVO.setItemprice( itemDO.getItemprice() ); + itemExcelVO.setCreateTime( itemDO.getCreateTime() ); + + return itemExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/ksinfo/KsInfoConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/ksinfo/KsInfoConvertImpl.java new file mode 100644 index 0000000..918c47a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/ksinfo/KsInfoConvertImpl.java @@ -0,0 +1,145 @@ +package com.jojubanking.boot.module.system.convert.ksinfo; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.ksinfo.vo.KsInfoCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.ksinfo.vo.KsInfoExcelVO; +import com.jojubanking.boot.module.system.controller.admin.ksinfo.vo.KsInfoRespVO; +import com.jojubanking.boot.module.system.controller.admin.ksinfo.vo.KsInfoUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.ksinfo.KsInfoDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class KsInfoConvertImpl implements KsInfoConvert { + + @Override + public KsInfoDO convert(KsInfoCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + KsInfoDO ksInfoDO = new KsInfoDO(); + + ksInfoDO.setName( bean.getName() ); + ksInfoDO.setTid( bean.getTid() ); + ksInfoDO.setInfo( bean.getInfo() ); + ksInfoDO.setAddress( bean.getAddress() ); + ksInfoDO.setImg( bean.getImg() ); + ksInfoDO.setDepartcode( bean.getDepartcode() ); + ksInfoDO.setDeparttype( bean.getDeparttype() ); + ksInfoDO.setUptype( bean.getUptype() ); + + return ksInfoDO; + } + + @Override + public KsInfoDO convert(KsInfoUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + KsInfoDO ksInfoDO = new KsInfoDO(); + + ksInfoDO.setId( bean.getId() ); + ksInfoDO.setName( bean.getName() ); + ksInfoDO.setTid( bean.getTid() ); + ksInfoDO.setInfo( bean.getInfo() ); + ksInfoDO.setAddress( bean.getAddress() ); + ksInfoDO.setImg( bean.getImg() ); + ksInfoDO.setDepartcode( bean.getDepartcode() ); + ksInfoDO.setDeparttype( bean.getDeparttype() ); + ksInfoDO.setUptype( bean.getUptype() ); + + return ksInfoDO; + } + + @Override + public KsInfoRespVO convert(KsInfoDO bean) { + if ( bean == null ) { + return null; + } + + KsInfoRespVO ksInfoRespVO = new KsInfoRespVO(); + + ksInfoRespVO.setName( bean.getName() ); + ksInfoRespVO.setTid( bean.getTid() ); + ksInfoRespVO.setInfo( bean.getInfo() ); + ksInfoRespVO.setAddress( bean.getAddress() ); + ksInfoRespVO.setImg( bean.getImg() ); + ksInfoRespVO.setDepartcode( bean.getDepartcode() ); + ksInfoRespVO.setDeparttype( bean.getDeparttype() ); + ksInfoRespVO.setUptype( bean.getUptype() ); + ksInfoRespVO.setId( bean.getId() ); + ksInfoRespVO.setCreateTime( bean.getCreateTime() ); + + return ksInfoRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( KsInfoDO ksInfoDO : list ) { + list1.add( convert( ksInfoDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( KsInfoDO ksInfoDO : list ) { + list1.add( ksInfoDOToKsInfoExcelVO( ksInfoDO ) ); + } + + return list1; + } + + protected KsInfoExcelVO ksInfoDOToKsInfoExcelVO(KsInfoDO ksInfoDO) { + if ( ksInfoDO == null ) { + return null; + } + + KsInfoExcelVO ksInfoExcelVO = new KsInfoExcelVO(); + + ksInfoExcelVO.setId( ksInfoDO.getId() ); + ksInfoExcelVO.setName( ksInfoDO.getName() ); + ksInfoExcelVO.setTid( ksInfoDO.getTid() ); + ksInfoExcelVO.setInfo( ksInfoDO.getInfo() ); + ksInfoExcelVO.setAddress( ksInfoDO.getAddress() ); + ksInfoExcelVO.setImg( ksInfoDO.getImg() ); + ksInfoExcelVO.setDepartcode( ksInfoDO.getDepartcode() ); + ksInfoExcelVO.setDeparttype( ksInfoDO.getDeparttype() ); + ksInfoExcelVO.setUptype( ksInfoDO.getUptype() ); + ksInfoExcelVO.setCreateTime( ksInfoDO.getCreateTime() ); + + return ksInfoExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/kstype/KsTypeConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/kstype/KsTypeConvertImpl.java new file mode 100644 index 0000000..fb482de --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/kstype/KsTypeConvertImpl.java @@ -0,0 +1,120 @@ +package com.jojubanking.boot.module.system.convert.kstype; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.kstype.vo.KsTypeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.kstype.vo.KsTypeExcelVO; +import com.jojubanking.boot.module.system.controller.admin.kstype.vo.KsTypeRespVO; +import com.jojubanking.boot.module.system.controller.admin.kstype.vo.KsTypeUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.kstype.KsTypeDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class KsTypeConvertImpl implements KsTypeConvert { + + @Override + public KsTypeDO convert(KsTypeCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + KsTypeDO ksTypeDO = new KsTypeDO(); + + ksTypeDO.setSort( bean.getSort() ); + ksTypeDO.setName( bean.getName() ); + + return ksTypeDO; + } + + @Override + public KsTypeDO convert(KsTypeUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + KsTypeDO ksTypeDO = new KsTypeDO(); + + ksTypeDO.setId( bean.getId() ); + ksTypeDO.setSort( bean.getSort() ); + ksTypeDO.setName( bean.getName() ); + + return ksTypeDO; + } + + @Override + public KsTypeRespVO convert(KsTypeDO bean) { + if ( bean == null ) { + return null; + } + + KsTypeRespVO ksTypeRespVO = new KsTypeRespVO(); + + ksTypeRespVO.setName( bean.getName() ); + ksTypeRespVO.setSort( bean.getSort() ); + ksTypeRespVO.setId( bean.getId() ); + ksTypeRespVO.setCreateTime( bean.getCreateTime() ); + + return ksTypeRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( KsTypeDO ksTypeDO : list ) { + list1.add( convert( ksTypeDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( KsTypeDO ksTypeDO : list ) { + list1.add( ksTypeDOToKsTypeExcelVO( ksTypeDO ) ); + } + + return list1; + } + + protected KsTypeExcelVO ksTypeDOToKsTypeExcelVO(KsTypeDO ksTypeDO) { + if ( ksTypeDO == null ) { + return null; + } + + KsTypeExcelVO ksTypeExcelVO = new KsTypeExcelVO(); + + ksTypeExcelVO.setId( ksTypeDO.getId() ); + ksTypeExcelVO.setName( ksTypeDO.getName() ); + ksTypeExcelVO.setCreateTime( ksTypeDO.getCreateTime() ); + + return ksTypeExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/label/LabelConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/label/LabelConvertImpl.java new file mode 100644 index 0000000..04f454b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/label/LabelConvertImpl.java @@ -0,0 +1,129 @@ +package com.jojubanking.boot.module.system.convert.label; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.label.vo.LabelCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.label.vo.LabelExcelVO; +import com.jojubanking.boot.module.system.controller.admin.label.vo.LabelRespVO; +import com.jojubanking.boot.module.system.controller.admin.label.vo.LabelUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.label.LabelDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class LabelConvertImpl implements LabelConvert { + + @Override + public LabelDO convert(LabelCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + LabelDO labelDO = new LabelDO(); + + labelDO.setName( bean.getName() ); + labelDO.setInfo( bean.getInfo() ); + labelDO.setFid( bean.getFid() ); + labelDO.setBid( bean.getBid() ); + + return labelDO; + } + + @Override + public LabelDO convert(LabelUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + LabelDO labelDO = new LabelDO(); + + labelDO.setId( bean.getId() ); + labelDO.setName( bean.getName() ); + labelDO.setInfo( bean.getInfo() ); + labelDO.setFid( bean.getFid() ); + labelDO.setBid( bean.getBid() ); + + return labelDO; + } + + @Override + public LabelRespVO convert(LabelDO bean) { + if ( bean == null ) { + return null; + } + + LabelRespVO labelRespVO = new LabelRespVO(); + + labelRespVO.setName( bean.getName() ); + labelRespVO.setInfo( bean.getInfo() ); + labelRespVO.setFid( bean.getFid() ); + labelRespVO.setBid( bean.getBid() ); + labelRespVO.setId( bean.getId() ); + labelRespVO.setCreateTime( bean.getCreateTime() ); + + return labelRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( LabelDO labelDO : list ) { + list1.add( convert( labelDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( LabelDO labelDO : list ) { + list1.add( labelDOToLabelExcelVO( labelDO ) ); + } + + return list1; + } + + protected LabelExcelVO labelDOToLabelExcelVO(LabelDO labelDO) { + if ( labelDO == null ) { + return null; + } + + LabelExcelVO labelExcelVO = new LabelExcelVO(); + + labelExcelVO.setId( labelDO.getId() ); + labelExcelVO.setName( labelDO.getName() ); + labelExcelVO.setInfo( labelDO.getInfo() ); + labelExcelVO.setFid( labelDO.getFid() ); + labelExcelVO.setBid( labelDO.getBid() ); + labelExcelVO.setCreateTime( labelDO.getCreateTime() ); + + return labelExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/logger/LoginLogConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/logger/LoginLogConvertImpl.java new file mode 100644 index 0000000..d86942a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/logger/LoginLogConvertImpl.java @@ -0,0 +1,118 @@ +package com.jojubanking.boot.module.system.convert.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogExcelVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.loginlog.LoginLogRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.logger.LoginLogDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class LoginLogConvertImpl implements LoginLogConvert { + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( loginLogDOListToLoginLogRespVOList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( LoginLogDO loginLogDO : list ) { + list1.add( loginLogDOToLoginLogExcelVO( loginLogDO ) ); + } + + return list1; + } + + @Override + public LoginLogDO convert(LoginLogCreateReqDTO bean) { + if ( bean == null ) { + return null; + } + + LoginLogDO loginLogDO = new LoginLogDO(); + + loginLogDO.setLogType( bean.getLogType() ); + loginLogDO.setTraceId( bean.getTraceId() ); + loginLogDO.setUserId( bean.getUserId() ); + loginLogDO.setUserType( bean.getUserType() ); + loginLogDO.setUsername( bean.getUsername() ); + loginLogDO.setResult( bean.getResult() ); + loginLogDO.setUserIp( bean.getUserIp() ); + loginLogDO.setUserAgent( bean.getUserAgent() ); + + return loginLogDO; + } + + protected LoginLogRespVO loginLogDOToLoginLogRespVO(LoginLogDO loginLogDO) { + if ( loginLogDO == null ) { + return null; + } + + LoginLogRespVO loginLogRespVO = new LoginLogRespVO(); + + loginLogRespVO.setLogType( loginLogDO.getLogType() ); + loginLogRespVO.setTraceId( loginLogDO.getTraceId() ); + loginLogRespVO.setUsername( loginLogDO.getUsername() ); + loginLogRespVO.setResult( loginLogDO.getResult() ); + loginLogRespVO.setUserIp( loginLogDO.getUserIp() ); + loginLogRespVO.setUserAgent( loginLogDO.getUserAgent() ); + loginLogRespVO.setId( loginLogDO.getId() ); + loginLogRespVO.setUserId( loginLogDO.getUserId() ); + loginLogRespVO.setUserType( loginLogDO.getUserType() ); + loginLogRespVO.setCreateTime( loginLogDO.getCreateTime() ); + + return loginLogRespVO; + } + + protected List loginLogDOListToLoginLogRespVOList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( LoginLogDO loginLogDO : list ) { + list1.add( loginLogDOToLoginLogRespVO( loginLogDO ) ); + } + + return list1; + } + + protected LoginLogExcelVO loginLogDOToLoginLogExcelVO(LoginLogDO loginLogDO) { + if ( loginLogDO == null ) { + return null; + } + + LoginLogExcelVO loginLogExcelVO = new LoginLogExcelVO(); + + loginLogExcelVO.setId( loginLogDO.getId() ); + loginLogExcelVO.setUsername( loginLogDO.getUsername() ); + loginLogExcelVO.setLogType( loginLogDO.getLogType() ); + loginLogExcelVO.setResult( loginLogDO.getResult() ); + loginLogExcelVO.setUserIp( loginLogDO.getUserIp() ); + loginLogExcelVO.setUserAgent( loginLogDO.getUserAgent() ); + loginLogExcelVO.setCreateTime( loginLogDO.getCreateTime() ); + + return loginLogExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/logger/OperateLogConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/logger/OperateLogConvertImpl.java new file mode 100644 index 0000000..e578fe3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/logger/OperateLogConvertImpl.java @@ -0,0 +1,135 @@ +package com.jojubanking.boot.module.system.convert.logger; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.api.logger.dto.OperateLogCreateReqDTO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogExcelVO; +import com.jojubanking.boot.module.system.controller.admin.logger.vo.operatelog.OperateLogRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.logger.OperateLogDO; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class OperateLogConvertImpl implements OperateLogConvert { + + @Override + public OperateLogDO convert(OperateLogCreateReqDTO bean) { + if ( bean == null ) { + return null; + } + + OperateLogDO operateLogDO = new OperateLogDO(); + + operateLogDO.setTraceId( bean.getTraceId() ); + operateLogDO.setUserId( bean.getUserId() ); + operateLogDO.setUserType( bean.getUserType() ); + operateLogDO.setModule( bean.getModule() ); + operateLogDO.setName( bean.getName() ); + operateLogDO.setType( bean.getType() ); + operateLogDO.setContent( bean.getContent() ); + Map map = bean.getExts(); + if ( map != null ) { + operateLogDO.setExts( new HashMap( map ) ); + } + operateLogDO.setRequestMethod( bean.getRequestMethod() ); + operateLogDO.setRequestUrl( bean.getRequestUrl() ); + operateLogDO.setUserIp( bean.getUserIp() ); + operateLogDO.setUserAgent( bean.getUserAgent() ); + operateLogDO.setJavaMethod( bean.getJavaMethod() ); + operateLogDO.setJavaMethodArgs( bean.getJavaMethodArgs() ); + operateLogDO.setStartTime( bean.getStartTime() ); + operateLogDO.setDuration( bean.getDuration() ); + operateLogDO.setResultCode( bean.getResultCode() ); + operateLogDO.setResultMsg( bean.getResultMsg() ); + operateLogDO.setResultData( bean.getResultData() ); + + return operateLogDO; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( operateLogDOListToOperateLogRespVOList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public OperateLogRespVO convert(OperateLogDO bean) { + if ( bean == null ) { + return null; + } + + OperateLogRespVO operateLogRespVO = new OperateLogRespVO(); + + operateLogRespVO.setTraceId( bean.getTraceId() ); + operateLogRespVO.setUserId( bean.getUserId() ); + operateLogRespVO.setModule( bean.getModule() ); + operateLogRespVO.setName( bean.getName() ); + operateLogRespVO.setType( bean.getType() ); + operateLogRespVO.setContent( bean.getContent() ); + Map map = bean.getExts(); + if ( map != null ) { + operateLogRespVO.setExts( new HashMap( map ) ); + } + operateLogRespVO.setRequestMethod( bean.getRequestMethod() ); + operateLogRespVO.setRequestUrl( bean.getRequestUrl() ); + operateLogRespVO.setUserIp( bean.getUserIp() ); + operateLogRespVO.setUserAgent( bean.getUserAgent() ); + operateLogRespVO.setJavaMethod( bean.getJavaMethod() ); + operateLogRespVO.setJavaMethodArgs( bean.getJavaMethodArgs() ); + operateLogRespVO.setStartTime( bean.getStartTime() ); + operateLogRespVO.setDuration( bean.getDuration() ); + operateLogRespVO.setResultCode( bean.getResultCode() ); + operateLogRespVO.setResultMsg( bean.getResultMsg() ); + operateLogRespVO.setResultData( bean.getResultData() ); + operateLogRespVO.setId( bean.getId() ); + + return operateLogRespVO; + } + + @Override + public OperateLogExcelVO convert02(OperateLogDO bean) { + if ( bean == null ) { + return null; + } + + OperateLogExcelVO operateLogExcelVO = new OperateLogExcelVO(); + + operateLogExcelVO.setId( bean.getId() ); + operateLogExcelVO.setModule( bean.getModule() ); + operateLogExcelVO.setName( bean.getName() ); + if ( bean.getType() != null ) { + operateLogExcelVO.setType( String.valueOf( bean.getType() ) ); + } + operateLogExcelVO.setStartTime( bean.getStartTime() ); + operateLogExcelVO.setDuration( bean.getDuration() ); + + return operateLogExcelVO; + } + + protected List operateLogDOListToOperateLogRespVOList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( OperateLogDO operateLogDO : list ) { + list1.add( convert( operateLogDO ) ); + } + + return list1; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/mzdm/MzdmConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/mzdm/MzdmConvertImpl.java new file mode 100644 index 0000000..1f7e495 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/mzdm/MzdmConvertImpl.java @@ -0,0 +1,141 @@ +package com.jojubanking.boot.module.system.convert.mzdm; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.MzdmCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.MzdmExcelVO; +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.MzdmRespVO; +import com.jojubanking.boot.module.system.controller.admin.mzdm.vo.MzdmUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.mzdm.MzdmDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class MzdmConvertImpl implements MzdmConvert { + + @Override + public MzdmDO convert(MzdmCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + MzdmDO mzdmDO = new MzdmDO(); + + mzdmDO.setMzdm( bean.getMzdm() ); + mzdmDO.setName( bean.getName() ); + mzdmDO.setPy( bean.getPy() ); + mzdmDO.setWb( bean.getWb() ); + mzdmDO.setMemo( bean.getMemo() ); + mzdmDO.setGjbzbbh( bean.getGjbzbbh() ); + mzdmDO.setJlzt( bean.getJlzt() ); + + return mzdmDO; + } + + @Override + public MzdmDO convert(MzdmUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + MzdmDO mzdmDO = new MzdmDO(); + + mzdmDO.setId( bean.getId() ); + mzdmDO.setMzdm( bean.getMzdm() ); + mzdmDO.setName( bean.getName() ); + mzdmDO.setPy( bean.getPy() ); + mzdmDO.setWb( bean.getWb() ); + mzdmDO.setMemo( bean.getMemo() ); + mzdmDO.setGjbzbbh( bean.getGjbzbbh() ); + mzdmDO.setJlzt( bean.getJlzt() ); + + return mzdmDO; + } + + @Override + public MzdmRespVO convert(MzdmDO bean) { + if ( bean == null ) { + return null; + } + + MzdmRespVO mzdmRespVO = new MzdmRespVO(); + + mzdmRespVO.setMzdm( bean.getMzdm() ); + mzdmRespVO.setName( bean.getName() ); + mzdmRespVO.setPy( bean.getPy() ); + mzdmRespVO.setWb( bean.getWb() ); + mzdmRespVO.setMemo( bean.getMemo() ); + mzdmRespVO.setGjbzbbh( bean.getGjbzbbh() ); + mzdmRespVO.setJlzt( bean.getJlzt() ); + mzdmRespVO.setId( bean.getId() ); + mzdmRespVO.setCreateTime( bean.getCreateTime() ); + + return mzdmRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( MzdmDO mzdmDO : list ) { + list1.add( convert( mzdmDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( MzdmDO mzdmDO : list ) { + list1.add( mzdmDOToMzdmExcelVO( mzdmDO ) ); + } + + return list1; + } + + protected MzdmExcelVO mzdmDOToMzdmExcelVO(MzdmDO mzdmDO) { + if ( mzdmDO == null ) { + return null; + } + + MzdmExcelVO mzdmExcelVO = new MzdmExcelVO(); + + mzdmExcelVO.setId( mzdmDO.getId() ); + mzdmExcelVO.setMzdm( mzdmDO.getMzdm() ); + mzdmExcelVO.setName( mzdmDO.getName() ); + mzdmExcelVO.setPy( mzdmDO.getPy() ); + mzdmExcelVO.setWb( mzdmDO.getWb() ); + mzdmExcelVO.setMemo( mzdmDO.getMemo() ); + mzdmExcelVO.setGjbzbbh( mzdmDO.getGjbzbbh() ); + mzdmExcelVO.setJlzt( mzdmDO.getJlzt() ); + mzdmExcelVO.setCreateTime( mzdmDO.getCreateTime() ); + + return mzdmExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/mzjf/MzjfConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/mzjf/MzjfConvertImpl.java new file mode 100644 index 0000000..face2b2 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/mzjf/MzjfConvertImpl.java @@ -0,0 +1,303 @@ +package com.jojubanking.boot.module.system.convert.mzjf; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.mzjf.vo.MzjfCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.mzjf.vo.MzjfExcelVO; +import com.jojubanking.boot.module.system.controller.admin.mzjf.vo.MzjfRespVO; +import com.jojubanking.boot.module.system.controller.admin.mzjf.vo.MzjfUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.mzjf.MzjfDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class MzjfConvertImpl implements MzjfConvert { + + @Override + public MzjfDO convert(MzjfCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + MzjfDO mzjfDO = new MzjfDO(); + + mzjfDO.setUserId( bean.getUserId() ); + mzjfDO.setCardId( bean.getCardId() ); + mzjfDO.setPatientid( bean.getPatientid() ); + mzjfDO.setIdtype( bean.getIdtype() ); + mzjfDO.setLocktype( bean.getLocktype() ); + mzjfDO.setCreatitemname( bean.getCreatitemname() ); + mzjfDO.setAppointmenttime( bean.getAppointmenttime() ); + mzjfDO.setCreatdate( bean.getCreatdate() ); + mzjfDO.setQuerytype( bean.getQuerytype() ); + mzjfDO.setOrderno( bean.getOrderno() ); + mzjfDO.setFlowno( bean.getFlowno() ); + mzjfDO.setSetdepartcode( bean.getSetdepartcode() ); + mzjfDO.setSetdepartname( bean.getSetdepartname() ); + mzjfDO.setDodepartcode( bean.getDodepartcode() ); + mzjfDO.setDodepartname( bean.getDodepartname() ); + mzjfDO.setBilltype( bean.getBilltype() ); + mzjfDO.setBillname( bean.getBillname() ); + mzjfDO.setBilldes( bean.getBilldes() ); + mzjfDO.setBilltime( bean.getBilltime() ); + mzjfDO.setBillmoney( bean.getBillmoney() ); + mzjfDO.setDoctorcode( bean.getDoctorcode() ); + mzjfDO.setDoctorname( bean.getDoctorname() ); + mzjfDO.setSincemoney( bean.getSincemoney() ); + mzjfDO.setFairmoney( bean.getFairmoney() ); + mzjfDO.setSerialno( bean.getSerialno() ); + mzjfDO.setAppointno( bean.getAppointno() ); + mzjfDO.setSerialflowno( bean.getSerialflowno() ); + mzjfDO.setJzlb( bean.getJzlb() ); + mzjfDO.setBzdm( bean.getBzdm() ); + mzjfDO.setUpdatedate( bean.getUpdatedate() ); + mzjfDO.setBillsmsg( bean.getBillsmsg() ); + mzjfDO.setPaynature( bean.getPaynature() ); + mzjfDO.setPaytype( bean.getPaytype() ); + mzjfDO.setPowertranid( bean.getPowertranid() ); + mzjfDO.setPowertrancard( bean.getPowertrancard() ); + mzjfDO.setTerminalid( bean.getTerminalid() ); + mzjfDO.setReferno( bean.getReferno() ); + mzjfDO.setZfamount( bean.getZfamount() ); + mzjfDO.setYbzhamount( bean.getYbzhamount() ); + mzjfDO.setYbtcamount( bean.getYbtcamount() ); + mzjfDO.setYboutmsg( bean.getYboutmsg() ); + mzjfDO.setHisopernum( bean.getHisopernum() ); + mzjfDO.setIcbcorderid( bean.getIcbcorderid() ); + mzjfDO.setIcbcpaytime( bean.getIcbcpaytime() ); + mzjfDO.setAppFlag( bean.getAppFlag() ); + mzjfDO.setAppStatus( bean.getAppStatus() ); + mzjfDO.setCtime( bean.getCtime() ); + mzjfDO.setUtime( bean.getUtime() ); + + return mzjfDO; + } + + @Override + public MzjfDO convert(MzjfUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + MzjfDO mzjfDO = new MzjfDO(); + + mzjfDO.setId( bean.getId() ); + mzjfDO.setUserId( bean.getUserId() ); + mzjfDO.setCardId( bean.getCardId() ); + mzjfDO.setPatientid( bean.getPatientid() ); + mzjfDO.setIdtype( bean.getIdtype() ); + mzjfDO.setLocktype( bean.getLocktype() ); + mzjfDO.setCreatitemname( bean.getCreatitemname() ); + mzjfDO.setAppointmenttime( bean.getAppointmenttime() ); + mzjfDO.setCreatdate( bean.getCreatdate() ); + mzjfDO.setQuerytype( bean.getQuerytype() ); + mzjfDO.setOrderno( bean.getOrderno() ); + mzjfDO.setFlowno( bean.getFlowno() ); + mzjfDO.setSetdepartcode( bean.getSetdepartcode() ); + mzjfDO.setSetdepartname( bean.getSetdepartname() ); + mzjfDO.setDodepartcode( bean.getDodepartcode() ); + mzjfDO.setDodepartname( bean.getDodepartname() ); + mzjfDO.setBilltype( bean.getBilltype() ); + mzjfDO.setBillname( bean.getBillname() ); + mzjfDO.setBilldes( bean.getBilldes() ); + mzjfDO.setBilltime( bean.getBilltime() ); + mzjfDO.setBillmoney( bean.getBillmoney() ); + mzjfDO.setDoctorcode( bean.getDoctorcode() ); + mzjfDO.setDoctorname( bean.getDoctorname() ); + mzjfDO.setSincemoney( bean.getSincemoney() ); + mzjfDO.setFairmoney( bean.getFairmoney() ); + mzjfDO.setSerialno( bean.getSerialno() ); + mzjfDO.setAppointno( bean.getAppointno() ); + mzjfDO.setSerialflowno( bean.getSerialflowno() ); + mzjfDO.setJzlb( bean.getJzlb() ); + mzjfDO.setBzdm( bean.getBzdm() ); + mzjfDO.setUpdatedate( bean.getUpdatedate() ); + mzjfDO.setBillsmsg( bean.getBillsmsg() ); + mzjfDO.setPaynature( bean.getPaynature() ); + mzjfDO.setPaytype( bean.getPaytype() ); + mzjfDO.setPowertranid( bean.getPowertranid() ); + mzjfDO.setPowertrancard( bean.getPowertrancard() ); + mzjfDO.setTerminalid( bean.getTerminalid() ); + mzjfDO.setReferno( bean.getReferno() ); + mzjfDO.setZfamount( bean.getZfamount() ); + mzjfDO.setYbzhamount( bean.getYbzhamount() ); + mzjfDO.setYbtcamount( bean.getYbtcamount() ); + mzjfDO.setYboutmsg( bean.getYboutmsg() ); + mzjfDO.setHisopernum( bean.getHisopernum() ); + mzjfDO.setIcbcorderid( bean.getIcbcorderid() ); + mzjfDO.setIcbcpaytime( bean.getIcbcpaytime() ); + mzjfDO.setAppFlag( bean.getAppFlag() ); + mzjfDO.setAppStatus( bean.getAppStatus() ); + mzjfDO.setCtime( bean.getCtime() ); + mzjfDO.setUtime( bean.getUtime() ); + + return mzjfDO; + } + + @Override + public MzjfRespVO convert(MzjfDO bean) { + if ( bean == null ) { + return null; + } + + MzjfRespVO mzjfRespVO = new MzjfRespVO(); + + mzjfRespVO.setUserId( bean.getUserId() ); + mzjfRespVO.setCardId( bean.getCardId() ); + mzjfRespVO.setPatientid( bean.getPatientid() ); + mzjfRespVO.setIdtype( bean.getIdtype() ); + mzjfRespVO.setLocktype( bean.getLocktype() ); + mzjfRespVO.setCreatitemname( bean.getCreatitemname() ); + mzjfRespVO.setAppointmenttime( bean.getAppointmenttime() ); + mzjfRespVO.setCreatdate( bean.getCreatdate() ); + mzjfRespVO.setQuerytype( bean.getQuerytype() ); + mzjfRespVO.setOrderno( bean.getOrderno() ); + mzjfRespVO.setFlowno( bean.getFlowno() ); + mzjfRespVO.setSetdepartcode( bean.getSetdepartcode() ); + mzjfRespVO.setSetdepartname( bean.getSetdepartname() ); + mzjfRespVO.setDodepartcode( bean.getDodepartcode() ); + mzjfRespVO.setDodepartname( bean.getDodepartname() ); + mzjfRespVO.setBilltype( bean.getBilltype() ); + mzjfRespVO.setBillname( bean.getBillname() ); + mzjfRespVO.setBilldes( bean.getBilldes() ); + mzjfRespVO.setBilltime( bean.getBilltime() ); + mzjfRespVO.setBillmoney( bean.getBillmoney() ); + mzjfRespVO.setDoctorcode( bean.getDoctorcode() ); + mzjfRespVO.setDoctorname( bean.getDoctorname() ); + mzjfRespVO.setSincemoney( bean.getSincemoney() ); + mzjfRespVO.setFairmoney( bean.getFairmoney() ); + mzjfRespVO.setSerialno( bean.getSerialno() ); + mzjfRespVO.setAppointno( bean.getAppointno() ); + mzjfRespVO.setSerialflowno( bean.getSerialflowno() ); + mzjfRespVO.setJzlb( bean.getJzlb() ); + mzjfRespVO.setBzdm( bean.getBzdm() ); + mzjfRespVO.setUpdatedate( bean.getUpdatedate() ); + mzjfRespVO.setBillsmsg( bean.getBillsmsg() ); + mzjfRespVO.setPaynature( bean.getPaynature() ); + mzjfRespVO.setPaytype( bean.getPaytype() ); + mzjfRespVO.setPowertranid( bean.getPowertranid() ); + mzjfRespVO.setPowertrancard( bean.getPowertrancard() ); + mzjfRespVO.setTerminalid( bean.getTerminalid() ); + mzjfRespVO.setReferno( bean.getReferno() ); + mzjfRespVO.setZfamount( bean.getZfamount() ); + mzjfRespVO.setYbzhamount( bean.getYbzhamount() ); + mzjfRespVO.setYbtcamount( bean.getYbtcamount() ); + mzjfRespVO.setYboutmsg( bean.getYboutmsg() ); + mzjfRespVO.setHisopernum( bean.getHisopernum() ); + mzjfRespVO.setIcbcorderid( bean.getIcbcorderid() ); + mzjfRespVO.setIcbcpaytime( bean.getIcbcpaytime() ); + mzjfRespVO.setAppFlag( bean.getAppFlag() ); + mzjfRespVO.setAppStatus( bean.getAppStatus() ); + mzjfRespVO.setCtime( bean.getCtime() ); + mzjfRespVO.setUtime( bean.getUtime() ); + mzjfRespVO.setId( bean.getId() ); + + return mzjfRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( MzjfDO mzjfDO : list ) { + list1.add( convert( mzjfDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( MzjfDO mzjfDO : list ) { + list1.add( mzjfDOToMzjfExcelVO( mzjfDO ) ); + } + + return list1; + } + + protected MzjfExcelVO mzjfDOToMzjfExcelVO(MzjfDO mzjfDO) { + if ( mzjfDO == null ) { + return null; + } + + MzjfExcelVO mzjfExcelVO = new MzjfExcelVO(); + + mzjfExcelVO.setId( mzjfDO.getId() ); + mzjfExcelVO.setUserId( mzjfDO.getUserId() ); + mzjfExcelVO.setCardId( mzjfDO.getCardId() ); + mzjfExcelVO.setPatientid( mzjfDO.getPatientid() ); + mzjfExcelVO.setIdtype( mzjfDO.getIdtype() ); + mzjfExcelVO.setLocktype( mzjfDO.getLocktype() ); + mzjfExcelVO.setCreatitemname( mzjfDO.getCreatitemname() ); + mzjfExcelVO.setAppointmenttime( mzjfDO.getAppointmenttime() ); + mzjfExcelVO.setCreatdate( mzjfDO.getCreatdate() ); + mzjfExcelVO.setQuerytype( mzjfDO.getQuerytype() ); + mzjfExcelVO.setOrderno( mzjfDO.getOrderno() ); + mzjfExcelVO.setFlowno( mzjfDO.getFlowno() ); + mzjfExcelVO.setSetdepartcode( mzjfDO.getSetdepartcode() ); + mzjfExcelVO.setSetdepartname( mzjfDO.getSetdepartname() ); + mzjfExcelVO.setDodepartcode( mzjfDO.getDodepartcode() ); + mzjfExcelVO.setDodepartname( mzjfDO.getDodepartname() ); + mzjfExcelVO.setBilltype( mzjfDO.getBilltype() ); + mzjfExcelVO.setBillname( mzjfDO.getBillname() ); + mzjfExcelVO.setBilldes( mzjfDO.getBilldes() ); + mzjfExcelVO.setBilltime( mzjfDO.getBilltime() ); + mzjfExcelVO.setBillmoney( mzjfDO.getBillmoney() ); + mzjfExcelVO.setDoctorcode( mzjfDO.getDoctorcode() ); + mzjfExcelVO.setDoctorname( mzjfDO.getDoctorname() ); + mzjfExcelVO.setSincemoney( mzjfDO.getSincemoney() ); + mzjfExcelVO.setFairmoney( mzjfDO.getFairmoney() ); + mzjfExcelVO.setSerialno( mzjfDO.getSerialno() ); + mzjfExcelVO.setAppointno( mzjfDO.getAppointno() ); + mzjfExcelVO.setSerialflowno( mzjfDO.getSerialflowno() ); + mzjfExcelVO.setJzlb( mzjfDO.getJzlb() ); + mzjfExcelVO.setBzdm( mzjfDO.getBzdm() ); + mzjfExcelVO.setUpdatedate( mzjfDO.getUpdatedate() ); + mzjfExcelVO.setBillsmsg( mzjfDO.getBillsmsg() ); + mzjfExcelVO.setPaynature( mzjfDO.getPaynature() ); + mzjfExcelVO.setPaytype( mzjfDO.getPaytype() ); + mzjfExcelVO.setPowertranid( mzjfDO.getPowertranid() ); + mzjfExcelVO.setPowertrancard( mzjfDO.getPowertrancard() ); + mzjfExcelVO.setTerminalid( mzjfDO.getTerminalid() ); + mzjfExcelVO.setReferno( mzjfDO.getReferno() ); + mzjfExcelVO.setZfamount( mzjfDO.getZfamount() ); + mzjfExcelVO.setYbzhamount( mzjfDO.getYbzhamount() ); + mzjfExcelVO.setYbtcamount( mzjfDO.getYbtcamount() ); + mzjfExcelVO.setYboutmsg( mzjfDO.getYboutmsg() ); + mzjfExcelVO.setHisopernum( mzjfDO.getHisopernum() ); + mzjfExcelVO.setIcbcorderid( mzjfDO.getIcbcorderid() ); + mzjfExcelVO.setIcbcpaytime( mzjfDO.getIcbcpaytime() ); + mzjfExcelVO.setAppFlag( mzjfDO.getAppFlag() ); + mzjfExcelVO.setAppStatus( mzjfDO.getAppStatus() ); + mzjfExcelVO.setCtime( mzjfDO.getCtime() ); + mzjfExcelVO.setUtime( mzjfDO.getUtime() ); + + return mzjfExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/notice/NoticeConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/notice/NoticeConvertImpl.java new file mode 100644 index 0000000..63d5bdf --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/notice/NoticeConvertImpl.java @@ -0,0 +1,96 @@ +package com.jojubanking.boot.module.system.convert.notice; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeRespVO; +import com.jojubanking.boot.module.system.controller.admin.notice.vo.NoticeUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.notice.NoticeDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class NoticeConvertImpl implements NoticeConvert { + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( noticeDOListToNoticeRespVOList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public NoticeRespVO convert(NoticeDO bean) { + if ( bean == null ) { + return null; + } + + NoticeRespVO noticeRespVO = new NoticeRespVO(); + + noticeRespVO.setTitle( bean.getTitle() ); + noticeRespVO.setType( bean.getType() ); + noticeRespVO.setContent( bean.getContent() ); + noticeRespVO.setStatus( bean.getStatus() ); + noticeRespVO.setId( bean.getId() ); + noticeRespVO.setCreateTime( bean.getCreateTime() ); + + return noticeRespVO; + } + + @Override + public NoticeDO convert(NoticeUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + NoticeDO noticeDO = new NoticeDO(); + + noticeDO.setId( bean.getId() ); + noticeDO.setTitle( bean.getTitle() ); + noticeDO.setType( bean.getType() ); + noticeDO.setContent( bean.getContent() ); + noticeDO.setStatus( bean.getStatus() ); + + return noticeDO; + } + + @Override + public NoticeDO convert(NoticeCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + NoticeDO noticeDO = new NoticeDO(); + + noticeDO.setTitle( bean.getTitle() ); + noticeDO.setType( bean.getType() ); + noticeDO.setContent( bean.getContent() ); + noticeDO.setStatus( bean.getStatus() ); + + return noticeDO; + } + + protected List noticeDOListToNoticeRespVOList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( NoticeDO noticeDO : list ) { + list1.add( convert( noticeDO ) ); + } + + return list1; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/oauth2/OAuth2OpenConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/oauth2/OAuth2OpenConvertImpl.java new file mode 100644 index 0000000..c81f23a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/oauth2/OAuth2OpenConvertImpl.java @@ -0,0 +1,51 @@ +package com.jojubanking.boot.module.system.convert.oauth2; + +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open.OAuth2OpenAccessTokenRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.open.OAuth2OpenCheckTokenRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class OAuth2OpenConvertImpl implements OAuth2OpenConvert { + + @Override + public OAuth2OpenAccessTokenRespVO convert0(OAuth2AccessTokenDO bean) { + if ( bean == null ) { + return null; + } + + OAuth2OpenAccessTokenRespVO oAuth2OpenAccessTokenRespVO = new OAuth2OpenAccessTokenRespVO(); + + oAuth2OpenAccessTokenRespVO.setAccessToken( bean.getAccessToken() ); + oAuth2OpenAccessTokenRespVO.setRefreshToken( bean.getRefreshToken() ); + + return oAuth2OpenAccessTokenRespVO; + } + + @Override + public OAuth2OpenCheckTokenRespVO convert3(OAuth2AccessTokenDO bean) { + if ( bean == null ) { + return null; + } + + OAuth2OpenCheckTokenRespVO oAuth2OpenCheckTokenRespVO = new OAuth2OpenCheckTokenRespVO(); + + oAuth2OpenCheckTokenRespVO.setUserId( bean.getUserId() ); + oAuth2OpenCheckTokenRespVO.setUserType( bean.getUserType() ); + oAuth2OpenCheckTokenRespVO.setTenantId( bean.getTenantId() ); + oAuth2OpenCheckTokenRespVO.setClientId( bean.getClientId() ); + List list = bean.getScopes(); + if ( list != null ) { + oAuth2OpenCheckTokenRespVO.setScopes( new ArrayList( list ) ); + } + oAuth2OpenCheckTokenRespVO.setAccessToken( bean.getAccessToken() ); + + return oAuth2OpenCheckTokenRespVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/oauth2/OAuth2UserConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/oauth2/OAuth2UserConvertImpl.java new file mode 100644 index 0000000..2dd41a4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/oauth2/OAuth2UserConvertImpl.java @@ -0,0 +1,97 @@ +package com.jojubanking.boot.module.system.convert.oauth2; + +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.user.OAuth2UserInfoRespVO; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.user.OAuth2UserInfoRespVO.Dept; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.user.OAuth2UserInfoRespVO.Post; +import com.jojubanking.boot.module.system.controller.admin.oauth2.vo.user.OAuth2UserUpdateReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class OAuth2UserConvertImpl implements OAuth2UserConvert { + + @Override + public OAuth2UserInfoRespVO convert(AdminUserDO bean) { + if ( bean == null ) { + return null; + } + + OAuth2UserInfoRespVO oAuth2UserInfoRespVO = new OAuth2UserInfoRespVO(); + + oAuth2UserInfoRespVO.setId( bean.getId() ); + oAuth2UserInfoRespVO.setUsername( bean.getUsername() ); + oAuth2UserInfoRespVO.setNickname( bean.getNickname() ); + oAuth2UserInfoRespVO.setEmail( bean.getEmail() ); + oAuth2UserInfoRespVO.setMobile( bean.getMobile() ); + oAuth2UserInfoRespVO.setSex( bean.getSex() ); + oAuth2UserInfoRespVO.setAvatar( bean.getAvatar() ); + + return oAuth2UserInfoRespVO; + } + + @Override + public Dept convert(DeptDO dept) { + if ( dept == null ) { + return null; + } + + Dept dept1 = new Dept(); + + dept1.setId( dept.getId() ); + dept1.setName( dept.getName() ); + + return dept1; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PostDO postDO : list ) { + list1.add( postDOToPost( postDO ) ); + } + + return list1; + } + + @Override + public UserProfileUpdateReqVO convert(OAuth2UserUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + UserProfileUpdateReqVO userProfileUpdateReqVO = new UserProfileUpdateReqVO(); + + userProfileUpdateReqVO.setNickname( bean.getNickname() ); + userProfileUpdateReqVO.setEmail( bean.getEmail() ); + userProfileUpdateReqVO.setMobile( bean.getMobile() ); + userProfileUpdateReqVO.setSex( bean.getSex() ); + + return userProfileUpdateReqVO; + } + + protected Post postDOToPost(PostDO postDO) { + if ( postDO == null ) { + return null; + } + + Post post = new Post(); + + post.setId( postDO.getId() ); + post.setName( postDO.getName() ); + + return post; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/order/OrderConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/order/OrderConvertImpl.java new file mode 100644 index 0000000..d243bb4 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/order/OrderConvertImpl.java @@ -0,0 +1,214 @@ +package com.jojubanking.boot.module.system.convert.order; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.order.vo.OrderCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.order.vo.OrderExcelVO; +import com.jojubanking.boot.module.system.controller.admin.order.vo.OrderRespVO; +import com.jojubanking.boot.module.system.controller.admin.order.vo.OrderSumExcelVO; +import com.jojubanking.boot.module.system.controller.admin.order.vo.OrderSumRespVO; +import com.jojubanking.boot.module.system.controller.admin.order.vo.OrderUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.order.OrderDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class OrderConvertImpl implements OrderConvert { + + @Override + public OrderDO convert(OrderCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + OrderDO orderDO = new OrderDO(); + + orderDO.setBatchno( bean.getBatchno() ); + orderDO.setPatid( bean.getPatid() ); + orderDO.setName( bean.getName() ); + if ( bean.getSex() != null ) { + orderDO.setSex( String.valueOf( bean.getSex() ) ); + } + orderDO.setNationid( bean.getNationid() ); + orderDO.setClassName( bean.getClassName() ); + orderDO.setSchoolName( bean.getSchoolName() ); + orderDO.setOrderno( bean.getOrderno() ); + orderDO.setPackageflag( bean.getPackageflag() ); + orderDO.setPackageno( bean.getPackageno() ); + orderDO.setItemflag( bean.getItemflag() ); + orderDO.setItemno( bean.getItemno() ); + orderDO.setItemname( bean.getItemname() ); + orderDO.setItemprice( bean.getItemprice() ); + orderDO.setPaystatus( bean.getPaystatus() ); + orderDO.setZxks( bean.getZxks() ); + orderDO.setZxksname( bean.getZxksname() ); + orderDO.setKdks( bean.getKdks() ); + orderDO.setKdksname( bean.getKdksname() ); + + return orderDO; + } + + @Override + public OrderDO convert(OrderUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + OrderDO orderDO = new OrderDO(); + + orderDO.setId( bean.getId() ); + orderDO.setBatchno( bean.getBatchno() ); + orderDO.setPatid( bean.getPatid() ); + orderDO.setName( bean.getName() ); + orderDO.setNationid( bean.getNationid() ); + orderDO.setOrderno( bean.getOrderno() ); + orderDO.setPackageflag( bean.getPackageflag() ); + orderDO.setPackageno( bean.getPackageno() ); + orderDO.setItemflag( bean.getItemflag() ); + orderDO.setItemno( bean.getItemno() ); + orderDO.setItemname( bean.getItemname() ); + orderDO.setItemprice( bean.getItemprice() ); + orderDO.setPaystatus( bean.getPaystatus() ); + + return orderDO; + } + + @Override + public OrderRespVO convert(OrderDO bean) { + if ( bean == null ) { + return null; + } + + OrderRespVO orderRespVO = new OrderRespVO(); + + orderRespVO.setBatchno( bean.getBatchno() ); + orderRespVO.setPatid( bean.getPatid() ); + orderRespVO.setName( bean.getName() ); + orderRespVO.setNationid( bean.getNationid() ); + orderRespVO.setOrderno( bean.getOrderno() ); + orderRespVO.setPackageflag( bean.getPackageflag() ); + orderRespVO.setPackageno( bean.getPackageno() ); + orderRespVO.setItemflag( bean.getItemflag() ); + orderRespVO.setItemno( bean.getItemno() ); + orderRespVO.setItemname( bean.getItemname() ); + orderRespVO.setItemprice( bean.getItemprice() ); + orderRespVO.setPaystatus( bean.getPaystatus() ); + orderRespVO.setId( bean.getId() ); + orderRespVO.setClassName( bean.getClassName() ); + orderRespVO.setSchoolName( bean.getSchoolName() ); + orderRespVO.setCreateTime( bean.getCreateTime() ); + orderRespVO.setZxks( bean.getZxks() ); + orderRespVO.setZxksname( bean.getZxksname() ); + orderRespVO.setKdks( bean.getKdks() ); + orderRespVO.setKdksname( bean.getKdksname() ); + + return orderRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( OrderDO orderDO : list ) { + list1.add( convert( orderDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( OrderDO orderDO : list ) { + list1.add( orderDOToOrderExcelVO( orderDO ) ); + } + + return list1; + } + + @Override + public List convertList03(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( OrderSumRespVO orderSumRespVO : list ) { + list1.add( orderSumRespVOToOrderSumExcelVO( orderSumRespVO ) ); + } + + return list1; + } + + protected OrderExcelVO orderDOToOrderExcelVO(OrderDO orderDO) { + if ( orderDO == null ) { + return null; + } + + OrderExcelVO orderExcelVO = new OrderExcelVO(); + + orderExcelVO.setId( orderDO.getId() ); + orderExcelVO.setBatchno( orderDO.getBatchno() ); + orderExcelVO.setPatid( orderDO.getPatid() ); + orderExcelVO.setOrderno( orderDO.getOrderno() ); + orderExcelVO.setName( orderDO.getName() ); + orderExcelVO.setNationid( orderDO.getNationid() ); + orderExcelVO.setSchoolName( orderDO.getSchoolName() ); + orderExcelVO.setClassName( orderDO.getClassName() ); + orderExcelVO.setPaystatus( orderDO.getPaystatus() ); + orderExcelVO.setPackageflag( orderDO.getPackageflag() ); + orderExcelVO.setPackageno( orderDO.getPackageno() ); + orderExcelVO.setItemflag( orderDO.getItemflag() ); + orderExcelVO.setItemno( orderDO.getItemno() ); + orderExcelVO.setItemname( orderDO.getItemname() ); + orderExcelVO.setItemprice( orderDO.getItemprice() ); + orderExcelVO.setKdksname( orderDO.getKdksname() ); + orderExcelVO.setZxksname( orderDO.getZxksname() ); + orderExcelVO.setCreateTime( orderDO.getCreateTime() ); + + return orderExcelVO; + } + + protected OrderSumExcelVO orderSumRespVOToOrderSumExcelVO(OrderSumRespVO orderSumRespVO) { + if ( orderSumRespVO == null ) { + return null; + } + + OrderSumExcelVO orderSumExcelVO = new OrderSumExcelVO(); + + orderSumExcelVO.setBatchno( orderSumRespVO.getBatchno() ); + orderSumExcelVO.setClassName( orderSumRespVO.getClassName() ); + orderSumExcelVO.setSchoolName( orderSumRespVO.getSchoolName() ); + orderSumExcelVO.setSex( orderSumRespVO.getSex() ); + orderSumExcelVO.setItemname( orderSumRespVO.getItemname() ); + orderSumExcelVO.setPatCount( orderSumRespVO.getPatCount() ); + orderSumExcelVO.setPriceSum( orderSumRespVO.getPriceSum() ); + + return orderSumExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/orderview/OrderViewConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/orderview/OrderViewConvertImpl.java new file mode 100644 index 0000000..1d2b72a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/orderview/OrderViewConvertImpl.java @@ -0,0 +1,173 @@ +package com.jojubanking.boot.module.system.convert.orderview; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.orderview.vo.OrderViewCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.orderview.vo.OrderViewExcelVO; +import com.jojubanking.boot.module.system.controller.admin.orderview.vo.OrderViewRespVO; +import com.jojubanking.boot.module.system.controller.admin.orderview.vo.OrderViewUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.orderview.OrderViewDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class OrderViewConvertImpl implements OrderViewConvert { + + @Override + public OrderViewDO convert(OrderViewCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + OrderViewDO orderViewDO = new OrderViewDO(); + + orderViewDO.setBatchno( bean.getBatchno() ); + orderViewDO.setPatid( bean.getPatid() ); + orderViewDO.setName( bean.getName() ); + orderViewDO.setNationid( bean.getNationid() ); + orderViewDO.setOrderno( bean.getOrderno() ); + orderViewDO.setSjh( bean.getSjh() ); + orderViewDO.setPackageflag( bean.getPackageflag() ); + orderViewDO.setPackageno( bean.getPackageno() ); + orderViewDO.setItemflag( bean.getItemflag() ); + orderViewDO.setItemno( bean.getItemno() ); + orderViewDO.setItemname( bean.getItemname() ); + orderViewDO.setItemprice( bean.getItemprice() ); + orderViewDO.setPaystatus( bean.getPaystatus() ); + orderViewDO.setSchoolName( bean.getSchoolName() ); + orderViewDO.setClassName( bean.getClassName() ); + + return orderViewDO; + } + + @Override + public OrderViewDO convert(OrderViewUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + OrderViewDO orderViewDO = new OrderViewDO(); + + orderViewDO.setId( bean.getId() ); + orderViewDO.setBatchno( bean.getBatchno() ); + orderViewDO.setPatid( bean.getPatid() ); + orderViewDO.setName( bean.getName() ); + orderViewDO.setNationid( bean.getNationid() ); + orderViewDO.setOrderno( bean.getOrderno() ); + orderViewDO.setSjh( bean.getSjh() ); + orderViewDO.setPackageflag( bean.getPackageflag() ); + orderViewDO.setPackageno( bean.getPackageno() ); + orderViewDO.setItemflag( bean.getItemflag() ); + orderViewDO.setItemno( bean.getItemno() ); + orderViewDO.setItemname( bean.getItemname() ); + orderViewDO.setItemprice( bean.getItemprice() ); + orderViewDO.setPaystatus( bean.getPaystatus() ); + orderViewDO.setSchoolName( bean.getSchoolName() ); + orderViewDO.setClassName( bean.getClassName() ); + + return orderViewDO; + } + + @Override + public OrderViewRespVO convert(OrderViewDO bean) { + if ( bean == null ) { + return null; + } + + OrderViewRespVO orderViewRespVO = new OrderViewRespVO(); + + orderViewRespVO.setBatchno( bean.getBatchno() ); + orderViewRespVO.setPatid( bean.getPatid() ); + orderViewRespVO.setName( bean.getName() ); + orderViewRespVO.setNationid( bean.getNationid() ); + orderViewRespVO.setOrderno( bean.getOrderno() ); + orderViewRespVO.setSjh( bean.getSjh() ); + orderViewRespVO.setPackageflag( bean.getPackageflag() ); + orderViewRespVO.setPackageno( bean.getPackageno() ); + orderViewRespVO.setItemflag( bean.getItemflag() ); + orderViewRespVO.setItemno( bean.getItemno() ); + orderViewRespVO.setItemname( bean.getItemname() ); + orderViewRespVO.setItemprice( bean.getItemprice() ); + orderViewRespVO.setPaystatus( bean.getPaystatus() ); + orderViewRespVO.setSchoolName( bean.getSchoolName() ); + orderViewRespVO.setClassName( bean.getClassName() ); + orderViewRespVO.setId( bean.getId() ); + orderViewRespVO.setCreateTime( bean.getCreateTime() ); + + return orderViewRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( OrderViewDO orderViewDO : list ) { + list1.add( convert( orderViewDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( OrderViewDO orderViewDO : list ) { + list1.add( orderViewDOToOrderViewExcelVO( orderViewDO ) ); + } + + return list1; + } + + protected OrderViewExcelVO orderViewDOToOrderViewExcelVO(OrderViewDO orderViewDO) { + if ( orderViewDO == null ) { + return null; + } + + OrderViewExcelVO orderViewExcelVO = new OrderViewExcelVO(); + + orderViewExcelVO.setId( orderViewDO.getId() ); + orderViewExcelVO.setBatchno( orderViewDO.getBatchno() ); + orderViewExcelVO.setPatid( orderViewDO.getPatid() ); + orderViewExcelVO.setName( orderViewDO.getName() ); + orderViewExcelVO.setNationid( orderViewDO.getNationid() ); + orderViewExcelVO.setOrderno( orderViewDO.getOrderno() ); + orderViewExcelVO.setSjh( orderViewDO.getSjh() ); + orderViewExcelVO.setPackageflag( orderViewDO.getPackageflag() ); + orderViewExcelVO.setPackageno( orderViewDO.getPackageno() ); + orderViewExcelVO.setItemflag( orderViewDO.getItemflag() ); + orderViewExcelVO.setItemno( orderViewDO.getItemno() ); + orderViewExcelVO.setItemname( orderViewDO.getItemname() ); + orderViewExcelVO.setItemprice( orderViewDO.getItemprice() ); + orderViewExcelVO.setPaystatus( orderViewDO.getPaystatus() ); + orderViewExcelVO.setCreateTime( orderViewDO.getCreateTime() ); + orderViewExcelVO.setSchoolName( orderViewDO.getSchoolName() ); + orderViewExcelVO.setClassName( orderViewDO.getClassName() ); + + return orderViewExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/permission/MenuConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/permission/MenuConvertImpl.java new file mode 100644 index 0000000..235f93a --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/permission/MenuConvertImpl.java @@ -0,0 +1,133 @@ +package com.jojubanking.boot.module.system.convert.permission; + +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuRespVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.menu.MenuUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.MenuDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class MenuConvertImpl implements MenuConvert { + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( MenuDO menuDO : list ) { + list1.add( convert( menuDO ) ); + } + + return list1; + } + + @Override + public MenuDO convert(MenuCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + MenuDO menuDO = new MenuDO(); + + menuDO.setName( bean.getName() ); + menuDO.setPermission( bean.getPermission() ); + menuDO.setType( bean.getType() ); + menuDO.setSort( bean.getSort() ); + menuDO.setParentId( bean.getParentId() ); + menuDO.setPath( bean.getPath() ); + menuDO.setIcon( bean.getIcon() ); + menuDO.setComponent( bean.getComponent() ); + menuDO.setStatus( bean.getStatus() ); + menuDO.setVisible( bean.getVisible() ); + menuDO.setKeepAlive( bean.getKeepAlive() ); + + return menuDO; + } + + @Override + public MenuDO convert(MenuUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + MenuDO menuDO = new MenuDO(); + + menuDO.setId( bean.getId() ); + menuDO.setName( bean.getName() ); + menuDO.setPermission( bean.getPermission() ); + menuDO.setType( bean.getType() ); + menuDO.setSort( bean.getSort() ); + menuDO.setParentId( bean.getParentId() ); + menuDO.setPath( bean.getPath() ); + menuDO.setIcon( bean.getIcon() ); + menuDO.setComponent( bean.getComponent() ); + menuDO.setStatus( bean.getStatus() ); + menuDO.setVisible( bean.getVisible() ); + menuDO.setKeepAlive( bean.getKeepAlive() ); + + return menuDO; + } + + @Override + public MenuRespVO convert(MenuDO bean) { + if ( bean == null ) { + return null; + } + + MenuRespVO menuRespVO = new MenuRespVO(); + + menuRespVO.setName( bean.getName() ); + menuRespVO.setPermission( bean.getPermission() ); + menuRespVO.setType( bean.getType() ); + menuRespVO.setSort( bean.getSort() ); + menuRespVO.setParentId( bean.getParentId() ); + menuRespVO.setPath( bean.getPath() ); + menuRespVO.setIcon( bean.getIcon() ); + menuRespVO.setComponent( bean.getComponent() ); + menuRespVO.setVisible( bean.getVisible() ); + menuRespVO.setKeepAlive( bean.getKeepAlive() ); + menuRespVO.setId( bean.getId() ); + menuRespVO.setStatus( bean.getStatus() ); + menuRespVO.setCreateTime( bean.getCreateTime() ); + + return menuRespVO; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( MenuDO menuDO : list ) { + list1.add( menuDOToMenuSimpleRespVO( menuDO ) ); + } + + return list1; + } + + protected MenuSimpleRespVO menuDOToMenuSimpleRespVO(MenuDO menuDO) { + if ( menuDO == null ) { + return null; + } + + MenuSimpleRespVO menuSimpleRespVO = new MenuSimpleRespVO(); + + menuSimpleRespVO.setId( menuDO.getId() ); + menuSimpleRespVO.setName( menuDO.getName() ); + menuSimpleRespVO.setParentId( menuDO.getParentId() ); + menuSimpleRespVO.setType( menuDO.getType() ); + + return menuSimpleRespVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/permission/RoleConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/permission/RoleConvertImpl.java new file mode 100644 index 0000000..8fb30b7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/permission/RoleConvertImpl.java @@ -0,0 +1,157 @@ +package com.jojubanking.boot.module.system.convert.permission; + +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleExcelVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleRespVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.permission.vo.role.RoleUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.service.permission.bo.RoleCreateReqBO; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class RoleConvertImpl implements RoleConvert { + + @Override + public RoleDO convert(RoleUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + RoleDO roleDO = new RoleDO(); + + roleDO.setId( bean.getId() ); + roleDO.setName( bean.getName() ); + roleDO.setCode( bean.getCode() ); + roleDO.setSort( bean.getSort() ); + roleDO.setRemark( bean.getRemark() ); + + return roleDO; + } + + @Override + public RoleRespVO convert(RoleDO bean) { + if ( bean == null ) { + return null; + } + + RoleRespVO roleRespVO = new RoleRespVO(); + + roleRespVO.setName( bean.getName() ); + roleRespVO.setCode( bean.getCode() ); + roleRespVO.setSort( bean.getSort() ); + roleRespVO.setRemark( bean.getRemark() ); + roleRespVO.setId( bean.getId() ); + roleRespVO.setDataScope( bean.getDataScope() ); + Set set = bean.getDataScopeDeptIds(); + if ( set != null ) { + roleRespVO.setDataScopeDeptIds( new HashSet( set ) ); + } + roleRespVO.setStatus( bean.getStatus() ); + roleRespVO.setType( bean.getType() ); + roleRespVO.setCreateTime( bean.getCreateTime() ); + + return roleRespVO; + } + + @Override + public RoleDO convert(RoleCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + RoleDO roleDO = new RoleDO(); + + roleDO.setName( bean.getName() ); + roleDO.setCode( bean.getCode() ); + roleDO.setSort( bean.getSort() ); + roleDO.setRemark( bean.getRemark() ); + + return roleDO; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( RoleDO roleDO : list ) { + list1.add( roleDOToRoleSimpleRespVO( roleDO ) ); + } + + return list1; + } + + @Override + public List convertList03(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( RoleDO roleDO : list ) { + list1.add( roleDOToRoleExcelVO( roleDO ) ); + } + + return list1; + } + + @Override + public RoleDO convert(RoleCreateReqBO bean) { + if ( bean == null ) { + return null; + } + + RoleDO roleDO = new RoleDO(); + + roleDO.setTenantId( bean.getTenantId() ); + roleDO.setName( bean.getName() ); + roleDO.setCode( bean.getCode() ); + roleDO.setSort( bean.getSort() ); + roleDO.setType( bean.getType() ); + + return roleDO; + } + + protected RoleSimpleRespVO roleDOToRoleSimpleRespVO(RoleDO roleDO) { + if ( roleDO == null ) { + return null; + } + + RoleSimpleRespVO roleSimpleRespVO = new RoleSimpleRespVO(); + + roleSimpleRespVO.setId( roleDO.getId() ); + roleSimpleRespVO.setName( roleDO.getName() ); + + return roleSimpleRespVO; + } + + protected RoleExcelVO roleDOToRoleExcelVO(RoleDO roleDO) { + if ( roleDO == null ) { + return null; + } + + RoleExcelVO roleExcelVO = new RoleExcelVO(); + + roleExcelVO.setId( roleDO.getId() ); + roleExcelVO.setName( roleDO.getName() ); + roleExcelVO.setCode( roleDO.getCode() ); + roleExcelVO.setSort( roleDO.getSort() ); + roleExcelVO.setDataScope( roleDO.getDataScope() ); + if ( roleDO.getStatus() != null ) { + roleExcelVO.setStatus( String.valueOf( roleDO.getStatus() ) ); + } + + return roleExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/refundapply/RefundApplyConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/refundapply/RefundApplyConvertImpl.java new file mode 100644 index 0000000..2e6f3d8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/refundapply/RefundApplyConvertImpl.java @@ -0,0 +1,169 @@ +package com.jojubanking.boot.module.system.convert.refundapply; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.refundapply.vo.RefundApplyCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.refundapply.vo.RefundApplyExcelVO; +import com.jojubanking.boot.module.system.controller.admin.refundapply.vo.RefundApplyRespVO; +import com.jojubanking.boot.module.system.controller.admin.refundapply.vo.RefundApplyUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.refundapply.RefundApplyDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class RefundApplyConvertImpl implements RefundApplyConvert { + + @Override + public RefundApplyDO convert(RefundApplyCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + RefundApplyDO refundApplyDO = new RefundApplyDO(); + + refundApplyDO.setRefname( bean.getRefname() ); + refundApplyDO.setRefidcard( bean.getRefidcard() ); + refundApplyDO.setRefbankcard( bean.getRefbankcard() ); + refundApplyDO.setRefbankcardname( bean.getRefbankcardname() ); + refundApplyDO.setRefbanktype( bean.getRefbanktype() ); + refundApplyDO.setReftel( bean.getReftel() ); + refundApplyDO.setZidcard( bean.getZidcard() ); + refundApplyDO.setZidcardimg( bean.getZidcardimg() ); + refundApplyDO.setFidcard( bean.getFidcard() ); + refundApplyDO.setFidcardimg( bean.getFidcardimg() ); + refundApplyDO.setZbankcard( bean.getZbankcard() ); + refundApplyDO.setZbankcardimg( bean.getZbankcardimg() ); + refundApplyDO.setChildidcard( bean.getChildidcard() ); + refundApplyDO.setChildidcardimg( bean.getChildidcardimg() ); + + return refundApplyDO; + } + + @Override + public RefundApplyDO convert(RefundApplyUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + RefundApplyDO refundApplyDO = new RefundApplyDO(); + + refundApplyDO.setId( bean.getId() ); + refundApplyDO.setRefname( bean.getRefname() ); + refundApplyDO.setRefidcard( bean.getRefidcard() ); + refundApplyDO.setRefbankcard( bean.getRefbankcard() ); + refundApplyDO.setRefbankcardname( bean.getRefbankcardname() ); + refundApplyDO.setRefbanktype( bean.getRefbanktype() ); + refundApplyDO.setReftel( bean.getReftel() ); + refundApplyDO.setZidcard( bean.getZidcard() ); + refundApplyDO.setZidcardimg( bean.getZidcardimg() ); + refundApplyDO.setFidcard( bean.getFidcard() ); + refundApplyDO.setFidcardimg( bean.getFidcardimg() ); + refundApplyDO.setZbankcard( bean.getZbankcard() ); + refundApplyDO.setZbankcardimg( bean.getZbankcardimg() ); + refundApplyDO.setChildidcard( bean.getChildidcard() ); + refundApplyDO.setChildidcardimg( bean.getChildidcardimg() ); + + return refundApplyDO; + } + + @Override + public RefundApplyRespVO convert(RefundApplyDO bean) { + if ( bean == null ) { + return null; + } + + RefundApplyRespVO refundApplyRespVO = new RefundApplyRespVO(); + + refundApplyRespVO.setRefname( bean.getRefname() ); + refundApplyRespVO.setRefidcard( bean.getRefidcard() ); + refundApplyRespVO.setRefbankcard( bean.getRefbankcard() ); + refundApplyRespVO.setRefbankcardname( bean.getRefbankcardname() ); + refundApplyRespVO.setRefbanktype( bean.getRefbanktype() ); + refundApplyRespVO.setReftel( bean.getReftel() ); + refundApplyRespVO.setZidcard( bean.getZidcard() ); + refundApplyRespVO.setZidcardimg( bean.getZidcardimg() ); + refundApplyRespVO.setFidcard( bean.getFidcard() ); + refundApplyRespVO.setFidcardimg( bean.getFidcardimg() ); + refundApplyRespVO.setZbankcard( bean.getZbankcard() ); + refundApplyRespVO.setZbankcardimg( bean.getZbankcardimg() ); + refundApplyRespVO.setChildidcard( bean.getChildidcard() ); + refundApplyRespVO.setChildidcardimg( bean.getChildidcardimg() ); + refundApplyRespVO.setId( bean.getId() ); + refundApplyRespVO.setCreateTime( bean.getCreateTime() ); + + return refundApplyRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( RefundApplyDO refundApplyDO : list ) { + list1.add( convert( refundApplyDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( RefundApplyDO refundApplyDO : list ) { + list1.add( refundApplyDOToRefundApplyExcelVO( refundApplyDO ) ); + } + + return list1; + } + + protected RefundApplyExcelVO refundApplyDOToRefundApplyExcelVO(RefundApplyDO refundApplyDO) { + if ( refundApplyDO == null ) { + return null; + } + + RefundApplyExcelVO refundApplyExcelVO = new RefundApplyExcelVO(); + + refundApplyExcelVO.setId( refundApplyDO.getId() ); + refundApplyExcelVO.setRefname( refundApplyDO.getRefname() ); + refundApplyExcelVO.setRefidcard( refundApplyDO.getRefidcard() ); + refundApplyExcelVO.setRefbankcard( refundApplyDO.getRefbankcard() ); + refundApplyExcelVO.setRefbankcardname( refundApplyDO.getRefbankcardname() ); + refundApplyExcelVO.setRefbanktype( refundApplyDO.getRefbanktype() ); + refundApplyExcelVO.setReftel( refundApplyDO.getReftel() ); + refundApplyExcelVO.setZidcard( refundApplyDO.getZidcard() ); + refundApplyExcelVO.setZidcardimg( refundApplyDO.getZidcardimg() ); + refundApplyExcelVO.setFidcard( refundApplyDO.getFidcard() ); + refundApplyExcelVO.setFidcardimg( refundApplyDO.getFidcardimg() ); + refundApplyExcelVO.setZbankcard( refundApplyDO.getZbankcard() ); + refundApplyExcelVO.setZbankcardimg( refundApplyDO.getZbankcardimg() ); + refundApplyExcelVO.setChildidcard( refundApplyDO.getChildidcard() ); + refundApplyExcelVO.setChildidcardimg( refundApplyDO.getChildidcardimg() ); + refundApplyExcelVO.setCreateTime( refundApplyDO.getCreateTime() ); + + return refundApplyExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/reserve8/Reserve8ConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/reserve8/Reserve8ConvertImpl.java new file mode 100644 index 0000000..2fe6d95 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/reserve8/Reserve8ConvertImpl.java @@ -0,0 +1,275 @@ +package com.jojubanking.boot.module.system.convert.reserve8; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.reserve8.vo.Reserve8CreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.reserve8.vo.Reserve8ExcelVO; +import com.jojubanking.boot.module.system.controller.admin.reserve8.vo.Reserve8RespVO; +import com.jojubanking.boot.module.system.controller.admin.reserve8.vo.Reserve8UpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.reserve8.Reserve8DO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class Reserve8ConvertImpl implements Reserve8Convert { + + @Override + public Reserve8DO convert(Reserve8CreateReqVO bean) { + if ( bean == null ) { + return null; + } + + Reserve8DO reserve8DO = new Reserve8DO(); + + reserve8DO.setUserId( bean.getUserId() ); + reserve8DO.setCardId( bean.getCardId() ); + reserve8DO.setName( bean.getName() ); + reserve8DO.setKsmc( bean.getKsmc() ); + reserve8DO.setYsmc( bean.getYsmc() ); + reserve8DO.setSubHospitalID( bean.getSubHospitalID() ); + reserve8DO.setReptNum( bean.getReptNum() ); + reserve8DO.setLockType( bean.getLockType() ); + reserve8DO.setHisOrderNO( bean.getHisOrderNO() ); + reserve8DO.setScheduleId( bean.getScheduleId() ); + reserve8DO.setDoctorCode( bean.getDoctorCode() ); + reserve8DO.setDepartCode( bean.getDepartCode() ); + reserve8DO.setParTimeId( bean.getParTimeId() ); + reserve8DO.setLockTime( bean.getLockTime() ); + reserve8DO.setPatientId( bean.getPatientId() ); + reserve8DO.setMobile( bean.getMobile() ); + reserve8DO.setSerialNo( bean.getSerialNo() ); + reserve8DO.setLocation( bean.getLocation() ); + reserve8DO.setTicketNo( bean.getTicketNo() ); + reserve8DO.setOrderNo( bean.getOrderNo() ); + reserve8DO.setTimeInterval( bean.getTimeInterval() ); + reserve8DO.setRegisterdate( bean.getRegisterdate() ); + reserve8DO.setClinicFee( bean.getClinicFee() ); + reserve8DO.setRegistrationFee( bean.getRegistrationFee() ); + reserve8DO.setPayNature( bean.getPayNature() ); + reserve8DO.setPayType( bean.getPayType() ); + reserve8DO.setPowerTranID( bean.getPowerTranID() ); + reserve8DO.setPowerTranCARD( bean.getPowerTranCARD() ); + reserve8DO.setTerminalId( bean.getTerminalId() ); + reserve8DO.setZFAmount( bean.getZFAmount() ); + reserve8DO.setYBZHAmount( bean.getYBZHAmount() ); + reserve8DO.setYBTCAmount( bean.getYBTCAmount() ); + reserve8DO.setYBOutMsg( bean.getYBOutMsg() ); + reserve8DO.setHisOperNum( bean.getHisOperNum() ); + reserve8DO.setReferNo( bean.getReferNo() ); + reserve8DO.setToken( bean.getToken() ); + reserve8DO.setAppFlag( bean.getAppFlag() ); + reserve8DO.setAppStatus( bean.getAppStatus() ); + reserve8DO.setAppType( bean.getAppType() ); + reserve8DO.setCtime( bean.getCtime() ); + reserve8DO.setUtime( bean.getUtime() ); + + return reserve8DO; + } + + @Override + public Reserve8DO convert(Reserve8UpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + Reserve8DO reserve8DO = new Reserve8DO(); + + reserve8DO.setId( bean.getId() ); + reserve8DO.setUserId( bean.getUserId() ); + reserve8DO.setCardId( bean.getCardId() ); + reserve8DO.setName( bean.getName() ); + reserve8DO.setKsmc( bean.getKsmc() ); + reserve8DO.setYsmc( bean.getYsmc() ); + reserve8DO.setSubHospitalID( bean.getSubHospitalID() ); + reserve8DO.setReptNum( bean.getReptNum() ); + reserve8DO.setLockType( bean.getLockType() ); + reserve8DO.setHisOrderNO( bean.getHisOrderNO() ); + reserve8DO.setScheduleId( bean.getScheduleId() ); + reserve8DO.setDoctorCode( bean.getDoctorCode() ); + reserve8DO.setDepartCode( bean.getDepartCode() ); + reserve8DO.setParTimeId( bean.getParTimeId() ); + reserve8DO.setLockTime( bean.getLockTime() ); + reserve8DO.setPatientId( bean.getPatientId() ); + reserve8DO.setMobile( bean.getMobile() ); + reserve8DO.setSerialNo( bean.getSerialNo() ); + reserve8DO.setLocation( bean.getLocation() ); + reserve8DO.setTicketNo( bean.getTicketNo() ); + reserve8DO.setOrderNo( bean.getOrderNo() ); + reserve8DO.setTimeInterval( bean.getTimeInterval() ); + reserve8DO.setRegisterdate( bean.getRegisterdate() ); + reserve8DO.setClinicFee( bean.getClinicFee() ); + reserve8DO.setRegistrationFee( bean.getRegistrationFee() ); + reserve8DO.setPayNature( bean.getPayNature() ); + reserve8DO.setPayType( bean.getPayType() ); + reserve8DO.setPowerTranID( bean.getPowerTranID() ); + reserve8DO.setPowerTranCARD( bean.getPowerTranCARD() ); + reserve8DO.setTerminalId( bean.getTerminalId() ); + reserve8DO.setZFAmount( bean.getZFAmount() ); + reserve8DO.setYBZHAmount( bean.getYBZHAmount() ); + reserve8DO.setYBTCAmount( bean.getYBTCAmount() ); + reserve8DO.setYBOutMsg( bean.getYBOutMsg() ); + reserve8DO.setHisOperNum( bean.getHisOperNum() ); + reserve8DO.setReferNo( bean.getReferNo() ); + reserve8DO.setToken( bean.getToken() ); + reserve8DO.setAppFlag( bean.getAppFlag() ); + reserve8DO.setAppStatus( bean.getAppStatus() ); + reserve8DO.setAppType( bean.getAppType() ); + reserve8DO.setCtime( bean.getCtime() ); + reserve8DO.setUtime( bean.getUtime() ); + + return reserve8DO; + } + + @Override + public Reserve8RespVO convert(Reserve8DO bean) { + if ( bean == null ) { + return null; + } + + Reserve8RespVO reserve8RespVO = new Reserve8RespVO(); + + reserve8RespVO.setUserId( bean.getUserId() ); + reserve8RespVO.setCardId( bean.getCardId() ); + reserve8RespVO.setName( bean.getName() ); + reserve8RespVO.setKsmc( bean.getKsmc() ); + reserve8RespVO.setYsmc( bean.getYsmc() ); + reserve8RespVO.setSubHospitalID( bean.getSubHospitalID() ); + reserve8RespVO.setReptNum( bean.getReptNum() ); + reserve8RespVO.setLockType( bean.getLockType() ); + reserve8RespVO.setHisOrderNO( bean.getHisOrderNO() ); + reserve8RespVO.setScheduleId( bean.getScheduleId() ); + reserve8RespVO.setDoctorCode( bean.getDoctorCode() ); + reserve8RespVO.setDepartCode( bean.getDepartCode() ); + reserve8RespVO.setParTimeId( bean.getParTimeId() ); + reserve8RespVO.setLockTime( bean.getLockTime() ); + reserve8RespVO.setPatientId( bean.getPatientId() ); + reserve8RespVO.setMobile( bean.getMobile() ); + reserve8RespVO.setSerialNo( bean.getSerialNo() ); + reserve8RespVO.setLocation( bean.getLocation() ); + reserve8RespVO.setTicketNo( bean.getTicketNo() ); + reserve8RespVO.setOrderNo( bean.getOrderNo() ); + reserve8RespVO.setTimeInterval( bean.getTimeInterval() ); + reserve8RespVO.setRegisterdate( bean.getRegisterdate() ); + reserve8RespVO.setClinicFee( bean.getClinicFee() ); + reserve8RespVO.setRegistrationFee( bean.getRegistrationFee() ); + reserve8RespVO.setPayNature( bean.getPayNature() ); + reserve8RespVO.setPayType( bean.getPayType() ); + reserve8RespVO.setPowerTranID( bean.getPowerTranID() ); + reserve8RespVO.setPowerTranCARD( bean.getPowerTranCARD() ); + reserve8RespVO.setTerminalId( bean.getTerminalId() ); + reserve8RespVO.setZFAmount( bean.getZFAmount() ); + reserve8RespVO.setYBZHAmount( bean.getYBZHAmount() ); + reserve8RespVO.setYBTCAmount( bean.getYBTCAmount() ); + reserve8RespVO.setYBOutMsg( bean.getYBOutMsg() ); + reserve8RespVO.setHisOperNum( bean.getHisOperNum() ); + reserve8RespVO.setReferNo( bean.getReferNo() ); + reserve8RespVO.setToken( bean.getToken() ); + reserve8RespVO.setAppFlag( bean.getAppFlag() ); + reserve8RespVO.setAppStatus( bean.getAppStatus() ); + reserve8RespVO.setAppType( bean.getAppType() ); + reserve8RespVO.setCtime( bean.getCtime() ); + reserve8RespVO.setUtime( bean.getUtime() ); + reserve8RespVO.setId( bean.getId() ); + + return reserve8RespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( Reserve8DO reserve8DO : list ) { + list1.add( convert( reserve8DO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( Reserve8DO reserve8DO : list ) { + list1.add( reserve8DOToReserve8ExcelVO( reserve8DO ) ); + } + + return list1; + } + + protected Reserve8ExcelVO reserve8DOToReserve8ExcelVO(Reserve8DO reserve8DO) { + if ( reserve8DO == null ) { + return null; + } + + Reserve8ExcelVO reserve8ExcelVO = new Reserve8ExcelVO(); + + reserve8ExcelVO.setId( reserve8DO.getId() ); + reserve8ExcelVO.setUserId( reserve8DO.getUserId() ); + reserve8ExcelVO.setCardId( reserve8DO.getCardId() ); + reserve8ExcelVO.setName( reserve8DO.getName() ); + reserve8ExcelVO.setKsmc( reserve8DO.getKsmc() ); + reserve8ExcelVO.setYsmc( reserve8DO.getYsmc() ); + reserve8ExcelVO.setSubHospitalID( reserve8DO.getSubHospitalID() ); + reserve8ExcelVO.setReptNum( reserve8DO.getReptNum() ); + reserve8ExcelVO.setLockType( reserve8DO.getLockType() ); + reserve8ExcelVO.setHisOrderNO( reserve8DO.getHisOrderNO() ); + reserve8ExcelVO.setScheduleId( reserve8DO.getScheduleId() ); + reserve8ExcelVO.setDoctorCode( reserve8DO.getDoctorCode() ); + reserve8ExcelVO.setDepartCode( reserve8DO.getDepartCode() ); + reserve8ExcelVO.setParTimeId( reserve8DO.getParTimeId() ); + reserve8ExcelVO.setLockTime( reserve8DO.getLockTime() ); + reserve8ExcelVO.setPatientId( reserve8DO.getPatientId() ); + reserve8ExcelVO.setMobile( reserve8DO.getMobile() ); + reserve8ExcelVO.setSerialNo( reserve8DO.getSerialNo() ); + reserve8ExcelVO.setLocation( reserve8DO.getLocation() ); + reserve8ExcelVO.setTicketNo( reserve8DO.getTicketNo() ); + reserve8ExcelVO.setOrderNo( reserve8DO.getOrderNo() ); + reserve8ExcelVO.setTimeInterval( reserve8DO.getTimeInterval() ); + reserve8ExcelVO.setRegisterdate( reserve8DO.getRegisterdate() ); + reserve8ExcelVO.setClinicFee( reserve8DO.getClinicFee() ); + reserve8ExcelVO.setRegistrationFee( reserve8DO.getRegistrationFee() ); + reserve8ExcelVO.setPayNature( reserve8DO.getPayNature() ); + reserve8ExcelVO.setPayType( reserve8DO.getPayType() ); + reserve8ExcelVO.setPowerTranID( reserve8DO.getPowerTranID() ); + reserve8ExcelVO.setPowerTranCARD( reserve8DO.getPowerTranCARD() ); + reserve8ExcelVO.setTerminalId( reserve8DO.getTerminalId() ); + reserve8ExcelVO.setZFAmount( reserve8DO.getZFAmount() ); + reserve8ExcelVO.setYBZHAmount( reserve8DO.getYBZHAmount() ); + reserve8ExcelVO.setYBTCAmount( reserve8DO.getYBTCAmount() ); + reserve8ExcelVO.setYBOutMsg( reserve8DO.getYBOutMsg() ); + reserve8ExcelVO.setHisOperNum( reserve8DO.getHisOperNum() ); + reserve8ExcelVO.setReferNo( reserve8DO.getReferNo() ); + reserve8ExcelVO.setToken( reserve8DO.getToken() ); + reserve8ExcelVO.setAppFlag( reserve8DO.getAppFlag() ); + reserve8ExcelVO.setAppStatus( reserve8DO.getAppStatus() ); + reserve8ExcelVO.setAppType( reserve8DO.getAppType() ); + reserve8ExcelVO.setCtime( reserve8DO.getCtime() ); + reserve8ExcelVO.setUtime( reserve8DO.getUtime() ); + + return reserve8ExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/sensitiveword/SensitiveWordConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/sensitiveword/SensitiveWordConvertImpl.java new file mode 100644 index 0000000..3d3cc2b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/sensitiveword/SensitiveWordConvertImpl.java @@ -0,0 +1,141 @@ +package com.jojubanking.boot.module.system.convert.sensitiveword; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordExcelVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordRespVO; +import com.jojubanking.boot.module.system.controller.admin.sensitiveword.vo.SensitiveWordUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sensitiveword.SensitiveWordDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class SensitiveWordConvertImpl implements SensitiveWordConvert { + + @Override + public SensitiveWordDO convert(SensitiveWordCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + SensitiveWordDO sensitiveWordDO = new SensitiveWordDO(); + + sensitiveWordDO.setName( bean.getName() ); + sensitiveWordDO.setDescription( bean.getDescription() ); + List list = bean.getTags(); + if ( list != null ) { + sensitiveWordDO.setTags( new ArrayList( list ) ); + } + sensitiveWordDO.setStatus( bean.getStatus() ); + + return sensitiveWordDO; + } + + @Override + public SensitiveWordDO convert(SensitiveWordUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + SensitiveWordDO sensitiveWordDO = new SensitiveWordDO(); + + sensitiveWordDO.setId( bean.getId() ); + sensitiveWordDO.setName( bean.getName() ); + sensitiveWordDO.setDescription( bean.getDescription() ); + List list = bean.getTags(); + if ( list != null ) { + sensitiveWordDO.setTags( new ArrayList( list ) ); + } + sensitiveWordDO.setStatus( bean.getStatus() ); + + return sensitiveWordDO; + } + + @Override + public SensitiveWordRespVO convert(SensitiveWordDO bean) { + if ( bean == null ) { + return null; + } + + SensitiveWordRespVO sensitiveWordRespVO = new SensitiveWordRespVO(); + + sensitiveWordRespVO.setName( bean.getName() ); + List list = bean.getTags(); + if ( list != null ) { + sensitiveWordRespVO.setTags( new ArrayList( list ) ); + } + sensitiveWordRespVO.setStatus( bean.getStatus() ); + sensitiveWordRespVO.setDescription( bean.getDescription() ); + sensitiveWordRespVO.setId( bean.getId() ); + sensitiveWordRespVO.setCreateTime( bean.getCreateTime() ); + + return sensitiveWordRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( SensitiveWordDO sensitiveWordDO : list ) { + list1.add( convert( sensitiveWordDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( SensitiveWordDO sensitiveWordDO : list ) { + list1.add( sensitiveWordDOToSensitiveWordExcelVO( sensitiveWordDO ) ); + } + + return list1; + } + + protected SensitiveWordExcelVO sensitiveWordDOToSensitiveWordExcelVO(SensitiveWordDO sensitiveWordDO) { + if ( sensitiveWordDO == null ) { + return null; + } + + SensitiveWordExcelVO sensitiveWordExcelVO = new SensitiveWordExcelVO(); + + sensitiveWordExcelVO.setId( sensitiveWordDO.getId() ); + sensitiveWordExcelVO.setName( sensitiveWordDO.getName() ); + List list = sensitiveWordDO.getTags(); + if ( list != null ) { + sensitiveWordExcelVO.setTags( new ArrayList( list ) ); + } + sensitiveWordExcelVO.setStatus( sensitiveWordDO.getStatus() ); + sensitiveWordExcelVO.setDescription( sensitiveWordDO.getDescription() ); + sensitiveWordExcelVO.setCreateTime( sensitiveWordDO.getCreateTime() ); + + return sensitiveWordExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/sms/SmsChannelConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/sms/SmsChannelConvertImpl.java new file mode 100644 index 0000000..a6a0573 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/sms/SmsChannelConvertImpl.java @@ -0,0 +1,166 @@ +package com.jojubanking.boot.module.system.convert.sms; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.framework.sms.core.property.SmsChannelProperties; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelRespVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.channel.SmsChannelUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsChannelDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class SmsChannelConvertImpl implements SmsChannelConvert { + + @Override + public SmsChannelDO convert(SmsChannelCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + SmsChannelDO smsChannelDO = new SmsChannelDO(); + + smsChannelDO.setSignature( bean.getSignature() ); + smsChannelDO.setCode( bean.getCode() ); + smsChannelDO.setStatus( bean.getStatus() ); + smsChannelDO.setRemark( bean.getRemark() ); + smsChannelDO.setApiKey( bean.getApiKey() ); + smsChannelDO.setApiSecret( bean.getApiSecret() ); + smsChannelDO.setCallbackUrl( bean.getCallbackUrl() ); + + return smsChannelDO; + } + + @Override + public SmsChannelDO convert(SmsChannelUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + SmsChannelDO smsChannelDO = new SmsChannelDO(); + + smsChannelDO.setId( bean.getId() ); + smsChannelDO.setSignature( bean.getSignature() ); + smsChannelDO.setStatus( bean.getStatus() ); + smsChannelDO.setRemark( bean.getRemark() ); + smsChannelDO.setApiKey( bean.getApiKey() ); + smsChannelDO.setApiSecret( bean.getApiSecret() ); + smsChannelDO.setCallbackUrl( bean.getCallbackUrl() ); + + return smsChannelDO; + } + + @Override + public SmsChannelRespVO convert(SmsChannelDO bean) { + if ( bean == null ) { + return null; + } + + SmsChannelRespVO smsChannelRespVO = new SmsChannelRespVO(); + + smsChannelRespVO.setSignature( bean.getSignature() ); + smsChannelRespVO.setStatus( bean.getStatus() ); + smsChannelRespVO.setRemark( bean.getRemark() ); + smsChannelRespVO.setApiKey( bean.getApiKey() ); + smsChannelRespVO.setApiSecret( bean.getApiSecret() ); + smsChannelRespVO.setCallbackUrl( bean.getCallbackUrl() ); + smsChannelRespVO.setId( bean.getId() ); + smsChannelRespVO.setCode( bean.getCode() ); + smsChannelRespVO.setCreateTime( bean.getCreateTime() ); + + return smsChannelRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( SmsChannelDO smsChannelDO : list ) { + list1.add( convert( smsChannelDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( SmsChannelDO smsChannelDO : list ) { + list1.add( smsChannelDOToSmsChannelProperties( smsChannelDO ) ); + } + + return list1; + } + + @Override + public List convertList03(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( SmsChannelDO smsChannelDO : list ) { + list1.add( smsChannelDOToSmsChannelSimpleRespVO( smsChannelDO ) ); + } + + return list1; + } + + protected SmsChannelProperties smsChannelDOToSmsChannelProperties(SmsChannelDO smsChannelDO) { + if ( smsChannelDO == null ) { + return null; + } + + SmsChannelProperties smsChannelProperties = new SmsChannelProperties(); + + smsChannelProperties.setId( smsChannelDO.getId() ); + smsChannelProperties.setSignature( smsChannelDO.getSignature() ); + smsChannelProperties.setCode( smsChannelDO.getCode() ); + smsChannelProperties.setApiKey( smsChannelDO.getApiKey() ); + smsChannelProperties.setApiSecret( smsChannelDO.getApiSecret() ); + smsChannelProperties.setCallbackUrl( smsChannelDO.getCallbackUrl() ); + + return smsChannelProperties; + } + + protected SmsChannelSimpleRespVO smsChannelDOToSmsChannelSimpleRespVO(SmsChannelDO smsChannelDO) { + if ( smsChannelDO == null ) { + return null; + } + + SmsChannelSimpleRespVO smsChannelSimpleRespVO = new SmsChannelSimpleRespVO(); + + smsChannelSimpleRespVO.setId( smsChannelDO.getId() ); + smsChannelSimpleRespVO.setSignature( smsChannelDO.getSignature() ); + smsChannelSimpleRespVO.setCode( smsChannelDO.getCode() ); + + return smsChannelSimpleRespVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/sms/SmsLogConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/sms/SmsLogConvertImpl.java new file mode 100644 index 0000000..3fec00d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/sms/SmsLogConvertImpl.java @@ -0,0 +1,140 @@ +package com.jojubanking.boot.module.system.convert.sms; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogExcelVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.log.SmsLogRespVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsLogDO; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class SmsLogConvertImpl implements SmsLogConvert { + + @Override + public SmsLogRespVO convert(SmsLogDO bean) { + if ( bean == null ) { + return null; + } + + SmsLogRespVO smsLogRespVO = new SmsLogRespVO(); + + smsLogRespVO.setId( bean.getId() ); + smsLogRespVO.setChannelId( bean.getChannelId() ); + smsLogRespVO.setChannelCode( bean.getChannelCode() ); + smsLogRespVO.setTemplateId( bean.getTemplateId() ); + smsLogRespVO.setTemplateCode( bean.getTemplateCode() ); + smsLogRespVO.setTemplateType( bean.getTemplateType() ); + smsLogRespVO.setTemplateContent( bean.getTemplateContent() ); + Map map = bean.getTemplateParams(); + if ( map != null ) { + smsLogRespVO.setTemplateParams( new HashMap( map ) ); + } + smsLogRespVO.setApiTemplateId( bean.getApiTemplateId() ); + smsLogRespVO.setMobile( bean.getMobile() ); + smsLogRespVO.setUserId( bean.getUserId() ); + smsLogRespVO.setUserType( bean.getUserType() ); + smsLogRespVO.setSendStatus( bean.getSendStatus() ); + smsLogRespVO.setSendTime( bean.getSendTime() ); + smsLogRespVO.setSendCode( bean.getSendCode() ); + smsLogRespVO.setSendMsg( bean.getSendMsg() ); + smsLogRespVO.setApiSendCode( bean.getApiSendCode() ); + smsLogRespVO.setApiSendMsg( bean.getApiSendMsg() ); + smsLogRespVO.setApiRequestId( bean.getApiRequestId() ); + smsLogRespVO.setApiSerialNo( bean.getApiSerialNo() ); + smsLogRespVO.setReceiveStatus( bean.getReceiveStatus() ); + smsLogRespVO.setReceiveTime( bean.getReceiveTime() ); + smsLogRespVO.setApiReceiveCode( bean.getApiReceiveCode() ); + smsLogRespVO.setApiReceiveMsg( bean.getApiReceiveMsg() ); + smsLogRespVO.setCreateTime( bean.getCreateTime() ); + + return smsLogRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( SmsLogDO smsLogDO : list ) { + list1.add( convert( smsLogDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( SmsLogDO smsLogDO : list ) { + list1.add( smsLogDOToSmsLogExcelVO( smsLogDO ) ); + } + + return list1; + } + + protected SmsLogExcelVO smsLogDOToSmsLogExcelVO(SmsLogDO smsLogDO) { + if ( smsLogDO == null ) { + return null; + } + + SmsLogExcelVO smsLogExcelVO = new SmsLogExcelVO(); + + smsLogExcelVO.setId( smsLogDO.getId() ); + smsLogExcelVO.setChannelId( smsLogDO.getChannelId() ); + smsLogExcelVO.setChannelCode( smsLogDO.getChannelCode() ); + smsLogExcelVO.setTemplateId( smsLogDO.getTemplateId() ); + smsLogExcelVO.setTemplateCode( smsLogDO.getTemplateCode() ); + smsLogExcelVO.setTemplateType( smsLogDO.getTemplateType() ); + smsLogExcelVO.setTemplateContent( smsLogDO.getTemplateContent() ); + Map map = smsLogDO.getTemplateParams(); + if ( map != null ) { + smsLogExcelVO.setTemplateParams( new HashMap( map ) ); + } + smsLogExcelVO.setApiTemplateId( smsLogDO.getApiTemplateId() ); + smsLogExcelVO.setMobile( smsLogDO.getMobile() ); + smsLogExcelVO.setUserId( smsLogDO.getUserId() ); + smsLogExcelVO.setUserType( smsLogDO.getUserType() ); + smsLogExcelVO.setSendStatus( smsLogDO.getSendStatus() ); + smsLogExcelVO.setSendTime( smsLogDO.getSendTime() ); + smsLogExcelVO.setSendCode( smsLogDO.getSendCode() ); + smsLogExcelVO.setSendMsg( smsLogDO.getSendMsg() ); + smsLogExcelVO.setApiSendCode( smsLogDO.getApiSendCode() ); + smsLogExcelVO.setApiSendMsg( smsLogDO.getApiSendMsg() ); + smsLogExcelVO.setApiRequestId( smsLogDO.getApiRequestId() ); + smsLogExcelVO.setApiSerialNo( smsLogDO.getApiSerialNo() ); + smsLogExcelVO.setReceiveStatus( smsLogDO.getReceiveStatus() ); + smsLogExcelVO.setReceiveTime( smsLogDO.getReceiveTime() ); + smsLogExcelVO.setApiReceiveCode( smsLogDO.getApiReceiveCode() ); + smsLogExcelVO.setApiReceiveMsg( smsLogDO.getApiReceiveMsg() ); + smsLogExcelVO.setCreateTime( smsLogDO.getCreateTime() ); + + return smsLogExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/sms/SmsTemplateConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/sms/SmsTemplateConvertImpl.java new file mode 100644 index 0000000..798960e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/sms/SmsTemplateConvertImpl.java @@ -0,0 +1,151 @@ +package com.jojubanking.boot.module.system.convert.sms; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateExcelVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateRespVO; +import com.jojubanking.boot.module.system.controller.admin.sms.vo.template.SmsTemplateUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.sms.SmsTemplateDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class SmsTemplateConvertImpl implements SmsTemplateConvert { + + @Override + public SmsTemplateDO convert(SmsTemplateCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + SmsTemplateDO smsTemplateDO = new SmsTemplateDO(); + + smsTemplateDO.setType( bean.getType() ); + smsTemplateDO.setStatus( bean.getStatus() ); + smsTemplateDO.setCode( bean.getCode() ); + smsTemplateDO.setName( bean.getName() ); + smsTemplateDO.setContent( bean.getContent() ); + smsTemplateDO.setRemark( bean.getRemark() ); + smsTemplateDO.setApiTemplateId( bean.getApiTemplateId() ); + smsTemplateDO.setChannelId( bean.getChannelId() ); + + return smsTemplateDO; + } + + @Override + public SmsTemplateDO convert(SmsTemplateUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + SmsTemplateDO smsTemplateDO = new SmsTemplateDO(); + + smsTemplateDO.setId( bean.getId() ); + smsTemplateDO.setType( bean.getType() ); + smsTemplateDO.setStatus( bean.getStatus() ); + smsTemplateDO.setCode( bean.getCode() ); + smsTemplateDO.setName( bean.getName() ); + smsTemplateDO.setContent( bean.getContent() ); + smsTemplateDO.setRemark( bean.getRemark() ); + smsTemplateDO.setApiTemplateId( bean.getApiTemplateId() ); + smsTemplateDO.setChannelId( bean.getChannelId() ); + + return smsTemplateDO; + } + + @Override + public SmsTemplateRespVO convert(SmsTemplateDO bean) { + if ( bean == null ) { + return null; + } + + SmsTemplateRespVO smsTemplateRespVO = new SmsTemplateRespVO(); + + smsTemplateRespVO.setType( bean.getType() ); + smsTemplateRespVO.setStatus( bean.getStatus() ); + smsTemplateRespVO.setCode( bean.getCode() ); + smsTemplateRespVO.setName( bean.getName() ); + smsTemplateRespVO.setContent( bean.getContent() ); + smsTemplateRespVO.setRemark( bean.getRemark() ); + smsTemplateRespVO.setApiTemplateId( bean.getApiTemplateId() ); + smsTemplateRespVO.setChannelId( bean.getChannelId() ); + smsTemplateRespVO.setId( bean.getId() ); + smsTemplateRespVO.setChannelCode( bean.getChannelCode() ); + List list = bean.getParams(); + if ( list != null ) { + smsTemplateRespVO.setParams( new ArrayList( list ) ); + } + smsTemplateRespVO.setCreateTime( bean.getCreateTime() ); + + return smsTemplateRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( SmsTemplateDO smsTemplateDO : list ) { + list1.add( convert( smsTemplateDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( SmsTemplateDO smsTemplateDO : list ) { + list1.add( smsTemplateDOToSmsTemplateExcelVO( smsTemplateDO ) ); + } + + return list1; + } + + protected SmsTemplateExcelVO smsTemplateDOToSmsTemplateExcelVO(SmsTemplateDO smsTemplateDO) { + if ( smsTemplateDO == null ) { + return null; + } + + SmsTemplateExcelVO smsTemplateExcelVO = new SmsTemplateExcelVO(); + + smsTemplateExcelVO.setId( smsTemplateDO.getId() ); + smsTemplateExcelVO.setType( smsTemplateDO.getType() ); + smsTemplateExcelVO.setStatus( smsTemplateDO.getStatus() ); + smsTemplateExcelVO.setCode( smsTemplateDO.getCode() ); + smsTemplateExcelVO.setName( smsTemplateDO.getName() ); + smsTemplateExcelVO.setContent( smsTemplateDO.getContent() ); + smsTemplateExcelVO.setRemark( smsTemplateDO.getRemark() ); + smsTemplateExcelVO.setApiTemplateId( smsTemplateDO.getApiTemplateId() ); + smsTemplateExcelVO.setChannelId( smsTemplateDO.getChannelId() ); + smsTemplateExcelVO.setChannelCode( smsTemplateDO.getChannelCode() ); + smsTemplateExcelVO.setCreateTime( smsTemplateDO.getCreateTime() ); + + return smsTemplateExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/social/SocialUserConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/social/SocialUserConvertImpl.java new file mode 100644 index 0000000..f7f2558 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/social/SocialUserConvertImpl.java @@ -0,0 +1,59 @@ +package com.jojubanking.boot.module.system.convert.social; + +import com.jojubanking.boot.module.system.api.social.dto.SocialUserBindReqDTO; +import com.jojubanking.boot.module.system.api.social.dto.SocialUserUnbindReqDTO; +import com.jojubanking.boot.module.system.controller.admin.socail.vo.SocialUserBindReqVO; +import com.jojubanking.boot.module.system.controller.admin.socail.vo.SocialUserUnbindReqVO; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class SocialUserConvertImpl implements SocialUserConvert { + + @Override + public SocialUserBindReqDTO convert(Long userId, Integer userType, SocialUserBindReqVO reqVO) { + if ( userId == null && userType == null && reqVO == null ) { + return null; + } + + SocialUserBindReqDTO socialUserBindReqDTO = new SocialUserBindReqDTO(); + + if ( userId != null ) { + socialUserBindReqDTO.setUserId( userId ); + } + if ( userType != null ) { + socialUserBindReqDTO.setUserType( userType ); + } + if ( reqVO != null ) { + socialUserBindReqDTO.setType( reqVO.getType() ); + socialUserBindReqDTO.setCode( reqVO.getCode() ); + socialUserBindReqDTO.setState( reqVO.getState() ); + } + + return socialUserBindReqDTO; + } + + @Override + public SocialUserUnbindReqDTO convert(Long userId, Integer userType, SocialUserUnbindReqVO reqVO) { + if ( userId == null && userType == null && reqVO == null ) { + return null; + } + + SocialUserUnbindReqDTO socialUserUnbindReqDTO = new SocialUserUnbindReqDTO(); + + if ( userId != null ) { + socialUserUnbindReqDTO.setUserId( userId ); + } + if ( userType != null ) { + socialUserUnbindReqDTO.setUserType( userType ); + } + if ( reqVO != null ) { + socialUserUnbindReqDTO.setType( reqVO.getType() ); + } + + return socialUserUnbindReqDTO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/student/StudentConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/student/StudentConvertImpl.java new file mode 100644 index 0000000..8fc5bbf --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/student/StudentConvertImpl.java @@ -0,0 +1,207 @@ +package com.jojubanking.boot.module.system.convert.student; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentExcelVO; +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentImportExcelVO; +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentRespVO; +import com.jojubanking.boot.module.system.controller.admin.student.vo.StudentUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.student.StudentDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class StudentConvertImpl implements StudentConvert { + + @Override + public StudentDO convert(StudentCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + StudentDO studentDO = new StudentDO(); + + studentDO.setOpenid( bean.getOpenid() ); + studentDO.setBatchno( bean.getBatchno() ); + studentDO.setBatchname( bean.getBatchname() ); + studentDO.setPatid( bean.getPatid() ); + studentDO.setName( bean.getName() ); + studentDO.setSex( bean.getSex() ); + studentDO.setAge( bean.getAge() ); + studentDO.setNationId( bean.getNationId() ); + studentDO.setDeptId( bean.getDeptId() ); + studentDO.setClassName( bean.getClassName() ); + studentDO.setSchoolName( bean.getSchoolName() ); + studentDO.setSqName( bean.getSqName() ); + studentDO.setJdName( bean.getJdName() ); + studentDO.setEmail( bean.getEmail() ); + studentDO.setMobile( bean.getMobile() ); + studentDO.setRemark( bean.getRemark() ); + studentDO.setStatus( bean.getStatus() ); + studentDO.setFeeflag( bean.getFeeflag() ); + + return studentDO; + } + + @Override + public StudentDO convert(StudentUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + StudentDO studentDO = new StudentDO(); + + studentDO.setId( bean.getId() ); + studentDO.setOpenid( bean.getOpenid() ); + studentDO.setBatchno( bean.getBatchno() ); + studentDO.setBatchname( bean.getBatchname() ); + studentDO.setPatid( bean.getPatid() ); + studentDO.setName( bean.getName() ); + studentDO.setSex( bean.getSex() ); + studentDO.setAge( bean.getAge() ); + studentDO.setNationId( bean.getNationId() ); + studentDO.setDeptId( bean.getDeptId() ); + studentDO.setClassName( bean.getClassName() ); + studentDO.setSchoolName( bean.getSchoolName() ); + studentDO.setSqName( bean.getSqName() ); + studentDO.setJdName( bean.getJdName() ); + studentDO.setEmail( bean.getEmail() ); + studentDO.setMobile( bean.getMobile() ); + studentDO.setRemark( bean.getRemark() ); + studentDO.setStatus( bean.getStatus() ); + studentDO.setFeeflag( bean.getFeeflag() ); + + return studentDO; + } + + @Override + public StudentDO convert(StudentImportExcelVO bean) { + if ( bean == null ) { + return null; + } + + StudentDO studentDO = new StudentDO(); + + studentDO.setName( bean.getName() ); + studentDO.setNationId( bean.getNationId() ); + studentDO.setClassName( bean.getClassName() ); + studentDO.setSchoolName( bean.getSchoolName() ); + studentDO.setSqName( bean.getSqName() ); + studentDO.setMobile( bean.getMobile() ); + + return studentDO; + } + + @Override + public StudentRespVO convert(StudentDO bean) { + if ( bean == null ) { + return null; + } + + StudentRespVO studentRespVO = new StudentRespVO(); + + studentRespVO.setOpenid( bean.getOpenid() ); + studentRespVO.setBatchno( bean.getBatchno() ); + studentRespVO.setBatchname( bean.getBatchname() ); + studentRespVO.setPatid( bean.getPatid() ); + studentRespVO.setName( bean.getName() ); + studentRespVO.setSex( bean.getSex() ); + studentRespVO.setAge( bean.getAge() ); + studentRespVO.setNationId( bean.getNationId() ); + studentRespVO.setFeeflag( bean.getFeeflag() ); + studentRespVO.setDeptId( bean.getDeptId() ); + studentRespVO.setClassName( bean.getClassName() ); + studentRespVO.setSchoolName( bean.getSchoolName() ); + studentRespVO.setSqName( bean.getSqName() ); + studentRespVO.setJdName( bean.getJdName() ); + studentRespVO.setEmail( bean.getEmail() ); + studentRespVO.setMobile( bean.getMobile() ); + studentRespVO.setRemark( bean.getRemark() ); + studentRespVO.setStatus( bean.getStatus() ); + studentRespVO.setId( bean.getId() ); + studentRespVO.setCreateTime( bean.getCreateTime() ); + + return studentRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( StudentDO studentDO : list ) { + list1.add( convert( studentDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( StudentDO studentDO : list ) { + list1.add( studentDOToStudentExcelVO( studentDO ) ); + } + + return list1; + } + + protected StudentExcelVO studentDOToStudentExcelVO(StudentDO studentDO) { + if ( studentDO == null ) { + return null; + } + + StudentExcelVO studentExcelVO = new StudentExcelVO(); + + studentExcelVO.setId( studentDO.getId() ); + studentExcelVO.setOpenid( studentDO.getOpenid() ); + studentExcelVO.setPatid( studentDO.getPatid() ); + studentExcelVO.setName( studentDO.getName() ); + studentExcelVO.setSex( studentDO.getSex() ); + studentExcelVO.setAge( studentDO.getAge() ); + studentExcelVO.setNationId( studentDO.getNationId() ); + studentExcelVO.setDeptId( studentDO.getDeptId() ); + studentExcelVO.setClassName( studentDO.getClassName() ); + studentExcelVO.setSchoolName( studentDO.getSchoolName() ); + studentExcelVO.setSqName( studentDO.getSqName() ); + studentExcelVO.setJdName( studentDO.getJdName() ); + studentExcelVO.setEmail( studentDO.getEmail() ); + studentExcelVO.setMobile( studentDO.getMobile() ); + studentExcelVO.setRemark( studentDO.getRemark() ); + studentExcelVO.setStatus( studentDO.getStatus() ); + studentExcelVO.setCreateTime( studentDO.getCreateTime() ); + studentExcelVO.setTjpkgmx( studentDO.getTjpkgmx() ); + studentExcelVO.setTjpkgfee( studentDO.getTjpkgfee() ); + studentExcelVO.setTjkxmx( studentDO.getTjkxmx() ); + studentExcelVO.setTjkxfee( studentDO.getTjkxfee() ); + studentExcelVO.setOrderno( studentDO.getOrderno() ); + studentExcelVO.setFeeflag( studentDO.getFeeflag() ); + + return studentExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/tenant/TenantConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/tenant/TenantConvertImpl.java new file mode 100644 index 0000000..3277544 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/tenant/TenantConvertImpl.java @@ -0,0 +1,141 @@ +package com.jojubanking.boot.module.system.convert.tenant; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantExcelVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantRespVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.tenant.TenantUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class TenantConvertImpl implements TenantConvert { + + @Override + public TenantDO convert(TenantCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + TenantDO tenantDO = new TenantDO(); + + tenantDO.setName( bean.getName() ); + tenantDO.setContactName( bean.getContactName() ); + tenantDO.setContactMobile( bean.getContactMobile() ); + tenantDO.setStatus( bean.getStatus() ); + tenantDO.setDomain( bean.getDomain() ); + tenantDO.setPackageId( bean.getPackageId() ); + tenantDO.setExpireTime( bean.getExpireTime() ); + tenantDO.setAccountCount( bean.getAccountCount() ); + + return tenantDO; + } + + @Override + public TenantDO convert(TenantUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + TenantDO tenantDO = new TenantDO(); + + tenantDO.setId( bean.getId() ); + tenantDO.setName( bean.getName() ); + tenantDO.setContactName( bean.getContactName() ); + tenantDO.setContactMobile( bean.getContactMobile() ); + tenantDO.setStatus( bean.getStatus() ); + tenantDO.setDomain( bean.getDomain() ); + tenantDO.setPackageId( bean.getPackageId() ); + tenantDO.setExpireTime( bean.getExpireTime() ); + tenantDO.setAccountCount( bean.getAccountCount() ); + + return tenantDO; + } + + @Override + public TenantRespVO convert(TenantDO bean) { + if ( bean == null ) { + return null; + } + + TenantRespVO tenantRespVO = new TenantRespVO(); + + tenantRespVO.setName( bean.getName() ); + tenantRespVO.setContactName( bean.getContactName() ); + tenantRespVO.setContactMobile( bean.getContactMobile() ); + tenantRespVO.setStatus( bean.getStatus() ); + tenantRespVO.setDomain( bean.getDomain() ); + tenantRespVO.setPackageId( bean.getPackageId() ); + tenantRespVO.setExpireTime( bean.getExpireTime() ); + tenantRespVO.setAccountCount( bean.getAccountCount() ); + tenantRespVO.setId( bean.getId() ); + tenantRespVO.setCreateTime( bean.getCreateTime() ); + + return tenantRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( TenantDO tenantDO : list ) { + list1.add( convert( tenantDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( TenantDO tenantDO : list ) { + list1.add( tenantDOToTenantExcelVO( tenantDO ) ); + } + + return list1; + } + + protected TenantExcelVO tenantDOToTenantExcelVO(TenantDO tenantDO) { + if ( tenantDO == null ) { + return null; + } + + TenantExcelVO tenantExcelVO = new TenantExcelVO(); + + tenantExcelVO.setId( tenantDO.getId() ); + tenantExcelVO.setName( tenantDO.getName() ); + tenantExcelVO.setContactName( tenantDO.getContactName() ); + tenantExcelVO.setContactMobile( tenantDO.getContactMobile() ); + tenantExcelVO.setStatus( tenantDO.getStatus() ); + tenantExcelVO.setCreateTime( tenantDO.getCreateTime() ); + + return tenantExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/tenant/TenantPackageConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/tenant/TenantPackageConvertImpl.java new file mode 100644 index 0000000..5af2b7e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/tenant/TenantPackageConvertImpl.java @@ -0,0 +1,136 @@ +package com.jojubanking.boot.module.system.convert.tenant; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageRespVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.tenant.vo.packages.TenantPackageUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.tenant.TenantPackageDO; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class TenantPackageConvertImpl implements TenantPackageConvert { + + @Override + public TenantPackageDO convert(TenantPackageCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + TenantPackageDO tenantPackageDO = new TenantPackageDO(); + + tenantPackageDO.setName( bean.getName() ); + tenantPackageDO.setStatus( bean.getStatus() ); + tenantPackageDO.setRemark( bean.getRemark() ); + Set set = bean.getMenuIds(); + if ( set != null ) { + tenantPackageDO.setMenuIds( new HashSet( set ) ); + } + + return tenantPackageDO; + } + + @Override + public TenantPackageDO convert(TenantPackageUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + TenantPackageDO tenantPackageDO = new TenantPackageDO(); + + tenantPackageDO.setId( bean.getId() ); + tenantPackageDO.setName( bean.getName() ); + tenantPackageDO.setStatus( bean.getStatus() ); + tenantPackageDO.setRemark( bean.getRemark() ); + Set set = bean.getMenuIds(); + if ( set != null ) { + tenantPackageDO.setMenuIds( new HashSet( set ) ); + } + + return tenantPackageDO; + } + + @Override + public TenantPackageRespVO convert(TenantPackageDO bean) { + if ( bean == null ) { + return null; + } + + TenantPackageRespVO tenantPackageRespVO = new TenantPackageRespVO(); + + tenantPackageRespVO.setName( bean.getName() ); + tenantPackageRespVO.setStatus( bean.getStatus() ); + tenantPackageRespVO.setRemark( bean.getRemark() ); + Set set = bean.getMenuIds(); + if ( set != null ) { + tenantPackageRespVO.setMenuIds( new HashSet( set ) ); + } + tenantPackageRespVO.setId( bean.getId() ); + tenantPackageRespVO.setCreateTime( bean.getCreateTime() ); + + return tenantPackageRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( TenantPackageDO tenantPackageDO : list ) { + list1.add( convert( tenantPackageDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( TenantPackageDO tenantPackageDO : list ) { + list1.add( tenantPackageDOToTenantPackageSimpleRespVO( tenantPackageDO ) ); + } + + return list1; + } + + protected TenantPackageSimpleRespVO tenantPackageDOToTenantPackageSimpleRespVO(TenantPackageDO tenantPackageDO) { + if ( tenantPackageDO == null ) { + return null; + } + + TenantPackageSimpleRespVO tenantPackageSimpleRespVO = new TenantPackageSimpleRespVO(); + + tenantPackageSimpleRespVO.setId( tenantPackageDO.getId() ); + tenantPackageSimpleRespVO.setName( tenantPackageDO.getName() ); + + return tenantPackageSimpleRespVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/usecount/UseCountConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/usecount/UseCountConvertImpl.java new file mode 100644 index 0000000..a79df09 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/usecount/UseCountConvertImpl.java @@ -0,0 +1,121 @@ +package com.jojubanking.boot.module.system.convert.usecount; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.usecount.vo.UseCountCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.usecount.vo.UseCountExcelVO; +import com.jojubanking.boot.module.system.controller.admin.usecount.vo.UseCountRespVO; +import com.jojubanking.boot.module.system.controller.admin.usecount.vo.UseCountUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.usecount.UseCountDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class UseCountConvertImpl implements UseCountConvert { + + @Override + public UseCountDO convert(UseCountCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + UseCountDO useCountDO = new UseCountDO(); + + useCountDO.setInterfaceIdentification( bean.getInterfaceIdentification() ); + useCountDO.setUserId( bean.getUserId() ); + + return useCountDO; + } + + @Override + public UseCountDO convert(UseCountUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + UseCountDO useCountDO = new UseCountDO(); + + useCountDO.setId( bean.getId() ); + useCountDO.setInterfaceIdentification( bean.getInterfaceIdentification() ); + useCountDO.setUserId( bean.getUserId() ); + + return useCountDO; + } + + @Override + public UseCountRespVO convert(UseCountDO bean) { + if ( bean == null ) { + return null; + } + + UseCountRespVO useCountRespVO = new UseCountRespVO(); + + useCountRespVO.setInterfaceIdentification( bean.getInterfaceIdentification() ); + useCountRespVO.setUserId( bean.getUserId() ); + useCountRespVO.setId( bean.getId() ); + useCountRespVO.setCreateTime( bean.getCreateTime() ); + + return useCountRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( UseCountDO useCountDO : list ) { + list1.add( convert( useCountDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( UseCountDO useCountDO : list ) { + list1.add( useCountDOToUseCountExcelVO( useCountDO ) ); + } + + return list1; + } + + protected UseCountExcelVO useCountDOToUseCountExcelVO(UseCountDO useCountDO) { + if ( useCountDO == null ) { + return null; + } + + UseCountExcelVO useCountExcelVO = new UseCountExcelVO(); + + useCountExcelVO.setId( useCountDO.getId() ); + useCountExcelVO.setInterfaceIdentification( useCountDO.getInterfaceIdentification() ); + useCountExcelVO.setUserId( useCountDO.getUserId() ); + useCountExcelVO.setCreateTime( useCountDO.getCreateTime() ); + + return useCountExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/user/UserConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/user/UserConvertImpl.java new file mode 100644 index 0000000..dd6cba8 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/user/UserConvertImpl.java @@ -0,0 +1,380 @@ +package com.jojubanking.boot.module.system.convert.user; + +import com.jojubanking.boot.module.system.api.user.dto.AdminUserRespDTO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileRespVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileRespVO.Post; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileRespVO.Role; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileRespVO.SocialUser; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserExcelVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserImportExcelVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserPageItemRespVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserPageItemRespVO.Dept; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserSimpleRespVO; +import com.jojubanking.boot.module.system.controller.admin.user.vo.user.UserUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.DeptDO; +import com.jojubanking.boot.module.system.dal.dataobject.dept.PostDO; +import com.jojubanking.boot.module.system.dal.dataobject.permission.RoleDO; +import com.jojubanking.boot.module.system.dal.dataobject.social.SocialUserDO; +import com.jojubanking.boot.module.system.dal.dataobject.user.AdminUserDO; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class UserConvertImpl implements UserConvert { + + @Override + public UserPageItemRespVO convert(AdminUserDO bean) { + if ( bean == null ) { + return null; + } + + UserPageItemRespVO userPageItemRespVO = new UserPageItemRespVO(); + + userPageItemRespVO.setUsername( bean.getUsername() ); + userPageItemRespVO.setNickname( bean.getNickname() ); + userPageItemRespVO.setRemark( bean.getRemark() ); + userPageItemRespVO.setDeptId( bean.getDeptId() ); + Set set = bean.getPostIds(); + if ( set != null ) { + userPageItemRespVO.setPostIds( new HashSet( set ) ); + } + userPageItemRespVO.setEmail( bean.getEmail() ); + userPageItemRespVO.setMobile( bean.getMobile() ); + userPageItemRespVO.setSex( bean.getSex() ); + userPageItemRespVO.setAvatar( bean.getAvatar() ); + userPageItemRespVO.setId( bean.getId() ); + userPageItemRespVO.setStatus( bean.getStatus() ); + userPageItemRespVO.setLoginIp( bean.getLoginIp() ); + userPageItemRespVO.setLoginDate( bean.getLoginDate() ); + userPageItemRespVO.setCreateTime( bean.getCreateTime() ); + + return userPageItemRespVO; + } + + @Override + public Dept convert(DeptDO bean) { + if ( bean == null ) { + return null; + } + + Dept dept = new Dept(); + + dept.setId( bean.getId() ); + dept.setName( bean.getName() ); + + return dept; + } + + @Override + public AdminUserDO convert(UserCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + AdminUserDO adminUserDO = new AdminUserDO(); + + adminUserDO.setUsername( bean.getUsername() ); + adminUserDO.setPassword( bean.getPassword() ); + adminUserDO.setNickname( bean.getNickname() ); + adminUserDO.setRemark( bean.getRemark() ); + adminUserDO.setDeptId( bean.getDeptId() ); + Set set = bean.getPostIds(); + if ( set != null ) { + adminUserDO.setPostIds( new HashSet( set ) ); + } + adminUserDO.setEmail( bean.getEmail() ); + adminUserDO.setMobile( bean.getMobile() ); + adminUserDO.setSex( bean.getSex() ); + adminUserDO.setAvatar( bean.getAvatar() ); + + return adminUserDO; + } + + @Override + public AdminUserDO convert(UserUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + AdminUserDO adminUserDO = new AdminUserDO(); + + adminUserDO.setId( bean.getId() ); + adminUserDO.setUsername( bean.getUsername() ); + adminUserDO.setNickname( bean.getNickname() ); + adminUserDO.setRemark( bean.getRemark() ); + adminUserDO.setDeptId( bean.getDeptId() ); + Set set = bean.getPostIds(); + if ( set != null ) { + adminUserDO.setPostIds( new HashSet( set ) ); + } + adminUserDO.setEmail( bean.getEmail() ); + adminUserDO.setMobile( bean.getMobile() ); + adminUserDO.setSex( bean.getSex() ); + adminUserDO.setAvatar( bean.getAvatar() ); + + return adminUserDO; + } + + @Override + public UserExcelVO convert02(AdminUserDO bean) { + if ( bean == null ) { + return null; + } + + UserExcelVO userExcelVO = new UserExcelVO(); + + userExcelVO.setId( bean.getId() ); + userExcelVO.setUsername( bean.getUsername() ); + userExcelVO.setNickname( bean.getNickname() ); + userExcelVO.setEmail( bean.getEmail() ); + userExcelVO.setMobile( bean.getMobile() ); + userExcelVO.setSex( bean.getSex() ); + userExcelVO.setStatus( bean.getStatus() ); + userExcelVO.setLoginIp( bean.getLoginIp() ); + userExcelVO.setLoginDate( bean.getLoginDate() ); + + return userExcelVO; + } + + @Override + public AdminUserDO convert(UserImportExcelVO bean) { + if ( bean == null ) { + return null; + } + + AdminUserDO adminUserDO = new AdminUserDO(); + + adminUserDO.setUsername( bean.getUsername() ); + adminUserDO.setNickname( bean.getNickname() ); + adminUserDO.setDeptId( bean.getDeptId() ); + adminUserDO.setEmail( bean.getEmail() ); + adminUserDO.setMobile( bean.getMobile() ); + adminUserDO.setSex( bean.getSex() ); + adminUserDO.setStatus( bean.getStatus() ); + + return adminUserDO; + } + + @Override + public UserProfileRespVO convert03(AdminUserDO bean) { + if ( bean == null ) { + return null; + } + + UserProfileRespVO userProfileRespVO = new UserProfileRespVO(); + + userProfileRespVO.setUsername( bean.getUsername() ); + userProfileRespVO.setNickname( bean.getNickname() ); + userProfileRespVO.setRemark( bean.getRemark() ); + userProfileRespVO.setDeptId( bean.getDeptId() ); + Set set = bean.getPostIds(); + if ( set != null ) { + userProfileRespVO.setPostIds( new HashSet( set ) ); + } + userProfileRespVO.setEmail( bean.getEmail() ); + userProfileRespVO.setMobile( bean.getMobile() ); + userProfileRespVO.setSex( bean.getSex() ); + userProfileRespVO.setAvatar( bean.getAvatar() ); + userProfileRespVO.setId( bean.getId() ); + userProfileRespVO.setStatus( bean.getStatus() ); + userProfileRespVO.setLoginIp( bean.getLoginIp() ); + userProfileRespVO.setLoginDate( bean.getLoginDate() ); + userProfileRespVO.setCreateTime( bean.getCreateTime() ); + + return userProfileRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( RoleDO roleDO : list ) { + list1.add( roleDOToRole( roleDO ) ); + } + + return list1; + } + + @Override + public com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileRespVO.Dept convert02(DeptDO bean) { + if ( bean == null ) { + return null; + } + + com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileRespVO.Dept dept = new com.jojubanking.boot.module.system.controller.admin.user.vo.profile.UserProfileRespVO.Dept(); + + dept.setId( bean.getId() ); + dept.setName( bean.getName() ); + + return dept; + } + + @Override + public AdminUserDO convert(UserProfileUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + AdminUserDO adminUserDO = new AdminUserDO(); + + adminUserDO.setNickname( bean.getNickname() ); + adminUserDO.setEmail( bean.getEmail() ); + adminUserDO.setMobile( bean.getMobile() ); + adminUserDO.setSex( bean.getSex() ); + + return adminUserDO; + } + + @Override + public AdminUserDO convert(UserProfileUpdatePasswordReqVO bean) { + if ( bean == null ) { + return null; + } + + AdminUserDO adminUserDO = new AdminUserDO(); + + return adminUserDO; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( PostDO postDO : list ) { + list1.add( postDOToPost( postDO ) ); + } + + return list1; + } + + @Override + public List convertList03(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( SocialUserDO socialUserDO : list ) { + list1.add( socialUserDOToSocialUser( socialUserDO ) ); + } + + return list1; + } + + @Override + public List convertList04(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( AdminUserDO adminUserDO : list ) { + list1.add( adminUserDOToUserSimpleRespVO( adminUserDO ) ); + } + + return list1; + } + + @Override + public AdminUserRespDTO convert4(AdminUserDO bean) { + if ( bean == null ) { + return null; + } + + AdminUserRespDTO adminUserRespDTO = new AdminUserRespDTO(); + + adminUserRespDTO.setId( bean.getId() ); + adminUserRespDTO.setNickname( bean.getNickname() ); + adminUserRespDTO.setStatus( bean.getStatus() ); + adminUserRespDTO.setDeptId( bean.getDeptId() ); + Set set = bean.getPostIds(); + if ( set != null ) { + adminUserRespDTO.setPostIds( new HashSet( set ) ); + } + adminUserRespDTO.setMobile( bean.getMobile() ); + + return adminUserRespDTO; + } + + @Override + public List convertList4(List users) { + if ( users == null ) { + return null; + } + + List list = new ArrayList( users.size() ); + for ( AdminUserDO adminUserDO : users ) { + list.add( convert4( adminUserDO ) ); + } + + return list; + } + + protected Role roleDOToRole(RoleDO roleDO) { + if ( roleDO == null ) { + return null; + } + + Role role = new Role(); + + role.setId( roleDO.getId() ); + role.setName( roleDO.getName() ); + + return role; + } + + protected Post postDOToPost(PostDO postDO) { + if ( postDO == null ) { + return null; + } + + Post post = new Post(); + + post.setId( postDO.getId() ); + post.setName( postDO.getName() ); + + return post; + } + + protected SocialUser socialUserDOToSocialUser(SocialUserDO socialUserDO) { + if ( socialUserDO == null ) { + return null; + } + + SocialUser socialUser = new SocialUser(); + + socialUser.setType( socialUserDO.getType() ); + socialUser.setOpenid( socialUserDO.getOpenid() ); + + return socialUser; + } + + protected UserSimpleRespVO adminUserDOToUserSimpleRespVO(AdminUserDO adminUserDO) { + if ( adminUserDO == null ) { + return null; + } + + UserSimpleRespVO userSimpleRespVO = new UserSimpleRespVO(); + + userSimpleRespVO.setId( adminUserDO.getId() ); + userSimpleRespVO.setNickname( adminUserDO.getNickname() ); + + return userSimpleRespVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/userinfo/UserInfoConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/userinfo/UserInfoConvertImpl.java new file mode 100644 index 0000000..3449d02 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/userinfo/UserInfoConvertImpl.java @@ -0,0 +1,173 @@ +package com.jojubanking.boot.module.system.convert.userinfo; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.app.userinfo.vo.AppUserInfoCreateReqVO; +import com.jojubanking.boot.module.system.controller.app.userinfo.vo.AppUserInfoExcelVO; +import com.jojubanking.boot.module.system.controller.app.userinfo.vo.AppUserInfoRespVO; +import com.jojubanking.boot.module.system.controller.app.userinfo.vo.AppUserInfoUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.userinfo.UserInfoDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class UserInfoConvertImpl implements UserInfoConvert { + + @Override + public UserInfoDO convert(AppUserInfoCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + UserInfoDO userInfoDO = new UserInfoDO(); + + userInfoDO.setOpenid( bean.getOpenid() ); + userInfoDO.setName( bean.getName() ); + userInfoDO.setUser( bean.getUser() ); + userInfoDO.setPassword( bean.getPassword() ); + userInfoDO.setPhone( bean.getPhone() ); + userInfoDO.setIdno( bean.getIdno() ); + userInfoDO.setEmail( bean.getEmail() ); + userInfoDO.setRemark( bean.getRemark() ); + userInfoDO.setHeadurl( bean.getHeadurl() ); + userInfoDO.setBirthdate( bean.getBirthdate() ); + userInfoDO.setNativeplace( bean.getNativeplace() ); + userInfoDO.setCountry( bean.getCountry() ); + userInfoDO.setProvince( bean.getProvince() ); + userInfoDO.setCity( bean.getCity() ); + userInfoDO.setSex( bean.getSex() ); + + return userInfoDO; + } + + @Override + public UserInfoDO convert(AppUserInfoUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + UserInfoDO userInfoDO = new UserInfoDO(); + + userInfoDO.setId( bean.getId() ); + userInfoDO.setOpenid( bean.getOpenid() ); + userInfoDO.setName( bean.getName() ); + userInfoDO.setUser( bean.getUser() ); + userInfoDO.setPassword( bean.getPassword() ); + userInfoDO.setPhone( bean.getPhone() ); + userInfoDO.setIdno( bean.getIdno() ); + userInfoDO.setEmail( bean.getEmail() ); + userInfoDO.setRemark( bean.getRemark() ); + userInfoDO.setHeadurl( bean.getHeadurl() ); + userInfoDO.setBirthdate( bean.getBirthdate() ); + userInfoDO.setNativeplace( bean.getNativeplace() ); + userInfoDO.setCountry( bean.getCountry() ); + userInfoDO.setProvince( bean.getProvince() ); + userInfoDO.setCity( bean.getCity() ); + userInfoDO.setSex( bean.getSex() ); + + return userInfoDO; + } + + @Override + public AppUserInfoRespVO convert(UserInfoDO bean) { + if ( bean == null ) { + return null; + } + + AppUserInfoRespVO appUserInfoRespVO = new AppUserInfoRespVO(); + + appUserInfoRespVO.setOpenid( bean.getOpenid() ); + appUserInfoRespVO.setName( bean.getName() ); + appUserInfoRespVO.setUser( bean.getUser() ); + appUserInfoRespVO.setPassword( bean.getPassword() ); + appUserInfoRespVO.setPhone( bean.getPhone() ); + appUserInfoRespVO.setIdno( bean.getIdno() ); + appUserInfoRespVO.setEmail( bean.getEmail() ); + appUserInfoRespVO.setRemark( bean.getRemark() ); + appUserInfoRespVO.setHeadurl( bean.getHeadurl() ); + appUserInfoRespVO.setBirthdate( bean.getBirthdate() ); + appUserInfoRespVO.setNativeplace( bean.getNativeplace() ); + appUserInfoRespVO.setCountry( bean.getCountry() ); + appUserInfoRespVO.setProvince( bean.getProvince() ); + appUserInfoRespVO.setCity( bean.getCity() ); + appUserInfoRespVO.setSex( bean.getSex() ); + appUserInfoRespVO.setId( bean.getId() ); + appUserInfoRespVO.setCreateTime( bean.getCreateTime() ); + + return appUserInfoRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( UserInfoDO userInfoDO : list ) { + list1.add( convert( userInfoDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( UserInfoDO userInfoDO : list ) { + list1.add( userInfoDOToAppUserInfoExcelVO( userInfoDO ) ); + } + + return list1; + } + + protected AppUserInfoExcelVO userInfoDOToAppUserInfoExcelVO(UserInfoDO userInfoDO) { + if ( userInfoDO == null ) { + return null; + } + + AppUserInfoExcelVO appUserInfoExcelVO = new AppUserInfoExcelVO(); + + appUserInfoExcelVO.setId( userInfoDO.getId() ); + appUserInfoExcelVO.setOpenid( userInfoDO.getOpenid() ); + appUserInfoExcelVO.setName( userInfoDO.getName() ); + appUserInfoExcelVO.setUser( userInfoDO.getUser() ); + appUserInfoExcelVO.setPassword( userInfoDO.getPassword() ); + appUserInfoExcelVO.setPhone( userInfoDO.getPhone() ); + appUserInfoExcelVO.setIdno( userInfoDO.getIdno() ); + appUserInfoExcelVO.setEmail( userInfoDO.getEmail() ); + appUserInfoExcelVO.setRemark( userInfoDO.getRemark() ); + appUserInfoExcelVO.setHeadurl( userInfoDO.getHeadurl() ); + appUserInfoExcelVO.setBirthdate( userInfoDO.getBirthdate() ); + appUserInfoExcelVO.setNativeplace( userInfoDO.getNativeplace() ); + appUserInfoExcelVO.setCountry( userInfoDO.getCountry() ); + appUserInfoExcelVO.setProvince( userInfoDO.getProvince() ); + appUserInfoExcelVO.setCity( userInfoDO.getCity() ); + appUserInfoExcelVO.setSex( userInfoDO.getSex() ); + appUserInfoExcelVO.setCreateTime( userInfoDO.getCreateTime() ); + + return appUserInfoExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/usersxq/UsersXqConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/usersxq/UsersXqConvertImpl.java new file mode 100644 index 0000000..d164142 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/usersxq/UsersXqConvertImpl.java @@ -0,0 +1,165 @@ +package com.jojubanking.boot.module.system.convert.usersxq; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.usersxq.vo.UsersXqCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.usersxq.vo.UsersXqExcelVO; +import com.jojubanking.boot.module.system.controller.admin.usersxq.vo.UsersXqRespVO; +import com.jojubanking.boot.module.system.controller.admin.usersxq.vo.UsersXqUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.usersxq.UsersXqDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class UsersXqConvertImpl implements UsersXqConvert { + + @Override + public UsersXqDO convert(UsersXqCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + UsersXqDO usersXqDO = new UsersXqDO(); + + usersXqDO.setUsername( bean.getUsername() ); + usersXqDO.setPassword( bean.getPassword() ); + usersXqDO.setNickname( bean.getNickname() ); + usersXqDO.setRemark( bean.getRemark() ); + usersXqDO.setDeptId( bean.getDeptId() ); + usersXqDO.setPostIds( bean.getPostIds() ); + usersXqDO.setEmail( bean.getEmail() ); + usersXqDO.setMobile( bean.getMobile() ); + usersXqDO.setSex( bean.getSex() ); + usersXqDO.setAvatar( bean.getAvatar() ); + usersXqDO.setStatus( bean.getStatus() ); + usersXqDO.setLoginIp( bean.getLoginIp() ); + usersXqDO.setLoginDate( bean.getLoginDate() ); + + return usersXqDO; + } + + @Override + public UsersXqDO convert(UsersXqUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + UsersXqDO usersXqDO = new UsersXqDO(); + + usersXqDO.setId( bean.getId() ); + usersXqDO.setUsername( bean.getUsername() ); + usersXqDO.setPassword( bean.getPassword() ); + usersXqDO.setNickname( bean.getNickname() ); + usersXqDO.setRemark( bean.getRemark() ); + usersXqDO.setDeptId( bean.getDeptId() ); + usersXqDO.setPostIds( bean.getPostIds() ); + usersXqDO.setEmail( bean.getEmail() ); + usersXqDO.setMobile( bean.getMobile() ); + usersXqDO.setSex( bean.getSex() ); + usersXqDO.setAvatar( bean.getAvatar() ); + usersXqDO.setStatus( bean.getStatus() ); + usersXqDO.setLoginIp( bean.getLoginIp() ); + usersXqDO.setLoginDate( bean.getLoginDate() ); + + return usersXqDO; + } + + @Override + public UsersXqRespVO convert(UsersXqDO bean) { + if ( bean == null ) { + return null; + } + + UsersXqRespVO usersXqRespVO = new UsersXqRespVO(); + + usersXqRespVO.setUsername( bean.getUsername() ); + usersXqRespVO.setPassword( bean.getPassword() ); + usersXqRespVO.setNickname( bean.getNickname() ); + usersXqRespVO.setRemark( bean.getRemark() ); + usersXqRespVO.setDeptId( bean.getDeptId() ); + usersXqRespVO.setPostIds( bean.getPostIds() ); + usersXqRespVO.setEmail( bean.getEmail() ); + usersXqRespVO.setMobile( bean.getMobile() ); + usersXqRespVO.setSex( bean.getSex() ); + usersXqRespVO.setAvatar( bean.getAvatar() ); + usersXqRespVO.setStatus( bean.getStatus() ); + usersXqRespVO.setLoginIp( bean.getLoginIp() ); + usersXqRespVO.setLoginDate( bean.getLoginDate() ); + usersXqRespVO.setId( bean.getId() ); + usersXqRespVO.setCreateTime( bean.getCreateTime() ); + + return usersXqRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( UsersXqDO usersXqDO : list ) { + list1.add( convert( usersXqDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( UsersXqDO usersXqDO : list ) { + list1.add( usersXqDOToUsersXqExcelVO( usersXqDO ) ); + } + + return list1; + } + + protected UsersXqExcelVO usersXqDOToUsersXqExcelVO(UsersXqDO usersXqDO) { + if ( usersXqDO == null ) { + return null; + } + + UsersXqExcelVO usersXqExcelVO = new UsersXqExcelVO(); + + usersXqExcelVO.setId( usersXqDO.getId() ); + usersXqExcelVO.setUsername( usersXqDO.getUsername() ); + usersXqExcelVO.setPassword( usersXqDO.getPassword() ); + usersXqExcelVO.setNickname( usersXqDO.getNickname() ); + usersXqExcelVO.setRemark( usersXqDO.getRemark() ); + usersXqExcelVO.setDeptId( usersXqDO.getDeptId() ); + usersXqExcelVO.setPostIds( usersXqDO.getPostIds() ); + usersXqExcelVO.setEmail( usersXqDO.getEmail() ); + usersXqExcelVO.setMobile( usersXqDO.getMobile() ); + usersXqExcelVO.setSex( usersXqDO.getSex() ); + usersXqExcelVO.setAvatar( usersXqDO.getAvatar() ); + usersXqExcelVO.setStatus( usersXqDO.getStatus() ); + usersXqExcelVO.setLoginIp( usersXqDO.getLoginIp() ); + usersXqExcelVO.setLoginDate( usersXqDO.getLoginDate() ); + usersXqExcelVO.setCreateTime( usersXqDO.getCreateTime() ); + + return usersXqExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/wq/WqConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/wq/WqConvertImpl.java new file mode 100644 index 0000000..4f0c2a9 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/wq/WqConvertImpl.java @@ -0,0 +1,125 @@ +package com.jojubanking.boot.module.system.convert.wq; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.wq.vo.WqCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.wq.vo.WqExcelVO; +import com.jojubanking.boot.module.system.controller.admin.wq.vo.WqRespVO; +import com.jojubanking.boot.module.system.controller.admin.wq.vo.WqUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.wq.WqDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class WqConvertImpl implements WqConvert { + + @Override + public WqDO convert(WqCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + WqDO wqDO = new WqDO(); + + wqDO.setTitle( bean.getTitle() ); + wqDO.setTypeId( bean.getTypeId() ); + wqDO.setType( bean.getType() ); + + return wqDO; + } + + @Override + public WqDO convert(WqUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + WqDO wqDO = new WqDO(); + + wqDO.setId( bean.getId() ); + wqDO.setTitle( bean.getTitle() ); + wqDO.setTypeId( bean.getTypeId() ); + wqDO.setType( bean.getType() ); + + return wqDO; + } + + @Override + public WqRespVO convert(WqDO bean) { + if ( bean == null ) { + return null; + } + + WqRespVO wqRespVO = new WqRespVO(); + + wqRespVO.setTitle( bean.getTitle() ); + wqRespVO.setTypeId( bean.getTypeId() ); + wqRespVO.setType( bean.getType() ); + wqRespVO.setId( bean.getId() ); + wqRespVO.setCreateTime( bean.getCreateTime() ); + + return wqRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( WqDO wqDO : list ) { + list1.add( convert( wqDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( WqDO wqDO : list ) { + list1.add( wqDOToWqExcelVO( wqDO ) ); + } + + return list1; + } + + protected WqExcelVO wqDOToWqExcelVO(WqDO wqDO) { + if ( wqDO == null ) { + return null; + } + + WqExcelVO wqExcelVO = new WqExcelVO(); + + wqExcelVO.setId( wqDO.getId() ); + wqExcelVO.setTitle( wqDO.getTitle() ); + wqExcelVO.setTypeId( wqDO.getTypeId() ); + wqExcelVO.setType( wqDO.getType() ); + wqExcelVO.setCreateTime( wqDO.getCreateTime() ); + + return wqExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/wqda/WqdaConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/wqda/WqdaConvertImpl.java new file mode 100644 index 0000000..0c293a5 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/wqda/WqdaConvertImpl.java @@ -0,0 +1,145 @@ +package com.jojubanking.boot.module.system.convert.wqda; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.wqda.vo.WqdaCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.wqda.vo.WqdaExcelVO; +import com.jojubanking.boot.module.system.controller.admin.wqda.vo.WqdaRespVO; +import com.jojubanking.boot.module.system.controller.admin.wqda.vo.WqdaUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.wqda.WqdaDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class WqdaConvertImpl implements WqdaConvert { + + @Override + public WqdaDO convert(WqdaCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + WqdaDO wqdaDO = new WqdaDO(); + + wqdaDO.setTypeId( bean.getTypeId() ); + wqdaDO.setQuestionId( bean.getQuestionId() ); + wqdaDO.setQuestionType( bean.getQuestionType() ); + wqdaDO.setQuestionTitle( bean.getQuestionTitle() ); + wqdaDO.setQuestionAnswer( bean.getQuestionAnswer() ); + wqdaDO.setQuestionComment( bean.getQuestionComment() ); + wqdaDO.setUsername( bean.getUsername() ); + wqdaDO.setUsertel( bean.getUsertel() ); + + return wqdaDO; + } + + @Override + public WqdaDO convert(WqdaUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + WqdaDO wqdaDO = new WqdaDO(); + + wqdaDO.setId( bean.getId() ); + wqdaDO.setTypeId( bean.getTypeId() ); + wqdaDO.setQuestionId( bean.getQuestionId() ); + wqdaDO.setQuestionType( bean.getQuestionType() ); + wqdaDO.setQuestionTitle( bean.getQuestionTitle() ); + wqdaDO.setQuestionAnswer( bean.getQuestionAnswer() ); + wqdaDO.setQuestionComment( bean.getQuestionComment() ); + wqdaDO.setUsername( bean.getUsername() ); + wqdaDO.setUsertel( bean.getUsertel() ); + + return wqdaDO; + } + + @Override + public WqdaRespVO convert(WqdaDO bean) { + if ( bean == null ) { + return null; + } + + WqdaRespVO wqdaRespVO = new WqdaRespVO(); + + wqdaRespVO.setTypeId( bean.getTypeId() ); + wqdaRespVO.setQuestionId( bean.getQuestionId() ); + wqdaRespVO.setQuestionType( bean.getQuestionType() ); + wqdaRespVO.setQuestionTitle( bean.getQuestionTitle() ); + wqdaRespVO.setQuestionAnswer( bean.getQuestionAnswer() ); + wqdaRespVO.setQuestionComment( bean.getQuestionComment() ); + wqdaRespVO.setUsername( bean.getUsername() ); + wqdaRespVO.setUsertel( bean.getUsertel() ); + wqdaRespVO.setId( bean.getId() ); + wqdaRespVO.setCreateTime( bean.getCreateTime() ); + + return wqdaRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( WqdaDO wqdaDO : list ) { + list1.add( convert( wqdaDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( WqdaDO wqdaDO : list ) { + list1.add( wqdaDOToWqdaExcelVO( wqdaDO ) ); + } + + return list1; + } + + protected WqdaExcelVO wqdaDOToWqdaExcelVO(WqdaDO wqdaDO) { + if ( wqdaDO == null ) { + return null; + } + + WqdaExcelVO wqdaExcelVO = new WqdaExcelVO(); + + wqdaExcelVO.setId( wqdaDO.getId() ); + wqdaExcelVO.setTypeId( wqdaDO.getTypeId() ); + wqdaExcelVO.setQuestionId( wqdaDO.getQuestionId() ); + wqdaExcelVO.setQuestionType( wqdaDO.getQuestionType() ); + wqdaExcelVO.setQuestionTitle( wqdaDO.getQuestionTitle() ); + wqdaExcelVO.setQuestionAnswer( wqdaDO.getQuestionAnswer() ); + wqdaExcelVO.setQuestionComment( wqdaDO.getQuestionComment() ); + wqdaExcelVO.setUsername( wqdaDO.getUsername() ); + wqdaExcelVO.setUsertel( wqdaDO.getUsertel() ); + wqdaExcelVO.setCreateTime( wqdaDO.getCreateTime() ); + + return wqdaExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/wqdaview/WqdaViewConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/wqdaview/WqdaViewConvertImpl.java new file mode 100644 index 0000000..3a2752e --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/wqdaview/WqdaViewConvertImpl.java @@ -0,0 +1,149 @@ +package com.jojubanking.boot.module.system.convert.wqdaview; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.wqdaview.vo.WqdaViewCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.wqdaview.vo.WqdaViewExcelVO; +import com.jojubanking.boot.module.system.controller.admin.wqdaview.vo.WqdaViewRespVO; +import com.jojubanking.boot.module.system.controller.admin.wqdaview.vo.WqdaViewUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.wqdaview.WqdaViewDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class WqdaViewConvertImpl implements WqdaViewConvert { + + @Override + public WqdaViewDO convert(WqdaViewCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + WqdaViewDO wqdaViewDO = new WqdaViewDO(); + + wqdaViewDO.setTypeId( bean.getTypeId() ); + wqdaViewDO.setQuestionId( bean.getQuestionId() ); + wqdaViewDO.setQuestionType( bean.getQuestionType() ); + wqdaViewDO.setQuestionTitle( bean.getQuestionTitle() ); + wqdaViewDO.setQuestionAnswer( bean.getQuestionAnswer() ); + wqdaViewDO.setQuestionComment( bean.getQuestionComment() ); + wqdaViewDO.setUsername( bean.getUsername() ); + wqdaViewDO.setUsertel( bean.getUsertel() ); + wqdaViewDO.setQuestionLabel( bean.getQuestionLabel() ); + + return wqdaViewDO; + } + + @Override + public WqdaViewDO convert(WqdaViewUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + WqdaViewDO wqdaViewDO = new WqdaViewDO(); + + wqdaViewDO.setId( bean.getId() ); + wqdaViewDO.setTypeId( bean.getTypeId() ); + wqdaViewDO.setQuestionId( bean.getQuestionId() ); + wqdaViewDO.setQuestionType( bean.getQuestionType() ); + wqdaViewDO.setQuestionTitle( bean.getQuestionTitle() ); + wqdaViewDO.setQuestionAnswer( bean.getQuestionAnswer() ); + wqdaViewDO.setQuestionComment( bean.getQuestionComment() ); + wqdaViewDO.setUsername( bean.getUsername() ); + wqdaViewDO.setUsertel( bean.getUsertel() ); + wqdaViewDO.setQuestionLabel( bean.getQuestionLabel() ); + + return wqdaViewDO; + } + + @Override + public WqdaViewRespVO convert(WqdaViewDO bean) { + if ( bean == null ) { + return null; + } + + WqdaViewRespVO wqdaViewRespVO = new WqdaViewRespVO(); + + wqdaViewRespVO.setTypeId( bean.getTypeId() ); + wqdaViewRespVO.setQuestionId( bean.getQuestionId() ); + wqdaViewRespVO.setQuestionType( bean.getQuestionType() ); + wqdaViewRespVO.setQuestionTitle( bean.getQuestionTitle() ); + wqdaViewRespVO.setQuestionAnswer( bean.getQuestionAnswer() ); + wqdaViewRespVO.setQuestionComment( bean.getQuestionComment() ); + wqdaViewRespVO.setUsername( bean.getUsername() ); + wqdaViewRespVO.setUsertel( bean.getUsertel() ); + wqdaViewRespVO.setQuestionLabel( bean.getQuestionLabel() ); + wqdaViewRespVO.setId( bean.getId() ); + wqdaViewRespVO.setCreateTime( bean.getCreateTime() ); + + return wqdaViewRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( WqdaViewDO wqdaViewDO : list ) { + list1.add( convert( wqdaViewDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( WqdaViewDO wqdaViewDO : list ) { + list1.add( wqdaViewDOToWqdaViewExcelVO( wqdaViewDO ) ); + } + + return list1; + } + + protected WqdaViewExcelVO wqdaViewDOToWqdaViewExcelVO(WqdaViewDO wqdaViewDO) { + if ( wqdaViewDO == null ) { + return null; + } + + WqdaViewExcelVO wqdaViewExcelVO = new WqdaViewExcelVO(); + + wqdaViewExcelVO.setId( wqdaViewDO.getId() ); + wqdaViewExcelVO.setTypeId( wqdaViewDO.getTypeId() ); + wqdaViewExcelVO.setQuestionId( wqdaViewDO.getQuestionId() ); + wqdaViewExcelVO.setQuestionType( wqdaViewDO.getQuestionType() ); + wqdaViewExcelVO.setQuestionLabel( wqdaViewDO.getQuestionLabel() ); + wqdaViewExcelVO.setQuestionTitle( wqdaViewDO.getQuestionTitle() ); + wqdaViewExcelVO.setQuestionAnswer( wqdaViewDO.getQuestionAnswer() ); + wqdaViewExcelVO.setQuestionComment( wqdaViewDO.getQuestionComment() ); + wqdaViewExcelVO.setUsername( wqdaViewDO.getUsername() ); + wqdaViewExcelVO.setUsertel( wqdaViewDO.getUsertel() ); + wqdaViewExcelVO.setCreateTime( wqdaViewDO.getCreateTime() ); + + return wqdaViewExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/wqwt/WqwtConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/wqwt/WqwtConvertImpl.java new file mode 100644 index 0000000..a550b64 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/wqwt/WqwtConvertImpl.java @@ -0,0 +1,145 @@ +package com.jojubanking.boot.module.system.convert.wqwt; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.wqwt.vo.WqwtCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.wqwt.vo.WqwtExcelVO; +import com.jojubanking.boot.module.system.controller.admin.wqwt.vo.WqwtRespVO; +import com.jojubanking.boot.module.system.controller.admin.wqwt.vo.WqwtUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.wqwt.WqwtDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class WqwtConvertImpl implements WqwtConvert { + + @Override + public WqwtDO convert(WqwtCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + WqwtDO wqwtDO = new WqwtDO(); + + wqwtDO.setTypeId( bean.getTypeId() ); + wqwtDO.setQuestionId( bean.getQuestionId() ); + wqwtDO.setPid( bean.getPid() ); + wqwtDO.setGradingType( bean.getGradingType() ); + wqwtDO.setQuestionType( bean.getQuestionType() ); + wqwtDO.setQuestionTitle( bean.getQuestionTitle() ); + wqwtDO.setQuestionOpnum( bean.getQuestionOpnum() ); + wqwtDO.setQuestionContent( bean.getQuestionContent() ); + + return wqwtDO; + } + + @Override + public WqwtDO convert(WqwtUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + WqwtDO wqwtDO = new WqwtDO(); + + wqwtDO.setId( bean.getId() ); + wqwtDO.setTypeId( bean.getTypeId() ); + wqwtDO.setQuestionId( bean.getQuestionId() ); + wqwtDO.setPid( bean.getPid() ); + wqwtDO.setGradingType( bean.getGradingType() ); + wqwtDO.setQuestionType( bean.getQuestionType() ); + wqwtDO.setQuestionTitle( bean.getQuestionTitle() ); + wqwtDO.setQuestionOpnum( bean.getQuestionOpnum() ); + wqwtDO.setQuestionContent( bean.getQuestionContent() ); + + return wqwtDO; + } + + @Override + public WqwtRespVO convert(WqwtDO bean) { + if ( bean == null ) { + return null; + } + + WqwtRespVO wqwtRespVO = new WqwtRespVO(); + + wqwtRespVO.setTypeId( bean.getTypeId() ); + wqwtRespVO.setQuestionId( bean.getQuestionId() ); + wqwtRespVO.setPid( bean.getPid() ); + wqwtRespVO.setGradingType( bean.getGradingType() ); + wqwtRespVO.setQuestionType( bean.getQuestionType() ); + wqwtRespVO.setQuestionTitle( bean.getQuestionTitle() ); + wqwtRespVO.setQuestionOpnum( bean.getQuestionOpnum() ); + wqwtRespVO.setQuestionContent( bean.getQuestionContent() ); + wqwtRespVO.setId( bean.getId() ); + wqwtRespVO.setCreateTime( bean.getCreateTime() ); + + return wqwtRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( WqwtDO wqwtDO : list ) { + list1.add( convert( wqwtDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( WqwtDO wqwtDO : list ) { + list1.add( wqwtDOToWqwtExcelVO( wqwtDO ) ); + } + + return list1; + } + + protected WqwtExcelVO wqwtDOToWqwtExcelVO(WqwtDO wqwtDO) { + if ( wqwtDO == null ) { + return null; + } + + WqwtExcelVO wqwtExcelVO = new WqwtExcelVO(); + + wqwtExcelVO.setId( wqwtDO.getId() ); + wqwtExcelVO.setTypeId( wqwtDO.getTypeId() ); + wqwtExcelVO.setQuestionId( wqwtDO.getQuestionId() ); + wqwtExcelVO.setPid( wqwtDO.getPid() ); + wqwtExcelVO.setGradingType( wqwtDO.getGradingType() ); + wqwtExcelVO.setQuestionType( wqwtDO.getQuestionType() ); + wqwtExcelVO.setQuestionTitle( wqwtDO.getQuestionTitle() ); + wqwtExcelVO.setQuestionOpnum( wqwtDO.getQuestionOpnum() ); + wqwtExcelVO.setQuestionContent( wqwtDO.getQuestionContent() ); + wqwtExcelVO.setCreateTime( wqwtDO.getCreateTime() ); + + return wqwtExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/xymain/xyMainConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/xymain/xyMainConvertImpl.java new file mode 100644 index 0000000..3e49f4d --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/xymain/xyMainConvertImpl.java @@ -0,0 +1,222 @@ +package com.jojubanking.boot.module.system.convert.xymain; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainExcelVO; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainPageItemRespVO; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainPageItemRespVO.Dept; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainRespVO; +import com.jojubanking.boot.module.system.controller.admin.xymain.vo.xyMainUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.deptxq.DeptXqDO; +import com.jojubanking.boot.module.system.dal.dataobject.xymain.xyMainDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class xyMainConvertImpl implements xyMainConvert { + + @Override + public xyMainDO convert(xyMainCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + xyMainDO xyMainDO = new xyMainDO(); + + xyMainDO.setBatchno( bean.getBatchno() ); + xyMainDO.setBatchname( bean.getBatchname() ); + xyMainDO.setOpenid( bean.getOpenid() ); + xyMainDO.setDefaultflag( bean.getDefaultflag() ); + xyMainDO.setPatid( bean.getPatid() ); + xyMainDO.setName( bean.getName() ); + xyMainDO.setSex( bean.getSex() ); + xyMainDO.setAge( bean.getAge() ); + xyMainDO.setNationId( bean.getNationId() ); + xyMainDO.setDeptId( bean.getDeptId() ); + xyMainDO.setClassName( bean.getClassName() ); + xyMainDO.setSchoolName( bean.getSchoolName() ); + xyMainDO.setSqName( bean.getSqName() ); + xyMainDO.setJdName( bean.getJdName() ); + xyMainDO.setEmail( bean.getEmail() ); + xyMainDO.setMobile( bean.getMobile() ); + xyMainDO.setRemark( bean.getRemark() ); + xyMainDO.setFeeflag( bean.getFeeflag() ); + xyMainDO.setFeetotal( bean.getFeetotal() ); + xyMainDO.setTjpkgfee( bean.getTjpkgfee() ); + xyMainDO.setTjpkgno( bean.getTjpkgno() ); + xyMainDO.setTjkxfee( bean.getTjkxfee() ); + xyMainDO.setTjorderno( bean.getTjorderno() ); + + return xyMainDO; + } + + @Override + public xyMainPageItemRespVO convert01(xyMainDO bean) { + if ( bean == null ) { + return null; + } + + xyMainPageItemRespVO xyMainPageItemRespVO = new xyMainPageItemRespVO(); + + xyMainPageItemRespVO.setBatchno( bean.getBatchno() ); + xyMainPageItemRespVO.setBatchname( bean.getBatchname() ); + xyMainPageItemRespVO.setOpenid( bean.getOpenid() ); + xyMainPageItemRespVO.setDefaultflag( bean.getDefaultflag() ); + xyMainPageItemRespVO.setPatid( bean.getPatid() ); + xyMainPageItemRespVO.setName( bean.getName() ); + xyMainPageItemRespVO.setSex( bean.getSex() ); + xyMainPageItemRespVO.setAge( bean.getAge() ); + xyMainPageItemRespVO.setNationId( bean.getNationId() ); + xyMainPageItemRespVO.setDeptId( bean.getDeptId() ); + xyMainPageItemRespVO.setClassName( bean.getClassName() ); + xyMainPageItemRespVO.setSchoolName( bean.getSchoolName() ); + xyMainPageItemRespVO.setSqName( bean.getSqName() ); + xyMainPageItemRespVO.setJdName( bean.getJdName() ); + xyMainPageItemRespVO.setEmail( bean.getEmail() ); + xyMainPageItemRespVO.setMobile( bean.getMobile() ); + xyMainPageItemRespVO.setRemark( bean.getRemark() ); + xyMainPageItemRespVO.setFeeflag( bean.getFeeflag() ); + xyMainPageItemRespVO.setFeetotal( bean.getFeetotal() ); + xyMainPageItemRespVO.setTjpkgfee( bean.getTjpkgfee() ); + xyMainPageItemRespVO.setTjpkgno( bean.getTjpkgno() ); + xyMainPageItemRespVO.setTjkxfee( bean.getTjkxfee() ); + xyMainPageItemRespVO.setTjorderno( bean.getTjorderno() ); + xyMainPageItemRespVO.setId( bean.getId() ); + xyMainPageItemRespVO.setCreateTime( bean.getCreateTime() ); + + return xyMainPageItemRespVO; + } + + @Override + public Dept convert(DeptXqDO bean) { + if ( bean == null ) { + return null; + } + + Dept dept = new Dept(); + + dept.setId( bean.getId() ); + dept.setName( bean.getName() ); + + return dept; + } + + @Override + public xyMainDO convert(xyMainUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + xyMainDO xyMainDO = new xyMainDO(); + + xyMainDO.setId( bean.getId() ); + xyMainDO.setBatchno( bean.getBatchno() ); + xyMainDO.setBatchname( bean.getBatchname() ); + xyMainDO.setOpenid( bean.getOpenid() ); + xyMainDO.setDefaultflag( bean.getDefaultflag() ); + xyMainDO.setPatid( bean.getPatid() ); + xyMainDO.setName( bean.getName() ); + xyMainDO.setSex( bean.getSex() ); + xyMainDO.setAge( bean.getAge() ); + xyMainDO.setNationId( bean.getNationId() ); + xyMainDO.setDeptId( bean.getDeptId() ); + xyMainDO.setClassName( bean.getClassName() ); + xyMainDO.setSchoolName( bean.getSchoolName() ); + xyMainDO.setSqName( bean.getSqName() ); + xyMainDO.setJdName( bean.getJdName() ); + xyMainDO.setEmail( bean.getEmail() ); + xyMainDO.setMobile( bean.getMobile() ); + xyMainDO.setRemark( bean.getRemark() ); + xyMainDO.setFeeflag( bean.getFeeflag() ); + xyMainDO.setFeetotal( bean.getFeetotal() ); + xyMainDO.setTjpkgfee( bean.getTjpkgfee() ); + xyMainDO.setTjpkgno( bean.getTjpkgno() ); + xyMainDO.setTjkxfee( bean.getTjkxfee() ); + xyMainDO.setTjorderno( bean.getTjorderno() ); + + return xyMainDO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( xyMainDO xyMainDO : list ) { + list1.add( convert01( xyMainDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( xyMainDO xyMainDO : list ) { + list1.add( xyMainDOToxyMainExcelVO( xyMainDO ) ); + } + + return list1; + } + + protected xyMainExcelVO xyMainDOToxyMainExcelVO(xyMainDO xyMainDO) { + if ( xyMainDO == null ) { + return null; + } + + xyMainExcelVO xyMainExcelVO = new xyMainExcelVO(); + + xyMainExcelVO.setId( xyMainDO.getId() ); + xyMainExcelVO.setBatchno( xyMainDO.getBatchno() ); + xyMainExcelVO.setBatchname( xyMainDO.getBatchname() ); + xyMainExcelVO.setOpenid( xyMainDO.getOpenid() ); + xyMainExcelVO.setDefaultflag( xyMainDO.getDefaultflag() ); + xyMainExcelVO.setPatid( xyMainDO.getPatid() ); + xyMainExcelVO.setSchoolName( xyMainDO.getSchoolName() ); + xyMainExcelVO.setClassName( xyMainDO.getClassName() ); + xyMainExcelVO.setName( xyMainDO.getName() ); + xyMainExcelVO.setSex( xyMainDO.getSex() ); + xyMainExcelVO.setAge( xyMainDO.getAge() ); + xyMainExcelVO.setNationId( xyMainDO.getNationId() ); + xyMainExcelVO.setDeptId( xyMainDO.getDeptId() ); + xyMainExcelVO.setSqName( xyMainDO.getSqName() ); + xyMainExcelVO.setJdName( xyMainDO.getJdName() ); + xyMainExcelVO.setEmail( xyMainDO.getEmail() ); + xyMainExcelVO.setMobile( xyMainDO.getMobile() ); + xyMainExcelVO.setRemark( xyMainDO.getRemark() ); + xyMainExcelVO.setFeeflag( xyMainDO.getFeeflag() ); + xyMainExcelVO.setFeetotal( xyMainDO.getFeetotal() ); + xyMainExcelVO.setTjpkgno( xyMainDO.getTjpkgno() ); + xyMainExcelVO.setTjpkgfee( xyMainDO.getTjpkgfee() ); + xyMainExcelVO.setTjkxfee( xyMainDO.getTjkxfee() ); + xyMainExcelVO.setTjorderno( xyMainDO.getTjorderno() ); + xyMainExcelVO.setCreateTime( xyMainDO.getCreateTime() ); + + return xyMainExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/xyrw/XyrwConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/xyrw/XyrwConvertImpl.java new file mode 100644 index 0000000..92c1dc3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/xyrw/XyrwConvertImpl.java @@ -0,0 +1,129 @@ +package com.jojubanking.boot.module.system.convert.xyrw; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.xyrw.vo.XyrwCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.xyrw.vo.XyrwExcelVO; +import com.jojubanking.boot.module.system.controller.admin.xyrw.vo.XyrwRespVO; +import com.jojubanking.boot.module.system.controller.admin.xyrw.vo.XyrwUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.xyrw.XyrwDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:09+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class XyrwConvertImpl implements XyrwConvert { + + @Override + public XyrwDO convert(XyrwCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + XyrwDO xyrwDO = new XyrwDO(); + + xyrwDO.setBatchno( bean.getBatchno() ); + xyrwDO.setBatchName( bean.getBatchName() ); + xyrwDO.setBatchStatus( bean.getBatchStatus() ); + xyrwDO.setRemark( bean.getRemark() ); + + return xyrwDO; + } + + @Override + public XyrwDO convert(XyrwUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + XyrwDO xyrwDO = new XyrwDO(); + + xyrwDO.setId( bean.getId() ); + xyrwDO.setBatchno( bean.getBatchno() ); + xyrwDO.setBatchName( bean.getBatchName() ); + xyrwDO.setBatchStatus( bean.getBatchStatus() ); + xyrwDO.setRemark( bean.getRemark() ); + + return xyrwDO; + } + + @Override + public XyrwRespVO convert(XyrwDO bean) { + if ( bean == null ) { + return null; + } + + XyrwRespVO xyrwRespVO = new XyrwRespVO(); + + xyrwRespVO.setBatchno( bean.getBatchno() ); + xyrwRespVO.setBatchName( bean.getBatchName() ); + xyrwRespVO.setBatchStatus( bean.getBatchStatus() ); + xyrwRespVO.setRemark( bean.getRemark() ); + xyrwRespVO.setId( bean.getId() ); + xyrwRespVO.setCreateTime( bean.getCreateTime() ); + + return xyrwRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( XyrwDO xyrwDO : list ) { + list1.add( convert( xyrwDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( XyrwDO xyrwDO : list ) { + list1.add( xyrwDOToXyrwExcelVO( xyrwDO ) ); + } + + return list1; + } + + protected XyrwExcelVO xyrwDOToXyrwExcelVO(XyrwDO xyrwDO) { + if ( xyrwDO == null ) { + return null; + } + + XyrwExcelVO xyrwExcelVO = new XyrwExcelVO(); + + xyrwExcelVO.setId( xyrwDO.getId() ); + xyrwExcelVO.setBatchno( xyrwDO.getBatchno() ); + xyrwExcelVO.setBatchName( xyrwDO.getBatchName() ); + xyrwExcelVO.setBatchStatus( xyrwDO.getBatchStatus() ); + xyrwExcelVO.setRemark( xyrwDO.getRemark() ); + xyrwExcelVO.setCreateTime( xyrwDO.getCreateTime() ); + + return xyrwExcelVO; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/xytjjg/XytjjgConvertImpl.java b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/xytjjg/XytjjgConvertImpl.java new file mode 100644 index 0000000..cd975b3 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/generated-sources/annotations/com/jojubanking/boot/module/system/convert/xytjjg/XytjjgConvertImpl.java @@ -0,0 +1,160 @@ +package com.jojubanking.boot.module.system.convert.xytjjg; + +import com.jojubanking.boot.framework.common.pojo.PageResult; +import com.jojubanking.boot.module.system.controller.admin.xytjjg.vo.XytjjgCreateReqVO; +import com.jojubanking.boot.module.system.controller.admin.xytjjg.vo.XytjjgExcelVO; +import com.jojubanking.boot.module.system.controller.admin.xytjjg.vo.XytjjgHisItems; +import com.jojubanking.boot.module.system.controller.admin.xytjjg.vo.XytjjgRespVO; +import com.jojubanking.boot.module.system.controller.admin.xytjjg.vo.XytjjgUpdateReqVO; +import com.jojubanking.boot.module.system.dal.dataobject.xytjjg.XytjjgDO; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2025-12-05T11:32:08+0800", + comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_201 (Oracle Corporation)" +) +public class XytjjgConvertImpl implements XytjjgConvert { + + @Override + public XytjjgDO convert(XytjjgCreateReqVO bean) { + if ( bean == null ) { + return null; + } + + XytjjgDO xytjjgDO = new XytjjgDO(); + + xytjjgDO.setItemno( bean.getItemno() ); + xytjjgDO.setItemname( bean.getItemname() ); + xytjjgDO.setItemprice( bean.getItemprice() ); + xytjjgDO.setItemflag( bean.getItemflag() ); + + return xytjjgDO; + } + + @Override + public XytjjgDO convert(XytjjgUpdateReqVO bean) { + if ( bean == null ) { + return null; + } + + XytjjgDO xytjjgDO = new XytjjgDO(); + + xytjjgDO.setId( bean.getId() ); + xytjjgDO.setItemno( bean.getItemno() ); + xytjjgDO.setItemname( bean.getItemname() ); + xytjjgDO.setItemprice( bean.getItemprice() ); + xytjjgDO.setItemflag( bean.getItemflag() ); + + return xytjjgDO; + } + + @Override + public XytjjgRespVO convert(XytjjgDO bean) { + if ( bean == null ) { + return null; + } + + XytjjgRespVO xytjjgRespVO = new XytjjgRespVO(); + + xytjjgRespVO.setItemno( bean.getItemno() ); + xytjjgRespVO.setItemname( bean.getItemname() ); + xytjjgRespVO.setItemprice( bean.getItemprice() ); + xytjjgRespVO.setItemflag( bean.getItemflag() ); + xytjjgRespVO.setId( bean.getId() ); + xytjjgRespVO.setCreateTime( bean.getCreateTime() ); + + return xytjjgRespVO; + } + + @Override + public List convertList(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( XytjjgDO xytjjgDO : list ) { + list1.add( convert( xytjjgDO ) ); + } + + return list1; + } + + @Override + public PageResult convertPage(PageResult page) { + if ( page == null ) { + return null; + } + + PageResult pageResult = new PageResult(); + + pageResult.setList( convertList( page.getList() ) ); + pageResult.setTotal( page.getTotal() ); + + return pageResult; + } + + @Override + public List convertList02(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( XytjjgDO xytjjgDO : list ) { + list1.add( xytjjgDOToXytjjgExcelVO( xytjjgDO ) ); + } + + return list1; + } + + @Override + public List convertList03(List list) { + if ( list == null ) { + return null; + } + + List list1 = new ArrayList( list.size() ); + for ( XytjjgDO xytjjgDO : list ) { + list1.add( xytjjgDOToXytjjgHisItems( xytjjgDO ) ); + } + + return list1; + } + + protected XytjjgExcelVO xytjjgDOToXytjjgExcelVO(XytjjgDO xytjjgDO) { + if ( xytjjgDO == null ) { + return null; + } + + XytjjgExcelVO xytjjgExcelVO = new XytjjgExcelVO(); + + xytjjgExcelVO.setId( xytjjgDO.getId() ); + xytjjgExcelVO.setItemno( xytjjgDO.getItemno() ); + xytjjgExcelVO.setItemname( xytjjgDO.getItemname() ); + xytjjgExcelVO.setItemprice( xytjjgDO.getItemprice() ); + xytjjgExcelVO.setItemflag( xytjjgDO.getItemflag() ); + xytjjgExcelVO.setCreateTime( xytjjgDO.getCreateTime() ); + + return xytjjgExcelVO; + } + + protected XytjjgHisItems xytjjgDOToXytjjgHisItems(XytjjgDO xytjjgDO) { + if ( xytjjgDO == null ) { + return null; + } + + XytjjgHisItems xytjjgHisItems = new XytjjgHisItems(); + + xytjjgHisItems.setItemno( xytjjgDO.getItemno() ); + xytjjgHisItems.setItemname( xytjjgDO.getItemname() ); + xytjjgHisItems.setItemprice( xytjjgDO.getItemprice() ); + xytjjgHisItems.setItemflag( xytjjgDO.getItemflag() ); + xytjjgHisItems.setCreateTime( xytjjgDO.getCreateTime() ); + + return xytjjgHisItems; + } +} diff --git a/joju-module-system/joju-module-system-biz/target/joju-module-system-biz-2.0.0-beta.jar b/joju-module-system/joju-module-system-biz/target/joju-module-system-biz-2.0.0-beta.jar new file mode 100644 index 0000000..90ff1fd Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/joju-module-system-biz-2.0.0-beta.jar differ diff --git a/joju-module-system/joju-module-system-biz/target/maven-archiver/pom.properties b/joju-module-system/joju-module-system-biz/target/maven-archiver/pom.properties new file mode 100644 index 0000000..766e497 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 02 13:28:36 CST 2025 +version=2.0.0-beta +groupId=com.jojubanking.boot +artifactId=joju-module-system-biz diff --git a/joju-module-system/joju-module-system-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/joju-module-system/joju-module-system-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..3b340dc --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,977 @@ +com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\usecount\UseCountController.class +com\jojubanking\boot\module\system\dal\dataobject\sms\SmsChannelDO.class +com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8ExcelVO.class +com\jojubanking\boot\module\system\dal\mysql\deptxq\DeptXqMapper.class +com\jojubanking\boot\module\system\WebLog.class +com\jojubanking\boot\module\system\dal\dataobject\sensitiveword\SensitiveWordDO$SensitiveWordDOBuilder.class +com\jojubanking\boot\module\system\convert\carousel\CarouselConvertImpl.class +com\jojubanking\boot\module\system\service\mzjf\MzjfService.class +com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingUpdateReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\doctor\DoctorDO$DoctorDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\wq\vo\WqPageReqVO.class +com\jojubanking\boot\module\system\convert\auth\AuthGzConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\menu\MenuListReqVO.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\DeptXqtjBaseVO.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\FeeListVO.class +com\jojubanking\boot\module\system\service\reserve8\Reserve8ServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainPageItemRespVO$Dept.class +com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoExcelVO.class +com\jojubanking\boot\module\system\controller\admin\sms\SmsChannelController.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentExcelVO.class +com\jojubanking\boot\module\system\controller\admin\sensitiveword\SensitiveWordController.class +com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\log\SmsLogPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingPageReqVO.class +com\jojubanking\boot\module\system\service\permission\PermissionService.class +com\jojubanking\boot\module\system\mq\consumer\permission\MenuRefreshConsumer.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\menu\MenuUpdateReqVO.class +com\jojubanking\boot\module\system\service\label\LabelService.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserImportRespVO.class +com\jojubanking\boot\module\system\controller\admin\item\vo\ItemPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthSocialLoginReqVO.class +com\jojubanking\boot\module\system\util\xytj\IDCardParser.class +com\jojubanking\boot\module\system\controller\admin\information\vo\InformationCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgUpdateReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\user\AdminUserDO.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2CodeServiceImpl.class +com\jojubanking\boot\module\system\framework\captcha\config\CaptchaProperties.class +com\jojubanking\boot\module\system\convert\sms\SmsChannelConvert.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentImportRespVO.class +com\jojubanking\boot\module\system\api\permission\PermissionApiImpl.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserUpdatePasswordReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\item\ItemDO.class +com\jojubanking\boot\module\system\dal\mysql\permission\UserRoleMapper.class +com\jojubanking\boot\module\system\dal\dataobject\userinfo\UserInfoDO.class +com\jojubanking\boot\module\system\controller\admin\oauth2\OAuth2ClientController.class +com\jojubanking\boot\module\system\controller\admin\common\vo\CaptchaImageRespVO$CaptchaImageRespVOBuilder.class +com\jojubanking\boot\module\system\convert\order\OrderConvert.class +com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalPageReqVO.class +com\jojubanking\boot\module\system\service\childitem\ChilditemServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\channel\SmsChannelPageReqVO.class +com\jojubanking\boot\module\system\service\logger\LoginLogServiceImpl.class +com\jojubanking\boot\module\system\dal\mysql\carousel\CarouselMapper.class +com\jojubanking\boot\module\system\convert\wq\WqConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\socail\vo\SocialUserBindReqVO$SocialUserBindReqVOBuilder.class +com\jojubanking\boot\module\system\framework\sms\SmsCodeProperties.class +com\jojubanking\boot\module\system\controller\admin\mzjf\MzjfController.class +com\jojubanking\boot\module\system\service\hospital\HospitalServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostExcelVO.class +com\jojubanking\boot\module\system\convert\permission\MenuConvert.class +com\jojubanking\boot\module\system\dal\dataobject\sms\SmsLogDO$SmsLogDOBuilder.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2ApproveServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserExcelVO.class +com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoRespVO.class +com\jojubanking\boot\module\system\dal\mysql\item\ItemMapper.class +com\jojubanking\boot\module\system\mq\consumer\permission\UserRoleRefreshConsumer.class +com\jojubanking\boot\module\system\controller\admin\wqdaview\WqdaViewController.class +com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthLoginRespVO.class +com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\wq\vo\WqUpdateReqVO.class +com\jojubanking\boot\module\system\controller\app\carousel\AppCarouselController.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserPageItemRespVO.class +com\jojubanking\boot\module\system\dal\dataobject\usecount\UseCountToDO.class +com\jojubanking\boot\module\system\dal\mysql\childitem\ChilditemMapper.class +com\jojubanking\boot\module\system\service\permission\PermissionServiceImpl$2.class +com\jojubanking\boot\module\system\dal\mysql\xytjjg\XytjjgMapper.class +com\jojubanking\boot\module\system\dal\mysql\reserve8\Reserve8Mapper.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserRespVO.class +com\jojubanking\boot\module\system\service\xyrw\XyrwServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\user\vo\profile\UserProfileUpdatePasswordReqVO.class +com\jojubanking\boot\module\system\convert\mzjf\MzjfConvertImpl.class +com\jojubanking\boot\module\system\dal\dataobject\refundapply\RefundApplyDO.class +com\jojubanking\boot\module\system\job\UpdatePriceDaily.class +com\jojubanking\boot\module\system\service\sms\SmsLogServiceImpl.class +com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoBaseVO.class +com\jojubanking\boot\module\system\dal\mysql\sms\SmsLogMapper.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\channel\SmsChannelRespVO.class +com\jojubanking\boot\module\system\dal\dataobject\childitem\ChilditemDO$ChilditemDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfExportReqVO.class +com\jojubanking\boot\module\system\service\permission\MenuServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\order\OrderController.class +com\jojubanking\boot\module\system\util\xytj\XmlUtil.class +com\jojubanking\boot\module\system\controller\admin\user\vo\profile\UserProfileRespVO$SocialUser.class +com\jojubanking\boot\module\system\dal\dataobject\permission\RoleMenuDO.class +com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwBaseVO.class +com\jojubanking\boot\module\system\controller\admin\xytjjg\XytjjgController.class +com\jojubanking\boot\module\system\convert\user\UserConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleCreateReqVO.class +com\jojubanking\boot\module\system\mq\consumer\sensitiveword\SensitiveWordRefreshConsumer.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\AppDeptInfoController.class +com\jojubanking\boot\module\system\dal\dataobject\kstype\KsTypeDO.class +com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\logger\vo\operatelog\OperateLogExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselExcelVO.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\dept\DeptUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentBaseVO.class +com\jojubanking\boot\module\system\convert\dept\DeptConvert.class +com\jojubanking\boot\module\system\controller\app\dict\AppDictDataController.class +com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodeExcelVO.class +com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewRespVO.class +com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqUpdateReqVO.class +com\jojubanking\boot\module\system\dal\mysql\doctor\DoctorMapper.class +com\jojubanking\boot\module\system\dal\dataobject\label\LabelDO.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\deptxq\DeptXqController.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentPageItemRespVO.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgExcelVO.class +com\jojubanking\boot\module\system\dal\dataobject\doctor\DoctorDO.class +com\jojubanking\boot\module\system\mq\producer\permission\MenuProducer.class +com\jojubanking\boot\module\system\mq\message\permission\MenuRefreshMessage.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\FeeInfoVO.class +com\jojubanking\boot\module\system\dal\dataobject\wqdaview\WqdaViewDO.class +com\jojubanking\boot\module\system\controller\admin\dzquestion\DzQuestionController.class +com\jojubanking\boot\module\system\controller\admin\label\vo\LabelUpdateReqVO.class +com\jojubanking\boot\module\system\convert\dict\DictDataConvert.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserPageItemRespVO$Dept.class +com\jojubanking\boot\module\system\api\sensitiveword\SensitiveWordApiImpl.class +com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewExcelVO.class +com\jojubanking\boot\module\system\dal\mysql\sms\SmsTemplateMapper.class +com\jojubanking\boot\module\system\dal\dataobject\wqda\WqdaDO$WqdaDOBuilder.class +com\jojubanking\boot\module\system\service\mzdm\MzdmServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmExcelVO.class +com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\dept\DeptSimpleRespVO.class +com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\channel\SmsChannelBaseVO.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateCreateReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\dept\UserPostDO.class +com\jojubanking\boot\module\system\controller\admin\dict\DictTypeController.class +com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingExcelVO.class +com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordBaseVO.class +com\jojubanking\boot\module\system\dal\dataobject\wqdaview\WqdaViewDO$WqdaViewDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthPermissionInfoRespVO.class +com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorExcelVO.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentRespVO.class +com\jojubanking\boot\module\system\dal\dataobject\logger\OperateLogDO.class +com\jojubanking\boot\module\system\api\logger\OperateLogApiImpl.class +com\jojubanking\boot\module\system\dal\mysql\logger\LoginLogMapper.class +com\jojubanking\boot\module\system\dal\redis\RedisKeyConstants.class +com\jojubanking\boot\module\system\controller\admin\notice\vo\NoticeBaseVO.class +com\jojubanking\boot\module\system\controller\admin\information\vo\InformationUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewBaseVO.class +com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\menu\MenuCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\oauth2\OAuth2OpenController$1.class +com\jojubanking\boot\module\system\service\sms\SmsTemplateServiceImpl.class +com\jojubanking\boot\module\system\dal\mysql\notice\NoticeMapper.class +com\jojubanking\boot\module\system\util\xytj\VeDate.class +com\jojubanking\boot\module\system\dal\dataobject\student\StudentDO.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataSimpleRespVO.class +com\jojubanking\boot\module\system\mq\consumer\permission\RoleMenuRefreshConsumer.class +com\jojubanking\boot\module\system\dal\dataobject\wqda\WqdaDOx.class +com\jojubanking\boot\module\system\controller\admin\socail\vo\SocialUserUnbindReqVO$SocialUserUnbindReqVOBuilder.class +com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwRespVO.class +com\jojubanking\boot\module\system\controller\admin\socail\vo\SocialUserBindReqVO.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2GrantServiceImpl.class +com\jojubanking\boot\module\system\dal\dataobject\dict\DictTypeDO$DictTypeDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaCreateReqVO.class +com\jojubanking\boot\module\system\service\orderview\OrderViewService.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypePageReqVO.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\token\OAuth2AccessTokenPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\wq\vo\WqBaseVO.class +com\jojubanking\boot\module\system\service\building\BuildingService.class +com\jojubanking\boot\module\system\service\logger\OperateLogServiceImpl.class +com\jojubanking\boot\module\system\dal\mysql\xytjjg\XytjjgBatchInsertMapper.class +com\jojubanking\boot\module\system\service\wq\WqService.class +com\jojubanking\boot\module\system\dal\mysql\tenant\TenantMapper.class +com\jojubanking\boot\module\system\controller\admin\notice\vo\NoticeRespVO.class +com\jojubanking\boot\module\system\dal\dataobject\dept\PostDO.class +com\jojubanking\boot\module\system\controller\admin\wq\vo\WqExcelVO.class +com\jojubanking\boot\module\system\convert\student\StudentConvertImpl.class +com\jojubanking\boot\module\system\convert\reserve8\Reserve8Convert.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserUpdateStatusReqVO.class +com\jojubanking\boot\module\system\convert\wqda\WqdaConvertImpl.class +com\jojubanking\boot\module\system\service\authgz\GzAuthServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeUpdateReqVO.class +com\jojubanking\boot\module\system\convert\wqdaview\WqdaViewConvertImpl.class +com\jojubanking\boot\module\system\dal\dataobject\tenant\TenantDO.class +com\jojubanking\boot\module\system\controller\admin\oauth2\OAuth2OpenController.class +com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwExportReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\usecount\UseCountDO.class +com\jojubanking\boot\module\system\dal\mysql\errorcode\ErrorCodeMapper.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\dept\DeptCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\order\vo\OrderPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\logger\vo\loginlog\LoginLogPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\permission\PermissionAssignRoleMenuReqVO.class +com\jojubanking\boot\module\system\convert\sms\SmsTemplateConvert.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2ApproveService.class +com\jojubanking\boot\module\system\convert\auth\AuthGzConvert.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplatePageReqVO.class +com\jojubanking\boot\module\system\dal\mysql\sms\SmsCodeMapper.class +com\jojubanking\boot\module\system\convert\dept\DeptConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainExportReqVO.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\FeeInfoDetailVO.class +com\jojubanking\boot\module\system\dal\dataobject\carousel\CarouselDO.class +com\jojubanking\boot\module\system\dal\dataobject\sms\SmsTemplateDO.class +com\jojubanking\boot\module\system\dal\dataobject\wqda\WqdaDO.class +com\jojubanking\boot\module\system\framework\sms\SmsCodeConfiguration.class +com\jojubanking\boot\module\system\service\dict\DictDataServiceImpl.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2GrantService.class +com\jojubanking\boot\module\system\dal\dataobject\deptxq\DeptXqDO.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantCreateReqVO.class +com\jojubanking\boot\module\system\service\information\InformationServiceImpl.class +com\jojubanking\boot\module\system\convert\dict\DictDataConvertImpl.class +com\jojubanking\boot\module\system\service\member\MemberService.class +com\jojubanking\boot\module\system\convert\deptxq\DeptXqConvertImpl.class +com\jojubanking\boot\module\system\dal\dataobject\refundapply\RefundApplyDO$RefundApplyDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\wq\vo\WqRespVO.class +com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\open\OAuth2OpenCheckTokenRespVO.class +com\jojubanking\boot\module\system\service\student\StudentService.class +com\jojubanking\boot\module\system\dal\dataobject\tenant\TenantPackageDO$TenantPackageDOBuilder.class +com\jojubanking\boot\module\system\api\sms\SmsCodeApiImpl.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\permission\PermissionAssignRoleDataScopeReqVO.class +com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoUpdateReqVO.class +com\jojubanking\boot\module\system\convert\mzdm\MzdmConvertImpl.class +com\jojubanking\boot\module\system\service\member\MemberServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordRespVO.class +com\jojubanking\boot\module\system\controller\admin\information\vo\InformationPageReqVO.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\xyMainOrderVO.class +com\jojubanking\boot\module\system\dal\dataobject\ksinfo\KsInfoDO.class +com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmCreateReqVO.class +com\jojubanking\boot\module\system\dal\mysql\wqwt\WqwtMapper.class +com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountCreateReqVO.class +com\jojubanking\boot\module\system\service\building\BuildingServiceImpl.class +com\jojubanking\boot\module\system\dal\mysql\userinfo\UserInfoMapper.class +com\jojubanking\boot\module\system\service\mzdm\MzdmService.class +com\jojubanking\boot\module\system\dal\mysql\xymain\xyMainMapper.class +com\jojubanking\boot\module\system\mq\producer\sensitiveword\SensitiveWordProducer.class +com\jojubanking\boot\module\system\controller\admin\information\vo\InformationBaseVO.class +com\jojubanking\boot\module\system\service\label\LabelServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\open\OAuth2OpenAccessTokenRespVO.class +com\jojubanking\boot\module\system\convert\xyrw\XyrwConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmBaseVO.class +com\jojubanking\boot\module\system\framework\datapermission\config\DataPermissionConfiguration.class +com\jojubanking\boot\module\system\dal\dataobject\orderview\OrderViewDO.class +com\jojubanking\boot\module\system\dal\mysql\permission\RoleMenuMapper$BatchInsertMapper.class +com\jojubanking\boot\module\system\convert\usersxq\UsersXqConvert.class +com\jojubanking\boot\module\system\service\userinfo\UserInfoService.class +com\jojubanking\boot\module\system\service\authgz\GzAuthService.class +com\jojubanking\boot\module\system\controller\app\auth\AppAuthController.class +com\jojubanking\boot\module\system\controller\app\auth\vo\AppAuthSocialLoginReqVO.class +com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgPageReqVO.class +com\jojubanking\boot\module\system\convert\dzquestion\DzQuestionConvert.class +com\jojubanking\boot\module\system\controller\admin\label\vo\LabelRespVO.class +com\jojubanking\boot\module\system\dal\mysql\refundapply\RefundApplyMapper.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2CodeService.class +com\jojubanking\boot\module\system\controller\admin\user\vo\profile\UserProfileRespVO$Post.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqPageReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\social\SocialUserBindDO.class +com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtExportReqVO.class +com\jojubanking\boot\module\system\service\wqdaview\WqdaViewService.class +com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtPageReqVO.class +com\jojubanking\boot\module\system\service\wq\WqServiceImpl.class +com\jojubanking\boot\module\system\convert\dept\PostConvertImpl.class +com\jojubanking\boot\module\system\mq\producer\sms\SmsProducer.class +com\jojubanking\boot\module\system\mq\consumer\dept\DeptRefreshConsumer.class +com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainCreateReqVO.class +com\jojubanking\boot\module\system\service\userinfo\UserInfoServiceImpl.class +com\jojubanking\boot\module\system\mq\message\permission\UserRoleRefreshMessage.class +com\jojubanking\boot\module\system\convert\sms\SmsLogConvertImpl.class +com\jojubanking\boot\module\system\service\wqwt\WqwtService.class +com\jojubanking\boot\module\system\convert\oauth2\OAuth2OpenConvert.class +com\jojubanking\boot\module\system\dal\mysql\oauth2\OAuth2AccessTokenMapper.class +com\jojubanking\boot\module\system\service\deptxq\DeptXqServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\dept\DeptController.class +com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoRespVO.class +com\jojubanking\boot\module\system\convert\usecount\UseCountConvert.class +com\jojubanking\boot\module\system\service\orderview\OrderViewServiceImpl.class +com\jojubanking\boot\module\system\service\refundapply\RefundApplyService.class +com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionRespVO.class +com\jojubanking\boot\module\system\dal\mysql\oauth2\OAuth2ApproveMapper.class +com\jojubanking\boot\module\system\controller\admin\mzdm\MzdmController.class +com\jojubanking\boot\module\system\service\dzquestion\DzQuestionService.class +com\jojubanking\boot\module\system\service\wqwt\WqwtServiceImpl.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2ClientService.class +com\jojubanking\boot\module\system\controller\admin\dict\DictDataController.class +com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalUpdateReqVO.class +com\jojubanking\boot\module\system\convert\usersxq\UsersXqConvertImpl.class +com\jojubanking\boot\module\system\service\permission\PermissionServiceImpl$3.class +com\jojubanking\boot\module\system\service\kstype\KsTypeService.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptPageReqVO.class +com\jojubanking\boot\module\system\service\sms\SmsLogService.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\packages\TenantPackageRespVO.class +com\jojubanking\boot\module\system\controller\admin\user\vo\profile\UserProfileRespVO$Dept.class +com\jojubanking\boot\module\system\convert\notice\NoticeConvert.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostExportReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\dzquestion\DzQuestionDO$DzQuestionDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8CreateReqVO.class +com\jojubanking\boot\module\system\dal\mysql\usersxq\UsersXqMapper.class +com\jojubanking\boot\module\system\service\usersxq\UsersXqService.class +com\jojubanking\boot\module\system\dal\mysql\sms\SmsChannelMapper.class +com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtExcelVO.class +com\jojubanking\boot\module\system\convert\xyrw\XyrwConvert.class +com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaExportReqVO.class +com\jojubanking\boot\module\system\convert\tenant\TenantPackageConvert.class +com\jojubanking\boot\module\system\controller\admin\user\vo\profile\UserProfileRespVO$Role.class +com\jojubanking\boot\module\system\service\wqda\WqdaService.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtRespVO.class +com\jojubanking\boot\module\system\service\user\AdminUserServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselBaseVO.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\client\OAuth2ClientUpdateReqVO.class +com\jojubanking\boot\module\system\convert\userinfo\UserInfoConvertImpl.class +com\jojubanking\boot\module\system\mq\producer\auth\OAuth2ClientProducer.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptBaseVO.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentPageReqVO.class +com\jojubanking\boot\module\system\convert\auth\OAuth2ClientConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\logger\vo\operatelog\OperateLogRespVO.class +com\jojubanking\boot\module\system\dal\dataobject\oauth2\OAuth2CodeDO.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataExcelVO.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantUpdateReqVO.class +com\jojubanking\boot\module\system\convert\auth\OAuth2TokenConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypeExcelVO.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\xyrw\XyrwController.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostListReqVO.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserExportReqVO.class +com\jojubanking\boot\module\system\convert\logger\LoginLogConvert.class +com\jojubanking\boot\module\system\service\errorcode\ErrorCodeServiceImpl.class +com\jojubanking\boot\module\system\util\xytj\Excel2PdfUtil.class +com\jojubanking\boot\module\system\api\social\SocialUserApiImpl.class +com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountRespVO.class +com\jojubanking\boot\module\system\convert\sensitiveword\SensitiveWordConvert.class +com\jojubanking\boot\module\system\convert\childitem\ChilditemConvertImpl.class +com\jojubanking\boot\module\system\convert\tenant\TenantConvert.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\menu\MenuBaseVO.class +com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeSimpleRespVO.class +com\jojubanking\boot\module\system\controller\admin\logger\LoginLogController.class +com\jojubanking\boot\module\system\dal\mysql\user\AdminUserMapper.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RolePageReqVO.class +com\jojubanking\boot\module\system\dal\mysql\oauth2\OAuth2ClientMapper.class +com\jojubanking\boot\module\system\service\dztype\DzTypeService.class +com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaExcelVO.class +com\jojubanking\boot\module\system\service\dept\DeptService.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2TokenServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselCreateReqVO.class +com\jojubanking\boot\module\system\service\xyrw\XyrwService.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\channel\SmsChannelUpdateReqVO.class +com\jojubanking\boot\module\system\convert\hospital\HospitalConvert.class +com\jojubanking\boot\module\system\dal\dataobject\sms\SmsCodeDO$SmsCodeDOBuilder.class +com\jojubanking\boot\module\system\service\permission\PermissionServiceImpl.class +com\jojubanking\boot\module\system\util\xytj\EncryptUtil.class +com\jojubanking\boot\module\system\mq\message\deptXq\DeptXqRefreshMessage.class +com\jojubanking\boot\module\system\dal\dataobject\sms\SmsCodeDO.class +com\jojubanking\boot\module\system\service\dict\DictTypeServiceImpl.class +com\jojubanking\boot\module\system\dal\mysql\orderview\OrderViewMapper.class +com\jojubanking\boot\module\system\service\social\SocialUserServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8RespVO.class +com\jojubanking\boot\module\system\dal\redis\common\CaptchaRedisDAO.class +com\jojubanking\boot\module\system\controller\admin\order\vo\OrderSumRespVO.class +com\jojubanking\boot\module\system\service\tenant\handler\TenantMenuHandler.class +com\jojubanking\boot\module\system\controller\admin\item\ItemController.class +com\jojubanking\boot\module\system\dal\mysql\social\SocialUserBindMapper.class +com\jojubanking\boot\module\system\dal\mysql\dept\PostMapper.class +com\jojubanking\boot\module\system\api\logger\LoginLogApiImpl.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantBaseVO.class +com\jojubanking\boot\module\system\convert\carousel\CarouselConvert.class +com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalBaseVO.class +com\jojubanking\boot\module\system\dal\mysql\logger\OperateLogMapper.class +com\jojubanking\boot\module\system\controller\app\userinfo\AppUserInfoController.class +com\jojubanking\boot\module\system\mq\producer\deptXq\DeptXqProducer.class +com\jojubanking\boot\module\system\service\kstype\KsTypeServiceImpl.class +com\jojubanking\boot\module\system\service\mzjf\MzjfServiceImpl.class +com\jojubanking\boot\module\system\service\reserve8\Reserve8Service.class +com\jojubanking\boot\module\system\controller\admin\tenant\TenantController.class +com\jojubanking\boot\module\system\service\logger\LoginLogService.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\packages\TenantPackageCreateReqVO.class +com\jojubanking\boot\module\system\convert\kstype\KsTypeConvertImpl.class +com\jojubanking\boot\module\system\convert\wq\WqConvert.class +com\jojubanking\boot\module\system\service\permission\PermissionServiceImpl$1.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserBaseVO.class +com\jojubanking\boot\module\system\dal\dataobject\building\BuildingDO.class +com\jojubanking\boot\module\system\controller\admin\logger\vo\operatelog\OperateLogExcelVO.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2ClientServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypePageReqVO.class +com\jojubanking\boot\module\system\convert\ksinfo\KsInfoConvertImpl.class +com\jojubanking\boot\module\system\convert\building\BuildingConvert.class +com\jojubanking\boot\module\system\dal\dataobject\tenant\TenantPackageDO.class +com\jojubanking\boot\module\system\dal\mysql\wqdaview\WqdaViewMapper.class +com\jojubanking\boot\module\system\service\information\InformationService.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateExcelVO.class +com\jojubanking\boot\module\system\dal\dataobject\order\OrderDO$OrderDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingRespVO.class +com\jojubanking\boot\module\system\service\common\CaptchaServiceImpl.class +com\jojubanking\boot\module\system\dal\dataobject\dict\DictDataDO.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentExcelBaseVO$StudentExcelBaseVOBuilder.class +com\jojubanking\boot\module\system\controller\admin\common\CaptchaController.class +com\jojubanking\boot\module\system\api\user\AdminUserApiImpl.class +com\jojubanking\boot\module\system\dal\mysql\wqda\WqdaMapper.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\user\OAuth2UserInfoRespVO$Dept.class +com\jojubanking\boot\module\system\controller\admin\notice\vo\NoticeUpdateReqVO.class +com\jojubanking\boot\module\system\dal\mysql\social\SocialUserMapper.class +com\jojubanking\boot\module\system\controller\app\auth\vo\AppAuthLoginReqVO$AppAuthLoginReqVOBuilder.class +com\jojubanking\boot\module\system\mq\consumer\sms\SmsTemplateRefreshConsumer.class +com\jojubanking\boot\module\system\controller\admin\item\vo\ItemExportReqVO.class +com\jojubanking\boot\module\system\service\permission\MenuService.class +com\jojubanking\boot\module\system\controller\admin\carousel\CarouselController.class +com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\information\vo\InformationExcelVO.class +com\jojubanking\boot\module\system\service\sms\SmsCodeService.class +com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordExcelVO.class +com\jojubanking\boot\module\system\convert\mzjf\MzjfConvert.class +com\jojubanking\boot\module\system\dal\mysql\permission\RoleMenuBatchInsertMapper.class +com\jojubanking\boot\module\system\api\oauth2\OAuth2TokenApiImpl.class +com\jojubanking\boot\module\system\convert\dztype\DzTypeConvert.class +com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleRespVO.class +com\jojubanking\boot\module\system\service\dict\DictDataService.class +com\jojubanking\boot\module\system\controller\admin\common\vo\CaptchaImageRespVO.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataExportReqVO.class +com\jojubanking\boot\module\system\convert\sensitiveword\SensitiveWordConvertImpl.class +com\jojubanking\boot\module\system\convert\usecount\UseCountConvertImpl.class +com\jojubanking\boot\module\system\service\permission\RoleServiceImpl.class +com\jojubanking\boot\module\system\service\usersxq\UsersXqServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalExcelVO.class +com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqExcelVO.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthSmsLoginReqVO$AuthSmsLoginReqVOBuilder.class +com\jojubanking\boot\module\system\convert\orderview\OrderViewConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypeBaseVO.class +com\jojubanking\boot\module\system\convert\mzdm\MzdmConvert.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataRespVO.class +com\jojubanking\boot\module\system\api\dept\PostApiImpl.class +com\jojubanking\boot\module\system\dal\dataobject\user\AdminUserDO$AdminUserDOBuilder.class +com\jojubanking\boot\module\system\mq\message\dept\DeptRefreshMessage.class +com\jojubanking\boot\module\system\dal\mysql\usecount\UseCountXMapper.class +com\jojubanking\boot\module\system\dal\dataobject\usersxq\UsersXqDO$UsersXqDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\open\OAuth2OpenAuthorizeInfoRespVO$Client.class +com\jojubanking\boot\module\system\service\dept\PostServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqBaseVO.class +com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordCreateReqVO.class +com\jojubanking\boot\module\system\service\user\AdminUserService.class +com\jojubanking\boot\module\system\dal\mysql\wq\WqMapper.class +com\jojubanking\boot\module\system\service\dept\PostService.class +com\jojubanking\boot\module\system\controller\admin\doctor\DoctorController.class +com\jojubanking\boot\module\system\service\permission\PermissionServiceImpl$4.class +com\jojubanking\boot\module\system\util\xytj\BarCodeUtils.class +com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorBaseVO.class +com\jojubanking\boot\module\system\api\errorcode\ErrorCodeApiImpl.class +com\jojubanking\boot\module\system\dal\mysql\mzjf\MzjfMapper.class +com\jojubanking\boot\module\system\dal\dataobject\wq\WqDO$WqDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingListReqVO.class +com\jojubanking\boot\module\system\convert\common\CaptchaConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewExportReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\wqda\WqdaDOx$WqdaDOxBuilder.class +com\jojubanking\boot\module\system\controller\app\auth\vo\AppAuthLoginRespVO.class +com\jojubanking\boot\module\system\dal\dataobject\ksinfo\KsInfoDO$KsInfoDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\order\vo\OrderCreateReqVO.class +com\jojubanking\boot\module\system\service\tenant\TenantPackageService.class +com\jojubanking\boot\module\system\dal\mysql\kstype\KsTypeMapper.class +com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypeExportReqVO.class +com\jojubanking\boot\module\system\convert\kstype\KsTypeConvert.class +com\jojubanking\boot\module\system\mq\message\permission\RoleRefreshMessage.class +com\jojubanking\boot\module\system\service\permission\PermissionServiceImpl$5.class +com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountExportReqVO.class +com\jojubanking\boot\module\system\convert\permission\RoleConvertImpl.class +com\jojubanking\boot\module\system\dal\mysql\building\BuildingMapper.class +com\jojubanking\boot\module\system\service\sensitiveword\SensitiveWordServiceImpl.class +com\jojubanking\boot\module\system\dal\dataobject\mzdm\MzdmDO$MzdmDOBuilder.class +com\jojubanking\boot\module\system\dal\dataobject\item\ItemDO$ItemDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyBaseVO.class +com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainBaseVO.class +com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionExcelVO.class +com\jojubanking\boot\module\system\dal\mysql\mzdm\MzdmMapper.class +com\jojubanking\boot\module\system\convert\oauth2\OAuth2OpenConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthMenuRespVO.class +com\jojubanking\boot\module\system\convert\permission\MenuConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\permission\PermissionController.class +com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountExcelVO.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\packages\TenantPackageSimpleRespVO.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\DeptXqtjListReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\dict\DictTypeDO.class +com\jojubanking\boot\module\system\util\xytj\BarCodeUtils$1.class +com\jojubanking\boot\module\system\convert\dept\PostConvert.class +com\jojubanking\boot\module\system\controller\admin\logger\OperateLogController.class +com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgRespVO.class +com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewExcel01VO.class +com\jojubanking\boot\module\system\convert\label\LabelConvert.class +com\jojubanking\boot\module\system\controller\admin\tenant\TenantPackageController.class +com\jojubanking\boot\module\system\convert\oauth2\OAuth2UserConvertImpl.class +com\jojubanking\boot\module\system\convert\tenant\TenantConvertImpl.class +com\jojubanking\boot\module\system\dal\mysql\label\LabelMapper.class +com\jojubanking\boot\module\system\controller\admin\socail\SocialUserController.class +com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaRespVO.class +com\jojubanking\boot\module\system\convert\doctor\DoctorConvert.class +com\jojubanking\boot\module\system\dal\mysql\student\StudentMapper.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthLoginReqVO.class +com\jojubanking\boot\module\system\convert\dztype\DzTypeConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypeRespVO.class +com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\order\vo\OrderRespVO.class +com\jojubanking\boot\module\system\service\deptxq\DeptXqService.class +com\jojubanking\boot\module\system\service\usecount\UseCountService.class +com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfPageReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\deptxq\DeptXqDO$DeptXqDOBuilder.class +com\jojubanking\boot\module\system\service\xytjjg\XytjjgServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemBaseVO.class +com\jojubanking\boot\module\system\util\xytj\HttpClientUtil.class +com\jojubanking\boot\module\system\dal\dataobject\social\SocialUserBindDO$SocialUserBindDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserCreateReqVO.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\ItemListReqVO.class +com\jojubanking\boot\module\system\convert\logger\LoginLogConvertImpl.class +com\jojubanking\boot\module\system\service\xymain\xyMainServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\dept\DeptListReqVO.class +com\jojubanking\boot\module\system\convert\dzquestion\DzQuestionConvertImpl.class +com\jojubanking\boot\module\system\dal\dataobject\permission\MenuDO.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostBaseVO.class +com\jojubanking\boot\module\system\dal\dataobject\kstype\KsTypeDO$KsTypeDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypeBaseVO.class +com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaBaseVO.class +com\jojubanking\boot\module\system\convert\wqwt\WqwtConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\sms\SmsLogController.class +com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\logger\vo\loginlog\LoginLogRespVO.class +com\jojubanking\boot\module\system\dal\dataobject\mzjf\MzjfDO$MzjfDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentPageItemRespVO$Dept.class +com\jojubanking\boot\module\system\dal\mysql\permission\UserRoleBatchInsertMapper.class +com\jojubanking\boot\module\system\convert\dict\DictTypeConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodeCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserImportExcelVO.class +com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypeCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8ExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\label\vo\LabelExcelVO.class +com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyUpdateReqVO.class +com\jojubanking\boot\module\system\convert\auth\OAuth2TokenConvert.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\user\OAuth2UserInfoRespVO$Post.class +com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewRespVO.class +com\jojubanking\boot\module\system\dal\mysql\wqda\WqdaxMapper.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeBaseVO.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantExcelVO.class +com\jojubanking\boot\module\system\dal\dataobject\order\OrderDO.class +com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtCreateReqVO.class +com\jojubanking\boot\module\system\util\collection\SimpleTrie.class +com\jojubanking\boot\module\system\controller\admin\item\vo\ItemBaseVO.class +com\jojubanking\boot\module\system\dal\mysql\information\InformationMapper.class +com\jojubanking\boot\module\system\api\permission\RoleApiImpl.class +com\jojubanking\boot\module\system\service\sms\SmsSendService.class +com\jojubanking\boot\module\system\controller\admin\logger\vo\loginlog\LoginLogBaseVO.class +com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorCreateReqVO.class +com\jojubanking\boot\module\system\convert\xymain\xyMainConvert.class +com\jojubanking\boot\module\system\dal\dataobject\usersxq\UsersXqDO.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\log\SmsLogExcelVO.class +com\jojubanking\boot\module\system\controller\admin\oauth2\OAuth2UserController.class +com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqListReqVO.class +com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqSumReqVo.class +com\jojubanking\boot\module\system\convert\wqwt\WqwtConvert.class +com\jojubanking\boot\module\system\controller\admin\order\vo\OrderBaseVO.class +com\jojubanking\boot\module\system\convert\refundapply\RefundApplyConvert.class +com\jojubanking\boot\module\system\dal\dataobject\label\LabelDO$LabelDOBuilder.class +com\jojubanking\boot\module\system\dal\dataobject\mzdm\MzdmDO.class +com\jojubanking\boot\module\system\controller\admin\item\vo\ItemExcelVO.class +com\jojubanking\boot\module\system\dal\dataobject\wq\WqDO.class +com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8BaseVO.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\packages\TenantPackagePageReqVO.class +com\jojubanking\boot\module\system\dal\mysql\permission\RoleMapper.class +com\jojubanking\boot\module\system\dal\dataobject\userinfo\UserInfoDO$UserInfoDOBuilder.class +com\jojubanking\boot\module\system\service\carousel\CarouselServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptUpdateReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\oauth2\OAuth2ApproveDO.class +com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwExcelVO.class +com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodeRespVO.class +com\jojubanking\boot\module\system\controller\app\auth\vo\AppAuthSocialLoginReqVO$AppAuthSocialLoginReqVOBuilder.class +com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewUpdateReqVO.class +com\jojubanking\boot\module\system\convert\student\StudentConvert.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthPermissionInfoRespVO$UserVO.class +com\jojubanking\boot\module\system\WebLogAspect.class +com\jojubanking\boot\module\system\mq\message\sms\SmsTemplateRefreshMessage.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthSmsSendReqVO$AuthSmsSendReqVOBuilder.class +com\jojubanking\boot\module\system\convert\building\BuildingConvertImpl.class +com\jojubanking\boot\module\system\mq\consumer\deptXq\DeptXqRefreshConsumer.class +com\jojubanking\boot\module\system\service\ksinfo\KsInfoService.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeRespVO.class +com\jojubanking\boot\module\system\service\notice\NoticeService.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthMenuRespVO$AuthMenuRespVOBuilder.class +com\jojubanking\boot\module\system\api\dept\DeptApiImpl.class +com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewBaseVO.class +com\jojubanking\boot\module\system\dal\dataobject\building\BuildingDO$BuildingDOBuilder.class +com\jojubanking\boot\module\system\service\hospital\HospitalService.class +com\jojubanking\boot\module\system\convert\errorcode\ErrorCodeConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\logger\vo\loginlog\LoginLogExportReqVO.class +com\jojubanking\boot\module\system\dal\mysql\xyrw\XyrwMapper.class +com\jojubanking\boot\module\system\framework\captcha\config\CaptchaConfig.class +com\jojubanking\boot\module\system\dal\dataobject\wqwt\WqwtDO.class +com\jojubanking\boot\module\system\service\wqdaview\WqdaViewServiceImpl.class +com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoExportReqVO.class +com\jojubanking\boot\module\system\convert\userinfo\UserInfoConvert.class +com\jojubanking\boot\module\system\service\order\OrderService.class +com\jojubanking\boot\module\system\dal\mysql\dept\DeptMapper.class +com\jojubanking\boot\module\system\mq\consumer\mail\MailSendConsumer.class +com\jojubanking\boot\module\system\mq\consumer\sms\SmsChannelRefreshConsumer.class +com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\wqwt\WqwtController.class +com\jojubanking\boot\module\system\controller\admin\childitem\ChilditemController.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\token\OAuth2AccessTokenRespVO.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\client\OAuth2ClientRespVO.class +com\jojubanking\boot\module\system\controller\admin\logger\vo\operatelog\OperateLogPageReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\carousel\CarouselDO$CarouselDOBuilder.class +com\jojubanking\boot\module\system\service\xytjjg\XytjjgService.class +com\jojubanking\boot\module\system\controller\admin\wq\vo\WqExportReqVO.class +com\jojubanking\boot\module\system\dal\mysql\dict\DictDataMapper.class +com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordExportReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\dzquestion\DzQuestionDO.class +com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfBaseVO.class +com\jojubanking\boot\module\system\mq\message\auth\OAuth2ClientRefreshMessage.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleUpdateStatusReqVO.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserUpdateReqVO.class +com\jojubanking\boot\module\system\service\ksinfo\KsInfoServiceImpl.class +com\jojubanking\boot\module\system\service\sms\SmsTemplateService.class +com\jojubanking\boot\module\system\service\sms\SmsChannelServiceImpl.class +com\jojubanking\boot\module\system\service\auth\AdminAuthService.class +com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\label\LabelController.class +com\jojubanking\boot\module\system\job\GetKsinfoDaily.class +com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfRespVO.class +com\jojubanking\boot\module\system\dal\dataobject\dztype\DzTypeDO$DzTypeDOBuilder.class +com\jojubanking\boot\module\system\dal\dataobject\oauth2\OAuth2ClientDO.class +com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoCreateReqVO.class +com\jojubanking\boot\module\system\convert\social\SocialUserConvert.class +com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\sms\SmsTemplateController.class +com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\dept\DeptRespVO.class +com\jojubanking\boot\module\system\convert\hospital\HospitalConvertImpl.class +com\jojubanking\boot\module\system\convert\ksinfo\KsInfoConvert.class +com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateRespVO.class +com\jojubanking\boot\module\system\convert\logger\OperateLogConvertImpl.class +com\jojubanking\boot\module\system\service\refundapply\RefundApplyServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\item\vo\ItemCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\oauth2\OAuth2TokenController.class +com\jojubanking\boot\module\system\controller\admin\logger\vo\loginlog\LoginLogExcelVO.class +com\jojubanking\boot\module\system\dal\mysql\sensitiveword\SensitiveWordMapper.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleSimpleRespVO.class +com\jojubanking\boot\module\system\controller\admin\item\vo\ItemRespVO.class +com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqRespVO.class +com\jojubanking\boot\module\system\service\usecount\UseCountServiceImpl.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\studentJfListVO.class +com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodeUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostCreateReqVO.class +com\jojubanking\boot\module\system\convert\logger\OperateLogConvert.class +com\jojubanking\boot\module\system\convert\wqda\WqdaConvert.class +com\jojubanking\boot\module\system\dal\dataobject\information\InformationDO.class +com\jojubanking\boot\module\system\dal\mysql\order\OrderMapper.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyCreateReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\xymain\xyMainDO.class +com\jojubanking\boot\module\system\mq\message\mail\MailSendMessage.class +com\jojubanking\boot\module\system\dal\dataobject\xytjjg\XytjjgDO.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\log\SmsLogRespVO.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypeUpdateReqVO.class +com\jojubanking\boot\module\system\convert\childitem\ChilditemConvert.class +com\jojubanking\boot\module\system\convert\reserve8\Reserve8ConvertImpl.class +com\jojubanking\boot\module\system\dal\dataobject\reserve8\Reserve8DO.class +com\jojubanking\boot\module\system\controller\admin\xymain\xyMainController.class +com\jojubanking\boot\module\system\service\carousel\CarouselService.class +com\jojubanking\boot\module\system\controller\admin\auth\AuthController.class +com\jojubanking\boot\module\system\controller\admin\building\BuildingController.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthPermissionInfoRespVO$UserVO$UserVOBuilder.class +com\jojubanking\boot\module\system\dal\dataobject\student\StudentDO$StudentDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeExcelVO.class +com\jojubanking\boot\module\system\controller\admin\user\vo\profile\UserProfileRespVO.class +com\jojubanking\boot\module\system\controller\admin\user\vo\profile\UserProfileUpdateReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\wqdaview\WqdaViewCustDO.class +com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemRespVO.class +com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgHisItems.class +com\jojubanking\boot\module\system\service\tenant\TenantService.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\permission\PermissionAssignUserRoleReqVO.class +com\jojubanking\boot\module\system\controller\app\auth\vo\AppAuthLoginRespVO$AppAuthLoginRespVOBuilder.class +com\jojubanking\boot\module\system\convert\sms\SmsTemplateConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypeExcelVO.class +com\jojubanking\boot\module\system\convert\information\InformationConvert.class +com\jojubanking\boot\module\system\service\sms\SmsSendServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentUpdateReqVO.class +com\jojubanking\boot\module\system\convert\dict\DictTypeConvert.class +com\jojubanking\boot\module\system\util\xytj\MD5Util.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentImportExcelVO.class +com\jojubanking\boot\module\system\util\xytj\AgeCalculator.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\menu\MenuSimpleRespVO.class +com\jojubanking\boot\module\system\convert\item\ItemConvert.class +com\jojubanking\boot\module\system\service\dict\DictTypeService.class +com\jojubanking\boot\module\system\controller\admin\information\vo\InformationExportReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\childitem\ChilditemDO.class +com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgBaseVO.class +com\jojubanking\boot\module\system\mq\message\permission\RoleMenuRefreshMessage.class +com\jojubanking\boot\module\system\controller\admin\order\vo\OrderExportReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\permission\RoleDO.class +com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionCreateReqVO.class +com\jojubanking\boot\module\system\util\xytj\SoapUtil.class +com\jojubanking\boot\module\system\convert\sms\SmsChannelConvertImpl.class +com\jojubanking\boot\module\system\framework\tjfiles\TjfilesProperties.class +com\jojubanking\boot\module\system\controller\admin\wq\WqController.class +com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypeCreateReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\information\InformationDO$InformationDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\label\vo\LabelExportReqVO.class +com\jojubanking\boot\module\system\service\tenant\handler\TenantInfoHandler.class +com\jojubanking\boot\module\system\dal\mysql\oauth2\OAuth2RefreshTokenMapper.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthPermissionInfoRespVO$AuthPermissionInfoRespVOBuilder.class +com\jojubanking\boot\module\system\dal\dataobject\hospital\HospitalDO$HospitalDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewCreateReqVO.class +com\jojubanking\boot\module\system\convert\xytjjg\XytjjgConvert.class +com\jojubanking\boot\module\system\dal\dataobject\orderview\OrderViewDO$OrderViewDOBuilder.class +com\jojubanking\boot\module\system\service\student\StudentServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\client\OAuth2ClientBaseVO.class +com\jojubanking\boot\module\system\convert\sms\SmsLogConvert.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateBaseVO.class +com\jojubanking\boot\module\system\convert\auth\AuthConvert.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\dept\DeptBaseVO.class +com\jojubanking\boot\module\system\controller\admin\reserve8\Reserve8Controller.class +com\jojubanking\boot\module\system\convert\errorcode\ErrorCodeConvert.class +com\jojubanking\boot\module\system\controller\admin\dept\PostController.class +com\jojubanking\boot\module\system\dal\mysql\dzquestion\DzQuestionMapper.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostRespVO.class +com\jojubanking\boot\module\system\dal\dataobject\usecount\UseCountToDO$UseCountToDOBuilder.class +com\jojubanking\boot\module\system\dal\mysql\dict\DictTypeMapper.class +com\jojubanking\boot\module\system\util\oauth2\OAuth2Utils.class +com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaUpdateReqVO.class +com\jojubanking\boot\module\system\service\sms\SmsChannelService.class +com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountToDateRespVO.class +com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainPageItemRespVO.class +com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmExportReqVO.class +com\jojubanking\boot\module\system\convert\oauth2\OAuth2UserConvert.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\packages\TenantPackageUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\wqda\WqdaController.class +com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselPageReqVO.class +com\jojubanking\boot\module\system\service\doctor\DoctorService.class +com\jojubanking\boot\module\system\controller\admin\notice\vo\NoticePageReqVO.class +com\jojubanking\boot\module\system\controller\admin\item\vo\ItemUpdateReqVO.class +com\jojubanking\boot\module\system\util\xytj\StringDUtil.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentImportExcelVO$StudentImportExcelVOBuilder.class +com\jojubanking\boot\module\system\convert\social\SocialUserConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorRespVO.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateUpdateReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\errorcode\ErrorCodeDO.class +com\jojubanking\boot\module\system\convert\order\OrderConvertImpl.class +com\jojubanking\boot\module\system\service\dztype\DzTypeServiceImpl.class +com\jojubanking\boot\module\system\job\UpdateOrderDaily.class +com\jojubanking\boot\module\system\convert\xytjjg\XytjjgConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtBaseVO.class +com\jojubanking\boot\module\system\dal\dataobject\wqwt\WqwtDO$WqwtDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionBaseVO.class +com\jojubanking\boot\module\system\convert\deptxq\DeptXqConvert.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthLoginRespVO$AuthLoginRespVOBuilder.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptRespVO.class +com\jojubanking\boot\module\system\service\tenant\TenantServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantExportReqVO.class +com\jojubanking\boot\module\system\service\wqda\WqdaServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\menu\MenuRespVO.class +com\jojubanking\boot\module\system\dal\mysql\orderSum\OrderSumMapper.class +com\jojubanking\boot\module\system\controller\admin\notice\vo\NoticeCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypeExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemUpdateReqVO.class +com\jojubanking\boot\module\system\dal\redis\oauth2\OAuth2AccessTokenRedisDAO.class +com\jojubanking\boot\module\system\controller\admin\sms\SmsCallbackController.class +com\jojubanking\boot\module\system\service\item\ItemService.class +com\jojubanking\boot\module\system\dal\dataobject\xyrw\XyrwDO$XyrwDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthLoginReqVO$CodeEnableGroup.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\client\OAuth2ClientCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateSendReqVO.class +com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainExcelVO.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\log\SmsLogExportReqVO.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\channel\SmsChannelSimpleRespVO.class +com\jojubanking\boot\module\system\dal\mysql\ksinfo\KsInfoMapper.class +com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmRespVO.class +com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodeExportReqVO.class +com\jojubanking\boot\module\system\dal\mysql\dept\UserPostMapper.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataUpdateReqVO.class +com\jojubanking\boot\module\system\mq\producer\permission\RoleProducer.class +com\jojubanking\boot\module\system\convert\label\LabelConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqUpdateReqVO.class +com\jojubanking\boot\module\system\framework\tjfiles\TjfilesConfig.class +com\jojubanking\boot\module\system\controller\admin\logger\vo\operatelog\OperateLogBaseVO.class +com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyExcelVO.class +com\jojubanking\boot\module\system\controller\admin\label\vo\LabelBaseVO.class +com\jojubanking\boot\module\system\dal\dataobject\xytjjg\XytjjgDO$XytjjgDOBuilder.class +com\jojubanking\boot\module\system\service\permission\bo\RoleCreateReqBO.class +com\jojubanking\boot\module\system\service\notice\NoticeServiceImpl.class +com\jojubanking\boot\module\system\dal\dataobject\logger\LoginLogDO.class +com\jojubanking\boot\module\system\dal\mysql\usecount\UseCountMapper.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2TokenService.class +com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodePageReqVO.class +com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalRespVO.class +com\jojubanking\boot\module\system\dal\mysql\permission\RoleMenuMapper.class +com\jojubanking\boot\module\system\controller\admin\information\InformationController.class +com\jojubanking\boot\module\system\dal\dataobject\mzjf\MzjfDO.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\packages\TenantPackageBaseVO.class +com\jojubanking\boot\module\system\controller\admin\information\vo\InformationRespVO.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentExcelBaseVO.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptExcelVO.class +com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoBaseVO.class +com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordPageReqVO.class +com\jojubanking\boot\module\system\mq\message\sms\SmsSendMessage.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\client\OAuth2ClientPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\student\StudentController.class +com\jojubanking\boot\module\system\dal\dataobject\reserve8\Reserve8DO$Reserve8DOBuilder.class +com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewExcelVO.class +com\jojubanking\boot\module\system\dal\dataobject\usecount\UseCountDO$UseCountDOBuilder.class +com\jojubanking\boot\module\system\dal\dataobject\social\SocialUserDO.class +com\jojubanking\boot\module\system\api\tenant\TenantApiImpl.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\xyMainUpdateByOpenidVO.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentCreateReqVO.class +com\jojubanking\boot\module\system\convert\auth\AuthConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthLoginReqVO$AuthLoginReqVOBuilder.class +com\jojubanking\boot\module\system\controller\admin\order\vo\OrderUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserImportRespVO$UserImportRespVOBuilder.class +com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqBaseVO.class +com\jojubanking\boot\module\system\service\permission\RoleService.class +com\jojubanking\boot\module\system\controller\admin\usersxq\UsersXqController.class +com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountBaseVO.class +com\jojubanking\boot\module\system\convert\information\InformationConvertImpl.class +com\jojubanking\boot\module\system\dal\dataobject\notice\NoticeDO.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleBaseVO.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthSmsSendReqVO.class +com\jojubanking\boot\module\system\mq\producer\permission\PermissionProducer.class +com\jojubanking\boot\module\system\api\dict\DictDataApiImpl.class +com\jojubanking\boot\module\system\controller\admin\user\UserController.class +com\jojubanking\boot\module\system\service\permission\MenuServiceImpl$1.class +com\jojubanking\boot\module\system\controller\admin\errorcode\ErrorCodeController.class +com\jojubanking\boot\module\system\dal\dataobject\permission\UserRoleDO.class +com\jojubanking\boot\module\system\convert\orderview\OrderViewConvert.class +com\jojubanking\boot\module\system\service\common\CaptchaService.class +com\jojubanking\boot\module\system\service\order\OrderServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthSocialLoginReqVO$AuthSocialLoginReqVOBuilder.class +com\jojubanking\boot\module\system\convert\xymain\xyMainConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\hospital\HospitalController.class +com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypePageReqVO.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleExcelVO.class +com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserImportExcelVO$UserImportExcelVOBuilder.class +com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqPageReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\oauth2\OAuth2RefreshTokenDO.class +com\jojubanking\boot\module\system\service\logger\OperateLogService.class +com\jojubanking\boot\module\system\controller\admin\label\vo\LabelPageReqVO.class +com\jojubanking\boot\module\system\convert\auth\OAuth2ClientConvert.class +com\jojubanking\boot\module\system\service\permission\RoleServiceImpl$1.class +com\jojubanking\boot\module\system\controller\admin\permission\RoleController.class +com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypeUpdateReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\social\SocialUserDO$SocialUserDOBuilder.class +com\jojubanking\boot\module\system\convert\item\ItemConvertImpl.class +com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodeBaseVO.class +com\jojubanking\boot\module\system\convert\permission\RoleConvert.class +com\jojubanking\boot\module\system\service\sms\SmsCodeServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\orderview\OrderViewController.class +com\jojubanking\boot\module\system\controller\admin\permission\MenuController.class +com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainUpdateReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\sms\SmsLogDO.class +com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselRespVO.class +com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgExportReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\oauth2\OAuth2AccessTokenDO.class +com\jojubanking\boot\module\system\mq\consumer\permission\RoleRefreshConsumer.class +com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypeRespVO.class +com\jojubanking\boot\module\system\mq\consumer\sms\SmsSendConsumer.class +com\jojubanking\boot\module\system\service\dept\DeptServiceImpl.class +com\jojubanking\boot\module\system\mq\consumer\auth\OAuth2ClientRefreshConsumer.class +com\jojubanking\boot\module\system\service\dzquestion\DzQuestionServiceImpl.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\AppPayOrderController.class +com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqSimpleRespVO.class +com\jojubanking\boot\module\system\dal\dataobject\dztype\DzTypeDO.class +com\jojubanking\boot\module\system\dal\dataobject\tenant\TenantDO$TenantDOBuilder.class +com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataBaseVO.class +com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwCreateReqVO.class +com\jojubanking\boot\module\system\service\social\SocialUserService.class +com\jojubanking\boot\module\system\controller\admin\student\vo\StudentImportRespVO$StudentImportRespVOBuilder.class +com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemExcelVO.class +com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyRespVO.class +com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainRespVO.class +com\jojubanking\boot\module\system\dal\mysql\tenant\TenantPackageMapper.class +com\jojubanking\boot\module\system\dal\dataobject\dept\DeptDO.class +com\jojubanking\boot\module\system\dal\mysql\oauth2\OAuth2CodeMapper.class +com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8UpdateReqVO.class +com\jojubanking\boot\module\system\convert\refundapply\RefundApplyConvertImpl.class +com\jojubanking\boot\module\system\mq\producer\dept\DeptProducer.class +com\jojubanking\boot\module\system\controller\admin\order\vo\OrderSumPageReqVO.class +com\jojubanking\boot\module\system\controller\admin\kstype\KsTypeController.class +com\jojubanking\boot\module\system\controller\admin\order\vo\OrderSumExcelVO.class +com\jojubanking\boot\module\system\convert\user\UserConvert.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\open\OAuth2OpenAuthorizeInfoRespVO.class +com\jojubanking\boot\module\system\service\errorcode\ErrorCodeService.class +com\jojubanking\boot\module\system\controller\admin\order\vo\OrderExcelVO.class +com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalExportReqVO.class +com\jojubanking\boot\module\system\service\permission\RoleServiceImpl$2.class +com\jojubanking\boot\module\system\controller\admin\socail\vo\SocialUserUnbindReqVO.class +com\jojubanking\boot\module\system\dal\dataobject\wqdaview\WqdaViewCustDO$WqdaViewCustDOBuilder.class +com\jojubanking\boot\module\system\dal\mysql\dztype\DzTypeMapper.class +com\jojubanking\boot\module\system\controller\admin\refundapply\RefundApplyController.class +com\jojubanking\boot\module\system\service\childitem\ChilditemService.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\user\OAuth2UserInfoRespVO.class +com\jojubanking\boot\module\system\controller\admin\sms\vo\channel\SmsChannelCreateReqVO.class +com\jojubanking\boot\module\system\convert\doctor\DoctorConvertImpl.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\FeeUpdateVO.class +com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserSimpleRespVO.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostSimpleRespVO.class +com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfExcelVO.class +com\jojubanking\boot\module\system\controller\admin\notice\NoticeController.class +com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\dztype\DzTypeController.class +com\jojubanking\boot\module\system\service\doctor\DoctorServiceImpl.class +com\jojubanking\boot\module\system\service\item\ItemServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\user\UserProfileController.class +com\jojubanking\boot\module\system\mq\message\sensitiveword\SensitiveWordRefreshMessage.class +com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptCreateReqVO.class +com\jojubanking\boot\module\system\convert\notice\NoticeConvertImpl.class +com\jojubanking\boot\module\system\convert\wqdaview\WqdaViewConvert.class +com\jojubanking\boot\module\system\service\xymain\xyMainService.class +com\jojubanking\boot\module\system\controller\app\auth\vo\AppAuthLoginReqVO.class +com\jojubanking\boot\module\system\api\sms\SmsSendApiImpl.class +com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantRespVO.class +com\jojubanking\boot\module\system\dal\dataobject\hospital\HospitalDO.class +com\jojubanking\boot\module\system\dal\dataobject\sensitiveword\SensitiveWordDO.class +com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingSimpleRespVO.class +com\jojubanking\boot\module\system\convert\tenant\TenantPackageConvertImpl.class +com\jojubanking\boot\module\system\dal\mysql\permission\MenuMapper.class +com\jojubanking\boot\module\system\convert\common\CaptchaConvert.class +com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqExcelVO.class +com\jojubanking\boot\module\system\dal\dataobject\usecount\UseCountToDateDO.class +com\jojubanking\boot\module\system\dal\mysql\hospital\HospitalMapper.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\XyrwListReqVO.class +com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthSmsLoginReqVO.class +com\jojubanking\boot\module\system\controller\app\xytjinfo\StatusDefine.class +com\jojubanking\boot\module\system\dal\dataobject\xyrw\XyrwDO.class +com\jojubanking\boot\module\system\service\tenant\TenantPackageServiceImpl.class +com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqRespVO.class +com\jojubanking\boot\module\system\util\xytj\StringUtil.class +com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqExportReqVO.class +com\jojubanking\boot\module\system\mq\message\sms\SmsChannelRefreshMessage.class +com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8PageReqVO.class +com\jojubanking\boot\module\system\controller\admin\wq\vo\WqCreateReqVO.class +com\jojubanking\boot\module\system\controller\admin\oauth2\vo\user\OAuth2UserUpdateReqVO.class +com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingBaseVO.class +com\jojubanking\boot\module\system\service\auth\AdminAuthServiceImpl.class +com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoExcelVO.class +com\jojubanking\boot\module\system\util\xytj\DateDUtil.class +com\jojubanking\boot\module\system\service\sensitiveword\SensitiveWordService.class +com\jojubanking\boot\module\system\controller\admin\ksinfo\KsInfoController.class +com\jojubanking\boot\module\system\controller\admin\label\vo\LabelCreateReqVO.class +com\jojubanking\boot\module\system\util\xytj\WSUtil.class diff --git a/joju-module-system/joju-module-system-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/joju-module-system/joju-module-system-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..5e9c976 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,851 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\order\vo\OrderSumPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\profile\UserProfileUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\sensitiveword\SensitiveWordMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\vo\client\OAuth2ClientBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\deptxq\DeptXqService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\tenant\TenantApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\redis\common\CaptchaRedisDAO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\building\BuildingMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\mzjf\MzjfMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\job\UpdatePriceDaily.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthLoginRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserUpdateStatusReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wq\vo\WqExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\wqwt\WqwtMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\vo\client\OAuth2ClientRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\framework\sms\SmsCodeConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\childitem\ChilditemService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\wqdaview\WqdaViewCustDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\social\SocialUserConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountToDateRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\packages\TenantPackageRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\DeptController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\packages\TenantPackageBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\childitem\ChilditemMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\dept\DeptBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\order\OrderController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\item\ItemDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\message\deptXq\DeptXqRefreshMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\tenant\handler\TenantInfoHandler.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\xytjjg\XytjjgConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\orderview\OrderViewDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\permission\bo\RoleCreateReqBO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\wq\WqService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgHisItems.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\dept\PostApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\HttpClientUtil.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\hospital\HospitalController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\mzdm\MzdmService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\PostController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\order\vo\OrderExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\errorcode\ErrorCodeService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\auth\vo\AppAuthLoginReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\member\MemberService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserPageItemRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\wqwt\WqwtConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\order\vo\OrderExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\notice\NoticeConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\usecount\UseCountDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\dztype\DzTypeDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\MenuController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\WebLogAspect.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\reserve8\Reserve8ServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostListReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypePageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\label\vo\LabelRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\profile\UserProfileRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypePageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\sms\SmsChannelServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\wqwt\WqwtServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\carousel\CarouselService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\packages\TenantPackagePageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\wqdaview\WqdaViewService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\social\SocialUserApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\dept\DeptRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\producer\permission\RoleProducer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\xyrw\XyrwService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\carousel\CarouselServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\user\AdminUserApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\auth\AdminAuthService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\information\InformationDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\FeeListVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\oauth2\OAuth2UserConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\notice\NoticeDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodeBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\reserve8\Reserve8Service.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\sms\SmsLogDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\userinfo\AppUserInfoController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\framework\tjfiles\TjfilesConfig.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserImportRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\building\BuildingServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\message\permission\RoleRefreshMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\usersxq\UsersXqService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\doctor\DoctorConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\profile\UserProfileUpdatePasswordReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\wqda\WqdaDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\logger\OperateLogMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\sms\SmsTemplateConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\item\ItemConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\information\vo\InformationBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\consumer\dept\DeptRefreshConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\dept\PostService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\sensitiveword\SensitiveWordService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\consumer\sms\SmsChannelRefreshConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wq\vo\WqPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\student\StudentService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2ClientService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\information\vo\InformationRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\oauth2\OAuth2Utils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\producer\sensitiveword\SensitiveWordProducer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\redis\oauth2\OAuth2AccessTokenRedisDAO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\usecount\UseCountToDateDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\IDCardParser.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\menu\MenuRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\message\permission\RoleMenuRefreshMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\sms\SmsChannelMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\user\AdminUserMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\label\vo\LabelExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\tenant\TenantDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\dztype\DzTypeService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodeCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodeRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\mzjf\MzjfDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\order\vo\OrderSumExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\logger\vo\operatelog\OperateLogExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\label\vo\LabelPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\framework\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\log\SmsLogExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\framework\datapermission\config\DataPermissionConfiguration.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypeRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\OAuth2UserController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\DictTypeController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\student\vo\StudentImportExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\menu\MenuBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\message\sms\SmsChannelRefreshMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\logger\vo\operatelog\OperateLogPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\DeptXqtjBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\xyMainUpdateByOpenidVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserUpdatePasswordReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\log\SmsLogExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\hospital\HospitalMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\deptxq\DeptXqConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\label\vo\LabelUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\permission\PermissionServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\ItemListReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\dept\PostServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\consumer\permission\UserRoleRefreshConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\StatusDefine.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\member\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypeBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\userinfo\UserInfoConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8RespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\deptxq\DeptXqController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8BaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\permission\RoleMenuDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\vo\client\OAuth2ClientCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\dict\DictTypeServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthPermissionInfoRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\dzquestion\DzQuestionServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\OAuth2TokenController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\sms\SmsChannelDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\orderview\OrderViewController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wq\WqController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\ksinfo\KsInfoServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\permission\MenuMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\hospital\HospitalServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wq\vo\WqUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\sms\SmsLogServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqda\WqdaController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\studentJfListVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\xytjjg\XytjjgBatchInsertMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\information\InformationService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\errorcode\ErrorCodeApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\mzjf\MzjfConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\packages\TenantPackageCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\usecount\UseCountXMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\label\LabelConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\producer\sms\SmsProducer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\permission\PermissionAssignRoleMenuReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\producer\permission\PermissionProducer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\member\MemberServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqSimpleRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\vo\open\OAuth2OpenAuthorizeInfoRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\student\StudentServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataSimpleRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\sensitiveword\SensitiveWordConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\wqdaview\WqdaViewDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\message\sensitiveword\SensitiveWordRefreshMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\building\BuildingService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\SmsChannelController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\order\vo\OrderPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\refundapply\RefundApplyMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\socail\SocialUserController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\logger\vo\operatelog\OperateLogExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\student\StudentMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\tenant\TenantPackageService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\PermissionController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\vo\user\OAuth2UserUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\dept\PostConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\usersxq\UsersXqConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\student\vo\StudentRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\channel\SmsChannelSimpleRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\reserve8\Reserve8Controller.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dzquestion\DzQuestionController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\information\InformationController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\refundapply\RefundApplyDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzdm\MzdmController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\item\vo\ItemCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthLoginReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\AgeCalculator.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\item\ItemController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\tenant\TenantMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\building\BuildingConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\DateDUtil.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\consumer\deptXq\DeptXqRefreshConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2GrantServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\OAuth2ClientController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RolePageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthSmsSendReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\usecount\UseCountService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\xyMainOrderVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usecount\UseCountController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\DeptXqtjListReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\notice\vo\NoticeUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\hospital\HospitalDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\kstype\KsTypeConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\mzdm\MzdmConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\label\LabelServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\information\vo\InformationUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\orderview\OrderViewServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\childitem\ChilditemDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\auth\AuthConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\wqda\WqdaConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleSimpleRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\sms\SmsCodeService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\wqwt\WqwtService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateSendReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2TokenService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\userinfo\UserInfoMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\oauth2\OAuth2CodeMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\order\OrderConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\social\SocialUserMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\label\vo\LabelCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\socail\vo\SocialUserUnbindReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypeUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\wqwt\WqwtDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\sms\SmsSendApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\user\AdminUserService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\carousel\CarouselConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\usecount\UseCountConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\refundapply\RefundApplyController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\deptxq\DeptXqDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\dztype\DzTypeServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\reserve8\Reserve8Mapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\student\vo\StudentCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\building\BuildingController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostSimpleRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\logger\OperateLogDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\oauth2\OAuth2ApproveMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xytjjg\XytjjgController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\doctor\DoctorMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\sms\SmsLogMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\job\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\message\permission\UserRoleRefreshMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypeBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypeExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodeUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\logger\vo\loginlog\LoginLogExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\framework\sms\SmsCodeProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodeExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\vo\client\OAuth2ClientUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\childitem\ChilditemConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\xymain\xyMainServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\permission\RoleServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\message\sms\SmsTemplateRefreshMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2ApproveService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\consumer\auth\OAuth2ClientRefreshConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\consumer\sensitiveword\SensitiveWordRefreshConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\sms\SmsTemplateDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\tenant\handler\TenantMenuHandler.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\message\dept\DeptRefreshMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\information\InformationServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\wqda\WqdaMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\tenant\TenantServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8ExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\carousel\CarouselMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\logger\vo\operatelog\OperateLogBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthSocialLoginReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\permission\RoleMenuBatchInsertMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\student\vo\StudentExcelBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeSimpleRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8UpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypeExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\consumer\sms\SmsTemplateRefreshConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\packages\TenantPackageSimpleRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypeUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\logger\OperateLogService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\dzquestion\DzQuestionConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\consumer\permission\RoleRefreshConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\common\vo\CaptchaImageRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2CodeServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\sms\SmsLogService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\wqda\WqdaServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleUpdateStatusReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\sms\SmsSendServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\channel\SmsChannelBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\usersxq\UsersXqDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\dict\DictTypeMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\user\AdminUserServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\errorcode\ErrorCodeServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingSimpleRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\information\InformationMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\information\vo\InformationPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\DictDataController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\logger\OperateLogConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\mzjf\MzjfService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserSimpleRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\doctor\DoctorService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\sms\SmsLogConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2TokenServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\information\vo\InformationExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\social\SocialUserBindMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\usecount\UseCountMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\auth\AuthController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\sms\SmsTemplateService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\tenant\TenantPackageConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\framework\captcha\config\CaptchaConfig.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodeExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\wqdaview\WqdaViewConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\order\OrderMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2CodeService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\student\vo\StudentPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\order\OrderService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\dict\AppDictDataController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\usecount\UseCountToDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\reserve8\Reserve8Convert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\collection\SimpleTrie.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\mzdm\MzdmMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\UserController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\logger\OperateLogController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqwt\WqwtController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\mzjf\MzjfServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqSumReqVo.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\MD5Util.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\item\vo\ItemBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\wqdaview\WqdaViewServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\information\vo\InformationCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\message\permission\MenuRefreshMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\item\vo\ItemExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\wqda\WqdaService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\notice\vo\NoticeRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\item\ItemService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\StringDUtil.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\VeDate.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\xymain\xyMainConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\social\SocialUserService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\wqda\WqdaDOx.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\kstype\KsTypeServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqdaview\WqdaViewController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\common\CaptchaController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wq\vo\WqExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\childitem\ChilditemController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\oauth2\OAuth2RefreshTokenMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\order\vo\OrderRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\WSUtil.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\permission\UserRoleMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\social\SocialUserDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\wq\WqMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\UserProfileController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\information\InformationConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\wq\WqConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\notice\vo\NoticeBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzjf\vo\MzjfExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\sensitiveword\SensitiveWordServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\dept\PostDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\notice\NoticeController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\sms\SmsCodeServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\logger\LoginLogDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqListReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\auth\AdminAuthServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\wqda\WqdaxMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\permission\RoleMenuMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\message\mail\MailSendMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\item\vo\ItemRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\label\LabelDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\logger\LoginLogMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\label\vo\LabelExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypeCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\logger\vo\loginlog\LoginLogPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\framework\captcha\config\CaptchaProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\order\vo\OrderBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\SoapUtil.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\order\OrderDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\dept\DeptConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\orderview\OrderViewMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\TenantController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\channel\SmsChannelCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\FeeInfoVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\dict\DictDataApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\permission\RoleMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\TenantPackageController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\refundapply\RefundApplyConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\vo\open\OAuth2OpenCheckTokenRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\framework\captcha\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\dept\DeptUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\carousel\AppCarouselController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\consumer\mail\MailSendConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\dict\DictDataConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\menu\MenuUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\ksinfo\KsInfoConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\xymain\xyMainMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\dict\DictTypeConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\permission\RoleConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wq\vo\WqBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\RoleController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\mzdm\MzdmDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\ksinfo\KsInfoController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\errorcode\vo\ErrorCodePageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\dict\DictTypeDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\socail\vo\SocialUserBindReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dztype\DzTypeController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\tenant\TenantPackageServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\menu\MenuListReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\doctor\DoctorServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\oauth2\OAuth2TokenApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\dept\UserPostMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\student\StudentController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\dept\DeptSimpleRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\label\LabelService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\tenant\TenantPackageMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\xymain\xyMainService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\permission\MenuServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\carousel\CarouselController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\notice\NoticeServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthSmsLoginReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\label\LabelMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\redis\RedisKeyConstants.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\producer\auth\OAuth2ClientProducer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\consumer\permission\MenuRefreshConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\authgz\GzAuthService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\dzquestion\DzQuestionService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\consumer\sms\SmsSendConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\auth\vo\AuthMenuRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\errorcode\ErrorCodeDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\xyrw\XyrwDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\sms\SmsCodeDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\xyrw\XyrwMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\permission\PermissionService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\message\sms\SmsSendMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainPageItemRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\dept\DeptMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\item\vo\ItemUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\ksinfo\KsInfoDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\oauth2\OAuth2AccessTokenMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\logger\LoginLogConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\userinfo\UserInfoService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserImportExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\auth\vo\AppAuthSocialLoginReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\oauth2\OAuth2ApproveDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\oauth2\OAuth2AccessTokenDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\item\vo\ItemExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\usersxq\UsersXqServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\dept\DeptDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\dept\DeptListReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\packages\TenantPackageUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xytjjg\vo\XytjjgRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\order\vo\OrderCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\xytjjg\XytjjgDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\kstype\KsTypeMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\authgz\GzAuthServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\oauth2\OAuth2OpenConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\permission\PermissionAssignUserRoleReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\kstype\KsTypeService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\common\CaptchaServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\logger\vo\loginlog\LoginLogBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\FeeInfoDetailVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\vo\token\OAuth2AccessTokenPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wq\vo\WqRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\userinfo\UserInfoServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\logger\OperateLogServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\reserve8\Reserve8DO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\tenant\vo\tenant\TenantCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\sms\SmsSendService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\user\UserConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\auth\OAuth2TokenConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\producer\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\xytjjg\XytjjgServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\auth\AppAuthController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\sms\SmsTemplateServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\sms\SmsTemplateMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\dept\DeptCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\vo\open\OAuth2OpenAccessTokenRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\tenant\TenantPackageDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\social\SocialUserBindDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\logger\vo\loginlog\LoginLogRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqwt\vo\WqwtBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\oauth2\OAuth2ClientMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\permission\MenuConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\building\BuildingDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\notice\NoticeService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\ksinfo\vo\KsInfoCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\permission\RoleService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\permission\UserRoleBatchInsertMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\student\StudentDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sensitiveword\SensitiveWordController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\student\vo\StudentBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xymain\xyMainController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\StringUtil.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\producer\deptXq\DeptXqProducer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\doctor\DoctorDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\order\vo\OrderUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\WebLog.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\mzdm\MzdmServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\FeeUpdateVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\XmlUtil.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\label\LabelController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\menu\MenuSimpleRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\item\ItemMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\dept\PostMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\doctor\DoctorController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\xytjjg\XytjjgMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\notice\NoticeMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypeCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\auth\vo\AppAuthLoginRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\orderview\OrderViewService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\sms\SmsChannelService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplateRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\label\vo\LabelBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\sensitiveword\SensitiveWordApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\orderSum\OrderSumMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\usersxq\UsersXqMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\logger\vo\loginlog\LoginLogExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\refundapply\RefundApplyService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\user\AdminUserDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\sms\SmsCodeApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\SmsLogController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2ClientServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\childitem\ChilditemServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\xymain\xyMainDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingListReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\dict\DictDataServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzjf\MzjfController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\dict\DictDataService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\vo\client\OAuth2ClientPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\refundapply\vo\RefundApplyBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\logger\LoginLogController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\SmsTemplateController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\BarCodeUtils.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\wq\WqServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\order\vo\OrderSumRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\logger\LoginLogService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\dept\UserPostDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\orderview\vo\OrderViewExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\framework\tjfiles\TjfilesProperties.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\carousel\vo\CarouselPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usecount\vo\UseCountExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\userinfo\vo\AppUserInfoBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\common\CaptchaService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\SmsCallbackController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\channel\SmsChannelUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\tenant\TenantConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8ExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\item\ItemServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\log\SmsLogPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8PageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\student\vo\StudentExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\deptxq\DeptXqServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\dzquestion\DzQuestionDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\social\SocialUserServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\vo\user\OAuth2UserInfoRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\oauth2\OAuth2CodeDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\doctor\vo\DoctorExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\dept\DeptServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\user\vo\user\UserExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\information\vo\InformationExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\dept\DeptApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\orderview\OrderViewConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\job\UpdateOrderDaily.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\channel\SmsChannelPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\deptxq\DeptXqMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\childitem\vo\ChilditemPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\common\CaptchaConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptBaseVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypeExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\carousel\CarouselDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2ApproveServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\permission\MenuService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\student\StudentConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\wq\WqDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\Excel2PdfUtil.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\errorcode\ErrorCodeMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\consumer\permission\RoleMenuRefreshConsumer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\type\DictTypeRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\xyrw\XyrwConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\OAuth2OpenController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\reserve8\vo\Reserve8CreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\ksinfo\KsInfoMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\message\auth\OAuth2ClientRefreshMessage.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\hospital\vo\HospitalRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqda\vo\WqdaUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\template\SmsTemplatePageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\permission\PermissionApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\post\PostExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\student\vo\StudentUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\permission\MenuDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\menu\MenuCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\xyrw\XyrwServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypeRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xyrw\vo\XyrwCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\sms\SmsCodeMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xymain\vo\xyMainExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\permission\RoleApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\kstype\KsTypeDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\userinfo\UserInfoDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\auth\AuthGzConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\item\vo\ItemPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\oauth2\OAuth2RefreshTokenDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\dict\DictDataMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\producer\permission\MenuProducer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\util\xytj\EncryptUtil.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\oauth2\OAuth2ClientDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\dztype\DzTypeMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\usecount\UseCountServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\xytjjg\XytjjgService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\oauth2\vo\token\OAuth2AccessTokenRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\xyrw\XyrwController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sensitiveword\vo\SensitiveWordPageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\permission\RoleDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\wqdaview\WqdaViewMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\log\SmsLogRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\logger\vo\operatelog\OperateLogRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usersxq\vo\UsersXqExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\sensitiveword\SensitiveWordDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\sms\SmsChannelConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\permission\PermissionAssignRoleDataScopeReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2GrantService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\job\GetKsinfoDaily.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\AppPayOrderController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\order\OrderServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wqdaview\vo\WqdaViewExcel01VO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\vo\XyrwListReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\dict\DictDataDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\logger\LoginLogApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\mzdm\vo\MzdmExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\refundapply\RefundApplyServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\api\logger\OperateLogApiImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\kstype\vo\KsTypeExcelVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\ksinfo\KsInfoService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\dataobject\permission\UserRoleDO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\dict\DictTypeService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\hospital\HospitalService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\dztype\DzTypeConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\student\vo\StudentPageItemRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dztype\vo\DzTypePageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\errorcode\ErrorCodeController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\app\xytjinfo\AppDeptInfoController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\logger\LoginLogServiceImpl.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\notice\vo\NoticeCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\kstype\KsTypeController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\sms\vo\channel\SmsChannelRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\framework\datapermission\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\package-info.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\building\vo\BuildingRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\usersxq\UsersXqController.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\dept\DeptService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\dal\mysql\dzquestion\DzQuestionMapper.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\wq\vo\WqCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\student\vo\StudentExportReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\deptxq\vo\DeptXqCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dept\vo\DeptCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dzquestion\vo\DzQuestionUpdateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\errorcode\ErrorCodeConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\service\tenant\TenantService.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\auth\OAuth2ClientConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\notice\vo\NoticePageReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\mq\producer\dept\DeptProducer.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\convert\hospital\HospitalConvert.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\dict\vo\data\DictDataCreateReqVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\student\vo\StudentImportRespVO.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\下园体检\examination\joju-module-system\joju-module-system-biz\src\main\java\com\jojubanking\boot\module\system\controller\admin\permission\vo\role\RoleBaseVO.java diff --git a/joju-module-system/joju-module-system-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/joju-module-system/joju-module-system-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..cc1bd01 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1,29 @@ +com\jojubanking\boot\module\system\service\dict\DictTypeServiceTest.class +com\jojubanking\boot\module\system\service\dept\DeptServiceTest.class +com\jojubanking\boot\module\system\controller\admin\oauth2\OAuth2OpenControllerTest.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2GrantServiceImplTest.class +com\jojubanking\boot\module\system\service\tenant\TenantServiceImplTest.class +com\jojubanking\boot\module\system\service\notice\NoticeServiceImplTest.class +com\jojubanking\boot\module\system\service\errorcode\ErrorCodeServiceTest.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2ClientServiceImplTest.class +com\jojubanking\boot\module\system\service\user\AdminUserServiceImplTest.class +com\jojubanking\boot\module\system\service\sms\SmsSendServiceTest.class +com\jojubanking\boot\module\system\service\permission\RoleServiceTest.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2ApproveServiceImplTest.class +com\jojubanking\boot\module\system\service\sms\SmsLogServiceTest.class +com\jojubanking\boot\module\system\service\sensitiveword\SensitiveWordServiceImplTest.class +com\jojubanking\boot\module\system\service\sms\SmsChannelServiceTest.class +com\jojubanking\boot\module\system\service\tenant\TenantPackageServiceImplTest.class +com\jojubanking\boot\module\system\service\social\SocialUserServiceTest.class +com\jojubanking\boot\module\system\service\common\CaptchaServiceTest.class +com\jojubanking\boot\module\system\service\auth\AdminAuthServiceImplTest.class +com\jojubanking\boot\module\system\service\logger\LoginLogServiceImplTest.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2TokenServiceImplTest.class +com\jojubanking\boot\module\system\service\logger\OperateLogServiceImplTest.class +com\jojubanking\boot\module\system\service\dict\DictDataServiceTest.class +com\jojubanking\boot\module\system\service\permission\MenuServiceTest.class +com\jojubanking\boot\module\system\service\dept\PostServiceTest.class +com\jojubanking\boot\module\system\service\sms\SmsTemplateServiceTest.class +com\jojubanking\boot\module\system\service\oauth2\OAuth2CodeServiceImplTest.class +com\jojubanking\boot\module\system\service\userinfo\UserInfoServiceImplTest.class +com\jojubanking\boot\module\system\service\permission\PermissionServiceTest.class diff --git a/joju-module-system/joju-module-system-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/joju-module-system/joju-module-system-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..88980e7 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1,29 @@ +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\permission\MenuServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\auth\AdminAuthServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\dept\PostServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\controller\admin\oauth2\OAuth2OpenControllerTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2GrantServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\permission\PermissionServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\notice\NoticeServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2ClientServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2TokenServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\permission\RoleServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\tenant\TenantPackageServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\logger\OperateLogServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2ApproveServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\sms\SmsLogServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\sms\SmsChannelServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\tenant\TenantServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\sms\SmsTemplateServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\userinfo\UserInfoServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\errorcode\ErrorCodeServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\oauth2\OAuth2CodeServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\social\SocialUserServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\dict\DictTypeServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\sms\SmsSendServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\user\AdminUserServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\logger\LoginLogServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\sensitiveword\SensitiveWordServiceImplTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\dict\DictDataServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\dept\DeptServiceTest.java +D:\^新版项目\05.九聚项目\32.库尔勒妇幼二期\体检上门\tjsm\joju-module-system\joju-module-system-biz\src\test\java\com\jojubanking\boot\module\system\service\common\CaptchaServiceTest.java diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/application-unit-test.yaml b/joju-module-system/joju-module-system-biz/target/test-classes/application-unit-test.yaml new file mode 100644 index 0000000..ab991b6 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/test-classes/application-unit-test.yaml @@ -0,0 +1,55 @@ +spring: + main: + lazy-initialization: true # 开启懒加载,加快速度 + banner-mode: off # 单元测试,禁用 Banner + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + datasource: + name: ruoyi-vue-pro + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写 + driver-class-name: org.h2.Driver + username: sa + password: + druid: + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度 + initial-size: 1 # 单元测试,配置为 1,提升启动速度 + sql: + init: + schema-locations: classpath:/sql/create_tables.sql + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: 127.0.0.1 # 地址 + port: 16379 # 端口(单元测试,使用 16379 端口) + database: 0 # 数据库索引 + + +mybatis: + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 + +--- #################### 定时任务相关配置 #################### + +--- #################### 配置中心相关配置 #################### + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项(单元测试,禁用 Lock4j) + +# Resilience4j 配置项 + +--- #################### 监控相关配置 #################### + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +joju: + info: + base-package: com.jojubanking.boot.module + captcha: + timeout: 5m + width: 160 + height: 60 + enable: true diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenControllerTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenControllerTest.class new file mode 100644 index 0000000..96511ee Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/controller/admin/oauth2/OAuth2OpenControllerTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/auth/AdminAuthServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/auth/AdminAuthServiceImplTest.class new file mode 100644 index 0000000..95f995b Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/auth/AdminAuthServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/common/CaptchaServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/common/CaptchaServiceTest.class new file mode 100644 index 0000000..1d8b2ef Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/common/CaptchaServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/dept/DeptServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/dept/DeptServiceTest.class new file mode 100644 index 0000000..93f9406 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/dept/DeptServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/dept/PostServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/dept/PostServiceTest.class new file mode 100644 index 0000000..1db6c95 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/dept/PostServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/dict/DictDataServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/dict/DictDataServiceTest.class new file mode 100644 index 0000000..8b49acb Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/dict/DictDataServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/dict/DictTypeServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/dict/DictTypeServiceTest.class new file mode 100644 index 0000000..d2c8683 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/dict/DictTypeServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeServiceTest.class new file mode 100644 index 0000000..bf235c5 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/errorcode/ErrorCodeServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/logger/LoginLogServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/logger/LoginLogServiceImplTest.class new file mode 100644 index 0000000..b677923 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/logger/LoginLogServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/logger/OperateLogServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/logger/OperateLogServiceImplTest.class new file mode 100644 index 0000000..eeca942 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/logger/OperateLogServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/notice/NoticeServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/notice/NoticeServiceImplTest.class new file mode 100644 index 0000000..1a118ad Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/notice/NoticeServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveServiceImplTest.class new file mode 100644 index 0000000..4cc838c Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ApproveServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientServiceImplTest.class new file mode 100644 index 0000000..7fed640 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2ClientServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeServiceImplTest.class new file mode 100644 index 0000000..2f036e1 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2CodeServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantServiceImplTest.class new file mode 100644 index 0000000..f4de1cf Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2GrantServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenServiceImplTest.class new file mode 100644 index 0000000..dc40e26 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/oauth2/OAuth2TokenServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/permission/MenuServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/permission/MenuServiceTest.class new file mode 100644 index 0000000..2ea92c8 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/permission/MenuServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceTest.class new file mode 100644 index 0000000..d5e646f Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/permission/PermissionServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/permission/RoleServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/permission/RoleServiceTest.class new file mode 100644 index 0000000..f32ab03 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/permission/RoleServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordServiceImplTest.class new file mode 100644 index 0000000..01d4b5d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sensitiveword/SensitiveWordServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sms/SmsChannelServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sms/SmsChannelServiceTest.class new file mode 100644 index 0000000..c457402 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sms/SmsChannelServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sms/SmsLogServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sms/SmsLogServiceTest.class new file mode 100644 index 0000000..d65b4c4 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sms/SmsLogServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sms/SmsSendServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sms/SmsSendServiceTest.class new file mode 100644 index 0000000..83a14cc Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sms/SmsSendServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sms/SmsTemplateServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sms/SmsTemplateServiceTest.class new file mode 100644 index 0000000..7cec889 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/sms/SmsTemplateServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/social/SocialUserServiceTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/social/SocialUserServiceTest.class new file mode 100644 index 0000000..0d85c42 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/social/SocialUserServiceTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/tenant/TenantPackageServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/tenant/TenantPackageServiceImplTest.class new file mode 100644 index 0000000..ef3e0e3 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/tenant/TenantPackageServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/tenant/TenantServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/tenant/TenantServiceImplTest.class new file mode 100644 index 0000000..6dfd94d Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/tenant/TenantServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/user/AdminUserServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/user/AdminUserServiceImplTest.class new file mode 100644 index 0000000..0e72c76 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/user/AdminUserServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/userinfo/UserInfoServiceImplTest.class b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/userinfo/UserInfoServiceImplTest.class new file mode 100644 index 0000000..a9e9fd6 Binary files /dev/null and b/joju-module-system/joju-module-system-biz/target/test-classes/com/jojubanking/boot/module/system/service/userinfo/UserInfoServiceImplTest.class differ diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/logback.xml b/joju-module-system/joju-module-system-biz/target/test-classes/logback.xml new file mode 100644 index 0000000..daf756b --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/test-classes/logback.xml @@ -0,0 +1,4 @@ + + + + diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/sql/clean.sql b/joju-module-system/joju-module-system-biz/target/test-classes/sql/clean.sql new file mode 100644 index 0000000..b13b191 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/test-classes/sql/clean.sql @@ -0,0 +1,27 @@ +DELETE FROM "system_dept"; +DELETE FROM "system_dict_data"; +DELETE FROM "system_role"; +DELETE FROM "system_role_menu"; +DELETE FROM "system_menu"; +DELETE FROM "system_user_role"; +DELETE FROM "system_user_post"; +DELETE FROM "system_dict_type"; +DELETE FROM "system_user_session"; +DELETE FROM "system_post"; +DELETE FROM "system_login_log"; +DELETE FROM "system_operate_log"; +DELETE FROM "system_users"; +DELETE FROM "system_sms_channel"; +DELETE FROM "system_sms_template"; +DELETE FROM "system_sms_log"; +DELETE FROM "system_error_code"; +DELETE FROM "system_social_user"; +DELETE FROM "system_social_user_bind"; +DELETE FROM "system_tenant"; +DELETE FROM "system_tenant_package"; +DELETE FROM "system_sensitive_word"; +DELETE FROM "system_oauth2_client"; +DELETE FROM "system_oauth2_approve"; +DELETE FROM "system_oauth2_access_token"; +DELETE FROM "system_oauth2_refresh_token"; +DELETE FROM "system_oauth2_code"; diff --git a/joju-module-system/joju-module-system-biz/target/test-classes/sql/create_tables.sql b/joju-module-system/joju-module-system-biz/target/test-classes/sql/create_tables.sql new file mode 100644 index 0000000..56fc427 --- /dev/null +++ b/joju-module-system/joju-module-system-biz/target/test-classes/sql/create_tables.sql @@ -0,0 +1,567 @@ +CREATE TABLE IF NOT EXISTS "system_dept" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL DEFAULT '', + "parent_id" bigint NOT NULL DEFAULT '0', + "sort" int NOT NULL DEFAULT '0', + "leader_user_id" bigint DEFAULT NULL, + "phone" varchar(11) DEFAULT NULL, + "email" varchar(50) DEFAULT NULL, + "status" tinyint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '部门表'; + +CREATE TABLE IF NOT EXISTS "system_dict_data" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "sort" int NOT NULL DEFAULT '0', + "label" varchar(100) NOT NULL DEFAULT '', + "value" varchar(100) NOT NULL DEFAULT '', + "dict_type" varchar(100) NOT NULL DEFAULT '', + "status" tinyint NOT NULL DEFAULT '0', + "color_type" varchar(100) NOT NULL DEFAULT '', + "css_class" varchar(100) NOT NULL DEFAULT '', + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典数据表'; + +CREATE TABLE IF NOT EXISTS "system_role" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL, + "code" varchar(100) NOT NULL, + "sort" int NOT NULL, + "data_scope" tinyint NOT NULL DEFAULT '1', + "data_scope_dept_ids" varchar(500) NOT NULL DEFAULT '', + "status" tinyint NOT NULL, + "type" tinyint NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '角色信息表'; + +CREATE TABLE IF NOT EXISTS "system_role_menu" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "role_id" bigint NOT NULL, + "menu_id" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '角色和菜单关联表'; + +CREATE TABLE IF NOT EXISTS "system_menu" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(50) NOT NULL, + "permission" varchar(100) NOT NULL DEFAULT '', + "type" tinyint NOT NULL, + "sort" int NOT NULL DEFAULT '0', + "parent_id" bigint NOT NULL DEFAULT '0', + "path" varchar(200) DEFAULT '', + "icon" varchar(100) DEFAULT '#', + "component" varchar(255) DEFAULT NULL, + "status" tinyint NOT NULL DEFAULT '0', + "visible" bit NOT NULL DEFAULT TRUE, + "keep_alive" bit NOT NULL DEFAULT TRUE, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '菜单权限表'; + +CREATE TABLE IF NOT EXISTS "system_user_role" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "role_id" bigint NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp DEFAULT NULL, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp DEFAULT NULL, + "deleted" bit DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '用户和角色关联表'; + +CREATE TABLE IF NOT EXISTS "system_dict_type" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(100) NOT NULL DEFAULT '', + "type" varchar(100) NOT NULL DEFAULT '', + "status" tinyint NOT NULL DEFAULT '0', + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '字典类型表'; + +CREATE TABLE IF NOT EXISTS `system_user_session` ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `token` varchar(32) NOT NULL, + `user_id` bigint DEFAULT NULL, + "user_type" tinyint NOT NULL, + `username` varchar(50) NOT NULL DEFAULT '', + `user_ip` varchar(50) DEFAULT NULL, + `user_agent` varchar(512) DEFAULT NULL, + `session_timeout` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '' , + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT '用户在线 Session'; + +CREATE TABLE IF NOT EXISTS "system_post" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "code" varchar(64) NOT NULL, + "name" varchar(50) NOT NULL, + "sort" integer NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(500) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY ("id") +) COMMENT '岗位信息表'; + +CREATE TABLE IF NOT EXISTS `system_user_post`( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint DEFAULT NULL, + "post_id" bigint DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT ='用户岗位表'; + + +CREATE TABLE IF NOT EXISTS "system_notice" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "title" varchar(50) NOT NULL COMMENT '公告标题', + "content" text NOT NULL COMMENT '公告内容', + "type" tinyint NOT NULL COMMENT '公告类型(1通知 2公告)', + "status" tinyint NOT NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + "creator" varchar(64) DEFAULT '' COMMENT '创建者', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" varchar(64) DEFAULT '' COMMENT '更新者', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" bit NOT NULL DEFAULT 0 COMMENT '是否删除', + "tenant_id" bigint not null default '0', + PRIMARY KEY("id") +) COMMENT '通知公告表'; + +CREATE TABLE IF NOT EXISTS `system_login_log` ( + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `log_type` bigint(4) NOT NULL, + "user_id" bigint not null default '0', + "user_type" tinyint NOT NULL, + `trace_id` varchar(64) NOT NULL DEFAULT '', + `username` varchar(50) NOT NULL DEFAULT '', + `result` tinyint(4) NOT NULL, + `user_ip` varchar(50) NOT NULL, + `user_agent` varchar(512) NOT NULL, + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) COMMENT ='系统访问记录'; + +CREATE TABLE IF NOT EXISTS `system_operate_log` ( + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, + `trace_id` varchar(64) NOT NULL DEFAULT '', + `user_id` bigint(20) NOT NULL, + "user_type" tinyint not null default '0', + `module` varchar(50) NOT NULL, + `name` varchar(50) NOT NULL, + `type` bigint(4) NOT NULL DEFAULT '0', + `content` varchar(2000) NOT NULL DEFAULT '', + `exts` varchar(512) NOT NULL DEFAULT '', + `request_method` varchar(16) DEFAULT '', + `request_url` varchar(255) DEFAULT '', + `user_ip` varchar(50) DEFAULT NULL, + `user_agent` varchar(200) DEFAULT NULL, + `java_method` varchar(512) NOT NULL DEFAULT '', + `java_method_args` varchar(8000) DEFAULT '', + `start_time` datetime NOT NULL, + `duration` int(11) NOT NULL, + `result_code` int(11) NOT NULL DEFAULT '0', + `result_msg` varchar(512) DEFAULT '', + `result_data` varchar(4000) DEFAULT '', + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT '0', + "tenant_id" bigint not null default '0', + PRIMARY KEY (`id`) +) COMMENT ='操作日志记录'; + +CREATE TABLE IF NOT EXISTS "system_users" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "username" varchar(30) not null, + "password" varchar(100) not null default '', + "nickname" varchar(30) not null, + "remark" varchar(500) default null, + "dept_id" bigint default null, + "post_ids" varchar(255) default null, + "email" varchar(50) default '', + "mobile" varchar(11) default '', + "sex" tinyint default '0', + "avatar" varchar(100) default '', + "status" tinyint not null default '0', + "login_ip" varchar(50) default '', + "login_date" timestamp default null, + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) comment '用户信息表'; + +CREATE TABLE IF NOT EXISTS "inf_api_access_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null default '', + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null default '', + "request_url" varchar(255) not null default '', + "request_params" varchar(8000) not null default '', + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "begin_time" timestamp not null, + "end_time" timestamp not null, + "duration" integer not null, + "result_code" integer not null default '0', + "result_msg" varchar(512) default '', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) COMMENT 'API 访问日志表'; + +CREATE TABLE IF NOT EXISTS "inf_api_error_log" ( + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY, + "trace_id" varchar(64) not null, + "user_id" bigint not null default '0', + "user_type" tinyint not null default '0', + "application_name" varchar(50) not null, + "request_method" varchar(16) not null, + "request_url" varchar(255) not null, + "request_params" varchar(8000) not null, + "user_ip" varchar(50) not null, + "user_agent" varchar(512) not null, + "exception_time" timestamp not null, + "exception_name" varchar(128) not null default '', + "exception_message" clob not null, + "exception_root_cause_message" clob not null, + "exception_stack_trace" clob not null, + "exception_class_name" varchar(512) not null, + "exception_file_name" varchar(512) not null, + "exception_method_name" varchar(512) not null, + "exception_line_number" integer not null, + "process_status" tinyint not null, + "process_time" timestamp default null, + "process_user_id" bigint default '0', + "creator" varchar(64) default '', + "create_time" timestamp not null default current_timestamp, + "updater" varchar(64) default '', + "update_time" timestamp not null default current_timestamp, + "deleted" bit not null default false, + "tenant_id" bigint not null default '0', + primary key ("id") +) COMMENT '系统异常日志'; + +CREATE TABLE IF NOT EXISTS "system_sms_channel" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "signature" varchar(10) NOT NULL, + "code" varchar(63) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "api_key" varchar(63) NOT NULL, + "api_secret" varchar(63) DEFAULT NULL, + "callback_url" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信渠道'; + +CREATE TABLE IF NOT EXISTS "system_sms_template" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL, + "status" tinyint NOT NULL, + "code" varchar(63) NOT NULL, + "name" varchar(63) NOT NULL, + "content" varchar(255) NOT NULL, + "params" varchar(255) NOT NULL, + "remark" varchar(255) DEFAULT NULL, + "api_template_id" varchar(63) NOT NULL, + "channel_id" bigint NOT NULL, + "channel_code" varchar(63) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信模板'; + +CREATE TABLE IF NOT EXISTS "system_sms_log" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "channel_id" bigint NOT NULL, + "channel_code" varchar(63) NOT NULL, + "template_id" bigint NOT NULL, + "template_code" varchar(63) NOT NULL, + "template_type" tinyint NOT NULL, + "template_content" varchar(255) NOT NULL, + "template_params" varchar(255) NOT NULL, + "api_template_id" varchar(63) NOT NULL, + "mobile" varchar(11) NOT NULL, + "user_id" bigint DEFAULT '0', + "user_type" tinyint DEFAULT '0', + "send_status" tinyint NOT NULL DEFAULT '0', + "send_time" timestamp DEFAULT NULL, + "send_code" int DEFAULT NULL, + "send_msg" varchar(255) DEFAULT NULL, + "api_send_code" varchar(63) DEFAULT NULL, + "api_send_msg" varchar(255) DEFAULT NULL, + "api_request_id" varchar(255) DEFAULT NULL, + "api_serial_no" varchar(255) DEFAULT NULL, + "receive_status" tinyint NOT NULL DEFAULT '0', + "receive_time" timestamp DEFAULT NULL, + "api_receive_code" varchar(63) DEFAULT NULL, + "api_receive_msg" varchar(255) DEFAULT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '短信日志'; + +CREATE TABLE IF NOT EXISTS "system_error_code" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL DEFAULT '0', + "application_name" varchar(50) NOT NULL, + "code" int NOT NULL DEFAULT '0', + "message" varchar(512) NOT NULL DEFAULT '', + "memo" varchar(512) DEFAULT '', + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '错误码表'; + +CREATE TABLE IF NOT EXISTS "system_social_user" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "type" tinyint NOT NULL, + "openid" varchar(64) NOT NULL, + "token" varchar(256) DEFAULT NULL, + "raw_token_info" varchar(1024) NOT NULL, + "nickname" varchar(32) NOT NULL, + "avatar" varchar(255) DEFAULT NULL, + "raw_user_info" varchar(1024) NOT NULL, + "code" varchar(64) NOT NULL, + "state" varchar(64), + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '社交用户'; + +CREATE TABLE IF NOT EXISTS "system_social_user_bind" ( + "id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "social_type" tinyint NOT NULL, + "social_user_id" number NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '社交用户的绑定'; + +CREATE TABLE IF NOT EXISTS "system_tenant" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(63) NOT NULL, + "contact_user_id" bigint NOT NULL DEFAULT '0', + "contact_name" varchar(255) NOT NULL, + "contact_mobile" varchar(255), + "status" tinyint NOT NULL, + "domain" varchar(63) DEFAULT '', + "package_id" bigint NOT NULL, + "expire_time" timestamp NOT NULL, + "account_count" int NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '租户'; + +CREATE TABLE IF NOT EXISTS "system_tenant_package" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(30) NOT NULL, + "status" tinyint NOT NULL, + "remark" varchar(256), + "menu_ids" varchar(2048) NOT NULL, + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '租户套餐表'; + +CREATE TABLE IF NOT EXISTS "system_sensitive_word" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "name" varchar(255) NOT NULL, + "tags" varchar(1024) NOT NULL, + "status" bit NOT NULL DEFAULT FALSE, + "description" varchar(512), + "creator" varchar(64) DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar(64) DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT '系统敏感词'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_client" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "client_id" varchar NOT NULL, + "secret" varchar NOT NULL, + "name" varchar NOT NULL, + "logo" varchar NOT NULL, + "description" varchar, + "status" int NOT NULL, + "access_token_validity_seconds" int NOT NULL, + "refresh_token_validity_seconds" int NOT NULL, + "redirect_uris" varchar NOT NULL, + "authorized_grant_types" varchar NOT NULL, + "scopes" varchar NOT NULL DEFAULT '', + "auto_approve_scopes" varchar NOT NULL DEFAULT '', + "authorities" varchar NOT NULL DEFAULT '', + "resource_ids" varchar NOT NULL DEFAULT '', + "additional_information" varchar NOT NULL DEFAULT '', + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 客户端表'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_approve" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "client_id" varchar NOT NULL, + "scope" varchar NOT NULL, + "approved" bit NOT NULL DEFAULT FALSE, + "expires_time" datetime NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 批准表'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_access_token" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "access_token" varchar NOT NULL, + "refresh_token" varchar NOT NULL, + "client_id" varchar NOT NULL, + "scopes" varchar NOT NULL, + "approved" bit NOT NULL DEFAULT FALSE, + "expires_time" datetime NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + "tenant_id" bigint NOT NULL, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 访问令牌'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_refresh_token" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "refresh_token" varchar NOT NULL, + "client_id" varchar NOT NULL, + "scopes" varchar NOT NULL, + "approved" bit NOT NULL DEFAULT FALSE, + "expires_time" datetime NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 刷新令牌'; + +CREATE TABLE IF NOT EXISTS "system_oauth2_code" ( + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, + "user_id" bigint NOT NULL, + "user_type" tinyint NOT NULL, + "code" varchar NOT NULL, + "client_id" varchar NOT NULL, + "scopes" varchar NOT NULL, + "expires_time" datetime NOT NULL, + "redirect_uri" varchar NOT NULL, + "state" varchar NOT NULL, + "creator" varchar DEFAULT '', + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updater" varchar DEFAULT '', + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + "deleted" bit NOT NULL DEFAULT FALSE, + PRIMARY KEY ("id") +) COMMENT 'OAuth2 刷新令牌'; diff --git a/joju-module-system/joju-module-system.iml b/joju-module-system/joju-module-system.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-module-system/joju-module-system.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-module-system/pom.xml b/joju-module-system/pom.xml new file mode 100644 index 0000000..71fd253 --- /dev/null +++ b/joju-module-system/pom.xml @@ -0,0 +1,24 @@ + + + + jojuboot + com.jojubanking.boot + ${revision} + + 4.0.0 + + joju-module-system-api + joju-module-system-biz + + joju-module-system + pom + + ${project.artifactId} + + system 模块下,我们放通用业务,支撑上层的核心业务。 + 例如说:用户、部门、权限、数据字典等等 + + + diff --git a/joju-server/Dockerfile b/joju-server/Dockerfile new file mode 100644 index 0000000..ca117ea --- /dev/null +++ b/joju-server/Dockerfile @@ -0,0 +1,19 @@ +## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性 +## 感谢复旦核博士的建议!灰子哥,牛皮! +FROM eclipse-temurin:8-jre + +## 创建目录,并使用它作为工作目录 +RUN mkdir -p /joju-server +WORKDIR /joju-server +## 将后端项目的 Jar 文件,复制到镜像中 +COPY ./target/joju-server.jar app.jar + +## 设置 TZ 时区 +## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖 +ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m" + +## 暴露后端项目的 48080 端口 +EXPOSE 48080 + +## 启动后端项目 +CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar diff --git a/joju-server/joju-server.iml b/joju-server/joju-server.iml new file mode 100644 index 0000000..78b2cc5 --- /dev/null +++ b/joju-server/joju-server.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/joju-server/lib/aspose-cells-8.5.2.jar b/joju-server/lib/aspose-cells-8.5.2.jar new file mode 100644 index 0000000..d0e1aca Binary files /dev/null and b/joju-server/lib/aspose-cells-8.5.2.jar differ diff --git a/joju-server/lib/aspose-words-15.8.0.jar b/joju-server/lib/aspose-words-15.8.0.jar new file mode 100644 index 0000000..c0e699f Binary files /dev/null and b/joju-server/lib/aspose-words-15.8.0.jar differ diff --git a/joju-server/lib/excel-license.xml b/joju-server/lib/excel-license.xml new file mode 100644 index 0000000..2a69d76 --- /dev/null +++ b/joju-server/lib/excel-license.xml @@ -0,0 +1,13 @@ + + + + Aspose.Total for Java + Aspose.Words for Java + + Enterprise + 20991231 + 20991231 + 8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7 + + sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU= + \ No newline at end of file diff --git a/joju-server/lib/word-license.xml b/joju-server/lib/word-license.xml new file mode 100644 index 0000000..2cbce45 --- /dev/null +++ b/joju-server/lib/word-license.xml @@ -0,0 +1,15 @@ + + + + Aspose.Total for Java + Aspose.Words for Java + + Enterprise + 20991231 + 20991231 + 8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7 + + + sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU= + + diff --git a/joju-server/pom.xml b/joju-server/pom.xml new file mode 100644 index 0000000..46ea897 --- /dev/null +++ b/joju-server/pom.xml @@ -0,0 +1,114 @@ + + + + jojuboot + com.jojubanking.boot + ${revision} + + 4.0.0 + + tjsm-server + jar + + ${project.artifactId} + + 后端 Server 的主项目,通过引入需要 joju-module-xxx 的依赖, + 从而实现提供 RESTful API 给 joju-ui-admin、joju-ui-user 等前端项目。 + 本质上来说,它就是个空壳(容器)! + + https://www.jojubanking.com + + + + + + + + com.jojubanking.boot + joju-module-system-biz + ${revision} + + + com.jojubanking.boot + joju-module-infra-biz + ${revision} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + com.jojubanking.boot + joju-spring-boot-starter-biz-error-code + + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + com.jojubanking.boot + joju-spring-boot-starter-banner + + + + + com.jojubanking.boot + joju-spring-boot-starter-protection + + + + + + + ${project.artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + 2.6.7 + + true + + + + + + repackage + + + + + + + + + diff --git a/joju-server/src/main/java/com/jojubanking/boot/server/JojuServerApplication.java b/joju-server/src/main/java/com/jojubanking/boot/server/JojuServerApplication.java new file mode 100644 index 0000000..060bbfc --- /dev/null +++ b/joju-server/src/main/java/com/jojubanking/boot/server/JojuServerApplication.java @@ -0,0 +1,22 @@ +package com.jojubanking.boot.server; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 项目的启动类 + * + * + * @author TW + */ +@SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${joju.info.base-package} +@SpringBootApplication(scanBasePackages = {"${joju.info.base-package}.server", "${joju.info.base-package}.module"}) +public class JojuServerApplication { + + public static void main(String[] args) { + + SpringApplication.run(JojuServerApplication.class, args); + + } + +} diff --git a/joju-server/src/main/java/com/jojubanking/boot/server/MybatisAspectj.java b/joju-server/src/main/java/com/jojubanking/boot/server/MybatisAspectj.java new file mode 100644 index 0000000..36ab84c --- /dev/null +++ b/joju-server/src/main/java/com/jojubanking/boot/server/MybatisAspectj.java @@ -0,0 +1,37 @@ +package com.jojubanking.boot.server; + +import com.baomidou.mybatisplus.core.conditions.AbstractWrapper; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +/** + * @ClassName: MybatisAspectj + * @Description: + * @Author T.W + * @Date 2023/4/4 + * @Version 1.0 + */ +@Aspect +@Component +public class MybatisAspectj { + + // 配置织入点 +// package com.jojubanking.boot.framework.mybatis.core.mapper.selectOne + + //? + @Pointcut("execution(public * com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(..))") + public void selectOneAspect() { + } + + @Before("selectOneAspect()") + public void beforeSelect(JoinPoint point) { + Object arg = point.getArgs()[0]; + if (arg instanceof AbstractWrapper) { + arg = (AbstractWrapper) arg; + ((AbstractWrapper) arg).last("limit 1"); + } + } +} diff --git a/joju-server/src/main/java/com/jojubanking/boot/server/framework/package-info.java b/joju-server/src/main/java/com/jojubanking/boot/server/framework/package-info.java new file mode 100644 index 0000000..c9d6b5b --- /dev/null +++ b/joju-server/src/main/java/com/jojubanking/boot/server/framework/package-info.java @@ -0,0 +1,6 @@ +/** + * 属于整个 joju-server 的 framework 封装 + * + * @author TW + */ +package com.jojubanking.boot.server.framework; diff --git a/joju-server/src/main/java/com/jojubanking/boot/server/framework/ui/config/AdminUiConfiguration.java b/joju-server/src/main/java/com/jojubanking/boot/server/framework/ui/config/AdminUiConfiguration.java new file mode 100644 index 0000000..7bb216a --- /dev/null +++ b/joju-server/src/main/java/com/jojubanking/boot/server/framework/ui/config/AdminUiConfiguration.java @@ -0,0 +1,35 @@ +package com.jojubanking.boot.server.framework.ui.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * joju-admin-ui 的配置类 + * + * @author TW + */ +@Configuration +public class AdminUiConfiguration implements WebMvcConfigurer { + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/admin-ui/**", "/admin-ui/", "/admin-ui") + .addResourceLocations("classpath:/admin-ui/") + // 自定义 ClassPathResource 实现类,在前端请求的地址匹配不到对应的路径时,强制使用 /admin-ui/index.html 资源 + // 本质上,等价于 nginx 在处理不到 Vue 的请求地址时,try_files 到 index.html 地址 + // 想要彻底理解,可以调试 ResourceHttpRequestHandler 的 resolveResourceLocations 方法,前端请求 /admin-ui/system/tenant 地址 + .addResourceLocations(new ClassPathResource("/admin-ui/index.html") { + + @Override + public Resource createRelative(String relativePath) { + return this; + } + + }) + ; + } + +} diff --git a/joju-server/src/main/java/com/jojubanking/boot/server/framework/ui/core/AdminUiController.java b/joju-server/src/main/java/com/jojubanking/boot/server/framework/ui/core/AdminUiController.java new file mode 100644 index 0000000..84e8481 --- /dev/null +++ b/joju-server/src/main/java/com/jojubanking/boot/server/framework/ui/core/AdminUiController.java @@ -0,0 +1,11 @@ +package com.jojubanking.boot.server.framework.ui.core; + +import org.springframework.boot.web.servlet.error.ErrorController; + +//@Controller +//@RequestMapping("/admin-ui/") +public class AdminUiController implements ErrorController { + +// public String + +} diff --git a/joju-server/src/main/java/com/jojubanking/boot/server/framework/ui/package-info.java b/joju-server/src/main/java/com/jojubanking/boot/server/framework/ui/package-info.java new file mode 100644 index 0000000..fad9b66 --- /dev/null +++ b/joju-server/src/main/java/com/jojubanking/boot/server/framework/ui/package-info.java @@ -0,0 +1,7 @@ +/** + * 目的:解决后端开发,不太擅长 node 环境的配置,导致启动 joju-ui-admin 项目一直失败 + * 所以,本项目将 joju-ui-admin 项目通过 npm run build:demo1024 的方式,将它构建成静态资源, + * 然后,使用 Spring Boot 作为静态资源服务器,进行启动访问。 + * 注意,这个项目仅仅作为后端开发的快速体验,并不要部署到生产环境!!! + */ +package com.jojubanking.boot.server.framework.ui; diff --git a/joju-server/src/main/resources/admin-ui/favicon.ico b/joju-server/src/main/resources/admin-ui/favicon.ico new file mode 100644 index 0000000..e263760 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/favicon.ico differ diff --git a/joju-server/src/main/resources/admin-ui/html/ie.html b/joju-server/src/main/resources/admin-ui/html/ie.html new file mode 100644 index 0000000..5775546 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/html/ie.html @@ -0,0 +1,45 @@ + + + + + 请升级您的浏览器 + + + + + + +

请升级您的浏览器,以便我们更好的为您提供服务!

+

您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。

+
+

请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束

+

自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明

+
+

您可以选择更先进的浏览器

+

推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。

+ +
+ + diff --git a/joju-server/src/main/resources/admin-ui/index.html b/joju-server/src/main/resources/admin-ui/index.html new file mode 100644 index 0000000..914db71 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/index.html @@ -0,0 +1,208 @@ + + + + + + + + + 外币兑换管理系统 + + + + +
+
+
+
+
+
正在加载系统资源,请耐心等待
+
+
+ + diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/base/browser/ui/codicons/codicon/codicon.ttf b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/base/browser/ui/codicons/codicon/codicon.ttf new file mode 100644 index 0000000..b546c0a Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/base/browser/ui/codicons/codicon/codicon.ttf differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/base/worker/workerMain.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/base/worker/workerMain.js new file mode 100644 index 0000000..1a433ee --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/base/worker/workerMain.js @@ -0,0 +1,12 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/(function(){var z=["require","exports","vs/base/common/platform","vs/editor/common/core/position","vs/base/common/errors","vs/base/common/strings","vs/editor/common/core/range","vs/base/common/lifecycle","vs/base/common/stopwatch","vs/base/common/event","vs/base/common/diff/diff","vs/base/common/types","vs/base/common/uint","vs/base/common/uri","vs/base/common/arrays","vs/base/common/diff/diffChange","vs/base/common/iterator","vs/base/common/keyCodes","vs/base/common/linkedList","vs/base/common/process","vs/base/common/path","vs/base/common/cancellation","vs/base/common/hash","vs/editor/common/core/characterClassifier","vs/editor/common/core/selection","vs/editor/common/core/token","vs/editor/common/diff/diffComputer","vs/editor/common/model/wordHelper","vs/editor/common/modes/linkComputer","vs/editor/common/modes/supports/inplaceReplaceSupport","vs/editor/common/standalone/standaloneEnums","vs/editor/common/standalone/standaloneBase","vs/editor/common/viewModel/prefixSumComputer","vs/editor/common/model/mirrorTextModel","vs/base/common/worker/simpleWorker","vs/editor/common/services/editorSimpleWorker"],G=function(I){for(var t=[],p=0,P=I.length;p=0?!0:typeof process!="undefined"?process.platform==="win32":!1},p}();I.Environment=t})(X||(X={}));var X;(function(I){var t=function(){function E(u,d,l){this.type=u,this.detail=d,this.timestamp=l}return E}();I.LoaderEvent=t;var p=function(){function E(u){this._events=[new t(1,"",u)]}return E.prototype.record=function(u,d){this._events.push(new t(u,d,I.Utilities.getHighPerformanceTimestamp()))},E.prototype.getEvents=function(){return this._events},E}();I.LoaderEventRecorder=p;var P=function(){function E(){}return E.prototype.record=function(u,d){},E.prototype.getEvents=function(){return[]},E.INSTANCE=new E,E}();I.NullLoaderEventRecorder=P})(X||(X={}));var X;(function(I){var t=function(){function p(){}return p.fileUriToFilePath=function(P,E){if(E=decodeURI(E).replace(/%23/g,"#"),P){if(/^file:\/\/\//.test(E))return E.substr(8);if(/^file:\/\//.test(E))return E.substr(5)}else if(/^file:\/\//.test(E))return E.substr(7);return E},p.startsWith=function(P,E){return P.length>=E.length&&P.substr(0,E.length)===E},p.endsWith=function(P,E){return P.length>=E.length&&P.substr(P.length-E.length)===E},p.containsQueryString=function(P){return/^[^\#]*\?/gi.test(P)},p.isAbsolutePath=function(P){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(P)},p.forEachProperty=function(P,E){if(P){var u=void 0;for(u in P)P.hasOwnProperty(u)&&E(u,P[u])}},p.isEmpty=function(P){var E=!0;return p.forEachProperty(P,function(){E=!1}),E},p.recursiveClone=function(P){if(!P||typeof P!="object"||P instanceof RegExp||!Array.isArray(P)&&Object.getPrototypeOf(P)!==Object.prototype)return P;var E=Array.isArray(P)?[]:{};return p.forEachProperty(P,function(u,d){d&&typeof d=="object"?E[u]=p.recursiveClone(d):E[u]=d}),E},p.generateAnonymousModule=function(){return"===anonymous"+p.NEXT_ANONYMOUS_ID+++"==="},p.isAnonymousModule=function(P){return p.startsWith(P,"===anonymous")},p.getHighPerformanceTimestamp=function(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=I.global.performance&&typeof I.global.performance.now=="function"),this.HAS_PERFORMANCE_NOW?I.global.performance.now():Date.now()},p.NEXT_ANONYMOUS_ID=1,p.PERFORMANCE_NOW_PROBED=!1,p.HAS_PERFORMANCE_NOW=!1,p}();I.Utilities=t})(X||(X={}));var X;(function(I){function t(E){if(E instanceof Error)return E;var u=new Error(E.message||String(E)||"Unknown Error");return E.stack&&(u.stack=E.stack),u}I.ensureError=t;var p=function(){function E(){}return E.validateConfigurationOptions=function(u){function d(s){if(s.phase==="loading"){console.error('Loading "'+s.moduleId+'" failed'),console.error(s),console.error("Here are the modules that depend on it:"),console.error(s.neededBy);return}if(s.phase==="factory"){console.error('The factory method of "'+s.moduleId+'" has thrown an exception'),console.error(s);return}}if(u=u||{},typeof u.baseUrl!="string"&&(u.baseUrl=""),typeof u.isBuild!="boolean"&&(u.isBuild=!1),typeof u.paths!="object"&&(u.paths={}),typeof u.config!="object"&&(u.config={}),typeof u.catchError=="undefined"&&(u.catchError=!1),typeof u.recordStats=="undefined"&&(u.recordStats=!1),typeof u.urlArgs!="string"&&(u.urlArgs=""),typeof u.onError!="function"&&(u.onError=d),Array.isArray(u.ignoreDuplicateModules)||(u.ignoreDuplicateModules=[]),u.baseUrl.length>0&&(I.Utilities.endsWith(u.baseUrl,"/")||(u.baseUrl+="/")),typeof u.cspNonce!="string"&&(u.cspNonce=""),typeof u.preferScriptTags=="undefined"&&(u.preferScriptTags=!1),Array.isArray(u.nodeModules)||(u.nodeModules=[]),u.nodeCachedData&&typeof u.nodeCachedData=="object"&&(typeof u.nodeCachedData.seed!="string"&&(u.nodeCachedData.seed="seed"),(typeof u.nodeCachedData.writeDelay!="number"||u.nodeCachedData.writeDelay<0)&&(u.nodeCachedData.writeDelay=1e3*7),!u.nodeCachedData.path||typeof u.nodeCachedData.path!="string")){var l=t(new Error("INVALID cached data configuration, 'path' MUST be set"));l.phase="configuration",u.onError(l),u.nodeCachedData=void 0}return u},E.mergeConfigurationOptions=function(u,d){u===void 0&&(u=null),d===void 0&&(d=null);var l=I.Utilities.recursiveClone(d||{});return I.Utilities.forEachProperty(u,function(s,h){s==="ignoreDuplicateModules"&&typeof l.ignoreDuplicateModules!="undefined"?l.ignoreDuplicateModules=l.ignoreDuplicateModules.concat(h):s==="paths"&&typeof l.paths!="undefined"?I.Utilities.forEachProperty(h,function(w,a){return l.paths[w]=a}):s==="config"&&typeof l.config!="undefined"?I.Utilities.forEachProperty(h,function(w,a){return l.config[w]=a}):l[s]=I.Utilities.recursiveClone(h)}),E.validateConfigurationOptions(l)},E}();I.ConfigurationOptionsUtil=p;var P=function(){function E(u,d){if(this._env=u,this.options=p.mergeConfigurationOptions(d),this._createIgnoreDuplicateModulesMap(),this._createNodeModulesMap(),this._createSortedPathsRules(),this.options.baseUrl===""){if(this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename&&this._env.isNode){var l=this.options.nodeRequire.main.filename,s=Math.max(l.lastIndexOf("/"),l.lastIndexOf("\\"));this.options.baseUrl=l.substring(0,s+1)}if(this.options.nodeMain&&this._env.isNode){var l=this.options.nodeMain,s=Math.max(l.lastIndexOf("/"),l.lastIndexOf("\\"));this.options.baseUrl=l.substring(0,s+1)}}}return E.prototype._createIgnoreDuplicateModulesMap=function(){this.ignoreDuplicateModulesMap={};for(var u=0;u=5)){if(_.length0?(C=_.slice(0,16),v=_.slice(16),w.record(60,h)):w.record(61,h),r()})}},l.prototype._verifyCachedData=function(s,h,w,a,S){var v=this;!a||s.cachedDataRejected||setTimeout(function(){var C=v._crypto.createHash("md5").update(h,"utf8").digest();a.equals(C)||(S.getConfig().onError(new Error("FAILED TO VERIFY CACHED DATA, deleting stale '"+w+"' now, but a RESTART IS REQUIRED")),v._fs.unlink(w,function(n){n&&S.getConfig().onError(n)}))},Math.ceil(5e3*(1+Math.random())))},l._BOM=65279,l._PREFIX="(function (require, define, __filename, __dirname) { ",l._SUFFIX=` +});`,l}();function u(l,s){if(s.__$__isRecorded)return s;var h=function(a){l.record(33,a);try{return s(a)}finally{l.record(34,a)}};return h.__$__isRecorded=!0,h}I.ensureRecordedNodeRequire=u;function d(l){return new t(l)}I.createScriptLoader=d})(X||(X={}));var X;(function(I){var t=function(){function l(s){var h=s.lastIndexOf("/");h!==-1?this.fromModulePath=s.substr(0,h+1):this.fromModulePath=""}return l._normalizeModuleId=function(s){var h=s,w;for(w=/\/\.\//;w.test(h);)h=h.replace(w,"/");for(h=h.replace(/^\.\//g,""),w=/\/(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//;w.test(h);)h=h.replace(w,"/");return h=h.replace(/^(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//,""),h},l.prototype.resolveModule=function(s){var h=s;return I.Utilities.isAbsolutePath(h)||(I.Utilities.startsWith(h,"./")||I.Utilities.startsWith(h,"../"))&&(h=l._normalizeModuleId(this.fromModulePath+h)),h},l.ROOT=new l(""),l}();I.ModuleIdResolver=t;var p=function(){function l(s,h,w,a,S,v){this.id=s,this.strId=h,this.dependencies=w,this._callback=a,this._errorback=S,this.moduleIdResolver=v,this.exports={},this.error=null,this.exportsPassedIn=!1,this.unresolvedDependenciesCount=this.dependencies.length,this._isComplete=!1}return l._safeInvokeFunction=function(s,h){try{return{returnedValue:s.apply(I.global,h),producedError:null}}catch(w){return{returnedValue:null,producedError:w}}},l._invokeFactory=function(s,h,w,a){return s.isBuild()&&!I.Utilities.isAnonymousModule(h)?{returnedValue:null,producedError:null}:s.shouldCatchError()?this._safeInvokeFunction(w,a):{returnedValue:w.apply(I.global,a),producedError:null}},l.prototype.complete=function(s,h,w){this._isComplete=!0;var a=null;if(this._callback)if(typeof this._callback=="function"){s.record(21,this.strId);var S=l._invokeFactory(h,this.strId,this._callback,w);a=S.producedError,s.record(22,this.strId),!a&&typeof S.returnedValue!="undefined"&&(!this.exportsPassedIn||I.Utilities.isEmpty(this.exports))&&(this.exports=S.returnedValue)}else this.exports=this._callback;if(a){var v=I.ensureError(a);v.phase="factory",v.moduleId=this.strId,this.error=v,h.onError(v)}this.dependencies=null,this._callback=null,this._errorback=null,this.moduleIdResolver=null},l.prototype.onDependencyError=function(s){return this._isComplete=!0,this.error=s,this._errorback?(this._errorback(s),!0):!1},l.prototype.isComplete=function(){return this._isComplete},l}();I.Module=p;var P=function(){function l(){this._nextId=0,this._strModuleIdToIntModuleId=new Map,this._intModuleIdToStrModuleId=[],this.getModuleId("exports"),this.getModuleId("module"),this.getModuleId("require")}return l.prototype.getMaxModuleId=function(){return this._nextId},l.prototype.getModuleId=function(s){var h=this._strModuleIdToIntModuleId.get(s);return typeof h=="undefined"&&(h=this._nextId++,this._strModuleIdToIntModuleId.set(s,h),this._intModuleIdToStrModuleId[h]=s),h},l.prototype.getStrModuleId=function(s){return this._intModuleIdToStrModuleId[s]},l}(),E=function(){function l(s){this.id=s}return l.EXPORTS=new l(0),l.MODULE=new l(1),l.REQUIRE=new l(2),l}();I.RegularDependency=E;var u=function(){function l(s,h,w){this.id=s,this.pluginId=h,this.pluginParam=w}return l}();I.PluginDependency=u;var d=function(){function l(s,h,w,a,S){S===void 0&&(S=0),this._env=s,this._scriptLoader=h,this._loaderAvailableTimestamp=S,this._defineFunc=w,this._requireFunc=a,this._moduleIdProvider=new P,this._config=new I.Configuration(this._env),this._hasDependencyCycle=!1,this._modules2=[],this._knownModules2=[],this._inverseDependencies2=[],this._inversePluginDependencies2=new Map,this._currentAnnonymousDefineCall=null,this._recorder=null,this._buildInfoPath=[],this._buildInfoDefineStack=[],this._buildInfoDependencies=[]}return l.prototype.reset=function(){return new l(this._env,this._scriptLoader,this._defineFunc,this._requireFunc,this._loaderAvailableTimestamp)},l.prototype.getGlobalAMDDefineFunc=function(){return this._defineFunc},l.prototype.getGlobalAMDRequireFunc=function(){return this._requireFunc},l._findRelevantLocationInStack=function(s,h){for(var w=function(i){return i.replace(/\\/g,"/")},a=w(s),S=h.split(/\n/),v=0;v=0){var a=h.resolveModule(s.substr(0,w)),S=h.resolveModule(s.substr(w+1)),v=this._moduleIdProvider.getModuleId(a+"!"+S),C=this._moduleIdProvider.getModuleId(a);return new u(v,C,S)}return new E(this._moduleIdProvider.getModuleId(h.resolveModule(s)))},l.prototype._normalizeDependencies=function(s,h){for(var w=[],a=0,S=0,v=s.length;S0;){var r=n.shift(),m=this._modules2[r];m&&(C=m.onDependencyError(w)||C);var _=this._inverseDependencies2[r];if(_)for(var S=0,v=_.length;S0;){var n=C.shift(),r=n.dependencies;if(r)for(var S=0,v=r.length;S=a.length)h._onLoadError(s,n);else{var r=a[v],m=h.getRecorder();if(h._config.isBuild()&&r==="empty:"){h._buildInfoPath[s]=r,h.defineModule(h._moduleIdProvider.getStrModuleId(s),[],null,null,null),h._onLoad(s);return}m.record(10,r),h._scriptLoader.load(h,r,function(){h._config.isBuild()&&(h._buildInfoPath[s]=r),m.record(11,r),h._onLoad(s)},function(_){m.record(12,r),C(_)})}};C(null)}},l.prototype._loadPluginDependency=function(s,h){var w=this;if(!(this._modules2[h.id]||this._knownModules2[h.id])){this._knownModules2[h.id]=!0;var a=function(S){w.defineModule(w._moduleIdProvider.getStrModuleId(h.id),[],S,null,null)};a.error=function(S){w._config.onError(w._createLoadError(h.id,S))},s.load(h.pluginParam,this._createRequire(t.ROOT),a,this._config.getOptionsLiteral())}},l.prototype._resolve=function(s){var h=this,w=s.dependencies;if(w)for(var a=0,S=w.length;a +`)),s.unresolvedDependenciesCount--;continue}if(this._inverseDependencies2[v.id]=this._inverseDependencies2[v.id]||[],this._inverseDependencies2[v.id].push(s.id),v instanceof u){var r=this._modules2[v.pluginId];if(r&&r.isComplete()){this._loadPluginDependency(r.exports,v);continue}var m=this._inversePluginDependencies2.get(v.pluginId);m||(m=[],this._inversePluginDependencies2.set(v.pluginId,m)),m.push(v),this._loadModule(v.pluginId);continue}this._loadModule(v.id)}s.unresolvedDependenciesCount===0&&this._onModuleComplete(s)},l.prototype._onModuleComplete=function(s){var h=this,w=this.getRecorder();if(!s.isComplete()){var a=s.dependencies,S=[];if(a)for(var v=0,C=a.length;vA===M){if(c===g)return!0;if(!c||!g||c.length!==g.length)return!1;for(let A=0,M=c.length;A0)M=R-1;else return R}return-(A+1)}t.binarySearch=u;function d(c,g){let L=0,A=c.length;if(A===0)return 0;for(;L=g.length)throw new TypeError("invalid index");let A=g[Math.floor(g.length*Math.random())],M=[],R=[],D=[];for(let T of g){const $=L(T,A);$<0?M.push(T):$>0?R.push(T):D.push(T)}return cA?c[$]=R[T++]:T>M?c[$]=R[D++]:g(R[T],R[D])<0?c[$]=R[T++]:c[$]=R[D++]}function w(c,g,L,A,M){if(!(A<=L)){const R=L+(A-L)/2|0;w(c,g,L,R,M),w(c,g,R+1,A,M),!(g(c[R],c[R+1])<=0)&&h(c,g,L,R,A,M)}}function a(c,g){const L=[];let A;for(const M of s(c.slice(0),g))!A||g(A[0],M)!==0?(A=[M],L.push(A)):A.push(M);return L}t.groupBy=a;function S(c){return c.filter(g=>!!g)}t.coalesce=S;function v(c){return!Array.isArray(c)||c.length===0}t.isFalsyOrEmpty=v;function C(c){return Array.isArray(c)&&c.length>0}t.isNonEmptyArray=C;function n(c,g){if(!g)return c.filter((A,M)=>c.indexOf(A)===M);const L=Object.create(null);return c.filter(A=>{const M=g(A);return L[M]?!1:(L[M]=!0,!0)})}t.distinct=n;function r(c){const g=new Set;return c.filter(L=>g.has(L)?!1:(g.add(L),!0))}t.distinctES6=r;function m(c,g){return c.length>0?c[0]:g}t.firstOrDefault=m;function _(c){return[].concat(...c)}t.flatten=_;function o(c,g){let L=typeof g=="number"?c:0;typeof g=="number"?L=c:(L=0,g=c);const A=[];if(L<=g)for(let M=L;Mg;M--)A.push(M);return A}t.range=o;function i(c,g,L){const A=c.slice(0,g),M=c.slice(g);return A.concat(L,M)}t.arrayInsert=i;function f(c,g){const L=c.indexOf(g);L>-1&&(c.splice(L,1),c.unshift(g))}t.pushToStart=f;function b(c,g){const L=c.indexOf(g);L>-1&&(c.splice(L,1),c.push(g))}t.pushToEnd=b;function N(c){return Array.isArray(c)?c:[c]}t.asArray=N}),V(z[15],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DiffChange=void 0;class p{constructor(E,u,d,l){this.originalStart=E,this.originalLength=u,this.modifiedStart=d,this.modifiedLength=l}getOriginalEnd(){return this.originalStart+this.originalLength}getModifiedEnd(){return this.modifiedStart+this.modifiedLength}}t.DiffChange=p}),V(z[4],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.illegalState=t.illegalArgument=t.canceled=t.isPromiseCanceledError=t.transformErrorForSerialization=t.onUnexpectedExternalError=t.onUnexpectedError=t.errorHandler=t.ErrorHandler=void 0;class p{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(S){setTimeout(()=>{throw S.stack?new Error(S.message+` + +`+S.stack):S},0)}}emit(S){this.listeners.forEach(v=>{v(S)})}onUnexpectedError(S){this.unexpectedErrorHandler(S),this.emit(S)}onUnexpectedExternalError(S){this.unexpectedErrorHandler(S)}}t.ErrorHandler=p,t.errorHandler=new p;function P(a){l(a)||t.errorHandler.onUnexpectedError(a)}t.onUnexpectedError=P;function E(a){l(a)||t.errorHandler.onUnexpectedExternalError(a)}t.onUnexpectedExternalError=E;function u(a){if(a instanceof Error){let{name:S,message:v}=a;const C=a.stacktrace||a.stack;return{$isError:!0,name:S,message:v,stack:C}}return a}t.transformErrorForSerialization=u;const d="Canceled";function l(a){return a instanceof Error&&a.name===d&&a.message===d}t.isPromiseCanceledError=l;function s(){const a=new Error(d);return a.name=a.message,a}t.canceled=s;function h(a){return a?new Error(`Illegal argument: ${a}`):new Error("Illegal argument")}t.illegalArgument=h;function w(a){return a?new Error(`Illegal state: ${a}`):new Error("Illegal state")}t.illegalState=w}),V(z[16],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Iterable=void 0;var p;(function(P){function E(f){return f&&typeof f=="object"&&typeof f[Symbol.iterator]=="function"}P.is=E;const u=Object.freeze([]);function d(){return u}P.empty=d;function*l(f){yield f}P.single=l;function s(f){return f||u}P.from=s;function h(f){return!f||f[Symbol.iterator]().next().done===!0}P.isEmpty=h;function w(f){return f[Symbol.iterator]().next().value}P.first=w;function a(f,b){for(const N of f)if(b(N))return!0;return!1}P.some=a;function S(f,b){for(const N of f)if(b(N))return N}P.find=S;function*v(f,b){for(const N of f)b(N)&&(yield N)}P.filter=v;function*C(f,b){for(const N of f)yield b(N)}P.map=C;function*n(...f){for(const b of f)for(const N of b)yield N}P.concat=n;function*r(f){for(const b of f)for(const N of b)yield N}P.concatNested=r;function m(f,b,N){let c=N;for(const g of f)c=b(c,g);return c}P.reduce=m;function*_(f,b,N=f.length){for(b<0&&(b+=f.length),N<0?N+=f.length:N>f.length&&(N=f.length);bc===g){const c=f[Symbol.iterator](),g=b[Symbol.iterator]();for(;;){const L=c.next(),A=g.next();if(L.done!==A.done)return!1;if(L.done)return!0;if(!N(L.value,A.value))return!1}}P.equals=i})(p=t.Iterable||(t.Iterable={}))}),V(z[17],G([0,1,4]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ResolvedKeybinding=t.ResolvedKeybindingPart=t.ChordKeybinding=t.SimpleKeybinding=t.createSimpleKeybinding=t.createKeybinding=t.KeyChord=t.KeyCodeUtils=void 0;class P{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(r,m){this._keyCodeToStr[r]=m,this._strToKeyCode[m.toLowerCase()]=r}keyCodeToStr(r){return this._keyCodeToStr[r]}strToKeyCode(r){return this._strToKeyCode[r.toLowerCase()]||0}}const E=new P,u=new P,d=new P;(function(){function n(r,m,_=m,o=_){E.define(r,m),u.define(r,_),d.define(r,o)}n(0,"unknown"),n(1,"Backspace"),n(2,"Tab"),n(3,"Enter"),n(4,"Shift"),n(5,"Ctrl"),n(6,"Alt"),n(7,"PauseBreak"),n(8,"CapsLock"),n(9,"Escape"),n(10,"Space"),n(11,"PageUp"),n(12,"PageDown"),n(13,"End"),n(14,"Home"),n(15,"LeftArrow","Left"),n(16,"UpArrow","Up"),n(17,"RightArrow","Right"),n(18,"DownArrow","Down"),n(19,"Insert"),n(20,"Delete"),n(21,"0"),n(22,"1"),n(23,"2"),n(24,"3"),n(25,"4"),n(26,"5"),n(27,"6"),n(28,"7"),n(29,"8"),n(30,"9"),n(31,"A"),n(32,"B"),n(33,"C"),n(34,"D"),n(35,"E"),n(36,"F"),n(37,"G"),n(38,"H"),n(39,"I"),n(40,"J"),n(41,"K"),n(42,"L"),n(43,"M"),n(44,"N"),n(45,"O"),n(46,"P"),n(47,"Q"),n(48,"R"),n(49,"S"),n(50,"T"),n(51,"U"),n(52,"V"),n(53,"W"),n(54,"X"),n(55,"Y"),n(56,"Z"),n(57,"Meta"),n(58,"ContextMenu"),n(59,"F1"),n(60,"F2"),n(61,"F3"),n(62,"F4"),n(63,"F5"),n(64,"F6"),n(65,"F7"),n(66,"F8"),n(67,"F9"),n(68,"F10"),n(69,"F11"),n(70,"F12"),n(71,"F13"),n(72,"F14"),n(73,"F15"),n(74,"F16"),n(75,"F17"),n(76,"F18"),n(77,"F19"),n(78,"NumLock"),n(79,"ScrollLock"),n(80,";",";","OEM_1"),n(81,"=","=","OEM_PLUS"),n(82,",",",","OEM_COMMA"),n(83,"-","-","OEM_MINUS"),n(84,".",".","OEM_PERIOD"),n(85,"/","/","OEM_2"),n(86,"`","`","OEM_3"),n(110,"ABNT_C1"),n(111,"ABNT_C2"),n(87,"[","[","OEM_4"),n(88,"\\","\\","OEM_5"),n(89,"]","]","OEM_6"),n(90,"'","'","OEM_7"),n(91,"OEM_8"),n(92,"OEM_102"),n(93,"NumPad0"),n(94,"NumPad1"),n(95,"NumPad2"),n(96,"NumPad3"),n(97,"NumPad4"),n(98,"NumPad5"),n(99,"NumPad6"),n(100,"NumPad7"),n(101,"NumPad8"),n(102,"NumPad9"),n(103,"NumPad_Multiply"),n(104,"NumPad_Add"),n(105,"NumPad_Separator"),n(106,"NumPad_Subtract"),n(107,"NumPad_Decimal"),n(108,"NumPad_Divide")})();var l;(function(n){function r(f){return E.keyCodeToStr(f)}n.toString=r;function m(f){return E.strToKeyCode(f)}n.fromString=m;function _(f){return u.keyCodeToStr(f)}n.toUserSettingsUS=_;function o(f){return d.keyCodeToStr(f)}n.toUserSettingsGeneral=o;function i(f){return u.strToKeyCode(f)||d.strToKeyCode(f)}n.fromUserSettings=i})(l=t.KeyCodeUtils||(t.KeyCodeUtils={}));function s(n,r){const m=(r&65535)<<16>>>0;return(n|m)>>>0}t.KeyChord=s;function h(n,r){if(n===0)return null;const m=(n&65535)>>>0,_=(n&4294901760)>>>16;return _!==0?new S([w(m,r),w(_,r)]):new S([w(m,r)])}t.createKeybinding=h;function w(n,r){const m=!!(n&2048),_=!!(n&256),o=r===2?_:m,i=!!(n&1024),f=!!(n&512),b=r===2?m:_,N=n&255;return new a(o,i,f,b,N)}t.createSimpleKeybinding=w;class a{constructor(r,m,_,o,i){this.ctrlKey=r,this.shiftKey=m,this.altKey=_,this.metaKey=o,this.keyCode=i}equals(r){return this.ctrlKey===r.ctrlKey&&this.shiftKey===r.shiftKey&&this.altKey===r.altKey&&this.metaKey===r.metaKey&&this.keyCode===r.keyCode}isModifierKey(){return this.keyCode===0||this.keyCode===5||this.keyCode===57||this.keyCode===6||this.keyCode===4}toChord(){return new S([this])}isDuplicateModifierCase(){return this.ctrlKey&&this.keyCode===5||this.shiftKey&&this.keyCode===4||this.altKey&&this.keyCode===6||this.metaKey&&this.keyCode===57}}t.SimpleKeybinding=a;class S{constructor(r){if(r.length===0)throw p.illegalArgument("parts");this.parts=r}}t.ChordKeybinding=S;class v{constructor(r,m,_,o,i,f){this.ctrlKey=r,this.shiftKey=m,this.altKey=_,this.metaKey=o,this.keyLabel=i,this.keyAriaLabel=f}}t.ResolvedKeybindingPart=v;class C{}t.ResolvedKeybinding=C}),V(z[7],G([0,1,16]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ImmortalReference=t.MutableDisposable=t.Disposable=t.DisposableStore=t.toDisposable=t.combinedDisposable=t.dispose=t.isDisposable=t.MultiDisposeError=t.trackDisposable=void 0;const P=!1;let E=null;if(P){const r="__is_disposable_tracked__";E=new class{trackDisposable(m){const _=new Error("Potentially leaked disposable").stack;setTimeout(()=>{m[r]||console.log(_)},3e3)}markTracked(m){if(m&&m!==v.None)try{m[r]=!0}catch(_){}}}}function u(r){!E||E.markTracked(r)}function d(r){return E&&E.trackDisposable(r),r}t.trackDisposable=d;class l extends Error{constructor(m){super(`Encountered errors while disposing of store. Errors: [${m.join(", ")}]`);this.errors=m}}t.MultiDisposeError=l;function s(r){return typeof r.dispose=="function"&&r.dispose.length===0}t.isDisposable=s;function h(r){if(p.Iterable.is(r)){let m=[];for(const _ of r)if(_){u(_);try{_.dispose()}catch(o){m.push(o)}}if(m.length===1)throw m[0];if(m.length>1)throw new l(m);return Array.isArray(r)?[]:r}else if(r)return u(r),r.dispose(),r}t.dispose=h;function w(...r){return r.forEach(u),a(()=>h(r))}t.combinedDisposable=w;function a(r){const m=d({dispose:()=>{u(m),r()}});return m}t.toDisposable=a;class S{constructor(){this._toDispose=new Set,this._isDisposed=!1}dispose(){this._isDisposed||(u(this),this._isDisposed=!0,this.clear())}clear(){try{h(this._toDispose.values())}finally{this._toDispose.clear()}}add(m){if(!m)return m;if(m===this)throw new Error("Cannot register a disposable on itself!");return u(m),this._isDisposed?S.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(m),m}}t.DisposableStore=S,S.DISABLE_DISPOSED_WARNING=!1;class v{constructor(){this._store=new S,d(this)}dispose(){u(this),this._store.dispose()}_register(m){if(m===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(m)}}t.Disposable=v,v.None=Object.freeze({dispose(){}});class C{constructor(){this._isDisposed=!1,d(this)}get value(){return this._isDisposed?void 0:this._value}set value(m){var _;this._isDisposed||m===this._value||((_=this._value)===null||_===void 0||_.dispose(),m&&u(m),this._value=m)}clear(){this.value=void 0}dispose(){var m;this._isDisposed=!0,u(this),(m=this._value)===null||m===void 0||m.dispose(),this._value=void 0}}t.MutableDisposable=C;class n{constructor(m){this.object=m}dispose(){}}t.ImmortalReference=n}),V(z[18],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LinkedList=void 0;class p{constructor(u){this.element=u,this.next=p.Undefined,this.prev=p.Undefined}}p.Undefined=new p(void 0);class P{constructor(){this._first=p.Undefined,this._last=p.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===p.Undefined}clear(){this._first=p.Undefined,this._last=p.Undefined,this._size=0}unshift(u){return this._insert(u,!1)}push(u){return this._insert(u,!0)}_insert(u,d){const l=new p(u);if(this._first===p.Undefined)this._first=l,this._last=l;else if(d){const h=this._last;this._last=l,l.prev=h,h.next=l}else{const h=this._first;this._first=l,l.next=h,h.prev=l}this._size+=1;let s=!1;return()=>{s||(s=!0,this._remove(l))}}shift(){if(this._first!==p.Undefined){const u=this._first.element;return this._remove(this._first),u}}pop(){if(this._last!==p.Undefined){const u=this._last.element;return this._remove(this._last),u}}_remove(u){if(u.prev!==p.Undefined&&u.next!==p.Undefined){const d=u.prev;d.next=u.next,u.next.prev=d}else u.prev===p.Undefined&&u.next===p.Undefined?(this._first=p.Undefined,this._last=p.Undefined):u.next===p.Undefined?(this._last=this._last.prev,this._last.next=p.Undefined):u.prev===p.Undefined&&(this._first=this._first.next,this._first.prev=p.Undefined);this._size-=1}*[Symbol.iterator](){let u=this._first;for(;u!==p.Undefined;)yield u.element,u=u.next}}t.LinkedList=P}),V(z[2],G([0,1]),function(I,t){"use strict";var p;Object.defineProperty(t,"__esModule",{value:!0}),t.isLittleEndian=t.OS=t.setImmediate=t.globals=t.userAgent=t.isIOS=t.isWeb=t.isNative=t.isLinux=t.isMacintosh=t.isWindows=t.isPreferringBrowserCodeLoad=t.browserCodeLoadingCacheStrategy=t.isElectronSandboxed=void 0;const P="en";let E=!1,u=!1,d=!1,l=!1,s=!1,h=!1,w=!1,a,S=P,v,C;const n=typeof self=="object"?self:typeof global=="object"?global:{};let r;typeof process!="undefined"?r=process:typeof n.vscode!="undefined"&&(r=n.vscode.process);const m=typeof((p=r==null?void 0:r.versions)===null||p===void 0?void 0:p.electron)=="string"&&r.type==="renderer";if(t.isElectronSandboxed=m&&(r==null?void 0:r.sandboxed),t.browserCodeLoadingCacheStrategy=(()=>{if(t.isElectronSandboxed)return"bypassHeatCheck";const b=r==null?void 0:r.env.ENABLE_VSCODE_BROWSER_CODE_LOADING;if(typeof b=="string")return b==="none"||b==="code"||b==="bypassHeatCheck"||b==="bypassHeatCheckAndEagerCompile"?b:"bypassHeatCheck"})(),t.isPreferringBrowserCodeLoad=typeof t.browserCodeLoadingCacheStrategy=="string",typeof navigator=="object"&&!m)C=navigator.userAgent,E=C.indexOf("Windows")>=0,u=C.indexOf("Macintosh")>=0,w=(C.indexOf("Macintosh")>=0||C.indexOf("iPad")>=0||C.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,d=C.indexOf("Linux")>=0,h=!0,a=navigator.language,S=a;else if(typeof r=="object"){E=r.platform==="win32",u=r.platform==="darwin",d=r.platform==="linux",l=d&&!!r.env.SNAP&&!!r.env.SNAP_REVISION,a=P,S=P;const b=r.env.VSCODE_NLS_CONFIG;if(b)try{const N=JSON.parse(b),c=N.availableLanguages["*"];a=N.locale,S=c||P,v=N._translationsConfigFile}catch(N){}s=!0}else console.error("Unable to resolve platform.");let _=0;u?_=1:E?_=3:d&&(_=2),t.isWindows=E,t.isMacintosh=u,t.isLinux=d,t.isNative=s,t.isWeb=h,t.isIOS=w,t.userAgent=C,t.globals=n,t.setImmediate=function(){if(t.globals.setImmediate)return t.globals.setImmediate.bind(t.globals);if(typeof t.globals.postMessage=="function"&&!t.globals.importScripts){let c=[];t.globals.addEventListener("message",L=>{if(L.data&&L.data.vscodeSetImmediateId)for(let A=0,M=c.length;A{const A=++g;c.push({id:A,callback:L}),t.globals.postMessage({vscodeSetImmediateId:A},"*")}}if(r&&typeof r.nextTick=="function")return r.nextTick.bind(r);const N=Promise.resolve();return c=>N.then(c)}(),t.OS=u||w?2:E?1:3;let o=!0,i=!1;function f(){if(!i){i=!0;const b=new Uint8Array(2);b[0]=1,b[1]=2,o=new Uint16Array(b.buffer)[0]===(2<<8)+1}return o}t.isLittleEndian=f}),V(z[19],G([0,1,2]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.platform=t.env=t.cwd=void 0;let P;typeof process!="undefined"?P=process:typeof p.globals.vscode!="undefined"?P={get platform(){return p.globals.vscode.process.platform},get env(){return p.globals.vscode.process.env},nextTick(E){return p.setImmediate(E)},cwd(){return p.globals.vscode.process.env.VSCODE_CWD||p.globals.vscode.process.execPath.substr(0,p.globals.vscode.process.execPath.lastIndexOf(p.globals.vscode.process.platform==="win32"?"\\":"/"))}}:P={get platform(){return p.isWindows?"win32":p.isMacintosh?"darwin":"linux"},nextTick(E){return p.setImmediate(E)},get env(){return Object.create(null)},cwd(){return"/"}},t.cwd=P.cwd,t.env=P.env,t.platform=P.platform}),V(z[20],G([0,1,19]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.sep=t.extname=t.basename=t.dirname=t.relative=t.resolve=t.normalize=t.posix=t.win32=void 0;const P=65,E=97,u=90,d=122,l=46,s=47,h=92,w=58,a=63;class S extends Error{constructor(i,f,b){let N;typeof f=="string"&&f.indexOf("not ")===0?(N="must not be",f=f.replace(/^not /,"")):N="must be";const c=i.indexOf(".")!==-1?"property":"argument";let g=`The "${i}" ${c} ${N} of type ${f}`;g+=`. Received type ${typeof b}`,super(g),this.code="ERR_INVALID_ARG_TYPE"}}function v(o,i){if(typeof o!="string")throw new S(i,"string",o)}function C(o){return o===s||o===h}function n(o){return o===s}function r(o){return o>=P&&o<=u||o>=E&&o<=d}function m(o,i,f,b){let N="",c=0,g=-1,L=0,A=0;for(let M=0;M<=o.length;++M){if(M2){const R=N.lastIndexOf(f);R===-1?(N="",c=0):(N=N.slice(0,R),c=N.length-1-N.lastIndexOf(f)),g=M,L=0;continue}else if(N.length!==0){N="",c=0,g=M,L=0;continue}}i&&(N+=N.length>0?`${f}..`:"..",c=2)}else N.length>0?N+=`${f}${o.slice(g+1,M)}`:N=o.slice(g+1,M),c=M-g-1;g=M,L=0}else A===l&&L!==-1?++L:L=-1}return N}function _(o,i){if(i===null||typeof i!="object")throw new S("pathObject","Object",i);const f=i.dir||i.root,b=i.base||`${i.name||""}${i.ext||""}`;return f?f===i.root?`${f}${b}`:`${f}${o}${b}`:b}t.win32={resolve(...o){let i="",f="",b=!1;for(let N=o.length-1;N>=-1;N--){let c;if(N>=0){if(c=o[N],v(c,"path"),c.length===0)continue}else i.length===0?c=p.cwd():(c=p.env[`=${i}`]||p.cwd(),(c===void 0||c.slice(0,2).toLowerCase()!==i.toLowerCase()&&c.charCodeAt(2)===h)&&(c=`${i}\\`));const g=c.length;let L=0,A="",M=!1;const R=c.charCodeAt(0);if(g===1)C(R)&&(L=1,M=!0);else if(C(R))if(M=!0,C(c.charCodeAt(1))){let D=2,T=D;for(;D2&&C(c.charCodeAt(2))&&(M=!0,L=3));if(A.length>0)if(i.length>0){if(A.toLowerCase()!==i.toLowerCase())continue}else i=A;if(b){if(i.length>0)break}else if(f=`${c.slice(L)}\\${f}`,b=M,M&&i.length>0)break}return f=m(f,!b,"\\",C),b?`${i}\\${f}`:`${i}${f}`||"."},normalize(o){v(o,"path");const i=o.length;if(i===0)return".";let f=0,b,N=!1;const c=o.charCodeAt(0);if(i===1)return n(c)?"\\":o;if(C(c))if(N=!0,C(o.charCodeAt(1))){let L=2,A=L;for(;L2&&C(o.charCodeAt(2))&&(N=!0,f=3));let g=f0&&C(o.charCodeAt(i-1))&&(g+="\\"),b===void 0?N?`\\${g}`:g:N?`${b}\\${g}`:`${b}${g}`},isAbsolute(o){v(o,"path");const i=o.length;if(i===0)return!1;const f=o.charCodeAt(0);return C(f)||i>2&&r(f)&&o.charCodeAt(1)===w&&C(o.charCodeAt(2))},join(...o){if(o.length===0)return".";let i,f;for(let c=0;c0&&(i===void 0?i=f=g:i+=`\\${g}`)}if(i===void 0)return".";let b=!0,N=0;if(typeof f=="string"&&C(f.charCodeAt(0))){++N;const c=f.length;c>1&&C(f.charCodeAt(1))&&(++N,c>2&&(C(f.charCodeAt(2))?++N:b=!1))}if(b){for(;N=2&&(i=`\\${i.slice(N)}`)}return t.win32.normalize(i)},relative(o,i){if(v(o,"from"),v(i,"to"),o===i)return"";const f=t.win32.resolve(o),b=t.win32.resolve(i);if(f===b||(o=f.toLowerCase(),i=b.toLowerCase(),o===i))return"";let N=0;for(;NN&&o.charCodeAt(c-1)===h;)c--;const g=c-N;let L=0;for(;LL&&i.charCodeAt(A-1)===h;)A--;const M=A-L,R=gR){if(i.charCodeAt(L+T)===h)return b.slice(L+T+1);if(T===2)return b.slice(L+T)}g>R&&(o.charCodeAt(N+T)===h?D=T:T===2&&(D=3)),D===-1&&(D=0)}let $="";for(T=N+D+1;T<=c;++T)(T===c||o.charCodeAt(T)===h)&&($+=$.length===0?"..":"\\..");return L+=D,$.length>0?`${$}${b.slice(L,A)}`:(b.charCodeAt(L)===h&&++L,b.slice(L,A))},toNamespacedPath(o){if(typeof o!="string")return o;if(o.length===0)return"";const i=t.win32.resolve(o);if(i.length<=2)return o;if(i.charCodeAt(0)===h){if(i.charCodeAt(1)===h){const f=i.charCodeAt(2);if(f!==a&&f!==l)return`\\\\?\\UNC\\${i.slice(2)}`}}else if(r(i.charCodeAt(0))&&i.charCodeAt(1)===w&&i.charCodeAt(2)===h)return`\\\\?\\${i}`;return o},dirname(o){v(o,"path");const i=o.length;if(i===0)return".";let f=-1,b=0;const N=o.charCodeAt(0);if(i===1)return C(N)?o:".";if(C(N)){if(f=b=1,C(o.charCodeAt(1))){let L=2,A=L;for(;L2&&C(o.charCodeAt(2))?3:2,b=f);let c=-1,g=!0;for(let L=i-1;L>=b;--L)if(C(o.charCodeAt(L))){if(!g){c=L;break}}else g=!1;if(c===-1){if(f===-1)return".";c=f}return o.slice(0,c)},basename(o,i){i!==void 0&&v(i,"ext"),v(o,"path");let f=0,b=-1,N=!0,c;if(o.length>=2&&r(o.charCodeAt(0))&&o.charCodeAt(1)===w&&(f=2),i!==void 0&&i.length>0&&i.length<=o.length){if(i===o)return"";let g=i.length-1,L=-1;for(c=o.length-1;c>=f;--c){const A=o.charCodeAt(c);if(C(A)){if(!N){f=c+1;break}}else L===-1&&(N=!1,L=c+1),g>=0&&(A===i.charCodeAt(g)?--g==-1&&(b=c):(g=-1,b=L))}return f===b?b=L:b===-1&&(b=o.length),o.slice(f,b)}for(c=o.length-1;c>=f;--c)if(C(o.charCodeAt(c))){if(!N){f=c+1;break}}else b===-1&&(N=!1,b=c+1);return b===-1?"":o.slice(f,b)},extname(o){v(o,"path");let i=0,f=-1,b=0,N=-1,c=!0,g=0;o.length>=2&&o.charCodeAt(1)===w&&r(o.charCodeAt(0))&&(i=b=2);for(let L=o.length-1;L>=i;--L){const A=o.charCodeAt(L);if(C(A)){if(!c){b=L+1;break}continue}N===-1&&(c=!1,N=L+1),A===l?f===-1?f=L:g!==1&&(g=1):f!==-1&&(g=-1)}return f===-1||N===-1||g===0||g===1&&f===N-1&&f===b+1?"":o.slice(f,N)},format:_.bind(null,"\\"),parse(o){v(o,"path");const i={root:"",dir:"",base:"",ext:"",name:""};if(o.length===0)return i;const f=o.length;let b=0,N=o.charCodeAt(0);if(f===1)return C(N)?(i.root=i.dir=o,i):(i.base=i.name=o,i);if(C(N)){if(b=1,C(o.charCodeAt(1))){let D=2,T=D;for(;D0&&(i.root=o.slice(0,b));let c=-1,g=b,L=-1,A=!0,M=o.length-1,R=0;for(;M>=b;--M){if(N=o.charCodeAt(M),C(N)){if(!A){g=M+1;break}continue}L===-1&&(A=!1,L=M+1),N===l?c===-1?c=M:R!==1&&(R=1):c!==-1&&(R=-1)}return L!==-1&&(c===-1||R===0||R===1&&c===L-1&&c===g+1?i.base=i.name=o.slice(g,L):(i.name=o.slice(g,c),i.base=o.slice(g,L),i.ext=o.slice(c,L))),g>0&&g!==b?i.dir=o.slice(0,g-1):i.dir=i.root,i},sep:"\\",delimiter:";",win32:null,posix:null},t.posix={resolve(...o){let i="",f=!1;for(let b=o.length-1;b>=-1&&!f;b--){const N=b>=0?o[b]:p.cwd();v(N,"path"),N.length!==0&&(i=`${N}/${i}`,f=N.charCodeAt(0)===s)}return i=m(i,!f,"/",n),f?`/${i}`:i.length>0?i:"."},normalize(o){if(v(o,"path"),o.length===0)return".";const i=o.charCodeAt(0)===s,f=o.charCodeAt(o.length-1)===s;return o=m(o,!i,"/",n),o.length===0?i?"/":f?"./":".":(f&&(o+="/"),i?`/${o}`:o)},isAbsolute(o){return v(o,"path"),o.length>0&&o.charCodeAt(0)===s},join(...o){if(o.length===0)return".";let i;for(let f=0;f0&&(i===void 0?i=b:i+=`/${b}`)}return i===void 0?".":t.posix.normalize(i)},relative(o,i){if(v(o,"from"),v(i,"to"),o===i||(o=t.posix.resolve(o),i=t.posix.resolve(i),o===i))return"";const f=1,b=o.length,N=b-f,c=1,g=i.length-c,L=NL){if(i.charCodeAt(c+M)===s)return i.slice(c+M+1);if(M===0)return i.slice(c+M)}else N>L&&(o.charCodeAt(f+M)===s?A=M:M===0&&(A=0));let R="";for(M=f+A+1;M<=b;++M)(M===b||o.charCodeAt(M)===s)&&(R+=R.length===0?"..":"/..");return`${R}${i.slice(c+A)}`},toNamespacedPath(o){return o},dirname(o){if(v(o,"path"),o.length===0)return".";const i=o.charCodeAt(0)===s;let f=-1,b=!0;for(let N=o.length-1;N>=1;--N)if(o.charCodeAt(N)===s){if(!b){f=N;break}}else b=!1;return f===-1?i?"/":".":i&&f===1?"//":o.slice(0,f)},basename(o,i){i!==void 0&&v(i,"ext"),v(o,"path");let f=0,b=-1,N=!0,c;if(i!==void 0&&i.length>0&&i.length<=o.length){if(i===o)return"";let g=i.length-1,L=-1;for(c=o.length-1;c>=0;--c){const A=o.charCodeAt(c);if(A===s){if(!N){f=c+1;break}}else L===-1&&(N=!1,L=c+1),g>=0&&(A===i.charCodeAt(g)?--g==-1&&(b=c):(g=-1,b=L))}return f===b?b=L:b===-1&&(b=o.length),o.slice(f,b)}for(c=o.length-1;c>=0;--c)if(o.charCodeAt(c)===s){if(!N){f=c+1;break}}else b===-1&&(N=!1,b=c+1);return b===-1?"":o.slice(f,b)},extname(o){v(o,"path");let i=-1,f=0,b=-1,N=!0,c=0;for(let g=o.length-1;g>=0;--g){const L=o.charCodeAt(g);if(L===s){if(!N){f=g+1;break}continue}b===-1&&(N=!1,b=g+1),L===l?i===-1?i=g:c!==1&&(c=1):i!==-1&&(c=-1)}return i===-1||b===-1||c===0||c===1&&i===b-1&&i===f+1?"":o.slice(i,b)},format:_.bind(null,"/"),parse(o){v(o,"path");const i={root:"",dir:"",base:"",ext:"",name:""};if(o.length===0)return i;const f=o.charCodeAt(0)===s;let b;f?(i.root="/",b=1):b=0;let N=-1,c=0,g=-1,L=!0,A=o.length-1,M=0;for(;A>=b;--A){const R=o.charCodeAt(A);if(R===s){if(!L){c=A+1;break}continue}g===-1&&(L=!1,g=A+1),R===l?N===-1?N=A:M!==1&&(M=1):N!==-1&&(M=-1)}if(g!==-1){const R=c===0&&f?1:c;N===-1||M===0||M===1&&N===g-1&&N===c+1?i.base=i.name=o.slice(R,g):(i.name=o.slice(R,N),i.base=o.slice(R,g),i.ext=o.slice(N,g))}return c>0?i.dir=o.slice(0,c-1):f&&(i.dir="/"),i},sep:"/",delimiter:":",win32:null,posix:null},t.posix.win32=t.win32.win32=t.win32,t.posix.posix=t.win32.posix=t.posix,t.normalize=p.platform==="win32"?t.win32.normalize:t.posix.normalize,t.resolve=p.platform==="win32"?t.win32.resolve:t.posix.resolve,t.relative=p.platform==="win32"?t.win32.relative:t.posix.relative,t.dirname=p.platform==="win32"?t.win32.dirname:t.posix.dirname,t.basename=p.platform==="win32"?t.win32.basename:t.posix.basename,t.extname=p.platform==="win32"?t.win32.extname:t.posix.extname,t.sep=p.platform==="win32"?t.win32.sep:t.posix.sep}),V(z[8],G([0,1,2]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StopWatch=void 0;const P=p.globals.performance&&typeof p.globals.performance.now=="function";class E{constructor(d){this._highResolution=P&&d,this._startTime=this._now(),this._stopTime=-1}static create(d=!0){return new E(d)}stop(){this._stopTime=this._now()}elapsed(){return this._stopTime!==-1?this._stopTime-this._startTime:this._now()-this._startTime}_now(){return this._highResolution?p.globals.performance.now():Date.now()}}t.StopWatch=E}),V(z[9],G([0,1,4,7,18,8]),function(I,t,p,P,E,u){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Relay=t.EventBufferer=t.PauseableEmitter=t.Emitter=t.Event=void 0;var d;(function(C){C.None=()=>P.Disposable.None;function n(k){return(F,O=null,e)=>{let H=!1,B;return B=k(Q=>{if(!H)return B?B.dispose():H=!0,F.call(O,Q)},null,e),H&&B.dispose(),B}}C.once=n;function r(k,F){return b((O,e=null,H)=>k(B=>O.call(e,F(B)),null,H))}C.map=r;function m(k,F){return b((O,e=null,H)=>k(B=>{F(B),O.call(e,B)},null,H))}C.forEach=m;function _(k,F){return b((O,e=null,H)=>k(B=>F(B)&&O.call(e,B),null,H))}C.filter=_;function o(k){return k}C.signal=o;function i(...k){return(F,O=null,e)=>P.combinedDisposable(...k.map(H=>H(B=>F.call(O,B),null,e)))}C.any=i;function f(k,F,O){let e=O;return r(k,H=>(e=F(e,H),e))}C.reduce=f;function b(k){let F;const O=new w({onFirstListenerAdd(){F=k(O.fire,O)},onLastListenerRemove(){F.dispose()}});return O.event}C.snapshot=b;function N(k,F,O=100,e=!1,H){let B,Q,Z,ie=0;const re=new w({leakWarningThreshold:H,onFirstListenerAdd(){B=k(se=>{ie++,Q=F(Q,se),e&&!Z&&(re.fire(Q),Q=void 0),clearTimeout(Z),Z=setTimeout(()=>{const le=Q;Q=void 0,Z=void 0,(!e||ie>1)&&re.fire(le),ie=0},O)})},onLastListenerRemove(){B.dispose()}});return re.event}C.debounce=N;function c(k){const F=new Date().getTime();return r(n(k),O=>new Date().getTime()-F)}C.stopwatch=c;function g(k){let F=!0,O;return _(k,e=>{const H=F||e!==O;return F=!1,O=e,H})}C.latch=g;function L(k,F=!1,O=[]){let e=O.slice(),H=k(Z=>{e?e.push(Z):Q.fire(Z)});const B=()=>{e&&e.forEach(Z=>Q.fire(Z)),e=null},Q=new w({onFirstListenerAdd(){H||(H=k(Z=>Q.fire(Z)))},onFirstListenerDidAdd(){e&&(F?setTimeout(B):B())},onLastListenerRemove(){H&&H.dispose(),H=null}});return Q.event}C.buffer=L;class A{constructor(F){this.event=F}map(F){return new A(r(this.event,F))}forEach(F){return new A(m(this.event,F))}filter(F){return new A(_(this.event,F))}reduce(F,O){return new A(f(this.event,F,O))}latch(){return new A(g(this.event))}debounce(F,O=100,e=!1,H){return new A(N(this.event,F,O,e,H))}on(F,O,e){return this.event(F,O,e)}once(F,O,e){return n(this.event)(F,O,e)}}function M(k){return new A(k)}C.chain=M;function R(k,F,O=e=>e){const e=(...Z)=>Q.fire(O(...Z)),H=()=>k.on(F,e),B=()=>k.removeListener(F,e),Q=new w({onFirstListenerAdd:H,onLastListenerRemove:B});return Q.event}C.fromNodeEventEmitter=R;function D(k,F,O=e=>e){const e=(...Z)=>Q.fire(O(...Z)),H=()=>k.addEventListener(F,e),B=()=>k.removeEventListener(F,e),Q=new w({onFirstListenerAdd:H,onLastListenerRemove:B});return Q.event}C.fromDOMEventEmitter=D;function T(k){const F=new w;let O=!1;return k.then(void 0,()=>null).then(()=>{O?F.fire(void 0):setTimeout(()=>F.fire(void 0),0)}),O=!0,F.event}C.fromPromise=T;function $(k){return new Promise(F=>n(k)(F))}C.toPromise=$})(d=t.Event||(t.Event={}));class l{constructor(n){this._listenerCount=0,this._invocationCount=0,this._elapsedOverall=0,this._name=`${n}_${l._idPool++}`}start(n){this._stopWatch=new u.StopWatch(!0),this._listenerCount=n}stop(){if(this._stopWatch){const n=this._stopWatch.elapsed();this._elapsedOverall+=n,this._invocationCount+=1,console.info(`did FIRE ${this._name}: elapsed_ms: ${n.toFixed(5)}, listener: ${this._listenerCount} (elapsed_overall: ${this._elapsedOverall.toFixed(2)}, invocations: ${this._invocationCount})`),this._stopWatch=void 0}}}l._idPool=0;let s=-1;class h{constructor(n,r=Math.random().toString(18).slice(2,5)){this.customThreshold=n,this.name=r,this._warnCountdown=0}dispose(){this._stacks&&this._stacks.clear()}check(n){let r=s;if(typeof this.customThreshold=="number"&&(r=this.customThreshold),!(r<=0||n{const o=this._stacks.get(m)||0;this._stacks.set(m,o-1)}}}}class w{constructor(n){var r;this._disposed=!1,this._options=n,this._leakageMon=s>0?new h(this._options&&this._options.leakWarningThreshold):void 0,this._perfMon=((r=this._options)===null||r===void 0?void 0:r._profName)?new l(this._options._profName):void 0}get event(){return this._event||(this._event=(n,r,m)=>{var _;this._listeners||(this._listeners=new E.LinkedList);const o=this._listeners.isEmpty();o&&this._options&&this._options.onFirstListenerAdd&&this._options.onFirstListenerAdd(this);const i=this._listeners.push(r?[n,r]:n);o&&this._options&&this._options.onFirstListenerDidAdd&&this._options.onFirstListenerDidAdd(this),this._options&&this._options.onListenerDidAdd&&this._options.onListenerDidAdd(this,n,r);const f=(_=this._leakageMon)===null||_===void 0?void 0:_.check(this._listeners.size);let b;return b={dispose:()=>{f&&f(),b.dispose=w._noop,this._disposed||(i(),this._options&&this._options.onLastListenerRemove&&(this._listeners&&!this._listeners.isEmpty()||this._options.onLastListenerRemove(this)))}},m instanceof P.DisposableStore?m.add(b):Array.isArray(m)&&m.push(b),b}),this._event}fire(n){var r,m;if(this._listeners){this._deliveryQueue||(this._deliveryQueue=new E.LinkedList);for(let _ of this._listeners)this._deliveryQueue.push([_,n]);for((r=this._perfMon)===null||r===void 0||r.start(this._deliveryQueue.size);this._deliveryQueue.size>0;){const[_,o]=this._deliveryQueue.shift();try{typeof _=="function"?_.call(void 0,o):_[0].call(_[1],o)}catch(i){p.onUnexpectedError(i)}}(m=this._perfMon)===null||m===void 0||m.stop()}}dispose(){var n,r,m;(n=this._listeners)===null||n===void 0||n.clear(),(r=this._deliveryQueue)===null||r===void 0||r.clear(),(m=this._leakageMon)===null||m===void 0||m.dispose(),this._disposed=!0}}t.Emitter=w,w._noop=function(){};class a extends w{constructor(n){super(n);this._isPaused=0,this._eventQueue=new E.LinkedList,this._mergeFn=n==null?void 0:n.merge}pause(){this._isPaused++}resume(){if(this._isPaused!==0&&--this._isPaused==0)if(this._mergeFn){const n=Array.from(this._eventQueue);this._eventQueue.clear(),super.fire(this._mergeFn(n))}else for(;!this._isPaused&&this._eventQueue.size!==0;)super.fire(this._eventQueue.shift())}fire(n){this._listeners&&(this._isPaused!==0?this._eventQueue.push(n):super.fire(n))}}t.PauseableEmitter=a;class S{constructor(){this.buffers=[]}wrapEvent(n){return(r,m,_)=>n(o=>{const i=this.buffers[this.buffers.length-1];i?i.push(()=>r.call(m,o)):r.call(m,o)},void 0,_)}bufferEvents(n){const r=[];this.buffers.push(r);const m=n();return this.buffers.pop(),r.forEach(_=>_()),m}}t.EventBufferer=S;class v{constructor(){this.listening=!1,this.inputEvent=d.None,this.inputEventListener=P.Disposable.None,this.emitter=new w({onFirstListenerDidAdd:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onLastListenerRemove:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(n){this.inputEvent=n,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=n(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}t.Relay=v}),V(z[21],G([0,1,9]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CancellationTokenSource=t.CancellationToken=void 0;const P=Object.freeze(function(l,s){const h=setTimeout(l.bind(s),0);return{dispose(){clearTimeout(h)}}});var E;(function(l){function s(h){return h===l.None||h===l.Cancelled||h instanceof u?!0:!h||typeof h!="object"?!1:typeof h.isCancellationRequested=="boolean"&&typeof h.onCancellationRequested=="function"}l.isCancellationToken=s,l.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:p.Event.None}),l.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:P})})(E=t.CancellationToken||(t.CancellationToken={}));class u{constructor(){this._isCancelled=!1,this._emitter=null}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?P:(this._emitter||(this._emitter=new p.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=null)}}class d{constructor(s){this._token=void 0,this._parentListener=void 0,this._parentListener=s&&s.onCancellationRequested(this.cancel,this)}get token(){return this._token||(this._token=new u),this._token}cancel(){this._token?this._token instanceof u&&this._token.cancel():this._token=E.Cancelled}dispose(s=!1){s&&this.cancel(),this._parentListener&&this._parentListener.dispose(),this._token?this._token instanceof u&&this._token.dispose():this._token=E.None}}t.CancellationTokenSource=d}),V(z[5],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.breakBetweenGraphemeBreakType=t.getGraphemeBreakType=t.singleLetterHash=t.containsUppercaseCharacter=t.startsWithUTF8BOM=t.UTF8_BOM_CHARACTER=t.isEmojiImprecise=t.isFullWidthCharacter=t.containsFullWidthCharacter=t.containsUnusualLineTerminators=t.UNUSUAL_LINE_TERMINATORS=t.isBasicASCII=t.containsEmoji=t.containsRTL=t.decodeUTF8=t.prevCharLength=t.nextCharLength=t.getNextCodePoint=t.computeCodePoint=t.isLowSurrogate=t.isHighSurrogate=t.commonSuffixLength=t.commonPrefixLength=t.startsWithIgnoreCase=t.equalsIgnoreCase=t.isUpperAsciiLetter=t.isLowerAsciiLetter=t.compareSubstringIgnoreCase=t.compareIgnoreCase=t.compareSubstring=t.compare=t.lastNonWhitespaceIndex=t.getLeadingWhitespace=t.firstNonWhitespaceIndex=t.splitLines=t.regExpFlags=t.regExpLeadsToEndlessLoop=t.createRegExp=t.stripWildcards=t.convertSimple2RegExpPattern=t.rtrim=t.ltrim=t.trim=t.escapeRegExpCharacters=t.escape=t.format=t.isFalsyOrWhitespace=void 0;function p(y){return!y||typeof y!="string"?!0:y.trim().length===0}t.isFalsyOrWhitespace=p;const P=/{(\d+)}/g;function E(y,...U){return U.length===0?y:y.replace(P,function(W,q){const j=parseInt(q,10);return isNaN(j)||j<0||j>=U.length?W:U[j]})}t.format=E;function u(y){return y.replace(/[<>&]/g,function(U){switch(U){case"<":return"<";case">":return">";case"&":return"&";default:return U}})}t.escape=u;function d(y){return y.replace(/[\\\{\}\*\+\?\|\^\$\.\[\]\(\)]/g,"\\$&")}t.escapeRegExpCharacters=d;function l(y,U=" "){const W=s(y,U);return h(W,U)}t.trim=l;function s(y,U){if(!y||!U)return y;const W=U.length;if(W===0||y.length===0)return y;let q=0;for(;y.indexOf(U,q)===q;)q=q+W;return y.substring(q)}t.ltrim=s;function h(y,U){if(!y||!U)return y;const W=U.length,q=y.length;if(W===0||q===0)return y;let j=q,Y=-1;for(;Y=y.lastIndexOf(U,j-1),!(Y===-1||Y+W!==j);){if(Y===0)return"";j=Y}return y.substring(0,j)}t.rtrim=h;function w(y){return y.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g,"\\$&").replace(/[\*]/g,".*")}t.convertSimple2RegExpPattern=w;function a(y){return y.replace(/\*/g,"")}t.stripWildcards=a;function S(y,U,W={}){if(!y)throw new Error("Cannot create regex from empty string");U||(y=d(y)),W.wholeWord&&(/\B/.test(y.charAt(0))||(y="\\b"+y),/\B/.test(y.charAt(y.length-1))||(y=y+"\\b"));let q="";return W.global&&(q+="g"),W.matchCase||(q+="i"),W.multiline&&(q+="m"),W.unicode&&(q+="u"),new RegExp(y,q)}t.createRegExp=S;function v(y){return y.source==="^"||y.source==="^$"||y.source==="$"||y.source==="^\\s*$"?!1:!!(y.exec("")&&y.lastIndex===0)}t.regExpLeadsToEndlessLoop=v;function C(y){return(y.global?"g":"")+(y.ignoreCase?"i":"")+(y.multiline?"m":"")+(y.unicode?"u":"")}t.regExpFlags=C;function n(y){return y.split(/\r\n|\r|\n/)}t.splitLines=n;function r(y){for(let U=0,W=y.length;U=0;W--){const q=y.charCodeAt(W);if(q!==32&&q!==9)return W}return-1}t.lastNonWhitespaceIndex=_;function o(y,U){return yU?1:0}t.compare=o;function i(y,U,W=0,q=y.length,j=0,Y=U.length){for(;Wte)return 1}const J=q-W,x=Y-j;return Jx?1:0}t.compareSubstring=i;function f(y,U){return b(y,U,0,y.length,0,U.length)}t.compareIgnoreCase=f;function b(y,U,W=0,q=y.length,j=0,Y=U.length){for(;Wx?1:0}t.compareSubstringIgnoreCase=b;function N(y){return y>=97&&y<=122}t.isLowerAsciiLetter=N;function c(y){return y>=65&&y<=90}t.isUpperAsciiLetter=c;function g(y){return N(y)||c(y)}function L(y,U){return y.length===U.length&&A(y,U)}t.equalsIgnoreCase=L;function A(y,U,W=y.length){for(let q=0;qy.length?!1:A(y,U,W)}t.startsWithIgnoreCase=M;function R(y,U){let W,q=Math.min(y.length,U.length);for(W=0;W1){const q=y.charCodeAt(U-2);if(T(q))return k(q,W)}return W}function e(y,U){const W=ee.getInstance(),q=U,j=y.length,Y=F(y,j,U);U+=Y>=65536?2:1;let J=W.getGraphemeBreakType(Y);for(;U=65536?2:1,J=K}return U-q}t.nextCharLength=e;function H(y,U){const W=ee.getInstance(),q=U,j=O(y,U);U-=j>=65536?2:1;let Y=W.getGraphemeBreakType(j);for(;U>0;){const J=O(y,U),x=W.getGraphemeBreakType(J);if(ue(x,Y))break;U-=J>=65536?2:1,Y=x}return q-U}t.prevCharLength=H;function B(y){const U=y.byteLength,W=[];let q=0;for(;q=240&&q+3>>0|(y[q++]&63)<<12>>>0|(y[q++]&63)<<6>>>0|(y[q++]&63)<<0>>>0:j>=224&&q+2>>0|(y[q++]&63)<<6>>>0|(y[q++]&63)<<0>>>0:j>=192&&q+1>>0|(y[q++]&63)<<0>>>0:Y=y[q++],Y>=0&&Y<=55295||Y>=57344&&Y<=65535)W.push(String.fromCharCode(Y));else if(Y>=65536&&Y<=1114111){const J=Y-65536,x=55296+((J&1047552)>>>10),K=56320+((J&1023)>>>0);W.push(String.fromCharCode(x)),W.push(String.fromCharCode(K))}else W.push(String.fromCharCode(65533))}return W.join("")}t.decodeUTF8=B;const Q=/(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u08BD\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE33\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDCFF]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD50-\uDFFF]|\uD83B[\uDC00-\uDEBB])/;function Z(y){return Q.test(y)}t.containsRTL=Z;const ie=/(?:[\u231A\u231B\u23F0\u23F3\u2600-\u27BF\u2B50\u2B55]|\uD83C[\uDDE6-\uDDFF\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F\uDE80-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD00-\uDDFF\uDE70-\uDED6])/;function re(y){return ie.test(y)}t.containsEmoji=re;const se=/^[\t\n\r\x20-\x7E]*$/;function le(y){return se.test(y)}t.isBasicASCII=le,t.UNUSUAL_LINE_TERMINATORS=/[\u2028\u2029]/;function he(y){return t.UNUSUAL_LINE_TERMINATORS.test(y)}t.containsUnusualLineTerminators=he;function de(y){for(let U=0,W=y.length;U=11904&&y<=55215||y>=63744&&y<=64255||y>=65281&&y<=65374}t.isFullWidthCharacter=ae;function me(y){return y>=127462&&y<=127487||y===8986||y===8987||y===9200||y===9203||y>=9728&&y<=10175||y===11088||y===11093||y>=127744&&y<=128591||y>=128640&&y<=128764||y>=128992&&y<=129003||y>=129280&&y<=129535||y>=129648&&y<=129750}t.isEmojiImprecise=me,t.UTF8_BOM_CHARACTER=String.fromCharCode(65279);function ge(y){return!!(y&&y.length>0&&y.charCodeAt(0)===65279)}t.startsWithUTF8BOM=ge;function _e(y,U=!1){return y?(U&&(y=y.replace(/\\./g,"")),y.toLowerCase()!==y):!1}t.containsUppercaseCharacter=_e;function ve(y){const U=90-65+1;return y=y%(2*U),yW[3*j+1])j=2*j+1;else return W[3*j+2];return 0}}ee._INSTANCE=null;function be(){return JSON.parse("[0,0,0,51592,51592,11,44424,44424,11,72251,72254,5,7150,7150,7,48008,48008,11,55176,55176,11,128420,128420,14,3276,3277,5,9979,9980,14,46216,46216,11,49800,49800,11,53384,53384,11,70726,70726,5,122915,122916,5,129320,129327,14,2558,2558,5,5906,5908,5,9762,9763,14,43360,43388,8,45320,45320,11,47112,47112,11,48904,48904,11,50696,50696,11,52488,52488,11,54280,54280,11,70082,70083,1,71350,71350,7,73111,73111,5,127892,127893,14,128726,128727,14,129473,129474,14,2027,2035,5,2901,2902,5,3784,3789,5,6754,6754,5,8418,8420,5,9877,9877,14,11088,11088,14,44008,44008,5,44872,44872,11,45768,45768,11,46664,46664,11,47560,47560,11,48456,48456,11,49352,49352,11,50248,50248,11,51144,51144,11,52040,52040,11,52936,52936,11,53832,53832,11,54728,54728,11,69811,69814,5,70459,70460,5,71096,71099,7,71998,71998,5,72874,72880,5,119149,119149,7,127374,127374,14,128335,128335,14,128482,128482,14,128765,128767,14,129399,129400,14,129680,129685,14,1476,1477,5,2377,2380,7,2759,2760,5,3137,3140,7,3458,3459,7,4153,4154,5,6432,6434,5,6978,6978,5,7675,7679,5,9723,9726,14,9823,9823,14,9919,9923,14,10035,10036,14,42736,42737,5,43596,43596,5,44200,44200,11,44648,44648,11,45096,45096,11,45544,45544,11,45992,45992,11,46440,46440,11,46888,46888,11,47336,47336,11,47784,47784,11,48232,48232,11,48680,48680,11,49128,49128,11,49576,49576,11,50024,50024,11,50472,50472,11,50920,50920,11,51368,51368,11,51816,51816,11,52264,52264,11,52712,52712,11,53160,53160,11,53608,53608,11,54056,54056,11,54504,54504,11,54952,54952,11,68108,68111,5,69933,69940,5,70197,70197,7,70498,70499,7,70845,70845,5,71229,71229,5,71727,71735,5,72154,72155,5,72344,72345,5,73023,73029,5,94095,94098,5,121403,121452,5,126981,127182,14,127538,127546,14,127990,127990,14,128391,128391,14,128445,128449,14,128500,128505,14,128752,128752,14,129160,129167,14,129356,129356,14,129432,129442,14,129648,129651,14,129751,131069,14,173,173,4,1757,1757,1,2274,2274,1,2494,2494,5,2641,2641,5,2876,2876,5,3014,3016,7,3262,3262,7,3393,3396,5,3570,3571,7,3968,3972,5,4228,4228,7,6086,6086,5,6679,6680,5,6912,6915,5,7080,7081,5,7380,7392,5,8252,8252,14,9096,9096,14,9748,9749,14,9784,9786,14,9833,9850,14,9890,9894,14,9938,9938,14,9999,9999,14,10085,10087,14,12349,12349,14,43136,43137,7,43454,43456,7,43755,43755,7,44088,44088,11,44312,44312,11,44536,44536,11,44760,44760,11,44984,44984,11,45208,45208,11,45432,45432,11,45656,45656,11,45880,45880,11,46104,46104,11,46328,46328,11,46552,46552,11,46776,46776,11,47000,47000,11,47224,47224,11,47448,47448,11,47672,47672,11,47896,47896,11,48120,48120,11,48344,48344,11,48568,48568,11,48792,48792,11,49016,49016,11,49240,49240,11,49464,49464,11,49688,49688,11,49912,49912,11,50136,50136,11,50360,50360,11,50584,50584,11,50808,50808,11,51032,51032,11,51256,51256,11,51480,51480,11,51704,51704,11,51928,51928,11,52152,52152,11,52376,52376,11,52600,52600,11,52824,52824,11,53048,53048,11,53272,53272,11,53496,53496,11,53720,53720,11,53944,53944,11,54168,54168,11,54392,54392,11,54616,54616,11,54840,54840,11,55064,55064,11,65438,65439,5,69633,69633,5,69837,69837,1,70018,70018,7,70188,70190,7,70368,70370,7,70465,70468,7,70712,70719,5,70835,70840,5,70850,70851,5,71132,71133,5,71340,71340,7,71458,71461,5,71985,71989,7,72002,72002,7,72193,72202,5,72281,72283,5,72766,72766,7,72885,72886,5,73104,73105,5,92912,92916,5,113824,113827,4,119173,119179,5,121505,121519,5,125136,125142,5,127279,127279,14,127489,127490,14,127570,127743,14,127900,127901,14,128254,128254,14,128369,128370,14,128400,128400,14,128425,128432,14,128468,128475,14,128489,128494,14,128715,128720,14,128745,128745,14,128759,128760,14,129004,129023,14,129296,129304,14,129340,129342,14,129388,129392,14,129404,129407,14,129454,129455,14,129485,129487,14,129659,129663,14,129719,129727,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2363,2363,7,2402,2403,5,2507,2508,7,2622,2624,7,2691,2691,7,2786,2787,5,2881,2884,5,3006,3006,5,3072,3072,5,3170,3171,5,3267,3268,7,3330,3331,7,3406,3406,1,3538,3540,5,3655,3662,5,3897,3897,5,4038,4038,5,4184,4185,5,4352,4447,8,6068,6069,5,6155,6157,5,6448,6449,7,6742,6742,5,6783,6783,5,6966,6970,5,7042,7042,7,7143,7143,7,7212,7219,5,7412,7412,5,8206,8207,4,8294,8303,4,8596,8601,14,9410,9410,14,9742,9742,14,9757,9757,14,9770,9770,14,9794,9794,14,9828,9828,14,9855,9855,14,9882,9882,14,9900,9903,14,9929,9933,14,9963,9967,14,9987,9988,14,10006,10006,14,10062,10062,14,10175,10175,14,11744,11775,5,42607,42607,5,43043,43044,7,43263,43263,5,43444,43445,7,43569,43570,5,43698,43700,5,43766,43766,5,44032,44032,11,44144,44144,11,44256,44256,11,44368,44368,11,44480,44480,11,44592,44592,11,44704,44704,11,44816,44816,11,44928,44928,11,45040,45040,11,45152,45152,11,45264,45264,11,45376,45376,11,45488,45488,11,45600,45600,11,45712,45712,11,45824,45824,11,45936,45936,11,46048,46048,11,46160,46160,11,46272,46272,11,46384,46384,11,46496,46496,11,46608,46608,11,46720,46720,11,46832,46832,11,46944,46944,11,47056,47056,11,47168,47168,11,47280,47280,11,47392,47392,11,47504,47504,11,47616,47616,11,47728,47728,11,47840,47840,11,47952,47952,11,48064,48064,11,48176,48176,11,48288,48288,11,48400,48400,11,48512,48512,11,48624,48624,11,48736,48736,11,48848,48848,11,48960,48960,11,49072,49072,11,49184,49184,11,49296,49296,11,49408,49408,11,49520,49520,11,49632,49632,11,49744,49744,11,49856,49856,11,49968,49968,11,50080,50080,11,50192,50192,11,50304,50304,11,50416,50416,11,50528,50528,11,50640,50640,11,50752,50752,11,50864,50864,11,50976,50976,11,51088,51088,11,51200,51200,11,51312,51312,11,51424,51424,11,51536,51536,11,51648,51648,11,51760,51760,11,51872,51872,11,51984,51984,11,52096,52096,11,52208,52208,11,52320,52320,11,52432,52432,11,52544,52544,11,52656,52656,11,52768,52768,11,52880,52880,11,52992,52992,11,53104,53104,11,53216,53216,11,53328,53328,11,53440,53440,11,53552,53552,11,53664,53664,11,53776,53776,11,53888,53888,11,54000,54000,11,54112,54112,11,54224,54224,11,54336,54336,11,54448,54448,11,54560,54560,11,54672,54672,11,54784,54784,11,54896,54896,11,55008,55008,11,55120,55120,11,64286,64286,5,66272,66272,5,68900,68903,5,69762,69762,7,69817,69818,5,69927,69931,5,70003,70003,5,70070,70078,5,70094,70094,7,70194,70195,7,70206,70206,5,70400,70401,5,70463,70463,7,70475,70477,7,70512,70516,5,70722,70724,5,70832,70832,5,70842,70842,5,70847,70848,5,71088,71089,7,71102,71102,7,71219,71226,5,71231,71232,5,71342,71343,7,71453,71455,5,71463,71467,5,71737,71738,5,71995,71996,5,72000,72000,7,72145,72147,7,72160,72160,5,72249,72249,7,72273,72278,5,72330,72342,5,72752,72758,5,72850,72871,5,72882,72883,5,73018,73018,5,73031,73031,5,73109,73109,5,73461,73462,7,94031,94031,5,94192,94193,7,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,126976,126979,14,127184,127231,14,127344,127345,14,127405,127461,14,127514,127514,14,127561,127567,14,127778,127779,14,127896,127896,14,127985,127986,14,127995,127999,5,128326,128328,14,128360,128366,14,128378,128378,14,128394,128397,14,128405,128406,14,128422,128423,14,128435,128443,14,128453,128464,14,128479,128480,14,128484,128487,14,128496,128498,14,128640,128709,14,128723,128724,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129096,129103,14,129292,129292,14,129311,129311,14,129329,129330,14,129344,129349,14,129360,129374,14,129394,129394,14,129402,129402,14,129413,129425,14,129445,129450,14,129466,129471,14,129483,129483,14,129511,129535,14,129653,129655,14,129667,129670,14,129705,129711,14,129731,129743,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2307,2307,7,2366,2368,7,2382,2383,7,2434,2435,7,2497,2500,5,2519,2519,5,2563,2563,7,2631,2632,5,2677,2677,5,2750,2752,7,2763,2764,7,2817,2817,5,2879,2879,5,2891,2892,7,2914,2915,5,3008,3008,5,3021,3021,5,3076,3076,5,3146,3149,5,3202,3203,7,3264,3265,7,3271,3272,7,3298,3299,5,3390,3390,5,3402,3404,7,3426,3427,5,3535,3535,5,3544,3550,7,3635,3635,7,3763,3763,7,3893,3893,5,3953,3966,5,3981,3991,5,4145,4145,7,4157,4158,5,4209,4212,5,4237,4237,5,4520,4607,10,5970,5971,5,6071,6077,5,6089,6099,5,6277,6278,5,6439,6440,5,6451,6456,7,6683,6683,5,6744,6750,5,6765,6770,7,6846,6846,5,6964,6964,5,6972,6972,5,7019,7027,5,7074,7077,5,7083,7085,5,7146,7148,7,7154,7155,7,7222,7223,5,7394,7400,5,7416,7417,5,8204,8204,5,8233,8233,4,8288,8292,4,8413,8416,5,8482,8482,14,8986,8987,14,9193,9203,14,9654,9654,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9775,14,9792,9792,14,9800,9811,14,9825,9826,14,9831,9831,14,9852,9853,14,9872,9873,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9936,9936,14,9941,9960,14,9974,9974,14,9982,9985,14,9992,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10145,10145,14,11013,11015,14,11503,11505,5,12334,12335,5,12951,12951,14,42612,42621,5,43014,43014,5,43047,43047,7,43204,43205,5,43335,43345,5,43395,43395,7,43450,43451,7,43561,43566,5,43573,43574,5,43644,43644,5,43710,43711,5,43758,43759,7,44005,44005,5,44012,44012,7,44060,44060,11,44116,44116,11,44172,44172,11,44228,44228,11,44284,44284,11,44340,44340,11,44396,44396,11,44452,44452,11,44508,44508,11,44564,44564,11,44620,44620,11,44676,44676,11,44732,44732,11,44788,44788,11,44844,44844,11,44900,44900,11,44956,44956,11,45012,45012,11,45068,45068,11,45124,45124,11,45180,45180,11,45236,45236,11,45292,45292,11,45348,45348,11,45404,45404,11,45460,45460,11,45516,45516,11,45572,45572,11,45628,45628,11,45684,45684,11,45740,45740,11,45796,45796,11,45852,45852,11,45908,45908,11,45964,45964,11,46020,46020,11,46076,46076,11,46132,46132,11,46188,46188,11,46244,46244,11,46300,46300,11,46356,46356,11,46412,46412,11,46468,46468,11,46524,46524,11,46580,46580,11,46636,46636,11,46692,46692,11,46748,46748,11,46804,46804,11,46860,46860,11,46916,46916,11,46972,46972,11,47028,47028,11,47084,47084,11,47140,47140,11,47196,47196,11,47252,47252,11,47308,47308,11,47364,47364,11,47420,47420,11,47476,47476,11,47532,47532,11,47588,47588,11,47644,47644,11,47700,47700,11,47756,47756,11,47812,47812,11,47868,47868,11,47924,47924,11,47980,47980,11,48036,48036,11,48092,48092,11,48148,48148,11,48204,48204,11,48260,48260,11,48316,48316,11,48372,48372,11,48428,48428,11,48484,48484,11,48540,48540,11,48596,48596,11,48652,48652,11,48708,48708,11,48764,48764,11,48820,48820,11,48876,48876,11,48932,48932,11,48988,48988,11,49044,49044,11,49100,49100,11,49156,49156,11,49212,49212,11,49268,49268,11,49324,49324,11,49380,49380,11,49436,49436,11,49492,49492,11,49548,49548,11,49604,49604,11,49660,49660,11,49716,49716,11,49772,49772,11,49828,49828,11,49884,49884,11,49940,49940,11,49996,49996,11,50052,50052,11,50108,50108,11,50164,50164,11,50220,50220,11,50276,50276,11,50332,50332,11,50388,50388,11,50444,50444,11,50500,50500,11,50556,50556,11,50612,50612,11,50668,50668,11,50724,50724,11,50780,50780,11,50836,50836,11,50892,50892,11,50948,50948,11,51004,51004,11,51060,51060,11,51116,51116,11,51172,51172,11,51228,51228,11,51284,51284,11,51340,51340,11,51396,51396,11,51452,51452,11,51508,51508,11,51564,51564,11,51620,51620,11,51676,51676,11,51732,51732,11,51788,51788,11,51844,51844,11,51900,51900,11,51956,51956,11,52012,52012,11,52068,52068,11,52124,52124,11,52180,52180,11,52236,52236,11,52292,52292,11,52348,52348,11,52404,52404,11,52460,52460,11,52516,52516,11,52572,52572,11,52628,52628,11,52684,52684,11,52740,52740,11,52796,52796,11,52852,52852,11,52908,52908,11,52964,52964,11,53020,53020,11,53076,53076,11,53132,53132,11,53188,53188,11,53244,53244,11,53300,53300,11,53356,53356,11,53412,53412,11,53468,53468,11,53524,53524,11,53580,53580,11,53636,53636,11,53692,53692,11,53748,53748,11,53804,53804,11,53860,53860,11,53916,53916,11,53972,53972,11,54028,54028,11,54084,54084,11,54140,54140,11,54196,54196,11,54252,54252,11,54308,54308,11,54364,54364,11,54420,54420,11,54476,54476,11,54532,54532,11,54588,54588,11,54644,54644,11,54700,54700,11,54756,54756,11,54812,54812,11,54868,54868,11,54924,54924,11,54980,54980,11,55036,55036,11,55092,55092,11,55148,55148,11,55216,55238,9,65056,65071,5,65529,65531,4,68097,68099,5,68159,68159,5,69446,69456,5,69688,69702,5,69808,69810,7,69815,69816,7,69821,69821,1,69888,69890,5,69932,69932,7,69957,69958,7,70016,70017,5,70067,70069,7,70079,70080,7,70089,70092,5,70095,70095,5,70191,70193,5,70196,70196,5,70198,70199,5,70367,70367,5,70371,70378,5,70402,70403,7,70462,70462,5,70464,70464,5,70471,70472,7,70487,70487,5,70502,70508,5,70709,70711,7,70720,70721,7,70725,70725,7,70750,70750,5,70833,70834,7,70841,70841,7,70843,70844,7,70846,70846,7,70849,70849,7,71087,71087,5,71090,71093,5,71100,71101,5,71103,71104,5,71216,71218,7,71227,71228,7,71230,71230,7,71339,71339,5,71341,71341,5,71344,71349,5,71351,71351,5,71456,71457,7,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123628,123631,5,125252,125258,5,126980,126980,14,127183,127183,14,127245,127247,14,127340,127343,14,127358,127359,14,127377,127386,14,127462,127487,6,127491,127503,14,127535,127535,14,127548,127551,14,127568,127569,14,127744,127777,14,127780,127891,14,127894,127895,14,127897,127899,14,127902,127984,14,127987,127989,14,127991,127994,14,128000,128253,14,128255,128317,14,128329,128334,14,128336,128359,14,128367,128368,14,128371,128377,14,128379,128390,14,128392,128393,14,128398,128399,14,128401,128404,14,128407,128419,14,128421,128421,14,128424,128424,14,128433,128434,14,128444,128444,14,128450,128452,14,128465,128467,14,128476,128478,14,128481,128481,14,128483,128483,14,128488,128488,14,128495,128495,14,128499,128499,14,128506,128591,14,128710,128714,14,128721,128722,14,128725,128725,14,128728,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129664,129666,14,129671,129679,14,129686,129704,14,129712,129718,14,129728,129730,14,129744,129750,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2259,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3134,3136,5,3142,3144,5,3157,3158,5,3201,3201,5,3260,3260,5,3263,3263,5,3266,3266,5,3270,3270,5,3274,3275,7,3285,3286,5,3328,3329,5,3387,3388,5,3391,3392,7,3398,3400,7,3405,3405,5,3415,3415,5,3457,3457,5,3530,3530,5,3536,3537,7,3542,3542,5,3551,3551,5,3633,3633,5,3636,3642,5,3761,3761,5,3764,3772,5,3864,3865,5,3895,3895,5,3902,3903,7,3967,3967,7,3974,3975,5,3993,4028,5,4141,4144,5,4146,4151,5,4155,4156,7,4182,4183,7,4190,4192,5,4226,4226,5,4229,4230,5,4253,4253,5,4448,4519,9,4957,4959,5,5938,5940,5,6002,6003,5,6070,6070,7,6078,6085,7,6087,6088,7,6109,6109,5,6158,6158,4,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6848,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7673,5,8203,8203,4,8205,8205,13,8232,8232,4,8234,8238,4,8265,8265,14,8293,8293,4,8400,8412,5,8417,8417,5,8421,8432,5,8505,8505,14,8617,8618,14,9000,9000,14,9167,9167,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9776,9783,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9935,14,9937,9937,14,9939,9940,14,9961,9962,14,9968,9973,14,9975,9978,14,9981,9981,14,9986,9986,14,9989,9989,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10084,14,10133,10135,14,10160,10160,14,10548,10549,14,11035,11036,14,11093,11093,14,11647,11647,5,12330,12333,5,12336,12336,14,12441,12442,5,12953,12953,14,42608,42610,5,42654,42655,5,43010,43010,5,43019,43019,5,43045,43046,5,43052,43052,5,43188,43203,7,43232,43249,5,43302,43309,5,43346,43347,7,43392,43394,5,43443,43443,5,43446,43449,5,43452,43453,5,43493,43493,5,43567,43568,7,43571,43572,7,43587,43587,5,43597,43597,7,43696,43696,5,43703,43704,5,43713,43713,5,43756,43757,5,43765,43765,7,44003,44004,7,44006,44007,7,44009,44010,7,44013,44013,5,44033,44059,12,44061,44087,12,44089,44115,12,44117,44143,12,44145,44171,12,44173,44199,12,44201,44227,12,44229,44255,12,44257,44283,12,44285,44311,12,44313,44339,12,44341,44367,12,44369,44395,12,44397,44423,12,44425,44451,12,44453,44479,12,44481,44507,12,44509,44535,12,44537,44563,12,44565,44591,12,44593,44619,12,44621,44647,12,44649,44675,12,44677,44703,12,44705,44731,12,44733,44759,12,44761,44787,12,44789,44815,12,44817,44843,12,44845,44871,12,44873,44899,12,44901,44927,12,44929,44955,12,44957,44983,12,44985,45011,12,45013,45039,12,45041,45067,12,45069,45095,12,45097,45123,12,45125,45151,12,45153,45179,12,45181,45207,12,45209,45235,12,45237,45263,12,45265,45291,12,45293,45319,12,45321,45347,12,45349,45375,12,45377,45403,12,45405,45431,12,45433,45459,12,45461,45487,12,45489,45515,12,45517,45543,12,45545,45571,12,45573,45599,12,45601,45627,12,45629,45655,12,45657,45683,12,45685,45711,12,45713,45739,12,45741,45767,12,45769,45795,12,45797,45823,12,45825,45851,12,45853,45879,12,45881,45907,12,45909,45935,12,45937,45963,12,45965,45991,12,45993,46019,12,46021,46047,12,46049,46075,12,46077,46103,12,46105,46131,12,46133,46159,12,46161,46187,12,46189,46215,12,46217,46243,12,46245,46271,12,46273,46299,12,46301,46327,12,46329,46355,12,46357,46383,12,46385,46411,12,46413,46439,12,46441,46467,12,46469,46495,12,46497,46523,12,46525,46551,12,46553,46579,12,46581,46607,12,46609,46635,12,46637,46663,12,46665,46691,12,46693,46719,12,46721,46747,12,46749,46775,12,46777,46803,12,46805,46831,12,46833,46859,12,46861,46887,12,46889,46915,12,46917,46943,12,46945,46971,12,46973,46999,12,47001,47027,12,47029,47055,12,47057,47083,12,47085,47111,12,47113,47139,12,47141,47167,12,47169,47195,12,47197,47223,12,47225,47251,12,47253,47279,12,47281,47307,12,47309,47335,12,47337,47363,12,47365,47391,12,47393,47419,12,47421,47447,12,47449,47475,12,47477,47503,12,47505,47531,12,47533,47559,12,47561,47587,12,47589,47615,12,47617,47643,12,47645,47671,12,47673,47699,12,47701,47727,12,47729,47755,12,47757,47783,12,47785,47811,12,47813,47839,12,47841,47867,12,47869,47895,12,47897,47923,12,47925,47951,12,47953,47979,12,47981,48007,12,48009,48035,12,48037,48063,12,48065,48091,12,48093,48119,12,48121,48147,12,48149,48175,12,48177,48203,12,48205,48231,12,48233,48259,12,48261,48287,12,48289,48315,12,48317,48343,12,48345,48371,12,48373,48399,12,48401,48427,12,48429,48455,12,48457,48483,12,48485,48511,12,48513,48539,12,48541,48567,12,48569,48595,12,48597,48623,12,48625,48651,12,48653,48679,12,48681,48707,12,48709,48735,12,48737,48763,12,48765,48791,12,48793,48819,12,48821,48847,12,48849,48875,12,48877,48903,12,48905,48931,12,48933,48959,12,48961,48987,12,48989,49015,12,49017,49043,12,49045,49071,12,49073,49099,12,49101,49127,12,49129,49155,12,49157,49183,12,49185,49211,12,49213,49239,12,49241,49267,12,49269,49295,12,49297,49323,12,49325,49351,12,49353,49379,12,49381,49407,12,49409,49435,12,49437,49463,12,49465,49491,12,49493,49519,12,49521,49547,12,49549,49575,12,49577,49603,12,49605,49631,12,49633,49659,12,49661,49687,12,49689,49715,12,49717,49743,12,49745,49771,12,49773,49799,12,49801,49827,12,49829,49855,12,49857,49883,12,49885,49911,12,49913,49939,12,49941,49967,12,49969,49995,12,49997,50023,12,50025,50051,12,50053,50079,12,50081,50107,12,50109,50135,12,50137,50163,12,50165,50191,12,50193,50219,12,50221,50247,12,50249,50275,12,50277,50303,12,50305,50331,12,50333,50359,12,50361,50387,12,50389,50415,12,50417,50443,12,50445,50471,12,50473,50499,12,50501,50527,12,50529,50555,12,50557,50583,12,50585,50611,12,50613,50639,12,50641,50667,12,50669,50695,12,50697,50723,12,50725,50751,12,50753,50779,12,50781,50807,12,50809,50835,12,50837,50863,12,50865,50891,12,50893,50919,12,50921,50947,12,50949,50975,12,50977,51003,12,51005,51031,12,51033,51059,12,51061,51087,12,51089,51115,12,51117,51143,12,51145,51171,12,51173,51199,12,51201,51227,12,51229,51255,12,51257,51283,12,51285,51311,12,51313,51339,12,51341,51367,12,51369,51395,12,51397,51423,12,51425,51451,12,51453,51479,12,51481,51507,12,51509,51535,12,51537,51563,12,51565,51591,12,51593,51619,12,51621,51647,12,51649,51675,12,51677,51703,12,51705,51731,12,51733,51759,12,51761,51787,12,51789,51815,12,51817,51843,12,51845,51871,12,51873,51899,12,51901,51927,12,51929,51955,12,51957,51983,12,51985,52011,12,52013,52039,12,52041,52067,12,52069,52095,12,52097,52123,12,52125,52151,12,52153,52179,12,52181,52207,12,52209,52235,12,52237,52263,12,52265,52291,12,52293,52319,12,52321,52347,12,52349,52375,12,52377,52403,12,52405,52431,12,52433,52459,12,52461,52487,12,52489,52515,12,52517,52543,12,52545,52571,12,52573,52599,12,52601,52627,12,52629,52655,12,52657,52683,12,52685,52711,12,52713,52739,12,52741,52767,12,52769,52795,12,52797,52823,12,52825,52851,12,52853,52879,12,52881,52907,12,52909,52935,12,52937,52963,12,52965,52991,12,52993,53019,12,53021,53047,12,53049,53075,12,53077,53103,12,53105,53131,12,53133,53159,12,53161,53187,12,53189,53215,12,53217,53243,12,53245,53271,12,53273,53299,12,53301,53327,12,53329,53355,12,53357,53383,12,53385,53411,12,53413,53439,12,53441,53467,12,53469,53495,12,53497,53523,12,53525,53551,12,53553,53579,12,53581,53607,12,53609,53635,12,53637,53663,12,53665,53691,12,53693,53719,12,53721,53747,12,53749,53775,12,53777,53803,12,53805,53831,12,53833,53859,12,53861,53887,12,53889,53915,12,53917,53943,12,53945,53971,12,53973,53999,12,54001,54027,12,54029,54055,12,54057,54083,12,54085,54111,12,54113,54139,12,54141,54167,12,54169,54195,12,54197,54223,12,54225,54251,12,54253,54279,12,54281,54307,12,54309,54335,12,54337,54363,12,54365,54391,12,54393,54419,12,54421,54447,12,54449,54475,12,54477,54503,12,54505,54531,12,54533,54559,12,54561,54587,12,54589,54615,12,54617,54643,12,54645,54671,12,54673,54699,12,54701,54727,12,54729,54755,12,54757,54783,12,54785,54811,12,54813,54839,12,54841,54867,12,54869,54895,12,54897,54923,12,54925,54951,12,54953,54979,12,54981,55007,12,55009,55035,12,55037,55063,12,55065,55091,12,55093,55119,12,55121,55147,12,55149,55175,12,55177,55203,12,55243,55291,10,65024,65039,5,65279,65279,4,65520,65528,4,66045,66045,5,66422,66426,5,68101,68102,5,68152,68154,5,68325,68326,5,69291,69292,5,69632,69632,7,69634,69634,7,69759,69761,5]")}}),V(z[22],G([0,1,5]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StringSHA1=t.toHexString=t.stringHash=t.doHash=t.hash=void 0;function P(n){return E(n,0)}t.hash=P;function E(n,r){switch(typeof n){case"object":return n===null?u(349,r):Array.isArray(n)?s(n,r):h(n,r);case"string":return l(n,r);case"boolean":return d(n,r);case"number":return u(n,r);case"undefined":return u(937,r);default:return u(617,r)}}t.doHash=E;function u(n,r){return(r<<5)-r+n|0}function d(n,r){return u(n?433:863,r)}function l(n,r){r=u(149417,r);for(let m=0,_=n.length;m<_;m++)r=u(n.charCodeAt(m),r);return r}t.stringHash=l;function s(n,r){return r=u(104579,r),n.reduce((m,_)=>E(_,m),r)}function h(n,r){return r=u(181387,r),Object.keys(n).sort().reduce((m,_)=>(m=l(_,m),E(n[_],m)),r)}function w(n,r,m=32){const _=m-r,o=~((1<<_)-1);return(n<>>_)>>>0}function a(n,r=0,m=n.byteLength,_=0){for(let o=0;om.toString(16).padStart(2,"0")).join(""):S((n>>>0).toString(16),r/4)}t.toHexString=v;class C{constructor(){this._h0=1732584193,this._h1=4023233417,this._h2=2562383102,this._h3=271733878,this._h4=3285377520,this._buff=new Uint8Array(64+3),this._buffDV=new DataView(this._buff.buffer),this._buffLen=0,this._totalLen=0,this._leftoverHighSurrogate=0,this._finished=!1}update(r){const m=r.length;if(m!==0){const _=this._buff;let o=this._buffLen,i=this._leftoverHighSurrogate,f,b;for(i!==0?(f=i,b=-1,i=0):(f=r.charCodeAt(0),b=0);;){let N=f;if(p.isHighSurrogate(f))if(b+1>>6,r[m++]=128|(_&63)>>>0):_<65536?(r[m++]=224|(_&61440)>>>12,r[m++]=128|(_&4032)>>>6,r[m++]=128|(_&63)>>>0):(r[m++]=240|(_&1835008)>>>18,r[m++]=128|(_&258048)>>>12,r[m++]=128|(_&4032)>>>6,r[m++]=128|(_&63)>>>0),m>=64&&(this._step(),m-=64,this._totalLen+=64,r[0]=r[64+0],r[1]=r[64+1],r[2]=r[64+2]),m}digest(){return this._finished||(this._finished=!0,this._leftoverHighSurrogate&&(this._leftoverHighSurrogate=0,this._buffLen=this._push(this._buff,this._buffLen,65533)),this._totalLen+=this._buffLen,this._wrapUp()),v(this._h0)+v(this._h1)+v(this._h2)+v(this._h3)+v(this._h4)}_wrapUp(){this._buff[this._buffLen++]=128,a(this._buff,this._buffLen),this._buffLen>56&&(this._step(),a(this._buff));const r=8*this._totalLen;this._buffDV.setUint32(56,Math.floor(r/4294967296),!1),this._buffDV.setUint32(60,r%4294967296,!1),this._step()}_step(){const r=C._bigBlock32,m=this._buffDV;for(let L=0;L<64;L+=4)r.setUint32(L,m.getUint32(L,!1),!1);for(let L=64;L<320;L+=4)r.setUint32(L,w(r.getUint32(L-12,!1)^r.getUint32(L-32,!1)^r.getUint32(L-56,!1)^r.getUint32(L-64,!1),1),!1);let _=this._h0,o=this._h1,i=this._h2,f=this._h3,b=this._h4,N,c,g;for(let L=0;L<80;L++)L<20?(N=o&i|~o&f,c=1518500249):L<40?(N=o^i^f,c=1859775393):L<60?(N=o&i|o&f|i&f,c=2400959708):(N=o^i^f,c=3395469782),g=w(_,5)+N+b+c+r.getUint32(L*4,!1)&4294967295,b=f,f=i,i=w(o,30),o=_,_=g;this._h0=this._h0+_&4294967295,this._h1=this._h1+o&4294967295,this._h2=this._h2+i&4294967295,this._h3=this._h3+f&4294967295,this._h4=this._h4+b&4294967295}}t.StringSHA1=C,C._bigBlock32=new DataView(new ArrayBuffer(320))}),V(z[10],G([0,1,15,22]),function(I,t,p,P){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LcsDiff=t.MyArray=t.Debug=t.stringDiff=t.StringDiffSequence=void 0;class E{constructor(a){this.source=a}getElements(){const a=this.source,S=new Int32Array(a.length);for(let v=0,C=a.length;v0||this.m_modifiedCount>0)&&this.m_changes.push(new p.DiffChange(this.m_originalStart,this.m_originalCount,this.m_modifiedStart,this.m_modifiedCount)),this.m_originalCount=0,this.m_modifiedCount=0,this.m_originalStart=1073741824,this.m_modifiedStart=1073741824}AddOriginalElement(a,S){this.m_originalStart=Math.min(this.m_originalStart,a),this.m_modifiedStart=Math.min(this.m_modifiedStart,S),this.m_originalCount++}AddModifiedElement(a,S){this.m_originalStart=Math.min(this.m_originalStart,a),this.m_modifiedStart=Math.min(this.m_modifiedStart,S),this.m_modifiedCount++}getChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes}getReverseChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes.reverse(),this.m_changes}}class h{constructor(a,S,v=null){this.ContinueProcessingPredicate=v;const[C,n,r]=h._getElements(a),[m,_,o]=h._getElements(S);this._hasStrings=r&&o,this._originalStringElements=C,this._originalElementsOrHash=n,this._modifiedStringElements=m,this._modifiedElementsOrHash=_,this.m_forwardHistory=[],this.m_reverseHistory=[]}static _isStringArray(a){return a.length>0&&typeof a[0]=="string"}static _getElements(a){const S=a.getElements();if(h._isStringArray(S)){const v=new Int32Array(S.length);for(let C=0,n=S.length;C=a&&C>=v&&this.ElementsAreEqual(S,C);)S--,C--;if(a>S||v>C){let f;return v<=C?(d.Assert(a===S+1,"originalStart should only be one more than originalEnd"),f=[new p.DiffChange(a,0,v,C-v+1)]):a<=S?(d.Assert(v===C+1,"modifiedStart should only be one more than modifiedEnd"),f=[new p.DiffChange(a,S-a+1,v,0)]):(d.Assert(a===S+1,"originalStart should only be one more than originalEnd"),d.Assert(v===C+1,"modifiedStart should only be one more than modifiedEnd"),f=[]),f}const r=[0],m=[0],_=this.ComputeRecursionPoint(a,S,v,C,r,m,n),o=r[0],i=m[0];if(_!==null)return _;if(!n[0]){const f=this.ComputeDiffRecursive(a,o,v,i,n);let b=[];return n[0]?b=[new p.DiffChange(o+1,S-(o+1)+1,i+1,C-(i+1)+1)]:b=this.ComputeDiffRecursive(o+1,S,i+1,C,n),this.ConcatenateChanges(f,b)}return[new p.DiffChange(a,S-a+1,v,C-v+1)]}WALKTRACE(a,S,v,C,n,r,m,_,o,i,f,b,N,c,g,L,A,M){let R=null,D=null,T=new s,$=S,k=v,F=N[0]-L[0]-C,O=-1073741824,e=this.m_forwardHistory.length-1;do{const H=F+a;H===$||H=0&&(o=this.m_forwardHistory[e],a=o[0],$=1,k=o.length-1)}while(--e>=-1);if(R=T.getReverseChanges(),M[0]){let H=N[0]+1,B=L[0]+1;if(R!==null&&R.length>0){const Q=R[R.length-1];H=Math.max(H,Q.getOriginalEnd()),B=Math.max(B,Q.getModifiedEnd())}D=[new p.DiffChange(H,b-H+1,B,g-B+1)]}else{T=new s,$=r,k=m,F=N[0]-L[0]-_,O=1073741824,e=A?this.m_reverseHistory.length-1:this.m_reverseHistory.length-2;do{const H=F+n;H===$||H=i[H+1]?(f=i[H+1]-1,c=f-F-_,f>O&&T.MarkNextChange(),O=f+1,T.AddOriginalElement(f+1,c+1),F=H+1-n):(f=i[H-1],c=f-F-_,f>O&&T.MarkNextChange(),O=f,T.AddModifiedElement(f+1,c+1),F=H-1-n),e>=0&&(i=this.m_reverseHistory[e],n=i[0],$=1,k=i.length-1)}while(--e>=-1);D=T.getChanges()}return this.ConcatenateChanges(R,D)}ComputeRecursionPoint(a,S,v,C,n,r,m){let _=0,o=0,i=0,f=0,b=0,N=0;a--,v--,n[0]=0,r[0]=0,this.m_forwardHistory=[],this.m_reverseHistory=[];const c=S-a+(C-v),g=c+1,L=new Int32Array(g),A=new Int32Array(g),M=C-v,R=S-a,D=a-v,T=S-C,k=(R-M)%2==0;L[M]=a,A[R]=S,m[0]=!1;for(let F=1;F<=c/2+1;F++){let O=0,e=0;i=this.ClipDiagonalBound(M-F,F,M,g),f=this.ClipDiagonalBound(M+F,F,M,g);for(let B=i;B<=f;B+=2){B===i||BO+e&&(O=_,e=o),!k&&Math.abs(B-R)<=F-1&&_>=A[B])return n[0]=_,r[0]=o,Q<=A[B]&&1447>0&&F<=1447+1?this.WALKTRACE(M,i,f,D,R,b,N,T,L,A,_,S,n,o,C,r,k,m):null}const H=(O-a+(e-v)-F)/2;if(this.ContinueProcessingPredicate!==null&&!this.ContinueProcessingPredicate(O,H))return m[0]=!0,n[0]=O,r[0]=e,H>0&&1447>0&&F<=1447+1?this.WALKTRACE(M,i,f,D,R,b,N,T,L,A,_,S,n,o,C,r,k,m):(a++,v++,[new p.DiffChange(a,S-a+1,v,C-v+1)]);b=this.ClipDiagonalBound(R-F,F,R,g),N=this.ClipDiagonalBound(R+F,F,R,g);for(let B=b;B<=N;B+=2){B===b||B=A[B+1]?_=A[B+1]-1:_=A[B-1],o=_-(B-R)-T;const Q=_;for(;_>a&&o>v&&this.ElementsAreEqual(_,o);)_--,o--;if(A[B]=_,k&&Math.abs(B-M)<=F&&_<=L[B])return n[0]=_,r[0]=o,Q>=L[B]&&1447>0&&F<=1447+1?this.WALKTRACE(M,i,f,D,R,b,N,T,L,A,_,S,n,o,C,r,k,m):null}if(F<=1447){let B=new Int32Array(f-i+2);B[0]=M-i+1,l.Copy2(L,i,B,1,f-i+1),this.m_forwardHistory.push(B),B=new Int32Array(N-b+2),B[0]=R-b+1,l.Copy2(A,b,B,1,N-b+1),this.m_reverseHistory.push(B)}}return this.WALKTRACE(M,i,f,D,R,b,N,T,L,A,_,S,n,o,C,r,k,m)}PrettifyChanges(a){for(let S=0;S0,m=v.modifiedLength>0;for(;v.originalStart+v.originalLength=0;S--){const v=a[S];let C=0,n=0;if(S>0){const i=a[S-1];i.originalLength>0&&(C=i.originalStart+i.originalLength),i.modifiedLength>0&&(n=i.modifiedStart+i.modifiedLength)}const r=v.originalLength>0,m=v.modifiedLength>0;let _=0,o=this._boundaryScore(v.originalStart,v.originalLength,v.modifiedStart,v.modifiedLength);for(let i=1;;i++){const f=v.originalStart-i,b=v.modifiedStart-i;if(fo&&(o=N,_=i)}v.originalStart-=_,v.modifiedStart-=_}if(this._hasStrings)for(let S=1,v=a.length;S0&&N>_&&(_=N,o=f,i=b)}return _>0?[o,i]:null}_contiguousSequenceScore(a,S,v){let C=0;for(let n=0;n=this._originalElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._originalStringElements[a])}_OriginalRegionIsBoundary(a,S){if(this._OriginalIsBoundary(a)||this._OriginalIsBoundary(a-1))return!0;if(S>0){const v=a+S;if(this._OriginalIsBoundary(v-1)||this._OriginalIsBoundary(v))return!0}return!1}_ModifiedIsBoundary(a){return a<=0||a>=this._modifiedElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._modifiedStringElements[a])}_ModifiedRegionIsBoundary(a,S){if(this._ModifiedIsBoundary(a)||this._ModifiedIsBoundary(a-1))return!0;if(S>0){const v=a+S;if(this._ModifiedIsBoundary(v-1)||this._ModifiedIsBoundary(v))return!0}return!1}_boundaryScore(a,S,v,C){const n=this._OriginalRegionIsBoundary(a,S)?1:0,r=this._ModifiedRegionIsBoundary(v,C)?1:0;return n+r}ConcatenateChanges(a,S){let v=[];if(a.length===0||S.length===0)return S.length>0?S:a;if(this.ChangesOverlap(a[a.length-1],S[0],v)){const C=new Array(a.length+S.length-1);return l.Copy(a,0,C,0,a.length-1),C[a.length-1]=v[0],l.Copy(S,1,C,a.length,S.length-1),C}else{const C=new Array(a.length+S.length);return l.Copy(a,0,C,0,a.length),l.Copy(S,0,C,a.length,S.length),C}}ChangesOverlap(a,S,v){if(d.Assert(a.originalStart<=S.originalStart,"Left change is not less than or equal to right change"),d.Assert(a.modifiedStart<=S.modifiedStart,"Left change is not less than or equal to right change"),a.originalStart+a.originalLength>=S.originalStart||a.modifiedStart+a.modifiedLength>=S.modifiedStart){const C=a.originalStart;let n=a.originalLength;const r=a.modifiedStart;let m=a.modifiedLength;return a.originalStart+a.originalLength>=S.originalStart&&(n=S.originalStart+S.originalLength-a.originalStart),a.modifiedStart+a.modifiedLength>=S.modifiedStart&&(m=S.modifiedStart+S.modifiedLength-a.modifiedStart),v[0]=new p.DiffChange(C,n,r,m),!0}else return v[0]=null,!1}ClipDiagonalBound(a,S,v,C){if(a>=0&&afunction(){const N=Array.prototype.slice.call(arguments,0);return o(b,N)};let f={};for(const b of _)f[b]=i(b);return f}t.createProxyObject=r;function m(_){return _===null?void 0:_}t.withNullAsUndefined=m}),V(z[12],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.toUint32=t.toUint8=void 0;function p(E){return E<0?0:E>255?255:E|0}t.toUint8=p;function P(E){return E<0?0:E>4294967295?4294967295:E|0}t.toUint32=P}),V(z[13],G([0,1,2,20]),function(I,t,p,P){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.uriToFsPath=t.URI=void 0;const E=/^\w[\w\d+.-]*$/,u=/^\//,d=/^\/\//;function l(c,g){if(!c.scheme&&g)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${c.authority}", path: "${c.path}", query: "${c.query}", fragment: "${c.fragment}"}`);if(c.scheme&&!E.test(c.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(c.path){if(c.authority){if(!u.test(c.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(d.test(c.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}function s(c,g){return!c&&!g?"file":c}function h(c,g){switch(c){case"https":case"http":case"file":g?g[0]!==a&&(g=a+g):g=a;break}return g}const w="",a="/",S=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class v{constructor(g,L,A,M,R,D=!1){typeof g=="object"?(this.scheme=g.scheme||w,this.authority=g.authority||w,this.path=g.path||w,this.query=g.query||w,this.fragment=g.fragment||w):(this.scheme=s(g,D),this.authority=L||w,this.path=h(this.scheme,A||w),this.query=M||w,this.fragment=R||w,l(this,D))}static isUri(g){return g instanceof v?!0:g?typeof g.authority=="string"&&typeof g.fragment=="string"&&typeof g.path=="string"&&typeof g.query=="string"&&typeof g.scheme=="string"&&typeof g.fsPath=="string"&&typeof g.with=="function"&&typeof g.toString=="function":!1}get fsPath(){return o(this,!1)}with(g){if(!g)return this;let{scheme:L,authority:A,path:M,query:R,fragment:D}=g;return L===void 0?L=this.scheme:L===null&&(L=w),A===void 0?A=this.authority:A===null&&(A=w),M===void 0?M=this.path:M===null&&(M=w),R===void 0?R=this.query:R===null&&(R=w),D===void 0?D=this.fragment:D===null&&(D=w),L===this.scheme&&A===this.authority&&M===this.path&&R===this.query&&D===this.fragment?this:new n(L,A,M,R,D)}static parse(g,L=!1){const A=S.exec(g);return A?new n(A[2]||w,N(A[4]||w),N(A[5]||w),N(A[7]||w),N(A[9]||w),L):new n(w,w,w,w,w)}static file(g){let L=w;if(p.isWindows&&(g=g.replace(/\\/g,a)),g[0]===a&&g[1]===a){const A=g.indexOf(a,2);A===-1?(L=g.substring(2),g=a):(L=g.substring(2,A),g=g.substring(A)||a)}return new n("file",L,g,w,w)}static from(g){return new n(g.scheme,g.authority,g.path,g.query,g.fragment)}static joinPath(g,...L){if(!g.path)throw new Error("[UriError]: cannot call joinPath on URI without path");let A;return p.isWindows&&g.scheme==="file"?A=v.file(P.win32.join(o(g,!0),...L)).path:A=P.posix.join(g.path,...L),g.with({path:A})}toString(g=!1){return i(this,g)}toJSON(){return this}static revive(g){if(g){if(g instanceof v)return g;{const L=new n(g);return L._formatted=g.external,L._fsPath=g._sep===C?g.fsPath:null,L}}else return g}}t.URI=v;const C=p.isWindows?1:void 0;class n extends v{constructor(){super(...arguments);this._formatted=null,this._fsPath=null}get fsPath(){return this._fsPath||(this._fsPath=o(this,!1)),this._fsPath}toString(g=!1){return g?i(this,!0):(this._formatted||(this._formatted=i(this,!1)),this._formatted)}toJSON(){const g={$mid:1};return this._fsPath&&(g.fsPath=this._fsPath,g._sep=C),this._formatted&&(g.external=this._formatted),this.path&&(g.path=this.path),this.scheme&&(g.scheme=this.scheme),this.authority&&(g.authority=this.authority),this.query&&(g.query=this.query),this.fragment&&(g.fragment=this.fragment),g}}const r={[58]:"%3A",[47]:"%2F",[63]:"%3F",[35]:"%23",[91]:"%5B",[93]:"%5D",[64]:"%40",[33]:"%21",[36]:"%24",[38]:"%26",[39]:"%27",[40]:"%28",[41]:"%29",[42]:"%2A",[43]:"%2B",[44]:"%2C",[59]:"%3B",[61]:"%3D",[32]:"%20"};function m(c,g){let L,A=-1;for(let M=0;M=97&&R<=122||R>=65&&R<=90||R>=48&&R<=57||R===45||R===46||R===95||R===126||g&&R===47)A!==-1&&(L+=encodeURIComponent(c.substring(A,M)),A=-1),L!==void 0&&(L+=c.charAt(M));else{L===void 0&&(L=c.substr(0,M));const D=r[R];D!==void 0?(A!==-1&&(L+=encodeURIComponent(c.substring(A,M)),A=-1),L+=D):A===-1&&(A=M)}}return A!==-1&&(L+=encodeURIComponent(c.substring(A))),L!==void 0?L:c}function _(c){let g;for(let L=0;L1&&c.scheme==="file"?L=`//${c.authority}${c.path}`:c.path.charCodeAt(0)===47&&(c.path.charCodeAt(1)>=65&&c.path.charCodeAt(1)<=90||c.path.charCodeAt(1)>=97&&c.path.charCodeAt(1)<=122)&&c.path.charCodeAt(2)===58?g?L=c.path.substr(1):L=c.path[1].toLowerCase()+c.path.substr(2):L=c.path,p.isWindows&&(L=L.replace(/\//g,"\\")),L}t.uriToFsPath=o;function i(c,g){const L=g?_:m;let A="",{scheme:M,authority:R,path:D,query:T,fragment:$}=c;if(M&&(A+=M,A+=":"),(R||M==="file")&&(A+=a,A+=a),R){let k=R.indexOf("@");if(k!==-1){const F=R.substr(0,k);R=R.substr(k+1),k=F.indexOf(":"),k===-1?A+=L(F,!1):(A+=L(F.substr(0,k),!1),A+=":",A+=L(F.substr(k+1),!1)),A+="@"}R=R.toLowerCase(),k=R.indexOf(":"),k===-1?A+=L(R,!1):(A+=L(R.substr(0,k),!1),A+=R.substr(k))}if(D){if(D.length>=3&&D.charCodeAt(0)===47&&D.charCodeAt(2)===58){const k=D.charCodeAt(1);k>=65&&k<=90&&(D=`/${String.fromCharCode(k+32)}:${D.substr(3)}`)}else if(D.length>=2&&D.charCodeAt(1)===58){const k=D.charCodeAt(0);k>=65&&k<=90&&(D=`${String.fromCharCode(k+32)}:${D.substr(2)}`)}A+=L(D,!0)}return T&&(A+="?",A+=L(T,!1)),$&&(A+="#",A+=g?$:m($,!1)),A}function f(c){try{return decodeURIComponent(c)}catch(g){return c.length>3?c.substr(0,3)+f(c.substr(3)):c}}const b=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function N(c){return c.match(b)?c.replace(b,g=>f(g)):c}}),V(z[34],G([0,1,4,7,2,11]),function(I,t,p,P,E,u){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.create=t.SimpleWorkerServer=t.SimpleWorkerClient=t.logOnceWebWorkerWarning=void 0;const d="$initialize";let l=!1;function s(v){!E.isWeb||(l||(l=!0,console.warn("Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq")),console.warn(v.message))}t.logOnceWebWorkerWarning=s;class h{constructor(C){this._workerId=-1,this._handler=C,this._lastSentReq=0,this._pendingReplies=Object.create(null)}setWorkerId(C){this._workerId=C}sendMessage(C,n){let r=String(++this._lastSentReq);return new Promise((m,_)=>{this._pendingReplies[r]={resolve:m,reject:_},this._send({vsWorker:this._workerId,req:r,method:C,args:n})})}handleMessage(C){!C||!C.vsWorker||this._workerId!==-1&&C.vsWorker!==this._workerId||this._handleMessage(C)}_handleMessage(C){if(C.seq){let _=C;if(!this._pendingReplies[_.seq]){console.warn("Got reply to unknown seq");return}let o=this._pendingReplies[_.seq];if(delete this._pendingReplies[_.seq],_.err){let i=_.err;_.err.$isError&&(i=new Error,i.name=_.err.name,i.message=_.err.message,i.stack=_.err.stack),o.reject(i);return}o.resolve(_.res);return}let n=C,r=n.req;this._handler.handleMessage(n.method,n.args).then(_=>{this._send({vsWorker:this._workerId,seq:r,res:_,err:void 0})},_=>{_.detail instanceof Error&&(_.detail=p.transformErrorForSerialization(_.detail)),this._send({vsWorker:this._workerId,seq:r,res:void 0,err:p.transformErrorForSerialization(_)})})}_send(C){let n=[];if(C.req){const r=C;for(let m=0;m{this._protocol.handleMessage(f)},f=>{m&&m(f)})),this._protocol=new h({sendMessage:(f,b)=>{this._worker.postMessage(f,b)},handleMessage:(f,b)=>{if(typeof r[f]!="function")return Promise.reject(new Error("Missing method "+f+" on main thread host."));try{return Promise.resolve(r[f].apply(r,b))}catch(N){return Promise.reject(N)}}}),this._protocol.setWorkerId(this._worker.getId());let _=null;typeof self.require!="undefined"&&typeof self.require.getConfig=="function"?_=self.require.getConfig():typeof self.requirejs!="undefined"&&(_=self.requirejs.s.contexts._.config);const o=u.getAllMethodNames(r);this._onModuleLoaded=this._protocol.sendMessage(d,[this._worker.getId(),JSON.parse(JSON.stringify(_)),n,o]);const i=(f,b)=>this._request(f,b);this._lazyProxy=new Promise((f,b)=>{m=b,this._onModuleLoaded.then(N=>{f(u.createProxyObject(N,i))},N=>{b(N),this._onError("Worker failed to load "+n,N)})})}getProxyObject(){return this._lazyProxy}_request(C,n){return new Promise((r,m)=>{this._onModuleLoaded.then(()=>{this._protocol.sendMessage(C,n).then(r,m)},m)})}_onError(C,n){console.error(C),console.info(n)}}t.SimpleWorkerClient=w;class a{constructor(C,n){this._requestHandlerFactory=n,this._requestHandler=null,this._protocol=new h({sendMessage:(r,m)=>{C(r,m)},handleMessage:(r,m)=>this._handleMessage(r,m)})}onmessage(C){this._protocol.handleMessage(C)}_handleMessage(C,n){if(C===d)return this.initialize(n[0],n[1],n[2],n[3]);if(!this._requestHandler||typeof this._requestHandler[C]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+C));try{return Promise.resolve(this._requestHandler[C].apply(this._requestHandler,n))}catch(r){return Promise.reject(r)}}initialize(C,n,r,m){this._protocol.setWorkerId(C);const _=(i,f)=>this._protocol.sendMessage(i,f),o=u.createProxyObject(m,_);return this._requestHandlerFactory?(this._requestHandler=this._requestHandlerFactory(o),Promise.resolve(u.getAllMethodNames(this._requestHandler))):(n&&(typeof n.baseUrl!="undefined"&&delete n.baseUrl,typeof n.paths!="undefined"&&typeof n.paths.vs!="undefined"&&delete n.paths.vs,typeof n.trustedTypesPolicy!==void 0&&delete n.trustedTypesPolicy,n.catchError=!0,self.require.config(n)),new Promise((i,f)=>{self.require([r],b=>{if(this._requestHandler=b.create(o),!this._requestHandler){f(new Error("No RequestHandler!"));return}i(u.getAllMethodNames(this._requestHandler))},f)}))}}t.SimpleWorkerServer=a;function S(v){return new a(v,null)}t.create=S}),V(z[23],G([0,1,12]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CharacterSet=t.CharacterClassifier=void 0;class P{constructor(d){let l=p.toUint8(d);this._defaultValue=l,this._asciiMap=P._createAsciiMap(l),this._map=new Map}static _createAsciiMap(d){let l=new Uint8Array(256);for(let s=0;s<256;s++)l[s]=d;return l}set(d,l){let s=p.toUint8(l);d>=0&&d<256?this._asciiMap[d]=s:this._map.set(d,s)}get(d){return d>=0&&d<256?this._asciiMap[d]:this._map.get(d)||this._defaultValue}}t.CharacterClassifier=P;class E{constructor(){this._actual=new P(0)}add(d){this._actual.set(d,1)}has(d){return this._actual.get(d)===1}}t.CharacterSet=E}),V(z[3],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Position=void 0;class p{constructor(E,u){this.lineNumber=E,this.column=u}with(E=this.lineNumber,u=this.column){return E===this.lineNumber&&u===this.column?this:new p(E,u)}delta(E=0,u=0){return this.with(this.lineNumber+E,this.column+u)}equals(E){return p.equals(this,E)}static equals(E,u){return!E&&!u?!0:!!E&&!!u&&E.lineNumber===u.lineNumber&&E.column===u.column}isBefore(E){return p.isBefore(this,E)}static isBefore(E,u){return E.lineNumberl||u===l&&d>s?(this.startLineNumber=l,this.startColumn=s,this.endLineNumber=u,this.endColumn=d):(this.startLineNumber=u,this.startColumn=d,this.endLineNumber=l,this.endColumn=s)}isEmpty(){return P.isEmpty(this)}static isEmpty(u){return u.startLineNumber===u.endLineNumber&&u.startColumn===u.endColumn}containsPosition(u){return P.containsPosition(this,u)}static containsPosition(u,d){return!(d.lineNumberu.endLineNumber||d.lineNumber===u.startLineNumber&&d.columnu.endColumn)}containsRange(u){return P.containsRange(this,u)}static containsRange(u,d){return!(d.startLineNumberu.endLineNumber||d.endLineNumber>u.endLineNumber||d.startLineNumber===u.startLineNumber&&d.startColumnu.endColumn)}strictContainsRange(u){return P.strictContainsRange(this,u)}static strictContainsRange(u,d){return!(d.startLineNumberu.endLineNumber||d.endLineNumber>u.endLineNumber||d.startLineNumber===u.startLineNumber&&d.startColumn<=u.startColumn||d.endLineNumber===u.endLineNumber&&d.endColumn>=u.endColumn)}plusRange(u){return P.plusRange(this,u)}static plusRange(u,d){let l,s,h,w;return d.startLineNumberu.endLineNumber?(h=d.endLineNumber,w=d.endColumn):d.endLineNumber===u.endLineNumber?(h=d.endLineNumber,w=Math.max(d.endColumn,u.endColumn)):(h=u.endLineNumber,w=u.endColumn),new P(l,s,h,w)}intersectRanges(u){return P.intersectRanges(this,u)}static intersectRanges(u,d){let l=u.startLineNumber,s=u.startColumn,h=u.endLineNumber,w=u.endColumn,a=d.startLineNumber,S=d.startColumn,v=d.endLineNumber,C=d.endColumn;return lv?(h=v,w=C):h===v&&(w=Math.min(w,C)),l>h||l===h&&s>w?null:new P(l,s,h,w)}equalsRange(u){return P.equalsRange(this,u)}static equalsRange(u,d){return!!u&&!!d&&u.startLineNumber===d.startLineNumber&&u.startColumn===d.startColumn&&u.endLineNumber===d.endLineNumber&&u.endColumn===d.endColumn}getEndPosition(){return P.getEndPosition(this)}static getEndPosition(u){return new p.Position(u.endLineNumber,u.endColumn)}getStartPosition(){return P.getStartPosition(this)}static getStartPosition(u){return new p.Position(u.startLineNumber,u.startColumn)}toString(){return"["+this.startLineNumber+","+this.startColumn+" -> "+this.endLineNumber+","+this.endColumn+"]"}setEndPosition(u,d){return new P(this.startLineNumber,this.startColumn,u,d)}setStartPosition(u,d){return new P(u,d,this.endLineNumber,this.endColumn)}collapseToStart(){return P.collapseToStart(this)}static collapseToStart(u){return new P(u.startLineNumber,u.startColumn,u.startLineNumber,u.startColumn)}static fromPositions(u,d=u){return new P(u.lineNumber,u.column,d.lineNumber,d.column)}static lift(u){return u?new P(u.startLineNumber,u.startColumn,u.endLineNumber,u.endColumn):null}static isIRange(u){return u&&typeof u.startLineNumber=="number"&&typeof u.startColumn=="number"&&typeof u.endLineNumber=="number"&&typeof u.endColumn=="number"}static areIntersectingOrTouching(u,d){return!(u.endLineNumberu.startLineNumber}}t.Range=P}),V(z[24],G([0,1,3,6]),function(I,t,p,P){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Selection=void 0;class E extends P.Range{constructor(d,l,s,h){super(d,l,s,h);this.selectionStartLineNumber=d,this.selectionStartColumn=l,this.positionLineNumber=s,this.positionColumn=h}toString(){return"["+this.selectionStartLineNumber+","+this.selectionStartColumn+" -> "+this.positionLineNumber+","+this.positionColumn+"]"}equalsSelection(d){return E.selectionsEqual(this,d)}static selectionsEqual(d,l){return d.selectionStartLineNumber===l.selectionStartLineNumber&&d.selectionStartColumn===l.selectionStartColumn&&d.positionLineNumber===l.positionLineNumber&&d.positionColumn===l.positionColumn}getDirection(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?0:1}setEndPosition(d,l){return this.getDirection()===0?new E(this.startLineNumber,this.startColumn,d,l):new E(d,l,this.startLineNumber,this.startColumn)}getPosition(){return new p.Position(this.positionLineNumber,this.positionColumn)}setStartPosition(d,l){return this.getDirection()===0?new E(d,l,this.endLineNumber,this.endColumn):new E(this.endLineNumber,this.endColumn,d,l)}static fromPositions(d,l=d){return new E(d.lineNumber,d.column,l.lineNumber,l.column)}static liftSelection(d){return new E(d.selectionStartLineNumber,d.selectionStartColumn,d.positionLineNumber,d.positionColumn)}static selectionsArrEqual(d,l){if(d&&!l||!d&&l)return!1;if(!d&&!l)return!0;if(d.length!==l.length)return!1;for(let s=0,h=d.length;s0&&m.originalLength<20&&m.modifiedLength>0&&m.modifiedLength<20&&i()){const M=_.createCharSequence(r,m.originalStart,m.originalStart+m.originalLength-1),R=o.createCharSequence(r,m.modifiedStart,m.modifiedStart+m.modifiedLength-1);let D=u(M,R,i,!0).changes;b&&(D=h(D)),A=[];for(let T=0,$=D.length;T<$;T++)A.push(s.createFromDiffChange(D[T],M,R))}return new w(N,c,g,L,A)}}class a{constructor(r,m,_){this.shouldComputeCharChanges=_.shouldComputeCharChanges,this.shouldPostProcessCharChanges=_.shouldPostProcessCharChanges,this.shouldIgnoreTrimWhitespace=_.shouldIgnoreTrimWhitespace,this.shouldMakePrettyDiff=_.shouldMakePrettyDiff,this.originalLines=r,this.modifiedLines=m,this.original=new d(r),this.modified=new d(m),this.continueLineDiff=C(_.maxComputationTime),this.continueCharDiff=C(_.maxComputationTime===0?0:Math.min(_.maxComputationTime,5e3))}computeDiff(){if(this.original.lines.length===1&&this.original.lines[0].length===0)return this.modified.lines.length===1&&this.modified.lines[0].length===0?{quitEarly:!1,changes:[]}:{quitEarly:!1,changes:[{originalStartLineNumber:1,originalEndLineNumber:1,modifiedStartLineNumber:1,modifiedEndLineNumber:this.modified.lines.length,charChanges:[{modifiedEndColumn:0,modifiedEndLineNumber:0,modifiedStartColumn:0,modifiedStartLineNumber:0,originalEndColumn:0,originalEndLineNumber:0,originalStartColumn:0,originalStartLineNumber:0}]}]};if(this.modified.lines.length===1&&this.modified.lines[0].length===0)return{quitEarly:!1,changes:[{originalStartLineNumber:1,originalEndLineNumber:this.original.lines.length,modifiedStartLineNumber:1,modifiedEndLineNumber:1,charChanges:[{modifiedEndColumn:0,modifiedEndLineNumber:0,modifiedStartColumn:0,modifiedStartLineNumber:0,originalEndColumn:0,originalEndLineNumber:0,originalStartColumn:0,originalStartLineNumber:0}]}]};const r=u(this.original,this.modified,this.continueLineDiff,this.shouldMakePrettyDiff),m=r.changes,_=r.quitEarly;if(this.shouldIgnoreTrimWhitespace){const b=[];for(let N=0,c=m.length;N1&&D>1;){const T=A.charCodeAt(R-2),$=M.charCodeAt(D-2);if(T!==$)break;R--,D--}(R>1||D>1)&&this._pushTrimWhitespaceCharChange(o,i+1,1,R,f+1,1,D)}{let R=v(A,1),D=v(M,1);const T=A.length+1,$=M.length+1;for(;R!0;const r=Date.now();return()=>Date.now()-r/?";function p(l=""){let s="(-?\\d*\\.\\d\\w*)|([^";for(const h of t.USUAL_WORD_SEPARATORS)l.indexOf(h)>=0||(s+="\\"+h);return s+="\\s]+)",new RegExp(s,"g")}t.DEFAULT_WORD_REGEXP=p();function P(l){let s=t.DEFAULT_WORD_REGEXP;if(l&&l instanceof RegExp)if(l.global)s=l;else{let h="g";l.ignoreCase&&(h+="i"),l.multiline&&(h+="m"),l.unicode&&(h+="u"),s=new RegExp(l.source,h)}return s.lastIndex=0,s}t.ensureValidWordDefinition=P;const E={maxLen:1e3,windowSize:15,timeBudget:150};function u(l,s,h,w,a=E){if(h.length>a.maxLen){let r=l-a.maxLen/2;return r<0?r=0:w+=r,h=h.substring(r,l+a.maxLen/2),u(l,s,h,w,a)}const S=Date.now(),v=l-1-w;let C=-1,n=null;for(let r=1;!(Date.now()-S>=a.timeBudget);r++){const m=v-a.windowSize*r;s.lastIndex=Math.max(0,m);const _=d(s,h,v,C);if(!_&&n||(n=_,m<=0))break;C=m}if(n){let r={word:n[0],startColumn:w+1+n.index,endColumn:w+1+n.index+n[0].length};return s.lastIndex=0,r}return null}t.getWordAtText=u;function d(l,s,h,w){let a;for(;a=l.exec(s);){const S=a.index||0;if(S<=h&&l.lastIndex>=h)return a;if(w>0&&S>w)return null}return null}}),V(z[28],G([0,1,23]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.computeLinks=t.LinkComputer=t.StateMachine=t.Uint8Matrix=void 0;class P{constructor(S,v,C){const n=new Uint8Array(S*v);for(let r=0,m=S*v;rv&&(v=o),_>C&&(C=_),i>C&&(C=i)}v++,C++;let n=new P(C,v,0);for(let r=0,m=S.length;r=this._maxCharCode?0:this._states.get(S,v)}}t.StateMachine=E;let u=null;function d(){return u===null&&(u=new E([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),u}let l=null;function s(){if(l===null){l=new p.CharacterClassifier(0);const a=` <>'"\u3001\u3002\uFF61\uFF64\uFF0C\uFF0E\uFF1A\uFF1B\u2018\u201C\u3008\u300A\u300C\u300E\u3010\u3014\uFF08\uFF3B\uFF5B\uFF62\uFF63\uFF5D\uFF3D\uFF09\u3015\u3011\u300F\u300D\u300B\u3009\u201D\u2019\uFF40\uFF5E\u2026`;for(let v=0;vn);if(n>0){const _=v.charCodeAt(n-1),o=v.charCodeAt(m);(_===40&&o===41||_===91&&o===93||_===123&&o===125)&&m--}return{range:{startLineNumber:C,startColumn:n+1,endLineNumber:C,endColumn:m+2},url:v.substring(n,m+1)}}static computeLinks(S,v=d()){const C=s();let n=[];for(let r=1,m=S.getLineCount();r<=m;r++){const _=S.getLineContent(r),o=_.length;let i=0,f=0,b=0,N=1,c=!1,g=!1,L=!1,A=!1;for(;i=0?(l+=d?1:-1,l<0?l=E.length-1:l%=E.length,E[l]):null}}t.BasicInplaceReplace=p,p.INSTANCE=new p}),V(z[30],G([0,1]),function(I,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WrappingIndent=t.TrackedRangeStickiness=t.TextEditorCursorStyle=t.TextEditorCursorBlinkingStyle=t.SymbolTag=t.SymbolKind=t.SignatureHelpTriggerKind=t.SelectionDirection=t.ScrollbarVisibility=t.ScrollType=t.RenderMinimap=t.RenderLineNumbersType=t.OverviewRulerLane=t.OverlayWidgetPositionPreference=t.MouseTargetType=t.MinimapPosition=t.MarkerTag=t.MarkerSeverity=t.KeyCode=t.InlineHintKind=t.IndentAction=t.EndOfLineSequence=t.EndOfLinePreference=t.EditorOption=t.EditorAutoIndentStrategy=t.DocumentHighlightKind=t.DefaultEndOfLine=t.CursorChangeReason=t.ContentWidgetPositionPreference=t.CompletionTriggerKind=t.CompletionItemTag=t.CompletionItemKind=t.CompletionItemInsertTextRule=t.AccessibilitySupport=void 0;var p;(function(e){e[e.Unknown=0]="Unknown",e[e.Disabled=1]="Disabled",e[e.Enabled=2]="Enabled"})(p=t.AccessibilitySupport||(t.AccessibilitySupport={}));var P;(function(e){e[e.KeepWhitespace=1]="KeepWhitespace",e[e.InsertAsSnippet=4]="InsertAsSnippet"})(P=t.CompletionItemInsertTextRule||(t.CompletionItemInsertTextRule={}));var E;(function(e){e[e.Method=0]="Method",e[e.Function=1]="Function",e[e.Constructor=2]="Constructor",e[e.Field=3]="Field",e[e.Variable=4]="Variable",e[e.Class=5]="Class",e[e.Struct=6]="Struct",e[e.Interface=7]="Interface",e[e.Module=8]="Module",e[e.Property=9]="Property",e[e.Event=10]="Event",e[e.Operator=11]="Operator",e[e.Unit=12]="Unit",e[e.Value=13]="Value",e[e.Constant=14]="Constant",e[e.Enum=15]="Enum",e[e.EnumMember=16]="EnumMember",e[e.Keyword=17]="Keyword",e[e.Text=18]="Text",e[e.Color=19]="Color",e[e.File=20]="File",e[e.Reference=21]="Reference",e[e.Customcolor=22]="Customcolor",e[e.Folder=23]="Folder",e[e.TypeParameter=24]="TypeParameter",e[e.User=25]="User",e[e.Issue=26]="Issue",e[e.Snippet=27]="Snippet"})(E=t.CompletionItemKind||(t.CompletionItemKind={}));var u;(function(e){e[e.Deprecated=1]="Deprecated"})(u=t.CompletionItemTag||(t.CompletionItemTag={}));var d;(function(e){e[e.Invoke=0]="Invoke",e[e.TriggerCharacter=1]="TriggerCharacter",e[e.TriggerForIncompleteCompletions=2]="TriggerForIncompleteCompletions"})(d=t.CompletionTriggerKind||(t.CompletionTriggerKind={}));var l;(function(e){e[e.EXACT=0]="EXACT",e[e.ABOVE=1]="ABOVE",e[e.BELOW=2]="BELOW"})(l=t.ContentWidgetPositionPreference||(t.ContentWidgetPositionPreference={}));var s;(function(e){e[e.NotSet=0]="NotSet",e[e.ContentFlush=1]="ContentFlush",e[e.RecoverFromMarkers=2]="RecoverFromMarkers",e[e.Explicit=3]="Explicit",e[e.Paste=4]="Paste",e[e.Undo=5]="Undo",e[e.Redo=6]="Redo"})(s=t.CursorChangeReason||(t.CursorChangeReason={}));var h;(function(e){e[e.LF=1]="LF",e[e.CRLF=2]="CRLF"})(h=t.DefaultEndOfLine||(t.DefaultEndOfLine={}));var w;(function(e){e[e.Text=0]="Text",e[e.Read=1]="Read",e[e.Write=2]="Write"})(w=t.DocumentHighlightKind||(t.DocumentHighlightKind={}));var a;(function(e){e[e.None=0]="None",e[e.Keep=1]="Keep",e[e.Brackets=2]="Brackets",e[e.Advanced=3]="Advanced",e[e.Full=4]="Full"})(a=t.EditorAutoIndentStrategy||(t.EditorAutoIndentStrategy={}));var S;(function(e){e[e.acceptSuggestionOnCommitCharacter=0]="acceptSuggestionOnCommitCharacter",e[e.acceptSuggestionOnEnter=1]="acceptSuggestionOnEnter",e[e.accessibilitySupport=2]="accessibilitySupport",e[e.accessibilityPageSize=3]="accessibilityPageSize",e[e.ariaLabel=4]="ariaLabel",e[e.autoClosingBrackets=5]="autoClosingBrackets",e[e.autoClosingOvertype=6]="autoClosingOvertype",e[e.autoClosingQuotes=7]="autoClosingQuotes",e[e.autoIndent=8]="autoIndent",e[e.automaticLayout=9]="automaticLayout",e[e.autoSurround=10]="autoSurround",e[e.codeLens=11]="codeLens",e[e.codeLensFontFamily=12]="codeLensFontFamily",e[e.codeLensFontSize=13]="codeLensFontSize",e[e.colorDecorators=14]="colorDecorators",e[e.columnSelection=15]="columnSelection",e[e.comments=16]="comments",e[e.contextmenu=17]="contextmenu",e[e.copyWithSyntaxHighlighting=18]="copyWithSyntaxHighlighting",e[e.cursorBlinking=19]="cursorBlinking",e[e.cursorSmoothCaretAnimation=20]="cursorSmoothCaretAnimation",e[e.cursorStyle=21]="cursorStyle",e[e.cursorSurroundingLines=22]="cursorSurroundingLines",e[e.cursorSurroundingLinesStyle=23]="cursorSurroundingLinesStyle",e[e.cursorWidth=24]="cursorWidth",e[e.disableLayerHinting=25]="disableLayerHinting",e[e.disableMonospaceOptimizations=26]="disableMonospaceOptimizations",e[e.dragAndDrop=27]="dragAndDrop",e[e.emptySelectionClipboard=28]="emptySelectionClipboard",e[e.extraEditorClassName=29]="extraEditorClassName",e[e.fastScrollSensitivity=30]="fastScrollSensitivity",e[e.find=31]="find",e[e.fixedOverflowWidgets=32]="fixedOverflowWidgets",e[e.folding=33]="folding",e[e.foldingStrategy=34]="foldingStrategy",e[e.foldingHighlight=35]="foldingHighlight",e[e.unfoldOnClickAfterEndOfLine=36]="unfoldOnClickAfterEndOfLine",e[e.fontFamily=37]="fontFamily",e[e.fontInfo=38]="fontInfo",e[e.fontLigatures=39]="fontLigatures",e[e.fontSize=40]="fontSize",e[e.fontWeight=41]="fontWeight",e[e.formatOnPaste=42]="formatOnPaste",e[e.formatOnType=43]="formatOnType",e[e.glyphMargin=44]="glyphMargin",e[e.gotoLocation=45]="gotoLocation",e[e.hideCursorInOverviewRuler=46]="hideCursorInOverviewRuler",e[e.highlightActiveIndentGuide=47]="highlightActiveIndentGuide",e[e.hover=48]="hover",e[e.inDiffEditor=49]="inDiffEditor",e[e.letterSpacing=50]="letterSpacing",e[e.lightbulb=51]="lightbulb",e[e.lineDecorationsWidth=52]="lineDecorationsWidth",e[e.lineHeight=53]="lineHeight",e[e.lineNumbers=54]="lineNumbers",e[e.lineNumbersMinChars=55]="lineNumbersMinChars",e[e.linkedEditing=56]="linkedEditing",e[e.links=57]="links",e[e.matchBrackets=58]="matchBrackets",e[e.minimap=59]="minimap",e[e.mouseStyle=60]="mouseStyle",e[e.mouseWheelScrollSensitivity=61]="mouseWheelScrollSensitivity",e[e.mouseWheelZoom=62]="mouseWheelZoom",e[e.multiCursorMergeOverlapping=63]="multiCursorMergeOverlapping",e[e.multiCursorModifier=64]="multiCursorModifier",e[e.multiCursorPaste=65]="multiCursorPaste",e[e.occurrencesHighlight=66]="occurrencesHighlight",e[e.overviewRulerBorder=67]="overviewRulerBorder",e[e.overviewRulerLanes=68]="overviewRulerLanes",e[e.padding=69]="padding",e[e.parameterHints=70]="parameterHints",e[e.peekWidgetDefaultFocus=71]="peekWidgetDefaultFocus",e[e.definitionLinkOpensInPeek=72]="definitionLinkOpensInPeek",e[e.quickSuggestions=73]="quickSuggestions",e[e.quickSuggestionsDelay=74]="quickSuggestionsDelay",e[e.readOnly=75]="readOnly",e[e.renameOnType=76]="renameOnType",e[e.renderControlCharacters=77]="renderControlCharacters",e[e.renderIndentGuides=78]="renderIndentGuides",e[e.renderFinalNewline=79]="renderFinalNewline",e[e.renderLineHighlight=80]="renderLineHighlight",e[e.renderLineHighlightOnlyWhenFocus=81]="renderLineHighlightOnlyWhenFocus",e[e.renderValidationDecorations=82]="renderValidationDecorations",e[e.renderWhitespace=83]="renderWhitespace",e[e.revealHorizontalRightPadding=84]="revealHorizontalRightPadding",e[e.roundedSelection=85]="roundedSelection",e[e.rulers=86]="rulers",e[e.scrollbar=87]="scrollbar",e[e.scrollBeyondLastColumn=88]="scrollBeyondLastColumn",e[e.scrollBeyondLastLine=89]="scrollBeyondLastLine",e[e.scrollPredominantAxis=90]="scrollPredominantAxis",e[e.selectionClipboard=91]="selectionClipboard",e[e.selectionHighlight=92]="selectionHighlight",e[e.selectOnLineNumbers=93]="selectOnLineNumbers",e[e.showFoldingControls=94]="showFoldingControls",e[e.showUnused=95]="showUnused",e[e.snippetSuggestions=96]="snippetSuggestions",e[e.smartSelect=97]="smartSelect",e[e.smoothScrolling=98]="smoothScrolling",e[e.stickyTabStops=99]="stickyTabStops",e[e.stopRenderingLineAfter=100]="stopRenderingLineAfter",e[e.suggest=101]="suggest",e[e.suggestFontSize=102]="suggestFontSize",e[e.suggestLineHeight=103]="suggestLineHeight",e[e.suggestOnTriggerCharacters=104]="suggestOnTriggerCharacters",e[e.suggestSelection=105]="suggestSelection",e[e.tabCompletion=106]="tabCompletion",e[e.tabIndex=107]="tabIndex",e[e.unusualLineTerminators=108]="unusualLineTerminators",e[e.useTabStops=109]="useTabStops",e[e.wordSeparators=110]="wordSeparators",e[e.wordWrap=111]="wordWrap",e[e.wordWrapBreakAfterCharacters=112]="wordWrapBreakAfterCharacters",e[e.wordWrapBreakBeforeCharacters=113]="wordWrapBreakBeforeCharacters",e[e.wordWrapColumn=114]="wordWrapColumn",e[e.wordWrapOverride1=115]="wordWrapOverride1",e[e.wordWrapOverride2=116]="wordWrapOverride2",e[e.wrappingIndent=117]="wrappingIndent",e[e.wrappingStrategy=118]="wrappingStrategy",e[e.showDeprecated=119]="showDeprecated",e[e.inlineHints=120]="inlineHints",e[e.editorClassName=121]="editorClassName",e[e.pixelRatio=122]="pixelRatio",e[e.tabFocusMode=123]="tabFocusMode",e[e.layoutInfo=124]="layoutInfo",e[e.wrappingInfo=125]="wrappingInfo"})(S=t.EditorOption||(t.EditorOption={}));var v;(function(e){e[e.TextDefined=0]="TextDefined",e[e.LF=1]="LF",e[e.CRLF=2]="CRLF"})(v=t.EndOfLinePreference||(t.EndOfLinePreference={}));var C;(function(e){e[e.LF=0]="LF",e[e.CRLF=1]="CRLF"})(C=t.EndOfLineSequence||(t.EndOfLineSequence={}));var n;(function(e){e[e.None=0]="None",e[e.Indent=1]="Indent",e[e.IndentOutdent=2]="IndentOutdent",e[e.Outdent=3]="Outdent"})(n=t.IndentAction||(t.IndentAction={}));var r;(function(e){e[e.Other=0]="Other",e[e.Type=1]="Type",e[e.Parameter=2]="Parameter"})(r=t.InlineHintKind||(t.InlineHintKind={}));var m;(function(e){e[e.Unknown=0]="Unknown",e[e.Backspace=1]="Backspace",e[e.Tab=2]="Tab",e[e.Enter=3]="Enter",e[e.Shift=4]="Shift",e[e.Ctrl=5]="Ctrl",e[e.Alt=6]="Alt",e[e.PauseBreak=7]="PauseBreak",e[e.CapsLock=8]="CapsLock",e[e.Escape=9]="Escape",e[e.Space=10]="Space",e[e.PageUp=11]="PageUp",e[e.PageDown=12]="PageDown",e[e.End=13]="End",e[e.Home=14]="Home",e[e.LeftArrow=15]="LeftArrow",e[e.UpArrow=16]="UpArrow",e[e.RightArrow=17]="RightArrow",e[e.DownArrow=18]="DownArrow",e[e.Insert=19]="Insert",e[e.Delete=20]="Delete",e[e.KEY_0=21]="KEY_0",e[e.KEY_1=22]="KEY_1",e[e.KEY_2=23]="KEY_2",e[e.KEY_3=24]="KEY_3",e[e.KEY_4=25]="KEY_4",e[e.KEY_5=26]="KEY_5",e[e.KEY_6=27]="KEY_6",e[e.KEY_7=28]="KEY_7",e[e.KEY_8=29]="KEY_8",e[e.KEY_9=30]="KEY_9",e[e.KEY_A=31]="KEY_A",e[e.KEY_B=32]="KEY_B",e[e.KEY_C=33]="KEY_C",e[e.KEY_D=34]="KEY_D",e[e.KEY_E=35]="KEY_E",e[e.KEY_F=36]="KEY_F",e[e.KEY_G=37]="KEY_G",e[e.KEY_H=38]="KEY_H",e[e.KEY_I=39]="KEY_I",e[e.KEY_J=40]="KEY_J",e[e.KEY_K=41]="KEY_K",e[e.KEY_L=42]="KEY_L",e[e.KEY_M=43]="KEY_M",e[e.KEY_N=44]="KEY_N",e[e.KEY_O=45]="KEY_O",e[e.KEY_P=46]="KEY_P",e[e.KEY_Q=47]="KEY_Q",e[e.KEY_R=48]="KEY_R",e[e.KEY_S=49]="KEY_S",e[e.KEY_T=50]="KEY_T",e[e.KEY_U=51]="KEY_U",e[e.KEY_V=52]="KEY_V",e[e.KEY_W=53]="KEY_W",e[e.KEY_X=54]="KEY_X",e[e.KEY_Y=55]="KEY_Y",e[e.KEY_Z=56]="KEY_Z",e[e.Meta=57]="Meta",e[e.ContextMenu=58]="ContextMenu",e[e.F1=59]="F1",e[e.F2=60]="F2",e[e.F3=61]="F3",e[e.F4=62]="F4",e[e.F5=63]="F5",e[e.F6=64]="F6",e[e.F7=65]="F7",e[e.F8=66]="F8",e[e.F9=67]="F9",e[e.F10=68]="F10",e[e.F11=69]="F11",e[e.F12=70]="F12",e[e.F13=71]="F13",e[e.F14=72]="F14",e[e.F15=73]="F15",e[e.F16=74]="F16",e[e.F17=75]="F17",e[e.F18=76]="F18",e[e.F19=77]="F19",e[e.NumLock=78]="NumLock",e[e.ScrollLock=79]="ScrollLock",e[e.US_SEMICOLON=80]="US_SEMICOLON",e[e.US_EQUAL=81]="US_EQUAL",e[e.US_COMMA=82]="US_COMMA",e[e.US_MINUS=83]="US_MINUS",e[e.US_DOT=84]="US_DOT",e[e.US_SLASH=85]="US_SLASH",e[e.US_BACKTICK=86]="US_BACKTICK",e[e.US_OPEN_SQUARE_BRACKET=87]="US_OPEN_SQUARE_BRACKET",e[e.US_BACKSLASH=88]="US_BACKSLASH",e[e.US_CLOSE_SQUARE_BRACKET=89]="US_CLOSE_SQUARE_BRACKET",e[e.US_QUOTE=90]="US_QUOTE",e[e.OEM_8=91]="OEM_8",e[e.OEM_102=92]="OEM_102",e[e.NUMPAD_0=93]="NUMPAD_0",e[e.NUMPAD_1=94]="NUMPAD_1",e[e.NUMPAD_2=95]="NUMPAD_2",e[e.NUMPAD_3=96]="NUMPAD_3",e[e.NUMPAD_4=97]="NUMPAD_4",e[e.NUMPAD_5=98]="NUMPAD_5",e[e.NUMPAD_6=99]="NUMPAD_6",e[e.NUMPAD_7=100]="NUMPAD_7",e[e.NUMPAD_8=101]="NUMPAD_8",e[e.NUMPAD_9=102]="NUMPAD_9",e[e.NUMPAD_MULTIPLY=103]="NUMPAD_MULTIPLY",e[e.NUMPAD_ADD=104]="NUMPAD_ADD",e[e.NUMPAD_SEPARATOR=105]="NUMPAD_SEPARATOR",e[e.NUMPAD_SUBTRACT=106]="NUMPAD_SUBTRACT",e[e.NUMPAD_DECIMAL=107]="NUMPAD_DECIMAL",e[e.NUMPAD_DIVIDE=108]="NUMPAD_DIVIDE",e[e.KEY_IN_COMPOSITION=109]="KEY_IN_COMPOSITION",e[e.ABNT_C1=110]="ABNT_C1",e[e.ABNT_C2=111]="ABNT_C2",e[e.MAX_VALUE=112]="MAX_VALUE"})(m=t.KeyCode||(t.KeyCode={}));var _;(function(e){e[e.Hint=1]="Hint",e[e.Info=2]="Info",e[e.Warning=4]="Warning",e[e.Error=8]="Error"})(_=t.MarkerSeverity||(t.MarkerSeverity={}));var o;(function(e){e[e.Unnecessary=1]="Unnecessary",e[e.Deprecated=2]="Deprecated"})(o=t.MarkerTag||(t.MarkerTag={}));var i;(function(e){e[e.Inline=1]="Inline",e[e.Gutter=2]="Gutter"})(i=t.MinimapPosition||(t.MinimapPosition={}));var f;(function(e){e[e.UNKNOWN=0]="UNKNOWN",e[e.TEXTAREA=1]="TEXTAREA",e[e.GUTTER_GLYPH_MARGIN=2]="GUTTER_GLYPH_MARGIN",e[e.GUTTER_LINE_NUMBERS=3]="GUTTER_LINE_NUMBERS",e[e.GUTTER_LINE_DECORATIONS=4]="GUTTER_LINE_DECORATIONS",e[e.GUTTER_VIEW_ZONE=5]="GUTTER_VIEW_ZONE",e[e.CONTENT_TEXT=6]="CONTENT_TEXT",e[e.CONTENT_EMPTY=7]="CONTENT_EMPTY",e[e.CONTENT_VIEW_ZONE=8]="CONTENT_VIEW_ZONE",e[e.CONTENT_WIDGET=9]="CONTENT_WIDGET",e[e.OVERVIEW_RULER=10]="OVERVIEW_RULER",e[e.SCROLLBAR=11]="SCROLLBAR",e[e.OVERLAY_WIDGET=12]="OVERLAY_WIDGET",e[e.OUTSIDE_EDITOR=13]="OUTSIDE_EDITOR"})(f=t.MouseTargetType||(t.MouseTargetType={}));var b;(function(e){e[e.TOP_RIGHT_CORNER=0]="TOP_RIGHT_CORNER",e[e.BOTTOM_RIGHT_CORNER=1]="BOTTOM_RIGHT_CORNER",e[e.TOP_CENTER=2]="TOP_CENTER"})(b=t.OverlayWidgetPositionPreference||(t.OverlayWidgetPositionPreference={}));var N;(function(e){e[e.Left=1]="Left",e[e.Center=2]="Center",e[e.Right=4]="Right",e[e.Full=7]="Full"})(N=t.OverviewRulerLane||(t.OverviewRulerLane={}));var c;(function(e){e[e.Off=0]="Off",e[e.On=1]="On",e[e.Relative=2]="Relative",e[e.Interval=3]="Interval",e[e.Custom=4]="Custom"})(c=t.RenderLineNumbersType||(t.RenderLineNumbersType={}));var g;(function(e){e[e.None=0]="None",e[e.Text=1]="Text",e[e.Blocks=2]="Blocks"})(g=t.RenderMinimap||(t.RenderMinimap={}));var L;(function(e){e[e.Smooth=0]="Smooth",e[e.Immediate=1]="Immediate"})(L=t.ScrollType||(t.ScrollType={}));var A;(function(e){e[e.Auto=1]="Auto",e[e.Hidden=2]="Hidden",e[e.Visible=3]="Visible"})(A=t.ScrollbarVisibility||(t.ScrollbarVisibility={}));var M;(function(e){e[e.LTR=0]="LTR",e[e.RTL=1]="RTL"})(M=t.SelectionDirection||(t.SelectionDirection={}));var R;(function(e){e[e.Invoke=1]="Invoke",e[e.TriggerCharacter=2]="TriggerCharacter",e[e.ContentChange=3]="ContentChange"})(R=t.SignatureHelpTriggerKind||(t.SignatureHelpTriggerKind={}));var D;(function(e){e[e.File=0]="File",e[e.Module=1]="Module",e[e.Namespace=2]="Namespace",e[e.Package=3]="Package",e[e.Class=4]="Class",e[e.Method=5]="Method",e[e.Property=6]="Property",e[e.Field=7]="Field",e[e.Constructor=8]="Constructor",e[e.Enum=9]="Enum",e[e.Interface=10]="Interface",e[e.Function=11]="Function",e[e.Variable=12]="Variable",e[e.Constant=13]="Constant",e[e.String=14]="String",e[e.Number=15]="Number",e[e.Boolean=16]="Boolean",e[e.Array=17]="Array",e[e.Object=18]="Object",e[e.Key=19]="Key",e[e.Null=20]="Null",e[e.EnumMember=21]="EnumMember",e[e.Struct=22]="Struct",e[e.Event=23]="Event",e[e.Operator=24]="Operator",e[e.TypeParameter=25]="TypeParameter"})(D=t.SymbolKind||(t.SymbolKind={}));var T;(function(e){e[e.Deprecated=1]="Deprecated"})(T=t.SymbolTag||(t.SymbolTag={}));var $;(function(e){e[e.Hidden=0]="Hidden",e[e.Blink=1]="Blink",e[e.Smooth=2]="Smooth",e[e.Phase=3]="Phase",e[e.Expand=4]="Expand",e[e.Solid=5]="Solid"})($=t.TextEditorCursorBlinkingStyle||(t.TextEditorCursorBlinkingStyle={}));var k;(function(e){e[e.Line=1]="Line",e[e.Block=2]="Block",e[e.Underline=3]="Underline",e[e.LineThin=4]="LineThin",e[e.BlockOutline=5]="BlockOutline",e[e.UnderlineThin=6]="UnderlineThin"})(k=t.TextEditorCursorStyle||(t.TextEditorCursorStyle={}));var F;(function(e){e[e.AlwaysGrowsWhenTypingAtEdges=0]="AlwaysGrowsWhenTypingAtEdges",e[e.NeverGrowsWhenTypingAtEdges=1]="NeverGrowsWhenTypingAtEdges",e[e.GrowsOnlyWhenTypingBefore=2]="GrowsOnlyWhenTypingBefore",e[e.GrowsOnlyWhenTypingAfter=3]="GrowsOnlyWhenTypingAfter"})(F=t.TrackedRangeStickiness||(t.TrackedRangeStickiness={}));var O;(function(e){e[e.None=0]="None",e[e.Same=1]="Same",e[e.Indent=2]="Indent",e[e.DeepIndent=3]="DeepIndent"})(O=t.WrappingIndent||(t.WrappingIndent={}))}),V(z[31],G([0,1,21,9,17,13,3,6,24,25,30]),function(I,t,p,P,E,u,d,l,s,h,w){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createMonacoBaseAPI=t.KeyMod=void 0;class a{static chord(C,n){return E.KeyChord(C,n)}}t.KeyMod=a,a.CtrlCmd=2048,a.Shift=1024,a.Alt=512,a.WinCtrl=256;function S(){return{editor:void 0,languages:void 0,CancellationTokenSource:p.CancellationTokenSource,Emitter:P.Emitter,KeyCode:w.KeyCode,KeyMod:a,Position:d.Position,Range:l.Range,Selection:s.Selection,SelectionDirection:w.SelectionDirection,MarkerSeverity:w.MarkerSeverity,MarkerTag:w.MarkerTag,Uri:u.URI,Token:h.Token}}t.createMonacoBaseAPI=S}),V(z[32],G([0,1,12]),function(I,t,p){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PrefixSumComputer=t.PrefixSumIndexOfResult=void 0;class P{constructor(d,l){this.index=d,this.remainder=l}}t.PrefixSumIndexOfResult=P;class E{constructor(d){this.values=d,this.prefixSum=new Uint32Array(d.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}insertValues(d,l){d=p.toUint32(d);const s=this.values,h=this.prefixSum,w=l.length;return w===0?!1:(this.values=new Uint32Array(s.length+w),this.values.set(s.subarray(0,d),0),this.values.set(s.subarray(d),d+w),this.values.set(l,d),d-1=0&&this.prefixSum.set(h.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}changeValue(d,l){return d=p.toUint32(d),l=p.toUint32(l),this.values[d]===l?!1:(this.values[d]=l,d-1=s.length)return!1;let w=s.length-d;return l>=w&&(l=w),l===0?!1:(this.values=new Uint32Array(s.length-l),this.values.set(s.subarray(0,d),0),this.values.set(s.subarray(d+l),d),this.prefixSum=new Uint32Array(this.values.length),d-1=0&&this.prefixSum.set(h.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}getTotalValue(){return this.values.length===0?0:this._getAccumulatedValue(this.values.length-1)}getAccumulatedValue(d){return d<0?0:(d=p.toUint32(d),this._getAccumulatedValue(d))}_getAccumulatedValue(d){if(d<=this.prefixSumValidIndex[0])return this.prefixSum[d];let l=this.prefixSumValidIndex[0]+1;l===0&&(this.prefixSum[0]=this.values[0],l++),d>=this.values.length&&(d=this.values.length-1);for(let s=l;s<=d;s++)this.prefixSum[s]=this.prefixSum[s-1]+this.values[s];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],d),this.prefixSum[d]}getIndexOf(d){d=Math.floor(d),this.getTotalValue();let l=0,s=this.values.length-1,h=0,w=0,a=0;for(;l<=s;)if(h=l+(s-l)/2|0,w=this.prefixSum[h],a=w-this.values[h],d=w)l=h+1;else break;return new P(h,d-a)}}t.PrefixSumComputer=E}),V(z[33],G([0,1,5,3,32]),function(I,t,p,P,E){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.MirrorTextModel=void 0;class u{constructor(l,s,h,w){this._uri=l,this._lines=s,this._eol=h,this._versionId=w,this._lineStarts=null,this._cachedTextValue=null}dispose(){this._lines.length=0}getText(){return this._cachedTextValue===null&&(this._cachedTextValue=this._lines.join(this._eol)),this._cachedTextValue}onEvents(l){l.eol&&l.eol!==this._eol&&(this._eol=l.eol,this._lineStarts=null);const s=l.changes;for(const h of s)this._acceptDeleteRange(h.range),this._acceptInsertText(new P.Position(h.range.startLineNumber,h.range.startColumn),h.text);this._versionId=l.versionId,this._cachedTextValue=null}_ensureLineStarts(){if(!this._lineStarts){const l=this._eol.length,s=this._lines.length,h=new Uint32Array(s);for(let w=0;wthis._lines.length)f=this._lines.length,b=this._lines[f-1].length+1,N=!0;else{let c=this._lines[f-1].length+1;b<1?(b=1,N=!0):b>c&&(b=c,N=!0)}return N?{lineNumber:f,column:b}:i}}class m{constructor(i,f){this._host=i,this._models=Object.create(null),this._foreignModuleFactory=f,this._foreignModule=null}dispose(){this._models=Object.create(null)}_getModel(i){return this._models[i]}_getModels(){let i=[];return Object.keys(this._models).forEach(f=>i.push(this._models[f])),i}acceptNewModel(i){this._models[i.url]=new r(u.URI.parse(i.url),i.lines,i.EOL,i.versionId)}acceptModelChanged(i,f){!this._models[i]||this._models[i].onEvents(f)}acceptRemovedModel(i){!this._models[i]||delete this._models[i]}computeDiff(i,f,b,N){return ne(this,void 0,void 0,function*(){const c=this._getModel(i),g=this._getModel(f);if(!c||!g)return null;const L=c.getLinesContent(),A=g.getLinesContent(),R=new s.DiffComputer(L,A,{shouldComputeCharChanges:!0,shouldPostProcessCharChanges:!0,shouldIgnoreTrimWhitespace:b,shouldMakePrettyDiff:!0,maxComputationTime:N}).computeDiff(),D=R.changes.length>0?!1:this._modelsAreIdentical(c,g);return{quitEarly:R.quitEarly,identical:D,changes:R.changes}})}_modelsAreIdentical(i,f){const b=i.getLineCount(),N=f.getLineCount();if(b!==N)return!1;for(let c=1;c<=b;c++){const g=i.getLineContent(c),L=f.getLineContent(c);if(g!==L)return!1}return!0}computeMoreMinimalEdits(i,f){return ne(this,void 0,void 0,function*(){const b=this._getModel(i);if(!b)return f;const N=[];let c;f=p.mergeSort(f,(g,L)=>{if(g.range&&L.range)return l.Range.compareRangesUsingStarts(g.range,L.range);let A=g.range?0:1,M=L.range?0:1;return A-M});for(let{range:g,text:L,eol:A}of f)if(typeof A=="number"&&(c=A),!(l.Range.isEmpty(g)&&!L)){const M=b.getValueInRange(g);if(L=L.replace(/\r\n|\n|\r/g,b.eol),M!==L){if(Math.max(L.length,M.length)>m._diffLimit){N.push({range:g,text:L});continue}const R=P.stringDiff(M,L,!1),D=b.offsetAt(l.Range.lift(g).getStartPosition());for(const T of R){const $=b.positionAt(D+T.originalStart),k=b.positionAt(D+T.originalStart+T.originalLength),F={text:L.substr(T.modifiedStart,T.modifiedLength),range:{startLineNumber:$.lineNumber,startColumn:$.column,endLineNumber:k.lineNumber,endColumn:k.column}};b.getValueInRange(F.range)!==F.text&&N.push(F)}}}return typeof c=="number"&&N.push({eol:c,text:"",range:{startLineNumber:0,startColumn:0,endLineNumber:0,endColumn:0}}),N})}computeLinks(i){return ne(this,void 0,void 0,function*(){let f=this._getModel(i);return f?a.computeLinks(f):null})}textualSuggest(i,f,b,N){return ne(this,void 0,void 0,function*(){const c=new n.StopWatch(!0),g=new RegExp(b,N),L=new Set;e:for(let A of i){const M=this._getModel(A);if(!!M){for(let R of M.words(g))if(!(R===f||!isNaN(Number(R)))&&(L.add(R),L.size>m._suggestionsLimit))break e}}return{words:Array.from(L),duration:c.elapsed()}})}computeWordRanges(i,f,b,N){return ne(this,void 0,void 0,function*(){let c=this._getModel(i);if(!c)return Object.create(null);const g=new RegExp(b,N),L=Object.create(null);for(let A=f.startLineNumber;Athis._host.fhr(L,A);let g={host:C.createProxyObject(b,N),getMirrorModels:()=>this._getModels()};return this._foreignModuleFactory?(this._foreignModule=this._foreignModuleFactory(g,f),Promise.resolve(C.getAllMethodNames(this._foreignModule))):new Promise((L,A)=>{I([i],M=>{this._foreignModule=M.create(g,f),L(C.getAllMethodNames(this._foreignModule))},A)})}fmr(i,f){if(!this._foreignModule||typeof this._foreignModule[i]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+i));try{return Promise.resolve(this._foreignModule[i].apply(this._foreignModule,f))}catch(b){return Promise.reject(b)}}}t.EditorSimpleWorker=m,m._diffLimit=1e5,m._suggestionsLimit=1e4;function _(o){return new m(o,null)}t.create=_,typeof importScripts=="function"&&(E.globals.monaco=v.createMonacoBaseAPI())});"use strict";(function(){var I,t;const p=self.MonacoEnvironment,P=p&&p.baseUrl?p.baseUrl:"../../../",E=typeof((I=self.trustedTypes)===null||I===void 0?void 0:I.createPolicy)=="function"?(t=self.trustedTypes)===null||t===void 0?void 0:t.createPolicy("amdLoader",{createScriptURL:s=>s}):void 0;if(typeof self.define!="function"||!self.define.amd){let s=P+"vs/loader.js";E&&(s=E.createScriptURL(s)),importScripts(s)}require.config({baseUrl:P,catchError:!0,trustedTypesPolicy:E});let u=function(s){require([s],function(h){setTimeout(function(){let w=h.create((a,S)=>{self.postMessage(a,S)},null);for(self.onmessage=a=>w.onmessage(a.data);l.length>0;)self.onmessage(l.shift())},0)})},d=!0,l=[];self.onmessage=s=>{if(!d){l.push(s);return}d=!1,u(s.data)}})()}).call(this); diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/base/worker/workerMain.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/base/worker/workerMain.js.gz new file mode 100644 index 0000000..c2db5d2 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/base/worker/workerMain.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/abap/abap.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/abap/abap.js new file mode 100644 index 0000000..efe87c5 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/abap/abap.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/abap/abap",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"*"},brackets:[["[","]"],["(",")"]]};n.language={defaultToken:"invalid",ignoreCase:!0,tokenPostfix:".abap",keywords:["abap-source","abbreviated","abstract","accept","accepting","according","activation","actual","add","add-corresponding","adjacent","after","alias","aliases","align","all","allocate","alpha","analysis","analyzer","append","appendage","appending","application","archive","area","arithmetic","as","ascending","aspect","assert","assign","assigned","assigning","association","asynchronous","at","attributes","authority","authority-check","avg","back","background","backup","backward","badi","base","before","begin","big","binary","bintohex","bit","black","blank","blanks","blob","block","blocks","blue","bound","boundaries","bounds","boxed","break-point","buffer","by","bypassing","byte","byte-order","call","calling","case","cast","casting","catch","center","centered","chain","chain-input","chain-request","change","changing","channels","character","char-to-hex","check","checkbox","ci_","circular","class","class-coding","class-data","class-events","class-methods","class-pool","cleanup","clear","client","clob","clock","close","coalesce","code","coding","col_background","col_group","col_heading","col_key","col_negative","col_normal","col_positive","col_total","collect","color","column","columns","comment","comments","commit","common","communication","comparing","component","components","compression","compute","concat","concat_with_space","concatenate","cond","condition","connect","connection","constants","context","contexts","continue","control","controls","conv","conversion","convert","copies","copy","corresponding","country","cover","cpi","create","creating","critical","currency","currency_conversion","current","cursor","cursor-selection","customer","customer-function","dangerous","data","database","datainfo","dataset","date","dats_add_days","dats_add_months","dats_days_between","dats_is_valid","daylight","dd/mm/yy","dd/mm/yyyy","ddmmyy","deallocate","decimal_shift","decimals","declarations","deep","default","deferred","define","defining","definition","delete","deleting","demand","department","descending","describe","destination","detail","dialog","directory","disconnect","display","display-mode","distinct","divide","divide-corresponding","division","do","dummy","duplicate","duplicates","duration","during","dynamic","dynpro","edit","editor-call","else","elseif","empty","enabled","enabling","encoding","end","endat","endcase","endcatch","endchain","endclass","enddo","endenhancement","end-enhancement-section","endexec","endform","endfunction","endian","endif","ending","endinterface","end-lines","endloop","endmethod","endmodule","end-of-definition","end-of-editing","end-of-file","end-of-page","end-of-selection","endon","endprovide","endselect","end-test-injection","end-test-seam","endtry","endwhile","endwith","engineering","enhancement","enhancement-point","enhancements","enhancement-section","entries","entry","enum","environment","errormessage","errors","escaping","event","events","exact","except","exception","exceptions","exception-table","exclude","excluding","exec","execute","exists","exit","exit-command","expand","expanding","expiration","explicit","exponent","export","exporting","extend","extended","extension","extract","fail","fetch","field","field-groups","fields","field-symbol","field-symbols","file","filter","filters","filter-table","final","first","first-line","fixed-point","fkeq","fkge","flush","font","for","form","format","forward","found","frame","frames","free","friends","from","function","functionality","function-pool","further","gaps","generate","get","giving","gkeq","gkge","global","grant","green","group","groups","handle","handler","harmless","hashed","having","hdb","header","headers","heading","head-lines","help-id","help-request","hextobin","hide","high","hint","hold","hotspot","icon","id","identification","identifier","ids","if","ignore","ignoring","immediately","implementation","implementations","implemented","implicit","import","importing","inactive","incl","include","includes","including","increment","index","index-line","infotypes","inheriting","init","initial","initialization","inner","inout","input","instance","instances","instr","intensified","interface","interface-pool","interfaces","internal","intervals","into","inverse","inverted-date","is","iso","job","join","keep","keeping","kernel","key","keys","keywords","kind","language","last","late","layout","leading","leave","left","left-justified","leftplus","leftspace","legacy","length","let","level","levels","like","line","line-count","linefeed","line-selection","line-size","list","listbox","list-processing","little","llang","load","load-of-program","lob","local","locale","locator","logfile","logical","log-point","long","loop","low","lower","lpad","lpi","ltrim","mail","main","major-id","mapping","margin","mark","mask","matchcode","max","maximum","medium","members","memory","mesh","message","message-id","messages","messaging","method","methods","min","minimum","minor-id","mm/dd/yy","mm/dd/yyyy","mmddyy","mode","modif","modifier","modify","module","move","move-corresponding","multiply","multiply-corresponding","name","nametab","native","nested","nesting","new","new-line","new-page","new-section","next","no","node","nodes","no-display","no-extension","no-gap","no-gaps","no-grouping","no-heading","non-unicode","non-unique","no-scrolling","no-sign","no-title","no-topofpage","no-zero","null","number","object","objects","obligatory","occurrence","occurrences","occurs","of","off","offset","ole","on","only","open","option","optional","options","order","other","others","out","outer","output","output-length","overflow","overlay","pack","package","pad","padding","page","pages","parameter","parameters","parameter-table","part","partially","pattern","percentage","perform","performing","person","pf1","pf10","pf11","pf12","pf13","pf14","pf15","pf2","pf3","pf4","pf5","pf6","pf7","pf8","pf9","pf-status","pink","places","pool","pos_high","pos_low","position","pragmas","precompiled","preferred","preserving","primary","print","print-control","priority","private","procedure","process","program","property","protected","provide","public","push","pushbutton","put","queue-only","quickinfo","radiobutton","raise","raising","range","ranges","read","reader","read-only","receive","received","receiver","receiving","red","redefinition","reduce","reduced","ref","reference","refresh","regex","reject","remote","renaming","replacement","replacing","report","request","requested","reserve","reset","resolution","respecting","responsible","result","results","resumable","resume","retry","return","returncode","returning","returns","right","right-justified","rightplus","rightspace","risk","rmc_communication_failure","rmc_invalid_status","rmc_system_failure","role","rollback","rows","rpad","rtrim","run","sap","sap-spool","saving","scale_preserving","scale_preserving_scientific","scan","scientific","scientific_with_leading_zero","scroll","scroll-boundary","scrolling","search","secondary","seconds","section","select","selection","selections","selection-screen","selection-set","selection-sets","selection-table","select-options","send","separate","separated","set","shared","shift","short","shortdump-id","sign_as_postfix","single","size","skip","skipping","smart","some","sort","sortable","sorted","source","specified","split","spool","spots","sql","sqlscript","stable","stamp","standard","starting","start-of-editing","start-of-selection","state","statement","statements","static","statics","statusinfo","step-loop","stop","structure","structures","style","subkey","submatches","submit","subroutine","subscreen","subtract","subtract-corresponding","suffix","sum","summary","summing","supplied","supply","suppress","switch","switchstates","symbol","syncpoints","syntax","syntax-check","syntax-trace","system-call","system-exceptions","system-exit","tab","tabbed","tables","tableview","tabstrip","target","task","tasks","test","testing","test-injection","test-seam","text","textpool","then","throw","time","times","timestamp","timezone","tims_is_valid","title","titlebar","title-lines","to","tokenization","tokens","top-lines","top-of-page","trace-file","trace-table","trailing","transaction","transfer","transformation","transporting","trmac","truncate","truncation","try","tstmp_add_seconds","tstmp_current_utctimestamp","tstmp_is_valid","tstmp_seconds_between","type","type-pool","type-pools","types","uline","unassign","under","unicode","union","unique","unit_conversion","unix","unpack","until","unwind","up","update","upper","user","user-command","using","utf-8","valid","value","value-request","values","vary","varying","verification-message","version","via","view","visible","wait","warning","when","whenever","where","while","width","window","windows","with","with-heading","without","with-title","word","work","write","writer","xml","xsd","yellow","yes","yymmdd","zero","zone","abs","acos","asin","atan","bit-set","boolc","boolx","ceil","char_off","charlen","cmax","cmin","concat_lines_of","condense","contains","contains_any_not_of","contains_any_of","cos","cosh","count","count_any_not_of","count_any_of","dbmaxlen","distance","escape","exp","find","find_any_not_of","find_any_of","find_end","floor","frac","from_mixed","insert","ipow","line_exists","line_index","lines","log","log10","match","matches","nmax","nmin","numofchar","repeat","replace","rescale","reverse","round","segment","shift_left","shift_right","sign","sin","sinh","sqrt","strlen","substring","substring_after","substring_before","substring_from","substring_to","tan","tanh","to_lower","to_mixed","to_upper","translate","trunc","utclong_add","utclong_current","utclong_diff","xsdbool","xstrlen"],typeKeywords:["b","c","d","decfloat16","decfloat34","f","i","int8","n","p","s","string","t","utclong","x","xstring","any","clike","csequence","decfloat","numeric","simple","xsequence","table","hashed","index","sorted","standard","accp","char","clnt","cuky","curr","dats","dec","df16_dec","df16_raw","df34_dec","df34_raw","fltp","int1","int2","int4","lang","lchr","lraw","numc","quan","raw","rawstring","sstring","tims","unit","df16_scl","df34_scl","prec","varc","abap_bool","space","me","syst","sy","screen"],operators:[" +"," -","/","*","**","div","mod","=","#","@","&","&&","bit-and","bit-not","bit-or","bit-xor","m","o","z","and","equiv","not","or"," < "," > ","<=",">=","<>","><","=<","=>","between","bt","byte-ca","byte-cn","byte-co","byte-cs","byte-na","byte-ns","ca","cn","co","cp","cs","eq","ge","gt","in","le","lt","na","nb","ne","np","ns"],symbols:/[=>/,"identifier"],{include:"@whitespace"},[/[:,.]/,"delimiter"],[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/'/,{token:"string",bracket:"@open",next:"@stringquote"}],[/`/,{token:"string",bracket:"@open",next:"@stringping"}],[/\|/,{token:"string",bracket:"@open",next:"@stringtemplate"}],[/\d+/,"number"]],stringtemplate:[[/[^\\\|]+/,"string"],[/\\\|/,"string"],[/\|/,{token:"string",bracket:"@close",next:"@pop"}]],stringping:[[/[^\\`]+/,"string"],[/`/,{token:"string",bracket:"@close",next:"@pop"}]],stringquote:[[/[^\\']+/,"string"],[/'/,{token:"string",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[/^\*.*$/,"comment"],[/\".*$/,"comment"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/abap/abap.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/abap/abap.js.gz new file mode 100644 index 0000000..7ccf312 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/abap/abap.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/apex/apex.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/apex/apex.js new file mode 100644 index 0000000..8c75f02 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/apex/apex.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/apex/apex",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}};var s=[];["abstract","activate","and","any","array","as","asc","assert","autonomous","begin","bigdecimal","blob","boolean","break","bulk","by","case","cast","catch","char","class","collect","commit","const","continue","convertcurrency","decimal","default","delete","desc","do","double","else","end","enum","exception","exit","export","extends","false","final","finally","float","for","from","future","get","global","goto","group","having","hint","if","implements","import","in","inner","insert","instanceof","int","interface","into","join","last_90_days","last_month","last_n_days","last_week","like","limit","list","long","loop","map","merge","native","new","next_90_days","next_month","next_n_days","next_week","not","null","nulls","number","object","of","on","or","outer","override","package","parallel","pragma","private","protected","public","retrieve","return","returning","rollback","savepoint","search","select","set","short","sort","stat","static","strictfp","super","switch","synchronized","system","testmethod","then","this","this_month","this_week","throw","throws","today","tolabel","tomorrow","transaction","transient","trigger","true","try","type","undelete","update","upsert","using","virtual","void","volatile","webservice","when","where","while","yesterday"].forEach((function(e){s.push(e),s.push(e.toUpperCase()),s.push(function(e){return e.charAt(0).toUpperCase()+e.substr(1)}(e))})),t.language={defaultToken:"",tokenPostfix:".apex",keywords:s,operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@apexdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],apexdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/apex/apex.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/apex/apex.js.gz new file mode 100644 index 0000000..a7a18ba Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/apex/apex.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/azcli/azcli.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/azcli/azcli.js new file mode 100644 index 0000000..2ee40f6 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/azcli/azcli.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/azcli/azcli",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"#"}},t.language={defaultToken:"keyword",ignoreCase:!0,tokenPostfix:".azcli",str:/[^#\s]/,tokenizer:{root:[{include:"@comment"},[/\s-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}],[/^-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}]],type:[{include:"@comment"},[/-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":"key.identifier"}}],[/@str+\s*/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}]],comment:[[/#.*$/,{cases:{"@eos":{token:"comment",next:"@popall"}}}]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/azcli/azcli.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/azcli/azcli.js.gz new file mode 100644 index 0000000..95dedd3 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/azcli/azcli.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/bat/bat.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/bat/bat.js new file mode 100644 index 0000000..b12e11b --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/bat/bat.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/bat/bat",["require","exports"],(function(e,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.language=s.conf=void 0,s.conf={comments:{lineComment:"REM"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],folding:{markers:{start:new RegExp("^\\s*(::\\s*|REM\\s+)#region"),end:new RegExp("^\\s*(::\\s*|REM\\s+)#endregion")}}},s.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".bat",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:/call|defined|echo|errorlevel|exist|for|goto|if|pause|set|shift|start|title|not|pushd|popd/,symbols:/[=>"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}]},o.language={defaultToken:"",tokenPostfix:".cameligo",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["abs","begin","Bytes","Crypto","Current","else","end","failwith","false","fun","if","in","let","let%entry","let%init","List","list","Map","map","match","match%nat","mod","not","operation","Operation","of","Set","set","sender","source","String","then","true","type","with"],typeKeywords:["int","unit","string","tz"],operators:["=",">","<","<=",">=","<>",":",":=","and","mod","or","+","-","*","/","@","&","^","%","->","<-"],symbols:/[=><:@\^&|+\-*\/\^%]+/,tokenizer:{root:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\$[0-9a-fA-F]{1,16}/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'/,"string","@string"],[/'[^\\']'/,"string"],[/'/,"string.invalid"],[/\#\d+/,"string"]],comment:[[/[^\(\*]+/,"comment"],[/\*\)/,"comment","@pop"],[/\(\*/,"comment"]],string:[[/[^\\']+/,"string"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/cameligo/cameligo.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/cameligo/cameligo.js.gz new file mode 100644 index 0000000..830625e Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/cameligo/cameligo.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/clojure/clojure.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/clojure/clojure.js new file mode 100644 index 0000000..24e807d --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/clojure/clojure.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/clojure/clojure",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:";;"},brackets:[["[","]"],["(",")"],["{","}"]],autoClosingPairs:[{open:"[",close:"]"},{open:'"',close:'"'},{open:"(",close:")"},{open:"{",close:"}"}],surroundingPairs:[{open:"[",close:"]"},{open:'"',close:'"'},{open:"(",close:")"},{open:"{",close:"}"}]},t.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".clj",brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"}],constants:["true","false","nil"],numbers:/^(?:[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\[\]\s"#'(),;@^`{}~]|$))/,characters:/^(?:\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\[\]\s"(),;@^`{}~]|$))/,escapes:/^\\(?:["'\\bfnrt]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,qualifiedSymbols:/^(?:(?:[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*(?:\.[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*\/)?(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*(?=[\\\[\]\s"(),;@^`{}~]|$))/,specialForms:[".","catch","def","do","if","monitor-enter","monitor-exit","new","quote","recur","set!","throw","try","var"],coreSymbols:["*","*'","*1","*2","*3","*agent*","*allow-unresolved-vars*","*assert*","*clojure-version*","*command-line-args*","*compile-files*","*compile-path*","*compiler-options*","*data-readers*","*default-data-reader-fn*","*e","*err*","*file*","*flush-on-newline*","*fn-loader*","*in*","*math-context*","*ns*","*out*","*print-dup*","*print-length*","*print-level*","*print-meta*","*print-namespace-maps*","*print-readably*","*read-eval*","*reader-resolver*","*source-path*","*suppress-read*","*unchecked-math*","*use-context-classloader*","*verbose-defrecords*","*warn-on-reflection*","+","+'","-","-'","->","->>","->ArrayChunk","->Eduction","->Vec","->VecNode","->VecSeq","-cache-protocol-fn","-reset-methods","..","/","<","<=","=","==",">",">=","EMPTY-NODE","Inst","StackTraceElement->vec","Throwable->map","accessor","aclone","add-classpath","add-watch","agent","agent-error","agent-errors","aget","alength","alias","all-ns","alter","alter-meta!","alter-var-root","amap","ancestors","and","any?","apply","areduce","array-map","as->","aset","aset-boolean","aset-byte","aset-char","aset-double","aset-float","aset-int","aset-long","aset-short","assert","assoc","assoc!","assoc-in","associative?","atom","await","await-for","await1","bases","bean","bigdec","bigint","biginteger","binding","bit-and","bit-and-not","bit-clear","bit-flip","bit-not","bit-or","bit-set","bit-shift-left","bit-shift-right","bit-test","bit-xor","boolean","boolean-array","boolean?","booleans","bound-fn","bound-fn*","bound?","bounded-count","butlast","byte","byte-array","bytes","bytes?","case","cast","cat","char","char-array","char-escape-string","char-name-string","char?","chars","chunk","chunk-append","chunk-buffer","chunk-cons","chunk-first","chunk-next","chunk-rest","chunked-seq?","class","class?","clear-agent-errors","clojure-version","coll?","comment","commute","comp","comparator","compare","compare-and-set!","compile","complement","completing","concat","cond","cond->","cond->>","condp","conj","conj!","cons","constantly","construct-proxy","contains?","count","counted?","create-ns","create-struct","cycle","dec","dec'","decimal?","declare","dedupe","default-data-readers","definline","definterface","defmacro","defmethod","defmulti","defn","defn-","defonce","defprotocol","defrecord","defstruct","deftype","delay","delay?","deliver","denominator","deref","derive","descendants","destructure","disj","disj!","dissoc","dissoc!","distinct","distinct?","doall","dorun","doseq","dosync","dotimes","doto","double","double-array","double?","doubles","drop","drop-last","drop-while","eduction","empty","empty?","ensure","ensure-reduced","enumeration-seq","error-handler","error-mode","eval","even?","every-pred","every?","ex-data","ex-info","extend","extend-protocol","extend-type","extenders","extends?","false?","ffirst","file-seq","filter","filterv","find","find-keyword","find-ns","find-protocol-impl","find-protocol-method","find-var","first","flatten","float","float-array","float?","floats","flush","fn","fn?","fnext","fnil","for","force","format","frequencies","future","future-call","future-cancel","future-cancelled?","future-done?","future?","gen-class","gen-interface","gensym","get","get-in","get-method","get-proxy-class","get-thread-bindings","get-validator","group-by","halt-when","hash","hash-combine","hash-map","hash-ordered-coll","hash-set","hash-unordered-coll","ident?","identical?","identity","if-let","if-not","if-some","ifn?","import","in-ns","inc","inc'","indexed?","init-proxy","inst-ms","inst-ms*","inst?","instance?","int","int-array","int?","integer?","interleave","intern","interpose","into","into-array","ints","io!","isa?","iterate","iterator-seq","juxt","keep","keep-indexed","key","keys","keyword","keyword?","last","lazy-cat","lazy-seq","let","letfn","line-seq","list","list*","list?","load","load-file","load-reader","load-string","loaded-libs","locking","long","long-array","longs","loop","macroexpand","macroexpand-1","make-array","make-hierarchy","map","map-entry?","map-indexed","map?","mapcat","mapv","max","max-key","memfn","memoize","merge","merge-with","meta","method-sig","methods","min","min-key","mix-collection-hash","mod","munge","name","namespace","namespace-munge","nat-int?","neg-int?","neg?","newline","next","nfirst","nil?","nnext","not","not-any?","not-empty","not-every?","not=","ns","ns-aliases","ns-imports","ns-interns","ns-map","ns-name","ns-publics","ns-refers","ns-resolve","ns-unalias","ns-unmap","nth","nthnext","nthrest","num","number?","numerator","object-array","odd?","or","parents","partial","partition","partition-all","partition-by","pcalls","peek","persistent!","pmap","pop","pop!","pop-thread-bindings","pos-int?","pos?","pr","pr-str","prefer-method","prefers","primitives-classnames","print","print-ctor","print-dup","print-method","print-simple","print-str","printf","println","println-str","prn","prn-str","promise","proxy","proxy-call-with-super","proxy-mappings","proxy-name","proxy-super","push-thread-bindings","pvalues","qualified-ident?","qualified-keyword?","qualified-symbol?","quot","rand","rand-int","rand-nth","random-sample","range","ratio?","rational?","rationalize","re-find","re-groups","re-matcher","re-matches","re-pattern","re-seq","read","read-line","read-string","reader-conditional","reader-conditional?","realized?","record?","reduce","reduce-kv","reduced","reduced?","reductions","ref","ref-history-count","ref-max-history","ref-min-history","ref-set","refer","refer-clojure","reify","release-pending-sends","rem","remove","remove-all-methods","remove-method","remove-ns","remove-watch","repeat","repeatedly","replace","replicate","require","reset!","reset-meta!","reset-vals!","resolve","rest","restart-agent","resultset-seq","reverse","reversible?","rseq","rsubseq","run!","satisfies?","second","select-keys","send","send-off","send-via","seq","seq?","seqable?","seque","sequence","sequential?","set","set-agent-send-executor!","set-agent-send-off-executor!","set-error-handler!","set-error-mode!","set-validator!","set?","short","short-array","shorts","shuffle","shutdown-agents","simple-ident?","simple-keyword?","simple-symbol?","slurp","some","some->","some->>","some-fn","some?","sort","sort-by","sorted-map","sorted-map-by","sorted-set","sorted-set-by","sorted?","special-symbol?","spit","split-at","split-with","str","string?","struct","struct-map","subs","subseq","subvec","supers","swap!","swap-vals!","symbol","symbol?","sync","tagged-literal","tagged-literal?","take","take-last","take-nth","take-while","test","the-ns","thread-bound?","time","to-array","to-array-2d","trampoline","transduce","transient","tree-seq","true?","type","unchecked-add","unchecked-add-int","unchecked-byte","unchecked-char","unchecked-dec","unchecked-dec-int","unchecked-divide-int","unchecked-double","unchecked-float","unchecked-inc","unchecked-inc-int","unchecked-int","unchecked-long","unchecked-multiply","unchecked-multiply-int","unchecked-negate","unchecked-negate-int","unchecked-remainder-int","unchecked-short","unchecked-subtract","unchecked-subtract-int","underive","unquote","unquote-splicing","unreduced","unsigned-bit-shift-right","update","update-in","update-proxy","uri?","use","uuid?","val","vals","var-get","var-set","var?","vary-meta","vec","vector","vector-of","vector?","volatile!","volatile?","vreset!","vswap!","when","when-first","when-let","when-not","when-some","while","with-bindings","with-bindings*","with-in-str","with-loading-context","with-local-vars","with-meta","with-open","with-out-str","with-precision","with-redefs","with-redefs-fn","xml-seq","zero?","zipmap"],tokenizer:{root:[{include:"@whitespace"},[/@numbers/,"number"],[/@characters/,"string"],{include:"@string"},[/[()\[\]{}]/,"@brackets"],[/\/#"(?:\.|(?:")|[^"\n])*"\/g/,"regexp"],[/[#'@^`~]/,"meta"],[/@qualifiedSymbols/,{cases:{"^:.+$":"constant","@specialForms":"keyword","@coreSymbols":"keyword","@constants":"constant","@default":"identifier"}}]],whitespace:[[/[\s,]+/,"white"],[/;.*$/,"comment"],[/\(comment\b/,"comment","@comment"]],comment:[[/\(/,"comment","@push"],[/\)/,"comment","@pop"],[/[^()]/,"comment"]],string:[[/"/,"string","@multiLineString"]],multiLineString:[[/"/,"string","@popall"],[/@escapes/,"string.escape"],[/./,"string"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/clojure/clojure.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/clojure/clojure.js.gz new file mode 100644 index 0000000..523a8c5 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/clojure/clojure.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/coffee/coffee.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/coffee/coffee.js new file mode 100644 index 0000000..7809426 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/coffee/coffee.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/coffee/coffee",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\$\-\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{blockComment:["###","###"],lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},n.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".coffee",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],regEx:/\/(?!\/\/)(?:[^\/\\]|\\.)*\/[igm]*/,keywords:["and","or","is","isnt","not","on","yes","@","no","off","true","false","null","this","new","delete","typeof","in","instanceof","return","throw","break","continue","debugger","if","else","switch","for","while","do","try","catch","finally","class","extends","super","undefined","then","unless","until","loop","of","by","when"],symbols:/[=>"}],keywords:["abstract","amp","array","auto","bool","break","case","catch","char","class","const","constexpr","const_cast","continue","cpu","decltype","default","delegate","delete","do","double","dynamic_cast","each","else","enum","event","explicit","export","extern","false","final","finally","float","for","friend","gcnew","generic","goto","if","in","initonly","inline","int","interface","interior_ptr","internal","literal","long","mutable","namespace","new","noexcept","nullptr","__nullptr","operator","override","partial","pascal","pin_ptr","private","property","protected","public","ref","register","reinterpret_cast","restrict","return","safe_cast","sealed","short","signed","sizeof","static","static_assert","static_cast","struct","switch","template","this","thread_local","throw","tile_static","true","try","typedef","typeid","typename","union","unsigned","using","virtual","void","volatile","wchar_t","where","while","_asm","_based","_cdecl","_declspec","_fastcall","_if_exists","_if_not_exists","_inline","_multiple_inheritance","_pascal","_single_inheritance","_stdcall","_virtual_inheritance","_w64","__abstract","__alignof","__asm","__assume","__based","__box","__builtin_alignof","__cdecl","__clrcall","__declspec","__delegate","__event","__except","__fastcall","__finally","__forceinline","__gc","__hook","__identifier","__if_exists","__if_not_exists","__inline","__int128","__int16","__int32","__int64","__int8","__interface","__leave","__m128","__m128d","__m128i","__m256","__m256d","__m256i","__m64","__multiple_inheritance","__newslot","__nogc","__noop","__nounwind","__novtordisp","__pascal","__pin","__pragma","__property","__ptr32","__ptr64","__raise","__restrict","__resume","__sealed","__single_inheritance","__stdcall","__super","__thiscall","__try","__try_cast","__typeof","__unaligned","__unhook","__uuidof","__value","__virtual_inheritance","__w64","__wchar_t"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],raw:[[/(.*)(\))(?:([^ ()\\\t"]*))(\")/,{cases:{"$3==$S2":["string.raw","string.raw.end","string.raw.end",{token:"string.raw.end",next:"@pop"}],"@default":["string.raw","string.raw","string.raw","string.raw"]}}],[/.*/,"string.raw"]],annotation:[{include:"@whitespace"},[/using|alignas/,"keyword"],[/[a-zA-Z0-9_]+/,"annotation"],[/[,:]/,"delimiter"],[/[()]/,"@brackets"],[/\]\s*\]/,{token:"annotation",next:"@pop"}]],include:[[/(\s*)(<)([^<>]*)(>)/,["","keyword.directive.include.begin","string.include.identifier",{token:"keyword.directive.include.end",next:"@pop"}]],[/(\s*)(")([^"]*)(")/,["","keyword.directive.include.begin","string.include.identifier",{token:"keyword.directive.include.end",next:"@pop"}]]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/cpp/cpp.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/cpp/cpp.js.gz new file mode 100644 index 0000000..e9702eb Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/cpp/cpp.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csharp/csharp.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csharp/csharp.js new file mode 100644 index 0000000..06b57d4 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csharp/csharp.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/csharp/csharp",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\$\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},t.language={defaultToken:"",tokenPostfix:".cs",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["extern","alias","using","bool","decimal","sbyte","byte","short","ushort","int","uint","long","ulong","char","float","double","object","dynamic","string","assembly","is","as","ref","out","this","base","new","typeof","void","checked","unchecked","default","delegate","var","const","if","else","switch","case","while","do","for","foreach","in","break","continue","goto","return","throw","try","catch","finally","lock","yield","from","let","where","join","on","equals","into","orderby","ascending","descending","select","group","by","namespace","partial","class","field","event","method","param","public","protected","internal","private","abstract","sealed","static","struct","readonly","volatile","virtual","override","params","get","set","add","remove","operator","true","false","implicit","explicit","interface","enum","null","async","await","fixed","sizeof","stackalloc","unsafe","nameof","when"],namespaceFollows:["namespace","using"],parenFollows:["if","for","while","switch","foreach","using","catch","when"],operators:["=","??","||","&&","|","^","&","==","!=","<=",">=","<<","+","-","*","/","%","!","~","++","--","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=",">>","=>"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?[fFdD]?/,"number.float"],[/0[xX][0-9a-fA-F_]+/,"number.hex"],[/0[bB][01_]+/,"number.hex"],[/[0-9_]+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",next:"@string"}],[/\$\@"/,{token:"string.quote",next:"@litinterpstring"}],[/\@"/,{token:"string.quote",next:"@litstring"}],[/\$"/,{token:"string.quote",next:"@interpolatedstring"}],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],qualified:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],[/\./,"delimiter"],["","","@pop"]],namespace:[{include:"@whitespace"},[/[A-Z]\w*/,"namespace"],[/[\.=]/,"delimiter"],["","","@pop"]],comment:[[/[^\/*]+/,"comment"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}]],litstring:[[/[^"]+/,"string"],[/""/,"string.escape"],[/"/,{token:"string.quote",next:"@pop"}]],litinterpstring:[[/[^"{]+/,"string"],[/""/,"string.escape"],[/{{/,"string.escape"],[/}}/,"string.escape"],[/{/,{token:"string.quote",next:"root.litinterpstring"}],[/"/,{token:"string.quote",next:"@pop"}]],interpolatedstring:[[/[^\\"{]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/{{/,"string.escape"],[/}}/,"string.escape"],[/{/,{token:"string.quote",next:"root.interpolatedstring"}],[/"/,{token:"string.quote",next:"@pop"}]],whitespace:[[/^[ \t\v\f]*#((r)|(load))(?=\s)/,"directive.csx"],[/^[ \t\v\f]*#\w.*$/,"namespace.cpp"],[/[ \t\v\f\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csharp/csharp.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csharp/csharp.js.gz new file mode 100644 index 0000000..28e2d8f Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csharp/csharp.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csp/csp.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csp/csp.js new file mode 100644 index 0000000..05010bd --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/csp/csp.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/csp/csp",["require","exports"],(function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.language=e.conf=void 0,e.conf={brackets:[],autoClosingPairs:[],surroundingPairs:[]},e.language={keywords:[],typeKeywords:[],tokenPostfix:".csp",operators:[],symbols:/[=>",token:"delimiter.angle"}],tokenizer:{root:[{include:"@selector"}],selector:[{include:"@comments"},{include:"@import"},{include:"@strings"},["[@](keyframes|-webkit-keyframes|-moz-keyframes|-o-keyframes)",{token:"keyword",next:"@keyframedeclaration"}],["[@](page|content|font-face|-moz-document)",{token:"keyword"}],["[@](charset|namespace)",{token:"keyword",next:"@declarationbody"}],["(url-prefix)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],["(url)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],{include:"@selectorname"},["[\\*]","tag"],["[>\\+,]","delimiter"],["\\[",{token:"delimiter.bracket",next:"@selectorattribute"}],["{",{token:"delimiter.bracket",next:"@selectorbody"}]],selectorbody:[{include:"@comments"},["[*_]?@identifier@ws:(?=(\\s|\\d|[^{;}]*[;}]))","attribute.name","@rulevalue"],["}",{token:"delimiter.bracket",next:"@pop"}]],selectorname:[["(\\.|#(?=[^{])|%|(@identifier)|:)+","tag"]],selectorattribute:[{include:"@term"},["]",{token:"delimiter.bracket",next:"@pop"}]],term:[{include:"@comments"},["(url-prefix)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],["(url)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],{include:"@functioninvocation"},{include:"@numbers"},{include:"@name"},["([<>=\\+\\-\\*\\/\\^\\|\\~,])","delimiter"],[",","delimiter"]],rulevalue:[{include:"@comments"},{include:"@strings"},{include:"@term"},["!important","keyword"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],warndebug:[["[@](warn|debug)",{token:"keyword",next:"@declarationbody"}]],import:[["[@](import)",{token:"keyword",next:"@declarationbody"}]],urldeclaration:[{include:"@strings"},["[^)\r\n]+","string"],["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],parenthizedterm:[{include:"@term"},["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],declarationbody:[{include:"@term"},[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[/[^*/]+/,"comment"],[/./,"comment"]],name:[["@identifier","attribute.value"]],numbers:[["-?(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"attribute.value.number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","attribute.value.hex"]],units:[["(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","attribute.value.unit","@pop"]],keyframedeclaration:[["@identifier","attribute.value"],["{",{token:"delimiter.bracket",switchTo:"@keyframebody"}]],keyframebody:[{include:"@term"},["{",{token:"delimiter.bracket",next:"@selectorbody"}],["}",{token:"delimiter.bracket",next:"@pop"}]],functioninvocation:[["@identifier\\(",{token:"attribute.value",next:"@functionarguments"}]],functionarguments:[["\\$@identifier@ws:","attribute.name"],["[,]","delimiter"],{include:"@term"},["\\)",{token:"attribute.value",next:"@pop"}]],strings:[['~?"',{token:"string",next:"@stringenddoublequote"}],["~?'",{token:"string",next:"@stringendquote"}]],stringenddoublequote:[["\\\\.","string"],['"',{token:"string",next:"@pop"}],[/[^\\"]+/,"string"],[".","string"]],stringendquote:[["\\\\.","string"],["'",{token:"string",next:"@pop"}],[/[^\\']+/,"string"],[".","string"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/css/css.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/css/css.js.gz new file mode 100644 index 0000000..f82b950 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/css/css.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dart/dart.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dart/dart.js new file mode 100644 index 0000000..6ad018a --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dart/dart.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/dart/dart",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string"]},{open:"`",close:"`",notIn:["string","comment"]},{open:"/**",close:" */",notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:"(",close:")"},{open:'"',close:'"'},{open:"`",close:"`"}],folding:{markers:{start:/^\s*\s*#?region\b/,end:/^\s*\s*#?endregion\b/}}},n.language={defaultToken:"invalid",tokenPostfix:".dart",keywords:["abstract","dynamic","implements","show","as","else","import","static","assert","enum","in","super","async","export","interface","switch","await","extends","is","sync","break","external","library","this","case","factory","mixin","throw","catch","false","new","true","class","final","null","try","const","finally","on","typedef","continue","for","operator","var","covariant","Function","part","void","default","get","rethrow","while","deferred","hide","return","with","do","if","set","yield"],typeKeywords:["int","double","String","bool"],operators:["+","-","*","/","~/","%","++","--","==","!=",">","<",">=","<=","=","-=","/=","%=",">>=","^=","+=","*=","~/=","<<=","&=","!=","||","&&","&","|","^","~","<<",">>","!",">>>","??","?",":","|="],symbols:/[=>](?!@symbols)/,"@brackets"],[/!(?=([^=]|$))/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/(@digits)[eE]([\-+]?(@digits))?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,"number.float"],[/0[xX](@hexdigits)n?/,"number.hex"],[/0[oO]?(@octaldigits)n?/,"number.octal"],[/0[bB](@binarydigits)n?/,"number.binary"],[/(@digits)n?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@jsdoc"],[/\/\*/,"comment","@comment"],[/\/\/\/.*$/,"comment.doc"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],jsdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,["regexp.escape.control","regexp.escape.control","regexp.escape.control"]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,["regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?:|\?=|\?!)/,["regexp.escape.control","regexp.escape.control"]],[/[()]/,"regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/[^\\\/]/,"regexp"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/(\/)([gimsuy]*)/,[{token:"regexp",bracket:"@close",next:"@pop"},"keyword.other"]]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,{token:"regexp.escape.control",next:"@pop",bracket:"@close"}]],string_double:[[/[^\\"\$]+/,"string"],[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"],[/\$\w+/,"identifier"]],string_single:[[/[^\\'\$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"],[/\$\w+/,"identifier"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dart/dart.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dart/dart.js.gz new file mode 100644 index 0000000..427d3d1 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dart/dart.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dockerfile/dockerfile.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dockerfile/dockerfile.js new file mode 100644 index 0000000..2dcc929 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dockerfile/dockerfile.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/dockerfile/dockerfile",["require","exports"],(function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.language=o.conf=void 0,o.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},o.language={defaultToken:"",tokenPostfix:".dockerfile",variable:/\${?[\w]+}?/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},[/(ONBUILD)(\s+)/,["keyword",""]],[/(ENV)(\s+)([\w]+)/,["keyword","",{token:"variable",next:"@arguments"}]],[/(FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|ARG|VOLUME|LABEL|USER|WORKDIR|COPY|CMD|STOPSIGNAL|SHELL|HEALTHCHECK|ENTRYPOINT)/,{token:"keyword",next:"@arguments"}]],arguments:[{include:"@whitespace"},{include:"@strings"},[/(@variable)/,{cases:{"@eos":{token:"variable",next:"@popall"},"@default":"variable"}}],[/\\/,{cases:{"@eos":"","@default":""}}],[/./,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],whitespace:[[/\s+/,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],comment:[[/(^#.*$)/,"comment","@popall"]],strings:[[/\\'$/,"","@popall"],[/\\'/,""],[/'$/,"string","@popall"],[/'/,"string","@stringBody"],[/"$/,"string","@popall"],[/"/,"string","@dblStringBody"]],stringBody:[[/[^\\\$']/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/'$/,"string","@popall"],[/'/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]],dblStringBody:[[/[^\\\$"]/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/"$/,"string","@popall"],[/"/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dockerfile/dockerfile.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dockerfile/dockerfile.js.gz new file mode 100644 index 0000000..eeca119 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/dockerfile/dockerfile.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ecl/ecl.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ecl/ecl.js new file mode 100644 index 0000000..c97e21c --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ecl/ecl.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/ecl/ecl",["require","exports"],(function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.language=o.conf=void 0,o.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}]},o.language={defaultToken:"",tokenPostfix:".ecl",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],pounds:["append","break","declare","demangle","end","for","getdatatype","if","inmodule","loop","mangle","onwarning","option","set","stored","uniquename"].join("|"),keywords:["__compressed__","after","all","and","any","as","atmost","before","beginc","best","between","case","cluster","compressed","compression","const","counter","csv","default","descend","embed","encoding","encrypt","end","endc","endembed","endmacro","enum","escape","except","exclusive","expire","export","extend","fail","few","fileposition","first","flat","forward","from","full","function","functionmacro","group","grouped","heading","hole","ifblock","import","in","inner","interface","internal","joined","keep","keyed","last","left","limit","linkcounted","literal","little_endian","load","local","locale","lookup","lzw","macro","many","maxcount","maxlength","min skew","module","mofn","multiple","named","namespace","nocase","noroot","noscan","nosort","not","noxpath","of","onfail","only","opt","or","outer","overwrite","packed","partition","penalty","physicallength","pipe","prefetch","quote","record","repeat","retry","return","right","right1","right2","rows","rowset","scan","scope","self","separator","service","shared","skew","skip","smart","soapaction","sql","stable","store","terminator","thor","threshold","timelimit","timeout","token","transform","trim","type","unicodeorder","unordered","unsorted","unstable","update","use","validate","virtual","whole","width","wild","within","wnotrim","xml","xpath"],functions:["abs","acos","aggregate","allnodes","apply","ascii","asin","assert","asstring","atan","atan2","ave","build","buildindex","case","catch","choose","choosen","choosesets","clustersize","combine","correlation","cos","cosh","count","covariance","cron","dataset","dedup","define","denormalize","dictionary","distribute","distributed","distribution","ebcdic","enth","error","evaluate","event","eventextra","eventname","exists","exp","fail","failcode","failmessage","fetch","fromunicode","fromxml","getenv","getisvalid","global","graph","group","hash","hash32","hash64","hashcrc","hashmd5","having","httpcall","httpheader","if","iff","index","intformat","isvalid","iterate","join","keydiff","keypatch","keyunicode","length","library","limit","ln","loadxml","local","log","loop","map","matched","matchlength","matchposition","matchtext","matchunicode","max","merge","mergejoin","min","nofold","nolocal","nonempty","normalize","nothor","notify","output","parallel","parse","pipe","power","preload","process","project","pull","random","range","rank","ranked","realformat","recordof","regexfind","regexreplace","regroup","rejected","rollup","round","roundup","row","rowdiff","sample","sequential","set","sin","sinh","sizeof","soapcall","sort","sorted","sqrt","stepped","stored","sum","table","tan","tanh","thisnode","topn","tounicode","toxml","transfer","transform","trim","truncate","typeof","ungroup","unicodeorder","variance","wait","which","workunit","xmldecode","xmlencode","xmltext","xmlunicode"],typesint:["integer","unsigned"].join("|"),typesnum:["data","qstring","string","unicode","utf8","varstring","varunicode"],typesone:["ascii","big_endian","boolean","data","decimal","ebcdic","grouped","integer","linkcounted","pattern","qstring","real","record","rule","set of","streamed","string","token","udecimal","unicode","unsigned","utf8","varstring","varunicode"].join("|"),operators:["+","-","/",":=","<","<>","=",">","\\","and","in","not","or"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F_]+/,"number.hex"],[/0[bB][01]+/,"number.hex"],[/[0-9_]+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\v\f\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ecl/ecl.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ecl/ecl.js.gz new file mode 100644 index 0000000..486a053 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ecl/ecl.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/fsharp/fsharp.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/fsharp/fsharp.js new file mode 100644 index 0000000..b4cdd38 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/fsharp/fsharp.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/fsharp/fsharp",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*//\\s*#region\\b|^\\s*\\(\\*\\s*#region(.*)\\*\\)"),end:new RegExp("^\\s*//\\s*#endregion\\b|^\\s*\\(\\*\\s*#endregion\\s*\\*\\)")}}},n.language={defaultToken:"",tokenPostfix:".fs",keywords:["abstract","and","atomic","as","assert","asr","base","begin","break","checked","component","const","constraint","constructor","continue","class","default","delegate","do","done","downcast","downto","elif","else","end","exception","eager","event","external","extern","false","finally","for","fun","function","fixed","functor","global","if","in","include","inherit","inline","interface","internal","land","lor","lsl","lsr","lxor","lazy","let","match","member","mod","module","mutable","namespace","method","mixin","new","not","null","of","open","or","object","override","private","parallel","process","protected","pure","public","rec","return","static","sealed","struct","sig","then","to","true","tailcall","trait","try","type","upcast","use","val","void","virtual","volatile","when","while","with","yield"],symbols:/[=>\]/,"annotation"],[/^#(if|else|endif)/,"keyword"],[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0x[0-9a-fA-F]+LF/,"number.float"],[/0x[0-9a-fA-F]+(@integersuffix)/,"number.hex"],[/0b[0-1]+(@integersuffix)/,"number.bin"],[/\d+(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"""/,"string",'@string."""'],[/"/,"string",'@string."'],[/\@"/,{token:"string.quote",next:"@litstring"}],[/'[^\\']'B?/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\(\*(?!\))/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^*(]+/,"comment"],[/\*\)/,"comment","@pop"],[/\*/,"comment"],[/\(\*\)/,"comment"],[/\(/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/("""|"B?)/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]],litstring:[[/[^"]+/,"string"],[/""/,"string.escape"],[/"/,{token:"string.quote",next:"@pop"}]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/fsharp/fsharp.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/fsharp/fsharp.js.gz new file mode 100644 index 0000000..a16e26a Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/fsharp/fsharp.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/go/go.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/go/go.js new file mode 100644 index 0000000..bedb5be --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/go/go.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/go/go",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`",notIn:["string"]},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`"},{open:'"',close:'"'},{open:"'",close:"'"}]},n.language={defaultToken:"",tokenPostfix:".go",keywords:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var","bool","true","false","uint8","uint16","uint32","uint64","int8","int16","int32","int64","float32","float64","complex64","complex128","byte","rune","uint","int","uintptr","string","nil"],operators:["+","-","*","/","%","&","|","^","<<",">>","&^","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=","&^=","&&","||","<-","++","--","==","<",">","=","!","!=","<=",">=",":=","...","(",")","","]","{","}",",",";",".",":"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex"],[/0[0-7']*[0-7]/,"number.octal"],[/0[bB][0-1']*[0-1]/,"number.binary"],[/\d[\d']*/,"number"],[/\d/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/`/,"string","@rawstring"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],rawstring:[[/[^\`]/,"string"],[/`/,"string","@pop"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/go/go.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/go/go.js.gz new file mode 100644 index 0000000..431ad8e Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/go/go.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/graphql/graphql.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/graphql/graphql.js new file mode 100644 index 0000000..dfcd6d0 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/graphql/graphql.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/graphql/graphql",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"""',close:'"""',notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"""',close:'"""'},{open:'"',close:'"'}],folding:{offSide:!0}},n.language={defaultToken:"invalid",tokenPostfix:".gql",keywords:["null","true","false","query","mutation","subscription","extend","schema","directive","scalar","type","interface","union","enum","input","implements","fragment","on"],typeKeywords:["Int","Float","String","Boolean","ID"],directiveLocations:["SCHEMA","SCALAR","OBJECT","FIELD_DEFINITION","ARGUMENT_DEFINITION","INTERFACE","UNION","ENUM","ENUM_VALUE","INPUT_OBJECT","INPUT_FIELD_DEFINITION","QUERY","MUTATION","SUBSCRIPTION","FIELD","FRAGMENT_DEFINITION","FRAGMENT_SPREAD","INLINE_FRAGMENT","VARIABLE_DEFINITION"],operators:["=","!","?",":","&","|"],symbols:/[=!?:&|]+/,escapes:/\\(?:["\\\/bfnrt]|u[0-9A-Fa-f]{4})/,tokenizer:{root:[[/[a-z_][\w$]*/,{cases:{"@keywords":"keyword","@default":"key.identifier"}}],[/[$][\w$]*/,{cases:{"@keywords":"keyword","@default":"argument.identifier"}}],[/[A-Z][\w\$]*/,{cases:{"@typeKeywords":"keyword","@default":"type.identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,{token:"annotation",log:"annotation token: $0"}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/"""/,{token:"string",next:"@mlstring",nextEmbedded:"markdown"}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}]],mlstring:[[/[^"]+/,"string"],['"""',{token:"string",next:"@pop",nextEmbedded:"@pop"}]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[/#.*$/,"comment"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/graphql/graphql.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/graphql/graphql.js.gz new file mode 100644 index 0000000..c53114d Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/graphql/graphql.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/handlebars/handlebars.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/handlebars/handlebars.js new file mode 100644 index 0000000..3225fb9 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/handlebars/handlebars.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/handlebars/handlebars",["require","exports","../fillers/monaco-editor-core"],(function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0;var a=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"];t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["{{!--","--}}"]},brackets:[["\x3c!--","--\x3e"],["<",">"],["{{","}}"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"}],onEnterRules:[{beforeText:new RegExp("<(?!(?:"+a.join("|")+"))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:n.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(?!(?:"+a.join("|")+"))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:n.languages.IndentAction.Indent}}]},t.language={defaultToken:"",tokenPostfix:"",tokenizer:{root:[[/\{\{!--/,"comment.block.start.handlebars","@commentBlock"],[/\{\{!/,"comment.start.handlebars","@comment"],[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.root"}],[/)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)([:\w]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)(\w+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/\}\}/,"comment.end.handlebars","@pop"],[/./,"comment.content.handlebars"]],commentBlock:[[/--\}\}/,"comment.block.end.handlebars","@pop"],[/./,"comment.content.handlebars"]],commentHtml:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.comment"}],[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],handlebarsInSimpleState:[[/\{\{\{?/,"delimiter.handlebars"],[/\}\}\}?/,{token:"delimiter.handlebars",switchTo:"@$S2.$S3"}],{include:"handlebarsRoot"}],handlebarsInEmbeddedState:[[/\{\{\{?/,"delimiter.handlebars"],[/\}\}\}?/,{token:"delimiter.handlebars",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],{include:"handlebarsRoot"}],handlebarsRoot:[[/"[^"]*"/,"string.handlebars"],[/[#/][^\s}]+/,"keyword.helper.handlebars"],[/else\b/,"keyword.helper.handlebars"],[/[\s]+/],[/[^}]/,"variable.parameter.handlebars"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/handlebars/handlebars.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/handlebars/handlebars.js.gz new file mode 100644 index 0000000..6c0cbaa Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/handlebars/handlebars.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/hcl/hcl.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/hcl/hcl.js new file mode 100644 index 0000000..4859378 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/hcl/hcl.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/hcl/hcl",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},t.language={defaultToken:"",tokenPostfix:".hcl",keywords:["var","local","path","for_each","any","string","number","bool","true","false","null","if ","else ","endif ","for ","in","endfor"],operators:["=",">=","<=","==","!=","+","-","*","/","%","&&","||","!","<",">","?","...",":"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\d[\d']*/,"number"],[/\d/,"number"],[/[;,.]/,"delimiter"],[/"/,"string","@string"],[/'/,"invalid"]],heredoc:[[/<<[-]*\s*["]?([\w\-]+)["]?/,{token:"string.heredoc.delimiter",next:"@heredocBody.$1"}]],heredocBody:[[/([\w\-]+)$/,{cases:{"$1==$S2":[{token:"string.heredoc.delimiter",next:"@popall"}],"@default":"string.heredoc"}}],[/./,"string.heredoc"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"],[/#.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],string:[[/\$\{/,{token:"delimiter",next:"@stringExpression"}],[/[^\\"\$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@popall"]],stringInsideExpression:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],stringExpression:[[/\}/,{token:"delimiter",next:"@pop"}],[/"/,"string","@stringInsideExpression"],{include:"@terraform"}]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/hcl/hcl.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/hcl/hcl.js.gz new file mode 100644 index 0000000..626cfe4 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/hcl/hcl.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/html/html.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/html/html.js new file mode 100644 index 0000000..32ac8c8 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/html/html.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/html/html",["require","exports","../fillers/monaco-editor-core"],(function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0;var i=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"];t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["\x3c!--","--\x3e"]},brackets:[["\x3c!--","--\x3e"],["<",">"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"}],onEnterRules:[{beforeText:new RegExp("<(?!(?:"+i.join("|")+"))([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:n.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(?!(?:"+i.join("|")+"))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:n.languages.IndentAction.Indent}}],folding:{markers:{start:new RegExp("^\\s*\x3c!--\\s*#region\\b.*--\x3e"),end:new RegExp("^\\s*\x3c!--\\s*#endregion\\b.*--\x3e")}}},t.language={defaultToken:"",tokenPostfix:".html",ignoreCase:!0,tokenizer:{root:[[/)/,["delimiter","tag","","delimiter"]],[/(<)(script)/,["delimiter",{token:"tag",next:"@script"}]],[/(<)(style)/,["delimiter",{token:"tag",next:"@style"}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,["delimiter",{token:"tag",next:"@otherTag"}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,["delimiter",{token:"tag",next:"@otherTag"}]],[/]+/,"metatag.content"],[/>/,"metatag","@pop"]],comment:[[/-->/,"comment","@pop"],[/[^-]+/,"comment.content"],[/./,"comment.content"]],otherTag:[[/\/?>/,"delimiter","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter","tag",{token:"delimiter",next:"@pop"}]]],scriptAfterType:[[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/>/,{token:"delimiter",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]],style:[[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter","tag",{token:"delimiter",next:"@pop"}]]],styleAfterType:[[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/>/,{token:"delimiter",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/html/html.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/html/html.js.gz new file mode 100644 index 0000000..d71cdf4 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/html/html.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ini/ini.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ini/ini.js new file mode 100644 index 0000000..8f19f7e --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ini/ini.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/ini/ini",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},n.language={defaultToken:"",tokenPostfix:".ini",escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^\[[^\]]*\]/,"metatag"],[/(^\w+)(\s*)(\=)/,["key","","delimiter"]],{include:"@whitespace"},[/\d+/,"number"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],whitespace:[[/[ \t\r\n]+/,""],[/^\s*[#;].*$/,"comment"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ini/ini.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ini/ini.js.gz new file mode 100644 index 0000000..5ffd22c Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ini/ini.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/java/java.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/java/java.js new file mode 100644 index 0000000..83e516e --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/java/java.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/java/java",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}},t.language={defaultToken:"",tokenPostfix:".java",keywords:["abstract","continue","for","new","switch","assert","default","goto","package","synchronized","boolean","do","if","private","this","break","double","implements","protected","throw","byte","else","import","public","throws","case","enum","instanceof","return","transient","catch","extends","int","short","try","char","final","interface","static","void","class","finally","long","strictfp","volatile","const","float","native","super","while","true","false"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/0[xX](@hexdigits)[Ll]?/,"number.hex"],[/0(@octaldigits)[Ll]?/,"number.octal"],[/0[bB](@binarydigits)[Ll]?/,"number.binary"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@javadoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],javadoc:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/java/java.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/java/java.js.gz new file mode 100644 index 0000000..8e1d590 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/java/java.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/javascript/javascript.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/javascript/javascript.js new file mode 100644 index 0000000..66dc825 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/javascript/javascript.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/typescript/typescript",["require","exports","../fillers/monaco-editor-core"],(function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],onEnterRules:[{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,afterText:/^\s*\*\/$/,action:{indentAction:n.languages.IndentAction.IndentOutdent,appendText:" * "}},{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,action:{indentAction:n.languages.IndentAction.None,appendText:" * "}},{beforeText:/^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/,action:{indentAction:n.languages.IndentAction.None,appendText:"* "}},{beforeText:/^(\t|(\ \ ))*\ \*\/\s*$/,action:{indentAction:n.languages.IndentAction.None,removeText:1}}],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"`",close:"`",notIn:["string","comment"]},{open:"/**",close:" */",notIn:["string"]}],folding:{markers:{start:new RegExp("^\\s*//\\s*#?region\\b"),end:new RegExp("^\\s*//\\s*#?endregion\\b")}}},t.language={defaultToken:"invalid",tokenPostfix:".ts",keywords:["abstract","any","as","asserts","bigint","boolean","break","case","catch","class","continue","const","constructor","debugger","declare","default","delete","do","else","enum","export","extends","false","finally","for","from","function","get","if","implements","import","in","infer","instanceof","interface","is","keyof","let","module","namespace","never","new","null","number","object","package","private","protected","public","readonly","require","global","return","set","static","string","super","switch","symbol","this","throw","true","try","type","typeof","undefined","unique","unknown","var","void","while","with","yield","async","await","of"],operators:["<=",">=","==","!=","===","!==","=>","+","-","**","*","/","%","++","--","<<",">",">>>","&","|","^","!","~","&&","||","??","?",":","=","+=","-=","*=","**=","/=","%=","<<=",">>=",">>>=","&=","|=","^=","@"],symbols:/[=>](?!@symbols)/,"@brackets"],[/!(?=([^=]|$))/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/(@digits)[eE]([\-+]?(@digits))?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,"number.float"],[/0[xX](@hexdigits)n?/,"number.hex"],[/0[oO]?(@octaldigits)n?/,"number.octal"],[/0[bB](@binarydigits)n?/,"number.binary"],[/(@digits)n?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"],[/`/,"string","@string_backtick"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@jsdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],jsdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,["regexp.escape.control","regexp.escape.control","regexp.escape.control"]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,["regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?:|\?=|\?!)/,["regexp.escape.control","regexp.escape.control"]],[/[()]/,"regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/[^\\\/]/,"regexp"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/(\/)([gimsuy]*)/,[{token:"regexp",bracket:"@close",next:"@pop"},"keyword.other"]]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,{token:"regexp.escape.control",next:"@pop",bracket:"@close"}]],string_double:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],string_single:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]],string_backtick:[[/\$\{/,{token:"delimiter.bracket",next:"@bracketCounting"}],[/[^\\`$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/`/,"string","@pop"]],bracketCounting:[[/\{/,"delimiter.bracket","@bracketCounting"],[/\}/,"delimiter.bracket","@pop"],{include:"common"}]}}})),define("vs/basic-languages/javascript/javascript",["require","exports","../typescript/typescript"],(function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf=n.conf,t.language={defaultToken:"invalid",tokenPostfix:".js",keywords:["break","case","catch","class","continue","const","constructor","debugger","default","delete","do","else","export","extends","false","finally","for","from","function","get","if","import","in","instanceof","let","new","null","return","set","super","switch","symbol","this","throw","true","try","typeof","undefined","var","void","while","with","yield","async","await","of"],typeKeywords:[],operators:n.language.operators,symbols:n.language.symbols,escapes:n.language.escapes,digits:n.language.digits,octaldigits:n.language.octaldigits,binarydigits:n.language.binarydigits,hexdigits:n.language.hexdigits,regexpctl:n.language.regexpctl,regexpesc:n.language.regexpesc,tokenizer:n.language.tokenizer}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/javascript/javascript.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/javascript/javascript.js.gz new file mode 100644 index 0000000..bc16514 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/javascript/javascript.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/julia/julia.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/julia/julia.js new file mode 100644 index 0000000..3d27f05 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/julia/julia.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/julia/julia",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},t.language={tokenPostfix:".julia",keywords:["begin","while","if","for","try","return","break","continue","function","macro","quote","let","local","global","const","do","struct","module","baremodule","using","import","export","end","else","elseif","catch","finally","mutable","primitive","abstract","type","in","isa","where","new"],types:["LinRange","LineNumberNode","LinearIndices","LoadError","MIME","Matrix","Method","MethodError","Missing","MissingException","Module","NTuple","NamedTuple","Nothing","Number","OrdinalRange","OutOfMemoryError","OverflowError","Pair","PartialQuickSort","PermutedDimsArray","Pipe","Ptr","QuoteNode","Rational","RawFD","ReadOnlyMemoryError","Real","ReentrantLock","Ref","Regex","RegexMatch","RoundingMode","SegmentationFault","Set","Signed","Some","StackOverflowError","StepRange","StepRangeLen","StridedArray","StridedMatrix","StridedVecOrMat","StridedVector","String","StringIndexError","SubArray","SubString","SubstitutionString","Symbol","SystemError","Task","Text","TextDisplay","Timer","Tuple","Type","TypeError","TypeVar","UInt","UInt128","UInt16","UInt32","UInt64","UInt8","UndefInitializer","AbstractArray","UndefKeywordError","AbstractChannel","UndefRefError","AbstractChar","UndefVarError","AbstractDict","Union","AbstractDisplay","UnionAll","AbstractFloat","UnitRange","AbstractIrrational","Unsigned","AbstractMatrix","AbstractRange","Val","AbstractSet","Vararg","AbstractString","VecElement","AbstractUnitRange","VecOrMat","AbstractVecOrMat","Vector","AbstractVector","VersionNumber","Any","WeakKeyDict","ArgumentError","WeakRef","Array","AssertionError","BigFloat","BigInt","BitArray","BitMatrix","BitSet","BitVector","Bool","BoundsError","CapturedException","CartesianIndex","CartesianIndices","Cchar","Cdouble","Cfloat","Channel","Char","Cint","Cintmax_t","Clong","Clonglong","Cmd","Colon","Complex","ComplexF16","ComplexF32","ComplexF64","CompositeException","Condition","Cptrdiff_t","Cshort","Csize_t","Cssize_t","Cstring","Cuchar","Cuint","Cuintmax_t","Culong","Culonglong","Cushort","Cvoid","Cwchar_t","Cwstring","DataType","DenseArray","DenseMatrix","DenseVecOrMat","DenseVector","Dict","DimensionMismatch","Dims","DivideError","DomainError","EOFError","Enum","ErrorException","Exception","ExponentialBackOff","Expr","Float16","Float32","Float64","Function","GlobalRef","HTML","IO","IOBuffer","IOContext","IOStream","IdDict","IndexCartesian","IndexLinear","IndexStyle","InexactError","InitError","Int","Int128","Int16","Int32","Int64","Int8","Integer","InterruptException","InvalidStateException","Irrational","KeyError"],keywordops:["<:",">:",":","=>","...",".","->","?"],allops:/[^\w\d\s()\[\]{}"'#]+/,constants:["true","false","nothing","missing","undef","Inf","pi","NaN","π","ℯ","ans","PROGRAM_FILE","ARGS","C_NULL","VERSION","DEPOT_PATH","LOAD_PATH"],operators:["!","!=","!==","%","&","*","+","-","/","//","<","<<","<=","==","===","=>",">",">=",">>",">>>","\\","^","|","|>","~","÷","∈","∉","∋","∌","∘","√","∛","∩","∪","≈","≉","≠","≡","≢","≤","≥","⊆","⊇","⊈","⊉","⊊","⊋","⊻"],brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],ident:/π|ℯ|\b(?!\d)\w+\b/,escape:/(?:[abefnrstv\\"'\n\r]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2}|u[0-9A-Fa-f]{4})/,escapes:/\\(?:C\-(@escape|.)|c(@escape|.)|@escape)/,tokenizer:{root:[[/(::)\s*|\b(isa)\s+/,"keyword","@typeanno"],[/\b(isa)(\s*\(@ident\s*,\s*)/,["keyword",{token:"",next:"@typeanno"}]],[/\b(type|struct)[ \t]+/,"keyword","@typeanno"],[/^\s*:@ident[!?]?/,"metatag"],[/(return)(\s*:@ident[!?]?)/,["keyword","metatag"]],[/(\(|\[|\{|@allops)(\s*:@ident[!?]?)/,["","metatag"]],[/:\(/,"metatag","@quote"],[/r"""/,"regexp.delim","@tregexp"],[/r"/,"regexp.delim","@sregexp"],[/raw"""/,"string.delim","@rtstring"],[/[bv]?"""/,"string.delim","@dtstring"],[/raw"/,"string.delim","@rsstring"],[/[bv]?"/,"string.delim","@dsstring"],[/(@ident)\{/,{cases:{"$1@types":{token:"type",next:"@gen"},"@default":{token:"type",next:"@gen"}}}],[/@ident[!?'']?(?=\.?\()/,{cases:{"@types":"type","@keywords":"keyword","@constants":"variable","@default":"keyword.flow"}}],[/@ident[!?']?/,{cases:{"@types":"type","@keywords":"keyword","@constants":"variable","@default":"identifier"}}],[/\$\w+/,"key"],[/\$\(/,"key","@paste"],[/@@ident/,"annotation"],{include:"@whitespace"},[/'(?:@escapes|.)'/,"string.character"],[/[()\[\]{}]/,"@brackets"],[/@allops/,{cases:{"@keywordops":"keyword","@operators":"operator"}}],[/[;,]/,"delimiter"],[/0[xX][0-9a-fA-F](_?[0-9a-fA-F])*/,"number.hex"],[/0[_oO][0-7](_?[0-7])*/,"number.octal"],[/0[bB][01](_?[01])*/,"number.binary"],[/[+\-]?\d+(\.\d+)?(im?|[eE][+\-]?\d+(\.\d+)?)?/,"number"]],typeanno:[[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*\{/,"type","@gen"],[/([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*)(\s*<:\s*)/,["type","keyword"]],[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*/,"type","@pop"],["","","@pop"]],gen:[[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*\{/,"type","@push"],[/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*/,"type"],[/<:/,"keyword"],[/(\})(\s*<:\s*)/,["type",{token:"keyword",next:"@pop"}]],[/\}/,"type","@pop"],{include:"@root"}],quote:[[/\$\(/,"key","@paste"],[/\(/,"@brackets","@paren"],[/\)/,"metatag","@pop"],{include:"@root"}],paste:[[/:\(/,"metatag","@quote"],[/\(/,"@brackets","@paren"],[/\)/,"key","@pop"],{include:"@root"}],paren:[[/\$\(/,"key","@paste"],[/:\(/,"metatag","@quote"],[/\(/,"@brackets","@push"],[/\)/,"@brackets","@pop"],{include:"@root"}],sregexp:[[/^.*/,"invalid"],[/[^\\"()\[\]{}]/,"regexp"],[/[()\[\]{}]/,"@brackets"],[/\\./,"operator.scss"],[/"[imsx]*/,"regexp.delim","@pop"]],tregexp:[[/[^\\"()\[\]{}]/,"regexp"],[/[()\[\]{}]/,"@brackets"],[/\\./,"operator.scss"],[/"(?!"")/,"string"],[/"""[imsx]*/,"regexp.delim","@pop"]],rsstring:[[/^.*/,"invalid"],[/[^\\"]/,"string"],[/\\./,"string.escape"],[/"/,"string.delim","@pop"]],rtstring:[[/[^\\"]/,"string"],[/\\./,"string.escape"],[/"(?!"")/,"string"],[/"""/,"string.delim","@pop"]],dsstring:[[/^.*/,"invalid"],[/[^\\"\$]/,"string"],[/\$/,"","@interpolated"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string.delim","@pop"]],dtstring:[[/[^\\"\$]/,"string"],[/\$/,"","@interpolated"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"(?!"")/,"string"],[/"""/,"string.delim","@pop"]],interpolated:[[/\(/,{token:"",switchTo:"@interpolated_compound"}],[/[a-zA-Z_]\w*/,"identifier"],["","","@pop"]],interpolated_compound:[[/\)/,"","@pop"],{include:"@root"}],whitespace:[[/[ \t\r\n]+/,""],[/#=/,"comment","@multi_comment"],[/#.*$/,"comment"]],multi_comment:[[/#=/,"comment","@push"],[/=#/,"comment","@pop"],[/=(?!#)|#(?!=)/,"comment"],[/[^#=]+/,"comment"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/julia/julia.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/julia/julia.js.gz new file mode 100644 index 0000000..9245515 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/julia/julia.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/kotlin/kotlin.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/kotlin/kotlin.js new file mode 100644 index 0000000..f256842 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/kotlin/kotlin.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/kotlin/kotlin",["require","exports"],(function(e,i){"use strict";Object.defineProperty(i,"__esModule",{value:!0}),i.language=i.conf=void 0,i.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}},i.language={defaultToken:"",tokenPostfix:".kt",keywords:["as","as?","break","class","continue","do","else","false","for","fun","if","in","!in","interface","is","!is","null","object","package","return","super","this","throw","true","try","typealias","val","var","when","while","by","catch","constructor","delegate","dynamic","field","file","finally","get","import","init","param","property","receiver","set","setparam","where","actual","abstract","annotation","companion","const","crossinline","data","enum","expect","external","final","infix","inline","inner","internal","lateinit","noinline","open","operator","out","override","private","protected","public","reified","sealed","suspend","tailrec","vararg","field","it"],operators:["+","-","*","/","%","=","+=","-=","*=","/=","%=","++","--","&&","||","!","==","!=","===","!==",">","<","<=",">=","[","]","!!","?.","?:","::","..",":","?","->","@",";","$","_"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/0[xX](@hexdigits)[Ll]?/,"number.hex"],[/0(@octaldigits)[Ll]?/,"number.octal"],[/0[bB](@binarydigits)[Ll]?/,"number.binary"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"""/,"string","@multistring"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@javadoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],javadoc:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc","@push"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],multistring:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"""/,"string","@pop"],[/./,"string"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/kotlin/kotlin.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/kotlin/kotlin.js.gz new file mode 100644 index 0000000..d14e8fd Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/kotlin/kotlin.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/less/less.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/less/less.js new file mode 100644 index 0000000..edcf04d --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/less/less.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/less/less",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(#?-?\d*\.\d\w*%?)|([@#!.:]?[\w-?]+%?)|[@#!.]/g,comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/"),end:new RegExp("^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/")}}},t.language={defaultToken:"",tokenPostfix:".less",identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",identifierPlus:"-?-?([a-zA-Z:.]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-:.]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@nestedJSBegin"},["[ \\t\\r\\n]+",""],{include:"@comments"},{include:"@keyword"},{include:"@strings"},{include:"@numbers"},["[*_]?[a-zA-Z\\-\\s]+(?=:.*(;|(\\\\$)))","attribute.name","@attribute"],["url(\\-prefix)?\\(",{token:"tag",next:"@urldeclaration"}],["[{}()\\[\\]]","@brackets"],["[,:;]","delimiter"],["#@identifierPlus","tag.id"],["&","tag"],["\\.@identifierPlus(?=\\()","tag.class","@attribute"],["\\.@identifierPlus","tag.class"],["@identifierPlus","tag"],{include:"@operators"},["@(@identifier(?=[:,\\)]))","variable","@attribute"],["@(@identifier)","variable"],["@","key","@atRules"]],nestedJSBegin:[["``","delimiter.backtick"],["`",{token:"delimiter.backtick",next:"@nestedJSEnd",nextEmbedded:"text/javascript"}]],nestedJSEnd:[["`",{token:"delimiter.backtick",next:"@pop",nextEmbedded:"@pop"}]],operators:[["[<>=\\+\\-\\*\\/\\^\\|\\~]","operator"]],keyword:[["(@[\\s]*import|![\\s]*important|true|false|when|iscolor|isnumber|isstring|iskeyword|isurl|ispixel|ispercentage|isem|hue|saturation|lightness|alpha|lighten|darken|saturate|desaturate|fadein|fadeout|fade|spin|mix|round|ceil|floor|percentage)\\b","keyword"]],urldeclaration:[{include:"@strings"},["[^)\r\n]+","string"],["\\)",{token:"tag",next:"@pop"}]],attribute:[{include:"@nestedJSBegin"},{include:"@comments"},{include:"@strings"},{include:"@numbers"},{include:"@keyword"},["[a-zA-Z\\-]+(?=\\()","attribute.value","@attribute"],[">","operator","@pop"],["@identifier","attribute.value"],{include:"@operators"},["@(@identifier)","variable"],["[)\\}]","@brackets","@pop"],["[{}()\\[\\]>]","@brackets"],["[;]","delimiter","@pop"],["[,=:]","delimiter"],["\\s",""],[".","attribute.value"]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],numbers:[["(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"attribute.value.number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","attribute.value.hex"]],units:[["(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","attribute.value.unit","@pop"]],strings:[['~?"',{token:"string.delimiter",next:"@stringsEndDoubleQuote"}],["~?'",{token:"string.delimiter",next:"@stringsEndQuote"}]],stringsEndDoubleQuote:[['\\\\"',"string"],['"',{token:"string.delimiter",next:"@popall"}],[".","string"]],stringsEndQuote:[["\\\\'","string"],["'",{token:"string.delimiter",next:"@popall"}],[".","string"]],atRules:[{include:"@comments"},{include:"@strings"},["[()]","delimiter"],["[\\{;]","delimiter","@pop"],[".","key"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/less/less.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/less/less.js.gz new file mode 100644 index 0000000..874a33c Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/less/less.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lexon/lexon.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lexon/lexon.js new file mode 100644 index 0000000..f52f8ec --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lexon/lexon.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/lexon/lexon",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"COMMENT"},brackets:[["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:":",close:"."}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"`",close:"`"},{open:'"',close:'"'},{open:"'",close:"'"},{open:":",close:"."}],folding:{markers:{start:new RegExp("^\\s*(::\\s*|COMMENT\\s+)#region"),end:new RegExp("^\\s*(::\\s*|COMMENT\\s+)#endregion")}}},t.language={tokenPostfix:".lexon",ignoreCase:!0,keywords:["lexon","lex","clause","terms","contracts","may","pay","pays","appoints","into","to"],typeKeywords:["amount","person","key","time","date","asset","text"],operators:["less","greater","equal","le","gt","or","and","add","added","subtract","subtracted","multiply","multiplied","times","divide","divided","is","be","certified"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,"delimiter"],[/\d*\.\d*\.\d*/,"number.semver"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"]],quoted_identifier:[[/[^\\"]+/,"identifier"],[/"/,{token:"identifier.quote",bracket:"@close",next:"@pop"}]],space_identifier_until_period:[[":","delimiter"],[" ",{token:"white",next:"@identifier_rest"}]],identifier_until_period:[{include:"@whitespace"},[":",{token:"delimiter",next:"@identifier_rest"}],[/[^\\.]+/,"identifier"],[/\./,{token:"delimiter",bracket:"@close",next:"@pop"}]],identifier_rest:[[/[^\\.]+/,"identifier"],[/\./,{token:"delimiter",bracket:"@close",next:"@pop"}]],semver:[{include:"@whitespace"},[":","delimiter"],[/\d*\.\d*\.\d*/,{token:"number.semver",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lexon/lexon.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lexon/lexon.js.gz new file mode 100644 index 0000000..b811d30 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lexon/lexon.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lua/lua.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lua/lua.js new file mode 100644 index 0000000..da40199 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/lua/lua.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/lua/lua",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"--",blockComment:["--[[","]]"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},n.language={defaultToken:"",tokenPostfix:".lua",keywords:["and","break","do","else","elseif","end","false","for","function","goto","if","in","local","nil","not","or","repeat","return","then","true","until","while"],brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],operators:["+","-","*","/","%","^","#","==","~=","<=",">=","<",">","=",";",":",",",".","..","..."],symbols:/[=>"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}]},o.language={defaultToken:"",tokenPostfix:".m3",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["AND","ANY","ARRAY","AS","BEGIN","BITS","BRANDED","BY","CASE","CONST","DIV","DO","ELSE","ELSIF","END","EVAL","EXCEPT","EXCEPTION","EXIT","EXPORTS","FINALLY","FOR","FROM","GENERIC","IF","IMPORT","IN","INTERFACE","LOCK","LOOP","METHODS","MOD","MODULE","NOT","OBJECT","OF","OR","OVERRIDES","PROCEDURE","RAISE","RAISES","READONLY","RECORD","REF","REPEAT","RETURN","REVEAL","SET","THEN","TO","TRY","TYPE","TYPECASE","UNSAFE","UNTIL","UNTRACED","VALUE","VAR","WHILE","WITH"],reservedConstNames:["ABS","ADR","ADRSIZE","BITSIZE","BYTESIZE","CEILING","DEC","DISPOSE","FALSE","FIRST","FLOAT","FLOOR","INC","ISTYPE","LAST","LOOPHOLE","MAX","MIN","NARROW","NEW","NIL","NUMBER","ORD","ROUND","SUBARRAY","TRUE","TRUNC","TYPECODE","VAL"],reservedTypeNames:["ADDRESS","ANY","BOOLEAN","CARDINAL","CHAR","EXTENDED","INTEGER","LONGCARD","LONGINT","LONGREAL","MUTEX","NULL","REAL","REFANY","ROOT","TEXT"],operators:["+","-","*","/","&","^","."],relations:["=","#","<","<=",">",">=","<:",":"],delimiters:["|","..","=>",",",";",":="],symbols:/[>=<#.,:;+\-*/&^]+/,escapes:/\\(?:[\\fnrt"']|[0-7]{3})/,tokenizer:{root:[[/_\w*/,"invalid"],[/[a-zA-Z][a-zA-Z0-9_]*/,{cases:{"@keywords":{token:"keyword.$0"},"@reservedConstNames":{token:"constant.reserved.$0"},"@reservedTypeNames":{token:"type.reserved.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[0-9]+\.[0-9]+(?:[DdEeXx][\+\-]?[0-9]+)?/,"number.float"],[/[0-9]+(?:\_[0-9a-fA-F]+)?L?/,"number"],[/@symbols/,{cases:{"@operators":"operators","@relations":"operators","@delimiters":"delimiter","@default":"invalid"}}],[/'[^\\']'/,"string.char"],[/(')(@escapes)(')/,["string.char","string.escape","string.char"]],[/'/,"invalid"],[/"([^"\\]|\\.)*$/,"invalid"],[/"/,"string.text","@text"]],text:[[/[^\\"]+/,"string.text"],[/@escapes/,"string.escape"],[/\\./,"invalid"],[/"/,"string.text","@pop"]],comment:[[/\(\*/,"comment","@push"],[/\*\)/,"comment","@pop"],[/./,"comment"]],pragma:[[/<\*/,"keyword.pragma","@push"],[/\*>/,"keyword.pragma","@pop"],[/./,"keyword.pragma"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/<\*/,"keyword.pragma","@pragma"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/m3/m3.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/m3/m3.js.gz new file mode 100644 index 0000000..b8849bb Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/m3/m3.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/markdown/markdown.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/markdown/markdown.js new file mode 100644 index 0000000..dc020ee --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/markdown/markdown.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/markdown/markdown",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{blockComment:["\x3c!--","--\x3e"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">",notIn:["string"]}],surroundingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"`",close:"`"}],folding:{markers:{start:new RegExp("^\\s*\x3c!--\\s*#?region\\b.*--\x3e"),end:new RegExp("^\\s*\x3c!--\\s*#?endregion\\b.*--\x3e")}}},t.language={defaultToken:"",tokenPostfix:".md",control:/[\\`*_\[\]{}()#+\-\.!]/,noncontrol:/[^\\`*_\[\]{}()#+\-\.!]/,escapes:/\\(?:@control)/,jsescapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,empty:["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param"],tokenizer:{root:[[/^\s*\|/,"@rematch","@table_header"],[/^(\s{0,3})(#+)((?:[^\\#]|@escapes)+)((?:#+)?)/,["white","keyword","keyword","keyword"]],[/^\s*(=+|\-+)\s*$/,"keyword"],[/^\s*((\*[ ]?)+)\s*$/,"meta.separator"],[/^\s*>+/,"comment"],[/^\s*([\*\-+:]|\d+\.)\s/,"keyword"],[/^(\t|[ ]{4})[^ ].*$/,"string"],[/^\s*~~~\s*((?:\w|[\/\-#])+)?\s*$/,{token:"string",next:"@codeblock"}],[/^\s*```\s*((?:\w|[\/\-#])+).*$/,{token:"string",next:"@codeblockgh",nextEmbedded:"$1"}],[/^\s*```\s*$/,{token:"string",next:"@codeblock"}],{include:"@linecontent"}],table_header:[{include:"@table_common"},[/[^\|]+/,"keyword.table.header"]],table_body:[{include:"@table_common"},{include:"@linecontent"}],table_common:[[/\s*[\-:]+\s*/,{token:"keyword",switchTo:"table_body"}],[/^\s*\|/,"keyword.table.left"],[/^\s*[^\|]/,"@rematch","@pop"],[/^\s*$/,"@rematch","@pop"],[/\|/,{cases:{"@eos":"keyword.table.right","@default":"keyword.table.middle"}}]],codeblock:[[/^\s*~~~\s*$/,{token:"string",next:"@pop"}],[/^\s*```\s*$/,{token:"string",next:"@pop"}],[/.*$/,"variable.source"]],codeblockgh:[[/```\s*$/,{token:"variable.source",next:"@pop",nextEmbedded:"@pop"}],[/[^`]+/,"variable.source"]],linecontent:[[/&\w+;/,"string.escape"],[/@escapes/,"escape"],[/\b__([^\\_]|@escapes|_(?!_))+__\b/,"strong"],[/\*\*([^\\*]|@escapes|\*(?!\*))+\*\*/,"strong"],[/\b_[^_]+_\b/,"emphasis"],[/\*([^\\*]|@escapes)+\*/,"emphasis"],[/`([^\\`]|@escapes)+`/,"variable"],[/\{+[^}]+\}+/,"string.target"],[/(!?\[)((?:[^\]\\]|@escapes)*)(\]\([^\)]+\))/,["string.link","","string.link"]],[/(!?\[)((?:[^\]\\]|@escapes)*)(\])/,"string.link"],{include:"html"}],html:[[/<(\w+)\/>/,"tag"],[/<(\w+)/,{cases:{"@empty":{token:"tag",next:"@tag.$1"},"@default":{token:"tag",next:"@tag.$1"}}}],[/<\/(\w+)\s*>/,{token:"tag"}],[//,"comment","@pop"],[//,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\?((php)|=)?/,{token:"@rematch",switchTo:"@phpInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],phpInSimpleState:[[/<\?((php)|=)?/,"metatag.php"],[/\?>/,{token:"metatag.php",switchTo:"@$S2.$S3"}],{include:"phpRoot"}],phpInEmbeddedState:[[/<\?((php)|=)?/,"metatag.php"],[/\?>/,{token:"metatag.php",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],{include:"phpRoot"}],phpRoot:[[/[a-zA-Z_]\w*/,{cases:{"@phpKeywords":{token:"keyword.php"},"@phpCompileTimeConstants":{token:"constant.php"},"@default":"identifier.php"}}],[/[$a-zA-Z_]\w*/,{cases:{"@phpPreDefinedVariables":{token:"variable.predefined.php"},"@default":"variable.php"}}],[/[{}]/,"delimiter.bracket.php"],[/[\[\]]/,"delimiter.array.php"],[/[()]/,"delimiter.parenthesis.php"],[/[ \t\r\n]+/],[/(#|\/\/)$/,"comment.php"],[/(#|\/\/)/,"comment.php","@phpLineComment"],[/\/\*/,"comment.php","@phpComment"],[/"/,"string.php","@phpDoubleQuoteString"],[/'/,"string.php","@phpSingleQuoteString"],[/[\+\-\*\%\&\|\^\~\!\=\<\>\/\?\;\:\.\,\@]/,"delimiter.php"],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float.php"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float.php"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex.php"],[/0[0-7']*[0-7]/,"number.octal.php"],[/0[bB][0-1']*[0-1]/,"number.binary.php"],[/\d[\d']*/,"number.php"],[/\d/,"number.php"]],phpComment:[[/\*\//,"comment.php","@pop"],[/[^*]+/,"comment.php"],[/./,"comment.php"]],phpLineComment:[[/\?>/,{token:"@rematch",next:"@pop"}],[/.$/,"comment.php","@pop"],[/[^?]+$/,"comment.php","@pop"],[/[^?]+/,"comment.php"],[/./,"comment.php"]],phpDoubleQuoteString:[[/[^\\"]+/,"string.php"],[/@escapes/,"string.escape.php"],[/\\./,"string.escape.invalid.php"],[/"/,"string.php","@pop"]],phpSingleQuoteString:[[/[^\\']+/,"string.php"],[/@escapes/,"string.escape.php"],[/\\./,"string.escape.invalid.php"],[/'/,"string.php","@pop"]]},phpKeywords:["abstract","and","array","as","break","callable","case","catch","cfunction","class","clone","const","continue","declare","default","do","else","elseif","enddeclare","endfor","endforeach","endif","endswitch","endwhile","extends","false","final","for","foreach","function","global","goto","if","implements","interface","instanceof","insteadof","namespace","new","null","object","old_function","or","private","protected","public","resource","static","switch","throw","trait","try","true","use","var","while","xor","die","echo","empty","exit","eval","include","include_once","isset","list","require","require_once","return","print","unset","yield","__construct"],phpCompileTimeConstants:["__CLASS__","__DIR__","__FILE__","__LINE__","__NAMESPACE__","__METHOD__","__FUNCTION__","__TRAIT__"],phpPreDefinedVariables:["$GLOBALS","$_SERVER","$_GET","$_POST","$_FILES","$_REQUEST","$_SESSION","$_ENV","$_COOKIE","$php_errormsg","$HTTP_RAW_POST_DATA","$http_response_header","$argc","$argv"],escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/php/php.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/php/php.js.gz new file mode 100644 index 0000000..d40c783 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/php/php.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/postiats/postiats.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/postiats/postiats.js new file mode 100644 index 0000000..df397c1 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/postiats/postiats.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/postiats/postiats",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},t.language={tokenPostfix:".pats",defaultToken:"invalid",keywords:["abstype","abst0ype","absprop","absview","absvtype","absviewtype","absvt0ype","absviewt0ype","as","and","assume","begin","classdec","datasort","datatype","dataprop","dataview","datavtype","dataviewtype","do","end","extern","extype","extvar","exception","fn","fnx","fun","prfn","prfun","praxi","castfn","if","then","else","ifcase","in","infix","infixl","infixr","prefix","postfix","implmnt","implement","primplmnt","primplement","import","let","local","macdef","macrodef","nonfix","symelim","symintr","overload","of","op","rec","sif","scase","sortdef","sta","stacst","stadef","static","staload","dynload","try","tkindef","typedef","propdef","viewdef","vtypedef","viewtypedef","prval","var","prvar","when","where","with","withtype","withprop","withview","withvtype","withviewtype"],keywords_dlr:["$delay","$ldelay","$arrpsz","$arrptrsize","$d2ctype","$effmask","$effmask_ntm","$effmask_exn","$effmask_ref","$effmask_wrt","$effmask_all","$extern","$extkind","$extype","$extype_struct","$extval","$extfcall","$extmcall","$literal","$myfilename","$mylocation","$myfunction","$lst","$lst_t","$lst_vt","$list","$list_t","$list_vt","$rec","$rec_t","$rec_vt","$record","$record_t","$record_vt","$tup","$tup_t","$tup_vt","$tuple","$tuple_t","$tuple_vt","$break","$continue","$raise","$showtype","$vcopyenv_v","$vcopyenv_vt","$tempenver","$solver_assert","$solver_verify"],keywords_srp:["#if","#ifdef","#ifndef","#then","#elif","#elifdef","#elifndef","#else","#endif","#error","#prerr","#print","#assert","#undef","#define","#include","#require","#pragma","#codegen2","#codegen3"],irregular_keyword_list:["val+","val-","val","case+","case-","case","addr@","addr","fold@","free@","fix@","fix","lam@","lam","llam@","llam","viewt@ype+","viewt@ype-","viewt@ype","viewtype+","viewtype-","viewtype","view+","view-","view@","view","type+","type-","type","vtype+","vtype-","vtype","vt@ype+","vt@ype-","vt@ype","viewt@ype+","viewt@ype-","viewt@ype","viewtype+","viewtype-","viewtype","prop+","prop-","prop","type+","type-","type","t@ype","t@ype+","t@ype-","abst@ype","abstype","absviewt@ype","absvt@ype","for*","for","while*","while"],keywords_types:["bool","double","byte","int","short","char","void","unit","long","float","string","strptr"],keywords_effects:["0","fun","clo","prf","funclo","cloptr","cloref","ref","ntm","1"],operators:["@","!","|","`",":","$",".","=","#","~","..","...","=>","=<>","=/=>","=>>","=/=>>","<",">","><",".<",">.",".<>.","->","-<>"],brackets:[{open:",(",close:")",token:"delimiter.parenthesis"},{open:"`(",close:")",token:"delimiter.parenthesis"},{open:"%(",close:")",token:"delimiter.parenthesis"},{open:"'(",close:")",token:"delimiter.parenthesis"},{open:"'{",close:"}",token:"delimiter.parenthesis"},{open:"@(",close:")",token:"delimiter.parenthesis"},{open:"@{",close:"}",token:"delimiter.brace"},{open:"@[",close:"]",token:"delimiter.square"},{open:"#[",close:"]",token:"delimiter.square"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],symbols:/[=>]/,digit:/[0-9]/,digitseq0:/@digit*/,xdigit:/[0-9A-Za-z]/,xdigitseq0:/@xdigit*/,INTSP:/[lLuU]/,FLOATSP:/[fFlL]/,fexponent:/[eE][+-]?[0-9]+/,fexponent_bin:/[pP][+-]?[0-9]+/,deciexp:/\.[0-9]*@fexponent?/,hexiexp:/\.[0-9a-zA-Z]*@fexponent_bin?/,irregular_keywords:/val[+-]?|case[+-]?|addr\@?|fold\@|free\@|fix\@?|lam\@?|llam\@?|prop[+-]?|type[+-]?|view[+-@]?|viewt@?ype[+-]?|t@?ype[+-]?|v(iew)?t@?ype[+-]?|abst@?ype|absv(iew)?t@?ype|for\*?|while\*?/,ESCHAR:/[ntvbrfa\\\?'"\(\[\{]/,start:"root",tokenizer:{root:[{regex:/[ \t\r\n]+/,action:{token:""}},{regex:/\(\*\)/,action:{token:"invalid"}},{regex:/\(\*/,action:{token:"comment",next:"lexing_COMMENT_block_ml"}},{regex:/\(/,action:"@brackets"},{regex:/\)/,action:"@brackets"},{regex:/\[/,action:"@brackets"},{regex:/\]/,action:"@brackets"},{regex:/\{/,action:"@brackets"},{regex:/\}/,action:"@brackets"},{regex:/,\(/,action:"@brackets"},{regex:/,/,action:{token:"delimiter.comma"}},{regex:/;/,action:{token:"delimiter.semicolon"}},{regex:/@\(/,action:"@brackets"},{regex:/@\[/,action:"@brackets"},{regex:/@\{/,action:"@brackets"},{regex:/:/,action:{token:"@rematch",next:"@pop"}}],lexing_EXTCODE:[{regex:/^%}/,action:{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}},{regex:/[^%]+/,action:""}],lexing_DQUOTE:[{regex:/"/,action:{token:"string.quote",next:"@pop"}},{regex:/(\{\$)(@IDENTFST@IDENTRST*)(\})/,action:[{token:"string.escape"},{token:"identifier"},{token:"string.escape"}]},{regex:/\\$/,action:{token:"string.escape"}},{regex:/\\(@ESCHAR|[xX]@xdigit+|@digit+)/,action:{token:"string.escape"}},{regex:/[^\\"]+/,action:{token:"string"}}]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/postiats/postiats.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/postiats/postiats.js.gz new file mode 100644 index 0000000..f23d715 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/postiats/postiats.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powerquery/powerquery.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powerquery/powerquery.js new file mode 100644 index 0000000..eee02c5 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powerquery/powerquery.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/powerquery/powerquery",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["[","]"],["(",")"],["{","}"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment","identifier"]},{open:"[",close:"]",notIn:["string","comment","identifier"]},{open:"(",close:")",notIn:["string","comment","identifier"]},{open:"{",close:"}",notIn:["string","comment","identifier"]}]},t.language={defaultToken:"",tokenPostfix:".pq",ignoreCase:!1,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"{",close:"}",token:"delimiter.brackets"},{open:"(",close:")",token:"delimiter.parenthesis"}],operatorKeywords:["and","not","or"],keywords:["as","each","else","error","false","if","in","is","let","meta","otherwise","section","shared","then","true","try","type"],constructors:["#binary","#date","#datetime","#datetimezone","#duration","#table","#time"],constants:["#infinity","#nan","#sections","#shared"],typeKeywords:["action","any","anynonnull","none","null","logical","number","time","date","datetime","datetimezone","duration","text","binary","list","record","table","function"],builtinFunctions:["Access.Database","Action.Return","Action.Sequence","Action.Try","ActiveDirectory.Domains","AdoDotNet.DataSource","AdoDotNet.Query","AdobeAnalytics.Cubes","AnalysisServices.Database","AnalysisServices.Databases","AzureStorage.BlobContents","AzureStorage.Blobs","AzureStorage.Tables","Binary.Buffer","Binary.Combine","Binary.Compress","Binary.Decompress","Binary.End","Binary.From","Binary.FromList","Binary.FromText","Binary.InferContentType","Binary.Length","Binary.ToList","Binary.ToText","BinaryFormat.7BitEncodedSignedInteger","BinaryFormat.7BitEncodedUnsignedInteger","BinaryFormat.Binary","BinaryFormat.Byte","BinaryFormat.ByteOrder","BinaryFormat.Choice","BinaryFormat.Decimal","BinaryFormat.Double","BinaryFormat.Group","BinaryFormat.Length","BinaryFormat.List","BinaryFormat.Null","BinaryFormat.Record","BinaryFormat.SignedInteger16","BinaryFormat.SignedInteger32","BinaryFormat.SignedInteger64","BinaryFormat.Single","BinaryFormat.Text","BinaryFormat.Transform","BinaryFormat.UnsignedInteger16","BinaryFormat.UnsignedInteger32","BinaryFormat.UnsignedInteger64","Byte.From","Character.FromNumber","Character.ToNumber","Combiner.CombineTextByDelimiter","Combiner.CombineTextByEachDelimiter","Combiner.CombineTextByLengths","Combiner.CombineTextByPositions","Combiner.CombineTextByRanges","Comparer.Equals","Comparer.FromCulture","Comparer.Ordinal","Comparer.OrdinalIgnoreCase","Csv.Document","Cube.AddAndExpandDimensionColumn","Cube.AddMeasureColumn","Cube.ApplyParameter","Cube.AttributeMemberId","Cube.AttributeMemberProperty","Cube.CollapseAndRemoveColumns","Cube.Dimensions","Cube.DisplayFolders","Cube.Measures","Cube.Parameters","Cube.Properties","Cube.PropertyKey","Cube.ReplaceDimensions","Cube.Transform","Currency.From","DB2.Database","Date.AddDays","Date.AddMonths","Date.AddQuarters","Date.AddWeeks","Date.AddYears","Date.Day","Date.DayOfWeek","Date.DayOfWeekName","Date.DayOfYear","Date.DaysInMonth","Date.EndOfDay","Date.EndOfMonth","Date.EndOfQuarter","Date.EndOfWeek","Date.EndOfYear","Date.From","Date.FromText","Date.IsInCurrentDay","Date.IsInCurrentMonth","Date.IsInCurrentQuarter","Date.IsInCurrentWeek","Date.IsInCurrentYear","Date.IsInNextDay","Date.IsInNextMonth","Date.IsInNextNDays","Date.IsInNextNMonths","Date.IsInNextNQuarters","Date.IsInNextNWeeks","Date.IsInNextNYears","Date.IsInNextQuarter","Date.IsInNextWeek","Date.IsInNextYear","Date.IsInPreviousDay","Date.IsInPreviousMonth","Date.IsInPreviousNDays","Date.IsInPreviousNMonths","Date.IsInPreviousNQuarters","Date.IsInPreviousNWeeks","Date.IsInPreviousNYears","Date.IsInPreviousQuarter","Date.IsInPreviousWeek","Date.IsInPreviousYear","Date.IsInYearToDate","Date.IsLeapYear","Date.Month","Date.MonthName","Date.QuarterOfYear","Date.StartOfDay","Date.StartOfMonth","Date.StartOfQuarter","Date.StartOfWeek","Date.StartOfYear","Date.ToRecord","Date.ToText","Date.WeekOfMonth","Date.WeekOfYear","Date.Year","DateTime.AddZone","DateTime.Date","DateTime.FixedLocalNow","DateTime.From","DateTime.FromFileTime","DateTime.FromText","DateTime.IsInCurrentHour","DateTime.IsInCurrentMinute","DateTime.IsInCurrentSecond","DateTime.IsInNextHour","DateTime.IsInNextMinute","DateTime.IsInNextNHours","DateTime.IsInNextNMinutes","DateTime.IsInNextNSeconds","DateTime.IsInNextSecond","DateTime.IsInPreviousHour","DateTime.IsInPreviousMinute","DateTime.IsInPreviousNHours","DateTime.IsInPreviousNMinutes","DateTime.IsInPreviousNSeconds","DateTime.IsInPreviousSecond","DateTime.LocalNow","DateTime.Time","DateTime.ToRecord","DateTime.ToText","DateTimeZone.FixedLocalNow","DateTimeZone.FixedUtcNow","DateTimeZone.From","DateTimeZone.FromFileTime","DateTimeZone.FromText","DateTimeZone.LocalNow","DateTimeZone.RemoveZone","DateTimeZone.SwitchZone","DateTimeZone.ToLocal","DateTimeZone.ToRecord","DateTimeZone.ToText","DateTimeZone.ToUtc","DateTimeZone.UtcNow","DateTimeZone.ZoneHours","DateTimeZone.ZoneMinutes","Decimal.From","Diagnostics.ActivityId","Diagnostics.Trace","DirectQueryCapabilities.From","Double.From","Duration.Days","Duration.From","Duration.FromText","Duration.Hours","Duration.Minutes","Duration.Seconds","Duration.ToRecord","Duration.ToText","Duration.TotalDays","Duration.TotalHours","Duration.TotalMinutes","Duration.TotalSeconds","Embedded.Value","Error.Record","Excel.CurrentWorkbook","Excel.Workbook","Exchange.Contents","Expression.Constant","Expression.Evaluate","Expression.Identifier","Facebook.Graph","File.Contents","Folder.Contents","Folder.Files","Function.From","Function.Invoke","Function.InvokeAfter","Function.IsDataSource","GoogleAnalytics.Accounts","Guid.From","HdInsight.Containers","HdInsight.Contents","HdInsight.Files","Hdfs.Contents","Hdfs.Files","Informix.Database","Int16.From","Int32.From","Int64.From","Int8.From","ItemExpression.From","Json.Document","Json.FromValue","Lines.FromBinary","Lines.FromText","Lines.ToBinary","Lines.ToText","List.Accumulate","List.AllTrue","List.Alternate","List.AnyTrue","List.Average","List.Buffer","List.Combine","List.Contains","List.ContainsAll","List.ContainsAny","List.Count","List.Covariance","List.DateTimeZones","List.DateTimes","List.Dates","List.Difference","List.Distinct","List.Durations","List.FindText","List.First","List.FirstN","List.Generate","List.InsertRange","List.Intersect","List.IsDistinct","List.IsEmpty","List.Last","List.LastN","List.MatchesAll","List.MatchesAny","List.Max","List.MaxN","List.Median","List.Min","List.MinN","List.Mode","List.Modes","List.NonNullCount","List.Numbers","List.PositionOf","List.PositionOfAny","List.Positions","List.Product","List.Random","List.Range","List.RemoveFirstN","List.RemoveItems","List.RemoveLastN","List.RemoveMatchingItems","List.RemoveNulls","List.RemoveRange","List.Repeat","List.ReplaceMatchingItems","List.ReplaceRange","List.ReplaceValue","List.Reverse","List.Select","List.Single","List.SingleOrDefault","List.Skip","List.Sort","List.StandardDeviation","List.Sum","List.Times","List.Transform","List.TransformMany","List.Union","List.Zip","Logical.From","Logical.FromText","Logical.ToText","MQ.Queue","MySQL.Database","Number.Abs","Number.Acos","Number.Asin","Number.Atan","Number.Atan2","Number.BitwiseAnd","Number.BitwiseNot","Number.BitwiseOr","Number.BitwiseShiftLeft","Number.BitwiseShiftRight","Number.BitwiseXor","Number.Combinations","Number.Cos","Number.Cosh","Number.Exp","Number.Factorial","Number.From","Number.FromText","Number.IntegerDivide","Number.IsEven","Number.IsNaN","Number.IsOdd","Number.Ln","Number.Log","Number.Log10","Number.Mod","Number.Permutations","Number.Power","Number.Random","Number.RandomBetween","Number.Round","Number.RoundAwayFromZero","Number.RoundDown","Number.RoundTowardZero","Number.RoundUp","Number.Sign","Number.Sin","Number.Sinh","Number.Sqrt","Number.Tan","Number.Tanh","Number.ToText","OData.Feed","Odbc.DataSource","Odbc.Query","OleDb.DataSource","OleDb.Query","Oracle.Database","Percentage.From","PostgreSQL.Database","RData.FromBinary","Record.AddField","Record.Combine","Record.Field","Record.FieldCount","Record.FieldNames","Record.FieldOrDefault","Record.FieldValues","Record.FromList","Record.FromTable","Record.HasFields","Record.RemoveFields","Record.RenameFields","Record.ReorderFields","Record.SelectFields","Record.ToList","Record.ToTable","Record.TransformFields","Replacer.ReplaceText","Replacer.ReplaceValue","RowExpression.Column","RowExpression.From","Salesforce.Data","Salesforce.Reports","SapBusinessWarehouse.Cubes","SapHana.Database","SharePoint.Contents","SharePoint.Files","SharePoint.Tables","Single.From","Soda.Feed","Splitter.SplitByNothing","Splitter.SplitTextByAnyDelimiter","Splitter.SplitTextByDelimiter","Splitter.SplitTextByEachDelimiter","Splitter.SplitTextByLengths","Splitter.SplitTextByPositions","Splitter.SplitTextByRanges","Splitter.SplitTextByRepeatedLengths","Splitter.SplitTextByWhitespace","Sql.Database","Sql.Databases","SqlExpression.SchemaFrom","SqlExpression.ToExpression","Sybase.Database","Table.AddColumn","Table.AddIndexColumn","Table.AddJoinColumn","Table.AddKey","Table.AggregateTableColumn","Table.AlternateRows","Table.Buffer","Table.Column","Table.ColumnCount","Table.ColumnNames","Table.ColumnsOfType","Table.Combine","Table.CombineColumns","Table.Contains","Table.ContainsAll","Table.ContainsAny","Table.DemoteHeaders","Table.Distinct","Table.DuplicateColumn","Table.ExpandListColumn","Table.ExpandRecordColumn","Table.ExpandTableColumn","Table.FillDown","Table.FillUp","Table.FilterWithDataTable","Table.FindText","Table.First","Table.FirstN","Table.FirstValue","Table.FromColumns","Table.FromList","Table.FromPartitions","Table.FromRecords","Table.FromRows","Table.FromValue","Table.Group","Table.HasColumns","Table.InsertRows","Table.IsDistinct","Table.IsEmpty","Table.Join","Table.Keys","Table.Last","Table.LastN","Table.MatchesAllRows","Table.MatchesAnyRows","Table.Max","Table.MaxN","Table.Min","Table.MinN","Table.NestedJoin","Table.Partition","Table.PartitionValues","Table.Pivot","Table.PositionOf","Table.PositionOfAny","Table.PrefixColumns","Table.Profile","Table.PromoteHeaders","Table.Range","Table.RemoveColumns","Table.RemoveFirstN","Table.RemoveLastN","Table.RemoveMatchingRows","Table.RemoveRows","Table.RemoveRowsWithErrors","Table.RenameColumns","Table.ReorderColumns","Table.Repeat","Table.ReplaceErrorValues","Table.ReplaceKeys","Table.ReplaceMatchingRows","Table.ReplaceRelationshipIdentity","Table.ReplaceRows","Table.ReplaceValue","Table.ReverseRows","Table.RowCount","Table.Schema","Table.SelectColumns","Table.SelectRows","Table.SelectRowsWithErrors","Table.SingleRow","Table.Skip","Table.Sort","Table.SplitColumn","Table.ToColumns","Table.ToList","Table.ToRecords","Table.ToRows","Table.TransformColumnNames","Table.TransformColumnTypes","Table.TransformColumns","Table.TransformRows","Table.Transpose","Table.Unpivot","Table.UnpivotOtherColumns","Table.View","Table.ViewFunction","TableAction.DeleteRows","TableAction.InsertRows","TableAction.UpdateRows","Tables.GetRelationships","Teradata.Database","Text.AfterDelimiter","Text.At","Text.BeforeDelimiter","Text.BetweenDelimiters","Text.Clean","Text.Combine","Text.Contains","Text.End","Text.EndsWith","Text.Format","Text.From","Text.FromBinary","Text.Insert","Text.Length","Text.Lower","Text.Middle","Text.NewGuid","Text.PadEnd","Text.PadStart","Text.PositionOf","Text.PositionOfAny","Text.Proper","Text.Range","Text.Remove","Text.RemoveRange","Text.Repeat","Text.Replace","Text.ReplaceRange","Text.Select","Text.Split","Text.SplitAny","Text.Start","Text.StartsWith","Text.ToBinary","Text.ToList","Text.Trim","Text.TrimEnd","Text.TrimStart","Text.Upper","Time.EndOfHour","Time.From","Time.FromText","Time.Hour","Time.Minute","Time.Second","Time.StartOfHour","Time.ToRecord","Time.ToText","Type.AddTableKey","Type.ClosedRecord","Type.Facets","Type.ForFunction","Type.ForRecord","Type.FunctionParameters","Type.FunctionRequiredParameters","Type.FunctionReturn","Type.Is","Type.IsNullable","Type.IsOpenRecord","Type.ListItem","Type.NonNullable","Type.OpenRecord","Type.RecordFields","Type.ReplaceFacets","Type.ReplaceTableKeys","Type.TableColumn","Type.TableKeys","Type.TableRow","Type.TableSchema","Type.Union","Uri.BuildQueryString","Uri.Combine","Uri.EscapeDataString","Uri.Parts","Value.Add","Value.As","Value.Compare","Value.Divide","Value.Equals","Value.Firewall","Value.FromText","Value.Is","Value.Metadata","Value.Multiply","Value.NativeQuery","Value.NullableEquals","Value.RemoveMetadata","Value.ReplaceMetadata","Value.ReplaceType","Value.Subtract","Value.Type","ValueAction.NativeStatement","ValueAction.Replace","Variable.Value","Web.Contents","Web.Page","WebAction.Request","Xml.Document","Xml.Tables"],builtinConstants:["BinaryEncoding.Base64","BinaryEncoding.Hex","BinaryOccurrence.Optional","BinaryOccurrence.Repeating","BinaryOccurrence.Required","ByteOrder.BigEndian","ByteOrder.LittleEndian","Compression.Deflate","Compression.GZip","CsvStyle.QuoteAfterDelimiter","CsvStyle.QuoteAlways","Culture.Current","Day.Friday","Day.Monday","Day.Saturday","Day.Sunday","Day.Thursday","Day.Tuesday","Day.Wednesday","ExtraValues.Error","ExtraValues.Ignore","ExtraValues.List","GroupKind.Global","GroupKind.Local","JoinAlgorithm.Dynamic","JoinAlgorithm.LeftHash","JoinAlgorithm.LeftIndex","JoinAlgorithm.PairwiseHash","JoinAlgorithm.RightHash","JoinAlgorithm.RightIndex","JoinAlgorithm.SortMerge","JoinKind.FullOuter","JoinKind.Inner","JoinKind.LeftAnti","JoinKind.LeftOuter","JoinKind.RightAnti","JoinKind.RightOuter","JoinSide.Left","JoinSide.Right","MissingField.Error","MissingField.Ignore","MissingField.UseNull","Number.E","Number.Epsilon","Number.NaN","Number.NegativeInfinity","Number.PI","Number.PositiveInfinity","Occurrence.All","Occurrence.First","Occurrence.Last","Occurrence.Optional","Occurrence.Repeating","Occurrence.Required","Order.Ascending","Order.Descending","Precision.Decimal","Precision.Double","QuoteStyle.Csv","QuoteStyle.None","RelativePosition.FromEnd","RelativePosition.FromStart","RoundingMode.AwayFromZero","RoundingMode.Down","RoundingMode.ToEven","RoundingMode.TowardZero","RoundingMode.Up","SapHanaDistribution.All","SapHanaDistribution.Connection","SapHanaDistribution.Off","SapHanaDistribution.Statement","SapHanaRangeOperator.Equals","SapHanaRangeOperator.GreaterThan","SapHanaRangeOperator.GreaterThanOrEquals","SapHanaRangeOperator.LessThan","SapHanaRangeOperator.LessThanOrEquals","SapHanaRangeOperator.NotEquals","TextEncoding.Ascii","TextEncoding.BigEndianUnicode","TextEncoding.Unicode","TextEncoding.Utf16","TextEncoding.Utf8","TextEncoding.Windows","TraceLevel.Critical","TraceLevel.Error","TraceLevel.Information","TraceLevel.Verbose","TraceLevel.Warning","WebMethod.Delete","WebMethod.Get","WebMethod.Head","WebMethod.Patch","WebMethod.Post","WebMethod.Put"],builtinTypes:["Action.Type","Any.Type","Binary.Type","BinaryEncoding.Type","BinaryOccurrence.Type","Byte.Type","ByteOrder.Type","Character.Type","Compression.Type","CsvStyle.Type","Currency.Type","Date.Type","DateTime.Type","DateTimeZone.Type","Day.Type","Decimal.Type","Double.Type","Duration.Type","ExtraValues.Type","Function.Type","GroupKind.Type","Guid.Type","Int16.Type","Int32.Type","Int64.Type","Int8.Type","JoinAlgorithm.Type","JoinKind.Type","JoinSide.Type","List.Type","Logical.Type","MissingField.Type","None.Type","Null.Type","Number.Type","Occurrence.Type","Order.Type","Password.Type","Percentage.Type","Precision.Type","QuoteStyle.Type","Record.Type","RelativePosition.Type","RoundingMode.Type","SapHanaDistribution.Type","SapHanaRangeOperator.Type","Single.Type","Table.Type","Text.Type","TextEncoding.Type","Time.Type","TraceLevel.Type","Type.Type","Uri.Type","WebMethod.Type"],tokenizer:{root:[[/#"[\w \.]+"/,"identifier.quote"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/0[xX][0-9a-fA-F]+/,"number.hex"],[/\d+([eE][\-+]?\d+)?/,"number"],[/(#?[a-z]+)\b/,{cases:{"@typeKeywords":"type","@keywords":"keyword","@constants":"constant","@constructors":"constructor","@operatorKeywords":"operators","@default":"identifier"}}],[/\b([A-Z][a-zA-Z0-9]+\.Type)\b/,{cases:{"@builtinTypes":"type","@default":"identifier"}}],[/\b([A-Z][a-zA-Z0-9]+\.[A-Z][a-zA-Z0-9]+)\b/,{cases:{"@builtinFunctions":"keyword.function","@builtinConstants":"constant","@default":"identifier"}}],[/\b([a-zA-Z_][\w\.]*)\b/,"identifier"],{include:"@whitespace"},{include:"@comments"},{include:"@strings"},[/[{}()\[\]]/,"@brackets"],[/([=\+<>\-\*&@\?\/!])|([<>]=)|(<>)|(=>)|(\.\.\.)|(\.\.)/,"operators"],[/[,;]/,"delimiter"]],whitespace:[[/\s+/,"white"]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],strings:[['"',"string","@string"]],string:[['""',"string.escape"],['"',"string","@pop"],[".","string"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powerquery/powerquery.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powerquery/powerquery.js.gz new file mode 100644 index 0000000..56d5c78 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powerquery/powerquery.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powershell/powershell.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powershell/powershell.js new file mode 100644 index 0000000..7505fc9 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powershell/powershell.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/powershell/powershell",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#%\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"#",blockComment:["<#","#>"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},n.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".ps1",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],keywords:["begin","break","catch","class","continue","data","define","do","dynamicparam","else","elseif","end","exit","filter","finally","for","foreach","from","function","if","in","param","process","return","switch","throw","trap","try","until","using","var","while","workflow","parallel","sequence","inlinescript","configuration"],helpKeywords:/SYNOPSIS|DESCRIPTION|PARAMETER|EXAMPLE|INPUTS|OUTPUTS|NOTES|LINK|COMPONENT|ROLE|FUNCTIONALITY|FORWARDHELPTARGETNAME|FORWARDHELPCATEGORY|REMOTEHELPRUNSPACE|EXTERNALHELP/,symbols:/[=>/,"comment","@pop"],[/(\.)(@helpKeywords)(?!\w)/,{token:"comment.keyword.$2"}],[/[\.#]/,"comment"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powershell/powershell.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powershell/powershell.js.gz new file mode 100644 index 0000000..17e2389 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/powershell/powershell.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/pug/pug.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/pug/pug.js new file mode 100644 index 0000000..8212279 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/pug/pug.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/pug/pug",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}],folding:{offSide:!0}},t.language={defaultToken:"",tokenPostfix:".pug",ignoreCase:!0,brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],keywords:["append","block","case","default","doctype","each","else","extends","for","if","in","include","mixin","typeof","unless","var","when"],tags:["a","abbr","acronym","address","area","article","aside","audio","b","base","basefont","bdi","bdo","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","command","datalist","dd","del","details","dfn","div","dl","dt","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","keygen","kbd","label","li","link","map","mark","menu","meta","meter","nav","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strike","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","tracks","tt","u","ul","video","wbr"],symbols:/[\+\-\*\%\&\|\!\=\/\.\,\:]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^(\s*)([a-zA-Z_-][\w-]*)/,{cases:{"$2@tags":{cases:{"@eos":["","tag"],"@default":["",{token:"tag",next:"@tag.$1"}]}},"$2@keywords":["",{token:"keyword.$2"}],"@default":["",""]}}],[/^(\s*)(#[a-zA-Z_-][\w-]*)/,{cases:{"@eos":["","tag.id"],"@default":["",{token:"tag.id",next:"@tag.$1"}]}}],[/^(\s*)(\.[a-zA-Z_-][\w-]*)/,{cases:{"@eos":["","tag.class"],"@default":["",{token:"tag.class",next:"@tag.$1"}]}}],[/^(\s*)(\|.*)$/,""],{include:"@whitespace"},[/[a-zA-Z_$][\w$]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":""}}],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/\d+\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\d+/,"number"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],tag:[[/(\.)(\s*$)/,[{token:"delimiter",next:"@blockText.$S2."},""]],[/\s+/,{token:"",next:"@simpleText"}],[/#[a-zA-Z_-][\w-]*/,{cases:{"@eos":{token:"tag.id",next:"@pop"},"@default":"tag.id"}}],[/\.[a-zA-Z_-][\w-]*/,{cases:{"@eos":{token:"tag.class",next:"@pop"},"@default":"tag.class"}}],[/\(/,{token:"delimiter.parenthesis",next:"@attributeList"}]],simpleText:[[/[^#]+$/,{token:"",next:"@popall"}],[/[^#]+/,{token:""}],[/(#{)([^}]*)(})/,{cases:{"@eos":["interpolation.delimiter","interpolation",{token:"interpolation.delimiter",next:"@popall"}],"@default":["interpolation.delimiter","interpolation","interpolation.delimiter"]}}],[/#$/,{token:"",next:"@popall"}],[/#/,""]],attributeList:[[/\s+/,""],[/(\w+)(\s*=\s*)("|')/,["attribute.name","delimiter",{token:"attribute.value",next:"@value.$3"}]],[/\w+/,"attribute.name"],[/,/,{cases:{"@eos":{token:"attribute.delimiter",next:"@popall"},"@default":"attribute.delimiter"}}],[/\)$/,{token:"delimiter.parenthesis",next:"@popall"}],[/\)/,{token:"delimiter.parenthesis",next:"@pop"}]],whitespace:[[/^(\s*)(\/\/.*)$/,{token:"comment",next:"@blockText.$1.comment"}],[/[ \t\r\n]+/,""],[//,{token:"comment",next:"@pop"}],[//,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/@[^@]/,{token:"@rematch",switchTo:"@razorInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],razorInSimpleState:[[/@\*/,"comment.cs","@razorBlockCommentTopLevel"],[/@[{(]/,"metatag.cs","@razorRootTopLevel"],[/(@)(\s*[\w]+)/,["metatag.cs",{token:"identifier.cs",switchTo:"@$S2.$S3"}]],[/[})]/,{token:"metatag.cs",switchTo:"@$S2.$S3"}],[/\*@/,{token:"comment.cs",switchTo:"@$S2.$S3"}]],razorInEmbeddedState:[[/@\*/,"comment.cs","@razorBlockCommentTopLevel"],[/@[{(]/,"metatag.cs","@razorRootTopLevel"],[/(@)(\s*[\w]+)/,["metatag.cs",{token:"identifier.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}]],[/[})]/,{token:"metatag.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],[/\*@/,{token:"comment.cs",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}]],razorBlockCommentTopLevel:[[/\*@/,"@rematch","@pop"],[/[^*]+/,"comment.cs"],[/./,"comment.cs"]],razorBlockComment:[[/\*@/,"comment.cs","@pop"],[/[^*]+/,"comment.cs"],[/./,"comment.cs"]],razorRootTopLevel:[[/\{/,"delimiter.bracket.cs","@razorRoot"],[/\(/,"delimiter.parenthesis.cs","@razorRoot"],[/[})]/,"@rematch","@pop"],{include:"razorCommon"}],razorRoot:[[/\{/,"delimiter.bracket.cs","@razorRoot"],[/\(/,"delimiter.parenthesis.cs","@razorRoot"],[/\}/,"delimiter.bracket.cs","@pop"],[/\)/,"delimiter.parenthesis.cs","@pop"],{include:"razorCommon"}],razorCommon:[[/[a-zA-Z_]\w*/,{cases:{"@razorKeywords":{token:"keyword.cs"},"@default":"identifier.cs"}}],[/[\[\]]/,"delimiter.array.cs"],[/[ \t\r\n]+/],[/\/\/.*$/,"comment.cs"],[/@\*/,"comment.cs","@razorBlockComment"],[/"([^"]*)"/,"string.cs"],[/'([^']*)'/,"string.cs"],[/(<)(\w+)(\/>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)(\w+)(>)/,["delimiter.html","tag.html","delimiter.html"]],[/(<\/)(\w+)(>)/,["delimiter.html","tag.html","delimiter.html"]],[/[\+\-\*\%\&\|\^\~\!\=\<\>\/\?\;\:\.\,]/,"delimiter.cs"],[/\d*\d+[eE]([\-+]?\d+)?/,"number.float.cs"],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float.cs"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F]/,"number.hex.cs"],[/0[0-7']*[0-7]/,"number.octal.cs"],[/0[bB][0-1']*[0-1]/,"number.binary.cs"],[/\d[\d']*/,"number.cs"],[/\d/,"number.cs"]]},razorKeywords:["abstract","as","async","await","base","bool","break","by","byte","case","catch","char","checked","class","const","continue","decimal","default","delegate","do","double","descending","explicit","event","extern","else","enum","false","finally","fixed","float","for","foreach","from","goto","group","if","implicit","in","int","interface","internal","into","is","lock","long","nameof","new","null","namespace","object","operator","out","override","orderby","params","private","protected","public","readonly","ref","return","switch","struct","sbyte","sealed","short","sizeof","stackalloc","static","string","select","this","throw","true","try","typeof","uint","ulong","unchecked","unsafe","ushort","using","var","virtual","volatile","void","when","while","where","yield","model","inject"],escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/razor/razor.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/razor/razor.js.gz new file mode 100644 index 0000000..c5842d5 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/razor/razor.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redis/redis.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redis/redis.js new file mode 100644 index 0000000..64b62ae --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redis/redis.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/redis/redis",["require","exports"],(function(E,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.language=e.conf=void 0,e.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},e.language={defaultToken:"",tokenPostfix:".redis",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["APPEND","AUTH","BGREWRITEAOF","BGSAVE","BITCOUNT","BITFIELD","BITOP","BITPOS","BLPOP","BRPOP","BRPOPLPUSH","CLIENT","KILL","LIST","GETNAME","PAUSE","REPLY","SETNAME","CLUSTER","ADDSLOTS","COUNT-FAILURE-REPORTS","COUNTKEYSINSLOT","DELSLOTS","FAILOVER","FORGET","GETKEYSINSLOT","INFO","KEYSLOT","MEET","NODES","REPLICATE","RESET","SAVECONFIG","SET-CONFIG-EPOCH","SETSLOT","SLAVES","SLOTS","COMMAND","COUNT","GETKEYS","CONFIG","GET","REWRITE","SET","RESETSTAT","DBSIZE","DEBUG","OBJECT","SEGFAULT","DECR","DECRBY","DEL","DISCARD","DUMP","ECHO","EVAL","EVALSHA","EXEC","EXISTS","EXPIRE","EXPIREAT","FLUSHALL","FLUSHDB","GEOADD","GEOHASH","GEOPOS","GEODIST","GEORADIUS","GEORADIUSBYMEMBER","GETBIT","GETRANGE","GETSET","HDEL","HEXISTS","HGET","HGETALL","HINCRBY","HINCRBYFLOAT","HKEYS","HLEN","HMGET","HMSET","HSET","HSETNX","HSTRLEN","HVALS","INCR","INCRBY","INCRBYFLOAT","KEYS","LASTSAVE","LINDEX","LINSERT","LLEN","LPOP","LPUSH","LPUSHX","LRANGE","LREM","LSET","LTRIM","MGET","MIGRATE","MONITOR","MOVE","MSET","MSETNX","MULTI","PERSIST","PEXPIRE","PEXPIREAT","PFADD","PFCOUNT","PFMERGE","PING","PSETEX","PSUBSCRIBE","PUBSUB","PTTL","PUBLISH","PUNSUBSCRIBE","QUIT","RANDOMKEY","READONLY","READWRITE","RENAME","RENAMENX","RESTORE","ROLE","RPOP","RPOPLPUSH","RPUSH","RPUSHX","SADD","SAVE","SCARD","SCRIPT","FLUSH","LOAD","SDIFF","SDIFFSTORE","SELECT","SETBIT","SETEX","SETNX","SETRANGE","SHUTDOWN","SINTER","SINTERSTORE","SISMEMBER","SLAVEOF","SLOWLOG","SMEMBERS","SMOVE","SORT","SPOP","SRANDMEMBER","SREM","STRLEN","SUBSCRIBE","SUNION","SUNIONSTORE","SWAPDB","SYNC","TIME","TOUCH","TTL","TYPE","UNSUBSCRIBE","UNLINK","UNWATCH","WAIT","WATCH","ZADD","ZCARD","ZCOUNT","ZINCRBY","ZINTERSTORE","ZLEXCOUNT","ZRANGE","ZRANGEBYLEX","ZREVRANGEBYLEX","ZRANGEBYSCORE","ZRANK","ZREM","ZREMRANGEBYLEX","ZREMRANGEBYRANK","ZREMRANGEBYSCORE","ZREVRANGE","ZREVRANGEBYSCORE","ZREVRANK","ZSCORE","ZUNIONSTORE","SCAN","SSCAN","HSCAN","ZSCAN"],operators:[],builtinFunctions:[],builtinVariables:[],pseudoColumns:[],tokenizer:{root:[{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}],[/"/,{token:"string.double",next:"@stringDouble"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],stringDouble:[[/[^"]+/,"string.double"],[/""/,"string.double"],[/"/,{token:"string.double",next:"@pop"}]],scopes:[]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redis/redis.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redis/redis.js.gz new file mode 100644 index 0000000..571835c Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redis/redis.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redshift/redshift.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redshift/redshift.js new file mode 100644 index 0000000..a9829cc --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redshift/redshift.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/redshift/redshift",["require","exports"],(function(e,_){"use strict";Object.defineProperty(_,"__esModule",{value:!0}),_.language=_.conf=void 0,_.conf={comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},_.language={defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["AES128","AES256","ALL","ALLOWOVERWRITE","ANALYSE","ANALYZE","AND","ANY","ARRAY","AS","ASC","AUTHORIZATION","BACKUP","BETWEEN","BINARY","BLANKSASNULL","BOTH","BY","BYTEDICT","BZIP2","CASE","CAST","CHECK","COLLATE","COLUMN","CONSTRAINT","CREATE","CREDENTIALS","CROSS","CURRENT_DATE","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","CURRENT_USER_ID","DEFAULT","DEFERRABLE","DEFLATE","DEFRAG","DELTA","DELTA32K","DESC","DISABLE","DISTINCT","DO","ELSE","EMPTYASNULL","ENABLE","ENCODE","ENCRYPT","ENCRYPTION","END","EXCEPT","EXPLICIT","FALSE","FOR","FOREIGN","FREEZE","FROM","FULL","GLOBALDICT256","GLOBALDICT64K","GRANT","GROUP","GZIP","HAVING","IDENTITY","IGNORE","ILIKE","IN","INITIALLY","INNER","INTERSECT","INTO","IS","ISNULL","JOIN","LEADING","LEFT","LIKE","LIMIT","LOCALTIME","LOCALTIMESTAMP","LUN","LUNS","LZO","LZOP","MINUS","MOSTLY13","MOSTLY32","MOSTLY8","NATURAL","NEW","NOT","NOTNULL","NULL","NULLS","OFF","OFFLINE","OFFSET","OID","OLD","ON","ONLY","OPEN","OR","ORDER","OUTER","OVERLAPS","PARALLEL","PARTITION","PERCENT","PERMISSIONS","PLACING","PRIMARY","RAW","READRATIO","RECOVER","REFERENCES","RESPECT","REJECTLOG","RESORT","RESTORE","RIGHT","SELECT","SESSION_USER","SIMILAR","SNAPSHOT","SOME","SYSDATE","SYSTEM","TABLE","TAG","TDES","TEXT255","TEXT32K","THEN","TIMESTAMP","TO","TOP","TRAILING","TRUE","TRUNCATECOLUMNS","UNION","UNIQUE","USER","USING","VERBOSE","WALLET","WHEN","WHERE","WITH","WITHOUT"],operators:["AND","BETWEEN","IN","LIKE","NOT","OR","IS","NULL","INTERSECT","UNION","INNER","JOIN","LEFT","OUTER","RIGHT"],builtinFunctions:["current_schema","current_schemas","has_database_privilege","has_schema_privilege","has_table_privilege","age","current_time","current_timestamp","localtime","isfinite","now","ascii","get_bit","get_byte","set_bit","set_byte","to_ascii","approximate percentile_disc","avg","count","listagg","max","median","min","percentile_cont","stddev_samp","stddev_pop","sum","var_samp","var_pop","bit_and","bit_or","bool_and","bool_or","cume_dist","first_value","lag","last_value","lead","nth_value","ratio_to_report","dense_rank","ntile","percent_rank","rank","row_number","case","coalesce","decode","greatest","least","nvl","nvl2","nullif","add_months","at time zone","convert_timezone","current_date","date_cmp","date_cmp_timestamp","date_cmp_timestamptz","date_part_year","dateadd","datediff","date_part","date_trunc","extract","getdate","interval_cmp","last_day","months_between","next_day","sysdate","timeofday","timestamp_cmp","timestamp_cmp_date","timestamp_cmp_timestamptz","timestamptz_cmp","timestamptz_cmp_date","timestamptz_cmp_timestamp","timezone","to_timestamp","trunc","abs","acos","asin","atan","atan2","cbrt","ceil","ceiling","checksum","cos","cot","degrees","dexp","dlog1","dlog10","exp","floor","ln","log","mod","pi","power","radians","random","round","sin","sign","sqrt","tan","to_hex","bpcharcmp","btrim","bttext_pattern_cmp","char_length","character_length","charindex","chr","concat","crc32","func_sha1","initcap","left and rights","len","length","lower","lpad and rpads","ltrim","md5","octet_length","position","quote_ident","quote_literal","regexp_count","regexp_instr","regexp_replace","regexp_substr","repeat","replace","replicate","reverse","rtrim","split_part","strpos","strtol","substring","textlen","translate","trim","upper","cast","convert","to_char","to_date","to_number","json_array_length","json_extract_array_element_text","json_extract_path_text","current_setting","pg_cancel_backend","pg_terminate_backend","set_config","current_database","current_user","current_user_id","pg_backend_pid","pg_last_copy_count","pg_last_copy_id","pg_last_query_id","pg_last_unload_count","session_user","slice_num","user","version","abbrev","acosd","any","area","array_agg","array_append","array_cat","array_dims","array_fill","array_length","array_lower","array_ndims","array_position","array_positions","array_prepend","array_remove","array_replace","array_to_json","array_to_string","array_to_tsvector","array_upper","asind","atan2d","atand","bit","bit_length","bound_box","box","brin_summarize_new_values","broadcast","cardinality","center","circle","clock_timestamp","col_description","concat_ws","convert_from","convert_to","corr","cosd","cotd","covar_pop","covar_samp","current_catalog","current_query","current_role","currval","cursor_to_xml","diameter","div","encode","enum_first","enum_last","enum_range","every","family","format","format_type","generate_series","generate_subscripts","get_current_ts_config","gin_clean_pending_list","grouping","has_any_column_privilege","has_column_privilege","has_foreign_data_wrapper_privilege","has_function_privilege","has_language_privilege","has_sequence_privilege","has_server_privilege","has_tablespace_privilege","has_type_privilege","height","host","hostmask","inet_client_addr","inet_client_port","inet_merge","inet_same_family","inet_server_addr","inet_server_port","isclosed","isempty","isopen","json_agg","json_object","json_object_agg","json_populate_record","json_populate_recordset","json_to_record","json_to_recordset","jsonb_agg","jsonb_object_agg","justify_days","justify_hours","justify_interval","lastval","left","line","localtimestamp","lower_inc","lower_inf","lpad","lseg","make_date","make_interval","make_time","make_timestamp","make_timestamptz","masklen","mode","netmask","network","nextval","npoints","num_nonnulls","num_nulls","numnode","obj_description","overlay","parse_ident","path","pclose","percentile_disc","pg_advisory_lock","pg_advisory_lock_shared","pg_advisory_unlock","pg_advisory_unlock_all","pg_advisory_unlock_shared","pg_advisory_xact_lock","pg_advisory_xact_lock_shared","pg_backup_start_time","pg_blocking_pids","pg_client_encoding","pg_collation_is_visible","pg_column_size","pg_conf_load_time","pg_control_checkpoint","pg_control_init","pg_control_recovery","pg_control_system","pg_conversion_is_visible","pg_create_logical_replication_slot","pg_create_physical_replication_slot","pg_create_restore_point","pg_current_xlog_flush_location","pg_current_xlog_insert_location","pg_current_xlog_location","pg_database_size","pg_describe_object","pg_drop_replication_slot","pg_export_snapshot","pg_filenode_relation","pg_function_is_visible","pg_get_constraintdef","pg_get_expr","pg_get_function_arguments","pg_get_function_identity_arguments","pg_get_function_result","pg_get_functiondef","pg_get_indexdef","pg_get_keywords","pg_get_object_address","pg_get_owned_sequence","pg_get_ruledef","pg_get_serial_sequence","pg_get_triggerdef","pg_get_userbyid","pg_get_viewdef","pg_has_role","pg_identify_object","pg_identify_object_as_address","pg_index_column_has_property","pg_index_has_property","pg_indexam_has_property","pg_indexes_size","pg_is_in_backup","pg_is_in_recovery","pg_is_other_temp_schema","pg_is_xlog_replay_paused","pg_last_committed_xact","pg_last_xact_replay_timestamp","pg_last_xlog_receive_location","pg_last_xlog_replay_location","pg_listening_channels","pg_logical_emit_message","pg_logical_slot_get_binary_changes","pg_logical_slot_get_changes","pg_logical_slot_peek_binary_changes","pg_logical_slot_peek_changes","pg_ls_dir","pg_my_temp_schema","pg_notification_queue_usage","pg_opclass_is_visible","pg_operator_is_visible","pg_opfamily_is_visible","pg_options_to_table","pg_postmaster_start_time","pg_read_binary_file","pg_read_file","pg_relation_filenode","pg_relation_filepath","pg_relation_size","pg_reload_conf","pg_replication_origin_create","pg_replication_origin_drop","pg_replication_origin_oid","pg_replication_origin_progress","pg_replication_origin_session_is_setup","pg_replication_origin_session_progress","pg_replication_origin_session_reset","pg_replication_origin_session_setup","pg_replication_origin_xact_reset","pg_replication_origin_xact_setup","pg_rotate_logfile","pg_size_bytes","pg_size_pretty","pg_sleep","pg_sleep_for","pg_sleep_until","pg_start_backup","pg_stat_file","pg_stop_backup","pg_switch_xlog","pg_table_is_visible","pg_table_size","pg_tablespace_databases","pg_tablespace_location","pg_tablespace_size","pg_total_relation_size","pg_trigger_depth","pg_try_advisory_lock","pg_try_advisory_lock_shared","pg_try_advisory_xact_lock","pg_try_advisory_xact_lock_shared","pg_ts_config_is_visible","pg_ts_dict_is_visible","pg_ts_parser_is_visible","pg_ts_template_is_visible","pg_type_is_visible","pg_typeof","pg_xact_commit_timestamp","pg_xlog_location_diff","pg_xlog_replay_pause","pg_xlog_replay_resume","pg_xlogfile_name","pg_xlogfile_name_offset","phraseto_tsquery","plainto_tsquery","point","polygon","popen","pqserverversion","query_to_xml","querytree","quote_nullable","radius","range_merge","regexp_matches","regexp_split_to_array","regexp_split_to_table","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","right","row_security_active","row_to_json","rpad","scale","set_masklen","setseed","setval","setweight","shobj_description","sind","sprintf","statement_timestamp","stddev","string_agg","string_to_array","strip","substr","table_to_xml","table_to_xml_and_xmlschema","tand","text","to_json","to_regclass","to_regnamespace","to_regoper","to_regoperator","to_regproc","to_regprocedure","to_regrole","to_regtype","to_tsquery","to_tsvector","transaction_timestamp","ts_debug","ts_delete","ts_filter","ts_headline","ts_lexize","ts_parse","ts_rank","ts_rank_cd","ts_rewrite","ts_stat","ts_token_type","tsquery_phrase","tsvector_to_array","tsvector_update_trigger","tsvector_update_trigger_column","txid_current","txid_current_snapshot","txid_snapshot_xip","txid_snapshot_xmax","txid_snapshot_xmin","txid_visible_in_snapshot","unnest","upper_inc","upper_inf","variance","width","width_bucket","xml_is_well_formed","xml_is_well_formed_content","xml_is_well_formed_document","xmlagg","xmlcomment","xmlconcat","xmlelement","xmlexists","xmlforest","xmlparse","xmlpi","xmlroot","xmlserialize","xpath","xpath_exists"],builtinVariables:[],pseudoColumns:[],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],complexIdentifiers:[[/"/,{token:"identifier.quote",next:"@quotedIdentifier"}]],quotedIdentifier:[[/[^"]+/,"identifier"],[/""/,"identifier"],[/"/,{token:"identifier.quote",next:"@pop"}]],scopes:[]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redshift/redshift.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redshift/redshift.js.gz new file mode 100644 index 0000000..c9976a4 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/redshift/redshift.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/restructuredtext/restructuredtext.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/restructuredtext/restructuredtext.js new file mode 100644 index 0000000..694d9a2 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/restructuredtext/restructuredtext.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/restructuredtext/restructuredtext",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">",notIn:["string"]}],surroundingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"`",close:"`"}],folding:{markers:{start:new RegExp("^\\s*\x3c!--\\s*#?region\\b.*--\x3e"),end:new RegExp("^\\s*\x3c!--\\s*#?endregion\\b.*--\x3e")}}},n.language={defaultToken:"",tokenPostfix:".rst",control:/[\\`*_\[\]{}()#+\-\.!]/,escapes:/\\(?:@control)/,empty:["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param"],alphanumerics:/[A-Za-z0-9]/,alphanumericsplus:/[A-Za-z0-9-_+:.]/,simpleRefNameWithoutBq:/(?:@alphanumerics@alphanumericsplus*@alphanumerics)+|(?:@alphanumerics+)/,simpleRefName:/(?:`@simpleRefNameWithoutBq`|@simpleRefNameWithoutBq)/,phrase:/@simpleRefName(?:\s@simpleRefName)*/,citationName:/[A-Za-z][A-Za-z0-9-_.]*/,blockLiteralStart:/(?:[!"#$%&'()*+,-./:;<=>?@\[\]^_`{|}~]|[\s])/,precedingChars:/(?:[ -:/'"<([{])/,followingChars:/(?:[ -.,:;!?/'")\]}>]|$)/,punctuation:/(=|-|~|`|#|"|\^|\+|\*|:|\.|'|_|\+)/,tokenizer:{root:[[/^(@punctuation{3,}$){1,1}?/,"keyword"],[/^\s*([\*\-+‣•]|[a-zA-Z0-9]+\.|\([a-zA-Z0-9]+\)|[a-zA-Z0-9]+\))\s/,"keyword"],[/([ ]::)\s*$/,"keyword","@blankLineOfLiteralBlocks"],[/(::)\s*$/,"keyword","@blankLineOfLiteralBlocks"],{include:"@tables"},{include:"@explicitMarkupBlocks"},{include:"@inlineMarkup"}],explicitMarkupBlocks:[{include:"@citations"},{include:"@footnotes"},[/^(\.\.\s)(@simpleRefName)(::\s)(.*)$/,[{token:"",next:"subsequentLines"},"keyword","",""]],[/^(\.\.)(\s+)(_)(@simpleRefName)(:)(\s+)(.*)/,[{token:"",next:"hyperlinks"},"","","string.link","","","string.link"]],[/^((?:(?:\.\.)(?:\s+))?)(__)(:)(\s+)(.*)/,[{token:"",next:"subsequentLines"},"","","","string.link"]],[/^(__\s+)(.+)/,["","string.link"]],[/^(\.\.)( \|)([^| ]+[^|]*[^| ]*)(\| )(@simpleRefName)(:: .*)/,[{token:"",next:"subsequentLines"},"","string.link","","keyword",""],"@rawBlocks"],[/(\|)([^| ]+[^|]*[^| ]*)(\|_{0,2})/,["","string.link",""]],[/^(\.\.)([ ].*)$/,[{token:"",next:"@comments"},"comment"]]],inlineMarkup:[{include:"@citationsReference"},{include:"@footnotesReference"},[/(@simpleRefName)(_{1,2})/,["string.link",""]],[/(`)([^<`]+\s+)(<)(.*)(>)(`)(_)/,["","string.link","","string.link","","",""]],[/\*\*([^\\*]|\*(?!\*))+\*\*/,"strong"],[/\*[^*]+\*/,"emphasis"],[/(``)((?:[^`]|\`(?!`))+)(``)/,["","keyword",""]],[/(__\s+)(.+)/,["","keyword"]],[/(:)((?:@simpleRefNameWithoutBq)?)(:`)([^`]+)(`)/,["","keyword","","",""]],[/(`)([^`]+)(`:)((?:@simpleRefNameWithoutBq)?)(:)/,["","","","keyword",""]],[/(`)([^`]+)(`)/,""],[/(_`)(@phrase)(`)/,["","string.link",""]]],citations:[[/^(\.\.\s+\[)((?:@citationName))(\]\s+)(.*)/,[{token:"",next:"@subsequentLines"},"string.link","",""]]],citationsReference:[[/(\[)(@citationName)(\]_)/,["","string.link",""]]],footnotes:[[/^(\.\.\s+\[)((?:[0-9]+))(\]\s+.*)/,[{token:"",next:"@subsequentLines"},"string.link",""]],[/^(\.\.\s+\[)((?:#@simpleRefName?))(\]\s+)(.*)/,[{token:"",next:"@subsequentLines"},"string.link","",""]],[/^(\.\.\s+\[)((?:\*))(\]\s+)(.*)/,[{token:"",next:"@subsequentLines"},"string.link","",""]]],footnotesReference:[[/(\[)([0-9]+)(\])(_)/,["","string.link","",""]],[/(\[)(#@simpleRefName?)(\])(_)/,["","string.link","",""]],[/(\[)(\*)(\])(_)/,["","string.link","",""]]],blankLineOfLiteralBlocks:[[/^$/,"","@subsequentLinesOfLiteralBlocks"],[/^.*$/,"","@pop"]],subsequentLinesOfLiteralBlocks:[[/(@blockLiteralStart+)(.*)/,["keyword",""]],[/^(?!blockLiteralStart)/,"","@popall"]],subsequentLines:[[/^[\s]+.*/,""],[/^(?!\s)/,"","@pop"]],hyperlinks:[[/^[\s]+.*/,"string.link"],[/^(?!\s)/,"","@pop"]],comments:[[/^[\s]+.*/,"comment"],[/^(?!\s)/,"","@pop"]],tables:[[/\+-[+-]+/,"keyword"],[/\+=[+=]+/,"keyword"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/restructuredtext/restructuredtext.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/restructuredtext/restructuredtext.js.gz new file mode 100644 index 0000000..23ef8f2 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/restructuredtext/restructuredtext.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ruby/ruby.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ruby/ruby.js new file mode 100644 index 0000000..1ed764a --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ruby/ruby.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/ruby/ruby",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"#",blockComment:["=begin","=end"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],indentationRules:{increaseIndentPattern:new RegExp("^\\s*((begin|class|(private|protected)\\s+def|def|else|elsif|ensure|for|if|module|rescue|unless|until|when|while|case)|([^#]*\\sdo\\b)|([^#]*=\\s*(case|if|unless)))\\b([^#\\{;]|(\"|'|/).*\\4)*(#.*)?$"),decreaseIndentPattern:new RegExp("^\\s*([}\\]]([,)]?\\s*(#|$)|\\.[a-zA-Z_]\\w*\\b)|(end|rescue|ensure|else|elsif|when)\\b)")}},t.language={tokenPostfix:".ruby",keywords:["__LINE__","__ENCODING__","__FILE__","BEGIN","END","alias","and","begin","break","case","class","def","defined?","do","else","elsif","end","ensure","for","false","if","in","module","next","nil","not","or","redo","rescue","retry","return","self","super","then","true","undef","unless","until","when","while","yield"],keywordops:["::","..","...","?",":","=>"],builtins:["require","public","private","include","extend","attr_reader","protected","private_class_method","protected_class_method","new"],declarations:["module","class","def","case","do","begin","for","if","while","until","unless"],linedecls:["def","case","do","begin","for","if","while","until","unless"],operators:["^","&","|","<=>","==","===","!~","=~",">",">=","<","<=","<<",">>","+","-","*","/","%","**","~","+@","-@","[]","[]=","`","+=","-=","*=","**=","/=","^=","%=","<<=",">>=","&=","&&=","||=","|="],brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],symbols:/[=>"}],[/%([qws])(@delim)/,{token:"string.$1.delim",switchTo:"@qstring.$1.$2.$2"}],[/%r\(/,{token:"regexp.delim",switchTo:"@pregexp.(.)"}],[/%r\[/,{token:"regexp.delim",switchTo:"@pregexp.[.]"}],[/%r\{/,{token:"regexp.delim",switchTo:"@pregexp.{.}"}],[/%r"}],[/%r(@delim)/,{token:"regexp.delim",switchTo:"@pregexp.$1.$1"}],[/%(x|W|Q?)\(/,{token:"string.$1.delim",switchTo:"@qqstring.$1.(.)"}],[/%(x|W|Q?)\[/,{token:"string.$1.delim",switchTo:"@qqstring.$1.[.]"}],[/%(x|W|Q?)\{/,{token:"string.$1.delim",switchTo:"@qqstring.$1.{.}"}],[/%(x|W|Q?)"}],[/%(x|W|Q?)(@delim)/,{token:"string.$1.delim",switchTo:"@qqstring.$1.$2.$2"}],[/%([rqwsxW]|Q?)./,{token:"invalid",next:"@pop"}],[/./,{token:"invalid",next:"@pop"}]],qstring:[[/\\$/,"string.$S2.escape"],[/\\./,"string.$S2.escape"],[/./,{cases:{"$#==$S4":{token:"string.$S2.delim",next:"@pop"},"$#==$S3":{token:"string.$S2.delim",next:"@push"},"@default":"string.$S2"}}]],qqstring:[[/#/,"string.$S2.escape","@interpolated"],{include:"@qstring"}],whitespace:[[/[ \t\r\n]+/,""],[/^\s*=begin\b/,"comment","@comment"],[/#.*$/,"comment"]],comment:[[/[^=]+/,"comment"],[/^\s*=begin\b/,"comment.invalid"],[/^\s*=end\b.*/,"comment","@pop"],[/[=]/,"comment"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ruby/ruby.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ruby/ruby.js.gz new file mode 100644 index 0000000..a5c4cc4 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/ruby/ruby.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/rust/rust.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/rust/rust.js new file mode 100644 index 0000000..c74e57a --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/rust/rust.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/rust/rust",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*#pragma\\s+region\\b"),end:new RegExp("^\\s*#pragma\\s+endregion\\b")}}},t.language={tokenPostfix:".rust",defaultToken:"invalid",keywords:["as","async","await","box","break","const","continue","crate","dyn","else","enum","extern","false","fn","for","if","impl","in","let","loop","match","mod","move","mut","pub","ref","return","self","static","struct","super","trait","true","try","type","unsafe","use","where","while","catch","default","union","static","abstract","alignof","become","do","final","macro","offsetof","override","priv","proc","pure","sizeof","typeof","unsized","virtual","yield"],typeKeywords:["Self","m32","m64","m128","f80","f16","f128","int","uint","float","char","bool","u8","u16","u32","u64","f32","f64","i8","i16","i32","i64","str","Option","Either","c_float","c_double","c_void","FILE","fpos_t","DIR","dirent","c_char","c_schar","c_uchar","c_short","c_ushort","c_int","c_uint","c_long","c_ulong","size_t","ptrdiff_t","clock_t","time_t","c_longlong","c_ulonglong","intptr_t","uintptr_t","off_t","dev_t","ino_t","pid_t","mode_t","ssize_t"],constants:["true","false","Some","None","Left","Right","Ok","Err"],supportConstants:["EXIT_FAILURE","EXIT_SUCCESS","RAND_MAX","EOF","SEEK_SET","SEEK_CUR","SEEK_END","_IOFBF","_IONBF","_IOLBF","BUFSIZ","FOPEN_MAX","FILENAME_MAX","L_tmpnam","TMP_MAX","O_RDONLY","O_WRONLY","O_RDWR","O_APPEND","O_CREAT","O_EXCL","O_TRUNC","S_IFIFO","S_IFCHR","S_IFBLK","S_IFDIR","S_IFREG","S_IFMT","S_IEXEC","S_IWRITE","S_IREAD","S_IRWXU","S_IXUSR","S_IWUSR","S_IRUSR","F_OK","R_OK","W_OK","X_OK","STDIN_FILENO","STDOUT_FILENO","STDERR_FILENO"],supportMacros:["format!","print!","println!","panic!","format_args!","unreachable!","write!","writeln!"],operators:["!","!=","%","%=","&","&=","&&","*","*=","+","+=","-","-=","->",".","..","...","/","/=",":",";","<<","<<=","<","<=","=","==","=>",">",">=",">>",">>=","@","^","^=","|","|=","||","_","?","#"],escapes:/\\([nrt0\"''\\]|x\h{2}|u\{\h{1,6}\})/,delimiters:/[,]/,symbols:/[\#\!\%\&\*\+\-\.\/\:\;\<\=\>\@\^\|_\?]+/,intSuffixes:/[iu](8|16|32|64|128|size)/,floatSuffixes:/f(32|64)/,tokenizer:{root:[[/[a-zA-Z][a-zA-Z0-9_]*!?|_[a-zA-Z0-9_]+/,{cases:{"@typeKeywords":"keyword.type","@keywords":"keyword","@supportConstants":"keyword","@supportMacros":"keyword","@constants":"keyword","@default":"identifier"}}],[/\$/,"identifier"],[/'[a-zA-Z_][a-zA-Z0-9_]*(?=[^\'])/,"identifier"],[/'\S'/,"string.byteliteral"],[/"/,{token:"string.quote",bracket:"@open",next:"@string"}],{include:"@numbers"},{include:"@whitespace"},[/@delimiters/,{cases:{"@keywords":"keyword","@default":"delimiter"}}],[/[{}()\[\]<>]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":""}}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",next:"@pop"}]],numbers:[[/(0o[0-7_]+)(@intSuffixes)?/,{token:"number"}],[/(0b[0-1_]+)(@intSuffixes)?/,{token:"number"}],[/[\d][\d_]*(\.[\d][\d_]*)?[eE][+-][\d_]+(@floatSuffixes)?/,{token:"number"}],[/\b(\d\.?[\d_]*)(@floatSuffixes)?\b/,{token:"number"}],[/(0x[\da-fA-F]+)_?(@intSuffixes)?/,{token:"number"}],[/[\d][\d_]*(@intSuffixes?)?/,{token:"number"}]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/rust/rust.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/rust/rust.js.gz new file mode 100644 index 0000000..8783fb3 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/rust/rust.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sb/sb.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sb/sb.js new file mode 100644 index 0000000..5e2241e --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sb/sb.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/sb/sb",["require","exports"],(function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.language=o.conf=void 0,o.conf={comments:{lineComment:"'"},brackets:[["(",")"],["[","]"],["If","EndIf"],["While","EndWhile"],["For","EndFor"],["Sub","EndSub"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]}]},o.language={defaultToken:"",tokenPostfix:".sb",ignoreCase:!0,brackets:[{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"keyword.tag-if",open:"If",close:"EndIf"},{token:"keyword.tag-while",open:"While",close:"EndWhile"},{token:"keyword.tag-for",open:"For",close:"EndFor"},{token:"keyword.tag-sub",open:"Sub",close:"EndSub"}],keywords:["Else","ElseIf","EndFor","EndIf","EndSub","EndWhile","For","Goto","If","Step","Sub","Then","To","While"],tagwords:["If","Sub","While","For"],operators:[">","<","<>","<=",">=","And","Or","+","-","*","/","="],identifier:/[a-zA-Z_][\w]*/,symbols:/[=><:+\-*\/%\.,]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},[/(@identifier)(?=[.])/,"type"],[/@identifier/,{cases:{"@keywords":{token:"keyword.$0"},"@operators":"operator","@default":"variable.name"}}],[/([.])(@identifier)/,{cases:{$2:["delimiter","type.member"],"@default":""}}],[/\d*\.\d+/,"number.float"],[/\d+/,"number"],[/[()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],whitespace:[[/[ \t\r\n]+/,""],[/(\').*$/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"C?/,"string","@pop"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sb/sb.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sb/sb.js.gz new file mode 100644 index 0000000..6e08cb5 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sb/sb.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scala/scala.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scala/scala.js new file mode 100644 index 0000000..b75d85f --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scala/scala.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/scala/scala",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(unary_[@~!#%^&*()\-=+\\|:<>\/?]+)|([a-zA-Z_$][\w$]*?_=)|(`[^`]+`)|([a-zA-Z_$][\w$]*)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}},t.language={tokenPostfix:".scala",keywords:["asInstanceOf","catch","class","classOf","def","do","else","extends","finally","for","foreach","forSome","if","import","isInstanceOf","macro","match","new","object","package","return","throw","trait","try","type","until","val","var","while","with","yield","given","enum","then"],softKeywords:["as","export","extension","end","derives","on"],constants:["true","false","null","this","super"],modifiers:["abstract","final","implicit","lazy","override","private","protected","sealed"],softModifiers:["inline","opaque","open","transparent","using"],name:/(?:[a-z_$][\w$]*|`[^`]+`)/,type:/(?:[A-Z][\w$]*)/,symbols:/[=>))/,["@brackets","white","variable"]],[/@name/,{cases:{"@keywords":"keyword","@softKeywords":"keyword","@modifiers":"keyword.modifier","@softModifiers":"keyword.modifier","@constants":{token:"constant",next:"@allowMethod"},"@default":{token:"identifier",next:"@allowMethod"}}}],[/@type/,"type","@allowMethod"],{include:"@whitespace"},[/@[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*)*/,"annotation"],[/[{(]/,"@brackets"],[/[})]/,"@brackets","@allowMethod"],[/\[/,"operator.square"],[/](?!\s*(?:va[rl]|def|type)\b)/,"operator.square","@allowMethod"],[/]/,"operator.square"],[/([=-]>|<-|>:|<:|:>|<%)(?=[\s\w()[\]{},\."'`])/,"keyword"],[/@symbols/,"operator"],[/[;,\.]/,"delimiter"],[/'[a-zA-Z$][\w$]*(?!')/,"attribute.name"],[/'[^\\']'/,"string","@allowMethod"],[/(')(@escapes)(')/,["string","string.escape",{token:"string",next:"@allowMethod"}]],[/'/,"string.invalid"]],import:[[/;/,"delimiter","@pop"],[/^|$/,"","@pop"],[/[ \t]+/,"white"],[/[\n\r]+/,"white","@pop"],[/\/\*/,"comment","@comment"],[/@name|@type/,"type"],[/[(){}]/,"@brackets"],[/[[\]]/,"operator.square"],[/[\.,]/,"delimiter"]],allowMethod:[[/^|$/,"","@pop"],[/[ \t]+/,"white"],[/[\n\r]+/,"white","@pop"],[/\/\*/,"comment","@comment"],[/(?==>[\s\w([{])/,"keyword","@pop"],[/(@name|@symbols)(?=[ \t]*[[({"'`]|[ \t]+(?:[+-]?\.?\d|\w))/,{cases:{"@keywords":{token:"keyword",next:"@pop"},"->|<-|>:|<:|<%":{token:"keyword",next:"@pop"},"@default":{token:"@rematch",next:"@pop"}}}],["","","@pop"]],comment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],case:[[/\b_\*/,"key"],[/\b(_|true|false|null|this|super)\b/,"keyword","@allowMethod"],[/\bif\b|=>/,"keyword","@pop"],[/`[^`]+`/,"identifier","@allowMethod"],[/@name/,"variable","@allowMethod"],[/:::?|\||@(?![a-z_$])/,"keyword"],{include:"@root"}],vardef:[[/\b_\*/,"key"],[/\b(_|true|false|null|this|super)\b/,"keyword"],[/@name/,"variable"],[/:::?|\||@(?![a-z_$])/,"keyword"],[/=|:(?!:)/,"operator","@pop"],[/$/,"white","@pop"],{include:"@root"}],string:[[/[^\\"\n\r]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}]],stringt:[[/[^\\"\n\r]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/"/,"string"]],fstring:[[/@escapes/,"string.escape"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/%%/,"string"],[/(%)([\-#+ 0,(])(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","keyword.modifier","number","metatag"]],[/(%)(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","number","metatag"]],[/(%)([\-#+ 0,(])(@fstring_conv)/,["metatag","keyword.modifier","metatag"]],[/(%)(@fstring_conv)/,["metatag","metatag"]],[/./,"string"]],fstringt:[[/@escapes/,"string.escape"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/%%/,"string"],[/(%)([\-#+ 0,(])(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","keyword.modifier","number","metatag"]],[/(%)(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,["metatag","number","metatag"]],[/(%)([\-#+ 0,(])(@fstring_conv)/,["metatag","keyword.modifier","metatag"]],[/(%)(@fstring_conv)/,["metatag","metatag"]],[/./,"string"]],sstring:[[/@escapes/,"string.escape"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/./,"string"]],sstringt:[[/@escapes/,"string.escape"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/\$\$/,"string"],[/(\$)([a-z_]\w*)/,["operator","identifier"]],[/\$\{/,"operator","@interp"],[/./,"string"]],interp:[[/{/,"operator","@push"],[/}/,"operator","@pop"],{include:"@root"}],rawstring:[[/[^"]/,"string"],[/"/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}]],rawstringt:[[/[^"]/,"string"],[/"(?=""")/,"string"],[/"""/,{token:"string.quote",bracket:"@close",switchTo:"@allowMethod"}],[/"/,"string"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scala/scala.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scala/scala.js.gz new file mode 100644 index 0000000..4e462d6 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scala/scala.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scheme/scheme.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scheme/scheme.js new file mode 100644 index 0000000..c93fe95 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scheme/scheme.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/scheme/scheme",["require","exports"],(function(e,o){"use strict";Object.defineProperty(o,"__esModule",{value:!0}),o.language=o.conf=void 0,o.conf={comments:{lineComment:";",blockComment:["#|","|#"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},o.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".scheme",brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],keywords:["case","do","let","loop","if","else","when","cons","car","cdr","cond","lambda","lambda*","syntax-rules","format","set!","quote","eval","append","list","list?","member?","load"],constants:["#t","#f"],operators:["eq?","eqv?","equal?","and","or","not","null?"],tokenizer:{root:[[/#[xXoObB][0-9a-fA-F]+/,"number.hex"],[/[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?/,"number.float"],[/(?:\b(?:(define|define-syntax|define-macro))\b)(\s+)((?:\w|\-|\!|\?)*)/,["keyword","white","variable"]],{include:"@whitespace"},{include:"@strings"},[/[a-zA-Z_#][a-zA-Z0-9_\-\?\!\*]*/,{cases:{"@keywords":"keyword","@constants":"constant","@operators":"operators","@default":"identifier"}}]],comment:[[/[^\|#]+/,"comment"],[/#\|/,"comment","@push"],[/\|#/,"comment","@pop"],[/[\|#]/,"comment"]],whitespace:[[/[ \t\r\n]+/,"white"],[/#\|/,"comment","@comment"],[/;.*$/,"comment"]],strings:[[/"$/,"string","@popall"],[/"(?=.)/,"string","@multiLineString"]],multiLineString:[[/[^\\"]+$/,"string","@popall"],[/[^\\"]+/,"string"],[/\\./,"string.escape"],[/"/,"string","@popall"],[/\\$/,"string"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scheme/scheme.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scheme/scheme.js.gz new file mode 100644 index 0000000..26710b3 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scheme/scheme.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scss/scss.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scss/scss.js new file mode 100644 index 0000000..b8e8a5a --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scss/scss.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/scss/scss",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(#?-?\d*\.\d\w*%?)|([@$#!.:]?[\w-?]+%?)|[@#!.]/g,comments:{blockComment:["/*","*/"],lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/"),end:new RegExp("^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/")}}},t.language={defaultToken:"",tokenPostfix:".scss",ws:"[ \t\n\r\f]*",identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@selector"}],selector:[{include:"@comments"},{include:"@import"},{include:"@variabledeclaration"},{include:"@warndebug"},["[@](include)",{token:"keyword",next:"@includedeclaration"}],["[@](keyframes|-webkit-keyframes|-moz-keyframes|-o-keyframes)",{token:"keyword",next:"@keyframedeclaration"}],["[@](page|content|font-face|-moz-document)",{token:"keyword"}],["[@](charset|namespace)",{token:"keyword",next:"@declarationbody"}],["[@](function)",{token:"keyword",next:"@functiondeclaration"}],["[@](mixin)",{token:"keyword",next:"@mixindeclaration"}],["url(\\-prefix)?\\(",{token:"meta",next:"@urldeclaration"}],{include:"@controlstatement"},{include:"@selectorname"},["[&\\*]","tag"],["[>\\+,]","delimiter"],["\\[",{token:"delimiter.bracket",next:"@selectorattribute"}],["{",{token:"delimiter.curly",next:"@selectorbody"}]],selectorbody:[["[*_]?@identifier@ws:(?=(\\s|\\d|[^{;}]*[;}]))","attribute.name","@rulevalue"],{include:"@selector"},["[@](extend)",{token:"keyword",next:"@extendbody"}],["[@](return)",{token:"keyword",next:"@declarationbody"}],["}",{token:"delimiter.curly",next:"@pop"}]],selectorname:[["#{",{token:"meta",next:"@variableinterpolation"}],["(\\.|#(?=[^{])|%|(@identifier)|:)+","tag"]],selectorattribute:[{include:"@term"},["]",{token:"delimiter.bracket",next:"@pop"}]],term:[{include:"@comments"},["url(\\-prefix)?\\(",{token:"meta",next:"@urldeclaration"}],{include:"@functioninvocation"},{include:"@numbers"},{include:"@strings"},{include:"@variablereference"},["(and\\b|or\\b|not\\b)","operator"],{include:"@name"},["([<>=\\+\\-\\*\\/\\^\\|\\~,])","operator"],[",","delimiter"],["!default","literal"],["\\(",{token:"delimiter.parenthesis",next:"@parenthizedterm"}]],rulevalue:[{include:"@term"},["!important","literal"],[";","delimiter","@pop"],["{",{token:"delimiter.curly",switchTo:"@nestedproperty"}],["(?=})",{token:"",next:"@pop"}]],nestedproperty:[["[*_]?@identifier@ws:","attribute.name","@rulevalue"],{include:"@comments"},["}",{token:"delimiter.curly",next:"@pop"}]],warndebug:[["[@](warn|debug)",{token:"keyword",next:"@declarationbody"}]],import:[["[@](import)",{token:"keyword",next:"@declarationbody"}]],variabledeclaration:[["\\$@identifier@ws:","variable.decl","@declarationbody"]],urldeclaration:[{include:"@strings"},["[^)\r\n]+","string"],["\\)",{token:"meta",next:"@pop"}]],parenthizedterm:[{include:"@term"},["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],declarationbody:[{include:"@term"},[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],extendbody:[{include:"@selectorname"},["!optional","literal"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],variablereference:[["\\$@identifier","variable.ref"],["\\.\\.\\.","operator"],["#{",{token:"meta",next:"@variableinterpolation"}]],variableinterpolation:[{include:"@variablereference"},["}",{token:"meta",next:"@pop"}]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[".","comment"]],name:[["@identifier","attribute.value"]],numbers:[["(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","number.hex"]],units:[["(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","number","@pop"]],functiondeclaration:[["@identifier@ws\\(",{token:"meta",next:"@parameterdeclaration"}],["{",{token:"delimiter.curly",switchTo:"@functionbody"}]],mixindeclaration:[["@identifier@ws\\(",{token:"meta",next:"@parameterdeclaration"}],["@identifier","meta"],["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],parameterdeclaration:[["\\$@identifier@ws:","variable.decl"],["\\.\\.\\.","operator"],[",","delimiter"],{include:"@term"},["\\)",{token:"meta",next:"@pop"}]],includedeclaration:[{include:"@functioninvocation"},["@identifier","meta"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}],["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],keyframedeclaration:[["@identifier","meta"],["{",{token:"delimiter.curly",switchTo:"@keyframebody"}]],keyframebody:[{include:"@term"},["{",{token:"delimiter.curly",next:"@selectorbody"}],["}",{token:"delimiter.curly",next:"@pop"}]],controlstatement:[["[@](if|else|for|while|each|media)",{token:"keyword.flow",next:"@controlstatementdeclaration"}]],controlstatementdeclaration:[["(in|from|through|if|to)\\b",{token:"keyword.flow"}],{include:"@term"},["{",{token:"delimiter.curly",switchTo:"@selectorbody"}]],functionbody:[["[@](return)",{token:"keyword"}],{include:"@variabledeclaration"},{include:"@term"},{include:"@controlstatement"},[";","delimiter"],["}",{token:"delimiter.curly",next:"@pop"}]],functioninvocation:[["@identifier\\(",{token:"meta",next:"@functionarguments"}]],functionarguments:[["\\$@identifier@ws:","attribute.name"],["[,]","delimiter"],{include:"@term"},["\\)",{token:"meta",next:"@pop"}]],strings:[['~?"',{token:"string.delimiter",next:"@stringenddoublequote"}],["~?'",{token:"string.delimiter",next:"@stringendquote"}]],stringenddoublequote:[["\\\\.","string"],['"',{token:"string.delimiter",next:"@pop"}],[".","string"]],stringendquote:[["\\\\.","string"],["'",{token:"string.delimiter",next:"@pop"}],[".","string"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scss/scss.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scss/scss.js.gz new file mode 100644 index 0000000..5ad5390 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/scss/scss.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/shell/shell.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/shell/shell.js new file mode 100644 index 0000000..84f7362 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/shell/shell.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/shell/shell",["require","exports"],(function(e,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.language=r.conf=void 0,r.conf={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}]},r.language={defaultToken:"",ignoreCase:!0,tokenPostfix:".shell",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["if","then","do","else","elif","while","until","for","in","esac","fi","fin","fil","done","exit","set","unset","export","function"],builtins:["ab","awk","bash","beep","cat","cc","cd","chown","chmod","chroot","clear","cp","curl","cut","diff","echo","find","gawk","gcc","get","git","grep","hg","kill","killall","ln","ls","make","mkdir","openssl","mv","nc","node","npm","ping","ps","restart","rm","rmdir","sed","service","sh","shopt","shred","source","sort","sleep","ssh","start","stop","su","sudo","svn","tee","telnet","top","touch","vi","vim","wall","wc","wget","who","write","yes","zsh"],symbols:/[=>"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},e.language={defaultToken:"",tokenPostfix:".sol",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["pragma","solidity","contract","library","using","struct","function","modifier","constructor","address","string","bool","Int","Uint","Byte","Fixed","Ufixed","int","int8","int16","int24","int32","int40","int48","int56","int64","int72","int80","int88","int96","int104","int112","int120","int128","int136","int144","int152","int160","int168","int176","int184","int192","int200","int208","int216","int224","int232","int240","int248","int256","uint","uint8","uint16","uint24","uint32","uint40","uint48","uint56","uint64","uint72","uint80","uint88","uint96","uint104","uint112","uint120","uint128","uint136","uint144","uint152","uint160","uint168","uint176","uint184","uint192","uint200","uint208","uint216","uint224","uint232","uint240","uint248","uint256","byte","bytes","bytes1","bytes2","bytes3","bytes4","bytes5","bytes6","bytes7","bytes8","bytes9","bytes10","bytes11","bytes12","bytes13","bytes14","bytes15","bytes16","bytes17","bytes18","bytes19","bytes20","bytes21","bytes22","bytes23","bytes24","bytes25","bytes26","bytes27","bytes28","bytes29","bytes30","bytes31","bytes32","fixed","fixed0x8","fixed0x16","fixed0x24","fixed0x32","fixed0x40","fixed0x48","fixed0x56","fixed0x64","fixed0x72","fixed0x80","fixed0x88","fixed0x96","fixed0x104","fixed0x112","fixed0x120","fixed0x128","fixed0x136","fixed0x144","fixed0x152","fixed0x160","fixed0x168","fixed0x176","fixed0x184","fixed0x192","fixed0x200","fixed0x208","fixed0x216","fixed0x224","fixed0x232","fixed0x240","fixed0x248","fixed0x256","fixed8x8","fixed8x16","fixed8x24","fixed8x32","fixed8x40","fixed8x48","fixed8x56","fixed8x64","fixed8x72","fixed8x80","fixed8x88","fixed8x96","fixed8x104","fixed8x112","fixed8x120","fixed8x128","fixed8x136","fixed8x144","fixed8x152","fixed8x160","fixed8x168","fixed8x176","fixed8x184","fixed8x192","fixed8x200","fixed8x208","fixed8x216","fixed8x224","fixed8x232","fixed8x240","fixed8x248","fixed16x8","fixed16x16","fixed16x24","fixed16x32","fixed16x40","fixed16x48","fixed16x56","fixed16x64","fixed16x72","fixed16x80","fixed16x88","fixed16x96","fixed16x104","fixed16x112","fixed16x120","fixed16x128","fixed16x136","fixed16x144","fixed16x152","fixed16x160","fixed16x168","fixed16x176","fixed16x184","fixed16x192","fixed16x200","fixed16x208","fixed16x216","fixed16x224","fixed16x232","fixed16x240","fixed24x8","fixed24x16","fixed24x24","fixed24x32","fixed24x40","fixed24x48","fixed24x56","fixed24x64","fixed24x72","fixed24x80","fixed24x88","fixed24x96","fixed24x104","fixed24x112","fixed24x120","fixed24x128","fixed24x136","fixed24x144","fixed24x152","fixed24x160","fixed24x168","fixed24x176","fixed24x184","fixed24x192","fixed24x200","fixed24x208","fixed24x216","fixed24x224","fixed24x232","fixed32x8","fixed32x16","fixed32x24","fixed32x32","fixed32x40","fixed32x48","fixed32x56","fixed32x64","fixed32x72","fixed32x80","fixed32x88","fixed32x96","fixed32x104","fixed32x112","fixed32x120","fixed32x128","fixed32x136","fixed32x144","fixed32x152","fixed32x160","fixed32x168","fixed32x176","fixed32x184","fixed32x192","fixed32x200","fixed32x208","fixed32x216","fixed32x224","fixed40x8","fixed40x16","fixed40x24","fixed40x32","fixed40x40","fixed40x48","fixed40x56","fixed40x64","fixed40x72","fixed40x80","fixed40x88","fixed40x96","fixed40x104","fixed40x112","fixed40x120","fixed40x128","fixed40x136","fixed40x144","fixed40x152","fixed40x160","fixed40x168","fixed40x176","fixed40x184","fixed40x192","fixed40x200","fixed40x208","fixed40x216","fixed48x8","fixed48x16","fixed48x24","fixed48x32","fixed48x40","fixed48x48","fixed48x56","fixed48x64","fixed48x72","fixed48x80","fixed48x88","fixed48x96","fixed48x104","fixed48x112","fixed48x120","fixed48x128","fixed48x136","fixed48x144","fixed48x152","fixed48x160","fixed48x168","fixed48x176","fixed48x184","fixed48x192","fixed48x200","fixed48x208","fixed56x8","fixed56x16","fixed56x24","fixed56x32","fixed56x40","fixed56x48","fixed56x56","fixed56x64","fixed56x72","fixed56x80","fixed56x88","fixed56x96","fixed56x104","fixed56x112","fixed56x120","fixed56x128","fixed56x136","fixed56x144","fixed56x152","fixed56x160","fixed56x168","fixed56x176","fixed56x184","fixed56x192","fixed56x200","fixed64x8","fixed64x16","fixed64x24","fixed64x32","fixed64x40","fixed64x48","fixed64x56","fixed64x64","fixed64x72","fixed64x80","fixed64x88","fixed64x96","fixed64x104","fixed64x112","fixed64x120","fixed64x128","fixed64x136","fixed64x144","fixed64x152","fixed64x160","fixed64x168","fixed64x176","fixed64x184","fixed64x192","fixed72x8","fixed72x16","fixed72x24","fixed72x32","fixed72x40","fixed72x48","fixed72x56","fixed72x64","fixed72x72","fixed72x80","fixed72x88","fixed72x96","fixed72x104","fixed72x112","fixed72x120","fixed72x128","fixed72x136","fixed72x144","fixed72x152","fixed72x160","fixed72x168","fixed72x176","fixed72x184","fixed80x8","fixed80x16","fixed80x24","fixed80x32","fixed80x40","fixed80x48","fixed80x56","fixed80x64","fixed80x72","fixed80x80","fixed80x88","fixed80x96","fixed80x104","fixed80x112","fixed80x120","fixed80x128","fixed80x136","fixed80x144","fixed80x152","fixed80x160","fixed80x168","fixed80x176","fixed88x8","fixed88x16","fixed88x24","fixed88x32","fixed88x40","fixed88x48","fixed88x56","fixed88x64","fixed88x72","fixed88x80","fixed88x88","fixed88x96","fixed88x104","fixed88x112","fixed88x120","fixed88x128","fixed88x136","fixed88x144","fixed88x152","fixed88x160","fixed88x168","fixed96x8","fixed96x16","fixed96x24","fixed96x32","fixed96x40","fixed96x48","fixed96x56","fixed96x64","fixed96x72","fixed96x80","fixed96x88","fixed96x96","fixed96x104","fixed96x112","fixed96x120","fixed96x128","fixed96x136","fixed96x144","fixed96x152","fixed96x160","fixed104x8","fixed104x16","fixed104x24","fixed104x32","fixed104x40","fixed104x48","fixed104x56","fixed104x64","fixed104x72","fixed104x80","fixed104x88","fixed104x96","fixed104x104","fixed104x112","fixed104x120","fixed104x128","fixed104x136","fixed104x144","fixed104x152","fixed112x8","fixed112x16","fixed112x24","fixed112x32","fixed112x40","fixed112x48","fixed112x56","fixed112x64","fixed112x72","fixed112x80","fixed112x88","fixed112x96","fixed112x104","fixed112x112","fixed112x120","fixed112x128","fixed112x136","fixed112x144","fixed120x8","fixed120x16","fixed120x24","fixed120x32","fixed120x40","fixed120x48","fixed120x56","fixed120x64","fixed120x72","fixed120x80","fixed120x88","fixed120x96","fixed120x104","fixed120x112","fixed120x120","fixed120x128","fixed120x136","fixed128x8","fixed128x16","fixed128x24","fixed128x32","fixed128x40","fixed128x48","fixed128x56","fixed128x64","fixed128x72","fixed128x80","fixed128x88","fixed128x96","fixed128x104","fixed128x112","fixed128x120","fixed128x128","fixed136x8","fixed136x16","fixed136x24","fixed136x32","fixed136x40","fixed136x48","fixed136x56","fixed136x64","fixed136x72","fixed136x80","fixed136x88","fixed136x96","fixed136x104","fixed136x112","fixed136x120","fixed144x8","fixed144x16","fixed144x24","fixed144x32","fixed144x40","fixed144x48","fixed144x56","fixed144x64","fixed144x72","fixed144x80","fixed144x88","fixed144x96","fixed144x104","fixed144x112","fixed152x8","fixed152x16","fixed152x24","fixed152x32","fixed152x40","fixed152x48","fixed152x56","fixed152x64","fixed152x72","fixed152x80","fixed152x88","fixed152x96","fixed152x104","fixed160x8","fixed160x16","fixed160x24","fixed160x32","fixed160x40","fixed160x48","fixed160x56","fixed160x64","fixed160x72","fixed160x80","fixed160x88","fixed160x96","fixed168x8","fixed168x16","fixed168x24","fixed168x32","fixed168x40","fixed168x48","fixed168x56","fixed168x64","fixed168x72","fixed168x80","fixed168x88","fixed176x8","fixed176x16","fixed176x24","fixed176x32","fixed176x40","fixed176x48","fixed176x56","fixed176x64","fixed176x72","fixed176x80","fixed184x8","fixed184x16","fixed184x24","fixed184x32","fixed184x40","fixed184x48","fixed184x56","fixed184x64","fixed184x72","fixed192x8","fixed192x16","fixed192x24","fixed192x32","fixed192x40","fixed192x48","fixed192x56","fixed192x64","fixed200x8","fixed200x16","fixed200x24","fixed200x32","fixed200x40","fixed200x48","fixed200x56","fixed208x8","fixed208x16","fixed208x24","fixed208x32","fixed208x40","fixed208x48","fixed216x8","fixed216x16","fixed216x24","fixed216x32","fixed216x40","fixed224x8","fixed224x16","fixed224x24","fixed224x32","fixed232x8","fixed232x16","fixed232x24","fixed240x8","fixed240x16","fixed248x8","ufixed","ufixed0x8","ufixed0x16","ufixed0x24","ufixed0x32","ufixed0x40","ufixed0x48","ufixed0x56","ufixed0x64","ufixed0x72","ufixed0x80","ufixed0x88","ufixed0x96","ufixed0x104","ufixed0x112","ufixed0x120","ufixed0x128","ufixed0x136","ufixed0x144","ufixed0x152","ufixed0x160","ufixed0x168","ufixed0x176","ufixed0x184","ufixed0x192","ufixed0x200","ufixed0x208","ufixed0x216","ufixed0x224","ufixed0x232","ufixed0x240","ufixed0x248","ufixed0x256","ufixed8x8","ufixed8x16","ufixed8x24","ufixed8x32","ufixed8x40","ufixed8x48","ufixed8x56","ufixed8x64","ufixed8x72","ufixed8x80","ufixed8x88","ufixed8x96","ufixed8x104","ufixed8x112","ufixed8x120","ufixed8x128","ufixed8x136","ufixed8x144","ufixed8x152","ufixed8x160","ufixed8x168","ufixed8x176","ufixed8x184","ufixed8x192","ufixed8x200","ufixed8x208","ufixed8x216","ufixed8x224","ufixed8x232","ufixed8x240","ufixed8x248","ufixed16x8","ufixed16x16","ufixed16x24","ufixed16x32","ufixed16x40","ufixed16x48","ufixed16x56","ufixed16x64","ufixed16x72","ufixed16x80","ufixed16x88","ufixed16x96","ufixed16x104","ufixed16x112","ufixed16x120","ufixed16x128","ufixed16x136","ufixed16x144","ufixed16x152","ufixed16x160","ufixed16x168","ufixed16x176","ufixed16x184","ufixed16x192","ufixed16x200","ufixed16x208","ufixed16x216","ufixed16x224","ufixed16x232","ufixed16x240","ufixed24x8","ufixed24x16","ufixed24x24","ufixed24x32","ufixed24x40","ufixed24x48","ufixed24x56","ufixed24x64","ufixed24x72","ufixed24x80","ufixed24x88","ufixed24x96","ufixed24x104","ufixed24x112","ufixed24x120","ufixed24x128","ufixed24x136","ufixed24x144","ufixed24x152","ufixed24x160","ufixed24x168","ufixed24x176","ufixed24x184","ufixed24x192","ufixed24x200","ufixed24x208","ufixed24x216","ufixed24x224","ufixed24x232","ufixed32x8","ufixed32x16","ufixed32x24","ufixed32x32","ufixed32x40","ufixed32x48","ufixed32x56","ufixed32x64","ufixed32x72","ufixed32x80","ufixed32x88","ufixed32x96","ufixed32x104","ufixed32x112","ufixed32x120","ufixed32x128","ufixed32x136","ufixed32x144","ufixed32x152","ufixed32x160","ufixed32x168","ufixed32x176","ufixed32x184","ufixed32x192","ufixed32x200","ufixed32x208","ufixed32x216","ufixed32x224","ufixed40x8","ufixed40x16","ufixed40x24","ufixed40x32","ufixed40x40","ufixed40x48","ufixed40x56","ufixed40x64","ufixed40x72","ufixed40x80","ufixed40x88","ufixed40x96","ufixed40x104","ufixed40x112","ufixed40x120","ufixed40x128","ufixed40x136","ufixed40x144","ufixed40x152","ufixed40x160","ufixed40x168","ufixed40x176","ufixed40x184","ufixed40x192","ufixed40x200","ufixed40x208","ufixed40x216","ufixed48x8","ufixed48x16","ufixed48x24","ufixed48x32","ufixed48x40","ufixed48x48","ufixed48x56","ufixed48x64","ufixed48x72","ufixed48x80","ufixed48x88","ufixed48x96","ufixed48x104","ufixed48x112","ufixed48x120","ufixed48x128","ufixed48x136","ufixed48x144","ufixed48x152","ufixed48x160","ufixed48x168","ufixed48x176","ufixed48x184","ufixed48x192","ufixed48x200","ufixed48x208","ufixed56x8","ufixed56x16","ufixed56x24","ufixed56x32","ufixed56x40","ufixed56x48","ufixed56x56","ufixed56x64","ufixed56x72","ufixed56x80","ufixed56x88","ufixed56x96","ufixed56x104","ufixed56x112","ufixed56x120","ufixed56x128","ufixed56x136","ufixed56x144","ufixed56x152","ufixed56x160","ufixed56x168","ufixed56x176","ufixed56x184","ufixed56x192","ufixed56x200","ufixed64x8","ufixed64x16","ufixed64x24","ufixed64x32","ufixed64x40","ufixed64x48","ufixed64x56","ufixed64x64","ufixed64x72","ufixed64x80","ufixed64x88","ufixed64x96","ufixed64x104","ufixed64x112","ufixed64x120","ufixed64x128","ufixed64x136","ufixed64x144","ufixed64x152","ufixed64x160","ufixed64x168","ufixed64x176","ufixed64x184","ufixed64x192","ufixed72x8","ufixed72x16","ufixed72x24","ufixed72x32","ufixed72x40","ufixed72x48","ufixed72x56","ufixed72x64","ufixed72x72","ufixed72x80","ufixed72x88","ufixed72x96","ufixed72x104","ufixed72x112","ufixed72x120","ufixed72x128","ufixed72x136","ufixed72x144","ufixed72x152","ufixed72x160","ufixed72x168","ufixed72x176","ufixed72x184","ufixed80x8","ufixed80x16","ufixed80x24","ufixed80x32","ufixed80x40","ufixed80x48","ufixed80x56","ufixed80x64","ufixed80x72","ufixed80x80","ufixed80x88","ufixed80x96","ufixed80x104","ufixed80x112","ufixed80x120","ufixed80x128","ufixed80x136","ufixed80x144","ufixed80x152","ufixed80x160","ufixed80x168","ufixed80x176","ufixed88x8","ufixed88x16","ufixed88x24","ufixed88x32","ufixed88x40","ufixed88x48","ufixed88x56","ufixed88x64","ufixed88x72","ufixed88x80","ufixed88x88","ufixed88x96","ufixed88x104","ufixed88x112","ufixed88x120","ufixed88x128","ufixed88x136","ufixed88x144","ufixed88x152","ufixed88x160","ufixed88x168","ufixed96x8","ufixed96x16","ufixed96x24","ufixed96x32","ufixed96x40","ufixed96x48","ufixed96x56","ufixed96x64","ufixed96x72","ufixed96x80","ufixed96x88","ufixed96x96","ufixed96x104","ufixed96x112","ufixed96x120","ufixed96x128","ufixed96x136","ufixed96x144","ufixed96x152","ufixed96x160","ufixed104x8","ufixed104x16","ufixed104x24","ufixed104x32","ufixed104x40","ufixed104x48","ufixed104x56","ufixed104x64","ufixed104x72","ufixed104x80","ufixed104x88","ufixed104x96","ufixed104x104","ufixed104x112","ufixed104x120","ufixed104x128","ufixed104x136","ufixed104x144","ufixed104x152","ufixed112x8","ufixed112x16","ufixed112x24","ufixed112x32","ufixed112x40","ufixed112x48","ufixed112x56","ufixed112x64","ufixed112x72","ufixed112x80","ufixed112x88","ufixed112x96","ufixed112x104","ufixed112x112","ufixed112x120","ufixed112x128","ufixed112x136","ufixed112x144","ufixed120x8","ufixed120x16","ufixed120x24","ufixed120x32","ufixed120x40","ufixed120x48","ufixed120x56","ufixed120x64","ufixed120x72","ufixed120x80","ufixed120x88","ufixed120x96","ufixed120x104","ufixed120x112","ufixed120x120","ufixed120x128","ufixed120x136","ufixed128x8","ufixed128x16","ufixed128x24","ufixed128x32","ufixed128x40","ufixed128x48","ufixed128x56","ufixed128x64","ufixed128x72","ufixed128x80","ufixed128x88","ufixed128x96","ufixed128x104","ufixed128x112","ufixed128x120","ufixed128x128","ufixed136x8","ufixed136x16","ufixed136x24","ufixed136x32","ufixed136x40","ufixed136x48","ufixed136x56","ufixed136x64","ufixed136x72","ufixed136x80","ufixed136x88","ufixed136x96","ufixed136x104","ufixed136x112","ufixed136x120","ufixed144x8","ufixed144x16","ufixed144x24","ufixed144x32","ufixed144x40","ufixed144x48","ufixed144x56","ufixed144x64","ufixed144x72","ufixed144x80","ufixed144x88","ufixed144x96","ufixed144x104","ufixed144x112","ufixed152x8","ufixed152x16","ufixed152x24","ufixed152x32","ufixed152x40","ufixed152x48","ufixed152x56","ufixed152x64","ufixed152x72","ufixed152x80","ufixed152x88","ufixed152x96","ufixed152x104","ufixed160x8","ufixed160x16","ufixed160x24","ufixed160x32","ufixed160x40","ufixed160x48","ufixed160x56","ufixed160x64","ufixed160x72","ufixed160x80","ufixed160x88","ufixed160x96","ufixed168x8","ufixed168x16","ufixed168x24","ufixed168x32","ufixed168x40","ufixed168x48","ufixed168x56","ufixed168x64","ufixed168x72","ufixed168x80","ufixed168x88","ufixed176x8","ufixed176x16","ufixed176x24","ufixed176x32","ufixed176x40","ufixed176x48","ufixed176x56","ufixed176x64","ufixed176x72","ufixed176x80","ufixed184x8","ufixed184x16","ufixed184x24","ufixed184x32","ufixed184x40","ufixed184x48","ufixed184x56","ufixed184x64","ufixed184x72","ufixed192x8","ufixed192x16","ufixed192x24","ufixed192x32","ufixed192x40","ufixed192x48","ufixed192x56","ufixed192x64","ufixed200x8","ufixed200x16","ufixed200x24","ufixed200x32","ufixed200x40","ufixed200x48","ufixed200x56","ufixed208x8","ufixed208x16","ufixed208x24","ufixed208x32","ufixed208x40","ufixed208x48","ufixed216x8","ufixed216x16","ufixed216x24","ufixed216x32","ufixed216x40","ufixed224x8","ufixed224x16","ufixed224x24","ufixed224x32","ufixed232x8","ufixed232x16","ufixed232x24","ufixed240x8","ufixed240x16","ufixed248x8","event","enum","let","mapping","private","public","external","inherited","payable","true","false","var","import","constant","if","else","for","else","for","while","do","break","continue","throw","returns","return","suicide","new","is","this","super"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/solidity/solidity.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/solidity/solidity.js.gz new file mode 100644 index 0000000..8de804d Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/solidity/solidity.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sophia/sophia.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sophia/sophia.js new file mode 100644 index 0000000..1518e61 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sophia/sophia.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/sophia/sophia",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},t.language={defaultToken:"",tokenPostfix:".aes",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["contract","library","entrypoint","function","stateful","state","hash","signature","tuple","list","address","string","bool","int","record","datatype","type","option","oracle","oracle_query","Call","Bits","Bytes","Oracle","String","Crypto","Address","Auth","Chain","None","Some","bits","bytes","event","let","map","private","public","true","false","var","if","else","throw"],operators:["=",">","<","!","~","?","::",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sophia/sophia.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sophia/sophia.js.gz new file mode 100644 index 0000000..7ed297d Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sophia/sophia.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sql/sql.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sql/sql.js new file mode 100644 index 0000000..06ccffc --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sql/sql.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/sql/sql",["require","exports"],(function(E,T){"use strict";Object.defineProperty(T,"__esModule",{value:!0}),T.language=T.conf=void 0,T.conf={comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},T.language={defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["ABORT_AFTER_WAIT","ABSENT","ABSOLUTE","ACCENT_SENSITIVITY","ACTION","ACTIVATION","ACTIVE","ADD","ADDRESS","ADMIN","AES","AES_128","AES_192","AES_256","AFFINITY","AFTER","AGGREGATE","ALGORITHM","ALL_CONSTRAINTS","ALL_ERRORMSGS","ALL_INDEXES","ALL_LEVELS","ALL_SPARSE_COLUMNS","ALLOW_CONNECTIONS","ALLOW_MULTIPLE_EVENT_LOSS","ALLOW_PAGE_LOCKS","ALLOW_ROW_LOCKS","ALLOW_SINGLE_EVENT_LOSS","ALLOW_SNAPSHOT_ISOLATION","ALLOWED","ALTER","ANONYMOUS","ANSI_DEFAULTS","ANSI_NULL_DEFAULT","ANSI_NULL_DFLT_OFF","ANSI_NULL_DFLT_ON","ANSI_NULLS","ANSI_PADDING","ANSI_WARNINGS","APPEND","APPLICATION","APPLICATION_LOG","ARITHABORT","ARITHIGNORE","AS","ASC","ASSEMBLY","ASYMMETRIC","ASYNCHRONOUS_COMMIT","AT","ATOMIC","ATTACH","ATTACH_REBUILD_LOG","AUDIT","AUDIT_GUID","AUTHENTICATION","AUTHORIZATION","AUTO","AUTO_CLEANUP","AUTO_CLOSE","AUTO_CREATE_STATISTICS","AUTO_SHRINK","AUTO_UPDATE_STATISTICS","AUTO_UPDATE_STATISTICS_ASYNC","AUTOMATED_BACKUP_PREFERENCE","AUTOMATIC","AVAILABILITY","AVAILABILITY_MODE","BACKUP","BACKUP_PRIORITY","BASE64","BATCHSIZE","BEGIN","BEGIN_DIALOG","BIGINT","BINARY","BINDING","BIT","BLOCKERS","BLOCKSIZE","BOUNDING_BOX","BREAK","BROKER","BROKER_INSTANCE","BROWSE","BUCKET_COUNT","BUFFER","BUFFERCOUNT","BULK","BULK_LOGGED","BY","CACHE","CALL","CALLED","CALLER","CAP_CPU_PERCENT","CASCADE","CASE","CATALOG","CATCH","CELLS_PER_OBJECT","CERTIFICATE","CHANGE_RETENTION","CHANGE_TRACKING","CHANGES","CHAR","CHARACTER","CHECK","CHECK_CONSTRAINTS","CHECK_EXPIRATION","CHECK_POLICY","CHECKALLOC","CHECKCATALOG","CHECKCONSTRAINTS","CHECKDB","CHECKFILEGROUP","CHECKIDENT","CHECKPOINT","CHECKTABLE","CLASSIFIER_FUNCTION","CLEANTABLE","CLEANUP","CLEAR","CLOSE","CLUSTER","CLUSTERED","CODEPAGE","COLLATE","COLLECTION","COLUMN","COLUMN_SET","COLUMNS","COLUMNSTORE","COLUMNSTORE_ARCHIVE","COMMIT","COMMITTED","COMPATIBILITY_LEVEL","COMPRESSION","COMPUTE","CONCAT","CONCAT_NULL_YIELDS_NULL","CONFIGURATION","CONNECT","CONSTRAINT","CONTAINMENT","CONTENT","CONTEXT","CONTINUE","CONTINUE_AFTER_ERROR","CONTRACT","CONTRACT_NAME","CONTROL","CONVERSATION","COOKIE","COPY_ONLY","COUNTER","CPU","CREATE","CREATE_NEW","CREATION_DISPOSITION","CREDENTIAL","CRYPTOGRAPHIC","CUBE","CURRENT","CURRENT_DATE","CURSOR","CURSOR_CLOSE_ON_COMMIT","CURSOR_DEFAULT","CYCLE","DATA","DATA_COMPRESSION","DATA_PURITY","DATABASE","DATABASE_DEFAULT","DATABASE_MIRRORING","DATABASE_SNAPSHOT","DATAFILETYPE","DATE","DATE_CORRELATION_OPTIMIZATION","DATEFIRST","DATEFORMAT","DATETIME","DATETIME2","DATETIMEOFFSET","DAY","DAYOFYEAR","DAYS","DB_CHAINING","DBCC","DBREINDEX","DDL_DATABASE_LEVEL_EVENTS","DEADLOCK_PRIORITY","DEALLOCATE","DEC","DECIMAL","DECLARE","DECRYPTION","DEFAULT","DEFAULT_DATABASE","DEFAULT_FULLTEXT_LANGUAGE","DEFAULT_LANGUAGE","DEFAULT_SCHEMA","DEFINITION","DELAY","DELAYED_DURABILITY","DELETE","DELETED","DENSITY_VECTOR","DENY","DEPENDENTS","DES","DESC","DESCRIPTION","DESX","DHCP","DIAGNOSTICS","DIALOG","DIFFERENTIAL","DIRECTORY_NAME","DISABLE","DISABLE_BROKER","DISABLED","DISK","DISTINCT","DISTRIBUTED","DOCUMENT","DOUBLE","DROP","DROP_EXISTING","DROPCLEANBUFFERS","DUMP","DURABILITY","DYNAMIC","EDITION","ELEMENTS","ELSE","EMERGENCY","EMPTY","EMPTYFILE","ENABLE","ENABLE_BROKER","ENABLED","ENCRYPTION","END","ENDPOINT","ENDPOINT_URL","ERRLVL","ERROR","ERROR_BROKER_CONVERSATIONS","ERRORFILE","ESCAPE","ESTIMATEONLY","EVENT","EVENT_RETENTION_MODE","EXEC","EXECUTABLE","EXECUTE","EXIT","EXPAND","EXPIREDATE","EXPIRY_DATE","EXPLICIT","EXTENDED_LOGICAL_CHECKS","EXTENSION","EXTERNAL","EXTERNAL_ACCESS","FAIL_OPERATION","FAILOVER","FAILOVER_MODE","FAILURE_CONDITION_LEVEL","FALSE","FAN_IN","FAST","FAST_FORWARD","FETCH","FIELDTERMINATOR","FILE","FILEGROUP","FILEGROWTH","FILELISTONLY","FILENAME","FILEPATH","FILESTREAM","FILESTREAM_ON","FILETABLE_COLLATE_FILENAME","FILETABLE_DIRECTORY","FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME","FILETABLE_NAMESPACE","FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME","FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME","FILLFACTOR","FILTERING","FIRE_TRIGGERS","FIRST","FIRSTROW","FLOAT","FMTONLY","FOLLOWING","FOR","FORCE","FORCE_FAILOVER_ALLOW_DATA_LOSS","FORCE_SERVICE_ALLOW_DATA_LOSS","FORCED","FORCEPLAN","FORCESCAN","FORCESEEK","FOREIGN","FORMATFILE","FORMSOF","FORWARD_ONLY","FREE","FREEPROCCACHE","FREESESSIONCACHE","FREESYSTEMCACHE","FROM","FULL","FULLSCAN","FULLTEXT","FUNCTION","GB","GEOGRAPHY_AUTO_GRID","GEOGRAPHY_GRID","GEOMETRY_AUTO_GRID","GEOMETRY_GRID","GET","GLOBAL","GO","GOTO","GOVERNOR","GRANT","GRIDS","GROUP","GROUP_MAX_REQUESTS","HADR","HASH","HASHED","HAVING","HEADERONLY","HEALTH_CHECK_TIMEOUT","HELP","HIERARCHYID","HIGH","HINT","HISTOGRAM","HOLDLOCK","HONOR_BROKER_PRIORITY","HOUR","HOURS","IDENTITY","IDENTITY_INSERT","IDENTITY_VALUE","IDENTITYCOL","IF","IGNORE_CONSTRAINTS","IGNORE_DUP_KEY","IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX","IGNORE_TRIGGERS","IMAGE","IMMEDIATE","IMPERSONATE","IMPLICIT_TRANSACTIONS","IMPORTANCE","INCLUDE","INCREMENT","INCREMENTAL","INDEX","INDEXDEFRAG","INFINITE","INFLECTIONAL","INIT","INITIATOR","INPUT","INPUTBUFFER","INSENSITIVE","INSERT","INSERTED","INSTEAD","INT","INTEGER","INTO","IO","IP","ISABOUT","ISOLATION","JOB","KB","KEEP","KEEP_CDC","KEEP_NULLS","KEEP_REPLICATION","KEEPDEFAULTS","KEEPFIXED","KEEPIDENTITY","KEEPNULLS","KERBEROS","KEY","KEY_SOURCE","KEYS","KEYSET","KILL","KILOBYTES_PER_BATCH","LABELONLY","LANGUAGE","LAST","LASTROW","LEVEL","LEVEL_1","LEVEL_2","LEVEL_3","LEVEL_4","LIFETIME","LIMIT","LINENO","LIST","LISTENER","LISTENER_IP","LISTENER_PORT","LOAD","LOADHISTORY","LOB_COMPACTION","LOCAL","LOCAL_SERVICE_NAME","LOCK_ESCALATION","LOCK_TIMEOUT","LOGIN","LOGSPACE","LOOP","LOW","MANUAL","MARK","MARK_IN_USE_FOR_REMOVAL","MASTER","MAX_CPU_PERCENT","MAX_DISPATCH_LATENCY","MAX_DOP","MAX_DURATION","MAX_EVENT_SIZE","MAX_FILES","MAX_IOPS_PER_VOLUME","MAX_MEMORY","MAX_MEMORY_PERCENT","MAX_QUEUE_READERS","MAX_ROLLOVER_FILES","MAX_SIZE","MAXDOP","MAXERRORS","MAXLENGTH","MAXRECURSION","MAXSIZE","MAXTRANSFERSIZE","MAXVALUE","MB","MEDIADESCRIPTION","MEDIANAME","MEDIAPASSWORD","MEDIUM","MEMBER","MEMORY_OPTIMIZED","MEMORY_OPTIMIZED_DATA","MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT","MEMORY_PARTITION_MODE","MERGE","MESSAGE","MESSAGE_FORWARD_SIZE","MESSAGE_FORWARDING","MICROSECOND","MILLISECOND","MIN_CPU_PERCENT","MIN_IOPS_PER_VOLUME","MIN_MEMORY_PERCENT","MINUTE","MINUTES","MINVALUE","MIRROR","MIRROR_ADDRESS","MODIFY","MONEY","MONTH","MOVE","MULTI_USER","MUST_CHANGE","NAME","NANOSECOND","NATIONAL","NATIVE_COMPILATION","NCHAR","NEGOTIATE","NESTED_TRIGGERS","NEW_ACCOUNT","NEW_BROKER","NEW_PASSWORD","NEWNAME","NEXT","NO","NO_BROWSETABLE","NO_CHECKSUM","NO_COMPRESSION","NO_EVENT_LOSS","NO_INFOMSGS","NO_TRUNCATE","NO_WAIT","NOCHECK","NOCOUNT","NOEXEC","NOEXPAND","NOFORMAT","NOINDEX","NOINIT","NOLOCK","NON","NON_TRANSACTED_ACCESS","NONCLUSTERED","NONE","NORECOMPUTE","NORECOVERY","NORESEED","NORESET","NOREWIND","NORMAL","NOSKIP","NOTIFICATION","NOTRUNCATE","NOUNLOAD","NOWAIT","NTEXT","NTLM","NUMANODE","NUMERIC","NUMERIC_ROUNDABORT","NVARCHAR","OBJECT","OF","OFF","OFFLINE","OFFSET","OFFSETS","OLD_ACCOUNT","OLD_PASSWORD","ON","ON_FAILURE","ONLINE","ONLY","OPEN","OPEN_EXISTING","OPENTRAN","OPTIMISTIC","OPTIMIZE","OPTION","ORDER","OUT","OUTPUT","OUTPUTBUFFER","OVER","OVERRIDE","OWNER","OWNERSHIP","PAD_INDEX","PAGE","PAGE_VERIFY","PAGECOUNT","PAGLOCK","PARAMETERIZATION","PARSEONLY","PARTIAL","PARTITION","PARTITIONS","PARTNER","PASSWORD","PATH","PER_CPU","PER_NODE","PERCENT","PERMISSION_SET","PERSISTED","PHYSICAL_ONLY","PLAN","POISON_MESSAGE_HANDLING","POOL","POPULATION","PORT","PRECEDING","PRECISION","PRIMARY","PRIMARY_ROLE","PRINT","PRIOR","PRIORITY","PRIORITY_LEVEL","PRIVATE","PRIVILEGES","PROC","PROCCACHE","PROCEDURE","PROCEDURE_NAME","PROCESS","PROFILE","PROPERTY","PROPERTY_DESCRIPTION","PROPERTY_INT_ID","PROPERTY_SET_GUID","PROVIDER","PROVIDER_KEY_NAME","PUBLIC","PUT","QUARTER","QUERY","QUERY_GOVERNOR_COST_LIMIT","QUEUE","QUEUE_DELAY","QUOTED_IDENTIFIER","RAISERROR","RANGE","RAW","RC2","RC4","RC4_128","READ","READ_COMMITTED_SNAPSHOT","READ_ONLY","READ_ONLY_ROUTING_LIST","READ_ONLY_ROUTING_URL","READ_WRITE","READ_WRITE_FILEGROUPS","READCOMMITTED","READCOMMITTEDLOCK","READONLY","READPAST","READTEXT","READUNCOMMITTED","READWRITE","REAL","REBUILD","RECEIVE","RECOMPILE","RECONFIGURE","RECOVERY","RECURSIVE","RECURSIVE_TRIGGERS","REFERENCES","REGENERATE","RELATED_CONVERSATION","RELATED_CONVERSATION_GROUP","RELATIVE","REMOTE","REMOTE_PROC_TRANSACTIONS","REMOTE_SERVICE_NAME","REMOVE","REORGANIZE","REPAIR_ALLOW_DATA_LOSS","REPAIR_FAST","REPAIR_REBUILD","REPEATABLE","REPEATABLEREAD","REPLICA","REPLICATION","REQUEST_MAX_CPU_TIME_SEC","REQUEST_MAX_MEMORY_GRANT_PERCENT","REQUEST_MEMORY_GRANT_TIMEOUT_SEC","REQUIRED","RESAMPLE","RESEED","RESERVE_DISK_SPACE","RESET","RESOURCE","RESTART","RESTORE","RESTRICT","RESTRICTED_USER","RESULT","RESUME","RETAINDAYS","RETENTION","RETURN","RETURNS","REVERT","REVOKE","REWIND","REWINDONLY","ROBUST","ROLE","ROLLBACK","ROLLUP","ROOT","ROUTE","ROW","ROWCOUNT","ROWGUIDCOL","ROWLOCK","ROWS","ROWS_PER_BATCH","ROWTERMINATOR","ROWVERSION","RSA_1024","RSA_2048","RSA_512","RULE","SAFE","SAFETY","SAMPLE","SAVE","SCHEDULER","SCHEMA","SCHEMA_AND_DATA","SCHEMA_ONLY","SCHEMABINDING","SCHEME","SCROLL","SCROLL_LOCKS","SEARCH","SECOND","SECONDARY","SECONDARY_ONLY","SECONDARY_ROLE","SECONDS","SECRET","SECURITY_LOG","SECURITYAUDIT","SELECT","SELECTIVE","SELF","SEND","SENT","SEQUENCE","SERIALIZABLE","SERVER","SERVICE","SERVICE_BROKER","SERVICE_NAME","SESSION","SESSION_TIMEOUT","SET","SETS","SETUSER","SHOW_STATISTICS","SHOWCONTIG","SHOWPLAN","SHOWPLAN_ALL","SHOWPLAN_TEXT","SHOWPLAN_XML","SHRINKDATABASE","SHRINKFILE","SHUTDOWN","SID","SIGNATURE","SIMPLE","SINGLE_BLOB","SINGLE_CLOB","SINGLE_NCLOB","SINGLE_USER","SINGLETON","SIZE","SKIP","SMALLDATETIME","SMALLINT","SMALLMONEY","SNAPSHOT","SORT_IN_TEMPDB","SOURCE","SPARSE","SPATIAL","SPATIAL_WINDOW_MAX_CELLS","SPECIFICATION","SPLIT","SQL","SQL_VARIANT","SQLPERF","STANDBY","START","START_DATE","STARTED","STARTUP_STATE","STAT_HEADER","STATE","STATEMENT","STATIC","STATISTICAL_SEMANTICS","STATISTICS","STATISTICS_INCREMENTAL","STATISTICS_NORECOMPUTE","STATS","STATS_STREAM","STATUS","STATUSONLY","STOP","STOP_ON_ERROR","STOPAT","STOPATMARK","STOPBEFOREMARK","STOPLIST","STOPPED","SUBJECT","SUBSCRIPTION","SUPPORTED","SUSPEND","SWITCH","SYMMETRIC","SYNCHRONOUS_COMMIT","SYNONYM","SYSNAME","SYSTEM","TABLE","TABLERESULTS","TABLESAMPLE","TABLOCK","TABLOCKX","TAKE","TAPE","TARGET","TARGET_RECOVERY_TIME","TB","TCP","TEXT","TEXTIMAGE_ON","TEXTSIZE","THEN","THESAURUS","THROW","TIES","TIME","TIMEOUT","TIMER","TIMESTAMP","TINYINT","TO","TOP","TORN_PAGE_DETECTION","TRACEOFF","TRACEON","TRACESTATUS","TRACK_CAUSALITY","TRACK_COLUMNS_UPDATED","TRAN","TRANSACTION","TRANSFER","TRANSFORM_NOISE_WORDS","TRIGGER","TRIPLE_DES","TRIPLE_DES_3KEY","TRUE","TRUNCATE","TRUNCATEONLY","TRUSTWORTHY","TRY","TSQL","TWO_DIGIT_YEAR_CUTOFF","TYPE","TYPE_WARNING","UNBOUNDED","UNCHECKED","UNCOMMITTED","UNDEFINED","UNIQUE","UNIQUEIDENTIFIER","UNKNOWN","UNLIMITED","UNLOAD","UNSAFE","UPDATE","UPDATETEXT","UPDATEUSAGE","UPDLOCK","URL","USE","USED","USER","USEROPTIONS","USING","VALID_XML","VALIDATION","VALUE","VALUES","VARBINARY","VARCHAR","VARYING","VERIFYONLY","VERSION","VIEW","VIEW_METADATA","VIEWS","VISIBILITY","WAIT_AT_LOW_PRIORITY","WAITFOR","WEEK","WEIGHT","WELL_FORMED_XML","WHEN","WHERE","WHILE","WINDOWS","WITH","WITHIN","WITHOUT","WITNESS","WORK","WORKLOAD","WRITETEXT","XACT_ABORT","XLOCK","XMAX","XMIN","XML","XMLDATA","XMLNAMESPACES","XMLSCHEMA","XQUERY","XSINIL","YEAR","YMAX","YMIN"],operators:["ALL","AND","ANY","BETWEEN","EXISTS","IN","LIKE","NOT","OR","SOME","EXCEPT","INTERSECT","UNION","APPLY","CROSS","FULL","INNER","JOIN","LEFT","OUTER","RIGHT","CONTAINS","FREETEXT","IS","NULL","PIVOT","UNPIVOT","MATCHED"],builtinFunctions:["AVG","CHECKSUM_AGG","COUNT","COUNT_BIG","GROUPING","GROUPING_ID","MAX","MIN","SUM","STDEV","STDEVP","VAR","VARP","CUME_DIST","FIRST_VALUE","LAG","LAST_VALUE","LEAD","PERCENTILE_CONT","PERCENTILE_DISC","PERCENT_RANK","COLLATE","COLLATIONPROPERTY","TERTIARY_WEIGHTS","FEDERATION_FILTERING_VALUE","CAST","CONVERT","PARSE","TRY_CAST","TRY_CONVERT","TRY_PARSE","ASYMKEY_ID","ASYMKEYPROPERTY","CERTPROPERTY","CERT_ID","CRYPT_GEN_RANDOM","DECRYPTBYASYMKEY","DECRYPTBYCERT","DECRYPTBYKEY","DECRYPTBYKEYAUTOASYMKEY","DECRYPTBYKEYAUTOCERT","DECRYPTBYPASSPHRASE","ENCRYPTBYASYMKEY","ENCRYPTBYCERT","ENCRYPTBYKEY","ENCRYPTBYPASSPHRASE","HASHBYTES","IS_OBJECTSIGNED","KEY_GUID","KEY_ID","KEY_NAME","SIGNBYASYMKEY","SIGNBYCERT","SYMKEYPROPERTY","VERIFYSIGNEDBYCERT","VERIFYSIGNEDBYASYMKEY","CURSOR_STATUS","DATALENGTH","IDENT_CURRENT","IDENT_INCR","IDENT_SEED","IDENTITY","SQL_VARIANT_PROPERTY","CURRENT_TIMESTAMP","DATEADD","DATEDIFF","DATEFROMPARTS","DATENAME","DATEPART","DATETIME2FROMPARTS","DATETIMEFROMPARTS","DATETIMEOFFSETFROMPARTS","DAY","EOMONTH","GETDATE","GETUTCDATE","ISDATE","MONTH","SMALLDATETIMEFROMPARTS","SWITCHOFFSET","SYSDATETIME","SYSDATETIMEOFFSET","SYSUTCDATETIME","TIMEFROMPARTS","TODATETIMEOFFSET","YEAR","CHOOSE","COALESCE","IIF","NULLIF","ABS","ACOS","ASIN","ATAN","ATN2","CEILING","COS","COT","DEGREES","EXP","FLOOR","LOG","LOG10","PI","POWER","RADIANS","RAND","ROUND","SIGN","SIN","SQRT","SQUARE","TAN","APP_NAME","APPLOCK_MODE","APPLOCK_TEST","ASSEMBLYPROPERTY","COL_LENGTH","COL_NAME","COLUMNPROPERTY","DATABASE_PRINCIPAL_ID","DATABASEPROPERTYEX","DB_ID","DB_NAME","FILE_ID","FILE_IDEX","FILE_NAME","FILEGROUP_ID","FILEGROUP_NAME","FILEGROUPPROPERTY","FILEPROPERTY","FULLTEXTCATALOGPROPERTY","FULLTEXTSERVICEPROPERTY","INDEX_COL","INDEXKEY_PROPERTY","INDEXPROPERTY","OBJECT_DEFINITION","OBJECT_ID","OBJECT_NAME","OBJECT_SCHEMA_NAME","OBJECTPROPERTY","OBJECTPROPERTYEX","ORIGINAL_DB_NAME","PARSENAME","SCHEMA_ID","SCHEMA_NAME","SCOPE_IDENTITY","SERVERPROPERTY","STATS_DATE","TYPE_ID","TYPE_NAME","TYPEPROPERTY","DENSE_RANK","NTILE","RANK","ROW_NUMBER","PUBLISHINGSERVERNAME","OPENDATASOURCE","OPENQUERY","OPENROWSET","OPENXML","CERTENCODED","CERTPRIVATEKEY","CURRENT_USER","HAS_DBACCESS","HAS_PERMS_BY_NAME","IS_MEMBER","IS_ROLEMEMBER","IS_SRVROLEMEMBER","LOGINPROPERTY","ORIGINAL_LOGIN","PERMISSIONS","PWDENCRYPT","PWDCOMPARE","SESSION_USER","SESSIONPROPERTY","SUSER_ID","SUSER_NAME","SUSER_SID","SUSER_SNAME","SYSTEM_USER","USER","USER_ID","USER_NAME","ASCII","CHAR","CHARINDEX","CONCAT","DIFFERENCE","FORMAT","LEFT","LEN","LOWER","LTRIM","NCHAR","PATINDEX","QUOTENAME","REPLACE","REPLICATE","REVERSE","RIGHT","RTRIM","SOUNDEX","SPACE","STR","STUFF","SUBSTRING","UNICODE","UPPER","BINARY_CHECKSUM","CHECKSUM","CONNECTIONPROPERTY","CONTEXT_INFO","CURRENT_REQUEST_ID","ERROR_LINE","ERROR_NUMBER","ERROR_MESSAGE","ERROR_PROCEDURE","ERROR_SEVERITY","ERROR_STATE","FORMATMESSAGE","GETANSINULL","GET_FILESTREAM_TRANSACTION_CONTEXT","HOST_ID","HOST_NAME","ISNULL","ISNUMERIC","MIN_ACTIVE_ROWVERSION","NEWID","NEWSEQUENTIALID","ROWCOUNT_BIG","XACT_STATE","TEXTPTR","TEXTVALID","COLUMNS_UPDATED","EVENTDATA","TRIGGER_NESTLEVEL","UPDATE","CHANGETABLE","CHANGE_TRACKING_CONTEXT","CHANGE_TRACKING_CURRENT_VERSION","CHANGE_TRACKING_IS_COLUMN_IN_MASK","CHANGE_TRACKING_MIN_VALID_VERSION","CONTAINSTABLE","FREETEXTTABLE","SEMANTICKEYPHRASETABLE","SEMANTICSIMILARITYDETAILSTABLE","SEMANTICSIMILARITYTABLE","FILETABLEROOTPATH","GETFILENAMESPACEPATH","GETPATHLOCATOR","PATHNAME","GET_TRANSMISSION_STATUS"],builtinVariables:["@@DATEFIRST","@@DBTS","@@LANGID","@@LANGUAGE","@@LOCK_TIMEOUT","@@MAX_CONNECTIONS","@@MAX_PRECISION","@@NESTLEVEL","@@OPTIONS","@@REMSERVER","@@SERVERNAME","@@SERVICENAME","@@SPID","@@TEXTSIZE","@@VERSION","@@CURSOR_ROWS","@@FETCH_STATUS","@@DATEFIRST","@@PROCID","@@ERROR","@@IDENTITY","@@ROWCOUNT","@@TRANCOUNT","@@CONNECTIONS","@@CPU_BUSY","@@IDLE","@@IO_BUSY","@@PACKET_ERRORS","@@PACK_RECEIVED","@@PACK_SENT","@@TIMETICKS","@@TOTAL_ERRORS","@@TOTAL_READ","@@TOTAL_WRITE"],pseudoColumns:["$ACTION","$IDENTITY","$ROWGUID","$PARTITION"],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@pseudoColumns"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],pseudoColumns:[[/[$][A-Za-z_][\w@#$]*/,{cases:{"@pseudoColumns":"predefined","@default":"identifier"}}]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/N'/,{token:"string",next:"@string"}],[/'/,{token:"string",next:"@string"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],complexIdentifiers:[[/\[/,{token:"identifier.quote",next:"@bracketedIdentifier"}],[/"/,{token:"identifier.quote",next:"@quotedIdentifier"}]],bracketedIdentifier:[[/[^\]]+/,"identifier"],[/]]/,"identifier"],[/]/,{token:"identifier.quote",next:"@pop"}]],quotedIdentifier:[[/[^"]+/,"identifier"],[/""/,"identifier"],[/"/,{token:"identifier.quote",next:"@pop"}]],scopes:[[/BEGIN\s+(DISTRIBUTED\s+)?TRAN(SACTION)?\b/i,"keyword"],[/BEGIN\s+TRY\b/i,{token:"keyword.try"}],[/END\s+TRY\b/i,{token:"keyword.try"}],[/BEGIN\s+CATCH\b/i,{token:"keyword.catch"}],[/END\s+CATCH\b/i,{token:"keyword.catch"}],[/(BEGIN|CASE)\b/i,{token:"keyword.block"}],[/END\b/i,{token:"keyword.block"}],[/WHEN\b/i,{token:"keyword.choice"}],[/THEN\b/i,{token:"keyword.choice"}]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sql/sql.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sql/sql.js.gz new file mode 100644 index 0000000..00a262a Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/sql/sql.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/st/st.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/st/st.js new file mode 100644 index 0000000..ffb986f --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/st/st.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/st/st",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["var","end_var"],["var_input","end_var"],["var_output","end_var"],["var_in_out","end_var"],["var_temp","end_var"],["var_global","end_var"],["var_access","end_var"],["var_external","end_var"],["type","end_type"],["struct","end_struct"],["program","end_program"],["function","end_function"],["function_block","end_function_block"],["action","end_action"],["step","end_step"],["initial_step","end_step"],["transaction","end_transaction"],["configuration","end_configuration"],["tcp","end_tcp"],["recource","end_recource"],["channel","end_channel"],["library","end_library"],["folder","end_folder"],["binaries","end_binaries"],["includes","end_includes"],["sources","end_sources"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"/*",close:"*/"},{open:"'",close:"'",notIn:["string_sq"]},{open:'"',close:'"',notIn:["string_dq"]},{open:"var_input",close:"end_var"},{open:"var_output",close:"end_var"},{open:"var_in_out",close:"end_var"},{open:"var_temp",close:"end_var"},{open:"var_global",close:"end_var"},{open:"var_access",close:"end_var"},{open:"var_external",close:"end_var"},{open:"type",close:"end_type"},{open:"struct",close:"end_struct"},{open:"program",close:"end_program"},{open:"function",close:"end_function"},{open:"function_block",close:"end_function_block"},{open:"action",close:"end_action"},{open:"step",close:"end_step"},{open:"initial_step",close:"end_step"},{open:"transaction",close:"end_transaction"},{open:"configuration",close:"end_configuration"},{open:"tcp",close:"end_tcp"},{open:"recource",close:"end_recource"},{open:"channel",close:"end_channel"},{open:"library",close:"end_library"},{open:"folder",close:"end_folder"},{open:"binaries",close:"end_binaries"},{open:"includes",close:"end_includes"},{open:"sources",close:"end_sources"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"var",close:"end_var"},{open:"var_input",close:"end_var"},{open:"var_output",close:"end_var"},{open:"var_in_out",close:"end_var"},{open:"var_temp",close:"end_var"},{open:"var_global",close:"end_var"},{open:"var_access",close:"end_var"},{open:"var_external",close:"end_var"},{open:"type",close:"end_type"},{open:"struct",close:"end_struct"},{open:"program",close:"end_program"},{open:"function",close:"end_function"},{open:"function_block",close:"end_function_block"},{open:"action",close:"end_action"},{open:"step",close:"end_step"},{open:"initial_step",close:"end_step"},{open:"transaction",close:"end_transaction"},{open:"configuration",close:"end_configuration"},{open:"tcp",close:"end_tcp"},{open:"recource",close:"end_recource"},{open:"channel",close:"end_channel"},{open:"library",close:"end_library"},{open:"folder",close:"end_folder"},{open:"binaries",close:"end_binaries"},{open:"includes",close:"end_includes"},{open:"sources",close:"end_sources"}],folding:{markers:{start:new RegExp("^\\s*#pragma\\s+region\\b"),end:new RegExp("^\\s*#pragma\\s+endregion\\b")}}},n.language={defaultToken:"",tokenPostfix:".st",ignoreCase:!0,brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["if","end_if","elsif","else","case","of","to","__try","__catch","__finally","do","with","by","while","repeat","end_while","end_repeat","end_case","for","end_for","task","retain","non_retain","constant","with","at","exit","return","interval","priority","address","port","on_channel","then","iec","file","uses","version","packagetype","displayname","copyright","summary","vendor","common_source","from","extends"],constant:["false","true","null"],defineKeywords:["var","var_input","var_output","var_in_out","var_temp","var_global","var_access","var_external","end_var","type","end_type","struct","end_struct","program","end_program","function","end_function","function_block","end_function_block","interface","end_interface","method","end_method","property","end_property","namespace","end_namespace","configuration","end_configuration","tcp","end_tcp","resource","end_resource","channel","end_channel","library","end_library","folder","end_folder","binaries","end_binaries","includes","end_includes","sources","end_sources","action","end_action","step","initial_step","end_step","transaction","end_transaction"],typeKeywords:["int","sint","dint","lint","usint","uint","udint","ulint","real","lreal","time","date","time_of_day","date_and_time","string","bool","byte","word","dword","array","pointer","lword"],operators:["=",">","<",":",":=","<=",">=","<>","&","+","-","*","**","MOD","^","or","and","not","xor","abs","acos","asin","atan","cos","exp","expt","ln","log","sin","sqrt","tan","sel","max","min","limit","mux","shl","shr","rol","ror","indexof","sizeof","adr","adrinst","bitadr","is_valid","ref","ref_to"],builtinVariables:[],builtinFunctions:["sr","rs","tp","ton","tof","eq","ge","le","lt","ne","round","trunc","ctd","сtu","ctud","r_trig","f_trig","move","concat","delete","find","insert","left","len","replace","right","rtc"],symbols:/[=>`?!+*\\\/]/,operatorstart:/[\/=\-+!*%<>&|^~?\u00A1-\u00A7\u00A9\u00AB\u00AC\u00AE\u00B0-\u00B1\u00B6\u00BB\u00BF\u00D7\u00F7\u2016-\u2017\u2020-\u2027\u2030-\u203E\u2041-\u2053\u2055-\u205E\u2190-\u23FF\u2500-\u2775\u2794-\u2BFF\u2E00-\u2E7F\u3001-\u3003\u3008-\u3030]/,operatorend:/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE00-\uFE0F\uFE20-\uFE2F\uE0100-\uE01EF]/,operators:/(@operatorstart)((@operatorstart)|(@operatorend))*/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},{include:"@attribute"},{include:"@literal"},{include:"@keyword"},{include:"@invokedmethod"},{include:"@symbol"}],whitespace:[[/\s+/,"white"],[/"""/,"string.quote","@endDblDocString"]],endDblDocString:[[/[^"]+/,"string"],[/\\"/,"string"],[/"""/,"string.quote","@popall"],[/"/,"string"]],symbol:[[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/[.]/,"delimiter"],[/@operators/,"operator"],[/@symbols/,"operator"]],comment:[[/\/\/\/.*$/,"comment.doc"],[/\/\*\*/,"comment.doc","@commentdocbody"],[/\/\/.*$/,"comment"],[/\/\*/,"comment","@commentbody"]],commentdocbody:[[/\/\*/,"comment","@commentbody"],[/\*\//,"comment.doc","@pop"],[/\:[a-zA-Z]+\:/,"comment.doc.param"],[/./,"comment.doc"]],commentbody:[[/\/\*/,"comment","@commentbody"],[/\*\//,"comment","@pop"],[/./,"comment"]],attribute:[[/\@@identifier/,{cases:{"@attributes":"keyword.control","@default":""}}]],literal:[[/"/,{token:"string.quote",next:"@stringlit"}],[/0[b]([01]_?)+/,"number.binary"],[/0[o]([0-7]_?)+/,"number.octal"],[/0[x]([0-9a-fA-F]_?)+([pP][\-+](\d_?)+)?/,"number.hex"],[/(\d_?)*\.(\d_?)+([eE][\-+]?(\d_?)+)?/,"number.float"],[/(\d_?)+/,"number"]],stringlit:[[/\\\(/,{token:"operator",next:"@interpolatedexpression"}],[/@escapes/,"string"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}],[/./,"string"]],interpolatedexpression:[[/\(/,{token:"operator",next:"@interpolatedexpression"}],[/\)/,{token:"operator",next:"@pop"}],{include:"@literal"},{include:"@keyword"},{include:"@symbol"}],keyword:[[/`/,{token:"operator",next:"@escapedkeyword"}],[/@identifier/,{cases:{"@keywords":"keyword","[A-Z][a-zA-Z0-9$]*":"type.identifier","@default":"identifier"}}]],escapedkeyword:[[/`/,{token:"operator",next:"@pop"}],[/./,"identifier"]],invokedmethod:[[/([.])(@identifier)/,{cases:{$2:["delimeter","type.identifier"],"@default":""}}]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/swift/swift.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/swift/swift.js.gz new file mode 100644 index 0000000..b7efc1f Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/swift/swift.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/systemverilog/systemverilog.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/systemverilog/systemverilog.js new file mode 100644 index 0000000..1e107cd --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/systemverilog/systemverilog.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/systemverilog/systemverilog",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["begin","end"],["case","endcase"],["casex","endcase"],["casez","endcase"],["checker","endchecker"],["class","endclass"],["clocking","endclocking"],["config","endconfig"],["function","endfunction"],["generate","endgenerate"],["group","endgroup"],["interface","endinterface"],["module","endmodule"],["package","endpackage"],["primitive","endprimitive"],["program","endprogram"],["property","endproperty"],["specify","endspecify"],["sequence","endsequence"],["table","endtable"],["task","endtask"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{offSide:!1,markers:{start:new RegExp("^(?:\\s*|.*(?!\\/[\\/\\*])[^\\w])(?:begin|case(x|z)?|class|clocking|config|covergroup|function|generate|interface|module|package|primitive|property|program|sequence|specify|table|task)\\b"),end:new RegExp("^(?:\\s*|.*(?!\\/[\\/\\*])[^\\w])(?:end|endcase|endclass|endclocking|endconfig|endgroup|endfunction|endgenerate|endinterface|endmodule|endpackage|endprimitive|endproperty|endprogram|endsequence|endspecify|endtable|endtask)\\b")}}},n.language={defaultToken:"",tokenPostfix:".sv",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["accept_on","alias","always","always_comb","always_ff","always_latch","and","assert","assign","assume","automatic","before","begin","bind","bins","binsof","bit","break","buf","bufif0","bufif1","byte","case","casex","casez","cell","chandle","checker","class","clocking","cmos","config","const","constraint","context","continue","cover","covergroup","coverpoint","cross","deassign","default","defparam","design","disable","dist","do","edge","else","end","endcase","endchecker","endclass","endclocking","endconfig","endfunction","endgenerate","endgroup","endinterface","endmodule","endpackage","endprimitive","endprogram","endproperty","endspecify","endsequence","endtable","endtask","enum","event","eventually","expect","export","extends","extern","final","first_match","for","force","foreach","forever","fork","forkjoin","function","generate","genvar","global","highz0","highz1","if","iff","ifnone","ignore_bins","illegal_bins","implements","implies","import","incdir","include","initial","inout","input","inside","instance","int","integer","interconnect","interface","intersect","join","join_any","join_none","large","let","liblist","library","local","localparam","logic","longint","macromodule","matches","medium","modport","module","nand","negedge","nettype","new","nexttime","nmos","nor","noshowcancelled","not","notif0","notif1","null","or","output","package","packed","parameter","pmos","posedge","primitive","priority","program","property","protected","pull0","pull1","pulldown","pullup","pulsestyle_ondetect","pulsestyle_onevent","pure","rand","randc","randcase","randsequence","rcmos","real","realtime","ref","reg","reject_on","release","repeat","restrict","return","rnmos","rpmos","rtran","rtranif0","rtranif1","s_always","s_eventually","s_nexttime","s_until","s_until_with","scalared","sequence","shortint","shortreal","showcancelled","signed","small","soft","solve","specify","specparam","static","string","strong","strong0","strong1","struct","super","supply0","supply1","sync_accept_on","sync_reject_on","table","tagged","task","this","throughout","time","timeprecision","timeunit","tran","tranif0","tranif1","tri","tri0","tri1","triand","trior","trireg","type","typedef","union","unique","unique0","unsigned","until","until_with","untyped","use","uwire","var","vectored","virtual","void","wait","wait_order","wand","weak","weak0","weak1","while","wildcard","wire","with","within","wor","xnor","xor"],builtin_gates:["and","nand","nor","or","xor","xnor","buf","not","bufif0","bufif1","notif1","notif0","cmos","nmos","pmos","rcmos","rnmos","rpmos","tran","tranif1","tranif0","rtran","rtranif1","rtranif0"],operators:["=","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>+","<<<=",">>>=","?",":","+","-","!","~","&","~&","|","~|","^","~^","^~","+","-","*","/","%","==","!=","===","!==","==?","!=?","&&","||","**","<","<=",">",">=","&","|","^",">>","<<",">>>","<<<","++","--","->","<->","inside","dist","::","+:","-:","*>","&&&","|->","|=>","#=#"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],{include:"@numbers"},[/[;,.]/,"delimiter"],{include:"@strings"}],identifier_or_keyword:[[/@identifier/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}]],numbers:[[/\d+?[\d_]*(?:\.[\d_]+)?[eE][\-+]?\d+/,"number.float"],[/\d+?[\d_]*\.[\d_]+(?:\s*@timeunits)?/,"number.float"],[/(?:\d+?[\d_]*\s*)?'[sS]?[dD]\s*[0-9xXzZ?]+?[0-9xXzZ?_]*/,"number"],[/(?:\d+?[\d_]*\s*)?'[sS]?[bB]\s*[0-1xXzZ?]+?[0-1xXzZ?_]*/,"number.binary"],[/(?:\d+?[\d_]*\s*)?'[sS]?[oO]\s*[0-7xXzZ?]+?[0-7xXzZ?_]*/,"number.octal"],[/(?:\d+?[\d_]*\s*)?'[sS]?[hH]\s*[0-9a-fA-FxXzZ?]+?[0-9a-fA-FxXzZ?_]*/,"number.hex"],[/1step/,"number"],[/[\dxXzZ]+?[\dxXzZ_]*(?:\s*@timeunits)?/,"number"],[/'[01xXzZ]+/,"number"]],module_instance:[{include:"@whitespace"},[/(#?)(\()/,["",{token:"@brackets",next:"@port_connection"}]],[/@identifier\s*[;={}\[\],]/,{token:"@rematch",next:"@pop"}],[/@symbols|[;={}\[\],]/,{token:"@rematch",next:"@pop"}],[/@identifier/,"type"],[/;/,"delimiter","@pop"]],port_connection:[{include:"@identifier_or_keyword"},{include:"@whitespace"},[/@systemcall/,"variable.predefined"],{include:"@numbers"},{include:"@strings"},[/[,]/,"delimiter"],[/\(/,"@brackets","@port_connection"],[/\)/,"@brackets","@pop"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],strings:[[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],include:[[/(\s*)(")([\w*\/*]*)(.\w*)(")/,["","string.include.identifier","string.include.identifier","string.include.identifier",{token:"string.include.identifier",next:"@pop"}]],[/(\s*)(<)([\w*\/*]*)(.\w*)(>)/,["","string.include.identifier","string.include.identifier","string.include.identifier",{token:"string.include.identifier",next:"@pop"}]]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/systemverilog/systemverilog.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/systemverilog/systemverilog.js.gz new file mode 100644 index 0000000..0dfa158 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/systemverilog/systemverilog.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/tcl/tcl.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/tcl/tcl.js new file mode 100644 index 0000000..a00f67c --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/tcl/tcl.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/tcl/tcl",["require","exports"],(function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},t.language={tokenPostfix:".tcl",specialFunctions:["set","unset","rename","variable","proc","coroutine","foreach","incr","append","lappend","linsert","lreplace"],mainFunctions:["if","then","elseif","else","case","switch","while","for","break","continue","return","package","namespace","catch","exit","eval","expr","uplevel","upvar"],builtinFunctions:["file","info","concat","join","lindex","list","llength","lrange","lsearch","lsort","split","array","parray","binary","format","regexp","regsub","scan","string","subst","dict","cd","clock","exec","glob","pid","pwd","close","eof","fblocked","fconfigure","fcopy","fileevent","flush","gets","open","puts","read","seek","socket","tell","interp","after","auto_execok","auto_load","auto_mkindex","auto_reset","bgerror","error","global","history","load","source","time","trace","unknown","unset","update","vwait","winfo","wm","bind","event","pack","place","grid","font","bell","clipboard","destroy","focus","grab","lower","option","raise","selection","send","tk","tkwait","tk_bisque","tk_focusNext","tk_focusPrev","tk_focusFollowsMouse","tk_popup","tk_setPalette"],symbols:/[=>\/\s]+)/g,comments:{blockComment:["{#","#}"]},brackets:[["{#","#}"],["{%","%}"],["{{","}}"],["(",")"],["[","]"],["\x3c!--","--\x3e"],["<",">"]],autoClosingPairs:[{open:"{# ",close:" #}"},{open:"{% ",close:" %}"},{open:"{{ ",close:" }}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}]},e.language={defaultToken:"",tokenPostfix:"",ignoreCase:!0,keywords:["apply","autoescape","block","deprecated","do","embed","extends","flush","for","from","if","import","include","macro","sandbox","set","use","verbatim","with","endapply","endautoescape","endblock","endembed","endfor","endif","endmacro","endsandbox","endset","endwith","true","false"],tokenizer:{root:[[/\s+/],[/{#/,"comment.twig","@commentState"],[/{%[-~]?/,"delimiter.twig","@blockState"],[/{{[-~]?/,"delimiter.twig","@variableState"],[/)/,["delimiter.html","tag.html","","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/|>=|<=/,"operators.twig"],[/(starts with|ends with|matches)(\s+)/,["operators.twig",""]],[/(in)(\s+)/,["operators.twig",""]],[/(is)(\s+)/,["operators.twig",""]],[/\||~|:|\.{1,2}|\?{1,2}/,"operators.twig"],[/[^\W\d][\w]*/,{cases:{"@keywords":"keyword.twig","@default":"variable.twig"}}],[/\d+(\.\d+)?/,"number.twig"],[/\(|\)|\[|\]|{|}|,/,"delimiter.twig"],[/"([^#"\\]*(?:\\.[^#"\\]*)*)"|\'([^\'\\]*(?:\\.[^\'\\]*)*)\'/,"string.twig"],[/"/,"string.twig","@stringState"],[/=>/,"operators.twig"],[/=/,"operators.twig"]],doctype:[[/[^>]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/]],script:[[/type/,"attribute.name.html","@scriptAfterType"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/=/,"delimiter.html","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value.html",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value.html",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]],style:[[/type/,"attribute.name.html","@styleAfterType"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/=/,"delimiter.html","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value.html",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value.html",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/twig/twig.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/twig/twig.js.gz new file mode 100644 index 0000000..89a9797 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/twig/twig.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/typescript/typescript.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/typescript/typescript.js new file mode 100644 index 0000000..42ccd45 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/typescript/typescript.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/typescript/typescript",["require","exports","../fillers/monaco-editor-core"],(function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.language=t.conf=void 0,t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],onEnterRules:[{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,afterText:/^\s*\*\/$/,action:{indentAction:n.languages.IndentAction.IndentOutdent,appendText:" * "}},{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,action:{indentAction:n.languages.IndentAction.None,appendText:" * "}},{beforeText:/^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/,action:{indentAction:n.languages.IndentAction.None,appendText:"* "}},{beforeText:/^(\t|(\ \ ))*\ \*\/\s*$/,action:{indentAction:n.languages.IndentAction.None,removeText:1}}],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"`",close:"`",notIn:["string","comment"]},{open:"/**",close:" */",notIn:["string"]}],folding:{markers:{start:new RegExp("^\\s*//\\s*#?region\\b"),end:new RegExp("^\\s*//\\s*#?endregion\\b")}}},t.language={defaultToken:"invalid",tokenPostfix:".ts",keywords:["abstract","any","as","asserts","bigint","boolean","break","case","catch","class","continue","const","constructor","debugger","declare","default","delete","do","else","enum","export","extends","false","finally","for","from","function","get","if","implements","import","in","infer","instanceof","interface","is","keyof","let","module","namespace","never","new","null","number","object","package","private","protected","public","readonly","require","global","return","set","static","string","super","switch","symbol","this","throw","true","try","type","typeof","undefined","unique","unknown","var","void","while","with","yield","async","await","of"],operators:["<=",">=","==","!=","===","!==","=>","+","-","**","*","/","%","++","--","<<",">",">>>","&","|","^","!","~","&&","||","??","?",":","=","+=","-=","*=","**=","/=","%=","<<=",">>=",">>>=","&=","|=","^=","@"],symbols:/[=>](?!@symbols)/,"@brackets"],[/!(?=([^=]|$))/,"delimiter"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/(@digits)[eE]([\-+]?(@digits))?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,"number.float"],[/0[xX](@hexdigits)n?/,"number.hex"],[/0[oO]?(@octaldigits)n?/,"number.octal"],[/0[bB](@binarydigits)n?/,"number.binary"],[/(@digits)n?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string_double"],[/'/,"string","@string_single"],[/`/,"string","@string_backtick"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@jsdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],jsdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,["regexp.escape.control","regexp.escape.control","regexp.escape.control"]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,["regexp.escape.control",{token:"regexp.escape.control",next:"@regexrange"}]],[/(\()(\?:|\?=|\?!)/,["regexp.escape.control","regexp.escape.control"]],[/[()]/,"regexp.escape.control"],[/@regexpctl/,"regexp.escape.control"],[/[^\\\/]/,"regexp"],[/@regexpesc/,"regexp.escape"],[/\\\./,"regexp.invalid"],[/(\/)([gimsuy]*)/,[{token:"regexp",bracket:"@close",next:"@pop"},"keyword.other"]]],regexrange:[[/-/,"regexp.escape.control"],[/\^/,"regexp.invalid"],[/@regexpesc/,"regexp.escape"],[/[^\]]/,"regexp"],[/\]/,{token:"regexp.escape.control",next:"@pop",bracket:"@close"}]],string_double:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],string_single:[[/[^\\']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/'/,"string","@pop"]],string_backtick:[[/\$\{/,{token:"delimiter.bracket",next:"@bracketCounting"}],[/[^\\`$]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/`/,"string","@pop"]],bracketCounting:[[/\{/,"delimiter.bracket","@bracketCounting"],[/\}/,"delimiter.bracket","@pop"],{include:"common"}]}}})); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/typescript/typescript.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/typescript/typescript.js.gz new file mode 100644 index 0000000..25351cf Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/typescript/typescript.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/vb/vb.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/vb/vb.js new file mode 100644 index 0000000..e09b2f8 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/basic-languages/vb/vb.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-languages version: 2.3.0(57af10ae0184db4e0f7f9a92ff972629c39ccb53) + * Released under the MIT license + * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/basic-languages/vb/vb",["require","exports"],(function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.language=n.conf=void 0,n.conf={comments:{lineComment:"'",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"],["addhandler","end addhandler"],["class","end class"],["enum","end enum"],["event","end event"],["function","end function"],["get","end get"],["if","end if"],["interface","end interface"],["module","end module"],["namespace","end namespace"],["operator","end operator"],["property","end property"],["raiseevent","end raiseevent"],["removehandler","end removehandler"],["select","end select"],["set","end set"],["structure","end structure"],["sub","end sub"],["synclock","end synclock"],["try","end try"],["while","end while"],["with","end with"],["using","end using"],["do","loop"],["for","next"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"<",close:">",notIn:["string","comment"]}],folding:{markers:{start:new RegExp("^\\s*#Region\\b"),end:new RegExp("^\\s*#End Region\\b")}}},n.language={defaultToken:"",tokenPostfix:".vb",ignoreCase:!0,brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.angle",open:"<",close:">"},{token:"keyword.tag-addhandler",open:"addhandler",close:"end addhandler"},{token:"keyword.tag-class",open:"class",close:"end class"},{token:"keyword.tag-enum",open:"enum",close:"end enum"},{token:"keyword.tag-event",open:"event",close:"end event"},{token:"keyword.tag-function",open:"function",close:"end function"},{token:"keyword.tag-get",open:"get",close:"end get"},{token:"keyword.tag-if",open:"if",close:"end if"},{token:"keyword.tag-interface",open:"interface",close:"end interface"},{token:"keyword.tag-module",open:"module",close:"end module"},{token:"keyword.tag-namespace",open:"namespace",close:"end namespace"},{token:"keyword.tag-operator",open:"operator",close:"end operator"},{token:"keyword.tag-property",open:"property",close:"end property"},{token:"keyword.tag-raiseevent",open:"raiseevent",close:"end raiseevent"},{token:"keyword.tag-removehandler",open:"removehandler",close:"end removehandler"},{token:"keyword.tag-select",open:"select",close:"end select"},{token:"keyword.tag-set",open:"set",close:"end set"},{token:"keyword.tag-structure",open:"structure",close:"end structure"},{token:"keyword.tag-sub",open:"sub",close:"end sub"},{token:"keyword.tag-synclock",open:"synclock",close:"end synclock"},{token:"keyword.tag-try",open:"try",close:"end try"},{token:"keyword.tag-while",open:"while",close:"end while"},{token:"keyword.tag-with",open:"with",close:"end with"},{token:"keyword.tag-using",open:"using",close:"end using"},{token:"keyword.tag-do",open:"do",close:"loop"},{token:"keyword.tag-for",open:"for",close:"next"}],keywords:["AddHandler","AddressOf","Alias","And","AndAlso","As","Async","Boolean","ByRef","Byte","ByVal","Call","Case","Catch","CBool","CByte","CChar","CDate","CDbl","CDec","Char","CInt","Class","CLng","CObj","Const","Continue","CSByte","CShort","CSng","CStr","CType","CUInt","CULng","CUShort","Date","Decimal","Declare","Default","Delegate","Dim","DirectCast","Do","Double","Each","Else","ElseIf","End","EndIf","Enum","Erase","Error","Event","Exit","False","Finally","For","Friend","Function","Get","GetType","GetXMLNamespace","Global","GoSub","GoTo","Handles","If","Implements","Imports","In","Inherits","Integer","Interface","Is","IsNot","Let","Lib","Like","Long","Loop","Me","Mod","Module","MustInherit","MustOverride","MyBase","MyClass","NameOf","Namespace","Narrowing","New","Next","Not","Nothing","NotInheritable","NotOverridable","Object","Of","On","Operator","Option","Optional","Or","OrElse","Out","Overloads","Overridable","Overrides","ParamArray","Partial","Private","Property","Protected","Public","RaiseEvent","ReadOnly","ReDim","RemoveHandler","Resume","Return","SByte","Select","Set","Shadows","Shared","Short","Single","Static","Step","Stop","String","Structure","Sub","SyncLock","Then","Throw","To","True","Try","TryCast","TypeOf","UInteger","ULong","UShort","Using","Variant","Wend","When","While","Widening","With","WithEvents","WriteOnly","Xor"],tagwords:["If","Sub","Select","Try","Class","Enum","Function","Get","Interface","Module","Namespace","Operator","Set","Structure","Using","While","With","Do","Loop","For","Next","Property","Continue","AddHandler","RemoveHandler","Event","RaiseEvent","SyncLock"],symbols:/[=>"]],autoClosingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],surroundingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],onEnterRules:[{beforeText:new RegExp("<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:n.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:n.languages.IndentAction.Indent}}]},t.language={defaultToken:"",tokenPostfix:".xml",ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,""],{include:"@whitespace"},[/(<)(@qualifiedName)/,[{token:"delimiter"},{token:"tag",next:"@tag"}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:"delimiter"},{token:"tag"},"",{token:"delimiter"}]],[/(<\?)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/(<\!)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/<\!\[CDATA\[/,{token:"delimiter.cdata",next:"@cdata"}],[/&\w+;/,"string.escape"]],cdata:[[/[^\]]+/,""],[/\]\]>/,{token:"delimiter.cdata",next:"@pop"}],[/\]/,""]],tag:[[/[ \t\r\n]+/,""],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,["attribute.name","","attribute.value"]],[/@qualifiedName/,"attribute.name"],[/\?>/,{token:"delimiter",next:"@pop"}],[/(\/)(>)/,[{token:"tag"},{token:"delimiter",next:"@pop"}]],[/>/,{token:"delimiter",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[//,{token:"comment",next:"@pop"}],[/");y>=0&&(u.comment&&u.comment(a.substring(4,y)),a=a.substring(y+3),n=!1)}function _(){if(!!n){var y,L=a.indexOf("<");L>=0?(y=a.substring(0,L),a=a.substring(L)):(y=a,a=""),u.chars&&u.chars(y)}}function f(y,L,I,k){var E={},T=M(L),O=S.voids[T]||!!k;I.replace(g,A),O||r.push(T),u.start&&u.start(T,E,O);function A(B,F,D,R,W){D===void 0&&R===void 0&&W===void 0?E[F]=void 0:E[F]=N.decode(D||R||W||"")}}function v(y,L){var I,k=0,E=M(L);if(E)for(k=r.length-1;k>=0&&r[k]!==E;k--);if(k>=0){for(I=r.length-1;I>=k;I--)u.end&&u.end(r[I]);r.length=k}}}e.exports=s},{"./attributes":1,"./elements":3,"./lowercase":5,he:9}],8:[function(q,e,b){"use strict";var N=q("he"),M=q("./lowercase"),w=q("./attributes"),S=q("./elements");function C(d,g){var p,c,o=g||{};return l(),{start:a,end:u,chars:i};function s(h){d.push(h)}function a(h,m,_){var f=M(h);if(c.ignoring){n(f);return}if((o.allowedTags||[]).indexOf(f)===-1){n(f);return}if(o.filter&&!o.filter({tag:f,attrs:m})){n(f);return}s("<"),s(f),Object.keys(m).forEach(v),s(_?"/>":">");function v(y){var L=m[y],I=(o.allowedClasses||{})[f]||[],k=(o.allowedAttributes||{})[f]||[];k=k.concat((o.allowedAttributes||{})["*"]||[]);var E,T=M(y);T==="class"&&k.indexOf(T)===-1?(L=L.split(" ").filter(O).join(" ").trim(),E=L.length):E=k.indexOf(T)!==-1&&(w.uris[T]!==!0||r(L)),E&&(s(" "),s(y),typeof L=="string"&&(s('="'),s(N.encode(L)),s('"')));function O(A){return I&&I.indexOf(A)!==-1}}}function u(h){var m=M(h),_=(o.allowedTags||[]).indexOf(m)!==-1;_&&c.ignoring===!1?(s("")):t(m)}function r(h){var m=h[0];if(m==="#"||m==="/")return!0;var _=h.indexOf(":");if(_===-1)return!0;var f=h.indexOf("?");if(f!==-1&&_>f)return!0;var v=h.indexOf("#");if(v!==-1&&_>v)return!0;return o.allowedSchemes.some(y);function y(L){return h.indexOf(L+":")===0}}function i(h){c.ignoring===!1&&s(o.transformText?o.transformText(h):h)}function n(h){S.voids[h]||(c.ignoring===!1?c={ignoring:h,depth:1}:c.ignoring===h&&c.depth++)}function t(h){c.ignoring===h&&--c.depth<=0&&l()}function l(){c={ignoring:!1,depth:0}}}e.exports=C},{"./attributes":1,"./elements":3,"./lowercase":5,he:9}],9:[function(q,e,b){"use strict";var N={"&":"&","<":"<",">":">",'"':""","'":"'"},M={"&":"&","<":"<",">":">",""":'"',"'":"'"},w=/(&|<|>|"|')/g,S=/[&<>"']/g;function C(c){return N[c]}function d(c){return M[c]}function g(c){return c==null?"":String(c).replace(S,C)}function p(c){return c==null?"":String(c).replace(w,d)}g.options=p.options={},e.exports={encode:g,escape:g,decode:p,unescape:p,version:"1.0.0-browser"}},{}],10:[function(q,e,b){"use strict";function N(w){return w.reduce(M,{})}function M(w,S){return w[S]=!0,w}e.exports=N},{}]},{},[4]),define("vs/base/common/insane/insane",function(){return{insane:kt}}),define(Q[54],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Iterable=void 0;var b;(function(N){function M(h){return h&&typeof h=="object"&&typeof h[Symbol.iterator]=="function"}N.is=M;const w=Object.freeze([]);function S(){return w}N.empty=S;function*C(h){yield h}N.single=C;function d(h){return h||w}N.from=d;function g(h){return!h||h[Symbol.iterator]().next().done===!0}N.isEmpty=g;function p(h){return h[Symbol.iterator]().next().value}N.first=p;function c(h,m){for(const _ of h)if(m(_))return!0;return!1}N.some=c;function o(h,m){for(const _ of h)if(m(_))return _}N.find=o;function*s(h,m){for(const _ of h)m(_)&&(yield _)}N.filter=s;function*a(h,m){for(const _ of h)yield m(_)}N.map=a;function*u(...h){for(const m of h)for(const _ of m)yield _}N.concat=u;function*r(h){for(const m of h)for(const _ of m)yield _}N.concatNested=r;function i(h,m,_){let f=_;for(const v of h)f=m(f,v);return f}N.reduce=i;function*n(h,m,_=h.length){for(m<0&&(m+=h.length),_<0?_+=h.length:_>h.length&&(_=h.length);m<_;m++)yield h[m]}N.slice=n;function t(h,m=Number.POSITIVE_INFINITY){const _=[];if(m===0)return[_,h];const f=h[Symbol.iterator]();for(let v=0;vf===v){const f=h[Symbol.iterator](),v=m[Symbol.iterator]();for(;;){const y=f.next(),L=v.next();if(y.done!==L.done)return!1;if(y.done)return!0;if(!_(y.value,L.value))return!1}}N.equals=l})(b=e.Iterable||(e.Iterable={}))}),define(Q[39],J([0,1,12]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResolvedKeybinding=e.ResolvedKeybindingPart=e.ChordKeybinding=e.SimpleKeybinding=e.createSimpleKeybinding=e.createKeybinding=e.KeyChord=e.KeyCodeUtils=void 0;class N{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(r,i){this._keyCodeToStr[r]=i,this._strToKeyCode[i.toLowerCase()]=r}keyCodeToStr(r){return this._keyCodeToStr[r]}strToKeyCode(r){return this._strToKeyCode[r.toLowerCase()]||0}}const M=new N,w=new N,S=new N;(function(){function u(r,i,n=i,t=n){M.define(r,i),w.define(r,n),S.define(r,t)}u(0,"unknown"),u(1,"Backspace"),u(2,"Tab"),u(3,"Enter"),u(4,"Shift"),u(5,"Ctrl"),u(6,"Alt"),u(7,"PauseBreak"),u(8,"CapsLock"),u(9,"Escape"),u(10,"Space"),u(11,"PageUp"),u(12,"PageDown"),u(13,"End"),u(14,"Home"),u(15,"LeftArrow","Left"),u(16,"UpArrow","Up"),u(17,"RightArrow","Right"),u(18,"DownArrow","Down"),u(19,"Insert"),u(20,"Delete"),u(21,"0"),u(22,"1"),u(23,"2"),u(24,"3"),u(25,"4"),u(26,"5"),u(27,"6"),u(28,"7"),u(29,"8"),u(30,"9"),u(31,"A"),u(32,"B"),u(33,"C"),u(34,"D"),u(35,"E"),u(36,"F"),u(37,"G"),u(38,"H"),u(39,"I"),u(40,"J"),u(41,"K"),u(42,"L"),u(43,"M"),u(44,"N"),u(45,"O"),u(46,"P"),u(47,"Q"),u(48,"R"),u(49,"S"),u(50,"T"),u(51,"U"),u(52,"V"),u(53,"W"),u(54,"X"),u(55,"Y"),u(56,"Z"),u(57,"Meta"),u(58,"ContextMenu"),u(59,"F1"),u(60,"F2"),u(61,"F3"),u(62,"F4"),u(63,"F5"),u(64,"F6"),u(65,"F7"),u(66,"F8"),u(67,"F9"),u(68,"F10"),u(69,"F11"),u(70,"F12"),u(71,"F13"),u(72,"F14"),u(73,"F15"),u(74,"F16"),u(75,"F17"),u(76,"F18"),u(77,"F19"),u(78,"NumLock"),u(79,"ScrollLock"),u(80,";",";","OEM_1"),u(81,"=","=","OEM_PLUS"),u(82,",",",","OEM_COMMA"),u(83,"-","-","OEM_MINUS"),u(84,".",".","OEM_PERIOD"),u(85,"/","/","OEM_2"),u(86,"`","`","OEM_3"),u(110,"ABNT_C1"),u(111,"ABNT_C2"),u(87,"[","[","OEM_4"),u(88,"\\","\\","OEM_5"),u(89,"]","]","OEM_6"),u(90,"'","'","OEM_7"),u(91,"OEM_8"),u(92,"OEM_102"),u(93,"NumPad0"),u(94,"NumPad1"),u(95,"NumPad2"),u(96,"NumPad3"),u(97,"NumPad4"),u(98,"NumPad5"),u(99,"NumPad6"),u(100,"NumPad7"),u(101,"NumPad8"),u(102,"NumPad9"),u(103,"NumPad_Multiply"),u(104,"NumPad_Add"),u(105,"NumPad_Separator"),u(106,"NumPad_Subtract"),u(107,"NumPad_Decimal"),u(108,"NumPad_Divide")})();var C;(function(u){function r(h){return M.keyCodeToStr(h)}u.toString=r;function i(h){return M.strToKeyCode(h)}u.fromString=i;function n(h){return w.keyCodeToStr(h)}u.toUserSettingsUS=n;function t(h){return S.keyCodeToStr(h)}u.toUserSettingsGeneral=t;function l(h){return w.strToKeyCode(h)||S.strToKeyCode(h)}u.fromUserSettings=l})(C=e.KeyCodeUtils||(e.KeyCodeUtils={}));function d(u,r){const i=(r&65535)<<16>>>0;return(u|i)>>>0}e.KeyChord=d;function g(u,r){if(u===0)return null;const i=(u&65535)>>>0,n=(u&4294901760)>>>16;return n!==0?new o([p(i,r),p(n,r)]):new o([p(i,r)])}e.createKeybinding=g;function p(u,r){const i=!!(u&2048),n=!!(u&256),t=r===2?n:i,l=!!(u&1024),h=!!(u&512),m=r===2?i:n,_=u&255;return new c(t,l,h,m,_)}e.createSimpleKeybinding=p;class c{constructor(r,i,n,t,l){this.ctrlKey=r,this.shiftKey=i,this.altKey=n,this.metaKey=t,this.keyCode=l}equals(r){return this.ctrlKey===r.ctrlKey&&this.shiftKey===r.shiftKey&&this.altKey===r.altKey&&this.metaKey===r.metaKey&&this.keyCode===r.keyCode}isModifierKey(){return this.keyCode===0||this.keyCode===5||this.keyCode===57||this.keyCode===6||this.keyCode===4}toChord(){return new o([this])}isDuplicateModifierCase(){return this.ctrlKey&&this.keyCode===5||this.shiftKey&&this.keyCode===4||this.altKey&&this.keyCode===6||this.metaKey&&this.keyCode===57}}e.SimpleKeybinding=c;class o{constructor(r){if(r.length===0)throw b.illegalArgument("parts");this.parts=r}}e.ChordKeybinding=o;class s{constructor(r,i,n,t,l,h){this.ctrlKey=r,this.shiftKey=i,this.altKey=n,this.metaKey=t,this.keyLabel=l,this.keyAriaLabel=h}}e.ResolvedKeybindingPart=s;class a{}e.ResolvedKeybinding=a}),define(Q[150],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Lazy=void 0;class b{constructor(M){this.executor=M,this._didRun=!1}getValue(){if(!this._didRun)try{this._value=this.executor()}catch(M){this._error=M}finally{this._didRun=!0}if(this._error)throw this._error;return this._value}get rawValue(){return this._value}}e.Lazy=b}),define(Q[2],J([0,1,54]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ImmortalReference=e.MutableDisposable=e.Disposable=e.DisposableStore=e.toDisposable=e.combinedDisposable=e.dispose=e.isDisposable=e.MultiDisposeError=e.trackDisposable=void 0;const N=!1;let M=null;if(N){const r="__is_disposable_tracked__";M=new class{trackDisposable(i){const n=new Error("Potentially leaked disposable").stack;setTimeout(()=>{i[r]||console.log(n)},3e3)}markTracked(i){if(i&&i!==s.None)try{i[r]=!0}catch(n){}}}}function w(r){!M||M.markTracked(r)}function S(r){return M&&M.trackDisposable(r),r}e.trackDisposable=S;class C extends Error{constructor(i){super(`Encountered errors while disposing of store. Errors: [${i.join(", ")}]`);this.errors=i}}e.MultiDisposeError=C;function d(r){return typeof r.dispose=="function"&&r.dispose.length===0}e.isDisposable=d;function g(r){if(b.Iterable.is(r)){let i=[];for(const n of r)if(n){w(n);try{n.dispose()}catch(t){i.push(t)}}if(i.length===1)throw i[0];if(i.length>1)throw new C(i);return Array.isArray(r)?[]:r}else if(r)return w(r),r.dispose(),r}e.dispose=g;function p(...r){return r.forEach(w),c(()=>g(r))}e.combinedDisposable=p;function c(r){const i=S({dispose:()=>{w(i),r()}});return i}e.toDisposable=c;class o{constructor(){this._toDispose=new Set,this._isDisposed=!1}dispose(){this._isDisposed||(w(this),this._isDisposed=!0,this.clear())}clear(){try{g(this._toDispose.values())}finally{this._toDispose.clear()}}add(i){if(!i)return i;if(i===this)throw new Error("Cannot register a disposable on itself!");return w(i),this._isDisposed?o.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(i),i}}e.DisposableStore=o,o.DISABLE_DISPOSED_WARNING=!1;class s{constructor(){this._store=new o,S(this)}dispose(){w(this),this._store.dispose()}_register(i){if(i===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(i)}}e.Disposable=s,s.None=Object.freeze({dispose(){}});class a{constructor(){this._isDisposed=!1,S(this)}get value(){return this._isDisposed?void 0:this._value}set value(i){var n;this._isDisposed||i===this._value||((n=this._value)===null||n===void 0||n.dispose(),i&&w(i),this._value=i)}clear(){this.value=void 0}dispose(){var i;this._isDisposed=!0,w(this),(i=this._value)===null||i===void 0||i.dispose(),this._value=void 0}}e.MutableDisposable=a;class u{constructor(i){this.object=i}dispose(){}}e.ImmortalReference=u}),define(Q[71],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinkedList=void 0;class b{constructor(w){this.element=w,this.next=b.Undefined,this.prev=b.Undefined}}b.Undefined=new b(void 0);class N{constructor(){this._first=b.Undefined,this._last=b.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===b.Undefined}clear(){this._first=b.Undefined,this._last=b.Undefined,this._size=0}unshift(w){return this._insert(w,!1)}push(w){return this._insert(w,!0)}_insert(w,S){const C=new b(w);if(this._first===b.Undefined)this._first=C,this._last=C;else if(S){const g=this._last;this._last=C,C.prev=g,g.next=C}else{const g=this._first;this._first=C,C.next=g,g.prev=C}this._size+=1;let d=!1;return()=>{d||(d=!0,this._remove(C))}}shift(){if(this._first!==b.Undefined){const w=this._first.element;return this._remove(this._first),w}}pop(){if(this._last!==b.Undefined){const w=this._last.element;return this._remove(this._last),w}}_remove(w){if(w.prev!==b.Undefined&&w.next!==b.Undefined){const S=w.prev;S.next=w.next,w.next.prev=S}else w.prev===b.Undefined&&w.next===b.Undefined?(this._first=b.Undefined,this._last=b.Undefined):w.next===b.Undefined?(this._last=this._last.prev,this._last.next=b.Undefined):w.prev===b.Undefined&&(this._first=this._first.next,this._first.prev=b.Undefined);this._size-=1}*[Symbol.iterator](){let w=this._first;for(;w!==b.Undefined;)yield w.element,w=w.next}}e.LinkedList=N}),function(q,e){typeof exports=="object"&&typeof module!="undefined"?module.exports=e():typeof define=="function"&&define.amd?define("vs/base/common/marked/marked",e):(q=typeof globalThis!="undefined"?globalThis:q||self,q.marked=e())}(this,function(){"use strict";function q(Se,we){for(var ye=0;yeSe.length)&&(we=Se.length);for(var ye=0,fe=new Array(we);ye=Se.length?{done:!0}:{done:!1,value:Se[fe++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}return ye=Se[Symbol.iterator](),ye.next.bind(ye)}function w(Se){var we={exports:{}};return Se(we,we.exports),we.exports}var S=w(function(Se){function we(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}function ye(fe){Se.exports.defaults=fe}Se.exports={defaults:we(),getDefaults:we,changeDefaults:ye}}),C=/[&<>"']/,d=/[&<>"']/g,g=/[<>"']|&(?!#?\w+;)/,p=/[<>"']|&(?!#?\w+;)/g,c={"&":"&","<":"<",">":">",'"':""","'":"'"},o=function(we){return c[we]};function s(Se,we){if(we){if(C.test(Se))return Se.replace(d,o)}else if(g.test(Se))return Se.replace(p,o);return Se}var a=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function u(Se){return Se.replace(a,function(we,ye){return ye=ye.toLowerCase(),ye==="colon"?":":ye.charAt(0)==="#"?ye.charAt(1)==="x"?String.fromCharCode(parseInt(ye.substring(2),16)):String.fromCharCode(+ye.substring(1)):""})}var r=/(^|[^\[])\^/g;function i(Se,we){Se=Se.source||Se,we=we||"";var ye={replace:function(de,ge){return ge=ge.source||ge,ge=ge.replace(r,"$1"),Se=Se.replace(de,ge),ye},getRegex:function(){return new RegExp(Se,we)}};return ye}var n=/[^\w:]/g,t=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function l(Se,we,ye){if(Se){var fe;try{fe=decodeURIComponent(u(ye)).replace(n,"").toLowerCase()}catch(de){return null}if(fe.indexOf("javascript:")===0||fe.indexOf("vbscript:")===0||fe.indexOf("data:")===0)return null}we&&!t.test(ye)&&(ye=v(we,ye));try{ye=encodeURI(ye).replace(/%25/g,"%")}catch(de){return null}return ye}var h={},m=/^[^:]+:\/*[^/]*$/,_=/^([^:]+:)[\s\S]*$/,f=/^([^:]+:\/*[^/]*)[\s\S]*$/;function v(Se,we){h[" "+Se]||(m.test(Se)?h[" "+Se]=Se+"/":h[" "+Se]=k(Se,"/",!0)),Se=h[" "+Se];var ye=Se.indexOf(":")===-1;return we.substring(0,2)==="//"?ye?we:Se.replace(_,"$1")+we:we.charAt(0)==="/"?ye?we:Se.replace(f,"$1")+we:Se+we}var y={exec:function(){}};function L(Se){for(var we=1,ye,fe;we=0&&ve[Ne]==="\\";)ke=!ke;return ke?"|":" |"}),fe=ye.split(/ \|/),de=0;if(fe.length>we)fe.splice(we);else for(;fe.length1;)we&1&&(ye+=Se),we>>=1,Se+=Se;return ye+Se}var A={escape:s,unescape:u,edit:i,cleanUrl:l,resolveUrl:v,noopTest:y,merge:L,splitCells:I,rtrim:k,findClosingBracket:E,checkSanitizeDeprecation:T,repeatString:O},B=S.defaults,F=A.rtrim,D=A.splitCells,R=A.escape,W=A.findClosingBracket;function x(Se,we,ye){var fe=we.href,de=we.title?R(we.title):null,ge=Se[1].replace(/\\([\[\]])/g,"$1");return Se[0].charAt(0)!=="!"?{type:"link",raw:ye,href:fe,title:de,text:ge}:{type:"image",raw:ye,href:fe,title:de,text:R(ge)}}function K(Se,we){var ye=Se.match(/^(\s+)(?:```)/);if(ye===null)return we;var fe=ye[1];return we.split(` +`).map(function(de){var ge=de.match(/^\s+/);if(ge===null)return de;var pe=ge[0];return pe.length>=fe.length?de.slice(fe.length):de}).join(` +`)}var Y=function(){function Se(ye){this.options=ye||B}var we=Se.prototype;return we.space=function(fe){var de=this.rules.block.newline.exec(fe);if(de)return de[0].length>1?{type:"space",raw:de[0]}:{raw:` +`}},we.code=function(fe){var de=this.rules.block.code.exec(fe);if(de){var ge=de[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:de[0],codeBlockStyle:"indented",text:this.options.pedantic?ge:F(ge,` +`)}}},we.fences=function(fe){var de=this.rules.block.fences.exec(fe);if(de){var ge=de[0],pe=K(ge,de[3]||"");return{type:"code",raw:ge,lang:de[2]?de[2].trim():de[2],text:pe}}},we.heading=function(fe){var de=this.rules.block.heading.exec(fe);if(de){var ge=de[2].trim();if(/#$/.test(ge)){var pe=F(ge,"#");(this.options.pedantic||!pe||/ $/.test(pe))&&(ge=pe.trim())}return{type:"heading",raw:de[0],depth:de[1].length,text:ge}}},we.nptable=function(fe){var de=this.rules.block.nptable.exec(fe);if(de){var ge={type:"table",header:D(de[1].replace(/^ *| *\| *$/g,"")),align:de[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:de[3]?de[3].replace(/\n$/,"").split(` +`):[],raw:de[0]};if(ge.header.length===ge.align.length){var pe=ge.align.length,ve;for(ve=0;ve ?/gm,"");return{type:"blockquote",raw:de[0],text:ge}}},we.list=function(fe){var de=this.rules.block.list.exec(fe);if(de){var ge=de[0],pe=de[2],ve=pe.length>1,ke={type:"list",raw:ge,ordered:ve,start:ve?+pe.slice(0,-1):"",loose:!1,items:[]},Ne=de[0].match(this.rules.block.item),Te=!1,Oe,Fe,Pe,xe,We,ze,Ke,Be,He=Ne.length;Pe=this.rules.block.listItemStart.exec(Ne[0]);for(var Ve=0;VePe[1].length:xe[1].length>Pe[0].length||xe[1].length>3){Ne.splice(Ve,2,Ne[Ve]+` +`+Ne[Ve+1]),Ve--,He--;continue}else(!this.options.pedantic||this.options.smartLists?xe[2][xe[2].length-1]!==pe[pe.length-1]:ve===(xe[2].length===1))&&(We=Ne.slice(Ve+1).join(` +`),ke.raw=ke.raw.substring(0,ke.raw.length-We.length),Ve=He-1);Pe=xe}Fe=Oe.length,Oe=Oe.replace(/^ *([*+-]|\d+[.)]) ?/,""),~Oe.indexOf(` + `)&&(Fe-=Oe.length,Oe=this.options.pedantic?Oe.replace(/^ {1,4}/gm,""):Oe.replace(new RegExp("^ {1,"+Fe+"}","gm"),"")),ze=Te||/\n\n(?!\s*$)/.test(Oe),Ve!==He-1&&(Te=Oe.charAt(Oe.length-1)===` +`,ze||(ze=Te)),ze&&(ke.loose=!0),this.options.gfm&&(Ke=/^\[[ xX]\] /.test(Oe),Be=void 0,Ke&&(Be=Oe[1]!==" ",Oe=Oe.replace(/^\[[ xX]\] +/,""))),ke.items.push({type:"list_item",raw:ge,task:Ke,checked:Be,loose:ze,text:Oe})}return ke}},we.html=function(fe){var de=this.rules.block.html.exec(fe);if(de)return{type:this.options.sanitize?"paragraph":"html",raw:de[0],pre:!this.options.sanitizer&&(de[1]==="pre"||de[1]==="script"||de[1]==="style"),text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(de[0]):R(de[0]):de[0]}},we.def=function(fe){var de=this.rules.block.def.exec(fe);if(de){de[3]&&(de[3]=de[3].substring(1,de[3].length-1));var ge=de[1].toLowerCase().replace(/\s+/g," ");return{tag:ge,raw:de[0],href:de[2],title:de[3]}}},we.table=function(fe){var de=this.rules.block.table.exec(fe);if(de){var ge={type:"table",header:D(de[1].replace(/^ *| *\| *$/g,"")),align:de[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:de[3]?de[3].replace(/\n$/,"").split(` +`):[]};if(ge.header.length===ge.align.length){ge.raw=de[0];var pe=ge.align.length,ve;for(ve=0;ve/i.test(pe[0])&&(de=!1),!ge&&/^<(pre|code|kbd|script)(\s|>)/i.test(pe[0])?ge=!0:ge&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(pe[0])&&(ge=!1),{type:this.options.sanitize?"text":"html",raw:pe[0],inLink:de,inRawBlock:ge,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(pe[0]):R(pe[0]):pe[0]}},we.link=function(fe){var de=this.rules.inline.link.exec(fe);if(de){var ge=de[2].trim();if(!this.options.pedantic&&/^$/.test(ge))return;var pe=F(ge.slice(0,-1),"\\");if((ge.length-pe.length)%2==0)return}else{var ve=W(de[2],"()");if(ve>-1){var ke=de[0].indexOf("!")===0?5:4,Ne=ke+de[1].length+ve;de[2]=de[2].substring(0,ve),de[0]=de[0].substring(0,Ne).trim(),de[3]=""}}var Te=de[2],Oe="";if(this.options.pedantic){var Fe=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(Te);Fe&&(Te=Fe[1],Oe=Fe[3])}else Oe=de[3]?de[3].slice(1,-1):"";return Te=Te.trim(),/^$/.test(ge)?Te=Te.slice(1):Te=Te.slice(1,-1)),x(de,{href:Te&&Te.replace(this.rules.inline._escapes,"$1"),title:Oe&&Oe.replace(this.rules.inline._escapes,"$1")},de[0])}},we.reflink=function(fe,de){var ge;if((ge=this.rules.inline.reflink.exec(fe))||(ge=this.rules.inline.nolink.exec(fe))){var pe=(ge[2]||ge[1]).replace(/\s+/g," ");if(pe=de[pe.toLowerCase()],!pe||!pe.href){var ve=ge[0].charAt(0);return{type:"text",raw:ve,text:ve}}return x(ge,pe,ge[0])}},we.emStrong=function(fe,de,ge){ge===void 0&&(ge="");var pe=this.rules.inline.emStrong.lDelim.exec(fe);if(!!pe&&!(pe[3]&&ge.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/))){var ve=pe[1]||pe[2]||"";if(!ve||ve&&(ge===""||this.rules.inline.punctuation.exec(ge))){var ke=pe[0].length-1,Ne,Te,Oe=ke,Fe=0,Pe=pe[0][0]==="*"?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(Pe.lastIndex=0,de=de.slice(-1*fe.length+ke);(pe=Pe.exec(de))!=null;)if(Ne=pe[1]||pe[2]||pe[3]||pe[4]||pe[5]||pe[6],!!Ne){if(Te=Ne.length,pe[3]||pe[4]){Oe+=Te;continue}else if((pe[5]||pe[6])&&ke%3&&!((ke+Te)%3)){Fe+=Te;continue}if(Oe-=Te,!(Oe>0)){if(Oe+Fe-Te<=0&&!de.slice(Pe.lastIndex).match(Pe)&&(Te=Math.min(Te,Te+Oe+Fe)),Math.min(ke,Te)%2)return{type:"em",raw:fe.slice(0,ke+pe.index+Te+1),text:fe.slice(1,ke+pe.index+Te)};if(Math.min(ke,Te)%2==0)return{type:"strong",raw:fe.slice(0,ke+pe.index+Te+1),text:fe.slice(2,ke+pe.index+Te-1)}}}}}},we.codespan=function(fe){var de=this.rules.inline.code.exec(fe);if(de){var ge=de[2].replace(/\n/g," "),pe=/[^ ]/.test(ge),ve=/^ /.test(ge)&&/ $/.test(ge);return pe&&ve&&(ge=ge.substring(1,ge.length-1)),ge=R(ge,!0),{type:"codespan",raw:de[0],text:ge}}},we.br=function(fe){var de=this.rules.inline.br.exec(fe);if(de)return{type:"br",raw:de[0]}},we.del=function(fe){var de=this.rules.inline.del.exec(fe);if(de)return{type:"del",raw:de[0],text:de[2]}},we.autolink=function(fe,de){var ge=this.rules.inline.autolink.exec(fe);if(ge){var pe,ve;return ge[2]==="@"?(pe=R(this.options.mangle?de(ge[1]):ge[1]),ve="mailto:"+pe):(pe=R(ge[1]),ve=pe),{type:"link",raw:ge[0],text:pe,href:ve,tokens:[{type:"text",raw:pe,text:pe}]}}},we.url=function(fe,de){var ge;if(ge=this.rules.inline.url.exec(fe)){var pe,ve;if(ge[2]==="@")pe=R(this.options.mangle?de(ge[0]):ge[0]),ve="mailto:"+pe;else{var ke;do ke=ge[0],ge[0]=this.rules.inline._backpedal.exec(ge[0])[0];while(ke!==ge[0]);pe=R(ge[0]),ge[1]==="www."?ve="http://"+pe:ve=pe}return{type:"link",raw:ge[0],text:pe,href:ve,tokens:[{type:"text",raw:pe,text:pe}]}}},we.inlineText=function(fe,de,ge){var pe=this.rules.inline.text.exec(fe);if(pe){var ve;return de?ve=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(pe[0]):R(pe[0]):pe[0]:ve=R(this.options.smartypants?ge(pe[0]):pe[0]),{type:"text",raw:pe[0],text:ve}}},Se}(),ee=A.noopTest,se=A.edit,ne=A.merge,le={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:ee,table:ee,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,text:/^[^\n]+/};le._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,le._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,le.def=se(le.def).replace("label",le._label).replace("title",le._title).getRegex(),le.bullet=/(?:[*+-]|\d{1,9}[.)])/,le.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,le.item=se(le.item,"gm").replace(/bull/g,le.bullet).getRegex(),le.listItemStart=se(/^( *)(bull)/).replace("bull",le.bullet).getRegex(),le.list=se(le.list).replace(/bull/g,le.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+le.def.source+")").getRegex(),le._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",le._comment=/|$)/,le.html=se(le.html,"i").replace("comment",le._comment).replace("tag",le._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),le.paragraph=se(le._paragraph).replace("hr",le.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",le._tag).getRegex(),le.blockquote=se(le.blockquote).replace("paragraph",le.paragraph).getRegex(),le.normal=ne({},le),le.gfm=ne({},le.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),le.gfm.nptable=se(le.gfm.nptable).replace("hr",le.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",le._tag).getRegex(),le.gfm.table=se(le.gfm.table).replace("hr",le.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",le._tag).getRegex(),le.pedantic=ne({},le.normal,{html:se(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",le._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:ee,paragraph:se(le.normal._paragraph).replace("hr",le.hr).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",le.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var X={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:ee,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",emStrong:{lDelim:/^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,rDelimAst:/\_\_[^_]*?\*[^_]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,rDelimUnd:/\*\*[^*]*?\_[^*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:ee,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~",X.punctuation=se(X.punctuation).replace(/punctuation/g,X._punctuation).getRegex(),X.blockSkip=/\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g,X.escapedEmSt=/\\\*|\\_/g,X._comment=se(le._comment).replace("(?:-->|$)","-->").getRegex(),X.emStrong.lDelim=se(X.emStrong.lDelim).replace(/punct/g,X._punctuation).getRegex(),X.emStrong.rDelimAst=se(X.emStrong.rDelimAst,"g").replace(/punct/g,X._punctuation).getRegex(),X.emStrong.rDelimUnd=se(X.emStrong.rDelimUnd,"g").replace(/punct/g,X._punctuation).getRegex(),X._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,X._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,X._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,X.autolink=se(X.autolink).replace("scheme",X._scheme).replace("email",X._email).getRegex(),X._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,X.tag=se(X.tag).replace("comment",X._comment).replace("attribute",X._attribute).getRegex(),X._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,X._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,X._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,X.link=se(X.link).replace("label",X._label).replace("href",X._href).replace("title",X._title).getRegex(),X.reflink=se(X.reflink).replace("label",X._label).getRegex(),X.reflinkSearch=se(X.reflinkSearch,"g").replace("reflink",X.reflink).replace("nolink",X.nolink).getRegex(),X.normal=ne({},X),X.pedantic=ne({},X.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:se(/^!?\[(label)\]\((.*?)\)/).replace("label",X._label).getRegex(),reflink:se(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",X._label).getRegex()}),X.gfm=ne({},X.normal,{escape:se(X.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\.5&&(fe="x"+fe.toString(16)),we+="&#"+fe+";";return we}var oe=function(){function Se(ye){this.tokens=[],this.tokens.links=Object.create(null),this.options=ye||P,this.options.tokenizer=this.options.tokenizer||new Y,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options;var fe={block:V.normal,inline:U.normal};this.options.pedantic?(fe.block=V.pedantic,fe.inline=U.pedantic):this.options.gfm&&(fe.block=V.gfm,this.options.breaks?fe.inline=U.breaks:fe.inline=U.gfm),this.tokenizer.rules=fe}Se.lex=function(fe,de){var ge=new Se(de);return ge.lex(fe)},Se.lexInline=function(fe,de){var ge=new Se(de);return ge.inlineTokens(fe)};var we=Se.prototype;return we.lex=function(fe){return fe=fe.replace(/\r\n|\r/g,` +`).replace(/\t/g," "),this.blockTokens(fe,this.tokens,!0),this.inline(this.tokens),this.tokens},we.blockTokens=function(fe,de,ge){de===void 0&&(de=[]),ge===void 0&&(ge=!0),this.options.pedantic&&(fe=fe.replace(/^ +$/gm,""));for(var pe,ve,ke,Ne;fe;){if(pe=this.tokenizer.space(fe)){fe=fe.substring(pe.raw.length),pe.type&&de.push(pe);continue}if(pe=this.tokenizer.code(fe)){fe=fe.substring(pe.raw.length),Ne=de[de.length-1],Ne&&Ne.type==="paragraph"?(Ne.raw+=` +`+pe.raw,Ne.text+=` +`+pe.text):de.push(pe);continue}if(pe=this.tokenizer.fences(fe)){fe=fe.substring(pe.raw.length),de.push(pe);continue}if(pe=this.tokenizer.heading(fe)){fe=fe.substring(pe.raw.length),de.push(pe);continue}if(pe=this.tokenizer.nptable(fe)){fe=fe.substring(pe.raw.length),de.push(pe);continue}if(pe=this.tokenizer.hr(fe)){fe=fe.substring(pe.raw.length),de.push(pe);continue}if(pe=this.tokenizer.blockquote(fe)){fe=fe.substring(pe.raw.length),pe.tokens=this.blockTokens(pe.text,[],ge),de.push(pe);continue}if(pe=this.tokenizer.list(fe)){for(fe=fe.substring(pe.raw.length),ke=pe.items.length,ve=0;ve0)for(;(Te=this.tokenizer.rules.inline.reflinkSearch.exec(Ne))!=null;)Pe.includes(Te[0].slice(Te[0].lastIndexOf("[")+1,-1))&&(Ne=Ne.slice(0,Te.index)+"["+H("a",Te[0].length-2)+"]"+Ne.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(Te=this.tokenizer.rules.inline.blockSkip.exec(Ne))!=null;)Ne=Ne.slice(0,Te.index)+"["+H("a",Te[0].length-2)+"]"+Ne.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;(Te=this.tokenizer.rules.inline.escapedEmSt.exec(Ne))!=null;)Ne=Ne.slice(0,Te.index)+"++"+Ne.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);for(;fe;){if(Oe||(Fe=""),Oe=!1,ve=this.tokenizer.escape(fe)){fe=fe.substring(ve.raw.length),de.push(ve);continue}if(ve=this.tokenizer.tag(fe,ge,pe)){fe=fe.substring(ve.raw.length),ge=ve.inLink,pe=ve.inRawBlock;var xe=de[de.length-1];xe&&ve.type==="text"&&xe.type==="text"?(xe.raw+=ve.raw,xe.text+=ve.text):de.push(ve);continue}if(ve=this.tokenizer.link(fe)){fe=fe.substring(ve.raw.length),ve.type==="link"&&(ve.tokens=this.inlineTokens(ve.text,[],!0,pe)),de.push(ve);continue}if(ve=this.tokenizer.reflink(fe,this.tokens.links)){fe=fe.substring(ve.raw.length);var We=de[de.length-1];ve.type==="link"?(ve.tokens=this.inlineTokens(ve.text,[],!0,pe),de.push(ve)):We&&ve.type==="text"&&We.type==="text"?(We.raw+=ve.raw,We.text+=ve.text):de.push(ve);continue}if(ve=this.tokenizer.emStrong(fe,Ne,Fe)){fe=fe.substring(ve.raw.length),ve.tokens=this.inlineTokens(ve.text,[],ge,pe),de.push(ve);continue}if(ve=this.tokenizer.codespan(fe)){fe=fe.substring(ve.raw.length),de.push(ve);continue}if(ve=this.tokenizer.br(fe)){fe=fe.substring(ve.raw.length),de.push(ve);continue}if(ve=this.tokenizer.del(fe)){fe=fe.substring(ve.raw.length),ve.tokens=this.inlineTokens(ve.text,[],ge,pe),de.push(ve);continue}if(ve=this.tokenizer.autolink(fe,ie)){fe=fe.substring(ve.raw.length),de.push(ve);continue}if(!ge&&(ve=this.tokenizer.url(fe,ie))){fe=fe.substring(ve.raw.length),de.push(ve);continue}if(ve=this.tokenizer.inlineText(fe,pe,$)){fe=fe.substring(ve.raw.length),ve.raw.slice(-1)!=="_"&&(Fe=ve.raw.slice(-1)),Oe=!0,ke=de[de.length-1],ke&&ke.type==="text"?(ke.raw+=ve.raw,ke.text+=ve.text):de.push(ve);continue}if(fe){var ze="Infinite loop on byte: "+fe.charCodeAt(0);if(this.options.silent){console.error(ze);break}else throw new Error(ze)}}return de},e(Se,null,[{key:"rules",get:function(){return{block:V,inline:U}}}]),Se}(),ae=S.defaults,G=A.cleanUrl,j=A.escape,te=function(){function Se(ye){this.options=ye||ae}var we=Se.prototype;return we.code=function(fe,de,ge){var pe=(de||"").match(/\S*/)[0];if(this.options.highlight){var ve=this.options.highlight(fe,pe);ve!=null&&ve!==fe&&(ge=!0,fe=ve)}return fe=fe.replace(/\n$/,"")+` +`,pe?'
'+(ge?fe:j(fe,!0))+`
+`:"
"+(ge?fe:j(fe,!0))+`
+`},we.blockquote=function(fe){return`
+`+fe+`
+`},we.html=function(fe){return fe},we.heading=function(fe,de,ge,pe){return this.options.headerIds?"'+fe+" +`:""+fe+" +`},we.hr=function(){return this.options.xhtml?`
+`:`
+`},we.list=function(fe,de,ge){var pe=de?"ol":"ul",ve=de&&ge!==1?' start="'+ge+'"':"";return"<"+pe+ve+`> +`+fe+" +`},we.listitem=function(fe){return"
  • "+fe+`
  • +`},we.checkbox=function(fe){return" "},we.paragraph=function(fe){return"

    "+fe+`

    +`},we.table=function(fe,de){return de&&(de="

    "+de+""),`
    + +`+fe+` +`+de+`
    +`},we.tablerow=function(fe){return` +`+fe+` +`},we.tablecell=function(fe,de){var ge=de.header?"th":"td",pe=de.align?"<"+ge+' align="'+de.align+'">':"<"+ge+">";return pe+fe+" +`},we.strong=function(fe){return""+fe+""},we.em=function(fe){return""+fe+""},we.codespan=function(fe){return""+fe+""},we.br=function(){return this.options.xhtml?"
    ":"
    "},we.del=function(fe){return""+fe+""},we.link=function(fe,de,ge){if(fe=G(this.options.sanitize,this.options.baseUrl,fe),fe===null)return ge;var pe='",pe},we.image=function(fe,de,ge){if(fe=G(this.options.sanitize,this.options.baseUrl,fe),fe===null)return ge;var pe=''+ge+'":">",pe},we.text=function(fe){return fe},Se}(),Z=function(){function Se(){}var we=Se.prototype;return we.strong=function(fe){return fe},we.em=function(fe){return fe},we.codespan=function(fe){return fe},we.del=function(fe){return fe},we.html=function(fe){return fe},we.text=function(fe){return fe},we.link=function(fe,de,ge){return""+ge},we.image=function(fe,de,ge){return""+ge},we.br=function(){return""},Se}(),ue=function(){function Se(){this.seen={}}var we=Se.prototype;return we.serialize=function(fe){return fe.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},we.getNextSafeSlug=function(fe,de){var ge=fe,pe=0;if(this.seen.hasOwnProperty(ge)){pe=this.seen[fe];do pe++,ge=fe+"-"+pe;while(this.seen.hasOwnProperty(ge))}return de||(this.seen[fe]=pe,this.seen[ge]=0),ge},we.slug=function(fe,de){de===void 0&&(de={});var ge=this.serialize(fe);return this.getNextSafeSlug(ge,de.dryrun)},Se}(),he=S.defaults,re=A.unescape,ce=function(){function Se(ye){this.options=ye||he,this.options.renderer=this.options.renderer||new te,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new Z,this.slugger=new ue}Se.parse=function(fe,de){var ge=new Se(de);return ge.parse(fe)},Se.parseInline=function(fe,de){var ge=new Se(de);return ge.parseInline(fe)};var we=Se.prototype;return we.parse=function(fe,de){de===void 0&&(de=!0);var ge="",pe,ve,ke,Ne,Te,Oe,Fe,Pe,xe,We,ze,Ke,Be,He,Ve,Ue,Ye,je,Xe=fe.length;for(pe=0;pe0&&Ve.tokens[0].type==="text"?(Ve.tokens[0].text=je+" "+Ve.tokens[0].text,Ve.tokens[0].tokens&&Ve.tokens[0].tokens.length>0&&Ve.tokens[0].tokens[0].type==="text"&&(Ve.tokens[0].tokens[0].text=je+" "+Ve.tokens[0].tokens[0].text)):Ve.tokens.unshift({type:"text",text:je}):He+=je),He+=this.parse(Ve.tokens,Be),xe+=this.renderer.listitem(He,Ye,Ue);ge+=this.renderer.list(xe,ze,Ke);continue}case"html":{ge+=this.renderer.html(We.text);continue}case"paragraph":{ge+=this.renderer.paragraph(this.parseInline(We.tokens));continue}case"text":{for(xe=We.tokens?this.parseInline(We.tokens):We.text;pe+1An error occurred:

    "+be(ke.message+"",!0)+"
    ";throw ke}}Ee.options=Ee.setOptions=function(Se){return me(Ee.defaults,Se),De(Ee.defaults),Ee},Ee.getDefaults=Le,Ee.defaults=Re,Ee.use=function(Se){var we=me({},Se);if(Se.renderer&&function(){var fe=Ee.defaults.renderer||new te,de=function(ve){var ke=fe[ve];fe[ve]=function(){for(var Ne=arguments.length,Te=new Array(Ne),Oe=0;OeAn error occurred:

    "+be(fe.message+"",!0)+"
    ";throw fe}},Ee.Parser=ce,Ee.parser=ce.parse,Ee.Renderer=te,Ee.TextRenderer=Z,Ee.Lexer=oe,Ee.lexer=oe.lex,Ee.Tokenizer=Y,Ee.Slugger=ue,Ee.parse=Ee;var Ae=Ee;return Ae}),define(Q[278],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ArrayNavigator=void 0;class b{constructor(M,w=0,S=M.length,C=w-1){this.items=M,this.start=w,this.end=S,this.index=C}current(){return this.index===this.start-1||this.index===this.end?null:this.items[this.index]}next(){return this.index=Math.min(this.index+1,this.end),this.current()}previous(){return this.index=Math.max(this.index-1,this.start-1),this.current()}first(){return this.index=this.start,this.current()}last(){return this.index=this.end-1,this.current()}}e.ArrayNavigator=b}),define(Q[279],J([0,1,278]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HistoryNavigator=void 0;class N{constructor(w=[],S=10){this._initialize(w),this._limit=S,this._onChange()}add(w){this._history.delete(w),this._history.add(w),this._onChange()}next(){return this._currentPosition()!==this._elements.length-1?this._navigator.next():null}previous(){return this._currentPosition()!==0?this._navigator.previous():null}current(){return this._navigator.current()}first(){return this._navigator.first()}last(){return this._navigator.last()}has(w){return this._history.has(w)}_onChange(){this._reduceToLimit();const w=this._elements;this._navigator=new b.ArrayNavigator(w,0,w.length,w.length)}_reduceToLimit(){const w=this._elements;w.length>this._limit&&this._initialize(w.slice(w.length-this._limit))}_currentPosition(){const w=this._navigator.current();return w?this._elements.indexOf(w):-1}_initialize(w){this._history=new Set;for(const S of w)this._history.add(S)}get _elements(){const w=[];return this._history.forEach(S=>w.push(S)),w}}e.HistoryNavigator=N}),define(Q[100],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MovingAverage=e.clamp=void 0;function b(M,w,S){return Math.min(Math.max(M,w),S)}e.clamp=b;class N{constructor(){this._n=1,this._val=0}update(w){return this._val=this._val+(w-this._val)/this._n,this._n+=1,this}get value(){return this._val}}e.MovingAverage=N}),define(Q[17],J([0,1]),function(q,e){"use strict";var b;Object.defineProperty(e,"__esModule",{value:!0}),e.isLittleEndian=e.OS=e.setImmediate=e.globals=e.userAgent=e.isIOS=e.isWeb=e.isNative=e.isLinux=e.isMacintosh=e.isWindows=e.isPreferringBrowserCodeLoad=e.browserCodeLoadingCacheStrategy=e.isElectronSandboxed=void 0;const N="en";let M=!1,w=!1,S=!1,C=!1,d=!1,g=!1,p=!1,c,o=N,s,a;const u=typeof self=="object"?self:typeof global=="object"?global:{};let r;typeof process!="undefined"?r=process:typeof u.vscode!="undefined"&&(r=u.vscode.process);const i=typeof((b=r==null?void 0:r.versions)===null||b===void 0?void 0:b.electron)=="string"&&r.type==="renderer";if(e.isElectronSandboxed=i&&(r==null?void 0:r.sandboxed),e.browserCodeLoadingCacheStrategy=(()=>{if(e.isElectronSandboxed)return"bypassHeatCheck";const m=r==null?void 0:r.env.ENABLE_VSCODE_BROWSER_CODE_LOADING;if(typeof m=="string")return m==="none"||m==="code"||m==="bypassHeatCheck"||m==="bypassHeatCheckAndEagerCompile"?m:"bypassHeatCheck"})(),e.isPreferringBrowserCodeLoad=typeof e.browserCodeLoadingCacheStrategy=="string",typeof navigator=="object"&&!i)a=navigator.userAgent,M=a.indexOf("Windows")>=0,w=a.indexOf("Macintosh")>=0,p=(a.indexOf("Macintosh")>=0||a.indexOf("iPad")>=0||a.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,S=a.indexOf("Linux")>=0,g=!0,c=navigator.language,o=c;else if(typeof r=="object"){M=r.platform==="win32",w=r.platform==="darwin",S=r.platform==="linux",C=S&&!!r.env.SNAP&&!!r.env.SNAP_REVISION,c=N,o=N;const m=r.env.VSCODE_NLS_CONFIG;if(m)try{const _=JSON.parse(m),f=_.availableLanguages["*"];c=_.locale,o=f||N,s=_._translationsConfigFile}catch(_){}d=!0}else console.error("Unable to resolve platform.");let n=0;w?n=1:M?n=3:S&&(n=2),e.isWindows=M,e.isMacintosh=w,e.isLinux=S,e.isNative=d,e.isWeb=g,e.isIOS=p,e.userAgent=a,e.globals=u,e.setImmediate=function(){if(e.globals.setImmediate)return e.globals.setImmediate.bind(e.globals);if(typeof e.globals.postMessage=="function"&&!e.globals.importScripts){let f=[];e.globals.addEventListener("message",y=>{if(y.data&&y.data.vscodeSetImmediateId)for(let L=0,I=f.length;L{const L=++v;f.push({id:L,callback:y}),e.globals.postMessage({vscodeSetImmediateId:L},"*")}}if(r&&typeof r.nextTick=="function")return r.nextTick.bind(r);const _=Promise.resolve();return f=>_.then(f)}(),e.OS=w||p?2:M?1:3;let t=!0,l=!1;function h(){if(!l){l=!0;const m=new Uint8Array(2);m[0]=1,m[1]=2,t=new Uint16Array(m.buffer)[0]===(2<<8)+1}return t}e.isLittleEndian=h}),define(Q[280],J([0,1,17]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.platform=e.env=e.cwd=void 0;let N;typeof process!="undefined"?N=process:typeof b.globals.vscode!="undefined"?N={get platform(){return b.globals.vscode.process.platform},get env(){return b.globals.vscode.process.env},nextTick(M){return b.setImmediate(M)},cwd(){return b.globals.vscode.process.env.VSCODE_CWD||b.globals.vscode.process.execPath.substr(0,b.globals.vscode.process.execPath.lastIndexOf(b.globals.vscode.process.platform==="win32"?"\\":"/"))}}:N={get platform(){return b.isWindows?"win32":b.isMacintosh?"darwin":"linux"},nextTick(M){return b.setImmediate(M)},get env(){return Object.create(null)},cwd(){return"/"}},e.cwd=N.cwd,e.env=N.env,e.platform=N.platform}),define(Q[72],J([0,1,280]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.sep=e.extname=e.basename=e.dirname=e.relative=e.resolve=e.normalize=e.posix=e.win32=void 0;const N=65,M=97,w=90,S=122,C=46,d=47,g=92,p=58,c=63;class o extends Error{constructor(l,h,m){let _;typeof h=="string"&&h.indexOf("not ")===0?(_="must not be",h=h.replace(/^not /,"")):_="must be";const f=l.indexOf(".")!==-1?"property":"argument";let v=`The "${l}" ${f} ${_} of type ${h}`;v+=`. Received type ${typeof m}`,super(v),this.code="ERR_INVALID_ARG_TYPE"}}function s(t,l){if(typeof t!="string")throw new o(l,"string",t)}function a(t){return t===d||t===g}function u(t){return t===d}function r(t){return t>=N&&t<=w||t>=M&&t<=S}function i(t,l,h,m){let _="",f=0,v=-1,y=0,L=0;for(let I=0;I<=t.length;++I){if(I2){const k=_.lastIndexOf(h);k===-1?(_="",f=0):(_=_.slice(0,k),f=_.length-1-_.lastIndexOf(h)),v=I,y=0;continue}else if(_.length!==0){_="",f=0,v=I,y=0;continue}}l&&(_+=_.length>0?`${h}..`:"..",f=2)}else _.length>0?_+=`${h}${t.slice(v+1,I)}`:_=t.slice(v+1,I),f=I-v-1;v=I,y=0}else L===C&&y!==-1?++y:y=-1}return _}function n(t,l){if(l===null||typeof l!="object")throw new o("pathObject","Object",l);const h=l.dir||l.root,m=l.base||`${l.name||""}${l.ext||""}`;return h?h===l.root?`${h}${m}`:`${h}${t}${m}`:m}e.win32={resolve(...t){let l="",h="",m=!1;for(let _=t.length-1;_>=-1;_--){let f;if(_>=0){if(f=t[_],s(f,"path"),f.length===0)continue}else l.length===0?f=b.cwd():(f=b.env[`=${l}`]||b.cwd(),(f===void 0||f.slice(0,2).toLowerCase()!==l.toLowerCase()&&f.charCodeAt(2)===g)&&(f=`${l}\\`));const v=f.length;let y=0,L="",I=!1;const k=f.charCodeAt(0);if(v===1)a(k)&&(y=1,I=!0);else if(a(k))if(I=!0,a(f.charCodeAt(1))){let E=2,T=E;for(;E2&&a(f.charCodeAt(2))&&(I=!0,y=3));if(L.length>0)if(l.length>0){if(L.toLowerCase()!==l.toLowerCase())continue}else l=L;if(m){if(l.length>0)break}else if(h=`${f.slice(y)}\\${h}`,m=I,I&&l.length>0)break}return h=i(h,!m,"\\",a),m?`${l}\\${h}`:`${l}${h}`||"."},normalize(t){s(t,"path");const l=t.length;if(l===0)return".";let h=0,m,_=!1;const f=t.charCodeAt(0);if(l===1)return u(f)?"\\":t;if(a(f))if(_=!0,a(t.charCodeAt(1))){let y=2,L=y;for(;y2&&a(t.charCodeAt(2))&&(_=!0,h=3));let v=h0&&a(t.charCodeAt(l-1))&&(v+="\\"),m===void 0?_?`\\${v}`:v:_?`${m}\\${v}`:`${m}${v}`},isAbsolute(t){s(t,"path");const l=t.length;if(l===0)return!1;const h=t.charCodeAt(0);return a(h)||l>2&&r(h)&&t.charCodeAt(1)===p&&a(t.charCodeAt(2))},join(...t){if(t.length===0)return".";let l,h;for(let f=0;f0&&(l===void 0?l=h=v:l+=`\\${v}`)}if(l===void 0)return".";let m=!0,_=0;if(typeof h=="string"&&a(h.charCodeAt(0))){++_;const f=h.length;f>1&&a(h.charCodeAt(1))&&(++_,f>2&&(a(h.charCodeAt(2))?++_:m=!1))}if(m){for(;_=2&&(l=`\\${l.slice(_)}`)}return e.win32.normalize(l)},relative(t,l){if(s(t,"from"),s(l,"to"),t===l)return"";const h=e.win32.resolve(t),m=e.win32.resolve(l);if(h===m||(t=h.toLowerCase(),l=m.toLowerCase(),t===l))return"";let _=0;for(;__&&t.charCodeAt(f-1)===g;)f--;const v=f-_;let y=0;for(;yy&&l.charCodeAt(L-1)===g;)L--;const I=L-y,k=vk){if(l.charCodeAt(y+T)===g)return m.slice(y+T+1);if(T===2)return m.slice(y+T)}v>k&&(t.charCodeAt(_+T)===g?E=T:T===2&&(E=3)),E===-1&&(E=0)}let O="";for(T=_+E+1;T<=f;++T)(T===f||t.charCodeAt(T)===g)&&(O+=O.length===0?"..":"\\..");return y+=E,O.length>0?`${O}${m.slice(y,L)}`:(m.charCodeAt(y)===g&&++y,m.slice(y,L))},toNamespacedPath(t){if(typeof t!="string")return t;if(t.length===0)return"";const l=e.win32.resolve(t);if(l.length<=2)return t;if(l.charCodeAt(0)===g){if(l.charCodeAt(1)===g){const h=l.charCodeAt(2);if(h!==c&&h!==C)return`\\\\?\\UNC\\${l.slice(2)}`}}else if(r(l.charCodeAt(0))&&l.charCodeAt(1)===p&&l.charCodeAt(2)===g)return`\\\\?\\${l}`;return t},dirname(t){s(t,"path");const l=t.length;if(l===0)return".";let h=-1,m=0;const _=t.charCodeAt(0);if(l===1)return a(_)?t:".";if(a(_)){if(h=m=1,a(t.charCodeAt(1))){let y=2,L=y;for(;y2&&a(t.charCodeAt(2))?3:2,m=h);let f=-1,v=!0;for(let y=l-1;y>=m;--y)if(a(t.charCodeAt(y))){if(!v){f=y;break}}else v=!1;if(f===-1){if(h===-1)return".";f=h}return t.slice(0,f)},basename(t,l){l!==void 0&&s(l,"ext"),s(t,"path");let h=0,m=-1,_=!0,f;if(t.length>=2&&r(t.charCodeAt(0))&&t.charCodeAt(1)===p&&(h=2),l!==void 0&&l.length>0&&l.length<=t.length){if(l===t)return"";let v=l.length-1,y=-1;for(f=t.length-1;f>=h;--f){const L=t.charCodeAt(f);if(a(L)){if(!_){h=f+1;break}}else y===-1&&(_=!1,y=f+1),v>=0&&(L===l.charCodeAt(v)?--v==-1&&(m=f):(v=-1,m=y))}return h===m?m=y:m===-1&&(m=t.length),t.slice(h,m)}for(f=t.length-1;f>=h;--f)if(a(t.charCodeAt(f))){if(!_){h=f+1;break}}else m===-1&&(_=!1,m=f+1);return m===-1?"":t.slice(h,m)},extname(t){s(t,"path");let l=0,h=-1,m=0,_=-1,f=!0,v=0;t.length>=2&&t.charCodeAt(1)===p&&r(t.charCodeAt(0))&&(l=m=2);for(let y=t.length-1;y>=l;--y){const L=t.charCodeAt(y);if(a(L)){if(!f){m=y+1;break}continue}_===-1&&(f=!1,_=y+1),L===C?h===-1?h=y:v!==1&&(v=1):h!==-1&&(v=-1)}return h===-1||_===-1||v===0||v===1&&h===_-1&&h===m+1?"":t.slice(h,_)},format:n.bind(null,"\\"),parse(t){s(t,"path");const l={root:"",dir:"",base:"",ext:"",name:""};if(t.length===0)return l;const h=t.length;let m=0,_=t.charCodeAt(0);if(h===1)return a(_)?(l.root=l.dir=t,l):(l.base=l.name=t,l);if(a(_)){if(m=1,a(t.charCodeAt(1))){let E=2,T=E;for(;E0&&(l.root=t.slice(0,m));let f=-1,v=m,y=-1,L=!0,I=t.length-1,k=0;for(;I>=m;--I){if(_=t.charCodeAt(I),a(_)){if(!L){v=I+1;break}continue}y===-1&&(L=!1,y=I+1),_===C?f===-1?f=I:k!==1&&(k=1):f!==-1&&(k=-1)}return y!==-1&&(f===-1||k===0||k===1&&f===y-1&&f===v+1?l.base=l.name=t.slice(v,y):(l.name=t.slice(v,f),l.base=t.slice(v,y),l.ext=t.slice(f,y))),v>0&&v!==m?l.dir=t.slice(0,v-1):l.dir=l.root,l},sep:"\\",delimiter:";",win32:null,posix:null},e.posix={resolve(...t){let l="",h=!1;for(let m=t.length-1;m>=-1&&!h;m--){const _=m>=0?t[m]:b.cwd();s(_,"path"),_.length!==0&&(l=`${_}/${l}`,h=_.charCodeAt(0)===d)}return l=i(l,!h,"/",u),h?`/${l}`:l.length>0?l:"."},normalize(t){if(s(t,"path"),t.length===0)return".";const l=t.charCodeAt(0)===d,h=t.charCodeAt(t.length-1)===d;return t=i(t,!l,"/",u),t.length===0?l?"/":h?"./":".":(h&&(t+="/"),l?`/${t}`:t)},isAbsolute(t){return s(t,"path"),t.length>0&&t.charCodeAt(0)===d},join(...t){if(t.length===0)return".";let l;for(let h=0;h0&&(l===void 0?l=m:l+=`/${m}`)}return l===void 0?".":e.posix.normalize(l)},relative(t,l){if(s(t,"from"),s(l,"to"),t===l||(t=e.posix.resolve(t),l=e.posix.resolve(l),t===l))return"";const h=1,m=t.length,_=m-h,f=1,v=l.length-f,y=_y){if(l.charCodeAt(f+I)===d)return l.slice(f+I+1);if(I===0)return l.slice(f+I)}else _>y&&(t.charCodeAt(h+I)===d?L=I:I===0&&(L=0));let k="";for(I=h+L+1;I<=m;++I)(I===m||t.charCodeAt(I)===d)&&(k+=k.length===0?"..":"/..");return`${k}${l.slice(f+L)}`},toNamespacedPath(t){return t},dirname(t){if(s(t,"path"),t.length===0)return".";const l=t.charCodeAt(0)===d;let h=-1,m=!0;for(let _=t.length-1;_>=1;--_)if(t.charCodeAt(_)===d){if(!m){h=_;break}}else m=!1;return h===-1?l?"/":".":l&&h===1?"//":t.slice(0,h)},basename(t,l){l!==void 0&&s(l,"ext"),s(t,"path");let h=0,m=-1,_=!0,f;if(l!==void 0&&l.length>0&&l.length<=t.length){if(l===t)return"";let v=l.length-1,y=-1;for(f=t.length-1;f>=0;--f){const L=t.charCodeAt(f);if(L===d){if(!_){h=f+1;break}}else y===-1&&(_=!1,y=f+1),v>=0&&(L===l.charCodeAt(v)?--v==-1&&(m=f):(v=-1,m=y))}return h===m?m=y:m===-1&&(m=t.length),t.slice(h,m)}for(f=t.length-1;f>=0;--f)if(t.charCodeAt(f)===d){if(!_){h=f+1;break}}else m===-1&&(_=!1,m=f+1);return m===-1?"":t.slice(h,m)},extname(t){s(t,"path");let l=-1,h=0,m=-1,_=!0,f=0;for(let v=t.length-1;v>=0;--v){const y=t.charCodeAt(v);if(y===d){if(!_){h=v+1;break}continue}m===-1&&(_=!1,m=v+1),y===C?l===-1?l=v:f!==1&&(f=1):l!==-1&&(f=-1)}return l===-1||m===-1||f===0||f===1&&l===m-1&&l===h+1?"":t.slice(l,m)},format:n.bind(null,"/"),parse(t){s(t,"path");const l={root:"",dir:"",base:"",ext:"",name:""};if(t.length===0)return l;const h=t.charCodeAt(0)===d;let m;h?(l.root="/",m=1):m=0;let _=-1,f=0,v=-1,y=!0,L=t.length-1,I=0;for(;L>=m;--L){const k=t.charCodeAt(L);if(k===d){if(!y){f=L+1;break}continue}v===-1&&(y=!1,v=L+1),k===C?_===-1?_=L:I!==1&&(I=1):_!==-1&&(I=-1)}if(v!==-1){const k=f===0&&h?1:f;_===-1||I===0||I===1&&_===v-1&&_===f+1?l.base=l.name=t.slice(k,v):(l.name=t.slice(k,_),l.base=t.slice(k,v),l.ext=t.slice(_,v))}return f>0?l.dir=t.slice(0,f-1):h&&(l.dir="/"),l},sep:"/",delimiter:":",win32:null,posix:null},e.posix.win32=e.win32.win32=e.win32,e.posix.posix=e.win32.posix=e.posix,e.normalize=b.platform==="win32"?e.win32.normalize:e.posix.normalize,e.resolve=b.platform==="win32"?e.win32.resolve:e.posix.resolve,e.relative=b.platform==="win32"?e.win32.relative:e.posix.relative,e.dirname=b.platform==="win32"?e.win32.dirname:e.posix.dirname,e.basename=b.platform==="win32"?e.win32.basename:e.posix.basename,e.extname=b.platform==="win32"?e.win32.extname:e.posix.extname,e.sep=b.platform==="win32"?e.win32.sep:e.posix.sep}),define(Q[120],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Range=void 0;var b;(function(N){function M(d,g){if(d.start>=g.end||g.start>=d.end)return{start:0,end:0};const p=Math.max(d.start,g.start),c=Math.min(d.end,g.end);return c-p<=0?{start:0,end:0}:{start:p,end:c}}N.intersect=M;function w(d){return d.end-d.start<=0}N.isEmpty=w;function S(d,g){return!w(M(d,g))}N.intersects=S;function C(d,g){const p=[],c={start:d.start,end:Math.min(g.start,d.end)},o={start:Math.max(g.end,d.start),end:d.end};return w(c)||p.push(c),w(o)||p.push(o),p}N.relativeComplement=C})(b=e.Range||(e.Range={}))}),define(Q[281],J([0,1,120]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RangeMap=e.consolidate=e.shift=e.groupIntersect=void 0;function N(d,g){const p=[];for(let c of g)if(!(d.start>=c.range.end)){if(d.endg.concat(p),[]))}class C{constructor(){this.groups=[],this._size=0}splice(g,p,c=[]){const o=c.length-p,s=N({start:0,end:g},this.groups),a=N({start:g+p,end:Number.POSITIVE_INFINITY},this.groups).map(r=>({range:M(r.range,o),size:r.size})),u=c.map((r,i)=>({range:{start:g+i,end:g+i+1},size:r.size}));this.groups=S(s,u,a),this._size=this.groups.reduce((r,i)=>r+i.size*(i.range.end-i.range.start),0)}get count(){const g=this.groups.length;return g?this.groups[g-1].range.end:0}get size(){return this._size}indexAt(g){if(g<0)return-1;let p=0,c=0;for(let o of this.groups){const s=o.range.end-o.range.start,a=c+s*o.size;if(gN.Disposable.None;function u(A){return(B,F=null,D)=>{let R=!1,W;return W=A(x=>{if(!R)return W?W.dispose():R=!0,B.call(F,x)},null,D),R&&W.dispose(),W}}a.once=u;function r(A,B){return m((F,D=null,R)=>A(W=>F.call(D,B(W)),null,R))}a.map=r;function i(A,B){return m((F,D=null,R)=>A(W=>{B(W),F.call(D,W)},null,R))}a.forEach=i;function n(A,B){return m((F,D=null,R)=>A(W=>B(W)&&F.call(D,W),null,R))}a.filter=n;function t(A){return A}a.signal=t;function l(...A){return(B,F=null,D)=>N.combinedDisposable(...A.map(R=>R(W=>B.call(F,W),null,D)))}a.any=l;function h(A,B,F){let D=F;return r(A,R=>(D=B(D,R),D))}a.reduce=h;function m(A){let B;const F=new p({onFirstListenerAdd(){B=A(F.fire,F)},onLastListenerRemove(){B.dispose()}});return F.event}a.snapshot=m;function _(A,B,F=100,D=!1,R){let W,x,K,Y=0;const ee=new p({leakWarningThreshold:R,onFirstListenerAdd(){W=A(se=>{Y++,x=B(x,se),D&&!K&&(ee.fire(x),x=void 0),clearTimeout(K),K=setTimeout(()=>{const ne=x;x=void 0,K=void 0,(!D||Y>1)&&ee.fire(ne),Y=0},F)})},onLastListenerRemove(){W.dispose()}});return ee.event}a.debounce=_;function f(A){const B=new Date().getTime();return r(u(A),F=>new Date().getTime()-B)}a.stopwatch=f;function v(A){let B=!0,F;return n(A,D=>{const R=B||D!==F;return B=!1,F=D,R})}a.latch=v;function y(A,B=!1,F=[]){let D=F.slice(),R=A(K=>{D?D.push(K):x.fire(K)});const W=()=>{D&&D.forEach(K=>x.fire(K)),D=null},x=new p({onFirstListenerAdd(){R||(R=A(K=>x.fire(K)))},onFirstListenerDidAdd(){D&&(B?setTimeout(W):W())},onLastListenerRemove(){R&&R.dispose(),R=null}});return x.event}a.buffer=y;class L{constructor(B){this.event=B}map(B){return new L(r(this.event,B))}forEach(B){return new L(i(this.event,B))}filter(B){return new L(n(this.event,B))}reduce(B,F){return new L(h(this.event,B,F))}latch(){return new L(v(this.event))}debounce(B,F=100,D=!1,R){return new L(_(this.event,B,F,D,R))}on(B,F,D){return this.event(B,F,D)}once(B,F,D){return u(this.event)(B,F,D)}}function I(A){return new L(A)}a.chain=I;function k(A,B,F=D=>D){const D=(...K)=>x.fire(F(...K)),R=()=>A.on(B,D),W=()=>A.removeListener(B,D),x=new p({onFirstListenerAdd:R,onLastListenerRemove:W});return x.event}a.fromNodeEventEmitter=k;function E(A,B,F=D=>D){const D=(...K)=>x.fire(F(...K)),R=()=>A.addEventListener(B,D),W=()=>A.removeEventListener(B,D),x=new p({onFirstListenerAdd:R,onLastListenerRemove:W});return x.event}a.fromDOMEventEmitter=E;function T(A){const B=new p;let F=!1;return A.then(void 0,()=>null).then(()=>{F?B.fire(void 0):setTimeout(()=>B.fire(void 0),0)}),F=!0,B.event}a.fromPromise=T;function O(A){return new Promise(B=>u(A)(B))}a.toPromise=O})(S=e.Event||(e.Event={}));class C{constructor(u){this._listenerCount=0,this._invocationCount=0,this._elapsedOverall=0,this._name=`${u}_${C._idPool++}`}start(u){this._stopWatch=new w.StopWatch(!0),this._listenerCount=u}stop(){if(this._stopWatch){const u=this._stopWatch.elapsed();this._elapsedOverall+=u,this._invocationCount+=1,console.info(`did FIRE ${this._name}: elapsed_ms: ${u.toFixed(5)}, listener: ${this._listenerCount} (elapsed_overall: ${this._elapsedOverall.toFixed(2)}, invocations: ${this._invocationCount})`),this._stopWatch=void 0}}}C._idPool=0;let d=-1;class g{constructor(u,r=Math.random().toString(18).slice(2,5)){this.customThreshold=u,this.name=r,this._warnCountdown=0}dispose(){this._stacks&&this._stacks.clear()}check(u){let r=d;if(typeof this.customThreshold=="number"&&(r=this.customThreshold),!(r<=0||u{const t=this._stacks.get(i)||0;this._stacks.set(i,t-1)}}}}class p{constructor(u){var r;this._disposed=!1,this._options=u,this._leakageMon=d>0?new g(this._options&&this._options.leakWarningThreshold):void 0,this._perfMon=((r=this._options)===null||r===void 0?void 0:r._profName)?new C(this._options._profName):void 0}get event(){return this._event||(this._event=(u,r,i)=>{var n;this._listeners||(this._listeners=new M.LinkedList);const t=this._listeners.isEmpty();t&&this._options&&this._options.onFirstListenerAdd&&this._options.onFirstListenerAdd(this);const l=this._listeners.push(r?[u,r]:u);t&&this._options&&this._options.onFirstListenerDidAdd&&this._options.onFirstListenerDidAdd(this),this._options&&this._options.onListenerDidAdd&&this._options.onListenerDidAdd(this,u,r);const h=(n=this._leakageMon)===null||n===void 0?void 0:n.check(this._listeners.size);let m;return m={dispose:()=>{h&&h(),m.dispose=p._noop,this._disposed||(l(),this._options&&this._options.onLastListenerRemove&&(this._listeners&&!this._listeners.isEmpty()||this._options.onLastListenerRemove(this)))}},i instanceof N.DisposableStore?i.add(m):Array.isArray(i)&&i.push(m),m}),this._event}fire(u){var r,i;if(this._listeners){this._deliveryQueue||(this._deliveryQueue=new M.LinkedList);for(let n of this._listeners)this._deliveryQueue.push([n,u]);for((r=this._perfMon)===null||r===void 0||r.start(this._deliveryQueue.size);this._deliveryQueue.size>0;){const[n,t]=this._deliveryQueue.shift();try{typeof n=="function"?n.call(void 0,t):n[0].call(n[1],t)}catch(l){b.onUnexpectedError(l)}}(i=this._perfMon)===null||i===void 0||i.stop()}}dispose(){var u,r,i;(u=this._listeners)===null||u===void 0||u.clear(),(r=this._deliveryQueue)===null||r===void 0||r.clear(),(i=this._leakageMon)===null||i===void 0||i.dispose(),this._disposed=!0}}e.Emitter=p,p._noop=function(){};class c extends p{constructor(u){super(u);this._isPaused=0,this._eventQueue=new M.LinkedList,this._mergeFn=u==null?void 0:u.merge}pause(){this._isPaused++}resume(){if(this._isPaused!==0&&--this._isPaused==0)if(this._mergeFn){const u=Array.from(this._eventQueue);this._eventQueue.clear(),super.fire(this._mergeFn(u))}else for(;!this._isPaused&&this._eventQueue.size!==0;)super.fire(this._eventQueue.shift())}fire(u){this._listeners&&(this._isPaused!==0?this._eventQueue.push(u):super.fire(u))}}e.PauseableEmitter=c;class o{constructor(){this.buffers=[]}wrapEvent(u){return(r,i,n)=>u(t=>{const l=this.buffers[this.buffers.length-1];l?l.push(()=>r.call(i,t)):r.call(i,t)},void 0,n)}bufferEvents(u){const r=[];this.buffers.push(r);const i=u();return this.buffers.pop(),r.forEach(n=>n()),i}}e.EventBufferer=o;class s{constructor(){this.listening=!1,this.inputEvent=S.None,this.inputEventListener=N.Disposable.None,this.emitter=new p({onFirstListenerDidAdd:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onLastListenerRemove:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(u){this.inputEvent=u,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=u(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}e.Relay=s}),define(Q[35],J([0,1,6]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isStandalone=e.isAndroid=e.isElectron=e.isEdgeLegacyWebView=e.isIPad=e.isWebkitWebView=e.isSafari=e.isChrome=e.isWebKit=e.isFirefox=e.getPixelRatio=e.getZoomFactor=e.onDidChangeZoomLevel=e.getTimeSinceLastZoomLevelChanged=e.getZoomLevel=void 0;class N{constructor(){this._zoomLevel=0,this._lastZoomLevelChangeTime=0,this._onDidChangeZoomLevel=new b.Emitter,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event,this._zoomFactor=1}getZoomLevel(){return this._zoomLevel}getTimeSinceLastZoomLevelChanged(){return Date.now()-this._lastZoomLevelChangeTime}getZoomFactor(){return this._zoomFactor}getPixelRatio(){let c=document.createElement("canvas").getContext("2d"),o=window.devicePixelRatio||1,s=c.webkitBackingStorePixelRatio||c.mozBackingStorePixelRatio||c.msBackingStorePixelRatio||c.oBackingStorePixelRatio||c.backingStorePixelRatio||1;return o/s}}N.INSTANCE=new N;function M(){return N.INSTANCE.getZoomLevel()}e.getZoomLevel=M;function w(){return N.INSTANCE.getTimeSinceLastZoomLevelChanged()}e.getTimeSinceLastZoomLevelChanged=w;function S(p){return N.INSTANCE.onDidChangeZoomLevel(p)}e.onDidChangeZoomLevel=S;function C(){return N.INSTANCE.getZoomFactor()}e.getZoomFactor=C;function d(){return N.INSTANCE.getPixelRatio()}e.getPixelRatio=d;const g=navigator.userAgent;e.isFirefox=g.indexOf("Firefox")>=0,e.isWebKit=g.indexOf("AppleWebKit")>=0,e.isChrome=g.indexOf("Chrome")>=0,e.isSafari=!e.isChrome&&g.indexOf("Safari")>=0,e.isWebkitWebView=!e.isChrome&&!e.isSafari&&e.isWebKit,e.isIPad=g.indexOf("iPad")>=0||e.isSafari&&navigator.maxTouchPoints>0,e.isEdgeLegacyWebView=g.indexOf("Edge/")>=0&&g.indexOf("WebView/")>=0,e.isElectron=g.indexOf("Electron/")>=0,e.isAndroid=g.indexOf("Android")>=0,e.isStandalone=window.matchMedia&&window.matchMedia("(display-mode: standalone)").matches}),define(Q[151],J([0,1,35,17]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BrowserFeatures=void 0,e.BrowserFeatures={clipboard:{writeText:N.isNative||document.queryCommandSupported&&document.queryCommandSupported("copy")||!!(navigator&&navigator.clipboard&&navigator.clipboard.writeText),readText:N.isNative||!!(navigator&&navigator.clipboard&&navigator.clipboard.readText)},keyboard:(()=>N.isNative||b.isStandalone?0:navigator.keyboard||b.isSafari?1:2)(),touch:"ontouchstart"in window||navigator.maxTouchPoints>0||window.navigator.msMaxTouchPoints>0,pointerEvents:window.PointerEvent&&("ontouchstart"in window||window.navigator.maxTouchPoints>0||navigator.maxTouchPoints>0||window.navigator.msMaxTouchPoints>0)}}),define(Q[55],J([0,1,6]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.stop=e.stopEvent=e.domEvent=void 0;const N=(S,C,d)=>{const g=c=>p.fire(c),p=new b.Emitter({onFirstListenerAdd:()=>{S.addEventListener(C,g,d)},onLastListenerRemove:()=>{S.removeEventListener(C,g,d)}});return p.event};e.domEvent=N;function M(S){return S.preventDefault(),S.stopPropagation(),S}e.stopEvent=M;function w(S){return b.Event.map(S,M)}e.stop=w}),define(Q[56],J([0,1,35,39,17]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandardKeyboardEvent=void 0;let w=new Array(230),S=new Array(112);(function(){for(let a=0;a{l.token.onCancellationRequested(()=>{f(N.canceled())}),Promise.resolve(h).then(v=>{l.dispose(),_(v)},v=>{l.dispose(),f(v)})});return new class{cancel(){l.cancel()}then(_,f){return m.then(_,f)}catch(_){return this.then(void 0,_)}finally(_){return m.finally(_)}}}e.createCancelablePromise=S;function C(t,l,h){return Promise.race([t,new Promise(m=>l.onCancellationRequested(()=>m(h)))])}e.raceCancellation=C;class d{constructor(){this.activePromise=null,this.queuedPromise=null,this.queuedPromiseFactory=null}queue(l){if(this.activePromise){if(this.queuedPromiseFactory=l,!this.queuedPromise){const h=()=>{this.queuedPromise=null;const m=this.queue(this.queuedPromiseFactory);return this.queuedPromiseFactory=null,m};this.queuedPromise=new Promise(m=>{this.activePromise.then(h,h).then(m)})}return new Promise((h,m)=>{this.queuedPromise.then(h,m)})}return this.activePromise=l(),new Promise((h,m)=>{this.activePromise.then(_=>{this.activePromise=null,h(_)},_=>{this.activePromise=null,m(_)})})}}e.Throttler=d;class g{constructor(l){this.defaultDelay=l,this.timeout=null,this.completionPromise=null,this.doResolve=null,this.doReject=null,this.task=null}trigger(l,h=this.defaultDelay){return this.task=l,this.cancelTimeout(),this.completionPromise||(this.completionPromise=new Promise((m,_)=>{this.doResolve=m,this.doReject=_}).then(()=>{if(this.completionPromise=null,this.doResolve=null,this.task){const m=this.task;return this.task=null,m()}})),this.timeout=setTimeout(()=>{this.timeout=null,this.doResolve&&this.doResolve(null)},h),this.completionPromise}isTriggered(){return this.timeout!==null}cancel(){this.cancelTimeout(),this.completionPromise&&(this.doReject&&this.doReject(N.canceled()),this.completionPromise=null)}cancelTimeout(){this.timeout!==null&&(clearTimeout(this.timeout),this.timeout=null)}dispose(){this.cancelTimeout()}}e.Delayer=g;class p{constructor(l){this.delayer=new g(l),this.throttler=new d}trigger(l,h){return this.delayer.trigger(()=>this.throttler.queue(l),h)}cancel(){this.delayer.cancel()}dispose(){this.delayer.dispose()}}e.ThrottledDelayer=p;function c(t,l){return l?new Promise((h,m)=>{const _=setTimeout(h,t);l.onCancellationRequested(()=>{clearTimeout(_),m(N.canceled())})}):S(h=>c(t,h))}e.timeout=c;function o(t,l=0){const h=setTimeout(t,l);return M.toDisposable(()=>clearTimeout(h))}e.disposableTimeout=o;function s(t,l=m=>!!m,h=null){let m=0;const _=t.length,f=()=>{if(m>=_)return Promise.resolve(h);const v=t[m++];return Promise.resolve(v()).then(L=>l(L)?Promise.resolve(L):f())};return f()}e.first=s;class a{constructor(l,h){this._token=-1,typeof l=="function"&&typeof h=="number"&&this.setIfNotSet(l,h)}dispose(){this.cancel()}cancel(){this._token!==-1&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(l,h){this.cancel(),this._token=setTimeout(()=>{this._token=-1,l()},h)}setIfNotSet(l,h){this._token===-1&&(this._token=setTimeout(()=>{this._token=-1,l()},h))}}e.TimeoutTimer=a;class u{constructor(){this._token=-1}dispose(){this.cancel()}cancel(){this._token!==-1&&(clearInterval(this._token),this._token=-1)}cancelAndSet(l,h){this.cancel(),this._token=setInterval(()=>{l()},h)}}e.IntervalTimer=u;class r{constructor(l,h){this.timeoutToken=-1,this.runner=l,this.timeout=h,this.timeoutHandler=this.onTimeout.bind(this)}dispose(){this.cancel(),this.runner=null}cancel(){this.isScheduled()&&(clearTimeout(this.timeoutToken),this.timeoutToken=-1)}schedule(l=this.timeout){this.cancel(),this.timeoutToken=setTimeout(this.timeoutHandler,l)}get delay(){return this.timeout}set delay(l){this.timeout=l}isScheduled(){return this.timeoutToken!==-1}onTimeout(){this.timeoutToken=-1,this.runner&&this.doRun()}doRun(){this.runner&&this.runner()}}e.RunOnceScheduler=r,function(){if(typeof requestIdleCallback!="function"||typeof cancelIdleCallback!="function"){const t=Object.freeze({didTimeout:!0,timeRemaining(){return 15}});e.runWhenIdle=l=>{const h=setTimeout(()=>l(t));let m=!1;return{dispose(){m||(m=!0,clearTimeout(h))}}}}else e.runWhenIdle=(t,l)=>{const h=requestIdleCallback(t,typeof l=="number"?{timeout:l}:void 0);let m=!1;return{dispose(){m||(m=!0,cancelIdleCallback(h))}}}}();class i{constructor(l){this._didRun=!1,this._executor=()=>{try{this._value=l()}catch(h){this._error=h}finally{this._didRun=!0}},this._handle=e.runWhenIdle(()=>this._executor())}dispose(){this._handle.dispose()}get value(){if(this._didRun||(this._handle.dispose(),this._executor()),this._error)throw this._error;return this._value}}e.IdleValue=i;var n;(function(t){function l(f){return Ie(this,void 0,void 0,function*(){return typeof Promise.allSettled=="function"?h(f):m(f)})}t.allSettled=l;function h(f){return Ie(this,void 0,void 0,function*(){return Promise.allSettled(f)})}function m(f){return Ie(this,void 0,void 0,function*(){return Promise.all(f.map(v=>v.then(y=>({status:"fulfilled",value:y}),y=>({status:"rejected",reason:y}))))})}function _(f){return Ie(this,void 0,void 0,function*(){let v;const y=yield Promise.all(f.map(L=>L.then(I=>I,I=>{v||(v=I)})));if(typeof v!="undefined")throw v;return y})}t.settled=_})(n=e.Promises||(e.Promises={}))}),define(Q[282],J([0,1,15,2]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollbarVisibilityController=void 0;class M extends N.Disposable{constructor(S,C,d){super();this._visibility=S,this._visibleClassName=C,this._invisibleClassName=d,this._domNode=null,this._isVisible=!1,this._isNeeded=!1,this._shouldBeVisible=!1,this._revealTimer=this._register(new b.TimeoutTimer)}applyVisibilitySetting(S){return this._visibility===2?!1:this._visibility===3?!0:S}setShouldBeVisible(S){const C=this.applyVisibilitySetting(S);this._shouldBeVisible!==C&&(this._shouldBeVisible=C,this.ensureVisibility())}setIsNeeded(S){this._isNeeded!==S&&(this._isNeeded=S,this.ensureVisibility())}setDomNode(S){this._domNode=S,this._domNode.setClassName(this._invisibleClassName),this.setShouldBeVisible(!1)}ensureVisibility(){if(!this._isNeeded){this._hide(!1);return}this._shouldBeVisible?this._reveal():this._hide(!0)}_reveal(){this._isVisible||(this._isVisible=!0,this._revealTimer.setIfNotSet(()=>{this._domNode&&this._domNode.setClassName(this._visibleClassName)},0))}_hide(S){this._revealTimer.cancel(),!!this._isVisible&&(this._isVisible=!1,this._domNode&&this._domNode.setClassName(this._invisibleClassName+(S?" fade":"")))}}e.ScrollbarVisibilityController=M}),define(Q[27],J([0,1,6]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CSSIcon=e.Codicon=e.registerCodicon=e.iconRegistry=void 0;class N{constructor(){this._icons=new Map,this._onDidRegister=new b.Emitter}add(g){const p=this._icons.get(g.id);p?g.description?p.description=g.description:console.error(`Duplicate registration of codicon ${g.id}`):(this._icons.set(g.id,g),this._onDidRegister.fire(g))}get(g){return this._icons.get(g)}get all(){return this._icons.values()}get onDidRegister(){return this._onDidRegister.event}}const M=new N;e.iconRegistry=M;function w(d,g){return new S(d,g)}e.registerCodicon=w;class S{constructor(g,p,c){this.id=g,this.definition=p,this.description=c,M.add(this)}get classNames(){return"codicon codicon-"+this.id}get classNamesArray(){return["codicon","codicon-"+this.id]}get cssSelector(){return".codicon.codicon-"+this.id}}e.Codicon=S;var C;(function(d){d.iconNameSegment="[A-Za-z0-9]+",d.iconNameExpression="[A-Za-z0-9\\-]+",d.iconModifierExpression="~[A-Za-z]+";const g=new RegExp(`^(${d.iconNameExpression})(${d.iconModifierExpression})?$`);function p(s){if(s instanceof S)return["codicon","codicon-"+s.id];const a=g.exec(s.id);if(!a)return p(S.error);let[,u,r]=a;const i=["codicon","codicon-"+u];return r&&i.push("codicon-modifier-"+r.substr(1)),i}d.asClassNameArray=p;function c(s){return p(s).join(" ")}d.asClassName=c;function o(s){return"."+p(s).join(".")}d.asCSSSelector=o})(C=e.CSSIcon||(e.CSSIcon={})),function(d){d.add=new d("add",{fontCharacter:"\\ea60"}),d.plus=new d("plus",{fontCharacter:"\\ea60"}),d.gistNew=new d("gist-new",{fontCharacter:"\\ea60"}),d.repoCreate=new d("repo-create",{fontCharacter:"\\ea60"}),d.lightbulb=new d("lightbulb",{fontCharacter:"\\ea61"}),d.lightBulb=new d("light-bulb",{fontCharacter:"\\ea61"}),d.repo=new d("repo",{fontCharacter:"\\ea62"}),d.repoDelete=new d("repo-delete",{fontCharacter:"\\ea62"}),d.gistFork=new d("gist-fork",{fontCharacter:"\\ea63"}),d.repoForked=new d("repo-forked",{fontCharacter:"\\ea63"}),d.gitPullRequest=new d("git-pull-request",{fontCharacter:"\\ea64"}),d.gitPullRequestAbandoned=new d("git-pull-request-abandoned",{fontCharacter:"\\ea64"}),d.recordKeys=new d("record-keys",{fontCharacter:"\\ea65"}),d.keyboard=new d("keyboard",{fontCharacter:"\\ea65"}),d.tag=new d("tag",{fontCharacter:"\\ea66"}),d.tagAdd=new d("tag-add",{fontCharacter:"\\ea66"}),d.tagRemove=new d("tag-remove",{fontCharacter:"\\ea66"}),d.person=new d("person",{fontCharacter:"\\ea67"}),d.personAdd=new d("person-add",{fontCharacter:"\\ea67"}),d.personFollow=new d("person-follow",{fontCharacter:"\\ea67"}),d.personOutline=new d("person-outline",{fontCharacter:"\\ea67"}),d.personFilled=new d("person-filled",{fontCharacter:"\\ea67"}),d.gitBranch=new d("git-branch",{fontCharacter:"\\ea68"}),d.gitBranchCreate=new d("git-branch-create",{fontCharacter:"\\ea68"}),d.gitBranchDelete=new d("git-branch-delete",{fontCharacter:"\\ea68"}),d.sourceControl=new d("source-control",{fontCharacter:"\\ea68"}),d.mirror=new d("mirror",{fontCharacter:"\\ea69"}),d.mirrorPublic=new d("mirror-public",{fontCharacter:"\\ea69"}),d.star=new d("star",{fontCharacter:"\\ea6a"}),d.starAdd=new d("star-add",{fontCharacter:"\\ea6a"}),d.starDelete=new d("star-delete",{fontCharacter:"\\ea6a"}),d.starEmpty=new d("star-empty",{fontCharacter:"\\ea6a"}),d.comment=new d("comment",{fontCharacter:"\\ea6b"}),d.commentAdd=new d("comment-add",{fontCharacter:"\\ea6b"}),d.alert=new d("alert",{fontCharacter:"\\ea6c"}),d.warning=new d("warning",{fontCharacter:"\\ea6c"}),d.search=new d("search",{fontCharacter:"\\ea6d"}),d.searchSave=new d("search-save",{fontCharacter:"\\ea6d"}),d.logOut=new d("log-out",{fontCharacter:"\\ea6e"}),d.signOut=new d("sign-out",{fontCharacter:"\\ea6e"}),d.logIn=new d("log-in",{fontCharacter:"\\ea6f"}),d.signIn=new d("sign-in",{fontCharacter:"\\ea6f"}),d.eye=new d("eye",{fontCharacter:"\\ea70"}),d.eyeUnwatch=new d("eye-unwatch",{fontCharacter:"\\ea70"}),d.eyeWatch=new d("eye-watch",{fontCharacter:"\\ea70"}),d.circleFilled=new d("circle-filled",{fontCharacter:"\\ea71"}),d.primitiveDot=new d("primitive-dot",{fontCharacter:"\\ea71"}),d.closeDirty=new d("close-dirty",{fontCharacter:"\\ea71"}),d.debugBreakpoint=new d("debug-breakpoint",{fontCharacter:"\\ea71"}),d.debugBreakpointDisabled=new d("debug-breakpoint-disabled",{fontCharacter:"\\ea71"}),d.debugHint=new d("debug-hint",{fontCharacter:"\\ea71"}),d.primitiveSquare=new d("primitive-square",{fontCharacter:"\\ea72"}),d.edit=new d("edit",{fontCharacter:"\\ea73"}),d.pencil=new d("pencil",{fontCharacter:"\\ea73"}),d.info=new d("info",{fontCharacter:"\\ea74"}),d.issueOpened=new d("issue-opened",{fontCharacter:"\\ea74"}),d.gistPrivate=new d("gist-private",{fontCharacter:"\\ea75"}),d.gitForkPrivate=new d("git-fork-private",{fontCharacter:"\\ea75"}),d.lock=new d("lock",{fontCharacter:"\\ea75"}),d.mirrorPrivate=new d("mirror-private",{fontCharacter:"\\ea75"}),d.close=new d("close",{fontCharacter:"\\ea76"}),d.removeClose=new d("remove-close",{fontCharacter:"\\ea76"}),d.x=new d("x",{fontCharacter:"\\ea76"}),d.repoSync=new d("repo-sync",{fontCharacter:"\\ea77"}),d.sync=new d("sync",{fontCharacter:"\\ea77"}),d.clone=new d("clone",{fontCharacter:"\\ea78"}),d.desktopDownload=new d("desktop-download",{fontCharacter:"\\ea78"}),d.beaker=new d("beaker",{fontCharacter:"\\ea79"}),d.microscope=new d("microscope",{fontCharacter:"\\ea79"}),d.vm=new d("vm",{fontCharacter:"\\ea7a"}),d.deviceDesktop=new d("device-desktop",{fontCharacter:"\\ea7a"}),d.file=new d("file",{fontCharacter:"\\ea7b"}),d.fileText=new d("file-text",{fontCharacter:"\\ea7b"}),d.more=new d("more",{fontCharacter:"\\ea7c"}),d.ellipsis=new d("ellipsis",{fontCharacter:"\\ea7c"}),d.kebabHorizontal=new d("kebab-horizontal",{fontCharacter:"\\ea7c"}),d.mailReply=new d("mail-reply",{fontCharacter:"\\ea7d"}),d.reply=new d("reply",{fontCharacter:"\\ea7d"}),d.organization=new d("organization",{fontCharacter:"\\ea7e"}),d.organizationFilled=new d("organization-filled",{fontCharacter:"\\ea7e"}),d.organizationOutline=new d("organization-outline",{fontCharacter:"\\ea7e"}),d.newFile=new d("new-file",{fontCharacter:"\\ea7f"}),d.fileAdd=new d("file-add",{fontCharacter:"\\ea7f"}),d.newFolder=new d("new-folder",{fontCharacter:"\\ea80"}),d.fileDirectoryCreate=new d("file-directory-create",{fontCharacter:"\\ea80"}),d.trash=new d("trash",{fontCharacter:"\\ea81"}),d.trashcan=new d("trashcan",{fontCharacter:"\\ea81"}),d.history=new d("history",{fontCharacter:"\\ea82"}),d.clock=new d("clock",{fontCharacter:"\\ea82"}),d.folder=new d("folder",{fontCharacter:"\\ea83"}),d.fileDirectory=new d("file-directory",{fontCharacter:"\\ea83"}),d.symbolFolder=new d("symbol-folder",{fontCharacter:"\\ea83"}),d.logoGithub=new d("logo-github",{fontCharacter:"\\ea84"}),d.markGithub=new d("mark-github",{fontCharacter:"\\ea84"}),d.github=new d("github",{fontCharacter:"\\ea84"}),d.terminal=new d("terminal",{fontCharacter:"\\ea85"}),d.console=new d("console",{fontCharacter:"\\ea85"}),d.repl=new d("repl",{fontCharacter:"\\ea85"}),d.zap=new d("zap",{fontCharacter:"\\ea86"}),d.symbolEvent=new d("symbol-event",{fontCharacter:"\\ea86"}),d.error=new d("error",{fontCharacter:"\\ea87"}),d.stop=new d("stop",{fontCharacter:"\\ea87"}),d.variable=new d("variable",{fontCharacter:"\\ea88"}),d.symbolVariable=new d("symbol-variable",{fontCharacter:"\\ea88"}),d.array=new d("array",{fontCharacter:"\\ea8a"}),d.symbolArray=new d("symbol-array",{fontCharacter:"\\ea8a"}),d.symbolModule=new d("symbol-module",{fontCharacter:"\\ea8b"}),d.symbolPackage=new d("symbol-package",{fontCharacter:"\\ea8b"}),d.symbolNamespace=new d("symbol-namespace",{fontCharacter:"\\ea8b"}),d.symbolObject=new d("symbol-object",{fontCharacter:"\\ea8b"}),d.symbolMethod=new d("symbol-method",{fontCharacter:"\\ea8c"}),d.symbolFunction=new d("symbol-function",{fontCharacter:"\\ea8c"}),d.symbolConstructor=new d("symbol-constructor",{fontCharacter:"\\ea8c"}),d.symbolBoolean=new d("symbol-boolean",{fontCharacter:"\\ea8f"}),d.symbolNull=new d("symbol-null",{fontCharacter:"\\ea8f"}),d.symbolNumeric=new d("symbol-numeric",{fontCharacter:"\\ea90"}),d.symbolNumber=new d("symbol-number",{fontCharacter:"\\ea90"}),d.symbolStructure=new d("symbol-structure",{fontCharacter:"\\ea91"}),d.symbolStruct=new d("symbol-struct",{fontCharacter:"\\ea91"}),d.symbolParameter=new d("symbol-parameter",{fontCharacter:"\\ea92"}),d.symbolTypeParameter=new d("symbol-type-parameter",{fontCharacter:"\\ea92"}),d.symbolKey=new d("symbol-key",{fontCharacter:"\\ea93"}),d.symbolText=new d("symbol-text",{fontCharacter:"\\ea93"}),d.symbolReference=new d("symbol-reference",{fontCharacter:"\\ea94"}),d.goToFile=new d("go-to-file",{fontCharacter:"\\ea94"}),d.symbolEnum=new d("symbol-enum",{fontCharacter:"\\ea95"}),d.symbolValue=new d("symbol-value",{fontCharacter:"\\ea95"}),d.symbolRuler=new d("symbol-ruler",{fontCharacter:"\\ea96"}),d.symbolUnit=new d("symbol-unit",{fontCharacter:"\\ea96"}),d.activateBreakpoints=new d("activate-breakpoints",{fontCharacter:"\\ea97"}),d.archive=new d("archive",{fontCharacter:"\\ea98"}),d.arrowBoth=new d("arrow-both",{fontCharacter:"\\ea99"}),d.arrowDown=new d("arrow-down",{fontCharacter:"\\ea9a"}),d.arrowLeft=new d("arrow-left",{fontCharacter:"\\ea9b"}),d.arrowRight=new d("arrow-right",{fontCharacter:"\\ea9c"}),d.arrowSmallDown=new d("arrow-small-down",{fontCharacter:"\\ea9d"}),d.arrowSmallLeft=new d("arrow-small-left",{fontCharacter:"\\ea9e"}),d.arrowSmallRight=new d("arrow-small-right",{fontCharacter:"\\ea9f"}),d.arrowSmallUp=new d("arrow-small-up",{fontCharacter:"\\eaa0"}),d.arrowUp=new d("arrow-up",{fontCharacter:"\\eaa1"}),d.bell=new d("bell",{fontCharacter:"\\eaa2"}),d.bold=new d("bold",{fontCharacter:"\\eaa3"}),d.book=new d("book",{fontCharacter:"\\eaa4"}),d.bookmark=new d("bookmark",{fontCharacter:"\\eaa5"}),d.debugBreakpointConditionalUnverified=new d("debug-breakpoint-conditional-unverified",{fontCharacter:"\\eaa6"}),d.debugBreakpointConditional=new d("debug-breakpoint-conditional",{fontCharacter:"\\eaa7"}),d.debugBreakpointConditionalDisabled=new d("debug-breakpoint-conditional-disabled",{fontCharacter:"\\eaa7"}),d.debugBreakpointDataUnverified=new d("debug-breakpoint-data-unverified",{fontCharacter:"\\eaa8"}),d.debugBreakpointData=new d("debug-breakpoint-data",{fontCharacter:"\\eaa9"}),d.debugBreakpointDataDisabled=new d("debug-breakpoint-data-disabled",{fontCharacter:"\\eaa9"}),d.debugBreakpointLogUnverified=new d("debug-breakpoint-log-unverified",{fontCharacter:"\\eaaa"}),d.debugBreakpointLog=new d("debug-breakpoint-log",{fontCharacter:"\\eaab"}),d.debugBreakpointLogDisabled=new d("debug-breakpoint-log-disabled",{fontCharacter:"\\eaab"}),d.briefcase=new d("briefcase",{fontCharacter:"\\eaac"}),d.broadcast=new d("broadcast",{fontCharacter:"\\eaad"}),d.browser=new d("browser",{fontCharacter:"\\eaae"}),d.bug=new d("bug",{fontCharacter:"\\eaaf"}),d.calendar=new d("calendar",{fontCharacter:"\\eab0"}),d.caseSensitive=new d("case-sensitive",{fontCharacter:"\\eab1"}),d.check=new d("check",{fontCharacter:"\\eab2"}),d.checklist=new d("checklist",{fontCharacter:"\\eab3"}),d.chevronDown=new d("chevron-down",{fontCharacter:"\\eab4"}),d.chevronLeft=new d("chevron-left",{fontCharacter:"\\eab5"}),d.chevronRight=new d("chevron-right",{fontCharacter:"\\eab6"}),d.chevronUp=new d("chevron-up",{fontCharacter:"\\eab7"}),d.chromeClose=new d("chrome-close",{fontCharacter:"\\eab8"}),d.chromeMaximize=new d("chrome-maximize",{fontCharacter:"\\eab9"}),d.chromeMinimize=new d("chrome-minimize",{fontCharacter:"\\eaba"}),d.chromeRestore=new d("chrome-restore",{fontCharacter:"\\eabb"}),d.circleOutline=new d("circle-outline",{fontCharacter:"\\eabc"}),d.debugBreakpointUnverified=new d("debug-breakpoint-unverified",{fontCharacter:"\\eabc"}),d.circleSlash=new d("circle-slash",{fontCharacter:"\\eabd"}),d.circuitBoard=new d("circuit-board",{fontCharacter:"\\eabe"}),d.clearAll=new d("clear-all",{fontCharacter:"\\eabf"}),d.clippy=new d("clippy",{fontCharacter:"\\eac0"}),d.closeAll=new d("close-all",{fontCharacter:"\\eac1"}),d.cloudDownload=new d("cloud-download",{fontCharacter:"\\eac2"}),d.cloudUpload=new d("cloud-upload",{fontCharacter:"\\eac3"}),d.code=new d("code",{fontCharacter:"\\eac4"}),d.collapseAll=new d("collapse-all",{fontCharacter:"\\eac5"}),d.colorMode=new d("color-mode",{fontCharacter:"\\eac6"}),d.commentDiscussion=new d("comment-discussion",{fontCharacter:"\\eac7"}),d.compareChanges=new d("compare-changes",{fontCharacter:"\\eafd"}),d.creditCard=new d("credit-card",{fontCharacter:"\\eac9"}),d.dash=new d("dash",{fontCharacter:"\\eacc"}),d.dashboard=new d("dashboard",{fontCharacter:"\\eacd"}),d.database=new d("database",{fontCharacter:"\\eace"}),d.debugContinue=new d("debug-continue",{fontCharacter:"\\eacf"}),d.debugDisconnect=new d("debug-disconnect",{fontCharacter:"\\ead0"}),d.debugPause=new d("debug-pause",{fontCharacter:"\\ead1"}),d.debugRestart=new d("debug-restart",{fontCharacter:"\\ead2"}),d.debugStart=new d("debug-start",{fontCharacter:"\\ead3"}),d.debugStepInto=new d("debug-step-into",{fontCharacter:"\\ead4"}),d.debugStepOut=new d("debug-step-out",{fontCharacter:"\\ead5"}),d.debugStepOver=new d("debug-step-over",{fontCharacter:"\\ead6"}),d.debugStop=new d("debug-stop",{fontCharacter:"\\ead7"}),d.debug=new d("debug",{fontCharacter:"\\ead8"}),d.deviceCameraVideo=new d("device-camera-video",{fontCharacter:"\\ead9"}),d.deviceCamera=new d("device-camera",{fontCharacter:"\\eada"}),d.deviceMobile=new d("device-mobile",{fontCharacter:"\\eadb"}),d.diffAdded=new d("diff-added",{fontCharacter:"\\eadc"}),d.diffIgnored=new d("diff-ignored",{fontCharacter:"\\eadd"}),d.diffModified=new d("diff-modified",{fontCharacter:"\\eade"}),d.diffRemoved=new d("diff-removed",{fontCharacter:"\\eadf"}),d.diffRenamed=new d("diff-renamed",{fontCharacter:"\\eae0"}),d.diff=new d("diff",{fontCharacter:"\\eae1"}),d.discard=new d("discard",{fontCharacter:"\\eae2"}),d.editorLayout=new d("editor-layout",{fontCharacter:"\\eae3"}),d.emptyWindow=new d("empty-window",{fontCharacter:"\\eae4"}),d.exclude=new d("exclude",{fontCharacter:"\\eae5"}),d.extensions=new d("extensions",{fontCharacter:"\\eae6"}),d.eyeClosed=new d("eye-closed",{fontCharacter:"\\eae7"}),d.fileBinary=new d("file-binary",{fontCharacter:"\\eae8"}),d.fileCode=new d("file-code",{fontCharacter:"\\eae9"}),d.fileMedia=new d("file-media",{fontCharacter:"\\eaea"}),d.filePdf=new d("file-pdf",{fontCharacter:"\\eaeb"}),d.fileSubmodule=new d("file-submodule",{fontCharacter:"\\eaec"}),d.fileSymlinkDirectory=new d("file-symlink-directory",{fontCharacter:"\\eaed"}),d.fileSymlinkFile=new d("file-symlink-file",{fontCharacter:"\\eaee"}),d.fileZip=new d("file-zip",{fontCharacter:"\\eaef"}),d.files=new d("files",{fontCharacter:"\\eaf0"}),d.filter=new d("filter",{fontCharacter:"\\eaf1"}),d.flame=new d("flame",{fontCharacter:"\\eaf2"}),d.foldDown=new d("fold-down",{fontCharacter:"\\eaf3"}),d.foldUp=new d("fold-up",{fontCharacter:"\\eaf4"}),d.fold=new d("fold",{fontCharacter:"\\eaf5"}),d.folderActive=new d("folder-active",{fontCharacter:"\\eaf6"}),d.folderOpened=new d("folder-opened",{fontCharacter:"\\eaf7"}),d.gear=new d("gear",{fontCharacter:"\\eaf8"}),d.gift=new d("gift",{fontCharacter:"\\eaf9"}),d.gistSecret=new d("gist-secret",{fontCharacter:"\\eafa"}),d.gist=new d("gist",{fontCharacter:"\\eafb"}),d.gitCommit=new d("git-commit",{fontCharacter:"\\eafc"}),d.gitCompare=new d("git-compare",{fontCharacter:"\\eafd"}),d.gitMerge=new d("git-merge",{fontCharacter:"\\eafe"}),d.githubAction=new d("github-action",{fontCharacter:"\\eaff"}),d.githubAlt=new d("github-alt",{fontCharacter:"\\eb00"}),d.globe=new d("globe",{fontCharacter:"\\eb01"}),d.grabber=new d("grabber",{fontCharacter:"\\eb02"}),d.graph=new d("graph",{fontCharacter:"\\eb03"}),d.gripper=new d("gripper",{fontCharacter:"\\eb04"}),d.heart=new d("heart",{fontCharacter:"\\eb05"}),d.home=new d("home",{fontCharacter:"\\eb06"}),d.horizontalRule=new d("horizontal-rule",{fontCharacter:"\\eb07"}),d.hubot=new d("hubot",{fontCharacter:"\\eb08"}),d.inbox=new d("inbox",{fontCharacter:"\\eb09"}),d.issueClosed=new d("issue-closed",{fontCharacter:"\\eb0a"}),d.issueReopened=new d("issue-reopened",{fontCharacter:"\\eb0b"}),d.issues=new d("issues",{fontCharacter:"\\eb0c"}),d.italic=new d("italic",{fontCharacter:"\\eb0d"}),d.jersey=new d("jersey",{fontCharacter:"\\eb0e"}),d.json=new d("json",{fontCharacter:"\\eb0f"}),d.kebabVertical=new d("kebab-vertical",{fontCharacter:"\\eb10"}),d.key=new d("key",{fontCharacter:"\\eb11"}),d.law=new d("law",{fontCharacter:"\\eb12"}),d.lightbulbAutofix=new d("lightbulb-autofix",{fontCharacter:"\\eb13"}),d.linkExternal=new d("link-external",{fontCharacter:"\\eb14"}),d.link=new d("link",{fontCharacter:"\\eb15"}),d.listOrdered=new d("list-ordered",{fontCharacter:"\\eb16"}),d.listUnordered=new d("list-unordered",{fontCharacter:"\\eb17"}),d.liveShare=new d("live-share",{fontCharacter:"\\eb18"}),d.loading=new d("loading",{fontCharacter:"\\eb19"}),d.location=new d("location",{fontCharacter:"\\eb1a"}),d.mailRead=new d("mail-read",{fontCharacter:"\\eb1b"}),d.mail=new d("mail",{fontCharacter:"\\eb1c"}),d.markdown=new d("markdown",{fontCharacter:"\\eb1d"}),d.megaphone=new d("megaphone",{fontCharacter:"\\eb1e"}),d.mention=new d("mention",{fontCharacter:"\\eb1f"}),d.milestone=new d("milestone",{fontCharacter:"\\eb20"}),d.mortarBoard=new d("mortar-board",{fontCharacter:"\\eb21"}),d.move=new d("move",{fontCharacter:"\\eb22"}),d.multipleWindows=new d("multiple-windows",{fontCharacter:"\\eb23"}),d.mute=new d("mute",{fontCharacter:"\\eb24"}),d.noNewline=new d("no-newline",{fontCharacter:"\\eb25"}),d.note=new d("note",{fontCharacter:"\\eb26"}),d.octoface=new d("octoface",{fontCharacter:"\\eb27"}),d.openPreview=new d("open-preview",{fontCharacter:"\\eb28"}),d.package_=new d("package",{fontCharacter:"\\eb29"}),d.paintcan=new d("paintcan",{fontCharacter:"\\eb2a"}),d.pin=new d("pin",{fontCharacter:"\\eb2b"}),d.play=new d("play",{fontCharacter:"\\eb2c"}),d.run=new d("run",{fontCharacter:"\\eb2c"}),d.plug=new d("plug",{fontCharacter:"\\eb2d"}),d.preserveCase=new d("preserve-case",{fontCharacter:"\\eb2e"}),d.preview=new d("preview",{fontCharacter:"\\eb2f"}),d.project=new d("project",{fontCharacter:"\\eb30"}),d.pulse=new d("pulse",{fontCharacter:"\\eb31"}),d.question=new d("question",{fontCharacter:"\\eb32"}),d.quote=new d("quote",{fontCharacter:"\\eb33"}),d.radioTower=new d("radio-tower",{fontCharacter:"\\eb34"}),d.reactions=new d("reactions",{fontCharacter:"\\eb35"}),d.references=new d("references",{fontCharacter:"\\eb36"}),d.refresh=new d("refresh",{fontCharacter:"\\eb37"}),d.regex=new d("regex",{fontCharacter:"\\eb38"}),d.remoteExplorer=new d("remote-explorer",{fontCharacter:"\\eb39"}),d.remote=new d("remote",{fontCharacter:"\\eb3a"}),d.remove=new d("remove",{fontCharacter:"\\eb3b"}),d.replaceAll=new d("replace-all",{fontCharacter:"\\eb3c"}),d.replace=new d("replace",{fontCharacter:"\\eb3d"}),d.repoClone=new d("repo-clone",{fontCharacter:"\\eb3e"}),d.repoForcePush=new d("repo-force-push",{fontCharacter:"\\eb3f"}),d.repoPull=new d("repo-pull",{fontCharacter:"\\eb40"}),d.repoPush=new d("repo-push",{fontCharacter:"\\eb41"}),d.report=new d("report",{fontCharacter:"\\eb42"}),d.requestChanges=new d("request-changes",{fontCharacter:"\\eb43"}),d.rocket=new d("rocket",{fontCharacter:"\\eb44"}),d.rootFolderOpened=new d("root-folder-opened",{fontCharacter:"\\eb45"}),d.rootFolder=new d("root-folder",{fontCharacter:"\\eb46"}),d.rss=new d("rss",{fontCharacter:"\\eb47"}),d.ruby=new d("ruby",{fontCharacter:"\\eb48"}),d.saveAll=new d("save-all",{fontCharacter:"\\eb49"}),d.saveAs=new d("save-as",{fontCharacter:"\\eb4a"}),d.save=new d("save",{fontCharacter:"\\eb4b"}),d.screenFull=new d("screen-full",{fontCharacter:"\\eb4c"}),d.screenNormal=new d("screen-normal",{fontCharacter:"\\eb4d"}),d.searchStop=new d("search-stop",{fontCharacter:"\\eb4e"}),d.server=new d("server",{fontCharacter:"\\eb50"}),d.settingsGear=new d("settings-gear",{fontCharacter:"\\eb51"}),d.settings=new d("settings",{fontCharacter:"\\eb52"}),d.shield=new d("shield",{fontCharacter:"\\eb53"}),d.smiley=new d("smiley",{fontCharacter:"\\eb54"}),d.sortPrecedence=new d("sort-precedence",{fontCharacter:"\\eb55"}),d.splitHorizontal=new d("split-horizontal",{fontCharacter:"\\eb56"}),d.splitVertical=new d("split-vertical",{fontCharacter:"\\eb57"}),d.squirrel=new d("squirrel",{fontCharacter:"\\eb58"}),d.starFull=new d("star-full",{fontCharacter:"\\eb59"}),d.starHalf=new d("star-half",{fontCharacter:"\\eb5a"}),d.symbolClass=new d("symbol-class",{fontCharacter:"\\eb5b"}),d.symbolColor=new d("symbol-color",{fontCharacter:"\\eb5c"}),d.symbolConstant=new d("symbol-constant",{fontCharacter:"\\eb5d"}),d.symbolEnumMember=new d("symbol-enum-member",{fontCharacter:"\\eb5e"}),d.symbolField=new d("symbol-field",{fontCharacter:"\\eb5f"}),d.symbolFile=new d("symbol-file",{fontCharacter:"\\eb60"}),d.symbolInterface=new d("symbol-interface",{fontCharacter:"\\eb61"}),d.symbolKeyword=new d("symbol-keyword",{fontCharacter:"\\eb62"}),d.symbolMisc=new d("symbol-misc",{fontCharacter:"\\eb63"}),d.symbolOperator=new d("symbol-operator",{fontCharacter:"\\eb64"}),d.symbolProperty=new d("symbol-property",{fontCharacter:"\\eb65"}),d.wrench=new d("wrench",{fontCharacter:"\\eb65"}),d.wrenchSubaction=new d("wrench-subaction",{fontCharacter:"\\eb65"}),d.symbolSnippet=new d("symbol-snippet",{fontCharacter:"\\eb66"}),d.tasklist=new d("tasklist",{fontCharacter:"\\eb67"}),d.telescope=new d("telescope",{fontCharacter:"\\eb68"}),d.textSize=new d("text-size",{fontCharacter:"\\eb69"}),d.threeBars=new d("three-bars",{fontCharacter:"\\eb6a"}),d.thumbsdown=new d("thumbsdown",{fontCharacter:"\\eb6b"}),d.thumbsup=new d("thumbsup",{fontCharacter:"\\eb6c"}),d.tools=new d("tools",{fontCharacter:"\\eb6d"}),d.triangleDown=new d("triangle-down",{fontCharacter:"\\eb6e"}),d.triangleLeft=new d("triangle-left",{fontCharacter:"\\eb6f"}),d.triangleRight=new d("triangle-right",{fontCharacter:"\\eb70"}),d.triangleUp=new d("triangle-up",{fontCharacter:"\\eb71"}),d.twitter=new d("twitter",{fontCharacter:"\\eb72"}),d.unfold=new d("unfold",{fontCharacter:"\\eb73"}),d.unlock=new d("unlock",{fontCharacter:"\\eb74"}),d.unmute=new d("unmute",{fontCharacter:"\\eb75"}),d.unverified=new d("unverified",{fontCharacter:"\\eb76"}),d.verified=new d("verified",{fontCharacter:"\\eb77"}),d.versions=new d("versions",{fontCharacter:"\\eb78"}),d.vmActive=new d("vm-active",{fontCharacter:"\\eb79"}),d.vmOutline=new d("vm-outline",{fontCharacter:"\\eb7a"}),d.vmRunning=new d("vm-running",{fontCharacter:"\\eb7b"}),d.watch=new d("watch",{fontCharacter:"\\eb7c"}),d.whitespace=new d("whitespace",{fontCharacter:"\\eb7d"}),d.wholeWord=new d("whole-word",{fontCharacter:"\\eb7e"}),d.window=new d("window",{fontCharacter:"\\eb7f"}),d.wordWrap=new d("word-wrap",{fontCharacter:"\\eb80"}),d.zoomIn=new d("zoom-in",{fontCharacter:"\\eb81"}),d.zoomOut=new d("zoom-out",{fontCharacter:"\\eb82"}),d.listFilter=new d("list-filter",{fontCharacter:"\\eb83"}),d.listFlat=new d("list-flat",{fontCharacter:"\\eb84"}),d.listSelection=new d("list-selection",{fontCharacter:"\\eb85"}),d.selection=new d("selection",{fontCharacter:"\\eb85"}),d.listTree=new d("list-tree",{fontCharacter:"\\eb86"}),d.debugBreakpointFunctionUnverified=new d("debug-breakpoint-function-unverified",{fontCharacter:"\\eb87"}),d.debugBreakpointFunction=new d("debug-breakpoint-function",{fontCharacter:"\\eb88"}),d.debugBreakpointFunctionDisabled=new d("debug-breakpoint-function-disabled",{fontCharacter:"\\eb88"}),d.debugStackframeActive=new d("debug-stackframe-active",{fontCharacter:"\\eb89"}),d.debugStackframeDot=new d("debug-stackframe-dot",{fontCharacter:"\\eb8a"}),d.debugStackframe=new d("debug-stackframe",{fontCharacter:"\\eb8b"}),d.debugStackframeFocused=new d("debug-stackframe-focused",{fontCharacter:"\\eb8b"}),d.debugBreakpointUnsupported=new d("debug-breakpoint-unsupported",{fontCharacter:"\\eb8c"}),d.symbolString=new d("symbol-string",{fontCharacter:"\\eb8d"}),d.debugReverseContinue=new d("debug-reverse-continue",{fontCharacter:"\\eb8e"}),d.debugStepBack=new d("debug-step-back",{fontCharacter:"\\eb8f"}),d.debugRestartFrame=new d("debug-restart-frame",{fontCharacter:"\\eb90"}),d.callIncoming=new d("call-incoming",{fontCharacter:"\\eb92"}),d.callOutgoing=new d("call-outgoing",{fontCharacter:"\\eb93"}),d.menu=new d("menu",{fontCharacter:"\\eb94"}),d.expandAll=new d("expand-all",{fontCharacter:"\\eb95"}),d.feedback=new d("feedback",{fontCharacter:"\\eb96"}),d.groupByRefType=new d("group-by-ref-type",{fontCharacter:"\\eb97"}),d.ungroupByRefType=new d("ungroup-by-ref-type",{fontCharacter:"\\eb98"}),d.account=new d("account",{fontCharacter:"\\eb99"}),d.bellDot=new d("bell-dot",{fontCharacter:"\\eb9a"}),d.debugConsole=new d("debug-console",{fontCharacter:"\\eb9b"}),d.library=new d("library",{fontCharacter:"\\eb9c"}),d.output=new d("output",{fontCharacter:"\\eb9d"}),d.runAll=new d("run-all",{fontCharacter:"\\eb9e"}),d.syncIgnored=new d("sync-ignored",{fontCharacter:"\\eb9f"}),d.pinned=new d("pinned",{fontCharacter:"\\eba0"}),d.githubInverted=new d("github-inverted",{fontCharacter:"\\eba1"}),d.debugAlt=new d("debug-alt",{fontCharacter:"\\eb91"}),d.serverProcess=new d("server-process",{fontCharacter:"\\eba2"}),d.serverEnvironment=new d("server-environment",{fontCharacter:"\\eba3"}),d.pass=new d("pass",{fontCharacter:"\\eba4"}),d.stopCircle=new d("stop-circle",{fontCharacter:"\\eba5"}),d.playCircle=new d("play-circle",{fontCharacter:"\\eba6"}),d.record=new d("record",{fontCharacter:"\\eba7"}),d.debugAltSmall=new d("debug-alt-small",{fontCharacter:"\\eba8"}),d.vmConnect=new d("vm-connect",{fontCharacter:"\\eba9"}),d.cloud=new d("cloud",{fontCharacter:"\\ebaa"}),d.merge=new d("merge",{fontCharacter:"\\ebab"}),d.exportIcon=new d("export",{fontCharacter:"\\ebac"}),d.graphLeft=new d("graph-left",{fontCharacter:"\\ebad"}),d.magnet=new d("magnet",{fontCharacter:"\\ebae"}),d.notebook=new d("notebook",{fontCharacter:"\\ebaf"}),d.redo=new d("redo",{fontCharacter:"\\ebb0"}),d.checkAll=new d("check-all",{fontCharacter:"\\ebb1"}),d.pinnedDirty=new d("pinned-dirty",{fontCharacter:"\\ebb2"}),d.passFilled=new d("pass-filled",{fontCharacter:"\\ebb3"}),d.circleLargeFilled=new d("circle-large-filled",{fontCharacter:"\\ebb4"}),d.circleLargeOutline=new d("circle-large-outline",{fontCharacter:"\\ebb5"}),d.combine=new d("combine",{fontCharacter:"\\ebb6"}),d.gather=new d("gather",{fontCharacter:"\\ebb6"}),d.table=new d("table",{fontCharacter:"\\ebb7"}),d.variableGroup=new d("variable-group",{fontCharacter:"\\ebb8"}),d.typeHierarchy=new d("type-hierarchy",{fontCharacter:"\\ebb9"}),d.typeHierarchySub=new d("type-hierarchy-sub",{fontCharacter:"\\ebba"}),d.typeHierarchySuper=new d("type-hierarchy-super",{fontCharacter:"\\ebbb"}),d.gitPullRequestCreate=new d("git-pull-request-create",{fontCharacter:"\\ebbc"}),d.runAbove=new d("run-above",{fontCharacter:"\\ebbd"}),d.runBelow=new d("run-below",{fontCharacter:"\\ebbe"}),d.notebookTemplate=new d("notebook-template",{fontCharacter:"\\ebbf"}),d.debugRerun=new d("debug-rerun",{fontCharacter:"\\ebc0"}),d.dropDownButton=new d("drop-down-button",d.chevronDown.definition)}(S=e.Codicon||(e.Codicon={}))}),define(Q[197],J([0,1,27]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.treeItemLoadingIcon=e.treeFilterClearIcon=e.treeFilterOnTypeOffIcon=e.treeFilterOnTypeOnIcon=e.treeItemExpandedIcon=void 0,e.treeItemExpandedIcon=b.registerCodicon("tree-item-expanded",b.Codicon.chevronDown),e.treeFilterOnTypeOnIcon=b.registerCodicon("tree-filter-on-type-on",b.Codicon.listFilter),e.treeFilterOnTypeOffIcon=b.registerCodicon("tree-filter-on-type-off",b.Codicon.listSelection),e.treeFilterClearIcon=b.registerCodicon("tree-filter-clear",b.Codicon.close),e.treeItemLoadingIcon=b.registerCodicon("tree-item-loading",b.Codicon.loading)}),define(Q[283],J([0,1,15]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compareByPrefix=e.compareAnything=e.compareFileNames=void 0;const N=new b.IdleValue(()=>{const C=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});return{collator:C,collatorIsNumeric:C.resolvedOptions().numeric}});function M(C,d,g=!1){const p=C||"",c=d||"",o=N.value.collator.compare(p,c);return N.value.collatorIsNumeric&&o===0&&p!==c?pc.length)return 1}return 0}e.compareByPrefix=S}),define(Q[121],J([0,1,6,2]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SmoothScrollingOperation=e.SmoothScrollingUpdate=e.Scrollable=e.ScrollState=void 0;class M{constructor(s,a,u,r,i,n){s=s|0,a=a|0,u=u|0,r=r|0,i=i|0,n=n|0,this.rawScrollLeft=u,this.rawScrollTop=n,s<0&&(s=0),u+s>a&&(u=a-s),u<0&&(u=0),r<0&&(r=0),n+r>i&&(n=i-r),n<0&&(n=0),this.width=s,this.scrollWidth=a,this.scrollLeft=u,this.height=r,this.scrollHeight=i,this.scrollTop=n}equals(s){return this.rawScrollLeft===s.rawScrollLeft&&this.rawScrollTop===s.rawScrollTop&&this.width===s.width&&this.scrollWidth===s.scrollWidth&&this.scrollLeft===s.scrollLeft&&this.height===s.height&&this.scrollHeight===s.scrollHeight&&this.scrollTop===s.scrollTop}withScrollDimensions(s,a){return new M(typeof s.width!="undefined"?s.width:this.width,typeof s.scrollWidth!="undefined"?s.scrollWidth:this.scrollWidth,a?this.rawScrollLeft:this.scrollLeft,typeof s.height!="undefined"?s.height:this.height,typeof s.scrollHeight!="undefined"?s.scrollHeight:this.scrollHeight,a?this.rawScrollTop:this.scrollTop)}withScrollPosition(s){return new M(this.width,this.scrollWidth,typeof s.scrollLeft!="undefined"?s.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,typeof s.scrollTop!="undefined"?s.scrollTop:this.rawScrollTop)}createScrollEvent(s,a){const u=this.width!==s.width,r=this.scrollWidth!==s.scrollWidth,i=this.scrollLeft!==s.scrollLeft,n=this.height!==s.height,t=this.scrollHeight!==s.scrollHeight,l=this.scrollTop!==s.scrollTop;return{inSmoothScrolling:a,oldWidth:s.width,oldScrollWidth:s.scrollWidth,oldScrollLeft:s.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:s.height,oldScrollHeight:s.scrollHeight,oldScrollTop:s.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:u,scrollWidthChanged:r,scrollLeftChanged:i,heightChanged:n,scrollHeightChanged:t,scrollTopChanged:l}}}e.ScrollState=M;class w extends N.Disposable{constructor(s,a){super();this._onScroll=this._register(new b.Emitter),this.onScroll=this._onScroll.event,this._smoothScrollDuration=s,this._scheduleAtNextAnimationFrame=a,this._state=new M(0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(s){this._smoothScrollDuration=s}validateScrollPosition(s){return this._state.withScrollPosition(s)}getScrollDimensions(){return this._state}setScrollDimensions(s,a){const u=this._state.withScrollDimensions(s,a);this._setState(u,Boolean(this._smoothScrolling)),this._smoothScrolling&&this._smoothScrolling.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(s){const a=this._state.withScrollPosition(s);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(a,!1)}setScrollPositionSmooth(s,a){if(this._smoothScrollDuration===0)return this.setScrollPositionNow(s);if(this._smoothScrolling){s={scrollLeft:typeof s.scrollLeft=="undefined"?this._smoothScrolling.to.scrollLeft:s.scrollLeft,scrollTop:typeof s.scrollTop=="undefined"?this._smoothScrolling.to.scrollTop:s.scrollTop};const u=this._state.withScrollPosition(s);if(this._smoothScrolling.to.scrollLeft===u.scrollLeft&&this._smoothScrolling.to.scrollTop===u.scrollTop)return;let r;a?r=new g(this._smoothScrolling.from,u,this._smoothScrolling.startTime,this._smoothScrolling.duration):r=this._smoothScrolling.combine(this._state,u,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=r}else{const u=this._state.withScrollPosition(s);this._smoothScrolling=g.start(this._state,u,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{!this._smoothScrolling||(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}_performSmoothScrolling(){if(!!this._smoothScrolling){const s=this._smoothScrolling.tick(),a=this._state.withScrollPosition(s);if(this._setState(a,!0),!!this._smoothScrolling){if(s.isDone){this._smoothScrolling.dispose(),this._smoothScrolling=null;return}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{!this._smoothScrolling||(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}}}_setState(s,a){const u=this._state;u.equals(s)||(this._state=s,this._onScroll.fire(this._state.createScrollEvent(u,a)))}}e.Scrollable=w;class S{constructor(s,a,u){this.scrollLeft=s,this.scrollTop=a,this.isDone=u}}e.SmoothScrollingUpdate=S;function C(o,s){const a=s-o;return function(u){return o+a*c(u)}}function d(o,s,a){return function(u){return u2.5*u){let i,n;return s=j.length?te:j[ue]})}e.format=M;function w(G){return G.replace(/[<>&]/g,function(j){switch(j){case"<":return"<";case">":return">";case"&":return"&";default:return j}})}e.escape=w;function S(G){return G.replace(/[\\\{\}\*\+\?\|\^\$\.\[\]\(\)]/g,"\\$&")}e.escapeRegExpCharacters=S;function C(G,j=" "){const te=d(G,j);return g(te,j)}e.trim=C;function d(G,j){if(!G||!j)return G;const te=j.length;if(te===0||G.length===0)return G;let Z=0;for(;G.indexOf(j,Z)===Z;)Z=Z+te;return G.substring(Z)}e.ltrim=d;function g(G,j){if(!G||!j)return G;const te=j.length,Z=G.length;if(te===0||Z===0)return G;let ue=Z,he=-1;for(;he=G.lastIndexOf(j,ue-1),!(he===-1||he+te!==ue);){if(he===0)return"";ue=he}return G.substring(0,ue)}e.rtrim=g;function p(G){return G.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g,"\\$&").replace(/[\*]/g,".*")}e.convertSimple2RegExpPattern=p;function c(G){return G.replace(/\*/g,"")}e.stripWildcards=c;function o(G,j,te={}){if(!G)throw new Error("Cannot create regex from empty string");j||(G=S(G)),te.wholeWord&&(/\B/.test(G.charAt(0))||(G="\\b"+G),/\B/.test(G.charAt(G.length-1))||(G=G+"\\b"));let Z="";return te.global&&(Z+="g"),te.matchCase||(Z+="i"),te.multiline&&(Z+="m"),te.unicode&&(Z+="u"),new RegExp(G,Z)}e.createRegExp=o;function s(G){return G.source==="^"||G.source==="^$"||G.source==="$"||G.source==="^\\s*$"?!1:!!(G.exec("")&&G.lastIndex===0)}e.regExpLeadsToEndlessLoop=s;function a(G){return(G.global?"g":"")+(G.ignoreCase?"i":"")+(G.multiline?"m":"")+(G.unicode?"u":"")}e.regExpFlags=a;function u(G){return G.split(/\r\n|\r|\n/)}e.splitLines=u;function r(G){for(let j=0,te=G.length;j=0;te--){const Z=G.charCodeAt(te);if(Z!==32&&Z!==9)return te}return-1}e.lastNonWhitespaceIndex=n;function t(G,j){return Gj?1:0}e.compare=t;function l(G,j,te=0,Z=G.length,ue=0,he=j.length){for(;teCe)return 1}const re=Z-te,ce=he-ue;return rece?1:0}e.compareSubstring=l;function h(G,j){return m(G,j,0,G.length,0,j.length)}e.compareIgnoreCase=h;function m(G,j,te=0,Z=G.length,ue=0,he=j.length){for(;tece?1:0}e.compareSubstringIgnoreCase=m;function _(G){return G>=97&&G<=122}e.isLowerAsciiLetter=_;function f(G){return G>=65&&G<=90}e.isUpperAsciiLetter=f;function v(G){return _(G)||f(G)}function y(G,j){return G.length===j.length&&L(G,j)}e.equalsIgnoreCase=y;function L(G,j,te=G.length){for(let Z=0;ZG.length?!1:L(G,j,te)}e.startsWithIgnoreCase=I;function k(G,j){let te,Z=Math.min(G.length,j.length);for(te=0;te1){const Z=G.charCodeAt(j-2);if(T(Z))return A(Z,te)}return te}function D(G,j){const te=oe.getInstance(),Z=j,ue=G.length,he=B(G,ue,j);j+=he>=65536?2:1;let re=te.getGraphemeBreakType(he);for(;j=65536?2:1,re=me}return j-Z}e.nextCharLength=D;function R(G,j){const te=oe.getInstance(),Z=j,ue=F(G,j);j-=ue>=65536?2:1;let he=te.getGraphemeBreakType(ue);for(;j>0;){const re=F(G,j),ce=te.getGraphemeBreakType(re);if(ie(ce,he))break;j-=re>=65536?2:1,he=ce}return Z-j}e.prevCharLength=R;function W(G){const j=G.byteLength,te=[];let Z=0;for(;Z=240&&Z+3>>0|(G[Z++]&63)<<12>>>0|(G[Z++]&63)<<6>>>0|(G[Z++]&63)<<0>>>0:ue>=224&&Z+2>>0|(G[Z++]&63)<<6>>>0|(G[Z++]&63)<<0>>>0:ue>=192&&Z+1>>0|(G[Z++]&63)<<0>>>0:he=G[Z++],he>=0&&he<=55295||he>=57344&&he<=65535)te.push(String.fromCharCode(he));else if(he>=65536&&he<=1114111){const re=he-65536,ce=55296+((re&1047552)>>>10),me=56320+((re&1023)>>>0);te.push(String.fromCharCode(ce)),te.push(String.fromCharCode(me))}else te.push(String.fromCharCode(65533))}return te.join("")}e.decodeUTF8=W;const x=/(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u08BD\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE33\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDCFF]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD50-\uDFFF]|\uD83B[\uDC00-\uDEBB])/;function K(G){return x.test(G)}e.containsRTL=K;const Y=/(?:[\u231A\u231B\u23F0\u23F3\u2600-\u27BF\u2B50\u2B55]|\uD83C[\uDDE6-\uDDFF\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F\uDE80-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD00-\uDDFF\uDE70-\uDED6])/;function ee(G){return Y.test(G)}e.containsEmoji=ee;const se=/^[\t\n\r\x20-\x7E]*$/;function ne(G){return se.test(G)}e.isBasicASCII=ne,e.UNUSUAL_LINE_TERMINATORS=/[\u2028\u2029]/;function le(G){return e.UNUSUAL_LINE_TERMINATORS.test(G)}e.containsUnusualLineTerminators=le;function X(G){for(let j=0,te=G.length;j=11904&&G<=55215||G>=63744&&G<=64255||G>=65281&&G<=65374}e.isFullWidthCharacter=z;function P(G){return G>=127462&&G<=127487||G===8986||G===8987||G===9200||G===9203||G>=9728&&G<=10175||G===11088||G===11093||G>=127744&&G<=128591||G>=128640&&G<=128764||G>=128992&&G<=129003||G>=129280&&G<=129535||G>=129648&&G<=129750}e.isEmojiImprecise=P,e.UTF8_BOM_CHARACTER=String.fromCharCode(65279);function V(G){return!!(G&&G.length>0&&G.charCodeAt(0)===65279)}e.startsWithUTF8BOM=V;function U(G,j=!1){return G?(j&&(G=G.replace(/\\./g,"")),G.toLowerCase()!==G):!1}e.containsUppercaseCharacter=U;function H(G){const j=90-65+1;return G=G%(2*j),Gte[3*ue+1])ue=2*ue+1;else return te[3*ue+2];return 0}}oe._INSTANCE=null;function ae(){return JSON.parse("[0,0,0,51592,51592,11,44424,44424,11,72251,72254,5,7150,7150,7,48008,48008,11,55176,55176,11,128420,128420,14,3276,3277,5,9979,9980,14,46216,46216,11,49800,49800,11,53384,53384,11,70726,70726,5,122915,122916,5,129320,129327,14,2558,2558,5,5906,5908,5,9762,9763,14,43360,43388,8,45320,45320,11,47112,47112,11,48904,48904,11,50696,50696,11,52488,52488,11,54280,54280,11,70082,70083,1,71350,71350,7,73111,73111,5,127892,127893,14,128726,128727,14,129473,129474,14,2027,2035,5,2901,2902,5,3784,3789,5,6754,6754,5,8418,8420,5,9877,9877,14,11088,11088,14,44008,44008,5,44872,44872,11,45768,45768,11,46664,46664,11,47560,47560,11,48456,48456,11,49352,49352,11,50248,50248,11,51144,51144,11,52040,52040,11,52936,52936,11,53832,53832,11,54728,54728,11,69811,69814,5,70459,70460,5,71096,71099,7,71998,71998,5,72874,72880,5,119149,119149,7,127374,127374,14,128335,128335,14,128482,128482,14,128765,128767,14,129399,129400,14,129680,129685,14,1476,1477,5,2377,2380,7,2759,2760,5,3137,3140,7,3458,3459,7,4153,4154,5,6432,6434,5,6978,6978,5,7675,7679,5,9723,9726,14,9823,9823,14,9919,9923,14,10035,10036,14,42736,42737,5,43596,43596,5,44200,44200,11,44648,44648,11,45096,45096,11,45544,45544,11,45992,45992,11,46440,46440,11,46888,46888,11,47336,47336,11,47784,47784,11,48232,48232,11,48680,48680,11,49128,49128,11,49576,49576,11,50024,50024,11,50472,50472,11,50920,50920,11,51368,51368,11,51816,51816,11,52264,52264,11,52712,52712,11,53160,53160,11,53608,53608,11,54056,54056,11,54504,54504,11,54952,54952,11,68108,68111,5,69933,69940,5,70197,70197,7,70498,70499,7,70845,70845,5,71229,71229,5,71727,71735,5,72154,72155,5,72344,72345,5,73023,73029,5,94095,94098,5,121403,121452,5,126981,127182,14,127538,127546,14,127990,127990,14,128391,128391,14,128445,128449,14,128500,128505,14,128752,128752,14,129160,129167,14,129356,129356,14,129432,129442,14,129648,129651,14,129751,131069,14,173,173,4,1757,1757,1,2274,2274,1,2494,2494,5,2641,2641,5,2876,2876,5,3014,3016,7,3262,3262,7,3393,3396,5,3570,3571,7,3968,3972,5,4228,4228,7,6086,6086,5,6679,6680,5,6912,6915,5,7080,7081,5,7380,7392,5,8252,8252,14,9096,9096,14,9748,9749,14,9784,9786,14,9833,9850,14,9890,9894,14,9938,9938,14,9999,9999,14,10085,10087,14,12349,12349,14,43136,43137,7,43454,43456,7,43755,43755,7,44088,44088,11,44312,44312,11,44536,44536,11,44760,44760,11,44984,44984,11,45208,45208,11,45432,45432,11,45656,45656,11,45880,45880,11,46104,46104,11,46328,46328,11,46552,46552,11,46776,46776,11,47000,47000,11,47224,47224,11,47448,47448,11,47672,47672,11,47896,47896,11,48120,48120,11,48344,48344,11,48568,48568,11,48792,48792,11,49016,49016,11,49240,49240,11,49464,49464,11,49688,49688,11,49912,49912,11,50136,50136,11,50360,50360,11,50584,50584,11,50808,50808,11,51032,51032,11,51256,51256,11,51480,51480,11,51704,51704,11,51928,51928,11,52152,52152,11,52376,52376,11,52600,52600,11,52824,52824,11,53048,53048,11,53272,53272,11,53496,53496,11,53720,53720,11,53944,53944,11,54168,54168,11,54392,54392,11,54616,54616,11,54840,54840,11,55064,55064,11,65438,65439,5,69633,69633,5,69837,69837,1,70018,70018,7,70188,70190,7,70368,70370,7,70465,70468,7,70712,70719,5,70835,70840,5,70850,70851,5,71132,71133,5,71340,71340,7,71458,71461,5,71985,71989,7,72002,72002,7,72193,72202,5,72281,72283,5,72766,72766,7,72885,72886,5,73104,73105,5,92912,92916,5,113824,113827,4,119173,119179,5,121505,121519,5,125136,125142,5,127279,127279,14,127489,127490,14,127570,127743,14,127900,127901,14,128254,128254,14,128369,128370,14,128400,128400,14,128425,128432,14,128468,128475,14,128489,128494,14,128715,128720,14,128745,128745,14,128759,128760,14,129004,129023,14,129296,129304,14,129340,129342,14,129388,129392,14,129404,129407,14,129454,129455,14,129485,129487,14,129659,129663,14,129719,129727,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2363,2363,7,2402,2403,5,2507,2508,7,2622,2624,7,2691,2691,7,2786,2787,5,2881,2884,5,3006,3006,5,3072,3072,5,3170,3171,5,3267,3268,7,3330,3331,7,3406,3406,1,3538,3540,5,3655,3662,5,3897,3897,5,4038,4038,5,4184,4185,5,4352,4447,8,6068,6069,5,6155,6157,5,6448,6449,7,6742,6742,5,6783,6783,5,6966,6970,5,7042,7042,7,7143,7143,7,7212,7219,5,7412,7412,5,8206,8207,4,8294,8303,4,8596,8601,14,9410,9410,14,9742,9742,14,9757,9757,14,9770,9770,14,9794,9794,14,9828,9828,14,9855,9855,14,9882,9882,14,9900,9903,14,9929,9933,14,9963,9967,14,9987,9988,14,10006,10006,14,10062,10062,14,10175,10175,14,11744,11775,5,42607,42607,5,43043,43044,7,43263,43263,5,43444,43445,7,43569,43570,5,43698,43700,5,43766,43766,5,44032,44032,11,44144,44144,11,44256,44256,11,44368,44368,11,44480,44480,11,44592,44592,11,44704,44704,11,44816,44816,11,44928,44928,11,45040,45040,11,45152,45152,11,45264,45264,11,45376,45376,11,45488,45488,11,45600,45600,11,45712,45712,11,45824,45824,11,45936,45936,11,46048,46048,11,46160,46160,11,46272,46272,11,46384,46384,11,46496,46496,11,46608,46608,11,46720,46720,11,46832,46832,11,46944,46944,11,47056,47056,11,47168,47168,11,47280,47280,11,47392,47392,11,47504,47504,11,47616,47616,11,47728,47728,11,47840,47840,11,47952,47952,11,48064,48064,11,48176,48176,11,48288,48288,11,48400,48400,11,48512,48512,11,48624,48624,11,48736,48736,11,48848,48848,11,48960,48960,11,49072,49072,11,49184,49184,11,49296,49296,11,49408,49408,11,49520,49520,11,49632,49632,11,49744,49744,11,49856,49856,11,49968,49968,11,50080,50080,11,50192,50192,11,50304,50304,11,50416,50416,11,50528,50528,11,50640,50640,11,50752,50752,11,50864,50864,11,50976,50976,11,51088,51088,11,51200,51200,11,51312,51312,11,51424,51424,11,51536,51536,11,51648,51648,11,51760,51760,11,51872,51872,11,51984,51984,11,52096,52096,11,52208,52208,11,52320,52320,11,52432,52432,11,52544,52544,11,52656,52656,11,52768,52768,11,52880,52880,11,52992,52992,11,53104,53104,11,53216,53216,11,53328,53328,11,53440,53440,11,53552,53552,11,53664,53664,11,53776,53776,11,53888,53888,11,54000,54000,11,54112,54112,11,54224,54224,11,54336,54336,11,54448,54448,11,54560,54560,11,54672,54672,11,54784,54784,11,54896,54896,11,55008,55008,11,55120,55120,11,64286,64286,5,66272,66272,5,68900,68903,5,69762,69762,7,69817,69818,5,69927,69931,5,70003,70003,5,70070,70078,5,70094,70094,7,70194,70195,7,70206,70206,5,70400,70401,5,70463,70463,7,70475,70477,7,70512,70516,5,70722,70724,5,70832,70832,5,70842,70842,5,70847,70848,5,71088,71089,7,71102,71102,7,71219,71226,5,71231,71232,5,71342,71343,7,71453,71455,5,71463,71467,5,71737,71738,5,71995,71996,5,72000,72000,7,72145,72147,7,72160,72160,5,72249,72249,7,72273,72278,5,72330,72342,5,72752,72758,5,72850,72871,5,72882,72883,5,73018,73018,5,73031,73031,5,73109,73109,5,73461,73462,7,94031,94031,5,94192,94193,7,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,126976,126979,14,127184,127231,14,127344,127345,14,127405,127461,14,127514,127514,14,127561,127567,14,127778,127779,14,127896,127896,14,127985,127986,14,127995,127999,5,128326,128328,14,128360,128366,14,128378,128378,14,128394,128397,14,128405,128406,14,128422,128423,14,128435,128443,14,128453,128464,14,128479,128480,14,128484,128487,14,128496,128498,14,128640,128709,14,128723,128724,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129096,129103,14,129292,129292,14,129311,129311,14,129329,129330,14,129344,129349,14,129360,129374,14,129394,129394,14,129402,129402,14,129413,129425,14,129445,129450,14,129466,129471,14,129483,129483,14,129511,129535,14,129653,129655,14,129667,129670,14,129705,129711,14,129731,129743,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2307,2307,7,2366,2368,7,2382,2383,7,2434,2435,7,2497,2500,5,2519,2519,5,2563,2563,7,2631,2632,5,2677,2677,5,2750,2752,7,2763,2764,7,2817,2817,5,2879,2879,5,2891,2892,7,2914,2915,5,3008,3008,5,3021,3021,5,3076,3076,5,3146,3149,5,3202,3203,7,3264,3265,7,3271,3272,7,3298,3299,5,3390,3390,5,3402,3404,7,3426,3427,5,3535,3535,5,3544,3550,7,3635,3635,7,3763,3763,7,3893,3893,5,3953,3966,5,3981,3991,5,4145,4145,7,4157,4158,5,4209,4212,5,4237,4237,5,4520,4607,10,5970,5971,5,6071,6077,5,6089,6099,5,6277,6278,5,6439,6440,5,6451,6456,7,6683,6683,5,6744,6750,5,6765,6770,7,6846,6846,5,6964,6964,5,6972,6972,5,7019,7027,5,7074,7077,5,7083,7085,5,7146,7148,7,7154,7155,7,7222,7223,5,7394,7400,5,7416,7417,5,8204,8204,5,8233,8233,4,8288,8292,4,8413,8416,5,8482,8482,14,8986,8987,14,9193,9203,14,9654,9654,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9775,14,9792,9792,14,9800,9811,14,9825,9826,14,9831,9831,14,9852,9853,14,9872,9873,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9936,9936,14,9941,9960,14,9974,9974,14,9982,9985,14,9992,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10145,10145,14,11013,11015,14,11503,11505,5,12334,12335,5,12951,12951,14,42612,42621,5,43014,43014,5,43047,43047,7,43204,43205,5,43335,43345,5,43395,43395,7,43450,43451,7,43561,43566,5,43573,43574,5,43644,43644,5,43710,43711,5,43758,43759,7,44005,44005,5,44012,44012,7,44060,44060,11,44116,44116,11,44172,44172,11,44228,44228,11,44284,44284,11,44340,44340,11,44396,44396,11,44452,44452,11,44508,44508,11,44564,44564,11,44620,44620,11,44676,44676,11,44732,44732,11,44788,44788,11,44844,44844,11,44900,44900,11,44956,44956,11,45012,45012,11,45068,45068,11,45124,45124,11,45180,45180,11,45236,45236,11,45292,45292,11,45348,45348,11,45404,45404,11,45460,45460,11,45516,45516,11,45572,45572,11,45628,45628,11,45684,45684,11,45740,45740,11,45796,45796,11,45852,45852,11,45908,45908,11,45964,45964,11,46020,46020,11,46076,46076,11,46132,46132,11,46188,46188,11,46244,46244,11,46300,46300,11,46356,46356,11,46412,46412,11,46468,46468,11,46524,46524,11,46580,46580,11,46636,46636,11,46692,46692,11,46748,46748,11,46804,46804,11,46860,46860,11,46916,46916,11,46972,46972,11,47028,47028,11,47084,47084,11,47140,47140,11,47196,47196,11,47252,47252,11,47308,47308,11,47364,47364,11,47420,47420,11,47476,47476,11,47532,47532,11,47588,47588,11,47644,47644,11,47700,47700,11,47756,47756,11,47812,47812,11,47868,47868,11,47924,47924,11,47980,47980,11,48036,48036,11,48092,48092,11,48148,48148,11,48204,48204,11,48260,48260,11,48316,48316,11,48372,48372,11,48428,48428,11,48484,48484,11,48540,48540,11,48596,48596,11,48652,48652,11,48708,48708,11,48764,48764,11,48820,48820,11,48876,48876,11,48932,48932,11,48988,48988,11,49044,49044,11,49100,49100,11,49156,49156,11,49212,49212,11,49268,49268,11,49324,49324,11,49380,49380,11,49436,49436,11,49492,49492,11,49548,49548,11,49604,49604,11,49660,49660,11,49716,49716,11,49772,49772,11,49828,49828,11,49884,49884,11,49940,49940,11,49996,49996,11,50052,50052,11,50108,50108,11,50164,50164,11,50220,50220,11,50276,50276,11,50332,50332,11,50388,50388,11,50444,50444,11,50500,50500,11,50556,50556,11,50612,50612,11,50668,50668,11,50724,50724,11,50780,50780,11,50836,50836,11,50892,50892,11,50948,50948,11,51004,51004,11,51060,51060,11,51116,51116,11,51172,51172,11,51228,51228,11,51284,51284,11,51340,51340,11,51396,51396,11,51452,51452,11,51508,51508,11,51564,51564,11,51620,51620,11,51676,51676,11,51732,51732,11,51788,51788,11,51844,51844,11,51900,51900,11,51956,51956,11,52012,52012,11,52068,52068,11,52124,52124,11,52180,52180,11,52236,52236,11,52292,52292,11,52348,52348,11,52404,52404,11,52460,52460,11,52516,52516,11,52572,52572,11,52628,52628,11,52684,52684,11,52740,52740,11,52796,52796,11,52852,52852,11,52908,52908,11,52964,52964,11,53020,53020,11,53076,53076,11,53132,53132,11,53188,53188,11,53244,53244,11,53300,53300,11,53356,53356,11,53412,53412,11,53468,53468,11,53524,53524,11,53580,53580,11,53636,53636,11,53692,53692,11,53748,53748,11,53804,53804,11,53860,53860,11,53916,53916,11,53972,53972,11,54028,54028,11,54084,54084,11,54140,54140,11,54196,54196,11,54252,54252,11,54308,54308,11,54364,54364,11,54420,54420,11,54476,54476,11,54532,54532,11,54588,54588,11,54644,54644,11,54700,54700,11,54756,54756,11,54812,54812,11,54868,54868,11,54924,54924,11,54980,54980,11,55036,55036,11,55092,55092,11,55148,55148,11,55216,55238,9,65056,65071,5,65529,65531,4,68097,68099,5,68159,68159,5,69446,69456,5,69688,69702,5,69808,69810,7,69815,69816,7,69821,69821,1,69888,69890,5,69932,69932,7,69957,69958,7,70016,70017,5,70067,70069,7,70079,70080,7,70089,70092,5,70095,70095,5,70191,70193,5,70196,70196,5,70198,70199,5,70367,70367,5,70371,70378,5,70402,70403,7,70462,70462,5,70464,70464,5,70471,70472,7,70487,70487,5,70502,70508,5,70709,70711,7,70720,70721,7,70725,70725,7,70750,70750,5,70833,70834,7,70841,70841,7,70843,70844,7,70846,70846,7,70849,70849,7,71087,71087,5,71090,71093,5,71100,71101,5,71103,71104,5,71216,71218,7,71227,71228,7,71230,71230,7,71339,71339,5,71341,71341,5,71344,71349,5,71351,71351,5,71456,71457,7,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123628,123631,5,125252,125258,5,126980,126980,14,127183,127183,14,127245,127247,14,127340,127343,14,127358,127359,14,127377,127386,14,127462,127487,6,127491,127503,14,127535,127535,14,127548,127551,14,127568,127569,14,127744,127777,14,127780,127891,14,127894,127895,14,127897,127899,14,127902,127984,14,127987,127989,14,127991,127994,14,128000,128253,14,128255,128317,14,128329,128334,14,128336,128359,14,128367,128368,14,128371,128377,14,128379,128390,14,128392,128393,14,128398,128399,14,128401,128404,14,128407,128419,14,128421,128421,14,128424,128424,14,128433,128434,14,128444,128444,14,128450,128452,14,128465,128467,14,128476,128478,14,128481,128481,14,128483,128483,14,128488,128488,14,128495,128495,14,128499,128499,14,128506,128591,14,128710,128714,14,128721,128722,14,128725,128725,14,128728,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129664,129666,14,129671,129679,14,129686,129704,14,129712,129718,14,129728,129730,14,129744,129750,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2259,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3134,3136,5,3142,3144,5,3157,3158,5,3201,3201,5,3260,3260,5,3263,3263,5,3266,3266,5,3270,3270,5,3274,3275,7,3285,3286,5,3328,3329,5,3387,3388,5,3391,3392,7,3398,3400,7,3405,3405,5,3415,3415,5,3457,3457,5,3530,3530,5,3536,3537,7,3542,3542,5,3551,3551,5,3633,3633,5,3636,3642,5,3761,3761,5,3764,3772,5,3864,3865,5,3895,3895,5,3902,3903,7,3967,3967,7,3974,3975,5,3993,4028,5,4141,4144,5,4146,4151,5,4155,4156,7,4182,4183,7,4190,4192,5,4226,4226,5,4229,4230,5,4253,4253,5,4448,4519,9,4957,4959,5,5938,5940,5,6002,6003,5,6070,6070,7,6078,6085,7,6087,6088,7,6109,6109,5,6158,6158,4,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6848,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7673,5,8203,8203,4,8205,8205,13,8232,8232,4,8234,8238,4,8265,8265,14,8293,8293,4,8400,8412,5,8417,8417,5,8421,8432,5,8505,8505,14,8617,8618,14,9000,9000,14,9167,9167,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9776,9783,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9935,14,9937,9937,14,9939,9940,14,9961,9962,14,9968,9973,14,9975,9978,14,9981,9981,14,9986,9986,14,9989,9989,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10084,14,10133,10135,14,10160,10160,14,10548,10549,14,11035,11036,14,11093,11093,14,11647,11647,5,12330,12333,5,12336,12336,14,12441,12442,5,12953,12953,14,42608,42610,5,42654,42655,5,43010,43010,5,43019,43019,5,43045,43046,5,43052,43052,5,43188,43203,7,43232,43249,5,43302,43309,5,43346,43347,7,43392,43394,5,43443,43443,5,43446,43449,5,43452,43453,5,43493,43493,5,43567,43568,7,43571,43572,7,43587,43587,5,43597,43597,7,43696,43696,5,43703,43704,5,43713,43713,5,43756,43757,5,43765,43765,7,44003,44004,7,44006,44007,7,44009,44010,7,44013,44013,5,44033,44059,12,44061,44087,12,44089,44115,12,44117,44143,12,44145,44171,12,44173,44199,12,44201,44227,12,44229,44255,12,44257,44283,12,44285,44311,12,44313,44339,12,44341,44367,12,44369,44395,12,44397,44423,12,44425,44451,12,44453,44479,12,44481,44507,12,44509,44535,12,44537,44563,12,44565,44591,12,44593,44619,12,44621,44647,12,44649,44675,12,44677,44703,12,44705,44731,12,44733,44759,12,44761,44787,12,44789,44815,12,44817,44843,12,44845,44871,12,44873,44899,12,44901,44927,12,44929,44955,12,44957,44983,12,44985,45011,12,45013,45039,12,45041,45067,12,45069,45095,12,45097,45123,12,45125,45151,12,45153,45179,12,45181,45207,12,45209,45235,12,45237,45263,12,45265,45291,12,45293,45319,12,45321,45347,12,45349,45375,12,45377,45403,12,45405,45431,12,45433,45459,12,45461,45487,12,45489,45515,12,45517,45543,12,45545,45571,12,45573,45599,12,45601,45627,12,45629,45655,12,45657,45683,12,45685,45711,12,45713,45739,12,45741,45767,12,45769,45795,12,45797,45823,12,45825,45851,12,45853,45879,12,45881,45907,12,45909,45935,12,45937,45963,12,45965,45991,12,45993,46019,12,46021,46047,12,46049,46075,12,46077,46103,12,46105,46131,12,46133,46159,12,46161,46187,12,46189,46215,12,46217,46243,12,46245,46271,12,46273,46299,12,46301,46327,12,46329,46355,12,46357,46383,12,46385,46411,12,46413,46439,12,46441,46467,12,46469,46495,12,46497,46523,12,46525,46551,12,46553,46579,12,46581,46607,12,46609,46635,12,46637,46663,12,46665,46691,12,46693,46719,12,46721,46747,12,46749,46775,12,46777,46803,12,46805,46831,12,46833,46859,12,46861,46887,12,46889,46915,12,46917,46943,12,46945,46971,12,46973,46999,12,47001,47027,12,47029,47055,12,47057,47083,12,47085,47111,12,47113,47139,12,47141,47167,12,47169,47195,12,47197,47223,12,47225,47251,12,47253,47279,12,47281,47307,12,47309,47335,12,47337,47363,12,47365,47391,12,47393,47419,12,47421,47447,12,47449,47475,12,47477,47503,12,47505,47531,12,47533,47559,12,47561,47587,12,47589,47615,12,47617,47643,12,47645,47671,12,47673,47699,12,47701,47727,12,47729,47755,12,47757,47783,12,47785,47811,12,47813,47839,12,47841,47867,12,47869,47895,12,47897,47923,12,47925,47951,12,47953,47979,12,47981,48007,12,48009,48035,12,48037,48063,12,48065,48091,12,48093,48119,12,48121,48147,12,48149,48175,12,48177,48203,12,48205,48231,12,48233,48259,12,48261,48287,12,48289,48315,12,48317,48343,12,48345,48371,12,48373,48399,12,48401,48427,12,48429,48455,12,48457,48483,12,48485,48511,12,48513,48539,12,48541,48567,12,48569,48595,12,48597,48623,12,48625,48651,12,48653,48679,12,48681,48707,12,48709,48735,12,48737,48763,12,48765,48791,12,48793,48819,12,48821,48847,12,48849,48875,12,48877,48903,12,48905,48931,12,48933,48959,12,48961,48987,12,48989,49015,12,49017,49043,12,49045,49071,12,49073,49099,12,49101,49127,12,49129,49155,12,49157,49183,12,49185,49211,12,49213,49239,12,49241,49267,12,49269,49295,12,49297,49323,12,49325,49351,12,49353,49379,12,49381,49407,12,49409,49435,12,49437,49463,12,49465,49491,12,49493,49519,12,49521,49547,12,49549,49575,12,49577,49603,12,49605,49631,12,49633,49659,12,49661,49687,12,49689,49715,12,49717,49743,12,49745,49771,12,49773,49799,12,49801,49827,12,49829,49855,12,49857,49883,12,49885,49911,12,49913,49939,12,49941,49967,12,49969,49995,12,49997,50023,12,50025,50051,12,50053,50079,12,50081,50107,12,50109,50135,12,50137,50163,12,50165,50191,12,50193,50219,12,50221,50247,12,50249,50275,12,50277,50303,12,50305,50331,12,50333,50359,12,50361,50387,12,50389,50415,12,50417,50443,12,50445,50471,12,50473,50499,12,50501,50527,12,50529,50555,12,50557,50583,12,50585,50611,12,50613,50639,12,50641,50667,12,50669,50695,12,50697,50723,12,50725,50751,12,50753,50779,12,50781,50807,12,50809,50835,12,50837,50863,12,50865,50891,12,50893,50919,12,50921,50947,12,50949,50975,12,50977,51003,12,51005,51031,12,51033,51059,12,51061,51087,12,51089,51115,12,51117,51143,12,51145,51171,12,51173,51199,12,51201,51227,12,51229,51255,12,51257,51283,12,51285,51311,12,51313,51339,12,51341,51367,12,51369,51395,12,51397,51423,12,51425,51451,12,51453,51479,12,51481,51507,12,51509,51535,12,51537,51563,12,51565,51591,12,51593,51619,12,51621,51647,12,51649,51675,12,51677,51703,12,51705,51731,12,51733,51759,12,51761,51787,12,51789,51815,12,51817,51843,12,51845,51871,12,51873,51899,12,51901,51927,12,51929,51955,12,51957,51983,12,51985,52011,12,52013,52039,12,52041,52067,12,52069,52095,12,52097,52123,12,52125,52151,12,52153,52179,12,52181,52207,12,52209,52235,12,52237,52263,12,52265,52291,12,52293,52319,12,52321,52347,12,52349,52375,12,52377,52403,12,52405,52431,12,52433,52459,12,52461,52487,12,52489,52515,12,52517,52543,12,52545,52571,12,52573,52599,12,52601,52627,12,52629,52655,12,52657,52683,12,52685,52711,12,52713,52739,12,52741,52767,12,52769,52795,12,52797,52823,12,52825,52851,12,52853,52879,12,52881,52907,12,52909,52935,12,52937,52963,12,52965,52991,12,52993,53019,12,53021,53047,12,53049,53075,12,53077,53103,12,53105,53131,12,53133,53159,12,53161,53187,12,53189,53215,12,53217,53243,12,53245,53271,12,53273,53299,12,53301,53327,12,53329,53355,12,53357,53383,12,53385,53411,12,53413,53439,12,53441,53467,12,53469,53495,12,53497,53523,12,53525,53551,12,53553,53579,12,53581,53607,12,53609,53635,12,53637,53663,12,53665,53691,12,53693,53719,12,53721,53747,12,53749,53775,12,53777,53803,12,53805,53831,12,53833,53859,12,53861,53887,12,53889,53915,12,53917,53943,12,53945,53971,12,53973,53999,12,54001,54027,12,54029,54055,12,54057,54083,12,54085,54111,12,54113,54139,12,54141,54167,12,54169,54195,12,54197,54223,12,54225,54251,12,54253,54279,12,54281,54307,12,54309,54335,12,54337,54363,12,54365,54391,12,54393,54419,12,54421,54447,12,54449,54475,12,54477,54503,12,54505,54531,12,54533,54559,12,54561,54587,12,54589,54615,12,54617,54643,12,54645,54671,12,54673,54699,12,54701,54727,12,54729,54755,12,54757,54783,12,54785,54811,12,54813,54839,12,54841,54867,12,54869,54895,12,54897,54923,12,54925,54951,12,54953,54979,12,54981,55007,12,55009,55035,12,55037,55063,12,55065,55091,12,55093,55119,12,55121,55147,12,55149,55175,12,55177,55203,12,55243,55291,10,65024,65039,5,65279,65279,4,65520,65528,4,66045,66045,5,66422,66426,5,68101,68102,5,68152,68154,5,68325,68326,5,69291,69292,5,69632,69632,7,69634,69634,7,69759,69761,5]")}}),define(Q[101],J([0,1,8]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.writeUInt8=e.readUInt8=e.writeUInt32BE=e.readUInt32BE=e.writeUInt16LE=e.readUInt16LE=e.VSBuffer=void 0;const N=typeof Buffer!="undefined",M=typeof TextDecoder!="undefined";let w;class S{constructor(a){this.buffer=a,this.byteLength=this.buffer.byteLength}static wrap(a){return N&&!Buffer.isBuffer(a)&&(a=Buffer.from(a.buffer,a.byteOffset,a.byteLength)),new S(a)}toString(){return N?this.buffer.toString():M?(w||(w=new TextDecoder),w.decode(this.buffer)):b.decodeUTF8(this.buffer)}}e.VSBuffer=S;function C(s,a){return s[a+0]<<0>>>0|s[a+1]<<8>>>0}e.readUInt16LE=C;function d(s,a,u){s[u+0]=a&255,a=a>>>8,s[u+1]=a&255}e.writeUInt16LE=d;function g(s,a){return s[a]*Math.pow(2,24)+s[a+1]*Math.pow(2,16)+s[a+2]*Math.pow(2,8)+s[a+3]}e.readUInt32BE=g;function p(s,a,u){s[u+3]=a,a=a>>>8,s[u+2]=a,a=a>>>8,s[u+1]=a,a=a>>>8,s[u]=a}e.writeUInt32BE=p;function c(s,a){return s[a]}e.readUInt8=c;function o(s,a,u){s[u]=a}e.writeUInt8=o}),define(Q[152],J([0,1,17,8,72]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.hasDriveLetter=e.isRootOrDriveLetter=e.isWindowsDriveLetter=e.isEqualOrParent=e.toSlashes=void 0;function w(p){return p.replace(/[\\/]/g,M.posix.sep)}e.toSlashes=w;function S(p,c,o,s=M.sep){if(p===c)return!0;if(!p||!c||c.length>p.length)return!1;if(o){if(!N.startsWithIgnoreCase(p,c))return!1;if(c.length===p.length)return!0;let u=c.length;return c.charAt(c.length-1)===s&&u--,p.charAt(u)===s}return c.charAt(c.length-1)!==s&&(c+=s),p.indexOf(c)===0}e.isEqualOrParent=S;function C(p){return p>=65&&p<=90||p>=97&&p<=122}e.isWindowsDriveLetter=C;function d(p){const c=M.normalize(p);return b.isWindows?p.length>3?!1:g(c)&&(p.length===2||c.charCodeAt(2)===92):c===M.posix.sep}e.isRootOrDriveLetter=d;function g(p){return b.isWindows?C(p.charCodeAt(0))&&p.charCodeAt(1)===58:!1}e.hasDriveLetter=g}),define(Q[89],J([0,1,8]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StringSHA1=e.toHexString=e.stringHash=e.doHash=e.hash=void 0;function N(u){return M(u,0)}e.hash=N;function M(u,r){switch(typeof u){case"object":return u===null?w(349,r):Array.isArray(u)?d(u,r):g(u,r);case"string":return C(u,r);case"boolean":return S(u,r);case"number":return w(u,r);case"undefined":return w(937,r);default:return w(617,r)}}e.doHash=M;function w(u,r){return(r<<5)-r+u|0}function S(u,r){return w(u?433:863,r)}function C(u,r){r=w(149417,r);for(let i=0,n=u.length;iM(n,i),r)}function g(u,r){return r=w(181387,r),Object.keys(u).sort().reduce((i,n)=>(i=C(n,i),M(u[n],i)),r)}function p(u,r,i=32){const n=i-r,t=~((1<>>n)>>>0}function c(u,r=0,i=u.byteLength,n=0){for(let t=0;ti.toString(16).padStart(2,"0")).join(""):o((u>>>0).toString(16),r/4)}e.toHexString=s;class a{constructor(){this._h0=1732584193,this._h1=4023233417,this._h2=2562383102,this._h3=271733878,this._h4=3285377520,this._buff=new Uint8Array(64+3),this._buffDV=new DataView(this._buff.buffer),this._buffLen=0,this._totalLen=0,this._leftoverHighSurrogate=0,this._finished=!1}update(r){const i=r.length;if(i!==0){const n=this._buff;let t=this._buffLen,l=this._leftoverHighSurrogate,h,m;for(l!==0?(h=l,m=-1,l=0):(h=r.charCodeAt(0),m=0);;){let _=h;if(b.isHighSurrogate(h))if(m+1>>6,r[i++]=128|(n&63)>>>0):n<65536?(r[i++]=224|(n&61440)>>>12,r[i++]=128|(n&4032)>>>6,r[i++]=128|(n&63)>>>0):(r[i++]=240|(n&1835008)>>>18,r[i++]=128|(n&258048)>>>12,r[i++]=128|(n&4032)>>>6,r[i++]=128|(n&63)>>>0),i>=64&&(this._step(),i-=64,this._totalLen+=64,r[0]=r[64+0],r[1]=r[64+1],r[2]=r[64+2]),i}digest(){return this._finished||(this._finished=!0,this._leftoverHighSurrogate&&(this._leftoverHighSurrogate=0,this._buffLen=this._push(this._buff,this._buffLen,65533)),this._totalLen+=this._buffLen,this._wrapUp()),s(this._h0)+s(this._h1)+s(this._h2)+s(this._h3)+s(this._h4)}_wrapUp(){this._buff[this._buffLen++]=128,c(this._buff,this._buffLen),this._buffLen>56&&(this._step(),c(this._buff));const r=8*this._totalLen;this._buffDV.setUint32(56,Math.floor(r/4294967296),!1),this._buffDV.setUint32(60,r%4294967296,!1),this._step()}_step(){const r=a._bigBlock32,i=this._buffDV;for(let y=0;y<64;y+=4)r.setUint32(y,i.getUint32(y,!1),!1);for(let y=64;y<320;y+=4)r.setUint32(y,p(r.getUint32(y-12,!1)^r.getUint32(y-32,!1)^r.getUint32(y-56,!1)^r.getUint32(y-64,!1),1),!1);let n=this._h0,t=this._h1,l=this._h2,h=this._h3,m=this._h4,_,f,v;for(let y=0;y<80;y++)y<20?(_=t&l|~t&h,f=1518500249):y<40?(_=t^l^h,f=1859775393):y<60?(_=t&l|t&h|l&h,f=2400959708):(_=t^l^h,f=3395469782),v=p(n,5)+_+m+f+r.getUint32(y*4,!1)&4294967295,m=h,h=l,l=p(t,30),t=n,n=v;this._h0=this._h0+n&4294967295,this._h1=this._h1+t&4294967295,this._h2=this._h2+l&4294967295,this._h3=this._h3+h&4294967295,this._h4=this._h4+m&4294967295}}e.StringSHA1=a,a._bigBlock32=new DataView(new ArrayBuffer(320))}),define(Q[153],J([0,1,277,89]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LcsDiff=e.MyArray=e.Debug=e.stringDiff=e.StringDiffSequence=void 0;class M{constructor(c){this.source=c}getElements(){const c=this.source,o=new Int32Array(c.length);for(let s=0,a=c.length;s0||this.m_modifiedCount>0)&&this.m_changes.push(new b.DiffChange(this.m_originalStart,this.m_originalCount,this.m_modifiedStart,this.m_modifiedCount)),this.m_originalCount=0,this.m_modifiedCount=0,this.m_originalStart=1073741824,this.m_modifiedStart=1073741824}AddOriginalElement(c,o){this.m_originalStart=Math.min(this.m_originalStart,c),this.m_modifiedStart=Math.min(this.m_modifiedStart,o),this.m_originalCount++}AddModifiedElement(c,o){this.m_originalStart=Math.min(this.m_originalStart,c),this.m_modifiedStart=Math.min(this.m_modifiedStart,o),this.m_modifiedCount++}getChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes}getReverseChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes.reverse(),this.m_changes}}class g{constructor(c,o,s=null){this.ContinueProcessingPredicate=s;const[a,u,r]=g._getElements(c),[i,n,t]=g._getElements(o);this._hasStrings=r&&t,this._originalStringElements=a,this._originalElementsOrHash=u,this._modifiedStringElements=i,this._modifiedElementsOrHash=n,this.m_forwardHistory=[],this.m_reverseHistory=[]}static _isStringArray(c){return c.length>0&&typeof c[0]=="string"}static _getElements(c){const o=c.getElements();if(g._isStringArray(o)){const s=new Int32Array(o.length);for(let a=0,u=o.length;a=c&&a>=s&&this.ElementsAreEqual(o,a);)o--,a--;if(c>o||s>a){let h;return s<=a?(S.Assert(c===o+1,"originalStart should only be one more than originalEnd"),h=[new b.DiffChange(c,0,s,a-s+1)]):c<=o?(S.Assert(s===a+1,"modifiedStart should only be one more than modifiedEnd"),h=[new b.DiffChange(c,o-c+1,s,0)]):(S.Assert(c===o+1,"originalStart should only be one more than originalEnd"),S.Assert(s===a+1,"modifiedStart should only be one more than modifiedEnd"),h=[]),h}const r=[0],i=[0],n=this.ComputeRecursionPoint(c,o,s,a,r,i,u),t=r[0],l=i[0];if(n!==null)return n;if(!u[0]){const h=this.ComputeDiffRecursive(c,t,s,l,u);let m=[];return u[0]?m=[new b.DiffChange(t+1,o-(t+1)+1,l+1,a-(l+1)+1)]:m=this.ComputeDiffRecursive(t+1,o,l+1,a,u),this.ConcatenateChanges(h,m)}return[new b.DiffChange(c,o-c+1,s,a-s+1)]}WALKTRACE(c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I){let k=null,E=null,T=new d,O=o,A=s,B=_[0]-y[0]-a,F=-1073741824,D=this.m_forwardHistory.length-1;do{const R=B+c;R===O||R=0&&(t=this.m_forwardHistory[D],c=t[0],O=1,A=t.length-1)}while(--D>=-1);if(k=T.getReverseChanges(),I[0]){let R=_[0]+1,W=y[0]+1;if(k!==null&&k.length>0){const x=k[k.length-1];R=Math.max(R,x.getOriginalEnd()),W=Math.max(W,x.getModifiedEnd())}E=[new b.DiffChange(R,m-R+1,W,v-W+1)]}else{T=new d,O=r,A=i,B=_[0]-y[0]-n,F=1073741824,D=L?this.m_reverseHistory.length-1:this.m_reverseHistory.length-2;do{const R=B+u;R===O||R=l[R+1]?(h=l[R+1]-1,f=h-B-n,h>F&&T.MarkNextChange(),F=h+1,T.AddOriginalElement(h+1,f+1),B=R+1-u):(h=l[R-1],f=h-B-n,h>F&&T.MarkNextChange(),F=h,T.AddModifiedElement(h+1,f+1),B=R-1-u),D>=0&&(l=this.m_reverseHistory[D],u=l[0],O=1,A=l.length-1)}while(--D>=-1);E=T.getChanges()}return this.ConcatenateChanges(k,E)}ComputeRecursionPoint(c,o,s,a,u,r,i){let n=0,t=0,l=0,h=0,m=0,_=0;c--,s--,u[0]=0,r[0]=0,this.m_forwardHistory=[],this.m_reverseHistory=[];const f=o-c+(a-s),v=f+1,y=new Int32Array(v),L=new Int32Array(v),I=a-s,k=o-c,E=c-s,T=o-a,A=(k-I)%2==0;y[I]=c,L[k]=o,i[0]=!1;for(let B=1;B<=f/2+1;B++){let F=0,D=0;l=this.ClipDiagonalBound(I-B,B,I,v),h=this.ClipDiagonalBound(I+B,B,I,v);for(let W=l;W<=h;W+=2){W===l||WF+D&&(F=n,D=t),!A&&Math.abs(W-k)<=B-1&&n>=L[W])return u[0]=n,r[0]=t,x<=L[W]&&1447>0&&B<=1447+1?this.WALKTRACE(I,l,h,E,k,m,_,T,y,L,n,o,u,t,a,r,A,i):null}const R=(F-c+(D-s)-B)/2;if(this.ContinueProcessingPredicate!==null&&!this.ContinueProcessingPredicate(F,R))return i[0]=!0,u[0]=F,r[0]=D,R>0&&1447>0&&B<=1447+1?this.WALKTRACE(I,l,h,E,k,m,_,T,y,L,n,o,u,t,a,r,A,i):(c++,s++,[new b.DiffChange(c,o-c+1,s,a-s+1)]);m=this.ClipDiagonalBound(k-B,B,k,v),_=this.ClipDiagonalBound(k+B,B,k,v);for(let W=m;W<=_;W+=2){W===m||W<_&&L[W-1]>=L[W+1]?n=L[W+1]-1:n=L[W-1],t=n-(W-k)-T;const x=n;for(;n>c&&t>s&&this.ElementsAreEqual(n,t);)n--,t--;if(L[W]=n,A&&Math.abs(W-I)<=B&&n<=y[W])return u[0]=n,r[0]=t,x>=y[W]&&1447>0&&B<=1447+1?this.WALKTRACE(I,l,h,E,k,m,_,T,y,L,n,o,u,t,a,r,A,i):null}if(B<=1447){let W=new Int32Array(h-l+2);W[0]=I-l+1,C.Copy2(y,l,W,1,h-l+1),this.m_forwardHistory.push(W),W=new Int32Array(_-m+2),W[0]=k-m+1,C.Copy2(L,m,W,1,_-m+1),this.m_reverseHistory.push(W)}}return this.WALKTRACE(I,l,h,E,k,m,_,T,y,L,n,o,u,t,a,r,A,i)}PrettifyChanges(c){for(let o=0;o0,i=s.modifiedLength>0;for(;s.originalStart+s.originalLength=0;o--){const s=c[o];let a=0,u=0;if(o>0){const l=c[o-1];l.originalLength>0&&(a=l.originalStart+l.originalLength),l.modifiedLength>0&&(u=l.modifiedStart+l.modifiedLength)}const r=s.originalLength>0,i=s.modifiedLength>0;let n=0,t=this._boundaryScore(s.originalStart,s.originalLength,s.modifiedStart,s.modifiedLength);for(let l=1;;l++){const h=s.originalStart-l,m=s.modifiedStart-l;if(ht&&(t=_,n=l)}s.originalStart-=n,s.modifiedStart-=n}if(this._hasStrings)for(let o=1,s=c.length;o0&&_>n&&(n=_,t=h,l=m)}return n>0?[t,l]:null}_contiguousSequenceScore(c,o,s){let a=0;for(let u=0;u=this._originalElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._originalStringElements[c])}_OriginalRegionIsBoundary(c,o){if(this._OriginalIsBoundary(c)||this._OriginalIsBoundary(c-1))return!0;if(o>0){const s=c+o;if(this._OriginalIsBoundary(s-1)||this._OriginalIsBoundary(s))return!0}return!1}_ModifiedIsBoundary(c){return c<=0||c>=this._modifiedElementsOrHash.length-1?!0:this._hasStrings&&/^\s*$/.test(this._modifiedStringElements[c])}_ModifiedRegionIsBoundary(c,o){if(this._ModifiedIsBoundary(c)||this._ModifiedIsBoundary(c-1))return!0;if(o>0){const s=c+o;if(this._ModifiedIsBoundary(s-1)||this._ModifiedIsBoundary(s))return!0}return!1}_boundaryScore(c,o,s,a){const u=this._OriginalRegionIsBoundary(c,o)?1:0,r=this._ModifiedRegionIsBoundary(s,a)?1:0;return u+r}ConcatenateChanges(c,o){let s=[];if(c.length===0||o.length===0)return o.length>0?o:c;if(this.ChangesOverlap(c[c.length-1],o[0],s)){const a=new Array(c.length+o.length-1);return C.Copy(c,0,a,0,c.length-1),a[c.length-1]=s[0],C.Copy(o,1,a,c.length,o.length-1),a}else{const a=new Array(c.length+o.length);return C.Copy(c,0,a,0,c.length),C.Copy(o,0,a,c.length,o.length),a}}ChangesOverlap(c,o,s){if(S.Assert(c.originalStart<=o.originalStart,"Left change is not less than or equal to right change"),S.Assert(c.modifiedStart<=o.modifiedStart,"Left change is not less than or equal to right change"),c.originalStart+c.originalLength>=o.originalStart||c.modifiedStart+c.modifiedLength>=o.modifiedStart){const a=c.originalStart;let u=c.originalLength;const r=c.modifiedStart;let i=c.modifiedLength;return c.originalStart+c.originalLength>=o.originalStart&&(u=o.originalStart+o.originalLength-c.originalStart),c.modifiedStart+c.modifiedLength>=o.modifiedStart&&(i=o.modifiedStart+o.modifiedLength-c.modifiedStart),s[0]=new b.DiffChange(a,u,r,i),!0}else return s[0]=null,!1}ClipDiagonalBound(c,o,s,a){if(c>=0&&ct.children.map(L=>o.getId(L.element).toString())},{getElements:()=>[...t.children.slice(0,h),...l,...t.children.slice(h+a)].map(L=>o.getId(L.element).toString())}).ComputeDiff(!1);if(m.quitEarly)return this.spliceSimple(s,a,l,r);const _=s.slice(0,-1),f=(L,I,k)=>{if(i>0)for(let E=0;Ek.originalStart-I.originalStart))f(v,y,v-(L.originalStart+L.originalLength)),v=L.originalStart,y=L.modifiedStart-h,this.spliceSimple([..._,v],L.originalLength,S.Iterable.slice(l,y,y+L.modifiedLength),r);f(v,y,v)}spliceSimple(o,s,a=S.Iterable.empty(),{onDidCreateNode:u,onDidDeleteNode:r}){const{parentNode:i,listIndex:n,revealed:t,visible:l}=this.getParentNodeWithListIndex(o),h=[],m=S.Iterable.map(a,A=>this.createTreeNode(A,i,i.visible?1:0,t,h,u)),_=o[o.length-1],f=i.children.length>0;let v=0;for(let A=_;A>=0&&AB+(F.visible?F.renderNodeCount:0),0);this._updateAncestorsRenderNodeCount(i,I-A),this.list.splice(n,A,h)}if(k.length>0&&r){const A=B=>{r(B),B.children.forEach(A)};k.forEach(A)}const T=i.children.length>0;f!==T&&this.setCollapsible(o.slice(0,-1),T),this._onDidSplice.fire({insertedNodes:y,deletedNodes:k});let O=i;for(;O;){if(O.visibility===2){this.refilter();break}O=O.parent}}rerender(o){if(o.length===0)throw new b.TreeError(this.user,"Invalid tree location");const{node:s,listIndex:a,revealed:u}=this.getTreeNodeWithListIndex(o);s.visible&&u&&this.list.splice(a,1,[s])}has(o){return this.hasTreeNode(o)}getListIndex(o){const{listIndex:s,visible:a,revealed:u}=this.getTreeNodeWithListIndex(o);return a&&u?s:-1}getListRenderCount(o){return this.getTreeNode(o).renderNodeCount}isCollapsible(o){return this.getTreeNode(o).collapsible}setCollapsible(o,s){const a=this.getTreeNode(o);typeof s=="undefined"&&(s=!a.collapsible);const u={collapsible:s};return this.eventBufferer.bufferEvents(()=>this._setCollapseState(o,u))}isCollapsed(o){return this.getTreeNode(o).collapsed}setCollapsed(o,s,a){const u=this.getTreeNode(o);typeof s=="undefined"&&(s=!u.collapsed);const r={collapsed:s,recursive:a||!1};return this.eventBufferer.bufferEvents(()=>this._setCollapseState(o,r))}_setCollapseState(o,s){const{node:a,listIndex:u,revealed:r}=this.getTreeNodeWithListIndex(o),i=this._setListNodeCollapseState(a,u,r,s);if(a!==this.root&&this.autoExpandSingleChildren&&i&&!g(s)&&a.collapsible&&!a.collapsed&&!s.recursive){let n=-1;for(let t=0;t-1){n=-1;break}else n=t;n>-1&&this._setCollapseState([...o,n],s)}return i}_setListNodeCollapseState(o,s,a,u){const r=this._setNodeCollapseState(o,u,!1);if(!a||!o.visible||!r)return r;const i=o.renderNodeCount,n=this.updateNodeAfterCollapseChange(o),t=i-(s===-1?0:1);return this.list.splice(s+1,t,n.slice(1)),r}_setNodeCollapseState(o,s,a){let u;if(o===this.root?u=!1:(g(s)?(u=o.collapsible!==s.collapsible,o.collapsible=s.collapsible):o.collapsible?(u=o.collapsed!==s.collapsed,o.collapsed=s.collapsed):u=!1,u&&this._onDidChangeCollapseState.fire({node:o,deep:a})),!g(s)&&s.recursive)for(const r of o.children)u=this._setNodeCollapseState(r,s,!0)||u;return u}expandTo(o){this.eventBufferer.bufferEvents(()=>{let s=this.getTreeNode(o);for(;s.parent;)s=s.parent,o=o.slice(0,o.length-1),s.collapsed&&this._setCollapseState(o,{collapsed:!1,recursive:!1})})}refilter(){const o=this.root.renderNodeCount,s=this.updateNodeAfterFilterChange(this.root);this.list.splice(0,o,s)}createTreeNode(o,s,a,u,r,i){const n={parent:s,element:o.element,children:[],depth:s.depth+1,visibleChildrenCount:0,visibleChildIndex:-1,collapsible:typeof o.collapsible=="boolean"?o.collapsible:typeof o.collapsed!="undefined",collapsed:typeof o.collapsed=="undefined"?this.collapseByDefault:o.collapsed,renderNodeCount:1,visibility:1,visible:!0,filterData:void 0},t=this._filterNode(n,a);n.visibility=t,u&&r.push(n);const l=o.children||S.Iterable.empty(),h=u&&t!==0&&!n.collapsed,m=S.Iterable.map(l,v=>this.createTreeNode(v,n,t,h,r,i));let _=0,f=1;for(const v of m)n.children.push(v),f+=v.renderNodeCount,v.visible&&(v.visibleChildIndex=_++);return n.collapsible=n.collapsible||n.children.length>0,n.visibleChildrenCount=_,n.visible=t===2?_>0:t===1,n.visible?n.collapsed||(n.renderNodeCount=f):(n.renderNodeCount=0,u&&r.pop()),i&&i(n),n}updateNodeAfterCollapseChange(o){const s=o.renderNodeCount,a=[];return this._updateNodeAfterCollapseChange(o,a),this._updateAncestorsRenderNodeCount(o.parent,a.length-s),a}_updateNodeAfterCollapseChange(o,s){if(o.visible===!1)return 0;if(s.push(o),o.renderNodeCount=1,!o.collapsed)for(const a of o.children)o.renderNodeCount+=this._updateNodeAfterCollapseChange(a,s);return this._onDidChangeRenderNodeCount.fire(o),o.renderNodeCount}updateNodeAfterFilterChange(o){const s=o.renderNodeCount,a=[];return this._updateNodeAfterFilterChange(o,o.visible?1:0,a),this._updateAncestorsRenderNodeCount(o.parent,a.length-s),a}_updateNodeAfterFilterChange(o,s,a,u=!0){let r;if(o!==this.root){if(r=this._filterNode(o,s),r===0)return o.visible=!1,o.renderNodeCount=0,!1;u&&a.push(o)}const i=a.length;o.renderNodeCount=o===this.root?0:1;let n=!1;if(!o.collapsed||r!==0){let t=0;for(const l of o.children)n=this._updateNodeAfterFilterChange(l,r,a,u&&!o.collapsed)||n,l.visible&&(l.visibleChildIndex=t++);o.visibleChildrenCount=t}else o.visibleChildrenCount=0;return o!==this.root&&(o.visible=r===2?n:r===1),o.visible?o.collapsed||(o.renderNodeCount+=a.length-i):(o.renderNodeCount=0,u&&a.pop()),this._onDidChangeRenderNodeCount.fire(o),o.visible}_updateAncestorsRenderNodeCount(o,s){if(s!==0)for(;o;)o.renderNodeCount+=s,this._onDidChangeRenderNodeCount.fire(o),o=o.parent}_filterNode(o,s){const a=this.filter?this.filter.filter(o.element,s):1;return typeof a=="boolean"?(o.filterData=void 0,a?1:0):C(a)?(o.filterData=a.data,d(a.visibility)):(o.filterData=void 0,d(a))}hasTreeNode(o,s=this.root){if(!o||o.length===0)return!0;const[a,...u]=o;return a<0||a>s.children.length?!1:this.hasTreeNode(u,s.children[a])}getTreeNode(o,s=this.root){if(!o||o.length===0)return s;const[a,...u]=o;if(a<0||a>s.children.length)throw new b.TreeError(this.user,"Invalid tree location");return this.getTreeNode(u,s.children[a])}getTreeNodeWithListIndex(o){if(o.length===0)return{node:this.root,listIndex:-1,revealed:!0,visible:!1};const{parentNode:s,listIndex:a,revealed:u,visible:r}=this.getParentNodeWithListIndex(o),i=o[o.length-1];if(i<0||i>s.children.length)throw new b.TreeError(this.user,"Invalid tree location");const n=s.children[i];return{node:n,listIndex:a,revealed:u,visible:r&&n.visible}}getParentNodeWithListIndex(o,s=this.root,a=0,u=!0,r=!0){const[i,...n]=o;if(i<0||i>s.children.length)throw new b.TreeError(this.user,"Invalid tree location");for(let t=0;t{var r;if(u.element!==null){const i=u;if(c.add(i.element),this.nodes.set(i.element,i),this.identityProvider){const n=this.identityProvider.getId(i.element).toString();o.add(n),this.nodesByIdentity.set(n,i)}(r=p.onDidCreateNode)===null||r===void 0||r.call(p,i)}},a=u=>{var r;if(u.element!==null){const i=u;if(c.has(i.element)||this.nodes.delete(i.element),this.identityProvider){const n=this.identityProvider.getId(i.element).toString();o.has(n)||this.nodesByIdentity.delete(n)}(r=p.onDidDeleteNode)===null||r===void 0||r.call(p,i)}};this.model.splice([...d,0],Number.MAX_VALUE,g,Object.assign(Object.assign({},p),{onDidCreateNode:s,onDidDeleteNode:a}))}preserveCollapseState(d=b.Iterable.empty()){return this.sorter&&(d=w.mergeSort([...d],this.sorter.compare.bind(this.sorter))),b.Iterable.map(d,g=>{let p=this.nodes.get(g.element);if(!p&&this.identityProvider){const s=this.identityProvider.getId(g.element).toString();p=this.nodesByIdentity.get(s)}if(!p)return Object.assign(Object.assign({},g),{children:this.preserveCollapseState(g.children)});const c=typeof g.collapsible=="boolean"?g.collapsible:p.collapsible,o=typeof g.collapsed!="undefined"?g.collapsed:p.collapsed;return Object.assign(Object.assign({},g),{collapsible:c,collapsed:o,children:this.preserveCollapseState(g.children)})})}rerender(d){const g=this.getElementLocation(d);this.model.rerender(g)}has(d){return this.nodes.has(d)}getListIndex(d){const g=this.getElementLocation(d);return this.model.getListIndex(g)}getListRenderCount(d){const g=this.getElementLocation(d);return this.model.getListRenderCount(g)}isCollapsible(d){const g=this.getElementLocation(d);return this.model.isCollapsible(g)}setCollapsible(d,g){const p=this.getElementLocation(d);return this.model.setCollapsible(p,g)}isCollapsed(d){const g=this.getElementLocation(d);return this.model.isCollapsed(g)}setCollapsed(d,g,p){const c=this.getElementLocation(d);return this.model.setCollapsed(c,g,p)}expandTo(d){const g=this.getElementLocation(d);this.model.expandTo(g)}refilter(){this.model.refilter()}getNode(d=null){if(d===null)return this.model.getNode(this.model.rootRef);const g=this.nodes.get(d);if(!g)throw new M.TreeError(this.user,`Tree element not found: ${d}`);return g}getNodeLocation(d){return d.element}getParentNodeLocation(d){if(d===null)throw new M.TreeError(this.user,"Invalid getParentNodeLocation call");const g=this.nodes.get(d);if(!g)throw new M.TreeError(this.user,`Tree element not found: ${d}`);const p=this.model.getNodeLocation(g),c=this.model.getParentNodeLocation(p);return this.model.getNode(c).element}getElementLocation(d){if(d===null)return[];const g=this.nodes.get(d);if(!g)throw new M.TreeError(this.user,`Tree element not found: ${d}`);return this.model.getNodeLocation(g)}}e.ObjectTreeModel=S}),define(Q[284],J([0,1,54,6,98,155]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompressibleObjectTreeModel=e.DefaultElementMapper=e.CompressedObjectTreeModel=e.decompress=e.compress=void 0;function S(n){const t=[n.element],l=n.incompressible||!1;return{element:{elements:t,incompressible:l},children:b.Iterable.map(b.Iterable.from(n.children),S),collapsible:n.collapsible,collapsed:n.collapsed}}function C(n){const t=[n.element],l=n.incompressible||!1;let h,m;for(;[m,h]=b.Iterable.consume(b.Iterable.from(n.children),2),!(m.length!==1||m[0].incompressible);)n=m[0],t.push(n.element);return{element:{elements:t,incompressible:l},children:b.Iterable.map(b.Iterable.concat(m,h),C),collapsible:n.collapsible,collapsed:n.collapsed}}e.compress=C;function d(n,t=0){let l;return td(h,0)),t===0&&n.element.incompressible?{element:n.element.elements[t],children:l,incompressible:!0,collapsible:n.collapsible,collapsed:n.collapsed}:{element:n.element.elements[t],children:l,collapsible:n.collapsible,collapsed:n.collapsed}}function g(n){return d(n,0)}e.decompress=g;function p(n,t,l){return n.element===t?Object.assign(Object.assign({},n),{children:l}):Object.assign(Object.assign({},n),{children:b.Iterable.map(b.Iterable.from(n.children),h=>p(h,t,l))})}const c=n=>({getId(t){return t.elements.map(l=>n.getId(l).toString()).join("\0")}});class o{constructor(t,l,h={}){this.user=t,this.rootRef=null,this.nodes=new Map,this.model=new w.ObjectTreeModel(t,l,h),this.enabled=typeof h.compressionEnabled=="undefined"?!0:h.compressionEnabled,this.identityProvider=h.identityProvider}get onDidSplice(){return this.model.onDidSplice}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}get onDidChangeRenderNodeCount(){return this.model.onDidChangeRenderNodeCount}setChildren(t,l=b.Iterable.empty(),h){const m=h.diffIdentityProvider&&c(h.diffIdentityProvider);if(t===null){const T=b.Iterable.map(l,this.enabled?C:S);this._setChildren(null,T,{diffIdentityProvider:m,diffDepth:Infinity});return}const _=this.nodes.get(t);if(!_)throw new Error("Unknown compressed tree node");const f=this.model.getNode(_),v=this.model.getParentNodeLocation(_),y=this.model.getNode(v),L=g(f),I=p(L,t,l),k=(this.enabled?C:S)(I),E=y.children.map(T=>T===f?k:T);this._setChildren(y.element,E,{diffIdentityProvider:m,diffDepth:f.depth-y.depth})}setCompressionEnabled(t){if(t!==this.enabled){this.enabled=t;const h=this.model.getNode().children,m=b.Iterable.map(h,g),_=b.Iterable.map(m,t?C:S);this._setChildren(null,_,{diffIdentityProvider:this.identityProvider,diffDepth:Infinity})}}_setChildren(t,l,h){const m=new Set,_=v=>{for(const y of v.element.elements)m.add(y),this.nodes.set(y,v.element)},f=v=>{for(const y of v.element.elements)m.has(y)||this.nodes.delete(y)};this.model.setChildren(t,l,Object.assign(Object.assign({},h),{onDidCreateNode:_,onDidDeleteNode:f}))}has(t){return this.nodes.has(t)}getListIndex(t){const l=this.getCompressedNode(t);return this.model.getListIndex(l)}getListRenderCount(t){const l=this.getCompressedNode(t);return this.model.getListRenderCount(l)}getNode(t){if(typeof t=="undefined")return this.model.getNode();const l=this.getCompressedNode(t);return this.model.getNode(l)}getNodeLocation(t){const l=this.model.getNodeLocation(t);return l===null?null:l.elements[l.elements.length-1]}getParentNodeLocation(t){const l=this.getCompressedNode(t),h=this.model.getParentNodeLocation(l);return h===null?null:h.elements[h.elements.length-1]}isCollapsible(t){const l=this.getCompressedNode(t);return this.model.isCollapsible(l)}setCollapsible(t,l){const h=this.getCompressedNode(t);return this.model.setCollapsible(h,l)}isCollapsed(t){const l=this.getCompressedNode(t);return this.model.isCollapsed(l)}setCollapsed(t,l,h){const m=this.getCompressedNode(t);return this.model.setCollapsed(m,l,h)}expandTo(t){const l=this.getCompressedNode(t);this.model.expandTo(l)}rerender(t){const l=this.getCompressedNode(t);this.model.rerender(l)}refilter(){this.model.refilter()}getCompressedNode(t){if(t===null)return null;const l=this.nodes.get(t);if(!l)throw new M.TreeError(this.user,`Tree element not found: ${t}`);return l}}e.CompressedObjectTreeModel=o;const s=n=>n[n.length-1];e.DefaultElementMapper=s;class a{constructor(t,l){this.unwrapper=t,this.node=l}get element(){return this.node.element===null?null:this.unwrapper(this.node.element)}get children(){return this.node.children.map(t=>new a(this.unwrapper,t))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}}function u(n,t){return{splice(l,h,m){t.splice(l,h,m.map(_=>n.map(_)))},updateElementHeight(l,h){t.updateElementHeight(l,h)}}}function r(n,t){return Object.assign(Object.assign({},t),{identityProvider:t.identityProvider&&{getId(l){return t.identityProvider.getId(n(l))}},sorter:t.sorter&&{compare(l,h){return t.sorter.compare(l.elements[0],h.elements[0])}},filter:t.filter&&{filter(l,h){return t.filter.filter(n(l),h)}}})}class i{constructor(t,l,h={}){this.rootRef=null,this.elementMapper=h.elementMapper||e.DefaultElementMapper;const m=_=>this.elementMapper(_.elements);this.nodeMapper=new M.WeakMapper(_=>new a(m,_)),this.model=new o(t,u(this.nodeMapper,l),r(m,h))}get onDidSplice(){return N.Event.map(this.model.onDidSplice,({insertedNodes:t,deletedNodes:l})=>({insertedNodes:t.map(h=>this.nodeMapper.map(h)),deletedNodes:l.map(h=>this.nodeMapper.map(h))}))}get onDidChangeCollapseState(){return N.Event.map(this.model.onDidChangeCollapseState,({node:t,deep:l})=>({node:this.nodeMapper.map(t),deep:l}))}get onDidChangeRenderNodeCount(){return N.Event.map(this.model.onDidChangeRenderNodeCount,t=>this.nodeMapper.map(t))}setChildren(t,l=b.Iterable.empty(),h={}){this.model.setChildren(t,l,h)}setCompressionEnabled(t){this.model.setCompressionEnabled(t)}has(t){return this.model.has(t)}getListIndex(t){return this.model.getListIndex(t)}getListRenderCount(t){return this.model.getListRenderCount(t)}getNode(t){return this.nodeMapper.map(this.model.getNode(t))}getNodeLocation(t){return t.element}getParentNodeLocation(t){return this.model.getParentNodeLocation(t)}isCollapsible(t){return this.model.isCollapsible(t)}setCollapsible(t,l){return this.model.setCollapsible(t,l)}isCollapsed(t){return this.model.isCollapsed(t)}setCollapsed(t,l,h){return this.model.setCollapsed(t,l,h)}expandTo(t){return this.model.expandTo(t)}rerender(t){return this.model.rerender(t)}refilter(){return this.model.refilter()}getCompressedTreeNode(t=null){return this.model.getNode(t)}}e.CompressibleObjectTreeModel=i}),define(Q[285],J([0,1,8]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.buildReplaceStringWithCasePreserved=void 0;function N(S,C){if(S&&S[0]!==""){const d=M(S,C,"-"),g=M(S,C,"_");return d&&!g?w(S,C,"-"):!d&&g?w(S,C,"_"):S[0].toUpperCase()===S[0]?C.toUpperCase():S[0].toLowerCase()===S[0]?C.toLowerCase():b.containsUppercaseCharacter(S[0][0])&&C.length>0?C[0].toUpperCase()+C.substr(1):C}else return C}e.buildReplaceStringWithCasePreserved=N;function M(S,C,d){return S[0].indexOf(d)!==-1&&C.indexOf(d)!==-1&&S[0].split(d).length===C.split(d).length}function w(S,C,d){const g=C.split(d),p=S[0].split(d);let c="";return g.forEach((o,s)=>{c+=N([p[s]],o)+d}),c.slice(0,-1)}}),define(Q[82],J([0,1,8]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var N;(function(M){M[M.Ignore=0]="Ignore",M[M.Info=1]="Info",M[M.Warning=2]="Warning",M[M.Error=3]="Error"})(N||(N={})),function(M){const w="error",S="warning",C="warn",d="info";function g(p){return p?b.equalsIgnoreCase(w,p)?M.Error:b.equalsIgnoreCase(S,p)||b.equalsIgnoreCase(C,p)?M.Warning:b.equalsIgnoreCase(d,p)?M.Info:M.Ignore:M.Ignore}M.fromValue=g}(N||(N={})),e.default=N}),define(Q[20],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.withNullAsUndefined=e.createProxyObject=e.getAllMethodNames=e.getAllPropertyNames=e.validateConstraint=e.validateConstraints=e.isFunction=e.assertIsDefined=e.assertType=e.isUndefinedOrNull=e.isUndefined=e.isBoolean=e.isNumber=e.isObject=e.isString=e.isArray=void 0;function b(n){return Array.isArray(n)}e.isArray=b;function N(n){return typeof n=="string"}e.isString=N;function M(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)&&!(n instanceof RegExp)&&!(n instanceof Date)}e.isObject=M;function w(n){return typeof n=="number"&&!isNaN(n)}e.isNumber=w;function S(n){return n===!0||n===!1}e.isBoolean=S;function C(n){return typeof n=="undefined"}e.isUndefined=C;function d(n){return C(n)||n===null}e.isUndefinedOrNull=d;function g(n,t){if(!n)throw new Error(t?`Unexpected type, expected '${t}'`:"Unexpected type")}e.assertType=g;function p(n){if(d(n))throw new Error("Assertion Failed: argument is undefined or null");return n}e.assertIsDefined=p;function c(n){return typeof n=="function"}e.isFunction=c;function o(n,t){const l=Math.min(n.length,t.length);for(let h=0;hfunction(){const _=Array.prototype.slice.call(arguments,0);return t(m,_)};let h={};for(const m of n)h[m]=l(m);return h}e.createProxyObject=r;function i(n){return n===null?void 0:n}e.withNullAsUndefined=i}),define(Q[40],J([0,1,20]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getOrDefault=e.equals=e.mixin=e.cloneAndChange=e.deepFreeze=e.deepClone=void 0;function N(c){if(!c||typeof c!="object"||c instanceof RegExp)return c;const o=Array.isArray(c)?[]:{};return Object.keys(c).forEach(s=>{c[s]&&typeof c[s]=="object"?o[s]=N(c[s]):o[s]=c[s]}),o}e.deepClone=N;function M(c){if(!c||typeof c!="object")return c;const o=[c];for(;o.length>0;){const s=o.shift();Object.freeze(s);for(const a in s)if(w.call(s,a)){const u=s[a];typeof u=="object"&&!Object.isFrozen(u)&&o.push(u)}}return c}e.deepFreeze=M;const w=Object.prototype.hasOwnProperty;function S(c,o){return C(c,o,new Set)}e.cloneAndChange=S;function C(c,o,s){if(b.isUndefinedOrNull(c))return c;const a=o(c);if(typeof a!="undefined")return a;if(b.isArray(c)){const u=[];for(const r of c)u.push(C(r,o,s));return u}if(b.isObject(c)){if(s.has(c))throw new Error("Cannot clone recursive data-structure");s.add(c);const u={};for(let r in c)w.call(c,r)&&(u[r]=C(c[r],o,s));return s.delete(c),u}return c}function d(c,o,s=!0){return b.isObject(c)?(b.isObject(o)&&Object.keys(o).forEach(a=>{a in c?s&&(b.isObject(c[a])&&b.isObject(o[a])?d(c[a],o[a],s):c[a]=o[a]):c[a]=o[a]}),c):o}e.mixin=d;function g(c,o){if(c===o)return!0;if(c==null||o===null||o===void 0||typeof c!=typeof o||typeof c!="object"||Array.isArray(c)!==Array.isArray(o))return!1;let s,a;if(Array.isArray(c)){if(c.length!==o.length)return!1;for(s=0;s255?255:M|0}e.toUint8=b;function N(M){return M<0?0:M>4294967295?4294967295:M|0}e.toUint32=N}),define(Q[24],J([0,1,17,72]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.uriToFsPath=e.URI=void 0;const M=/^\w[\w\d+.-]*$/,w=/^\//,S=/^\/\//;function C(f,v){if(!f.scheme&&v)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${f.authority}", path: "${f.path}", query: "${f.query}", fragment: "${f.fragment}"}`);if(f.scheme&&!M.test(f.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(f.path){if(f.authority){if(!w.test(f.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(S.test(f.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}function d(f,v){return!f&&!v?"file":f}function g(f,v){switch(f){case"https":case"http":case"file":v?v[0]!==c&&(v=c+v):v=c;break}return v}const p="",c="/",o=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class s{constructor(v,y,L,I,k,E=!1){typeof v=="object"?(this.scheme=v.scheme||p,this.authority=v.authority||p,this.path=v.path||p,this.query=v.query||p,this.fragment=v.fragment||p):(this.scheme=d(v,E),this.authority=y||p,this.path=g(this.scheme,L||p),this.query=I||p,this.fragment=k||p,C(this,E))}static isUri(v){return v instanceof s?!0:v?typeof v.authority=="string"&&typeof v.fragment=="string"&&typeof v.path=="string"&&typeof v.query=="string"&&typeof v.scheme=="string"&&typeof v.fsPath=="string"&&typeof v.with=="function"&&typeof v.toString=="function":!1}get fsPath(){return t(this,!1)}with(v){if(!v)return this;let{scheme:y,authority:L,path:I,query:k,fragment:E}=v;return y===void 0?y=this.scheme:y===null&&(y=p),L===void 0?L=this.authority:L===null&&(L=p),I===void 0?I=this.path:I===null&&(I=p),k===void 0?k=this.query:k===null&&(k=p),E===void 0?E=this.fragment:E===null&&(E=p),y===this.scheme&&L===this.authority&&I===this.path&&k===this.query&&E===this.fragment?this:new u(y,L,I,k,E)}static parse(v,y=!1){const L=o.exec(v);return L?new u(L[2]||p,_(L[4]||p),_(L[5]||p),_(L[7]||p),_(L[9]||p),y):new u(p,p,p,p,p)}static file(v){let y=p;if(b.isWindows&&(v=v.replace(/\\/g,c)),v[0]===c&&v[1]===c){const L=v.indexOf(c,2);L===-1?(y=v.substring(2),v=c):(y=v.substring(2,L),v=v.substring(L)||c)}return new u("file",y,v,p,p)}static from(v){return new u(v.scheme,v.authority,v.path,v.query,v.fragment)}static joinPath(v,...y){if(!v.path)throw new Error("[UriError]: cannot call joinPath on URI without path");let L;return b.isWindows&&v.scheme==="file"?L=s.file(N.win32.join(t(v,!0),...y)).path:L=N.posix.join(v.path,...y),v.with({path:L})}toString(v=!1){return l(this,v)}toJSON(){return this}static revive(v){if(v){if(v instanceof s)return v;{const y=new u(v);return y._formatted=v.external,y._fsPath=v._sep===a?v.fsPath:null,y}}else return v}}e.URI=s;const a=b.isWindows?1:void 0;class u extends s{constructor(){super(...arguments);this._formatted=null,this._fsPath=null}get fsPath(){return this._fsPath||(this._fsPath=t(this,!1)),this._fsPath}toString(v=!1){return v?l(this,!0):(this._formatted||(this._formatted=l(this,!1)),this._formatted)}toJSON(){const v={$mid:1};return this._fsPath&&(v.fsPath=this._fsPath,v._sep=a),this._formatted&&(v.external=this._formatted),this.path&&(v.path=this.path),this.scheme&&(v.scheme=this.scheme),this.authority&&(v.authority=this.authority),this.query&&(v.query=this.query),this.fragment&&(v.fragment=this.fragment),v}}const r={[58]:"%3A",[47]:"%2F",[63]:"%3F",[35]:"%23",[91]:"%5B",[93]:"%5D",[64]:"%40",[33]:"%21",[36]:"%24",[38]:"%26",[39]:"%27",[40]:"%28",[41]:"%29",[42]:"%2A",[43]:"%2B",[44]:"%2C",[59]:"%3B",[61]:"%3D",[32]:"%20"};function i(f,v){let y,L=-1;for(let I=0;I=97&&k<=122||k>=65&&k<=90||k>=48&&k<=57||k===45||k===46||k===95||k===126||v&&k===47)L!==-1&&(y+=encodeURIComponent(f.substring(L,I)),L=-1),y!==void 0&&(y+=f.charAt(I));else{y===void 0&&(y=f.substr(0,I));const E=r[k];E!==void 0?(L!==-1&&(y+=encodeURIComponent(f.substring(L,I)),L=-1),y+=E):L===-1&&(L=I)}}return L!==-1&&(y+=encodeURIComponent(f.substring(L))),y!==void 0?y:f}function n(f){let v;for(let y=0;y1&&f.scheme==="file"?y=`//${f.authority}${f.path}`:f.path.charCodeAt(0)===47&&(f.path.charCodeAt(1)>=65&&f.path.charCodeAt(1)<=90||f.path.charCodeAt(1)>=97&&f.path.charCodeAt(1)<=122)&&f.path.charCodeAt(2)===58?v?y=f.path.substr(1):y=f.path[1].toLowerCase()+f.path.substr(2):y=f.path,b.isWindows&&(y=y.replace(/\//g,"\\")),y}e.uriToFsPath=t;function l(f,v){const y=v?n:i;let L="",{scheme:I,authority:k,path:E,query:T,fragment:O}=f;if(I&&(L+=I,L+=":"),(k||I==="file")&&(L+=c,L+=c),k){let A=k.indexOf("@");if(A!==-1){const B=k.substr(0,A);k=k.substr(A+1),A=B.indexOf(":"),A===-1?L+=y(B,!1):(L+=y(B.substr(0,A),!1),L+=":",L+=y(B.substr(A+1),!1)),L+="@"}k=k.toLowerCase(),A=k.indexOf(":"),A===-1?L+=y(k,!1):(L+=y(k.substr(0,A),!1),L+=k.substr(A))}if(E){if(E.length>=3&&E.charCodeAt(0)===47&&E.charCodeAt(2)===58){const A=E.charCodeAt(1);A>=65&&A<=90&&(E=`/${String.fromCharCode(A+32)}:${E.substr(3)}`)}else if(E.length>=2&&E.charCodeAt(1)===58){const A=E.charCodeAt(0);A>=65&&A<=90&&(E=`${String.fromCharCode(A+32)}:${E.substr(2)}`)}L+=y(E,!0)}return T&&(L+="?",L+=y(T,!1)),O&&(L+="#",L+=v?O:i(O,!1)),L}function h(f){try{return decodeURIComponent(f)}catch(v){return f.length>3?f.substr(0,3)+h(f.substr(3)):f}}const m=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function _(f){return f.match(m)?f.replace(m,v=>h(v)):f}}),define(Q[51],J([0,1,24,8]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LRUCache=e.LinkedMap=e.ResourceMap=e.TernarySearchTree=e.UriIterator=e.PathIterator=e.ConfigKeysIterator=e.StringIterator=void 0;class M{constructor(){this._value="",this._pos=0}reset(a){return this._value=a,this._pos=0,this}next(){return this._pos+=1,this}hasNext(){return this._pos!1){return new g(new C(a))}static forStrings(){return new g(new M)}static forConfigKeys(){return new g(new w)}clear(){this._root=void 0}set(a,u){const r=this._iter.reset(a);let i;for(this._root||(this._root=new d,this._root.segment=r.value()),i=this._root;;){const t=r.cmp(i.segment);if(t>0)i.left||(i.left=new d,i.left.segment=r.value()),i=i.left;else if(t<0)i.right||(i.right=new d,i.right.segment=r.value()),i=i.right;else if(r.hasNext())r.next(),i.mid||(i.mid=new d,i.mid.segment=r.value()),i=i.mid;else break}const n=i.value;return i.value=u,i.key=a,n}get(a){var u;return(u=this._getNode(a))===null||u===void 0?void 0:u.value}_getNode(a){const u=this._iter.reset(a);let r=this._root;for(;r;){const i=u.cmp(r.segment);if(i>0)r=r.left;else if(i<0)r=r.right;else if(u.hasNext())u.next(),r=r.mid;else break}return r}has(a){const u=this._getNode(a);return!((u==null?void 0:u.value)===void 0&&(u==null?void 0:u.mid)===void 0)}delete(a){return this._delete(a,!1)}deleteSuperstr(a){return this._delete(a,!0)}_delete(a,u){const r=this._iter.reset(a),i=[];let n=this._root;for(;n;){const t=r.cmp(n.segment);if(t>0)i.push([1,n]),n=n.left;else if(t<0)i.push([-1,n]),n=n.right;else if(r.hasNext())r.next(),i.push([0,n]),n=n.mid;else{for(u?(n.left=void 0,n.mid=void 0,n.right=void 0):n.value=void 0;i.length>0&&n.isEmpty();){let[l,h]=i.pop();switch(l){case 1:h.left=void 0;break;case 0:h.mid=void 0;break;case-1:h.right=void 0;break}n=h}break}}}findSubstr(a){const u=this._iter.reset(a);let r=this._root,i;for(;r;){const n=u.cmp(r.segment);if(n>0)r=r.left;else if(n<0)r=r.right;else if(u.hasNext())u.next(),i=r.value||i,r=r.mid;else break}return r&&r.value||i}findSuperstr(a){const u=this._iter.reset(a);let r=this._root;for(;r;){const i=u.cmp(r.segment);if(i>0)r=r.left;else if(i<0)r=r.right;else if(u.hasNext())u.next(),r=r.mid;else return r.mid?this._entries(r.mid):void 0}}forEach(a){for(const[u,r]of this)a(r,u)}*[Symbol.iterator](){yield*this._entries(this._root)}*_entries(a){a&&(yield*this._entries(a.left),a.value&&(yield[a.key,a.value]),yield*this._entries(a.mid),yield*this._entries(a.right))}}e.TernarySearchTree=g;class p{constructor(a,u){this[Symbol.toStringTag]="ResourceMap",a instanceof p?(this.map=new Map(a.map),this.toKey=u!=null?u:p.defaultToKey):(this.map=new Map,this.toKey=a!=null?a:p.defaultToKey)}set(a,u){return this.map.set(this.toKey(a),u),this}get(a){return this.map.get(this.toKey(a))}has(a){return this.map.has(this.toKey(a))}get size(){return this.map.size}clear(){this.map.clear()}delete(a){return this.map.delete(this.toKey(a))}forEach(a,u){typeof u!="undefined"&&(a=a.bind(u));for(let[r,i]of this.map)a(i,b.URI.parse(r),this)}values(){return this.map.values()}*keys(){for(let a of this.map.keys())yield b.URI.parse(a)}*entries(){for(let a of this.map.entries())yield[b.URI.parse(a[0]),a[1]]}*[Symbol.iterator](){for(let a of this.map)yield[b.URI.parse(a[0]),a[1]]}}e.ResourceMap=p,p.defaultToKey=s=>s.toString();class c{constructor(){this[Symbol.toStringTag]="LinkedMap",this._map=new Map,this._head=void 0,this._tail=void 0,this._size=0,this._state=0}clear(){this._map.clear(),this._head=void 0,this._tail=void 0,this._size=0,this._state++}isEmpty(){return!this._head&&!this._tail}get size(){return this._size}get first(){var a;return(a=this._head)===null||a===void 0?void 0:a.value}get last(){var a;return(a=this._tail)===null||a===void 0?void 0:a.value}has(a){return this._map.has(a)}get(a,u=0){const r=this._map.get(a);if(!!r)return u!==0&&this.touch(r,u),r.value}set(a,u,r=0){let i=this._map.get(a);if(i)i.value=u,r!==0&&this.touch(i,r);else{switch(i={key:a,value:u,next:void 0,previous:void 0},r){case 0:this.addItemLast(i);break;case 1:this.addItemFirst(i);break;case 2:this.addItemLast(i);break;default:this.addItemLast(i);break}this._map.set(a,i),this._size++}return this}delete(a){return!!this.remove(a)}remove(a){const u=this._map.get(a);if(!!u)return this._map.delete(a),this.removeItem(u),this._size--,u.value}shift(){if(!(!this._head&&!this._tail)){if(!this._head||!this._tail)throw new Error("Invalid list");const a=this._head;return this._map.delete(a.key),this.removeItem(a),this._size--,a.value}}forEach(a,u){const r=this._state;let i=this._head;for(;i;){if(u?a.bind(u)(i.value,i.key,this):a(i.value,i.key,this),this._state!==r)throw new Error("LinkedMap got modified during iteration.");i=i.next}}keys(){const a=this,u=this._state;let r=this._head;const i={[Symbol.iterator](){return i},next(){if(a._state!==u)throw new Error("LinkedMap got modified during iteration.");if(r){const n={value:r.key,done:!1};return r=r.next,n}else return{value:void 0,done:!0}}};return i}values(){const a=this,u=this._state;let r=this._head;const i={[Symbol.iterator](){return i},next(){if(a._state!==u)throw new Error("LinkedMap got modified during iteration.");if(r){const n={value:r.value,done:!1};return r=r.next,n}else return{value:void 0,done:!0}}};return i}entries(){const a=this,u=this._state;let r=this._head;const i={[Symbol.iterator](){return i},next(){if(a._state!==u)throw new Error("LinkedMap got modified during iteration.");if(r){const n={value:[r.key,r.value],done:!1};return r=r.next,n}else return{value:void 0,done:!0}}};return i}[Symbol.iterator](){return this.entries()}trimOld(a){if(!(a>=this.size)){if(a===0){this.clear();return}let u=this._head,r=this.size;for(;u&&r>a;)this._map.delete(u.key),u=u.next,r--;this._head=u,this._size=r,u&&(u.previous=void 0),this._state++}}addItemFirst(a){if(!this._head&&!this._tail)this._tail=a;else if(this._head)a.next=this._head,this._head.previous=a;else throw new Error("Invalid list");this._head=a,this._state++}addItemLast(a){if(!this._head&&!this._tail)this._head=a;else if(this._tail)a.previous=this._tail,this._tail.next=a;else throw new Error("Invalid list");this._tail=a,this._state++}removeItem(a){if(a===this._head&&a===this._tail)this._head=void 0,this._tail=void 0;else if(a===this._head){if(!a.next)throw new Error("Invalid list");a.next.previous=void 0,this._head=a.next}else if(a===this._tail){if(!a.previous)throw new Error("Invalid list");a.previous.next=void 0,this._tail=a.previous}else{const u=a.next,r=a.previous;if(!u||!r)throw new Error("Invalid list");u.previous=r,r.next=u}a.next=void 0,a.previous=void 0,this._state++}touch(a,u){if(!this._head||!this._tail)throw new Error("Invalid list");if(!(u!==1&&u!==2)){if(u===1){if(a===this._head)return;const r=a.next,i=a.previous;a===this._tail?(i.next=void 0,this._tail=i):(r.previous=i,i.next=r),a.previous=void 0,a.next=this._head,this._head.previous=a,this._head=a,this._state++}else if(u===2){if(a===this._tail)return;const r=a.next,i=a.previous;a===this._head?(r.previous=void 0,this._head=r):(r.previous=i,i.next=r),a.next=void 0,a.previous=this._tail,this._tail.next=a,this._tail=a,this._state++}}}toJSON(){const a=[];return this.forEach((u,r)=>{a.push([r,u])}),a}fromJSON(a){this.clear();for(const[u,r]of a)this.set(u,r)}}e.LinkedMap=c;class o extends c{constructor(a,u=1){super();this._limit=a,this._ratio=Math.min(Math.max(0,u),1)}get limit(){return this._limit}set limit(a){this._limit=a,this.checkTrim()}get(a,u=2){return super.get(a,u)}peek(a){return super.get(a,0)}set(a,u){return super.set(a,u,2),this.checkTrim(),this}checkTrim(){this.size>this._limit&&this.trimOld(Math.round(this._limit*this._ratio))}}e.LRUCache=o}),define(Q[66],J([0,1,51,8]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.fuzzyScoreGracefulAggressive=e.fuzzyScore=e.FuzzyScore=e.isPatternInWord=e.createMatches=e.anyScore=e.matchesFuzzy=e.matchesWords=e.matchesCamelCase=e.isUpper=e.matchesSubString=e.matchesContiguousSubString=e.matchesPrefix=e.or=void 0;function M(...G){return function(j,te){for(let Z=0,ue=G.length;Z0?[{start:0,end:j.length}]:[]:null}function S(G,j){const te=j.toLowerCase().indexOf(G.toLowerCase());return te===-1?null:[{start:te,end:te+G.length}]}e.matchesContiguousSubString=S;function C(G,j){return d(G.toLowerCase(),j.toLowerCase(),0,0)}e.matchesSubString=C;function d(G,j,te,Z){if(te===G.length)return[];if(Z===j.length)return null;if(G[te]===j[Z]){let ue=null;return(ue=d(G,j,te+1,Z+1))?i({start:Z,end:Z+1},ue):null}return d(G,j,te,Z+1)}function g(G){return 97<=G&&G<=122}function p(G){return 65<=G&&G<=90}e.isUpper=p;function c(G){return 48<=G&&G<=57}function o(G){return G===32||G===9||G===10||G===13}const s=new Set;"`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?".split("").forEach(G=>s.add(G.charCodeAt(0)));function a(G){return o(G)||s.has(G)}function u(G,j){return G===j||a(G)&&a(j)}function r(G){return g(G)||p(G)||c(G)}function i(G,j){return j.length===0?j=[G]:G.end===j[0].start?j[0].start=G.start:j.unshift(G),j}function n(G,j){for(let te=j;te0&&!r(G.charCodeAt(te-1)))return te}return G.length}function t(G,j,te,Z){if(te===G.length)return[];if(Z===j.length)return null;if(G[te]!==j[Z].toLowerCase())return null;{let ue=null,he=Z+1;for(ue=t(G,j,te+1,Z+1);!ue&&(he=n(j,he)).6}function m(G){const{upperPercent:j,lowerPercent:te,alphaPercent:Z,numericPercent:ue}=G;return te>.2&&j<.8&&Z>.6&&ue<.2}function _(G){let j=0,te=0,Z=0,ue=0;for(let he=0;he60)return null;const te=l(j);if(!m(te)){if(!h(te))return null;j=j.toLowerCase()}let Z=null,ue=0;for(G=G.toLowerCase();ue0&&a(G.charCodeAt(te-1)))return te;return G.length}const I=M(e.matchesPrefix,f,S),k=M(e.matchesPrefix,f,C),E=new b.LRUCache(1e4);function T(G,j,te=!1){if(typeof G!="string"||typeof j!="string")return null;let Z=E.get(G);Z||(Z=new RegExp(N.convertSimple2RegExpPattern(G),"i"),E.set(G,Z));const ue=Z.exec(j);return ue?[{start:ue.index,end:ue.index+ue[0].length}]:te?k(G,j):I(G,j)}e.matchesFuzzy=T;function O(G,j,te,Z,ue,he){const re=U(G,j,0,Z,ue,0,!0);if(re)return re;let ce=[],me=0,Ce=he;for(let be=0;be=0)me+=1,ce.unshift(Le),Ce=Le+1;else if(ce.length>0)break}return[me,he,...ce]}e.anyScore=O;function A(G){if(typeof G=="undefined")return[];const j=[],te=G[1];for(let Z=G.length-1;Z>1;Z--){const ue=G[Z]+te,he=j[j.length-1];he&&he.end===ue?he.end=ue+1:j.push({start:ue,end:ue+1})}return j}e.createMatches=A;const B=128;function F(){const G=[],j=[];for(let te=0;te<=B;te++)j[te]=0;for(let te=0;te<=B;te++)G.push(j.slice(0));return G}function D(G){const j=[];for(let te=0;te<=G;te++)j[te]=0;return j}const R=D(2*B),W=D(2*B),x=F(),K=F(),Y=F(),ee=!1;function se(G,j,te,Z,ue){function he(ce,me,Ce=" "){for(;ce.lengthhe(ce,3)).join("|")} +`;for(let ce=0;ce<=te;ce++)ce===0?re+=" |":re+=`${j[ce-1]}|`,re+=G[ce].slice(0,ue+1).map(me=>he(me.toString(),3)).join("|")+` +`;return re}function ne(G,j,te,Z){G=G.substr(j),te=te.substr(Z),console.log(se(K,G,G.length,te,te.length)),console.log(se(Y,G,G.length,te,te.length)),console.log(se(x,G,G.length,te,te.length))}function le(G,j){if(j<0||j>=G.length)return!1;const te=G.codePointAt(j);switch(te){case 95:case 45:case 46:case 32:case 47:case 92:case 39:case 34:case 58:case 36:case 60:case 40:case 91:return!0;case void 0:return!1;default:return!!N.isEmojiImprecise(te)}}function X(G,j){if(j<0||j>=G.length)return!1;switch(G.charCodeAt(j)){case 32:case 9:return!0;default:return!1}}function z(G,j,te){return j[G]!==te[G]}function P(G,j,te,Z,ue,he,re=!1){for(;jB?B:G.length,me=Z.length>B?B:Z.length;if(!(te>=ce||he>=me||ce-te>me-he)&&!!P(j,te,ce,ue,he,me,!0)){H(ce,me,te,he,j,ue);let Ce=1,be=1,Le=te,De=he;const Re=[!1];for(Ce=1,Le=te;Leye,Ne=ke?K[Ce][be-1]+(x[Ce][be-1]>0?-5:0):0,Te=De>ye+1&&x[Ce][be-1]>0,Oe=Te?K[Ce][be-2]+(x[Ce][be-2]>0?-5:0):0;if(Te&&(!ke||Oe>=Ne)&&(!pe||Oe>=ve))K[Ce][be]=Oe,Y[Ce][be]=3,x[Ce][be]=0;else if(ke&&(!pe||Ne>=ve))K[Ce][be]=Ne,Y[Ce][be]=2,x[Ce][be]=0;else if(pe)K[Ce][be]=ve,Y[Ce][be]=1,x[Ce][be]=x[Ce-1][be-1]+1;else throw new Error("not possible")}}if(ee&&ne(G,te,Z,he),!(!Re[0]&&!re)){Ce--,be--;const Ee=[K[Ce][be],he];let Ae=0,Se=0;for(;Ce>=1;){let ye=be;do{const fe=Y[Ce][ye];if(fe===3)ye=ye-2;else if(fe===2)ye=ye-1;else break}while(ye>=1);Ae>1&&j[te+Ce-1]===ue[he+be-1]&&!z(ye+he-1,Z,ue)&&Ae+1>x[Ce][ye]&&(ye=be),ye===be?Ae++:Ae=1,Se||(Se=ye),Ce--,be=ye-1,Ee.push(be)}me===ce&&(Ee[0]+=2);const we=Se-ce;return Ee[0]-=we,Ee}}}e.fuzzyScore=U;function H(G,j,te,Z,ue,he){let re=G-1,ce=j-1;for(;re>=te&&ce>=Z;)ue[re]===he[ce]&&(W[re]=ce,re--),ce--}function $(G,j,te,Z,ue,he,re,ce,me,Ce,be){if(j[te]!==he[re])return Number.MIN_SAFE_INTEGER;let Le=1,De=!1;return re===te-Z?Le=G[te]===ue[re]?7:5:z(re,ue,he)&&(re===0||!z(re-1,ue,he))?(Le=G[te]===ue[re]?7:5,De=!0):le(he,re)&&(re===0||!le(he,re-1))?Le=5:(le(he,re-1)||X(he,re-1))&&(Le=5,De=!0),Le>1&&te===Z&&(be[0]=!0),De||(De=z(re,ue,he)||le(he,re-1)||X(he,re-1)),te===Z?re>me&&(Le-=De?3:5):Ce?Le+=De?2:0:Le+=De?0:1,re+1===ce&&(Le-=De?3:5),Le}function ie(G,j,te,Z,ue,he,re){return oe(G,j,te,Z,ue,he,!0,re)}e.fuzzyScoreGracefulAggressive=ie;function oe(G,j,te,Z,ue,he,re,ce){let me=U(G,j,te,Z,ue,he,ce);if(me&&!re)return me;if(G.length>=3){const Ce=Math.min(7,G.length-1);for(let be=te+1;beme[0])&&(me=De))}}}return me}function ae(G,j){if(!(j+1>=G.length)){const te=G[j],Z=G[j+1];if(te!==Z)return G.slice(0,j)+Z+te+G.slice(j+2)}}}),define(Q[286],J([0,1,66,72,17,8]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.pieceToQuery=e.prepareQuery=e.scoreFuzzy2=void 0;const S=[void 0,[]];function C(r,i,n=0,t=0){const l=i;return l.values&&l.values.length>1?d(r,l.values,n,t):g(r,i,n,t)}e.scoreFuzzy2=C;function d(r,i,n,t){let l=0;const h=[];for(const m of i){const[_,f]=g(r,m,n,t);if(typeof _!="number")return S;l+=_,h.push(...f)}return[l,p(h)]}function g(r,i,n,t){const l=b.fuzzyScore(i.original,i.originalLowercase,n,r,r.toLowerCase(),t,!0);return l?[l[0],b.createMatches(l)]:S}function p(r){const i=r.sort((l,h)=>l.start-h.start),n=[];let t;for(const l of i)!t||!c(t,l)?(t=l,n.push(l)):(t.start=Math.min(t.start,l.start),t.end=Math.max(t.end,l.end));return n}function c(r,i){return!(r.end=0;let m;const _=r.split(o);if(_.length>1)for(const f of _){const{pathNormalized:v,normalized:y,normalizedLowercase:L}=a(f);y&&(m||(m=[]),m.push({original:f,originalLowercase:f.toLowerCase(),pathNormalized:v,normalized:y,normalizedLowercase:L}))}return{original:r,originalLowercase:i,pathNormalized:n,normalized:t,normalizedLowercase:l,values:m,containsPathSeparator:h}}e.prepareQuery=s;function a(r){let i;M.isWindows?i=r.replace(/\//g,N.sep):i=r.replace(/\\/g,N.sep);const n=w.stripWildcards(i).replace(/\s/g,"");return{pathNormalized:i,normalized:n,normalizedLowercase:n.toLowerCase()}}function u(r){return Array.isArray(r)?s(r.map(i=>i.original).join(o)):s(r.original)}e.pieceToQuery=u}),define(Q[198],J([0,1,8,152,72,51,15]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isRelativePattern=e.parse=e.match=e.splitGlobAware=void 0;const C="**",d="/",g="[/\\\\]",p="[^/\\\\]",c=/\//g;function o(R){switch(R){case 0:return"";case 1:return`${p}*?`;default:return`(?:${g}|${p}+${g}|${g}${p}+)*?`}}function s(R,W){if(!R)return[];const x=[];let K=!1,Y=!1,ee="";for(const se of R){switch(se){case W:if(!K&&!Y){x.push(ee),ee="";continue}break;case"{":K=!0;break;case"}":K=!1;break;case"[":Y=!0;break;case"]":Y=!1;break}ee+=se}return ee&&x.push(ee),x}e.splitGlobAware=s;function a(R){if(!R)return"";let W="";const x=s(R,d);if(x.every(K=>K===C))W=".*";else{let K=!1;x.forEach((Y,ee)=>{if(Y===C){K||(W+=o(2),K=!0);return}let se=!1,ne="",le=!1,X="";for(const z of Y){if(z!=="}"&&se){ne+=z;continue}if(le&&(z!=="]"||!X)){let P;z==="-"?P=z:(z==="^"||z==="!")&&!X?P="^":z===d?P="":P=b.escapeRegExpCharacters(z),X+=P;continue}switch(z){case"{":se=!0;continue;case"[":le=!0;continue;case"}":W+=`(?:${s(ne,",").map(U=>a(U)).join("|")})`,se=!1,ne="";break;case"]":W+="["+X+"]",le=!1,X="";break;case"?":W+=p;continue;case"*":W+=o(1);continue;default:W+=b.escapeRegExpCharacters(z)}}eef(ne,W)).filter(ne=>ne!==_),R),K=x.length;if(!K)return _;if(K===1)return x[0];const Y=function(ne,le){for(let X=0,z=x.length;X!!ne.allBasenames);ee&&(Y.allBasenames=ee.allBasenames);const se=x.reduce((ne,le)=>le.allPaths?ne.concat(le.allPaths):ne,[]);return se.length&&(Y.allPaths=se),Y}function k(R,W,x){const K=M.sep===M.posix.sep,Y=K?R:R.replace(c,M.sep),ee=M.sep+Y,se=M.posix.sep+R,ne=x?function(le,X){return typeof le=="string"&&(le===Y||le.endsWith(ee)||!K&&(le===R||le.endsWith(se)))?W:null}:function(le,X){return typeof le=="string"&&(le===Y||!K&&le===R)?W:null};return ne.allPaths=[(x?"*/":"./")+R],ne}function E(R){try{const W=new RegExp(`^${a(R)}$`);return function(x){return W.lastIndex=0,typeof x=="string"&&W.test(x)?R:null}}catch(W){return _}}function T(R,W,x){return!R||typeof W!="string"?!1:O(R)(W,void 0,x)}e.match=T;function O(R,W={}){if(!R)return m;if(typeof R=="string"||A(R)){const x=f(R,W);if(x===_)return m;const K=function(Y,ee){return!!x(Y,ee)};return x.allBasenames&&(K.allBasenames=x.allBasenames),x.allPaths&&(K.allPaths=x.allPaths),K}return B(R,W)}e.parse=O;function A(R){const W=R;return W&&typeof W.base=="string"&&typeof W.pattern=="string"}e.isRelativePattern=A;function B(R,W){const x=D(Object.getOwnPropertyNames(R).map(ne=>F(ne,R[ne],W)).filter(ne=>ne!==_)),K=x.length;if(!K)return _;if(!x.some(ne=>!!ne.requiresSiblings)){if(K===1)return x[0];const ne=function(z,P){for(let V=0,U=x.length;V!!z.allBasenames);le&&(ne.allBasenames=le.allBasenames);const X=x.reduce((z,P)=>P.allPaths?z.concat(P.allPaths):z,[]);return X.length&&(ne.allPaths=X),ne}const Y=function(ne,le,X){let z;for(let P=0,V=x.length;P!!ne.allBasenames);ee&&(Y.allBasenames=ee.allBasenames);const se=x.reduce((ne,le)=>le.allPaths?ne.concat(le.allPaths):ne,[]);return se.length&&(Y.allPaths=se),Y}function F(R,W,x){if(W===!1)return _;const K=f(R,x);if(K===_)return _;if(typeof W=="boolean")return K;if(W){const Y=W.when;if(typeof Y=="string"){const ee=(se,ne,le,X)=>{if(!X||!K(se,ne))return null;const z=Y.replace("$(basename)",le),P=X(z);return S.isThenable(P)?P.then(V=>V?R:null):P?R:null};return ee.requiresSiblings=!0,ee}}return K}function D(R,W){const x=R.filter(ne=>!!ne.basenames);if(x.length<2)return R;const K=x.reduce((ne,le)=>{const X=le.basenames;return X?ne.concat(X):ne},[]);let Y;if(W){Y=[];for(let ne=0,le=K.length;ne{const X=le.patterns;return X?ne.concat(X):ne},[]);const ee=function(ne,le){if(typeof ne!="string")return null;if(!le){let z;for(z=ne.length;z>0;z--){const P=ne.charCodeAt(z-1);if(P===47||P===92)break}le=ne.substr(z)}const X=K.indexOf(le);return X!==-1?Y[X]:null};ee.basenames=K,ee.patterns=Y,ee.allBasenames=K;const se=R.filter(ne=>!ne.basenames);return se.push(ee),se}}),define(Q[102],J([0,1,27,66,8]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.matchesFuzzyIconAware=e.parseLabelWithIcons=e.stripIcons=e.markdownEscapeEscapedIcons=e.escapeIcons=e.iconStartMarker=void 0,e.iconStartMarker="$(";const w=new RegExp(`\\$\\(${b.CSSIcon.iconNameExpression}(?:${b.CSSIcon.iconModifierExpression})?\\)`,"g"),S=new RegExp(`(\\\\)?${w.source}`,"g");function C(u){return u.replace(S,(r,i)=>i?r:`\\${r}`)}e.escapeIcons=C;const d=new RegExp(`\\\\${w.source}`,"g");function g(u){return u.replace(d,r=>`\\${r}`)}e.markdownEscapeEscapedIcons=g;const p=new RegExp(`(\\s)?(\\\\)?${w.source}(\\s)?`,"g");function c(u){return u.indexOf(e.iconStartMarker)===-1?u:u.replace(p,(r,i,n,t)=>n?r:i||t||"")}e.stripIcons=c;function o(u){const r=u.indexOf(e.iconStartMarker);return r===-1?{text:u}:s(u,r)}e.parseLabelWithIcons=o;function s(u,r){const i=[];let n="";function t(L){if(L){n+=L;for(const I of L)i.push(m)}}let l=-1,h="",m=0,_,f,v=r;const y=u.length;for(t(u.substr(0,r));v" ".repeat(i.length)).replace(/^>/gm,"\\>").replace(/\n/g,u===1?`\\ +`:` + +`),this}appendMarkdown(a){return this.value+=a,this}appendCodeblock(a,u){return this.value+="\n```",this.value+=a,this.value+=` +`,this.value+=u,this.value+="\n```\n",this}}e.MarkdownString=w;function S(s){return C(s)?!s.value:Array.isArray(s)?s.every(S):!0}e.isEmptyMarkdownString=S;function C(s){return s instanceof w?!0:s&&typeof s=="object"?typeof s.value=="string"&&(typeof s.isTrusted=="boolean"||s.isTrusted===void 0)&&(typeof s.supportThemeIcons=="boolean"||s.supportThemeIcons===void 0):!1}e.isMarkdownString=C;function d(s,a){return!s&&!a?!0:!s||!a?!1:Array.isArray(s)&&Array.isArray(a)?b.equals(s,a,g):C(s)&&C(a)?g(s,a):!1}e.markedStringsEquals=d;function g(s,a){return s===a?!0:!s||!a?!1:s.value===a.value&&s.isTrusted===a.isTrusted&&s.supportThemeIcons===a.supportThemeIcons}function p(s){return s.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}e.escapeMarkdownSyntaxTokens=p;function c(s){return s&&s.replace(/\\([\\`*_{}[\]()#+\-.!])/g,"$1")}e.removeMarkdownEscapes=c;function o(s){const a=[],u=s.split("|").map(i=>i.trim());s=u[0];const r=u[1];if(r){const i=/height=(\d+)/.exec(r),n=/width=(\d+)/.exec(r),t=i?i[1]:"",l=n?n[1]:"",h=isFinite(parseInt(l)),m=isFinite(parseInt(t));h&&a.push(`width="${l}"`),m&&a.push(`height="${t}"`)}return{href:s,dimensions:a}}e.parseHrefAndDimensions=o}),define(Q[199],J([0,1,101,24]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.revive=e.parse=void 0;function M(S){let C=JSON.parse(S);return C=w(C),C}e.parse=M;function w(S,C=0){if(!S||C>200)return S;if(typeof S=="object"){switch(S.$mid){case 1:return N.URI.revive(S);case 2:return new RegExp(S.source,S.flags)}if(S instanceof b.VSBuffer||S instanceof Uint8Array)return S;if(Array.isArray(S))for(let d=0;d{let ve=pe.relatedTarget;for(;ve&&ve!==de;)ve=ve.parentNode;ve!==de&&ge(pe)})}e.addDisposableNonBubblingMouseOutListener=_;function f(de,ge){return r(de,"pointerout",pe=>{let ve=pe.relatedTarget;for(;ve&&ve!==de;)ve=ve.parentNode;ve!==de&&ge(pe)})}e.addDisposableNonBubblingPointerOutListener=f;let v=null;function y(de){if(!v){const ge=pe=>setTimeout(()=>pe(new Date().getTime()),0);v=self.requestAnimationFrame||self.msRequestAnimationFrame||self.webkitRequestAnimationFrame||self.mozRequestAnimationFrame||self.oRequestAnimationFrame||ge}return v.call(self,de)}class L{constructor(ge,pe=0){this._runner=ge,this.priority=pe,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(ge){C.onUnexpectedError(ge)}}static sort(ge,pe){return pe.priority-ge.priority}}(function(){let de=[],ge=null,pe=!1,ve=!1,ke=()=>{for(pe=!1,ge=de,de=[],ve=!0;ge.length>0;)ge.sort(L.sort),ge.shift().execute();ve=!1};e.scheduleAtNextAnimationFrame=(Ne,Te=0)=>{let Oe=new L(Ne,Te);return de.push(Oe),pe||(pe=!0,y(ke)),Oe},e.runAtThisOrScheduleAtNextAnimationFrame=(Ne,Te)=>{if(ve){let Oe=new L(Ne,Te);return ge.push(Oe),Oe}else return e.scheduleAtNextAnimationFrame(Ne,Te)}})();const I=8,k=function(de,ge){return ge};class E extends g.Disposable{constructor(ge,pe,ve,ke=k,Ne=I){super();let Te=null,Oe=0,Fe=this._register(new S.TimeoutTimer),Pe=()=>{Oe=new Date().getTime(),ve(Te),Te=null};this._register(r(ge,pe,xe=>{Te=ke(Te,xe);let We=new Date().getTime()-Oe;We>=Ne?(Fe.cancel(),Pe()):Fe.setIfNotSet(Pe,Ne-We)}))}}function T(de,ge,pe,ve,ke){return new E(de,ge,pe,ve,ke)}e.addDisposableThrottledListener=T;function O(de){return document.defaultView.getComputedStyle(de,null)}e.getComputedStyle=O;function A(de){if(de!==document.body)return new F(de.clientWidth,de.clientHeight);if(p.isIOS&&window.visualViewport){const ge=window.visualViewport.width,pe=window.visualViewport.height-(b.isStandalone?20+4:0);return new F(ge,pe)}if(window.innerWidth&&window.innerHeight)return new F(window.innerWidth,window.innerHeight);if(document.body&&document.body.clientWidth&&document.body.clientHeight)return new F(document.body.clientWidth,document.body.clientHeight);if(document.documentElement&&document.documentElement.clientWidth&&document.documentElement.clientHeight)return new F(document.documentElement.clientWidth,document.documentElement.clientHeight);throw new Error("Unable to figure out browser width and height")}e.getClientArea=A;class B{static convertToPixels(ge,pe){return parseFloat(pe)||0}static getDimension(ge,pe,ve){let ke=O(ge),Ne="0";return ke&&(ke.getPropertyValue?Ne=ke.getPropertyValue(pe):Ne=ke.getAttribute(ve)),B.convertToPixels(ge,Ne)}static getBorderLeftWidth(ge){return B.getDimension(ge,"border-left-width","borderLeftWidth")}static getBorderRightWidth(ge){return B.getDimension(ge,"border-right-width","borderRightWidth")}static getBorderTopWidth(ge){return B.getDimension(ge,"border-top-width","borderTopWidth")}static getBorderBottomWidth(ge){return B.getDimension(ge,"border-bottom-width","borderBottomWidth")}static getPaddingLeft(ge){return B.getDimension(ge,"padding-left","paddingLeft")}static getPaddingRight(ge){return B.getDimension(ge,"padding-right","paddingRight")}static getPaddingTop(ge){return B.getDimension(ge,"padding-top","paddingTop")}static getPaddingBottom(ge){return B.getDimension(ge,"padding-bottom","paddingBottom")}static getMarginLeft(ge){return B.getDimension(ge,"margin-left","marginLeft")}static getMarginTop(ge){return B.getDimension(ge,"margin-top","marginTop")}static getMarginRight(ge){return B.getDimension(ge,"margin-right","marginRight")}static getMarginBottom(ge){return B.getDimension(ge,"margin-bottom","marginBottom")}}class F{constructor(ge,pe){this.width=ge,this.height=pe}with(ge=this.width,pe=this.height){return ge!==this.width||pe!==this.height?new F(ge,pe):this}static is(ge){return typeof ge=="object"&&typeof ge.height=="number"&&typeof ge.width=="number"}static lift(ge){return ge instanceof F?ge:new F(ge.width,ge.height)}static equals(ge,pe){return ge===pe?!0:!ge||!pe?!1:ge.width===pe.width&&ge.height===pe.height}}e.Dimension=F;function D(de){let ge=de.offsetParent,pe=de.offsetTop,ve=de.offsetLeft;for(;(de=de.parentNode)!==null&&de!==document.body&&de!==document.documentElement;){pe-=de.scrollTop;const ke=X(de)?null:O(de);ke&&(ve-=ke.direction!=="rtl"?de.scrollLeft:-de.scrollLeft),de===ge&&(ve+=B.getBorderLeftWidth(de),pe+=B.getBorderTopWidth(de),pe+=de.offsetTop,ve+=de.offsetLeft,ge=de.offsetParent)}return{left:ve,top:pe}}e.getTopLeftOffset=D;function R(de,ge,pe){typeof ge=="number"&&(de.style.width=`${ge}px`),typeof pe=="number"&&(de.style.height=`${pe}px`)}e.size=R;function W(de){let ge=de.getBoundingClientRect();return{left:ge.left+e.StandardWindow.scrollX,top:ge.top+e.StandardWindow.scrollY,width:ge.width,height:ge.height}}e.getDomNodePagePosition=W,e.StandardWindow=new class{get scrollX(){return typeof window.scrollX=="number"?window.scrollX:document.body.scrollLeft+document.documentElement.scrollLeft}get scrollY(){return typeof window.scrollY=="number"?window.scrollY:document.body.scrollTop+document.documentElement.scrollTop}};function x(de){let ge=B.getMarginLeft(de)+B.getMarginRight(de);return de.offsetWidth+ge}e.getTotalWidth=x;function K(de){let ge=B.getBorderLeftWidth(de)+B.getBorderRightWidth(de),pe=B.getPaddingLeft(de)+B.getPaddingRight(de);return de.offsetWidth-ge-pe}e.getContentWidth=K;function Y(de){let ge=B.getBorderTopWidth(de)+B.getBorderBottomWidth(de),pe=B.getPaddingTop(de)+B.getPaddingBottom(de);return de.offsetHeight-ge-pe}e.getContentHeight=Y;function ee(de){let ge=B.getMarginTop(de)+B.getMarginBottom(de);return de.offsetHeight+ge}e.getTotalHeight=ee;function se(de,ge){for(;de;){if(de===ge)return!0;de=de.parentNode}return!1}e.isAncestor=se;function ne(de,ge,pe){for(;de&&de.nodeType===de.ELEMENT_NODE;){if(de.classList.contains(ge))return de;if(pe){if(typeof pe=="string"){if(de.classList.contains(pe))return null}else if(de===pe)return null}de=de.parentNode}return null}e.findParentWithClass=ne;function le(de,ge,pe){return!!ne(de,ge,pe)}e.hasParentWithClass=le;function X(de){return de&&!!de.host&&!!de.mode}e.isShadowRoot=X;function z(de){return!!P(de)}e.isInShadowDOM=z;function P(de){for(;de.parentNode;){if(de===document.body)return null;de=de.parentNode}return X(de)?de:null}e.getShadowRoot=P;function V(){let de=document.activeElement;for(;de==null?void 0:de.shadowRoot;)de=de.shadowRoot.activeElement;return de}e.getActiveElement=V;function U(de=document.getElementsByTagName("head")[0]){let ge=document.createElement("style");return ge.type="text/css",ge.media="screen",de.appendChild(ge),ge}e.createStyleSheet=U;let H=null;function $(){return H||(H=U()),H}function ie(de){var ge,pe;return((ge=de==null?void 0:de.sheet)===null||ge===void 0?void 0:ge.rules)?de.sheet.rules:((pe=de==null?void 0:de.sheet)===null||pe===void 0?void 0:pe.cssRules)?de.sheet.cssRules:[]}function oe(de,ge,pe=$()){!pe||!ge||pe.sheet.insertRule(de+"{"+ge+"}",0)}e.createCSSRule=oe;function ae(de,ge=$()){if(!!ge){let pe=ie(ge),ve=[];for(let ke=0;ke=0;ke--)ge.sheet.deleteRule(ve[ke])}}e.removeCSSRulesContainingSelector=ae;function G(de){return typeof HTMLElement=="object"?de instanceof HTMLElement:de&&typeof de=="object"&&de.nodeType===1&&typeof de.nodeName=="string"}e.isHTMLElement=G,e.EventType={CLICK:"click",AUXCLICK:"auxclick",DBLCLICK:"dblclick",MOUSE_UP:"mouseup",MOUSE_DOWN:"mousedown",MOUSE_OVER:"mouseover",MOUSE_MOVE:"mousemove",MOUSE_OUT:"mouseout",MOUSE_ENTER:"mouseenter",MOUSE_LEAVE:"mouseleave",MOUSE_WHEEL:"wheel",POINTER_UP:"pointerup",POINTER_DOWN:"pointerdown",POINTER_MOVE:"pointermove",CONTEXT_MENU:"contextmenu",WHEEL:"wheel",KEY_DOWN:"keydown",KEY_PRESS:"keypress",KEY_UP:"keyup",LOAD:"load",BEFORE_UNLOAD:"beforeunload",UNLOAD:"unload",ABORT:"abort",ERROR:"error",RESIZE:"resize",SCROLL:"scroll",FULLSCREEN_CHANGE:"fullscreenchange",WK_FULLSCREEN_CHANGE:"webkitfullscreenchange",SELECT:"select",CHANGE:"change",SUBMIT:"submit",RESET:"reset",FOCUS:"focus",FOCUS_IN:"focusin",FOCUS_OUT:"focusout",BLUR:"blur",INPUT:"input",STORAGE:"storage",DRAG_START:"dragstart",DRAG:"drag",DRAG_ENTER:"dragenter",DRAG_LEAVE:"dragleave",DRAG_OVER:"dragover",DROP:"drop",DRAG_END:"dragend",ANIMATION_START:b.isWebKit?"webkitAnimationStart":"animationstart",ANIMATION_END:b.isWebKit?"webkitAnimationEnd":"animationend",ANIMATION_ITERATION:b.isWebKit?"webkitAnimationIteration":"animationiteration"},e.EventHelper={stop:function(de,ge){de.preventDefault?de.preventDefault():de.returnValue=!1,ge&&(de.stopPropagation?de.stopPropagation():de.cancelBubble=!0)}};function j(de){let ge=[];for(let pe=0;de&&de.nodeType===de.ELEMENT_NODE;pe++)ge[pe]=de.scrollTop,de=de.parentNode;return ge}e.saveParentsScrollTop=j;function te(de,ge){for(let pe=0;de&&de.nodeType===de.ELEMENT_NODE;pe++)de.scrollTop!==ge[pe]&&(de.scrollTop=ge[pe]),de=de.parentNode}e.restoreParentsScrollTop=te;class Z extends g.Disposable{constructor(ge){super();this._onDidFocus=this._register(new d.Emitter),this.onDidFocus=this._onDidFocus.event,this._onDidBlur=this._register(new d.Emitter),this.onDidBlur=this._onDidBlur.event;let pe=se(document.activeElement,ge),ve=!1;const ke=()=>{ve=!1,pe||(pe=!0,this._onDidFocus.fire())},Ne=()=>{pe&&(ve=!0,window.setTimeout(()=>{ve&&(ve=!1,pe=!1,this._onDidBlur.fire())},0))};this._refreshStateHandler=()=>{se(document.activeElement,ge)!==pe&&(pe?Ne():ke())},this._register(N.domEvent(ge,e.EventType.FOCUS,!0)(ke)),this._register(N.domEvent(ge,e.EventType.BLUR,!0)(Ne))}}function ue(de){return new Z(de)}e.trackFocus=ue;function he(de,...ge){if(de.append(...ge),ge.length===1&&typeof ge[0]!="string")return ge[0]}e.append=he;function re(de,...ge){de.innerText="",he(de,...ge)}e.reset=re;const ce=/([\w\-]+)?(#([\w\-]+))?((\.([\w\-]+))*)/;var me;(function(de){de.HTML="http://www.w3.org/1999/xhtml",de.SVG="http://www.w3.org/2000/svg"})(me=e.Namespace||(e.Namespace={}));function Ce(de,ge,pe,...ve){let ke=ce.exec(ge);if(!ke)throw new Error("Bad use of emmet");pe=Object.assign({},pe||{});let Ne=ke[1]||"div",Te;return de!==me.HTML?Te=document.createElementNS(de,Ne):Te=document.createElement(Ne),ke[3]&&(Te.id=ke[3]),ke[4]&&(Te.className=ke[4].replace(/\./g," ").trim()),Object.keys(pe).forEach(Oe=>{const Fe=pe[Oe];typeof Fe!="undefined"&&(/^on\w+$/.test(Oe)?Te[Oe]=Fe:Oe==="selected"?Fe&&Te.setAttribute(Oe,"true"):Te.setAttribute(Oe,Fe))}),Te.append(...ve),Te}function be(de,ge,...pe){return Ce(me.HTML,de,ge,...pe)}e.$=be,be.SVG=function(de,ge,...pe){return Ce(me.SVG,de,ge,...pe)};function Le(...de){for(let ge of de)ge.style.display="",ge.removeAttribute("aria-hidden")}e.show=Le;function De(...de){for(let ge of de)ge.style.display="none",ge.setAttribute("aria-hidden","true")}e.hide=De;function Re(de){return Array.prototype.slice.call(document.getElementsByTagName(de),0)}e.getElementsByTagName=Re;function Ee(de){const ge=window.devicePixelRatio*de;return Math.max(1,Math.floor(ge))/window.devicePixelRatio}e.computeScreenAwareSize=Ee;function Ae(de){if(b.isElectron||b.isEdgeLegacyWebView)window.open(de);else{let ge=window.open();ge&&(ge.opener=null,ge.location.href=de)}}e.windowOpenNoOpener=Ae;function Se(de){const ge=()=>{de(),pe=e.scheduleAtNextAnimationFrame(ge)};let pe=e.scheduleAtNextAnimationFrame(ge);return g.toDisposable(()=>pe.dispose())}e.animate=Se,c.RemoteAuthorities.setPreferredWebSchema(/^https:/.test(window.location.href)?"https":"http");function we(de){return de?`url('${c.FileAccess.asBrowserUri(de).toString(!0).replace(/'/g,"%27")}')`:"url('')"}e.asCSSUrl=we;function ye(de){return`'${de.replace(/'/g,"%27")}'`}e.asCSSPropertyValue=ye;class fe extends d.Emitter{constructor(){super();this._subscriptions=new g.DisposableStore,this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1,metaKey:!1},this._subscriptions.add(N.domEvent(window,"keydown",!0)(ge=>{const pe=new M.StandardKeyboardEvent(ge);if(!(pe.keyCode===6&&ge.repeat)){if(ge.altKey&&!this._keyStatus.altKey)this._keyStatus.lastKeyPressed="alt";else if(ge.ctrlKey&&!this._keyStatus.ctrlKey)this._keyStatus.lastKeyPressed="ctrl";else if(ge.metaKey&&!this._keyStatus.metaKey)this._keyStatus.lastKeyPressed="meta";else if(ge.shiftKey&&!this._keyStatus.shiftKey)this._keyStatus.lastKeyPressed="shift";else if(pe.keyCode!==6)this._keyStatus.lastKeyPressed=void 0;else return;this._keyStatus.altKey=ge.altKey,this._keyStatus.ctrlKey=ge.ctrlKey,this._keyStatus.metaKey=ge.metaKey,this._keyStatus.shiftKey=ge.shiftKey,this._keyStatus.lastKeyPressed&&(this._keyStatus.event=ge,this.fire(this._keyStatus))}})),this._subscriptions.add(N.domEvent(window,"keyup",!0)(ge=>{!ge.altKey&&this._keyStatus.altKey?this._keyStatus.lastKeyReleased="alt":!ge.ctrlKey&&this._keyStatus.ctrlKey?this._keyStatus.lastKeyReleased="ctrl":!ge.metaKey&&this._keyStatus.metaKey?this._keyStatus.lastKeyReleased="meta":!ge.shiftKey&&this._keyStatus.shiftKey?this._keyStatus.lastKeyReleased="shift":this._keyStatus.lastKeyReleased=void 0,this._keyStatus.lastKeyPressed!==this._keyStatus.lastKeyReleased&&(this._keyStatus.lastKeyPressed=void 0),this._keyStatus.altKey=ge.altKey,this._keyStatus.ctrlKey=ge.ctrlKey,this._keyStatus.metaKey=ge.metaKey,this._keyStatus.shiftKey=ge.shiftKey,this._keyStatus.lastKeyReleased&&(this._keyStatus.event=ge,this.fire(this._keyStatus))})),this._subscriptions.add(N.domEvent(document.body,"mousedown",!0)(ge=>{this._keyStatus.lastKeyPressed=void 0})),this._subscriptions.add(N.domEvent(document.body,"mouseup",!0)(ge=>{this._keyStatus.lastKeyPressed=void 0})),this._subscriptions.add(N.domEvent(document.body,"mousemove",!0)(ge=>{ge.buttons&&(this._keyStatus.lastKeyPressed=void 0)})),this._subscriptions.add(N.domEvent(window,"blur")(ge=>{this.resetKeyStatus()}))}get keyStatus(){return this._keyStatus}resetKeyStatus(){this.doResetKeyStatus(),this.fire(this._keyStatus)}doResetKeyStatus(){this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1,metaKey:!1}}static getInstance(){return fe.instance||(fe.instance=new fe),fe.instance}dispose(){super.dispose(),this._subscriptions.dispose()}}e.ModifierKeyEmitter=fe}),define(Q[156],J([0,1,7]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createElement=e.renderFormattedText=e.renderText=void 0;function N(c,o={}){const s=w(o);return s.textContent=c,s}e.renderText=N;function M(c,o={}){const s=w(o);return C(s,d(c),o.actionHandler),s}e.renderFormattedText=M;function w(c){const o=c.inline?"span":"div",s=document.createElement(o);return c.className&&(s.className=c.className),s}e.createElement=w;class S{constructor(o){this.source=o,this.index=0}eos(){return this.index>=this.source.length}next(){const o=this.peek();return this.advance(),o}peek(){return this.source[this.index]}advance(){this.index++}}function C(c,o,s){let a;if(o.type===2)a=document.createTextNode(o.content||"");else if(o.type===3)a=document.createElement("b");else if(o.type===4)a=document.createElement("i");else if(o.type===5&&s){const u=document.createElement("a");u.href="#",s.disposeables.add(b.addStandardDisposableListener(u,"click",r=>{s.callback(String(o.index),r)})),a=u}else o.type===7?a=document.createElement("br"):o.type===1&&(a=c);a&&c!==a&&c.appendChild(a),a&&Array.isArray(o.children)&&o.children.forEach(u=>{C(a,u,s)})}function d(c){const o={type:1,children:[]};let s=0,a=o;const u=[],r=new S(c);for(;!r.eos();){let i=r.next();const n=i==="\\"&&p(r.peek())!==0;if(n&&(i=r.next()),!n&&g(i)&&i===r.peek()){r.advance(),a.type===2&&(a=u.pop());const t=p(i);if(a.type===t||a.type===5&&t===6)a=u.pop();else{const l={type:t,children:[]};t===5&&(l.index=s,s++),a.children.push(l),u.push(a),a=l}}else if(i===` +`)a.type===2&&(a=u.pop()),a.children.push({type:7});else if(a.type!==2){const t={type:2,content:i};a.children.push(t),u.push(a),a=t}else a.content+=i}return a.type===2&&(a=u.pop()),u.length,o}function g(c){return p(c)!==0}function p(c){switch(c){case"*":return 3;case"_":return 4;case"[":return 5;case"]":return 6;default:return 0}}}),define(Q[90],J([0,1,7,193,50,2]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlobalMouseMoveMonitor=e.standardMouseMoveMerger=void 0;function S(d,g){let p=new M.StandardMouseEvent(g);return p.preventDefault(),{leftButton:p.leftButton,buttons:p.buttons,posx:p.posx,posy:p.posy}}e.standardMouseMoveMerger=S;class C{constructor(){this._hooks=new w.DisposableStore,this._mouseMoveEventMerger=null,this._mouseMoveCallback=null,this._onStopCallback=null}dispose(){this.stopMonitoring(!1),this._hooks.dispose()}stopMonitoring(g,p){if(!!this.isMonitoring()){this._hooks.clear(),this._mouseMoveEventMerger=null,this._mouseMoveCallback=null;const c=this._onStopCallback;this._onStopCallback=null,g&&c&&c(p)}}isMonitoring(){return!!this._mouseMoveEventMerger}startMonitoring(g,p,c,o,s){if(!this.isMonitoring()){this._mouseMoveEventMerger=c,this._mouseMoveCallback=o,this._onStopCallback=s;const a=N.IframeUtils.getSameOriginWindowChain(),u="mousemove",r="mouseup",i=a.map(t=>t.window.document),n=b.getShadowRoot(g);n&&i.unshift(n);for(const t of i)this._hooks.add(b.addDisposableThrottledListener(t,u,l=>{if(l.buttons!==p){this.stopMonitoring(!0);return}this._mouseMoveCallback(l)},(l,h)=>this._mouseMoveEventMerger(l,h))),this._hooks.add(b.addDisposableListener(t,r,l=>this.stopMonitoring(!0)));if(N.IframeUtils.hasDifferentOriginAncestor()){let t=a[a.length-1];this._hooks.add(b.addDisposableListener(t.window.document,"mouseout",l=>{new M.StandardMouseEvent(l).target.tagName.toLowerCase()==="html"&&this.stopMonitoring(!0)})),this._hooks.add(b.addDisposableListener(t.window.document,"mouseover",l=>{new M.StandardMouseEvent(l).target.tagName.toLowerCase()==="html"&&this.stopMonitoring(!0)})),this._hooks.add(b.addDisposableListener(t.window.document.body,"mouseleave",l=>{this.stopMonitoring(!0)}))}}}}e.GlobalMouseMoveMonitor=C});var Me=this&&this.__decorate||function(q,e,b,N){var M=arguments.length,w=M<3?e:N===null?N=Object.getOwnPropertyDescriptor(e,b):N,S;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")w=Reflect.decorate(q,e,b,N);else for(var C=q.length-1;C>=0;C--)(S=q[C])&&(w=(M<3?S(w):M>3?S(e,b,w):S(e,b))||w);return M>3&&w&&Object.defineProperty(e,b,w),w};define(Q[60],J([0,1,19,2,7,99]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Gesture=e.EventType=void 0;var S;(function(d){d.Tap="-monaco-gesturetap",d.Change="-monaco-gesturechange",d.Start="-monaco-gesturestart",d.End="-monaco-gesturesend",d.Contextmenu="-monaco-gesturecontextmenu"})(S=e.EventType||(e.EventType={}));class C extends N.Disposable{constructor(){super();this.dispatched=!1,this.activeTouches={},this.handle=null,this.targets=[],this.ignoreTargets=[],this._lastSetTapCountTime=0,this._register(M.addDisposableListener(document,"touchstart",g=>this.onTouchStart(g),{passive:!1})),this._register(M.addDisposableListener(document,"touchend",g=>this.onTouchEnd(g))),this._register(M.addDisposableListener(document,"touchmove",g=>this.onTouchMove(g),{passive:!1}))}static addTarget(g){return C.isTouchDevice()?(C.INSTANCE||(C.INSTANCE=new C),C.INSTANCE.targets.push(g),{dispose:()=>{C.INSTANCE.targets=C.INSTANCE.targets.filter(p=>p!==g)}}):N.Disposable.None}static ignoreTarget(g){return C.isTouchDevice()?(C.INSTANCE||(C.INSTANCE=new C),C.INSTANCE.ignoreTargets.push(g),{dispose:()=>{C.INSTANCE.ignoreTargets=C.INSTANCE.ignoreTargets.filter(p=>p!==g)}}):N.Disposable.None}static isTouchDevice(){return"ontouchstart"in window||navigator.maxTouchPoints>0||window.navigator.msMaxTouchPoints>0}dispose(){this.handle&&(this.handle.dispose(),this.handle=null),super.dispose()}onTouchStart(g){let p=Date.now();this.handle&&(this.handle.dispose(),this.handle=null);for(let c=0,o=g.targetTouches.length;c=C.HOLD_DELAY&&Math.abs(u.initialPageX-b.tail(u.rollingPageX))<30&&Math.abs(u.initialPageY-b.tail(u.rollingPageY))<30){let i=this.newGestureEvent(S.Contextmenu,u.initialTarget);i.pageX=b.tail(u.rollingPageX),i.pageY=b.tail(u.rollingPageY),this.dispatchEvent(i)}else if(c===1){let i=b.tail(u.rollingPageX),n=b.tail(u.rollingPageY),t=b.tail(u.rollingTimestamps)-u.rollingTimestamps[0],l=i-u.rollingPageX[0],h=n-u.rollingPageY[0];const m=this.targets.filter(_=>u.initialTarget instanceof Node&&_.contains(u.initialTarget));this.inertia(m,p,Math.abs(l)/t,l>0?1:-1,i,Math.abs(h)/t,h>0?1:-1,n)}this.dispatchEvent(this.newGestureEvent(S.End,u.initialTarget)),delete this.activeTouches[a.identifier]}this.dispatched&&(g.preventDefault(),g.stopPropagation(),this.dispatched=!1)}newGestureEvent(g,p){let c=document.createEvent("CustomEvent");return c.initEvent(g,!1,!0),c.initialTarget=p,c.tapCount=0,c}dispatchEvent(g){if(g.type===S.Tap){const p=new Date().getTime();let c=0;p-this._lastSetTapCountTime>C.CLEAR_TAP_COUNT_TIME?c=1:c=2,this._lastSetTapCountTime=p,g.tapCount=c}else(g.type===S.Change||g.type===S.Contextmenu)&&(this._lastSetTapCountTime=0);for(let p=0;p{g.initialTarget instanceof Node&&p.contains(g.initialTarget)&&(p.dispatchEvent(g),this.dispatched=!0)})}inertia(g,p,c,o,s,a,u,r){this.handle=M.scheduleAtNextAnimationFrame(()=>{let i=Date.now(),n=i-p,t=0,l=0,h=!0;c+=C.SCROLL_FRICTION*n,a+=C.SCROLL_FRICTION*n,c>0&&(h=!1,t=o*c*n),a>0&&(h=!1,l=u*a*n);let m=this.newGestureEvent(S.Change);m.translationX=t,m.translationY=l,g.forEach(_=>_.dispatchEvent(m)),h||this.inertia(g,i,c,o,s+t,a,u,r+l)})}onTouchMove(g){let p=Date.now();for(let c=0,o=g.changedTouches.length;c3&&(a.rollingPageX.shift(),a.rollingPageY.shift(),a.rollingTimestamps.shift()),a.rollingPageX.push(s.pageX),a.rollingPageY.push(s.pageY),a.rollingTimestamps.push(p)}this.dispatched&&(g.preventDefault(),g.stopPropagation(),this.dispatched=!1)}}C.SCROLL_FRICTION=-.005,C.HOLD_DELAY=700,C.CLEAR_TAP_COUNT_TIME=400,Me([w.memoize],C,"isTouchDevice",null),e.Gesture=C}),define(Q[103],J([0,1,7,27]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.renderIcon=e.renderLabelWithIcons=void 0;const M=new RegExp(`(\\\\)?\\$\\((${N.CSSIcon.iconNameExpression}(?:${N.CSSIcon.iconModifierExpression})?)\\)`,"g");function w(C){const d=new Array;let g,p=0,c=0;for(;(g=M.exec(C))!==null;){c=g.index||0,d.push(C.substring(p,c)),p=(g.index||0)+g[0].length;const[,o,s]=g;d.push(o?`$(${s})`:S({id:s}))}return p{p=c===`\r +`?-1:0,o+=g;for(const s of d)s.end<=o||(s.start>=o&&(s.start+=p),s.end>=o&&(s.end+=p));return g+=p,"\u23CE"})}}e.HighlightedLabel=w}),define(Q[287],J([0,1,7]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RowCache=void 0;function N(w){try{w.parentElement&&w.parentElement.removeChild(w)}catch(S){}}class M{constructor(S){this.renderers=S,this.cache=new Map}alloc(S){let C=this.getTemplateCache(S).pop();if(!C){const d=b.$(".monaco-list-row"),p=this.getRenderer(S).renderTemplate(d);C={domNode:d,templateId:S,templateData:p}}return C}release(S){!S||this.releaseRow(S)}releaseRow(S){const{domNode:C,templateId:d}=S;C&&(C.classList.remove("scrolling"),N(C)),this.getTemplateCache(d).push(S)}getTemplateCache(S){let C=this.cache.get(S);return C||(C=[],this.cache.set(S,C)),C}dispose(){this.cache.forEach((S,C)=>{for(const d of S)this.getRenderer(C).disposeTemplate(d.templateData),d.templateData=null}),this.cache.clear()}getRenderer(S){const C=this.renderers.get(S);if(!C)throw new Error(`No renderer found for ${S}`);return C}}e.RowCache=M}),define(Q[52],J([0,1,7,56,50,2,60]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Widget=void 0;class C extends w.Disposable{onclick(g,p){this._register(b.addDisposableListener(g,b.EventType.CLICK,c=>p(new M.StandardMouseEvent(c))))}onmousedown(g,p){this._register(b.addDisposableListener(g,b.EventType.MOUSE_DOWN,c=>p(new M.StandardMouseEvent(c))))}onmouseover(g,p){this._register(b.addDisposableListener(g,b.EventType.MOUSE_OVER,c=>p(new M.StandardMouseEvent(c))))}onnonbubblingmouseout(g,p){this._register(b.addDisposableNonBubblingMouseOutListener(g,c=>p(new M.StandardMouseEvent(c))))}onkeydown(g,p){this._register(b.addDisposableListener(g,b.EventType.KEY_DOWN,c=>p(new N.StandardKeyboardEvent(c))))}onkeyup(g,p){this._register(b.addDisposableListener(g,b.EventType.KEY_UP,c=>p(new N.StandardKeyboardEvent(c))))}oninput(g,p){this._register(b.addDisposableListener(g,b.EventType.INPUT,p))}onblur(g,p){this._register(b.addDisposableListener(g,b.EventType.BLUR,p))}onfocus(g,p){this._register(b.addDisposableListener(g,b.EventType.FOCUS,p))}ignoreGesture(g){S.Gesture.ignoreTarget(g)}}e.Widget=C}),define(Q[158],J([0,1,90,52,15]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollbarArrow=e.ARROW_IMG_SIZE=void 0,e.ARROW_IMG_SIZE=11;class w extends N.Widget{constructor(C){super();this._onActivate=C.onActivate,this.bgDomNode=document.createElement("div"),this.bgDomNode.className="arrow-background",this.bgDomNode.style.position="absolute",this.bgDomNode.style.width=C.bgWidth+"px",this.bgDomNode.style.height=C.bgHeight+"px",typeof C.top!="undefined"&&(this.bgDomNode.style.top="0px"),typeof C.left!="undefined"&&(this.bgDomNode.style.left="0px"),typeof C.bottom!="undefined"&&(this.bgDomNode.style.bottom="0px"),typeof C.right!="undefined"&&(this.bgDomNode.style.right="0px"),this.domNode=document.createElement("div"),this.domNode.className=C.className,this.domNode.classList.add(...C.icon.classNamesArray),this.domNode.style.position="absolute",this.domNode.style.width=e.ARROW_IMG_SIZE+"px",this.domNode.style.height=e.ARROW_IMG_SIZE+"px",typeof C.top!="undefined"&&(this.domNode.style.top=C.top+"px"),typeof C.left!="undefined"&&(this.domNode.style.left=C.left+"px"),typeof C.bottom!="undefined"&&(this.domNode.style.bottom=C.bottom+"px"),typeof C.right!="undefined"&&(this.domNode.style.right=C.right+"px"),this._mouseMoveMonitor=this._register(new b.GlobalMouseMoveMonitor),this.onmousedown(this.bgDomNode,d=>this._arrowMouseDown(d)),this.onmousedown(this.domNode,d=>this._arrowMouseDown(d)),this._mousedownRepeatTimer=this._register(new M.IntervalTimer),this._mousedownScheduleRepeatTimer=this._register(new M.TimeoutTimer)}_arrowMouseDown(C){const d=()=>{this._mousedownRepeatTimer.cancelAndSet(()=>this._onActivate(),1e3/24)};this._onActivate(),this._mousedownRepeatTimer.cancel(),this._mousedownScheduleRepeatTimer.cancelAndSet(d,200),this._mouseMoveMonitor.startMonitoring(C.target,C.buttons,b.standardMouseMoveMerger,g=>{},()=>{this._mousedownRepeatTimer.cancel(),this._mousedownScheduleRepeatTimer.cancel()}),C.preventDefault()}}e.ScrollbarArrow=w}),define(Q[200],J([0,1,7,30,90,158,282,52,17]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractScrollbar=void 0;const g=140;class p extends C.Widget{constructor(o){super();this._lazyRender=o.lazyRender,this._host=o.host,this._scrollable=o.scrollable,this._scrollByPage=o.scrollByPage,this._scrollbarState=o.scrollbarState,this._visibilityController=this._register(new S.ScrollbarVisibilityController(o.visibility,"visible scrollbar "+o.extraScrollbarClassName,"invisible scrollbar "+o.extraScrollbarClassName)),this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._mouseMoveMonitor=this._register(new M.GlobalMouseMoveMonitor),this._shouldRender=!0,this.domNode=N.createFastDomNode(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this._visibilityController.setDomNode(this.domNode),this.domNode.setPosition("absolute"),this.onmousedown(this.domNode.domNode,s=>this._domNodeMouseDown(s))}_createArrow(o){const s=this._register(new w.ScrollbarArrow(o));this.domNode.domNode.appendChild(s.bgDomNode),this.domNode.domNode.appendChild(s.domNode)}_createSlider(o,s,a,u){this.slider=N.createFastDomNode(document.createElement("div")),this.slider.setClassName("slider"),this.slider.setPosition("absolute"),this.slider.setTop(o),this.slider.setLeft(s),typeof a=="number"&&this.slider.setWidth(a),typeof u=="number"&&this.slider.setHeight(u),this.slider.setLayerHinting(!0),this.slider.setContain("strict"),this.domNode.domNode.appendChild(this.slider.domNode),this.onmousedown(this.slider.domNode,r=>{r.leftButton&&(r.preventDefault(),this._sliderMouseDown(r,()=>{}))}),this.onclick(this.slider.domNode,r=>{r.leftButton&&r.stopPropagation()})}_onElementSize(o){return this._scrollbarState.setVisibleSize(o)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_onElementScrollSize(o){return this._scrollbarState.setScrollSize(o)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_onElementScrollPosition(o){return this._scrollbarState.setScrollPosition(o)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){!this._shouldRender||(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodeMouseDown(o){o.target===this.domNode.domNode&&this._onMouseDown(o)}delegateMouseDown(o){const s=this.domNode.domNode.getClientRects()[0].top,a=s+this._scrollbarState.getSliderPosition(),u=s+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),r=this._sliderMousePosition(o);a<=r&&r<=u?o.leftButton&&(o.preventDefault(),this._sliderMouseDown(o,()=>{})):this._onMouseDown(o)}_onMouseDown(o){let s,a;if(o.target===this.domNode.domNode&&typeof o.browserEvent.offsetX=="number"&&typeof o.browserEvent.offsetY=="number")s=o.browserEvent.offsetX,a=o.browserEvent.offsetY;else{const r=b.getDomNodePagePosition(this.domNode.domNode);s=o.posx-r.left,a=o.posy-r.top}const u=this._mouseDownRelativePosition(s,a);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(u):this._scrollbarState.getDesiredScrollPositionFromOffset(u)),o.leftButton&&(o.preventDefault(),this._sliderMouseDown(o,()=>{}))}_sliderMouseDown(o,s){const a=this._sliderMousePosition(o),u=this._sliderOrthogonalMousePosition(o),r=this._scrollbarState.clone();this.slider.toggleClassName("active",!0),this._mouseMoveMonitor.startMonitoring(o.target,o.buttons,M.standardMouseMoveMerger,i=>{const n=this._sliderOrthogonalMousePosition(i),t=Math.abs(n-u);if(d.isWindows&&t>g){this._setDesiredScrollPositionNow(r.getScrollPosition());return}const h=this._sliderMousePosition(i)-a;this._setDesiredScrollPositionNow(r.getDesiredScrollPositionFromDelta(h))},()=>{this.slider.toggleClassName("active",!1),this._host.onDragEnd(),s()}),this._host.onDragStart()}_setDesiredScrollPositionNow(o){const s={};this.writeScrollPosition(s,o),this._scrollable.setScrollPositionNow(s)}updateScrollbarSize(o){this._updateScrollbarSize(o),this._scrollbarState.setScrollbarSize(o),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}}e.AbstractScrollbar=p}),define(Q[288],J([0,1,50,200,158,194,27]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HorizontalScrollbar=void 0;const C=S.registerCodicon("scrollbar-button-left",S.Codicon.triangleLeft),d=S.registerCodicon("scrollbar-button-right",S.Codicon.triangleRight);class g extends N.AbstractScrollbar{constructor(c,o,s){const a=c.getScrollDimensions(),u=c.getCurrentScrollPosition();super({lazyRender:o.lazyRender,host:s,scrollbarState:new w.ScrollbarState(o.horizontalHasArrows?o.arrowSize:0,o.horizontal===2?0:o.horizontalScrollbarSize,o.vertical===2?0:o.verticalScrollbarSize,a.width,a.scrollWidth,u.scrollLeft),visibility:o.horizontal,extraScrollbarClassName:"horizontal",scrollable:c,scrollByPage:o.scrollByPage});if(o.horizontalHasArrows){const r=(o.arrowSize-M.ARROW_IMG_SIZE)/2,i=(o.horizontalScrollbarSize-M.ARROW_IMG_SIZE)/2;this._createArrow({className:"scra",icon:C,top:i,left:r,bottom:void 0,right:void 0,bgWidth:o.arrowSize,bgHeight:o.horizontalScrollbarSize,onActivate:()=>this._host.onMouseWheel(new b.StandardWheelEvent(null,1,0))}),this._createArrow({className:"scra",icon:d,top:i,left:void 0,bottom:void 0,right:r,bgWidth:o.arrowSize,bgHeight:o.horizontalScrollbarSize,onActivate:()=>this._host.onMouseWheel(new b.StandardWheelEvent(null,-1,0))})}this._createSlider(Math.floor((o.horizontalScrollbarSize-o.horizontalSliderSize)/2),0,void 0,o.horizontalSliderSize)}_updateSlider(c,o){this.slider.setWidth(c),this.slider.setLeft(o)}_renderDomNode(c,o){this.domNode.setWidth(c),this.domNode.setHeight(o),this.domNode.setLeft(0),this.domNode.setBottom(0)}onDidScroll(c){return this._shouldRender=this._onElementScrollSize(c.scrollWidth)||this._shouldRender,this._shouldRender=this._onElementScrollPosition(c.scrollLeft)||this._shouldRender,this._shouldRender=this._onElementSize(c.width)||this._shouldRender,this._shouldRender}_mouseDownRelativePosition(c,o){return c}_sliderMousePosition(c){return c.posx}_sliderOrthogonalMousePosition(c){return c.posy}_updateScrollbarSize(c){this.slider.setHeight(c)}writeScrollPosition(c,o){c.scrollLeft=o}}e.HorizontalScrollbar=g}),define(Q[289],J([0,1,50,200,158,194,27]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VerticalScrollbar=void 0;const C=S.registerCodicon("scrollbar-button-up",S.Codicon.triangleUp),d=S.registerCodicon("scrollbar-button-down",S.Codicon.triangleDown);class g extends N.AbstractScrollbar{constructor(c,o,s){const a=c.getScrollDimensions(),u=c.getCurrentScrollPosition();super({lazyRender:o.lazyRender,host:s,scrollbarState:new w.ScrollbarState(o.verticalHasArrows?o.arrowSize:0,o.vertical===2?0:o.verticalScrollbarSize,0,a.height,a.scrollHeight,u.scrollTop),visibility:o.vertical,extraScrollbarClassName:"vertical",scrollable:c,scrollByPage:o.scrollByPage});if(o.verticalHasArrows){const r=(o.arrowSize-M.ARROW_IMG_SIZE)/2,i=(o.verticalScrollbarSize-M.ARROW_IMG_SIZE)/2;this._createArrow({className:"scra",icon:C,top:r,left:i,bottom:void 0,right:void 0,bgWidth:o.verticalScrollbarSize,bgHeight:o.arrowSize,onActivate:()=>this._host.onMouseWheel(new b.StandardWheelEvent(null,0,1))}),this._createArrow({className:"scra",icon:d,top:void 0,left:i,bottom:r,right:void 0,bgWidth:o.verticalScrollbarSize,bgHeight:o.arrowSize,onActivate:()=>this._host.onMouseWheel(new b.StandardWheelEvent(null,0,-1))})}this._createSlider(0,Math.floor((o.verticalScrollbarSize-o.verticalSliderSize)/2),o.verticalSliderSize,void 0)}_updateSlider(c,o){this.slider.setHeight(c),this.slider.setTop(o)}_renderDomNode(c,o){this.domNode.setWidth(o),this.domNode.setHeight(c),this.domNode.setRight(0),this.domNode.setTop(0)}onDidScroll(c){return this._shouldRender=this._onElementScrollSize(c.scrollHeight)||this._shouldRender,this._shouldRender=this._onElementScrollPosition(c.scrollTop)||this._shouldRender,this._shouldRender=this._onElementSize(c.height)||this._shouldRender,this._shouldRender}_mouseDownRelativePosition(c,o){return o}_sliderMousePosition(c){return c.posy}_sliderOrthogonalMousePosition(c){return c.posx}_updateScrollbarSize(c){this.slider.setWidth(c)}writeScrollPosition(c,o){c.scrollTop=o}}e.VerticalScrollbar=g}),define(Q[44],J([0,1,152,72,24,8,43]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DataUri=e.resolvePath=e.normalizePath=e.joinPath=e.dirname=e.basename=e.basenameOrAuthority=e.isEqual=e.extUri=e.ExtUri=e.originalFSPath=void 0;function C(p){return M.uriToFsPath(p,!0)}e.originalFSPath=C;class d{constructor(c){this._ignorePathCasing=c}compare(c,o,s=!1){return c===o?0:w.compare(this.getComparisonKey(c,s),this.getComparisonKey(o,s))}isEqual(c,o,s=!1){return c===o?!0:!c||!o?!1:this.getComparisonKey(c,s)===this.getComparisonKey(o,s)}getComparisonKey(c,o=!1){return c.with({path:this._ignorePathCasing(c)?c.path.toLowerCase():void 0,fragment:o?null:void 0}).toString()}joinPath(c,...o){return M.URI.joinPath(c,...o)}basenameOrAuthority(c){return e.basename(c)||c.authority}basename(c){return N.posix.basename(c.path)}dirname(c){if(c.path.length===0)return c;let o;return c.scheme===S.Schemas.file?o=M.URI.file(N.dirname(C(c))).path:(o=N.posix.dirname(c.path),c.authority&&o.length&&o.charCodeAt(0)!==47&&(console.error(`dirname("${c.toString})) resulted in a relative path`),o="/")),c.with({path:o})}normalizePath(c){if(!c.path.length)return c;let o;return c.scheme===S.Schemas.file?o=M.URI.file(N.normalize(C(c))).path:o=N.posix.normalize(c.path),c.with({path:o})}resolvePath(c,o){if(c.scheme===S.Schemas.file){const s=M.URI.file(N.resolve(C(c),o));return c.with({authority:s.authority,path:s.path})}return o.indexOf("/")===-1&&(o=b.toSlashes(o),/^[a-zA-Z]:(\/|$)/.test(o)&&(o="/"+o)),c.with({path:N.posix.resolve(c.path,o)})}}e.ExtUri=d,e.extUri=new d(()=>!1),e.isEqual=e.extUri.isEqual.bind(e.extUri),e.basenameOrAuthority=e.extUri.basenameOrAuthority.bind(e.extUri),e.basename=e.extUri.basename.bind(e.extUri),e.dirname=e.extUri.dirname.bind(e.extUri),e.joinPath=e.extUri.joinPath.bind(e.extUri),e.normalizePath=e.extUri.normalizePath.bind(e.extUri),e.resolvePath=e.extUri.resolvePath.bind(e.extUri);var g;(function(p){p.META_DATA_LABEL="label",p.META_DATA_DESCRIPTION="description",p.META_DATA_SIZE="size",p.META_DATA_MIME="mime";function c(o){const s=new Map;o.path.substring(o.path.indexOf(";")+1,o.path.lastIndexOf(";")).split(";").forEach(r=>{const[i,n]=r.split(":");i&&n&&s.set(i,n)});const u=o.path.substring(0,o.path.indexOf(";"));return u&&s.set(p.META_DATA_MIME,u),s}p.parseMetaData=c})(g=e.DataUri||(e.DataUri={}))}),define(Q[290],J([0,1,7,156,12,73,119,684,685,199,40,8,24,43,102,44,50,103,6,55]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t){"use strict";var l;Object.defineProperty(e,"__esModule",{value:!0}),e.renderMarkdown=void 0;const h=(l=window.trustedTypes)===null||l===void 0?void 0:l.createPolicy("insane",{createHTML(v,y){return d.insane(v,y)}});function m(v,y={},L={}){var I;const k=N.createElement(y),E=function(R){let W;try{W=g.parse(decodeURIComponent(R))}catch(x){}return W?(W=p.cloneAndChange(W,x=>{if(v.uris&&v.uris[x])return o.URI.revive(v.uris[x])}),encodeURIComponent(JSON.stringify(W))):R},T=function(R,W){const x=v.uris&&v.uris[R];if(!x)return R;let K=o.URI.revive(x);return o.URI.parse(R).toString()===K.toString()?R:W?s.FileAccess.asBrowserUri(K).toString(!0):(K.query&&(K=K.with({query:E(K.query)})),K.toString())};let O;const A=new Promise(R=>O=R),B=new C.Renderer;B.image=(R,W,x)=>{let K=[],Y=[];if(R){({href:R,dimensions:K}=w.parseHrefAndDimensions(R)),R=T(R,!0);try{const ee=o.URI.parse(R);y.baseUrl&&ee.scheme===s.Schemas.file&&(R=u.resolvePath(y.baseUrl,R).toString())}catch(ee){}Y.push(`src="${R}"`)}return x&&Y.push(`alt="${x}"`),W&&Y.push(`title="${W}"`),K.length&&(Y=Y.concat(K)),""},B.link=(R,W,x)=>(R===x&&(x=w.removeMarkdownEscapes(x)),R=T(R,!1),y.baseUrl&&(/^\w[\w\d+.-]*:/.test(R)||(R=u.resolvePath(y.baseUrl,R).toString())),W=w.removeMarkdownEscapes(W),R=w.removeMarkdownEscapes(R),!R||R.match(/^data:|javascript:/i)||R.match(/^command:/i)&&!v.isTrusted||R.match(/^command:(\/\/\/)?_workbench\.downloadResource/i)?x:(R=R.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'"),`
    ${x}`)),B.paragraph=R=>(v.supportThemeIcons&&(R=i.renderLabelWithIcons(R).map(x=>typeof x=="string"?x:x.outerHTML).join("")),`

    ${R}

    `),y.codeBlockRenderer&&(B.code=(R,W)=>{const x=y.codeBlockRenderer(W,R),K=S.defaultGenerator.nextId(),Y=Promise.all([x,A]).then(ee=>{const se=k.querySelector(`div[data-code="${K}"]`);se&&b.reset(se,ee[0])}).catch(ee=>{});return y.asyncRenderCallback&&Y.then(y.asyncRenderCallback),`
    ${c.escape(R)}
    `}),y.actionHandler&&y.actionHandler.disposeables.add(n.Event.any(t.domEvent(k,"click"),t.domEvent(k,"auxclick"))(R=>{const W=new r.StandardMouseEvent(R);if(!(!W.leftButton&&!W.middleButton)){let x=W.target;if(!(x.tagName!=="A"&&(x=x.parentElement,!x||x.tagName!=="A")))try{const K=x.dataset.href;K&&y.actionHandler.callback(K,W)}catch(K){M.onUnexpectedError(K)}finally{W.preventDefault()}}})),L.sanitizer=R=>(v.isTrusted?R.match(/^(]+>)|(<\/\s*span>)$/):void 0)?R:"",L.sanitize=!0,L.silent=!0,L.renderer=B;let F=(I=v.value)!==null&&I!==void 0?I:"";F.length>1e5&&(F=`${F.substr(0,1e5)}\u2026`),v.supportThemeIcons&&(F=a.markdownEscapeEscapedIcons(F));const D=C.parse(F,L);if(k.innerHTML=_(v,D),O(),y.asyncRenderCallback)for(const R of k.getElementsByTagName("img")){const W=b.addDisposableListener(R,"load",()=>{W.dispose(),y.asyncRenderCallback()})}return k}e.renderMarkdown=m;function _(v,y){var L;const I=f(v);return(L=h==null?void 0:h.createHTML(y,I))!==null&&L!==void 0?L:d.insane(y,I)}function f(v){const y=[s.Schemas.http,s.Schemas.https,s.Schemas.mailto,s.Schemas.data,s.Schemas.file,s.Schemas.vscodeRemote,s.Schemas.vscodeRemoteResource];return v.isTrusted&&y.push(s.Schemas.command),{allowedSchemes:y,allowedTags:["ul","li","p","code","blockquote","ol","h1","h2","h3","h4","h5","h6","hr","em","pre","table","thead","tbody","tr","th","td","div","del","a","strong","br","img","span"],allowedAttributes:{a:["href","name","target","data-href"],img:["src","title","alt","width","height"],div:["class","data-code"],span:["class","style"],th:["align"],td:["align"]},filter(L){return L.tag==="span"&&v.isTrusted?L.attrs.style&&Object.keys(L.attrs).length===1?!!L.attrs.style.match(/^(color\:#[0-9a-fA-F]+;)?(background-color\:#[0-9a-fA-F]+;)?$/):L.attrs.class?!!L.attrs.class.match(/^codicon codicon-[a-z\-]+( codicon-modifier-[a-z\-]+)?$/):!1:!0}}}}),define(Q[159],J([0,1,24,43,17,44,152]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.normalizeDriveLetter=e.getBaseLabel=void 0;function C(g){if(!!g){typeof g=="string"&&(g=b.URI.file(g));const p=w.basename(g)||(g.scheme===N.Schemas.file?g.fsPath:g.path);return M.isWindows&&S.isRootOrDriveLetter(p)?d(p):p}}e.getBaseLabel=C;function d(g){return S.hasDriveLetter(g)?g.charAt(0).toUpperCase()+g.slice(1):g}e.normalizeDriveLetter=d}),define(Q[291],J([0,1,72,8,198,43,44]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.guessMimeTypes=e.registerTextMime=e.MIME_UNKNOWN=e.MIME_TEXT=void 0,e.MIME_TEXT="text/plain",e.MIME_UNKNOWN="application/unknown";let C=[],d=[],g=[];function p(u,r=!1){const i=c(u);C.push(i),i.userConfigured?g.push(i):d.push(i),r&&!i.userConfigured&&C.forEach(n=>{n.mime===i.mime||n.userConfigured||(i.extension&&n.extension===i.extension&&console.warn(`Overwriting extension <<${i.extension}>> to now point to mime <<${i.mime}>>`),i.filename&&n.filename===i.filename&&console.warn(`Overwriting filename <<${i.filename}>> to now point to mime <<${i.mime}>>`),i.filepattern&&n.filepattern===i.filepattern&&console.warn(`Overwriting filepattern <<${i.filepattern}>> to now point to mime <<${i.mime}>>`),i.firstline&&n.firstline===i.firstline&&console.warn(`Overwriting firstline <<${i.firstline}>> to now point to mime <<${i.mime}>>`))})}e.registerTextMime=p;function c(u){return{id:u.id,mime:u.mime,filename:u.filename,extension:u.extension,filepattern:u.filepattern,firstline:u.firstline,userConfigured:u.userConfigured,filenameLowercase:u.filename?u.filename.toLowerCase():void 0,extensionLowercase:u.extension?u.extension.toLowerCase():void 0,filepatternLowercase:u.filepattern?u.filepattern.toLowerCase():void 0,filepatternOnPath:u.filepattern?u.filepattern.indexOf(b.posix.sep)>=0:!1}}function o(u,r){let i;if(u)switch(u.scheme){case w.Schemas.file:i=u.fsPath;break;case w.Schemas.data:i=S.DataUri.parseMetaData(u).get(S.DataUri.META_DATA_LABEL);break;default:i=u.path}if(!i)return[e.MIME_UNKNOWN];i=i.toLowerCase();const n=b.basename(i),t=s(i,n,g);if(t)return[t,e.MIME_TEXT];const l=s(i,n,d);if(l)return[l,e.MIME_TEXT];if(r){const h=a(r);if(h)return[h,e.MIME_TEXT]}return[e.MIME_UNKNOWN]}e.guessMimeTypes=o;function s(u,r,i){let n=null,t=null,l=null;for(let h=i.length-1;h>=0;h--){const m=i[h];if(r===m.filenameLowercase){n=m;break}if(m.filepattern&&(!t||m.filepattern.length>t.filepattern.length)){const _=m.filepatternOnPath?u:r;M.match(m.filepatternLowercase,_)&&(t=m)}m.extension&&(!l||m.extension.length>l.extension.length)&&r.endsWith(m.extensionLowercase)&&(l=m)}return n?n.mime:t?t.mime:l?l.mime:null}function a(u){if(N.startsWithUTF8BOM(u)&&(u=u.substr(1)),u.length>0)for(let r=C.length-1;r>=0;r--){const i=C[r];if(!!i.firstline){const n=u.match(i.firstline);if(n&&n.length>0)return i.mime}}return null}}),define(Q[292],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.generateUuid=void 0;const b=new Uint8Array(16),N=[];for(let S=0;S<256;S++)N.push(S.toString(16).padStart(2,"0"));let M;typeof crypto=="object"&&typeof crypto.getRandomValues=="function"?M=crypto.getRandomValues.bind(crypto):M=function(S){for(let C=0;C{this._pendingReplies[r]={resolve:i,reject:n},this._send({vsWorker:this._workerId,req:r,method:a,args:u})})}handleMessage(a){!a||!a.vsWorker||this._workerId!==-1&&a.vsWorker!==this._workerId||this._handleMessage(a)}_handleMessage(a){if(a.seq){let n=a;if(!this._pendingReplies[n.seq]){console.warn("Got reply to unknown seq");return}let t=this._pendingReplies[n.seq];if(delete this._pendingReplies[n.seq],n.err){let l=n.err;n.err.$isError&&(l=new Error,l.name=n.err.name,l.message=n.err.message,l.stack=n.err.stack),t.reject(l);return}t.resolve(n.res);return}let u=a,r=u.req;this._handler.handleMessage(u.method,u.args).then(n=>{this._send({vsWorker:this._workerId,seq:r,res:n,err:void 0})},n=>{n.detail instanceof Error&&(n.detail=b.transformErrorForSerialization(n.detail)),this._send({vsWorker:this._workerId,seq:r,res:void 0,err:b.transformErrorForSerialization(n)})})}_send(a){let u=[];if(a.req){const r=a;for(let i=0;i{this._protocol.handleMessage(h)},h=>{i&&i(h)})),this._protocol=new g({sendMessage:(h,m)=>{this._worker.postMessage(h,m)},handleMessage:(h,m)=>{if(typeof r[h]!="function")return Promise.reject(new Error("Missing method "+h+" on main thread host."));try{return Promise.resolve(r[h].apply(r,m))}catch(_){return Promise.reject(_)}}}),this._protocol.setWorkerId(this._worker.getId());let n=null;typeof self.require!="undefined"&&typeof self.require.getConfig=="function"?n=self.require.getConfig():typeof self.requirejs!="undefined"&&(n=self.requirejs.s.contexts._.config);const t=w.getAllMethodNames(r);this._onModuleLoaded=this._protocol.sendMessage(S,[this._worker.getId(),JSON.parse(JSON.stringify(n)),u,t]);const l=(h,m)=>this._request(h,m);this._lazyProxy=new Promise((h,m)=>{i=m,this._onModuleLoaded.then(_=>{h(w.createProxyObject(_,l))},_=>{m(_),this._onError("Worker failed to load "+u,_)})})}getProxyObject(){return this._lazyProxy}_request(a,u){return new Promise((r,i)=>{this._onModuleLoaded.then(()=>{this._protocol.sendMessage(a,u).then(r,i)},i)})}_onError(a,u){console.error(a),console.info(u)}}e.SimpleWorkerClient=p;class c{constructor(a,u){this._requestHandlerFactory=u,this._requestHandler=null,this._protocol=new g({sendMessage:(r,i)=>{a(r,i)},handleMessage:(r,i)=>this._handleMessage(r,i)})}onmessage(a){this._protocol.handleMessage(a)}_handleMessage(a,u){if(a===S)return this.initialize(u[0],u[1],u[2],u[3]);if(!this._requestHandler||typeof this._requestHandler[a]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+a));try{return Promise.resolve(this._requestHandler[a].apply(this._requestHandler,u))}catch(r){return Promise.reject(r)}}initialize(a,u,r,i){this._protocol.setWorkerId(a);const n=(l,h)=>this._protocol.sendMessage(l,h),t=w.createProxyObject(i,n);return this._requestHandlerFactory?(this._requestHandler=this._requestHandlerFactory(t),Promise.resolve(w.getAllMethodNames(this._requestHandler))):(u&&(typeof u.baseUrl!="undefined"&&delete u.baseUrl,typeof u.paths!="undefined"&&typeof u.paths.vs!="undefined"&&delete u.paths.vs,typeof u.trustedTypesPolicy!==void 0&&delete u.trustedTypesPolicy,u.catchError=!0,self.require.config(u)),new Promise((l,h)=>{self.require([r],m=>{if(this._requestHandler=m.create(t),!this._requestHandler){h(new Error("No RequestHandler!"));return}l(w.getAllMethodNames(this._requestHandler))},h)}))}}e.SimpleWorkerServer=c;function o(s){return new c(s,null)}e.create=o}),define(Q[202],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ItemActivation=e.NO_KEY_MODS=void 0,e.NO_KEY_MODS={ctrlCmd:!1,alt:!1};var b;(function(N){N[N.NONE=0]="NONE",N[N.FIRST=1]="FIRST",N[N.SECOND=2]="SECOND",N[N.LAST=3]="LAST"})(b=e.ItemActivation||(e.ItemActivation={}))}),define(Q[293],J([0,1,2,6,15,20]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InMemoryStorageDatabase=e.Storage=void 0;var S;(function(g){g[g.None=0]="None",g[g.Initialized=1]="Initialized",g[g.Closed=2]="Closed"})(S||(S={}));class C extends b.Disposable{constructor(p,c=Object.create(null)){super();this.database=p,this.options=c,this._onDidChangeStorage=this._register(new N.Emitter),this.onDidChangeStorage=this._onDidChangeStorage.event,this.state=S.None,this.cache=new Map,this.flushDelayer=new M.ThrottledDelayer(C.DEFAULT_FLUSH_DELAY),this.pendingDeletes=new Set,this.pendingInserts=new Map,this.whenFlushedCallbacks=[],this.registerListeners()}registerListeners(){this._register(this.database.onDidChangeItemsExternal(p=>this.onDidChangeItemsExternal(p)))}onDidChangeItemsExternal(p){var c,o;(c=p.changed)===null||c===void 0||c.forEach((s,a)=>this.accept(a,s)),(o=p.deleted)===null||o===void 0||o.forEach(s=>this.accept(s,void 0))}accept(p,c){if(this.state!==S.Closed){let o=!1;w.isUndefinedOrNull(c)?o=this.cache.delete(p):this.cache.get(p)!==c&&(this.cache.set(p,c),o=!0),o&&this._onDidChangeStorage.fire(p)}}get(p,c){const o=this.cache.get(p);return w.isUndefinedOrNull(o)?c:o}getBoolean(p,c){const o=this.get(p);return w.isUndefinedOrNull(o)?c:o==="true"}getNumber(p,c){const o=this.get(p);return w.isUndefinedOrNull(o)?c:parseInt(o,10)}set(p,c){return Ie(this,void 0,void 0,function*(){if(this.state!==S.Closed){if(w.isUndefinedOrNull(c))return this.delete(p);const o=String(c);if(this.cache.get(p)!==o)return this.cache.set(p,o),this.pendingInserts.set(p,o),this.pendingDeletes.delete(p),this._onDidChangeStorage.fire(p),this.flushDelayer.trigger(()=>this.flushPending())}})}delete(p){return Ie(this,void 0,void 0,function*(){if(this.state!==S.Closed&&!!this.cache.delete(p))return this.pendingDeletes.has(p)||this.pendingDeletes.add(p),this.pendingInserts.delete(p),this._onDidChangeStorage.fire(p),this.flushDelayer.trigger(()=>this.flushPending())})}get hasPending(){return this.pendingInserts.size>0||this.pendingDeletes.size>0}flushPending(){return Ie(this,void 0,void 0,function*(){if(!!this.hasPending){const p={insert:this.pendingInserts,delete:this.pendingDeletes};return this.pendingDeletes=new Set,this.pendingInserts=new Map,this.database.updateItems(p).finally(()=>{var c;if(!this.hasPending)for(;this.whenFlushedCallbacks.length;)(c=this.whenFlushedCallbacks.pop())===null||c===void 0||c()})}})}dispose(){this.flushDelayer.cancel(),this.flushDelayer.dispose(),super.dispose()}}e.Storage=C,C.DEFAULT_FLUSH_DELAY=100;class d{constructor(){this.onDidChangeItemsExternal=N.Event.None,this.items=new Map}updateItems(p){return Ie(this,void 0,void 0,function*(){p.insert&&p.insert.forEach((c,o)=>this.items.set(o,c)),p.delete&&p.delete.forEach(c=>this.items.delete(c))})}}e.InMemoryStorageDatabase=d}),define(Q[294],J([0,1,17,201]),function(q,e,b,N){"use strict";var M;Object.defineProperty(e,"__esModule",{value:!0}),e.DefaultWorkerFactory=e.getWorkerBootstrapUrl=void 0;const w=(M=window.trustedTypes)===null||M===void 0?void 0:M.createPolicy("defaultWorkerFactory",{createScriptURL:c=>c});function S(c,o){if(b.globals.MonacoEnvironment){if(typeof b.globals.MonacoEnvironment.getWorker=="function")return b.globals.MonacoEnvironment.getWorker(c,o);if(typeof b.globals.MonacoEnvironment.getWorkerUrl=="function"){const s=b.globals.MonacoEnvironment.getWorkerUrl(c,o);return new Worker(w?w.createScriptURL(s):s,{name:o})}}if(typeof q=="function"){const s=q.toUrl("./"+c),a=C(s,o);return new Worker(w?w.createScriptURL(a):a,{name:o})}throw new Error("You must define a function MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker")}function C(c,o,s=!1){if(s||/^((http:)|(https:)|(file:))/.test(c)){const a=String(window.location),u=a.substr(0,a.length-window.location.hash.length-window.location.search.length-window.location.pathname.length);if(s||c.substring(0,u.length)!==u){const r="vs/base/worker/defaultWorkerFactory.js",i=q.toUrl(r).slice(0,-r.length),n=`/*${o}*/self.MonacoEnvironment={baseUrl: '${i}'};importScripts('${c}');/*${o}*/`;if(s)return`data:text/javascript;charset=utf-8,${encodeURIComponent(n)}`;const t=new Blob([n],{type:"application/javascript"});return URL.createObjectURL(t)}}return c+"#"+o}e.getWorkerBootstrapUrl=C;function d(c){return typeof c.then=="function"}class g{constructor(o,s,a,u,r){this.id=s;const i=S("workerMain.js",a);d(i)?this.worker=i:this.worker=Promise.resolve(i),this.postMessage(o,[]),this.worker.then(n=>{n.onmessage=function(t){u(t.data)},n.onmessageerror=r,typeof n.addEventListener=="function"&&n.addEventListener("error",r)})}getId(){return this.id}postMessage(o,s){this.worker&&this.worker.then(a=>a.postMessage(o,s))}dispose(){this.worker&&this.worker.then(o=>o.terminate()),this.worker=null}}class p{constructor(o){this._label=o,this._webWorkerFailedBeforeError=!1}create(o,s,a){let u=++p.LAST_WORKER_ID;if(this._webWorkerFailedBeforeError)throw this._webWorkerFailedBeforeError;return new g(o,u,this._label||"anonymous"+u,s,r=>{N.logOnceWebWorkerWarning(r),this._webWorkerFailedBeforeError=r,a(r)})}}e.DefaultWorkerFactory=p,p.LAST_WORKER_ID=0}),define(Q[203],J([10]),{}),define(Q[295],J([10]),{}),define(Q[47],J([0,1,17,7,295]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.status=e.alert=e.setARIAContainer=void 0;const M=2e4;let w,S,C,d,g;function p(a){w=document.createElement("div"),w.className="monaco-aria-container";const u=()=>{const i=document.createElement("div");return i.className="monaco-alert",i.setAttribute("role","alert"),i.setAttribute("aria-atomic","true"),w.appendChild(i),i};S=u(),C=u();const r=()=>{const i=document.createElement("div");return i.className="monaco-status",i.setAttribute("role","complementary"),i.setAttribute("aria-live","polite"),i.setAttribute("aria-atomic","true"),w.appendChild(i),i};d=r(),g=r(),a.appendChild(w)}e.setARIAContainer=p;function c(a){!w||(S.textContent!==a?(N.clearNode(C),s(S,a)):(N.clearNode(S),s(C,a)))}e.alert=c;function o(a){!w||(b.isMacintosh?c(a):d.textContent!==a?(N.clearNode(g),s(d,a)):(N.clearNode(d),s(g,a)))}e.status=o;function s(a,u){N.clearNode(a),u.length>M&&(u=u.substr(0,M)),a.textContent=u,a.style.visibility="hidden",a.style.visibility="visible"}}),define(Q[296],J([10]),{}),define(Q[297],J([0,1,56,29,40,6,2,60,103,7,296]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Button=void 0;const p={buttonBackground:N.Color.fromHex("#0E639C"),buttonHoverBackground:N.Color.fromHex("#006BB3"),buttonForeground:N.Color.white};class c extends S.Disposable{constructor(s,a){super();this._onDidClick=this._register(new w.Emitter),this.options=a||Object.create(null),M.mixin(this.options,p,!1),this.buttonForeground=this.options.buttonForeground,this.buttonBackground=this.options.buttonBackground,this.buttonHoverBackground=this.options.buttonHoverBackground,this.buttonSecondaryForeground=this.options.buttonSecondaryForeground,this.buttonSecondaryBackground=this.options.buttonSecondaryBackground,this.buttonSecondaryHoverBackground=this.options.buttonSecondaryHoverBackground,this.buttonBorder=this.options.buttonBorder,this._element=document.createElement("a"),this._element.classList.add("monaco-button"),this._element.tabIndex=0,this._element.setAttribute("role","button"),s.appendChild(this._element),this._register(C.Gesture.addTarget(this._element)),[g.EventType.CLICK,C.EventType.Tap].forEach(u=>{this._register(g.addDisposableListener(this._element,u,r=>{if(!this.enabled){g.EventHelper.stop(r);return}this._onDidClick.fire(r)}))}),this._register(g.addDisposableListener(this._element,g.EventType.KEY_DOWN,u=>{const r=new b.StandardKeyboardEvent(u);let i=!1;this.enabled&&(r.equals(3)||r.equals(10))?(this._onDidClick.fire(u),i=!0):r.equals(9)&&(this._element.blur(),i=!0),i&&g.EventHelper.stop(r,!0)})),this._register(g.addDisposableListener(this._element,g.EventType.MOUSE_OVER,u=>{this._element.classList.contains("disabled")||this.setHoverBackground()})),this._register(g.addDisposableListener(this._element,g.EventType.MOUSE_OUT,u=>{this.applyStyles()})),this.focusTracker=this._register(g.trackFocus(this._element)),this._register(this.focusTracker.onDidFocus(()=>this.setHoverBackground())),this._register(this.focusTracker.onDidBlur(()=>this.applyStyles())),this.applyStyles()}get onDidClick(){return this._onDidClick.event}setHoverBackground(){let s;this.options.secondary?s=this.buttonSecondaryHoverBackground?this.buttonSecondaryHoverBackground.toString():null:s=this.buttonHoverBackground?this.buttonHoverBackground.toString():null,s&&(this._element.style.backgroundColor=s)}style(s){this.buttonForeground=s.buttonForeground,this.buttonBackground=s.buttonBackground,this.buttonHoverBackground=s.buttonHoverBackground,this.buttonSecondaryForeground=s.buttonSecondaryForeground,this.buttonSecondaryBackground=s.buttonSecondaryBackground,this.buttonSecondaryHoverBackground=s.buttonSecondaryHoverBackground,this.buttonBorder=s.buttonBorder,this.applyStyles()}applyStyles(){if(this._element){let s,a;this.options.secondary?(a=this.buttonSecondaryForeground?this.buttonSecondaryForeground.toString():"",s=this.buttonSecondaryBackground?this.buttonSecondaryBackground.toString():""):(a=this.buttonForeground?this.buttonForeground.toString():"",s=this.buttonBackground?this.buttonBackground.toString():"");const u=this.buttonBorder?this.buttonBorder.toString():"";this._element.style.color=a,this._element.style.backgroundColor=s,this._element.style.borderWidth=u?"1px":"",this._element.style.borderStyle=u?"solid":"",this._element.style.borderColor=u}}get element(){return this._element}set label(s){this._element.classList.add("monaco-text-button"),this.options.supportIcons?g.reset(this._element,...d.renderLabelWithIcons(s)):this._element.textContent=s,typeof this.options.title=="string"?this._element.title=this.options.title:this.options.title&&(this._element.title=s)}set enabled(s){s?(this._element.classList.remove("disabled"),this._element.setAttribute("aria-disabled",String(!1)),this._element.tabIndex=0):(this._element.classList.add("disabled"),this._element.setAttribute("aria-disabled",String(!0)))}get enabled(){return!this._element.classList.contains("disabled")}}e.Button=c}),define(Q[298],J([10]),{}),define(Q[160],J([0,1,52,29,6,27,298]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Checkbox=void 0;const S={inputActiveOptionBorder:N.Color.fromHex("#007ACC00"),inputActiveOptionForeground:N.Color.fromHex("#FFFFFF"),inputActiveOptionBackground:N.Color.fromHex("#0E639C50")};class C extends b.Widget{constructor(g){super();this._onChange=this._register(new M.Emitter),this.onChange=this._onChange.event,this._onKeyDown=this._register(new M.Emitter),this.onKeyDown=this._onKeyDown.event,this._opts=Object.assign(Object.assign({},S),g),this._checked=this._opts.isChecked;const p=["monaco-custom-checkbox"];this._opts.icon&&p.push(...w.CSSIcon.asClassNameArray(this._opts.icon)),this._opts.actionClassName&&p.push(...this._opts.actionClassName.split(" ")),this._checked&&p.push("checked"),this.domNode=document.createElement("div"),this.domNode.title=this._opts.title,this.domNode.classList.add(...p),this._opts.notFocusable||(this.domNode.tabIndex=0),this.domNode.setAttribute("role","checkbox"),this.domNode.setAttribute("aria-checked",String(this._checked)),this.domNode.setAttribute("aria-label",this._opts.title),this.applyStyles(),this.onclick(this.domNode,c=>{this.checked=!this._checked,this._onChange.fire(!1),c.preventDefault()}),this.ignoreGesture(this.domNode),this.onkeydown(this.domNode,c=>{if(c.keyCode===10||c.keyCode===3){this.checked=!this._checked,this._onChange.fire(!0),c.preventDefault();return}this._onKeyDown.fire(c)})}get enabled(){return this.domNode.getAttribute("aria-disabled")!=="true"}focus(){this.domNode.focus()}get checked(){return this._checked}set checked(g){this._checked=g,this.domNode.setAttribute("aria-checked",String(this._checked)),this.domNode.classList.toggle("checked",this._checked),this.applyStyles()}width(){return 2+2+2+16}style(g){g.inputActiveOptionBorder&&(this._opts.inputActiveOptionBorder=g.inputActiveOptionBorder),g.inputActiveOptionForeground&&(this._opts.inputActiveOptionForeground=g.inputActiveOptionForeground),g.inputActiveOptionBackground&&(this._opts.inputActiveOptionBackground=g.inputActiveOptionBackground),this.applyStyles()}applyStyles(){this.domNode&&(this.domNode.style.borderColor=this._checked&&this._opts.inputActiveOptionBorder?this._opts.inputActiveOptionBorder.toString():"transparent",this.domNode.style.color=this._checked&&this._opts.inputActiveOptionForeground?this._opts.inputActiveOptionForeground.toString():"inherit",this.domNode.style.backgroundColor=this._checked&&this._opts.inputActiveOptionBackground?this._opts.inputActiveOptionBackground.toString():"transparent")}enable(){this.domNode.setAttribute("aria-disabled",String(!1))}disable(){this.domNode.setAttribute("aria-disabled",String(!0))}}e.Checkbox=C}),define(Q[299],J([10]),{}),define(Q[300],J([10]),{}),define(Q[123],J([0,1,27,299,300]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.formatRule=void 0;function N(M){let w=M.definition;for(;w instanceof b.Codicon;)w=w.definition;return`.codicon-${M.id}:before { content: '${w.fontCharacter}'; }`}e.formatRule=N}),define(Q[301],J([10]),{}),define(Q[204],J([0,1,7,17,2,120,151,301]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextView=e.layout=e.LayoutAnchorMode=void 0;var C;(function(c){c[c.AVOID=0]="AVOID",c[c.ALIGN=1]="ALIGN"})(C=e.LayoutAnchorMode||(e.LayoutAnchorMode={}));function d(c,o,s){const a=s.mode===C.ALIGN?s.offset:s.offset+s.size,u=s.mode===C.ALIGN?s.offset+s.size:s.offset;return s.position===0?o<=c-a?a:o<=u?u-o:Math.max(c-o,0):o<=u?u-o:o<=c-a?a:0}e.layout=d;class g extends M.Disposable{constructor(o,s){super();this.container=null,this.delegate=null,this.toDisposeOnClean=M.Disposable.None,this.toDisposeOnSetContainer=M.Disposable.None,this.shadowRoot=null,this.shadowRootHostElement=null,this.view=b.$(".context-view"),this.useFixedPosition=!1,this.useShadowDOM=!1,b.hide(this.view),this.setContainer(o,s),this._register(M.toDisposable(()=>this.setContainer(null,1)))}setContainer(o,s){var a;if(this.container&&(this.toDisposeOnSetContainer.dispose(),this.shadowRoot?(this.shadowRoot.removeChild(this.view),this.shadowRoot=null,(a=this.shadowRootHostElement)===null||a===void 0||a.remove(),this.shadowRootHostElement=null):this.container.removeChild(this.view),this.container=null),o){if(this.container=o,this.useFixedPosition=s!==1,this.useShadowDOM=s===3,this.useShadowDOM){this.shadowRootHostElement=b.$(".shadow-root-host"),this.container.appendChild(this.shadowRootHostElement),this.shadowRoot=this.shadowRootHostElement.attachShadow({mode:"open"});const r=document.createElement("style");r.textContent=p,this.shadowRoot.appendChild(r),this.shadowRoot.appendChild(this.view),this.shadowRoot.appendChild(b.$("slot"))}else this.container.appendChild(this.view);const u=new M.DisposableStore;g.BUBBLE_UP_EVENTS.forEach(r=>{u.add(b.addStandardDisposableListener(this.container,r,i=>{this.onDOMEvent(i,!1)}))}),g.BUBBLE_DOWN_EVENTS.forEach(r=>{u.add(b.addStandardDisposableListener(this.container,r,i=>{this.onDOMEvent(i,!0)},!0))}),this.toDisposeOnSetContainer=u}}show(o){this.isVisible()&&this.hide(),b.clearNode(this.view),this.view.className="context-view",this.view.style.top="0px",this.view.style.left="0px",this.view.style.zIndex="2500",this.view.style.position=this.useFixedPosition?"fixed":"absolute",b.show(this.view),this.toDisposeOnClean=o.render(this.view)||M.Disposable.None,this.delegate=o,this.doLayout(),this.delegate.focus&&this.delegate.focus()}getViewElement(){return this.view}layout(){if(!!this.isVisible()){if(this.delegate.canRelayout===!1&&!(N.isIOS&&S.BrowserFeatures.pointerEvents)){this.hide();return}this.delegate.layout&&this.delegate.layout(),this.doLayout()}}doLayout(){if(!!this.isVisible()){let o=this.delegate.getAnchor(),s;if(b.isHTMLElement(o)){let m=b.getDomNodePagePosition(o);s={top:m.top,left:m.left,width:m.width,height:m.height}}else s={top:o.y,left:o.x,width:o.width||1,height:o.height||2};const a=b.getTotalWidth(this.view),u=b.getTotalHeight(this.view),r=this.delegate.anchorPosition||0,i=this.delegate.anchorAlignment||0,n=this.delegate.anchorAxisAlignment||0;let t,l;if(n===0){const m={offset:s.top-window.pageYOffset,size:s.height,position:r===0?0:1},_={offset:s.left,size:s.width,position:i===0?0:1,mode:C.ALIGN};t=d(window.innerHeight,u,m)+window.pageYOffset,w.Range.intersects({start:t,end:t+u},{start:m.offset,end:m.offset+m.size})&&(_.mode=C.AVOID),l=d(window.innerWidth,a,_)}else{const m={offset:s.left,size:s.width,position:i===0?0:1},_={offset:s.top,size:s.height,position:r===0?0:1,mode:C.ALIGN};l=d(window.innerWidth,a,m),w.Range.intersects({start:l,end:l+a},{start:m.offset,end:m.offset+m.size})&&(_.mode=C.AVOID),t=d(window.innerHeight,u,_)+window.pageYOffset}this.view.classList.remove("top","bottom","left","right"),this.view.classList.add(r===0?"bottom":"top"),this.view.classList.add(i===0?"left":"right"),this.view.classList.toggle("fixed",this.useFixedPosition);const h=b.getDomNodePagePosition(this.container);this.view.style.top=`${t-(this.useFixedPosition?b.getDomNodePagePosition(this.view).top:h.top)}px`,this.view.style.left=`${l-(this.useFixedPosition?b.getDomNodePagePosition(this.view).left:h.left)}px`,this.view.style.width="initial"}}hide(o){const s=this.delegate;this.delegate=null,(s==null?void 0:s.onHide)&&s.onHide(o),this.toDisposeOnClean.dispose(),b.hide(this.view)}isVisible(){return!!this.delegate}onDOMEvent(o,s){this.delegate&&(this.delegate.onDOMEvent?this.delegate.onDOMEvent(o,document.activeElement):s&&!b.isAncestor(o.target,this.container)&&this.hide())}dispose(){this.hide(),super.dispose()}}e.ContextView=g,g.BUBBLE_UP_EVENTS=["click","keydown","focus","blur"],g.BUBBLE_DOWN_EVENTS=["click"];let p=` + :host { + all: initial; /* 1st rule so subsequent properties are reset. */ + } + + @font-face { + font-family: "codicon"; + src: url("./codicon.ttf?5d4d76ab2ce5108968ad644d591a16a6") format("truetype"); + } + + .codicon[class*='codicon-'] { + font: normal normal normal 16px/1 codicon; + display: inline-block; + text-decoration: none; + text-rendering: auto; + text-align: center; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + } + + :host { + font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", system-ui, "Ubuntu", "Droid Sans", sans-serif; + } + + :host-context(.mac) { font-family: -apple-system, BlinkMacSystemFont, sans-serif; } + :host-context(.mac:lang(zh-Hans)) { font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", sans-serif; } + :host-context(.mac:lang(zh-Hant)) { font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", sans-serif; } + :host-context(.mac:lang(ja)) { font-family: -apple-system, BlinkMacSystemFont, "Hiragino Kaku Gothic Pro", sans-serif; } + :host-context(.mac:lang(ko)) { font-family: -apple-system, BlinkMacSystemFont, "Nanum Gothic", "Apple SD Gothic Neo", "AppleGothic", sans-serif; } + + :host-context(.windows) { font-family: "Segoe WPC", "Segoe UI", sans-serif; } + :host-context(.windows:lang(zh-Hans)) { font-family: "Segoe WPC", "Segoe UI", "Microsoft YaHei", sans-serif; } + :host-context(.windows:lang(zh-Hant)) { font-family: "Segoe WPC", "Segoe UI", "Microsoft Jhenghei", sans-serif; } + :host-context(.windows:lang(ja)) { font-family: "Segoe WPC", "Segoe UI", "Yu Gothic UI", "Meiryo UI", sans-serif; } + :host-context(.windows:lang(ko)) { font-family: "Segoe WPC", "Segoe UI", "Malgun Gothic", "Dotom", sans-serif; } + + :host-context(.linux) { font-family: system-ui, "Ubuntu", "Droid Sans", sans-serif; } + :host-context(.linux:lang(zh-Hans)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; } + :host-context(.linux:lang(zh-Hant)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans TC", "Source Han Sans TW", "Source Han Sans", sans-serif; } + :host-context(.linux:lang(ja)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", sans-serif; } + :host-context(.linux:lang(ko)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; } +`}),define(Q[302],J([10]),{}),define(Q[205],J([0,1,7,8,29,40,302]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CountBadge=void 0;const S={badgeBackground:M.Color.fromHex("#4D4D4D"),badgeForeground:M.Color.fromHex("#FFFFFF")};class C{constructor(g,p){this.count=0,this.options=p||Object.create(null),w.mixin(this.options,S,!1),this.badgeBackground=this.options.badgeBackground,this.badgeForeground=this.options.badgeForeground,this.badgeBorder=this.options.badgeBorder,this.element=b.append(g,b.$(".monaco-count-badge")),this.countFormat=this.options.countFormat||"{0}",this.titleFormat=this.options.titleFormat||"",this.setCount(this.options.count||0)}setCount(g){this.count=g,this.render()}setTitleFormat(g){this.titleFormat=g,this.render()}render(){this.element.textContent=N.format(this.countFormat,this.count),this.element.title=N.format(this.titleFormat,this.count),this.applyStyles()}style(g){this.badgeBackground=g.badgeBackground,this.badgeForeground=g.badgeForeground,this.badgeBorder=g.badgeBorder,this.applyStyles()}applyStyles(){if(this.element){const g=this.badgeBackground?this.badgeBackground.toString():"",p=this.badgeForeground?this.badgeForeground.toString():"",c=this.badgeBorder?this.badgeBorder.toString():"";this.element.style.backgroundColor=g,this.element.style.color=p,this.element.style.borderWidth=c?"1px":"",this.element.style.borderStyle=c?"solid":"",this.element.style.borderColor=c}}}e.CountBadge=C}),define(Q[206],J([10]),{}),define(Q[207],J([10]),{}),define(Q[303],J([10]),{}),define(Q[304],J([10]),{}),define(Q[305],J([10]),{}),define(Q[306],J([10]),{}),define(Q[208],J([10]),{}),define(Q[307],J([10]),{}),define(Q[124],J([0,1,307]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME=void 0,e.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME="monaco-mouse-cursor-text"}),define(Q[308],J([10]),{}),define(Q[309],J([0,1,2,29,40,7,15,308]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ProgressBar=void 0;const C="done",d="active",g="infinite",p="discrete",c={progressBarBackground:N.Color.fromHex("#0E70C0")};class o extends b.Disposable{constructor(a,u){super();this.options=u||Object.create(null),M.mixin(this.options,c,!1),this.workedVal=0,this.progressBarBackground=this.options.progressBarBackground,this._register(this.showDelayedScheduler=new S.RunOnceScheduler(()=>w.show(this.element),0)),this.create(a)}create(a){this.element=document.createElement("div"),this.element.classList.add("monaco-progress-container"),this.element.setAttribute("role","progressbar"),this.element.setAttribute("aria-valuemin","0"),a.appendChild(this.element),this.bit=document.createElement("div"),this.bit.classList.add("progress-bit"),this.element.appendChild(this.bit),this.applyStyles()}off(){this.bit.style.width="inherit",this.bit.style.opacity="1",this.element.classList.remove(d,g,p),this.workedVal=0,this.totalWork=void 0}stop(){return this.doDone(!1)}doDone(a){return this.element.classList.add(C),this.element.classList.contains(g)?(this.bit.style.opacity="0",a?setTimeout(()=>this.off(),200):this.off()):(this.bit.style.width="inherit",a?setTimeout(()=>this.off(),200):this.off()),this}infinite(){return this.bit.style.width="2%",this.bit.style.opacity="1",this.element.classList.remove(p,C),this.element.classList.add(d,g),this}getContainer(){return this.element}style(a){this.progressBarBackground=a.progressBarBackground,this.applyStyles()}applyStyles(){if(this.bit){const a=this.progressBarBackground?this.progressBarBackground.toString():"";this.bit.style.backgroundColor=a}}}e.ProgressBar=o}),define(Q[310],J([10]),{}),define(Q[104],J([0,1,2,17,20,60,50,6,7,55,15,310]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Sash=e.OrthogonalEdge=void 0;let c=!1;var o;(function(r){r.North="north",r.South="south",r.East="east",r.West="west"})(o=e.OrthogonalEdge||(e.OrthogonalEdge={}));let s=4;const a=new C.Emitter;class u extends b.Disposable{constructor(i,n,t){super();this.hoverDelayer=this._register(new p.Delayer(300)),this._state=3,this._onDidEnablementChange=this._register(new C.Emitter),this.onDidEnablementChange=this._onDidEnablementChange.event,this._onDidStart=this._register(new C.Emitter),this.onDidStart=this._onDidStart.event,this._onDidChange=this._register(new C.Emitter),this.onDidChange=this._onDidChange.event,this._onDidReset=this._register(new C.Emitter),this.onDidReset=this._onDidReset.event,this._onDidEnd=this._register(new C.Emitter),this.onDidEnd=this._onDidEnd.event,this.linkedSash=void 0,this.orthogonalStartSashDisposables=this._register(new b.DisposableStore),this.orthogonalStartDragHandleDisposables=this._register(new b.DisposableStore),this.orthogonalEndSashDisposables=this._register(new b.DisposableStore),this.orthogonalEndDragHandleDisposables=this._register(new b.DisposableStore),this.el=d.append(i,d.$(".monaco-sash")),t.orthogonalEdge&&this.el.classList.add(`orthogonal-edge-${t.orthogonalEdge}`),N.isMacintosh&&this.el.classList.add("mac"),this._register(g.domEvent(this.el,"mousedown")(this.onMouseDown,this)),this._register(g.domEvent(this.el,"dblclick")(this.onMouseDoubleClick,this)),this._register(g.domEvent(this.el,"mouseenter")(()=>u.onMouseEnter(this))),this._register(g.domEvent(this.el,"mouseleave")(()=>u.onMouseLeave(this))),this._register(w.Gesture.addTarget(this.el)),this._register(g.domEvent(this.el,w.EventType.Start)(this.onTouchStart,this)),typeof t.size=="number"?(this.size=t.size,t.orientation===0?this.el.style.width=`${this.size}px`:this.el.style.height=`${this.size}px`):(this.size=s,this._register(a.event(l=>{this.size=l,this.layout()}))),this.hidden=!1,this.layoutProvider=n,this.orthogonalStartSash=t.orthogonalStartSash,this.orthogonalEndSash=t.orthogonalEndSash,this.orientation=t.orientation||0,this.orientation===1?(this.el.classList.add("horizontal"),this.el.classList.remove("vertical")):(this.el.classList.remove("horizontal"),this.el.classList.add("vertical")),this.el.classList.toggle("debug",c),this.layout()}get state(){return this._state}set state(i){this._state!==i&&(this.el.classList.toggle("disabled",i===0),this.el.classList.toggle("minimum",i===1),this.el.classList.toggle("maximum",i===2),this._state=i,this._onDidEnablementChange.fire(i))}get orthogonalStartSash(){return this._orthogonalStartSash}set orthogonalStartSash(i){if(this.orthogonalStartDragHandleDisposables.clear(),this.orthogonalStartSashDisposables.clear(),i){const n=t=>{this.orthogonalStartDragHandleDisposables.clear(),t!==0&&(this._orthogonalStartDragHandle=d.append(this.el,d.$(".orthogonal-drag-handle.start")),this.orthogonalStartDragHandleDisposables.add(b.toDisposable(()=>this._orthogonalStartDragHandle.remove())),g.domEvent(this._orthogonalStartDragHandle,"mouseenter")(()=>u.onMouseEnter(i),void 0,this.orthogonalStartDragHandleDisposables),g.domEvent(this._orthogonalStartDragHandle,"mouseleave")(()=>u.onMouseLeave(i),void 0,this.orthogonalStartDragHandleDisposables))};this.orthogonalStartSashDisposables.add(i.onDidEnablementChange(n,this)),n(i.state)}this._orthogonalStartSash=i}get orthogonalEndSash(){return this._orthogonalEndSash}set orthogonalEndSash(i){if(this.orthogonalEndDragHandleDisposables.clear(),this.orthogonalEndSashDisposables.clear(),i){const n=t=>{this.orthogonalEndDragHandleDisposables.clear(),t!==0&&(this._orthogonalEndDragHandle=d.append(this.el,d.$(".orthogonal-drag-handle.end")),this.orthogonalEndDragHandleDisposables.add(b.toDisposable(()=>this._orthogonalEndDragHandle.remove())),g.domEvent(this._orthogonalEndDragHandle,"mouseenter")(()=>u.onMouseEnter(i),void 0,this.orthogonalEndDragHandleDisposables),g.domEvent(this._orthogonalEndDragHandle,"mouseleave")(()=>u.onMouseLeave(i),void 0,this.orthogonalEndDragHandleDisposables))};this.orthogonalEndSashDisposables.add(i.onDidEnablementChange(n,this)),n(i.state)}this._orthogonalEndSash=i}onMouseDown(i){d.EventHelper.stop(i,!1);let n=!1;if(!i.__orthogonalSashEvent){const E=this.getOrthogonalSash(i);E&&(n=!0,i.__orthogonalSashEvent=!0,E.onMouseDown(i))}if(this.linkedSash&&!i.__linkedSashEvent&&(i.__linkedSashEvent=!0,this.linkedSash.onMouseDown(i)),!!this.state){const t=[...d.getElementsByTagName("iframe"),...d.getElementsByTagName("webview")];for(const E of t)E.style.pointerEvents="none";const l=new S.StandardMouseEvent(i),h=l.posx,m=l.posy,_=l.altKey,f={startX:h,currentX:h,startY:m,currentY:m,altKey:_};this.el.classList.add("active"),this._onDidStart.fire(f);const v=d.createStyleSheet(this.el),y=()=>{let E="";n?E="all-scroll":this.orientation===1?this.state===1?E="s-resize":this.state===2?E="n-resize":E=N.isMacintosh?"row-resize":"ns-resize":this.state===1?E="e-resize":this.state===2?E="w-resize":E=N.isMacintosh?"col-resize":"ew-resize",v.textContent=`* { cursor: ${E} !important; }`},L=new b.DisposableStore;y(),n||this.onDidEnablementChange(y,null,L);const I=E=>{d.EventHelper.stop(E,!1);const T=new S.StandardMouseEvent(E),O={startX:h,currentX:T.posx,startY:m,currentY:T.posy,altKey:_};this._onDidChange.fire(O)},k=E=>{d.EventHelper.stop(E,!1),this.el.removeChild(v),this.el.classList.remove("active"),this._onDidEnd.fire(),L.dispose();for(const T of t)T.style.pointerEvents="auto"};g.domEvent(window,"mousemove")(I,null,L),g.domEvent(window,"mouseup")(k,null,L)}}onMouseDoubleClick(i){const n=this.getOrthogonalSash(i);n&&n._onDidReset.fire(),this.linkedSash&&this.linkedSash._onDidReset.fire(),this._onDidReset.fire()}onTouchStart(i){d.EventHelper.stop(i);const n=[],t=i.pageX,l=i.pageY,h=i.altKey;this._onDidStart.fire({startX:t,currentX:t,startY:l,currentY:l,altKey:h}),n.push(d.addDisposableListener(this.el,w.EventType.Change,m=>{M.isNumber(m.pageX)&&M.isNumber(m.pageY)&&this._onDidChange.fire({startX:t,currentX:m.pageX,startY:l,currentY:m.pageY,altKey:h})})),n.push(d.addDisposableListener(this.el,w.EventType.End,()=>{this._onDidEnd.fire(),b.dispose(n)}))}static onMouseEnter(i,n=!1){i.el.classList.contains("active")?(i.hoverDelayer.cancel(),i.el.classList.add("hover")):i.hoverDelayer.trigger(()=>i.el.classList.add("hover")),!n&&i.linkedSash&&u.onMouseEnter(i.linkedSash,!0)}static onMouseLeave(i,n=!1){i.hoverDelayer.cancel(),i.el.classList.remove("hover"),!n&&i.linkedSash&&u.onMouseLeave(i.linkedSash,!0)}layout(){if(this.orientation===0){const i=this.layoutProvider;this.el.style.left=i.getVerticalSashLeft(this)-this.size/2+"px",i.getVerticalSashTop&&(this.el.style.top=i.getVerticalSashTop(this)+"px"),i.getVerticalSashHeight&&(this.el.style.height=i.getVerticalSashHeight(this)+"px")}else{const i=this.layoutProvider;this.el.style.top=i.getHorizontalSashTop(this)-this.size/2+"px",i.getHorizontalSashLeft&&(this.el.style.left=i.getHorizontalSashLeft(this)+"px"),i.getHorizontalSashWidth&&(this.el.style.width=i.getHorizontalSashWidth(this)+"px")}}hide(){this.hidden=!0,this.el.style.display="none",this.el.setAttribute("aria-hidden","true")}getOrthogonalSash(i){if(!(!i.target||!(i.target instanceof HTMLElement))&&i.target.classList.contains("orthogonal-drag-handle"))return i.target.classList.contains("start")?this.orthogonalStartSash:this.orthogonalEndSash}dispose(){super.dispose(),this.el.remove()}}e.Sash=u}),define(Q[311],J([10]),{}),define(Q[61],J([0,1,7,30,50,288,289,52,15,6,2,17,121,35,311]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DomScrollableElement=e.SmoothScrollableElement=e.ScrollableElement=e.AbstractScrollableElement=e.MouseWheelClassifier=void 0;const a=500,u=50,r=!0;class i{constructor(v,y,L){this.timestamp=v,this.deltaX=y,this.deltaY=L,this.score=0}}class n{constructor(){this._capacity=5,this._memory=[],this._front=-1,this._rear=-1}isPhysicalMouseWheel(){if(this._front===-1&&this._rear===-1)return!1;let v=1,y=0,L=1,I=this._rear;do{const k=I===this._front?v:Math.pow(2,-L);if(v-=k,y+=this._memory[I].score*k,I===this._front)break;I=(this._capacity+I-1)%this._capacity,L++}while(!0);return y<=.5}accept(v,y,L){const I=new i(v,y,L);I.score=this._computeScore(I),this._front===-1&&this._rear===-1?(this._memory[0]=I,this._front=0,this._rear=0):(this._rear=(this._rear+1)%this._capacity,this._rear===this._front&&(this._front=(this._front+1)%this._capacity),this._memory[this._rear]=I)}_computeScore(v){if(Math.abs(v.deltaX)>0&&Math.abs(v.deltaY)>0)return 1;let y=.5;const L=this._front===-1&&this._rear===-1?null:this._memory[this._rear];return(!this._isAlmostInt(v.deltaX)||!this._isAlmostInt(v.deltaY))&&(y+=.25),Math.min(Math.max(y,0),1)}_isAlmostInt(v){return Math.abs(Math.round(v)-v)<.01}}e.MouseWheelClassifier=n,n.INSTANCE=new n;class t extends C.Widget{constructor(v,y,L){super();this._onScroll=this._register(new g.Emitter),this.onScroll=this._onScroll.event,this._onWillScroll=this._register(new g.Emitter),v.style.overflow="hidden",this._options=_(y),this._scrollable=L,this._register(this._scrollable.onScroll(k=>{this._onWillScroll.fire(k),this._onDidScroll(k),this._onScroll.fire(k)}));const I={onMouseWheel:k=>this._onMouseWheel(k),onDragStart:()=>this._onDragStart(),onDragEnd:()=>this._onDragEnd()};this._verticalScrollbar=this._register(new S.VerticalScrollbar(this._scrollable,this._options,I)),this._horizontalScrollbar=this._register(new w.HorizontalScrollbar(this._scrollable,this._options,I)),this._domNode=document.createElement("div"),this._domNode.className="monaco-scrollable-element "+this._options.className,this._domNode.setAttribute("role","presentation"),this._domNode.style.position="relative",this._domNode.style.overflow="hidden",this._domNode.appendChild(v),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=N.createFastDomNode(document.createElement("div")),this._leftShadowDomNode.setClassName("shadow"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=N.createFastDomNode(document.createElement("div")),this._topShadowDomNode.setClassName("shadow"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=N.createFastDomNode(document.createElement("div")),this._topLeftShadowDomNode.setClassName("shadow top-left-corner"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode||this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this.onmouseover(this._listenOnDomNode,k=>this._onMouseOver(k)),this.onnonbubblingmouseout(this._listenOnDomNode,k=>this._onMouseOut(k)),this._hideTimeout=this._register(new d.TimeoutTimer),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}dispose(){this._mouseWheelToDispose=p.dispose(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getOverviewRulerLayoutInfo(){return{parent:this._domNode,insertBefore:this._verticalScrollbar.domNode.domNode}}delegateVerticalScrollbarMouseDown(v){this._verticalScrollbar.delegateMouseDown(v)}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(v){this._scrollable.setScrollDimensions(v,!1)}updateClassName(v){this._options.className=v,c.isMacintosh&&(this._options.className+=" mac"),this._domNode.className="monaco-scrollable-element "+this._options.className}updateOptions(v){typeof v.handleMouseWheel!="undefined"&&(this._options.handleMouseWheel=v.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),typeof v.mouseWheelScrollSensitivity!="undefined"&&(this._options.mouseWheelScrollSensitivity=v.mouseWheelScrollSensitivity),typeof v.fastScrollSensitivity!="undefined"&&(this._options.fastScrollSensitivity=v.fastScrollSensitivity),typeof v.scrollPredominantAxis!="undefined"&&(this._options.scrollPredominantAxis=v.scrollPredominantAxis),typeof v.horizontalScrollbarSize!="undefined"&&this._horizontalScrollbar.updateScrollbarSize(v.horizontalScrollbarSize),this._options.lazyRender||this._render()}_setListeningToMouseWheel(v){if(this._mouseWheelToDispose.length>0!==v&&(this._mouseWheelToDispose=p.dispose(this._mouseWheelToDispose),v)){const L=I=>{this._onMouseWheel(new M.StandardWheelEvent(I))};this._mouseWheelToDispose.push(b.addDisposableListener(this._listenOnDomNode,b.EventType.MOUSE_WHEEL,L,{passive:!1}))}}_onMouseWheel(v){const y=n.INSTANCE;if(r){const k=window.devicePixelRatio/s.getZoomFactor();c.isWindows||c.isLinux?y.accept(Date.now(),v.deltaX/k,v.deltaY/k):y.accept(Date.now(),v.deltaX,v.deltaY)}let L=!1;if(v.deltaY||v.deltaX){let k=v.deltaY*this._options.mouseWheelScrollSensitivity,E=v.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(Math.abs(k)>=Math.abs(E)?E=0:k=0),this._options.flipAxes&&([k,E]=[E,k]);const T=!c.isMacintosh&&v.browserEvent&&v.browserEvent.shiftKey;(this._options.scrollYToX||T)&&!E&&(E=k,k=0),v.browserEvent&&v.browserEvent.altKey&&(E=E*this._options.fastScrollSensitivity,k=k*this._options.fastScrollSensitivity);const O=this._scrollable.getFutureScrollPosition();let A={};if(k){const B=O.scrollTop-u*k;this._verticalScrollbar.writeScrollPosition(A,B)}if(E){const B=O.scrollLeft-u*E;this._horizontalScrollbar.writeScrollPosition(A,B)}A=this._scrollable.validateScrollPosition(A),(O.scrollLeft!==A.scrollLeft||O.scrollTop!==A.scrollTop)&&(r&&this._options.mouseWheelSmoothScroll&&y.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(A):this._scrollable.setScrollPositionNow(A),L=!0)}let I=L;!I&&this._options.alwaysConsumeMouseWheel&&(I=!0),!I&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(I=!0),I&&(v.preventDefault(),v.stopPropagation())}_onDidScroll(v){this._shouldRender=this._horizontalScrollbar.onDidScroll(v)||this._shouldRender,this._shouldRender=this._verticalScrollbar.onDidScroll(v)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error("Please use `lazyRender` together with `renderNow`!");this._render()}_render(){if(!!this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){const v=this._scrollable.getCurrentScrollPosition(),y=v.scrollTop>0,L=v.scrollLeft>0;this._leftShadowDomNode.setClassName("shadow"+(L?" left":"")),this._topShadowDomNode.setClassName("shadow"+(y?" top":"")),this._topLeftShadowDomNode.setClassName("shadow top-left-corner"+(y?" top":"")+(L?" left":""))}}_onDragStart(){this._isDragging=!0,this._reveal()}_onDragEnd(){this._isDragging=!1,this._hide()}_onMouseOut(v){this._mouseIsOver=!1,this._hide()}_onMouseOver(v){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){!this._mouseIsOver&&!this._isDragging&&(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){!this._mouseIsOver&&!this._isDragging&&this._hideTimeout.cancelAndSet(()=>this._hide(),a)}}e.AbstractScrollableElement=t;class l extends t{constructor(v,y){y=y||{},y.mouseWheelSmoothScroll=!1;const L=new o.Scrollable(0,I=>b.scheduleAtNextAnimationFrame(I));super(v,y,L);this._register(L)}setScrollPosition(v){this._scrollable.setScrollPositionNow(v)}}e.ScrollableElement=l;class h extends t{constructor(v,y,L){super(v,y,L)}setScrollPosition(v){v.reuseAnimation?this._scrollable.setScrollPositionSmooth(v,v.reuseAnimation):this._scrollable.setScrollPositionNow(v)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}}e.SmoothScrollableElement=h;class m extends l{constructor(v,y){super(v,y);this._element=v,this.onScroll(L=>{L.scrollTopChanged&&(this._element.scrollTop=L.scrollTop),L.scrollLeftChanged&&(this._element.scrollLeft=L.scrollLeft)}),this.scanDomNode()}scanDomNode(){this.setScrollDimensions({width:this._element.clientWidth,scrollWidth:this._element.scrollWidth,height:this._element.clientHeight,scrollHeight:this._element.scrollHeight}),this.setScrollPosition({scrollLeft:this._element.scrollLeft,scrollTop:this._element.scrollTop})}}e.DomScrollableElement=m;function _(f){const v={lazyRender:typeof f.lazyRender!="undefined"?f.lazyRender:!1,className:typeof f.className!="undefined"?f.className:"",useShadows:typeof f.useShadows!="undefined"?f.useShadows:!0,handleMouseWheel:typeof f.handleMouseWheel!="undefined"?f.handleMouseWheel:!0,flipAxes:typeof f.flipAxes!="undefined"?f.flipAxes:!1,consumeMouseWheelIfScrollbarIsNeeded:typeof f.consumeMouseWheelIfScrollbarIsNeeded!="undefined"?f.consumeMouseWheelIfScrollbarIsNeeded:!1,alwaysConsumeMouseWheel:typeof f.alwaysConsumeMouseWheel!="undefined"?f.alwaysConsumeMouseWheel:!1,scrollYToX:typeof f.scrollYToX!="undefined"?f.scrollYToX:!1,mouseWheelScrollSensitivity:typeof f.mouseWheelScrollSensitivity!="undefined"?f.mouseWheelScrollSensitivity:1,fastScrollSensitivity:typeof f.fastScrollSensitivity!="undefined"?f.fastScrollSensitivity:5,scrollPredominantAxis:typeof f.scrollPredominantAxis!="undefined"?f.scrollPredominantAxis:!0,mouseWheelSmoothScroll:typeof f.mouseWheelSmoothScroll!="undefined"?f.mouseWheelSmoothScroll:!0,arrowSize:typeof f.arrowSize!="undefined"?f.arrowSize:11,listenOnDomNode:typeof f.listenOnDomNode!="undefined"?f.listenOnDomNode:null,horizontal:typeof f.horizontal!="undefined"?f.horizontal:1,horizontalScrollbarSize:typeof f.horizontalScrollbarSize!="undefined"?f.horizontalScrollbarSize:10,horizontalSliderSize:typeof f.horizontalSliderSize!="undefined"?f.horizontalSliderSize:0,horizontalHasArrows:typeof f.horizontalHasArrows!="undefined"?f.horizontalHasArrows:!1,vertical:typeof f.vertical!="undefined"?f.vertical:1,verticalScrollbarSize:typeof f.verticalScrollbarSize!="undefined"?f.verticalScrollbarSize:10,verticalHasArrows:typeof f.verticalHasArrows!="undefined"?f.verticalHasArrows:!1,verticalSliderSize:typeof f.verticalSliderSize!="undefined"?f.verticalSliderSize:0,scrollByPage:typeof f.scrollByPage!="undefined"?f.scrollByPage:!1};return v.horizontalSliderSize=typeof f.horizontalSliderSize!="undefined"?f.horizontalSliderSize:v.horizontalScrollbarSize,v.verticalSliderSize=typeof f.verticalSliderSize!="undefined"?f.verticalSliderSize:v.verticalScrollbarSize,c.isMacintosh&&(v.className+=" mac"),v}}),define(Q[209],J([0,1,7,2,61,303]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.renderHoverAction=e.HoverWidget=void 0;const w=b.$;class S extends N.Disposable{constructor(){super();this.containerDomNode=document.createElement("div"),this.containerDomNode.className="monaco-hover",this.containerDomNode.tabIndex=0,this.containerDomNode.setAttribute("role","tooltip"),this.contentsDomNode=document.createElement("div"),this.contentsDomNode.className="monaco-hover-content",this._scrollbar=this._register(new M.DomScrollableElement(this.contentsDomNode,{consumeMouseWheelIfScrollbarIsNeeded:!0})),this.containerDomNode.appendChild(this._scrollbar.getDomNode())}onContentsChanged(){this._scrollbar.scanDomNode()}}e.HoverWidget=S;function C(d,g,p){const c=b.append(d,w("div.action-container")),o=b.append(c,w("a.action"));o.setAttribute("href","#"),o.setAttribute("role","button"),g.iconClass&&b.append(o,w(`span.icon.${g.iconClass}`));const s=b.append(o,w("span"));return s.textContent=p?`${g.label} (${p})`:g.label,b.addDisposableListener(c,b.EventType.CLICK,a=>{a.stopPropagation(),a.preventDefault(),g.run(c)})}e.renderHoverAction=C}),define(Q[161],J([0,1,40,2,60,6,55,61,121,281,287,99,120,19,149,15,35,7]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ListView=e.NativeDragAndDropData=e.ExternalElementsDragAndDropData=e.ElementsDragAndDropData=void 0;const n={useShadows:!0,verticalScrollMode:1,setRowLineHeight:!0,setRowHeight:!0,supportDynamicHeights:!1,dnd:{getDragElements(v){return[v]},getDragURI(){return null},onDragStart(){},onDragOver(){return!1},drop(){}},horizontalScrolling:!1,transformOptimization:!0,alwaysConsumeMouseWheel:!0};class t{constructor(y){this.elements=y}update(){}getData(){return this.elements}}e.ElementsDragAndDropData=t;class l{constructor(y){this.elements=y}update(){}getData(){return this.elements}}e.ExternalElementsDragAndDropData=l;class h{constructor(){this.types=[],this.files=[]}update(y){if(y.types&&this.types.splice(0,this.types.length,...y.types),y.files){this.files.splice(0,this.files.length);for(let L=0;Lk,(y==null?void 0:y.getPosInSet)?this.getPosInSet=y.getPosInSet.bind(y):this.getPosInSet=(L,I)=>I+1,(y==null?void 0:y.getRole)?this.getRole=y.getRole.bind(y):this.getRole=L=>"listitem",(y==null?void 0:y.isChecked)?this.isChecked=y.isChecked.bind(y):this.isChecked=L=>{}}}class f{constructor(y,L,I,k=n){if(this.virtualDelegate=L,this.domId=`list_id_${++f.InstanceCount}`,this.renderers=new Map,this.renderWidth=0,this._scrollHeight=0,this.scrollableElementUpdateDisposable=null,this.scrollableElementWidthDelayer=new u.Delayer(50),this.splicing=!1,this.dragOverAnimationStopDisposable=N.Disposable.None,this.dragOverMouseY=0,this.canDrop=!1,this.currentDragFeedbackDisposable=N.Disposable.None,this.onDragLeaveTimeout=N.Disposable.None,this.disposables=new N.DisposableStore,this._onDidChangeContentHeight=new w.Emitter,this._horizontalScrolling=!1,k.horizontalScrolling&&k.supportDynamicHeights)throw new Error("Horizontal scrolling and dynamic heights not supported simultaneously");this.items=[],this.itemId=0,this.rangeMap=new g.RangeMap;for(const T of I)this.renderers.set(T.templateId,T);this.cache=this.disposables.add(new p.RowCache(this.renderers)),this.lastRenderTop=0,this.lastRenderHeight=0,this.domNode=document.createElement("div"),this.domNode.className="monaco-list",this.domNode.classList.add(this.domId),this.domNode.tabIndex=0,this.domNode.classList.toggle("mouse-support",typeof k.mouseSupport=="boolean"?k.mouseSupport:!0),this._horizontalScrolling=b.getOrDefault(k,T=>T.horizontalScrolling,n.horizontalScrolling),this.domNode.classList.toggle("horizontal-scrolling",this._horizontalScrolling),this.additionalScrollHeight=typeof k.additionalScrollHeight=="undefined"?0:k.additionalScrollHeight,this.accessibilityProvider=new _(k.accessibilityProvider),this.rowsContainer=document.createElement("div"),this.rowsContainer.className="monaco-list-rows",b.getOrDefault(k,T=>T.transformOptimization,n.transformOptimization)&&(this.rowsContainer.style.transform="translate3d(0px, 0px, 0px)"),this.disposables.add(M.Gesture.addTarget(this.rowsContainer)),this.scrollable=new d.Scrollable(b.getOrDefault(k,T=>T.smoothScrolling,!1)?125:0,T=>i.scheduleAtNextAnimationFrame(T)),this.scrollableElement=this.disposables.add(new C.SmoothScrollableElement(this.rowsContainer,{alwaysConsumeMouseWheel:b.getOrDefault(k,T=>T.alwaysConsumeMouseWheel,n.alwaysConsumeMouseWheel),horizontal:1,vertical:b.getOrDefault(k,T=>T.verticalScrollMode,n.verticalScrollMode),useShadows:b.getOrDefault(k,T=>T.useShadows,n.useShadows)},this.scrollable)),this.domNode.appendChild(this.scrollableElement.getDomNode()),y.appendChild(this.domNode),this.scrollableElement.onScroll(this.onScroll,this,this.disposables),S.domEvent(this.rowsContainer,M.EventType.Change)(this.onTouchChange,this,this.disposables),S.domEvent(this.scrollableElement.getDomNode(),"scroll")(T=>T.target.scrollTop=0,null,this.disposables),w.Event.map(S.domEvent(this.domNode,"dragover"),T=>this.toDragEvent(T))(this.onDragOver,this,this.disposables),w.Event.map(S.domEvent(this.domNode,"drop"),T=>this.toDragEvent(T))(this.onDrop,this,this.disposables),S.domEvent(this.domNode,"dragleave")(this.onDragLeave,this,this.disposables),S.domEvent(window,"dragend")(this.onDragEnd,this,this.disposables),this.setRowLineHeight=b.getOrDefault(k,T=>T.setRowLineHeight,n.setRowLineHeight),this.setRowHeight=b.getOrDefault(k,T=>T.setRowHeight,n.setRowHeight),this.supportDynamicHeights=b.getOrDefault(k,T=>T.supportDynamicHeights,n.supportDynamicHeights),this.dnd=b.getOrDefault(k,T=>T.dnd,n.dnd),this.layout()}get contentHeight(){return this.rangeMap.size}get horizontalScrolling(){return this._horizontalScrolling}set horizontalScrolling(y){if(y!==this._horizontalScrolling){if(y&&this.supportDynamicHeights)throw new Error("Horizontal scrolling and dynamic heights not supported simultaneously");if(this._horizontalScrolling=y,this.domNode.classList.toggle("horizontal-scrolling",this._horizontalScrolling),this._horizontalScrolling){for(const L of this.items)this.measureItemWidth(L);this.updateScrollWidth(),this.scrollableElement.setScrollDimensions({width:i.getContentWidth(this.domNode)}),this.rowsContainer.style.width=`${Math.max(this.scrollWidth||0,this.renderWidth)}px`}else this.scrollableElementWidthDelayer.cancel(),this.scrollableElement.setScrollDimensions({width:this.renderWidth,scrollWidth:this.renderWidth}),this.rowsContainer.style.width=""}}updateOptions(y){y.additionalScrollHeight!==void 0&&(this.additionalScrollHeight=y.additionalScrollHeight),y.smoothScrolling!==void 0&&this.scrollable.setSmoothScrollDuration(y.smoothScrolling?125:0),y.horizontalScrolling!==void 0&&(this.horizontalScrolling=y.horizontalScrolling)}splice(y,L,I=[]){if(this.splicing)throw new Error("Can't run recursive splices.");this.splicing=!0;try{return this._splice(y,L,I)}finally{this.splicing=!1,this._onDidChangeContentHeight.fire(this.contentHeight)}}_splice(y,L,I=[]){const k=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),E={start:y,end:y+L},T=o.Range.intersect(k,E),O=new Map;for(let z=T.start;z({id:String(this.itemId++),element:z,templateId:this.virtualDelegate.getTemplateId(z),size:this.virtualDelegate.getHeight(z),width:void 0,hasDynamicHeight:!!this.virtualDelegate.hasDynamicHeight&&this.virtualDelegate.hasDynamicHeight(z),lastDynamicHeightWidth:void 0,row:null,uri:void 0,dropTarget:!1,dragStartDisposable:N.Disposable.None}));let R;y===0&&L>=this.items.length?(this.rangeMap=new g.RangeMap,this.rangeMap.splice(0,0,D),R=this.items,this.items=D):(this.rangeMap.splice(y,L,D),R=this.items.splice(y,L,...D));const W=I.length-L,x=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),K=g.shift(B,W),Y=o.Range.intersect(x,K);for(let z=Y.start;zg.shift(z,W)),le=[{start:y,end:y+I.length},...se].map(z=>o.Range.intersect(x,z)),X=this.getNextToLastElement(le);for(const z of le)for(let P=z.start;Pz.element)}eventuallyUpdateScrollDimensions(){this._scrollHeight=this.contentHeight,this.rowsContainer.style.height=`${this._scrollHeight}px`,this.scrollableElementUpdateDisposable||(this.scrollableElementUpdateDisposable=i.scheduleAtNextAnimationFrame(()=>{this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight}),this.updateScrollWidth(),this.scrollableElementUpdateDisposable=null}))}eventuallyUpdateScrollWidth(){if(!this.horizontalScrolling){this.scrollableElementWidthDelayer.cancel();return}this.scrollableElementWidthDelayer.trigger(()=>this.updateScrollWidth())}updateScrollWidth(){if(!!this.horizontalScrolling){let y=0;for(const L of this.items)typeof L.width!="undefined"&&(y=Math.max(y,L.width));this.scrollWidth=y,this.scrollableElement.setScrollDimensions({scrollWidth:y===0?0:y+10})}}rerender(){if(!!this.supportDynamicHeights){for(const y of this.items)y.lastDynamicHeightWidth=void 0;this._rerender(this.lastRenderTop,this.lastRenderHeight)}}get length(){return this.items.length}get renderHeight(){return this.scrollableElement.getScrollDimensions().height}element(y){return this.items[y].element}domElement(y){const L=this.items[y].row;return L&&L.domNode}elementHeight(y){return this.items[y].size}elementTop(y){return this.rangeMap.positionAt(y)}indexAt(y){return this.rangeMap.indexAt(y)}indexAfter(y){return this.rangeMap.indexAfter(y)}layout(y,L){let I={height:typeof y=="number"?y:i.getContentHeight(this.domNode)};this.scrollableElementUpdateDisposable&&(this.scrollableElementUpdateDisposable.dispose(),this.scrollableElementUpdateDisposable=null,I.scrollHeight=this.scrollHeight),this.scrollableElement.setScrollDimensions(I),typeof L!="undefined"&&(this.renderWidth=L,this.supportDynamicHeights&&this._rerender(this.scrollTop,this.renderHeight),this.horizontalScrolling&&this.scrollableElement.setScrollDimensions({width:typeof L=="number"?L:i.getContentWidth(this.domNode)}))}render(y,L,I,k,E,T=!1){const O=this.getRenderRange(L,I),A=o.Range.relativeComplement(O,y),B=o.Range.relativeComplement(y,O),F=this.getNextToLastElement(A);if(T){const D=o.Range.intersect(y,O);for(let R=D.start;Rthis.onDragStart(k.element,A,F))}this.horizontalScrolling&&(this.measureItemWidth(k),this.eventuallyUpdateScrollWidth())}measureItemWidth(y){if(!(!y.row||!y.row.domNode)){y.row.domNode.style.width=r.isFirefox?"-moz-fit-content":"fit-content",y.width=i.getContentWidth(y.row.domNode);const L=window.getComputedStyle(y.row.domNode);L.paddingLeft&&(y.width+=parseFloat(L.paddingLeft)),L.paddingRight&&(y.width+=parseFloat(L.paddingRight)),y.row.domNode.style.width=""}}updateItemInDOM(y,L){y.row.domNode.style.top=`${this.elementTop(L)}px`,this.setRowHeight&&(y.row.domNode.style.height=`${y.size}px`),this.setRowLineHeight&&(y.row.domNode.style.lineHeight=`${y.size}px`),y.row.domNode.setAttribute("data-index",`${L}`),y.row.domNode.setAttribute("data-last-element",L===this.length-1?"true":"false"),y.row.domNode.setAttribute("aria-setsize",String(this.accessibilityProvider.getSetSize(y.element,L,this.length))),y.row.domNode.setAttribute("aria-posinset",String(this.accessibilityProvider.getPosInSet(y.element,L))),y.row.domNode.setAttribute("id",this.getElementDomId(L)),y.row.domNode.classList.toggle("drop-target",y.dropTarget)}removeItemFromDOM(y){const L=this.items[y];if(L.dragStartDisposable.dispose(),L.row){const I=this.renderers.get(L.templateId);I&&I.disposeElement&&I.disposeElement(L.element,y,L.row.templateData,L.size),this.cache.release(L.row),L.row=null}this.horizontalScrolling&&this.eventuallyUpdateScrollWidth()}getScrollTop(){return this.scrollableElement.getScrollPosition().scrollTop}setScrollTop(y,L){this.scrollableElementUpdateDisposable&&(this.scrollableElementUpdateDisposable.dispose(),this.scrollableElementUpdateDisposable=null,this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight})),this.scrollableElement.setScrollPosition({scrollTop:y,reuseAnimation:L})}get scrollTop(){return this.getScrollTop()}set scrollTop(y){this.setScrollTop(y)}get scrollHeight(){return this._scrollHeight+(this.horizontalScrolling?10:0)+this.additionalScrollHeight}get onMouseClick(){return w.Event.map(S.domEvent(this.domNode,"click"),y=>this.toMouseEvent(y))}get onMouseDblClick(){return w.Event.map(S.domEvent(this.domNode,"dblclick"),y=>this.toMouseEvent(y))}get onMouseMiddleClick(){return w.Event.filter(w.Event.map(S.domEvent(this.domNode,"auxclick"),y=>this.toMouseEvent(y)),y=>y.browserEvent.button===1)}get onMouseDown(){return w.Event.map(S.domEvent(this.domNode,"mousedown"),y=>this.toMouseEvent(y))}get onContextMenu(){return w.Event.map(S.domEvent(this.domNode,"contextmenu"),y=>this.toMouseEvent(y))}get onTouchStart(){return w.Event.map(S.domEvent(this.domNode,"touchstart"),y=>this.toTouchEvent(y))}get onTap(){return w.Event.map(S.domEvent(this.rowsContainer,M.EventType.Tap),y=>this.toGestureEvent(y))}toMouseEvent(y){const L=this.getItemIndexFromEventTarget(y.target||null),I=typeof L=="undefined"?void 0:this.items[L],k=I&&I.element;return{browserEvent:y,index:L,element:k}}toTouchEvent(y){const L=this.getItemIndexFromEventTarget(y.target||null),I=typeof L=="undefined"?void 0:this.items[L],k=I&&I.element;return{browserEvent:y,index:L,element:k}}toGestureEvent(y){const L=this.getItemIndexFromEventTarget(y.initialTarget||null),I=typeof L=="undefined"?void 0:this.items[L],k=I&&I.element;return{browserEvent:y,index:L,element:k}}toDragEvent(y){const L=this.getItemIndexFromEventTarget(y.target||null),I=typeof L=="undefined"?void 0:this.items[L],k=I&&I.element;return{browserEvent:y,index:L,element:k}}onScroll(y){try{const L=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight);this.render(L,y.scrollTop,y.height,y.scrollLeft,y.scrollWidth),this.supportDynamicHeights&&this._rerender(y.scrollTop,y.height,y.inSmoothScrolling)}catch(L){throw console.error("Got bad scroll event:",y),L}}onTouchChange(y){y.preventDefault(),y.stopPropagation(),this.scrollTop-=y.translationY}onDragStart(y,L,I){if(!!I.dataTransfer){const k=this.dnd.getDragElements(y);if(I.dataTransfer.effectAllowed="copyMove",I.dataTransfer.setData(a.DataTransfers.RESOURCES,JSON.stringify([L])),I.dataTransfer.setDragImage){let E;this.dnd.getDragLabel&&(E=this.dnd.getDragLabel(k,I)),typeof E=="undefined"&&(E=String(k.length));const T=i.$(".monaco-drag-image");T.textContent=E,document.body.appendChild(T),I.dataTransfer.setDragImage(T,-10,-10),setTimeout(()=>document.body.removeChild(T),0)}this.currentDragData=new t(k),a.StaticDND.CurrentDragAndDropData=new l(k),this.dnd.onDragStart&&this.dnd.onDragStart(this.currentDragData,I)}}onDragOver(y){if(y.browserEvent.preventDefault(),this.onDragLeaveTimeout.dispose(),a.StaticDND.CurrentDragAndDropData&&a.StaticDND.CurrentDragAndDropData.getData()==="vscode-ui"||(this.setupDragAndDropScrollTopAnimation(y.browserEvent),!y.browserEvent.dataTransfer))return!1;if(!this.currentDragData)if(a.StaticDND.CurrentDragAndDropData)this.currentDragData=a.StaticDND.CurrentDragAndDropData;else{if(!y.browserEvent.dataTransfer.types)return!1;this.currentDragData=new h}const L=this.dnd.onDragOver(this.currentDragData,y.element,y.index,y.browserEvent);if(this.canDrop=typeof L=="boolean"?L:L.accept,!this.canDrop)return this.currentDragFeedback=void 0,this.currentDragFeedbackDisposable.dispose(),!1;y.browserEvent.dataTransfer.dropEffect=typeof L!="boolean"&&L.effect===0?"copy":"move";let I;if(typeof L!="boolean"&&L.feedback?I=L.feedback:typeof y.index=="undefined"?I=[-1]:I=[y.index],I=s.distinct(I).filter(k=>k>=-1&&kk-E),I=I[0]===-1?[-1]:I,m(this.currentDragFeedback,I))return!0;if(this.currentDragFeedback=I,this.currentDragFeedbackDisposable.dispose(),I[0]===-1)this.domNode.classList.add("drop-target"),this.rowsContainer.classList.add("drop-target"),this.currentDragFeedbackDisposable=N.toDisposable(()=>{this.domNode.classList.remove("drop-target"),this.rowsContainer.classList.remove("drop-target")});else{for(const k of I){const E=this.items[k];E.dropTarget=!0,E.row&&E.row.domNode.classList.add("drop-target")}this.currentDragFeedbackDisposable=N.toDisposable(()=>{for(const k of I){const E=this.items[k];E.dropTarget=!1,E.row&&E.row.domNode.classList.remove("drop-target")}})}return!0}onDragLeave(){this.onDragLeaveTimeout.dispose(),this.onDragLeaveTimeout=u.disposableTimeout(()=>this.clearDragOverFeedback(),100)}onDrop(y){if(!!this.canDrop){const L=this.currentDragData;this.teardownDragAndDropScrollTopAnimation(),this.clearDragOverFeedback(),this.currentDragData=void 0,a.StaticDND.CurrentDragAndDropData=void 0,!(!L||!y.browserEvent.dataTransfer)&&(y.browserEvent.preventDefault(),L.update(y.browserEvent.dataTransfer),this.dnd.drop(L,y.element,y.index,y.browserEvent))}}onDragEnd(y){this.canDrop=!1,this.teardownDragAndDropScrollTopAnimation(),this.clearDragOverFeedback(),this.currentDragData=void 0,a.StaticDND.CurrentDragAndDropData=void 0,this.dnd.onDragEnd&&this.dnd.onDragEnd(y)}clearDragOverFeedback(){this.currentDragFeedback=void 0,this.currentDragFeedbackDisposable.dispose(),this.currentDragFeedbackDisposable=N.Disposable.None}setupDragAndDropScrollTopAnimation(y){if(!this.dragOverAnimationDisposable){const L=i.getTopLeftOffset(this.domNode).top;this.dragOverAnimationDisposable=i.animate(this.animateDragAndDropScrollTop.bind(this,L))}this.dragOverAnimationStopDisposable.dispose(),this.dragOverAnimationStopDisposable=u.disposableTimeout(()=>{this.dragOverAnimationDisposable&&(this.dragOverAnimationDisposable.dispose(),this.dragOverAnimationDisposable=void 0)},1e3),this.dragOverMouseY=y.pageY}animateDragAndDropScrollTop(y){if(this.dragOverMouseY!==void 0){const L=this.dragOverMouseY-y,I=this.renderHeight-35;L<35?this.scrollTop+=Math.max(-14,Math.floor(.3*(L-35))):L>I&&(this.scrollTop+=Math.min(14,Math.floor(.3*(L-I))))}}teardownDragAndDropScrollTopAnimation(){this.dragOverAnimationStopDisposable.dispose(),this.dragOverAnimationDisposable&&(this.dragOverAnimationDisposable.dispose(),this.dragOverAnimationDisposable=void 0)}getItemIndexFromEventTarget(y){const L=this.scrollableElement.getDomNode();let I=y;for(;I instanceof HTMLElement&&I!==this.rowsContainer&&L.contains(I);){const k=I.getAttribute("data-index");if(k){const E=Number(k);if(!isNaN(E))return E}I=I.parentElement}}getRenderRange(y,L){return{start:this.rangeMap.indexAt(y),end:this.rangeMap.indexAfter(y+L-1)}}_rerender(y,L,I){const k=this.getRenderRange(y,L);let E,T;y===this.elementTop(k.start)?(E=k.start,T=0):k.end-k.start>1&&(E=k.start+1,T=this.elementTop(E)-y);let O=0;for(;;){const A=this.getRenderRange(y,L);let B=!1;for(let F=A.start;FH.templateData===V);if(U>=0){const H=this.renderedElements[U];this.trait.unrender(V),H.index=P}else{const H={index:P,templateData:V};this.renderedElements.push(H)}this.trait.renderIndex(P,V)}splice(z,P,V){const U=[];for(const H of this.renderedElements)H.index=z+P&&U.push({index:H.index+V-P,templateData:H.templateData});this.renderedElements=U}renderIndexes(z){for(const{index:P,templateData:V}of this.renderedElements)z.indexOf(P)>-1&&this.trait.renderIndex(P,V)}disposeTemplate(z){const P=this.renderedElements.findIndex(V=>V.templateData===z);P<0||this.renderedElements.splice(P,1)}}class h{constructor(z){this._trait=z,this.indexes=[],this.sortedIndexes=[],this._onChange=new g.Emitter,this.onChange=this._onChange.event}get trait(){return this._trait}get renderer(){return new l(this)}splice(z,P,V){const U=V.length-P,H=z+P,$=[...this.sortedIndexes.filter(ie=>ieie?oe+z:-1).filter(ie=>ie!==-1),...this.sortedIndexes.filter(ie=>ie>=H).map(ie=>ie+U)];this.renderer.splice(z,P,V.length),this._set($,$)}renderIndex(z,P){P.classList.toggle(this._trait,this.contains(z))}unrender(z){z.classList.remove(this._trait)}set(z,P){return this._set(z,[...z].sort(Y),P)}_set(z,P,V){const U=this.indexes,H=this.sortedIndexes;this.indexes=z,this.sortedIndexes=P;const $=x(H,z);return this.renderer.renderIndexes($),this._onChange.fire({indexes:z,browserEvent:V}),U}get(){return this.indexes}contains(z){return M.binarySearch(this.sortedIndexes,z,Y)>=0}dispose(){b.dispose(this._onChange)}}Me([w.memoize],h.prototype,"renderer",null);class m extends h{constructor(z){super("selected");this.setAriaSelected=z}renderIndex(z,P){super.renderIndex(z,P),this.setAriaSelected&&(this.contains(z)?P.setAttribute("aria-selected","true"):P.setAttribute("aria-selected","false"))}}class _{constructor(z,P,V){this.trait=z,this.view=P,this.identityProvider=V}splice(z,P,V){if(!this.identityProvider)return this.trait.splice(z,P,V.map(()=>!1));const U=this.trait.get().map($=>this.identityProvider.getId(this.view.element($)).toString()),H=V.map($=>U.indexOf(this.identityProvider.getId($).toString())>-1);this.trait.splice(z,P,H)}}function f(X){return X.tagName==="INPUT"||X.tagName==="TEXTAREA"}e.isInputElement=f;function v(X){return X.classList.contains("monaco-editor")?!0:X.classList.contains("monaco-list")||!X.parentElement?!1:v(X.parentElement)}e.isMonacoEditor=v;class y{constructor(z,P,V){this.list=z,this.view=P,this.disposables=new b.DisposableStore;const U=V.multipleSelectionSupport!==!1,H=g.Event.chain(p.domEvent(P.domNode,"keydown")).filter($=>!f($.target)).map($=>new d.StandardKeyboardEvent($));H.filter($=>$.keyCode===3).on(this.onEnter,this,this.disposables),H.filter($=>$.keyCode===16).on(this.onUpArrow,this,this.disposables),H.filter($=>$.keyCode===18).on(this.onDownArrow,this,this.disposables),H.filter($=>$.keyCode===11).on(this.onPageUpArrow,this,this.disposables),H.filter($=>$.keyCode===12).on(this.onPageDownArrow,this,this.disposables),H.filter($=>$.keyCode===9).on(this.onEscape,this,this.disposables),U&&H.filter($=>(S.isMacintosh?$.metaKey:$.ctrlKey)&&$.keyCode===31).on(this.onCtrlA,this,this.disposables)}onEnter(z){z.preventDefault(),z.stopPropagation(),this.list.setSelection(this.list.getFocus(),z.browserEvent)}onUpArrow(z){z.preventDefault(),z.stopPropagation(),this.list.focusPrevious(1,!1,z.browserEvent),this.list.reveal(this.list.getFocus()[0]),this.view.domNode.focus()}onDownArrow(z){z.preventDefault(),z.stopPropagation(),this.list.focusNext(1,!1,z.browserEvent),this.list.reveal(this.list.getFocus()[0]),this.view.domNode.focus()}onPageUpArrow(z){z.preventDefault(),z.stopPropagation(),this.list.focusPreviousPage(z.browserEvent),this.list.reveal(this.list.getFocus()[0]),this.view.domNode.focus()}onPageDownArrow(z){z.preventDefault(),z.stopPropagation(),this.list.focusNextPage(z.browserEvent),this.list.reveal(this.list.getFocus()[0]),this.view.domNode.focus()}onCtrlA(z){z.preventDefault(),z.stopPropagation(),this.list.setSelection(M.range(this.list.length),z.browserEvent),this.view.domNode.focus()}onEscape(z){this.list.getSelection().length&&(z.preventDefault(),z.stopPropagation(),this.list.setSelection([],z.browserEvent),this.view.domNode.focus())}dispose(){this.disposables.dispose()}}var L;(function(X){X[X.Idle=0]="Idle",X[X.Typing=1]="Typing"})(L||(L={})),e.DefaultKeyboardNavigationDelegate=new class{mightProducePrintableCharacter(X){return X.ctrlKey||X.metaKey||X.altKey?!1:X.keyCode>=31&&X.keyCode<=56||X.keyCode>=21&&X.keyCode<=30||X.keyCode>=93&&X.keyCode<=102||X.keyCode>=80&&X.keyCode<=90}};class I{constructor(z,P,V,U){this.list=z,this.view=P,this.keyboardNavigationLabelProvider=V,this.delegate=U,this.enabled=!1,this.state=L.Idle,this.automaticKeyboardNavigation=!0,this.triggered=!1,this.previouslyFocused=-1,this.enabledDisposables=new b.DisposableStore,this.disposables=new b.DisposableStore,this.updateOptions(z.options)}updateOptions(z){(typeof z.enableKeyboardNavigation=="undefined"?!0:!!z.enableKeyboardNavigation)?this.enable():this.disable(),typeof z.automaticKeyboardNavigation!="undefined"&&(this.automaticKeyboardNavigation=z.automaticKeyboardNavigation)}enable(){if(!this.enabled){const z=g.Event.chain(p.domEvent(this.view.domNode,"keydown")).filter(U=>!f(U.target)).filter(()=>this.automaticKeyboardNavigation||this.triggered).map(U=>new d.StandardKeyboardEvent(U)).filter(U=>this.delegate.mightProducePrintableCharacter(U)).forEach(U=>{U.stopPropagation(),U.preventDefault()}).map(U=>U.browserEvent.key).event,P=g.Event.debounce(z,()=>null,800);g.Event.reduce(g.Event.any(z,P),(U,H)=>H===null?null:(U||"")+H)(this.onInput,this,this.enabledDisposables),P(this.onClear,this,this.enabledDisposables),this.enabled=!0,this.triggered=!1}}disable(){!this.enabled||(this.enabledDisposables.clear(),this.enabled=!1,this.triggered=!1)}onClear(){var z;const P=this.list.getFocus();if(P.length>0&&P[0]===this.previouslyFocused){const V=(z=this.list.options.accessibilityProvider)===null||z===void 0?void 0:z.getAriaLabel(this.list.element(P[0]));V&&n.alert(V)}this.previouslyFocused=-1}onInput(z){if(!z){this.state=L.Idle,this.triggered=!1;return}const P=this.list.getFocus(),V=P.length>0?P[0]:0,U=this.state===L.Idle?1:0;this.state=L.Typing;for(let H=0;H!f(U.target)).map(U=>new d.StandardKeyboardEvent(U)).filter(U=>U.keyCode===2&&!U.ctrlKey&&!U.metaKey&&!U.shiftKey&&!U.altKey).on(this.onTab,this,this.disposables)}onTab(z){if(z.target===this.view.domNode){const P=this.list.getFocus();if(P.length!==0){const V=this.view.domElement(P[0]);if(!!V){const U=V.querySelector("[tabIndex]");if(!(!U||!(U instanceof HTMLElement)||U.tabIndex===-1)){const H=window.getComputedStyle(U);H.visibility==="hidden"||H.display==="none"||(z.preventDefault(),z.stopPropagation(),U.focus())}}}}}dispose(){this.disposables.dispose()}}function E(X){return S.isMacintosh?X.browserEvent.metaKey:X.browserEvent.ctrlKey}e.isSelectionSingleChangeEvent=E;function T(X){return X.browserEvent.shiftKey}e.isSelectionRangeChangeEvent=T;function O(X){return X instanceof MouseEvent&&X.button===2}const A={isSelectionSingleChangeEvent:E,isSelectionRangeChangeEvent:T};class B{constructor(z){this.list=z,this.disposables=new b.DisposableStore,this._onPointer=new g.Emitter,this.onPointer=this._onPointer.event,this.multipleSelectionSupport=z.options.multipleSelectionSupport!==!1,this.multipleSelectionSupport&&(this.multipleSelectionController=z.options.multipleSelectionController||A),this.mouseSupport=typeof z.options.mouseSupport=="undefined"||!!z.options.mouseSupport,this.mouseSupport&&(z.onMouseDown(this.onMouseDown,this,this.disposables),z.onContextMenu(this.onContextMenu,this,this.disposables),z.onMouseDblClick(this.onDoubleClick,this,this.disposables),z.onTouchStart(this.onMouseDown,this,this.disposables),this.disposables.add(C.Gesture.addTarget(z.getHTMLElement()))),g.Event.any(z.onMouseClick,z.onMouseMiddleClick,z.onTap)(this.onViewPointer,this,this.disposables)}isSelectionSingleChangeEvent(z){return this.multipleSelectionController?this.multipleSelectionController.isSelectionSingleChangeEvent(z):S.isMacintosh?z.browserEvent.metaKey:z.browserEvent.ctrlKey}isSelectionRangeChangeEvent(z){return this.multipleSelectionController?this.multipleSelectionController.isSelectionRangeChangeEvent(z):z.browserEvent.shiftKey}isSelectionChangeEvent(z){return this.isSelectionSingleChangeEvent(z)||this.isSelectionRangeChangeEvent(z)}onMouseDown(z){v(z.browserEvent.target)||document.activeElement!==z.browserEvent.target&&this.list.domFocus()}onContextMenu(z){if(!v(z.browserEvent.target)){const P=typeof z.index=="undefined"?[]:[z.index];this.list.setFocus(P,z.browserEvent)}}onViewPointer(z){if(!!this.mouseSupport&&!(f(z.browserEvent.target)||v(z.browserEvent.target))){let P=this.list.getFocus()[0];const V=this.list.getSelection();P=P===void 0?V[0]:P;const U=z.index;if(typeof U=="undefined"){this.list.setFocus([],z.browserEvent),this.list.setSelection([],z.browserEvent);return}if(this.multipleSelectionSupport&&this.isSelectionRangeChangeEvent(z))return this.changeSelection(z,P);if(this.multipleSelectionSupport&&this.isSelectionChangeEvent(z))return this.changeSelection(z,P);this.list.setFocus([U],z.browserEvent),O(z.browserEvent)||this.list.setSelection([U],z.browserEvent),this._onPointer.fire(z)}}onDoubleClick(z){if(!(f(z.browserEvent.target)||v(z.browserEvent.target))&&!(this.multipleSelectionSupport&&this.isSelectionChangeEvent(z))){const P=this.list.getFocus();this.list.setSelection(P,z.browserEvent)}}changeSelection(z,P){const V=z.index;if(this.isSelectionRangeChangeEvent(z)&&P!==void 0){const U=Math.min(P,V),H=Math.max(P,V),$=M.range(U,H+1),ie=this.list.getSelection(),oe=W(x(ie,[P]),P);if(oe.length===0)return;const ae=x($,K(ie,oe));this.list.setSelection(ae,z.browserEvent)}else if(this.isSelectionSingleChangeEvent(z)){const U=this.list.getSelection(),H=U.filter($=>$!==V);this.list.setFocus([V]),U.length===H.length?this.list.setSelection([...H,V],z.browserEvent):this.list.setSelection(H,z.browserEvent)}}dispose(){this.disposables.dispose()}}e.MouseController=B;class F{constructor(z,P){this.styleElement=z,this.selectorSuffix=P}style(z){const P=this.selectorSuffix&&`.${this.selectorSuffix}`,V=[];z.listBackground&&(z.listBackground.isOpaque()?V.push(`.monaco-list${P} .monaco-list-rows { background: ${z.listBackground}; }`):S.isMacintosh||console.warn(`List with id '${this.selectorSuffix}' was styled with a non-opaque background color. This will break sub-pixel antialiasing.`)),z.listFocusBackground&&(V.push(`.monaco-list${P}:focus .monaco-list-row.focused { background-color: ${z.listFocusBackground}; }`),V.push(`.monaco-list${P}:focus .monaco-list-row.focused:hover { background-color: ${z.listFocusBackground}; }`)),z.listFocusForeground&&V.push(`.monaco-list${P}:focus .monaco-list-row.focused { color: ${z.listFocusForeground}; }`),z.listActiveSelectionBackground&&(V.push(`.monaco-list${P}:focus .monaco-list-row.selected { background-color: ${z.listActiveSelectionBackground}; }`),V.push(`.monaco-list${P}:focus .monaco-list-row.selected:hover { background-color: ${z.listActiveSelectionBackground}; }`)),z.listActiveSelectionForeground&&V.push(`.monaco-list${P}:focus .monaco-list-row.selected { color: ${z.listActiveSelectionForeground}; }`),z.listFocusAndSelectionBackground&&V.push(` + .monaco-drag-image, + .monaco-list${P}:focus .monaco-list-row.selected.focused { background-color: ${z.listFocusAndSelectionBackground}; } + `),z.listFocusAndSelectionForeground&&V.push(` + .monaco-drag-image, + .monaco-list${P}:focus .monaco-list-row.selected.focused { color: ${z.listFocusAndSelectionForeground}; } + `),z.listInactiveFocusForeground&&(V.push(`.monaco-list${P} .monaco-list-row.focused { color: ${z.listInactiveFocusForeground}; }`),V.push(`.monaco-list${P} .monaco-list-row.focused:hover { color: ${z.listInactiveFocusForeground}; }`)),z.listInactiveFocusBackground&&(V.push(`.monaco-list${P} .monaco-list-row.focused { background-color: ${z.listInactiveFocusBackground}; }`),V.push(`.monaco-list${P} .monaco-list-row.focused:hover { background-color: ${z.listInactiveFocusBackground}; }`)),z.listInactiveSelectionBackground&&(V.push(`.monaco-list${P} .monaco-list-row.selected { background-color: ${z.listInactiveSelectionBackground}; }`),V.push(`.monaco-list${P} .monaco-list-row.selected:hover { background-color: ${z.listInactiveSelectionBackground}; }`)),z.listInactiveSelectionForeground&&V.push(`.monaco-list${P} .monaco-list-row.selected { color: ${z.listInactiveSelectionForeground}; }`),z.listHoverBackground&&V.push(`.monaco-list${P}:not(.drop-target) .monaco-list-row:hover:not(.selected):not(.focused) { background-color: ${z.listHoverBackground}; }`),z.listHoverForeground&&V.push(`.monaco-list${P} .monaco-list-row:hover:not(.selected):not(.focused) { color: ${z.listHoverForeground}; }`),z.listSelectionOutline&&V.push(`.monaco-list${P} .monaco-list-row.selected { outline: 1px dotted ${z.listSelectionOutline}; outline-offset: -1px; }`),z.listFocusOutline&&V.push(` + .monaco-drag-image, + .monaco-list${P}:focus .monaco-list-row.focused { outline: 1px solid ${z.listFocusOutline}; outline-offset: -1px; } + `),z.listInactiveFocusOutline&&V.push(`.monaco-list${P} .monaco-list-row.focused { outline: 1px dotted ${z.listInactiveFocusOutline}; outline-offset: -1px; }`),z.listHoverOutline&&V.push(`.monaco-list${P} .monaco-list-row:hover { outline: 1px dashed ${z.listHoverOutline}; outline-offset: -1px; }`),z.listDropBackground&&V.push(` + .monaco-list${P}.drop-target, + .monaco-list${P} .monaco-list-rows.drop-target, + .monaco-list${P} .monaco-list-row.drop-target { background-color: ${z.listDropBackground} !important; color: inherit !important; } + `),z.listFilterWidgetBackground&&V.push(`.monaco-list-type-filter { background-color: ${z.listFilterWidgetBackground} }`),z.listFilterWidgetOutline&&V.push(`.monaco-list-type-filter { border: 1px solid ${z.listFilterWidgetOutline}; }`),z.listFilterWidgetNoMatchesOutline&&V.push(`.monaco-list-type-filter.no-matches { border: 1px solid ${z.listFilterWidgetNoMatchesOutline}; }`),z.listMatchesShadow&&V.push(`.monaco-list-type-filter { box-shadow: 1px 1px 1px ${z.listMatchesShadow}; }`),z.tableColumnsBorder&&V.push(` + .monaco-table:hover > .monaco-split-view2, + .monaco-table:hover > .monaco-split-view2 .monaco-sash.vertical::before { + border-color: ${z.tableColumnsBorder}; + }`),this.styleElement.textContent=V.join(` +`)}}e.DefaultStyleController=F;const D={listFocusBackground:s.Color.fromHex("#7FB0D0"),listActiveSelectionBackground:s.Color.fromHex("#0E639C"),listActiveSelectionForeground:s.Color.fromHex("#FFFFFF"),listFocusAndSelectionBackground:s.Color.fromHex("#094771"),listFocusAndSelectionForeground:s.Color.fromHex("#FFFFFF"),listInactiveSelectionBackground:s.Color.fromHex("#3F3F46"),listHoverBackground:s.Color.fromHex("#2A2D2E"),listDropBackground:s.Color.fromHex("#383B3D"),treeIndentGuidesStroke:s.Color.fromHex("#a9a9a9"),tableColumnsBorder:s.Color.fromHex("#cccccc").transparent(.2)},R={keyboardSupport:!0,mouseSupport:!0,multipleSelectionSupport:!0,dnd:{getDragURI(){return null},onDragStart(){},onDragOver(){return!1},drop(){}}};function W(X,z){const P=X.indexOf(z);if(P===-1)return[];const V=[];let U=P-1;for(;U>=0&&X[U]===z-(P-U);)V.push(X[U--]);for(V.reverse(),U=P;U=X.length)P.push(z[U++]);else if(U>=z.length)P.push(X[V++]);else if(X[V]===z[U]){P.push(X[V]),V++,U++;continue}else X[V]=X.length)P.push(z[U++]);else if(U>=z.length)P.push(X[V++]);else if(X[V]===z[U]){V++,U++;continue}else X[V]X-z;class ee{constructor(z,P){this._templateId=z,this.renderers=P}get templateId(){return this._templateId}renderTemplate(z){return this.renderers.map(P=>P.renderTemplate(z))}renderElement(z,P,V,U){let H=0;for(const $ of this.renderers)$.renderElement(z,P,V[H++],U)}disposeElement(z,P,V,U){let H=0;for(const $ of this.renderers)$.disposeElement&&$.disposeElement(z,P,V[H],U),H+=1}disposeTemplate(z){let P=0;for(const V of this.renderers)V.disposeTemplate(z[P++])}}class se{constructor(z){this.accessibilityProvider=z,this.templateId="a18n"}renderTemplate(z){return z}renderElement(z,P,V){const U=this.accessibilityProvider.getAriaLabel(z);U?V.setAttribute("aria-label",U):V.removeAttribute("aria-label");const H=this.accessibilityProvider.getAriaLevel&&this.accessibilityProvider.getAriaLevel(z);typeof H=="number"?V.setAttribute("aria-level",`${H}`):V.removeAttribute("aria-level")}disposeTemplate(z){}}class ne{constructor(z,P){this.list=z,this.dnd=P}getDragElements(z){const P=this.list.getSelectedElements();return P.indexOf(z)>-1?P:[z]}getDragURI(z){return this.dnd.getDragURI(z)}getDragLabel(z,P){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(z,P)}onDragStart(z,P){this.dnd.onDragStart&&this.dnd.onDragStart(z,P)}onDragOver(z,P,V,U){return this.dnd.onDragOver(z,P,V,U)}onDragEnd(z){this.dnd.onDragEnd&&this.dnd.onDragEnd(z)}drop(z,P,V,U){this.dnd.drop(z,P,V,U)}}class le{constructor(z,P,V,U,H=R){var $;this.user=z,this._options=H,this.eventBufferer=new g.EventBufferer,this._ariaLabel="",this.disposables=new b.DisposableStore,this._onDidDispose=new g.Emitter,this.onDidDispose=this._onDidDispose.event;const ie=this._options.accessibilityProvider&&this._options.accessibilityProvider.getWidgetRole?($=this._options.accessibilityProvider)===null||$===void 0?void 0:$.getWidgetRole():"list";this.selection=new m(ie!=="listbox"),this.focus=new h("focused"),a.mixin(H,D,!1);const oe=[this.focus.renderer,this.selection.renderer];this.accessibilityProvider=H.accessibilityProvider,this.accessibilityProvider&&(oe.push(new se(this.accessibilityProvider)),this.accessibilityProvider.onDidChangeActiveDescendant&&this.accessibilityProvider.onDidChangeActiveDescendant(this.onDidChangeActiveDescendant,this,this.disposables)),U=U.map(G=>new ee(G.templateId,[...oe,G]));const ae=Object.assign(Object.assign({},H),{dnd:H.dnd&&new ne(this,H.dnd)});if(this.view=new o.ListView(P,V,U,ae),this.view.domNode.setAttribute("role",ie),H.styleController)this.styleController=H.styleController(this.view.domId);else{const G=t.createStyleSheet(this.view.domNode);this.styleController=new F(G,this.view.domId)}if(this.spliceable=new u.CombinedSpliceable([new _(this.focus,this.view,H.identityProvider),new _(this.selection,this.view,H.identityProvider),this.view]),this.disposables.add(this.focus),this.disposables.add(this.selection),this.disposables.add(this.view),this.disposables.add(this._onDidDispose),this.onDidFocus=g.Event.map(p.domEvent(this.view.domNode,"focus",!0),()=>null),this.onDidBlur=g.Event.map(p.domEvent(this.view.domNode,"blur",!0),()=>null),this.disposables.add(new k(this,this.view)),typeof H.keyboardSupport!="boolean"||H.keyboardSupport){const G=new y(this,this.view,H);this.disposables.add(G)}if(H.keyboardNavigationLabelProvider){const G=H.keyboardNavigationDelegate||e.DefaultKeyboardNavigationDelegate;this.typeLabelController=new I(this,this.view,H.keyboardNavigationLabelProvider,G),this.disposables.add(this.typeLabelController)}this.mouseController=this.createMouseController(H),this.disposables.add(this.mouseController),this.onDidChangeFocus(this._onFocusChange,this,this.disposables),this.onDidChangeSelection(this._onSelectionChange,this,this.disposables),this.accessibilityProvider&&(this.ariaLabel=this.accessibilityProvider.getWidgetAriaLabel()),H.multipleSelectionSupport&&this.view.domNode.setAttribute("aria-multiselectable","true")}get onDidChangeFocus(){return g.Event.map(this.eventBufferer.wrapEvent(this.focus.onChange),z=>this.toListEvent(z))}get onDidChangeSelection(){return g.Event.map(this.eventBufferer.wrapEvent(this.selection.onChange),z=>this.toListEvent(z))}get domId(){return this.view.domId}get onMouseClick(){return this.view.onMouseClick}get onMouseDblClick(){return this.view.onMouseDblClick}get onMouseMiddleClick(){return this.view.onMouseMiddleClick}get onPointer(){return this.mouseController.onPointer}get onMouseDown(){return this.view.onMouseDown}get onTouchStart(){return this.view.onTouchStart}get onTap(){return this.view.onTap}get onContextMenu(){let z=!1;const P=g.Event.chain(p.domEvent(this.view.domNode,"keydown")).map(H=>new d.StandardKeyboardEvent(H)).filter(H=>z=H.keyCode===58||H.shiftKey&&H.keyCode===68).map(p.stopEvent).filter(()=>!1).event,V=g.Event.chain(p.domEvent(this.view.domNode,"keyup")).forEach(()=>z=!1).map(H=>new d.StandardKeyboardEvent(H)).filter(H=>H.keyCode===58||H.shiftKey&&H.keyCode===68).map(p.stopEvent).map(({browserEvent:H})=>{const $=this.getFocus(),ie=$.length?$[0]:void 0,oe=typeof ie!="undefined"?this.view.element(ie):void 0,ae=typeof ie!="undefined"?this.view.domElement(ie):this.view.domNode;return{index:ie,element:oe,anchor:ae,browserEvent:H}}).event,U=g.Event.chain(this.view.onContextMenu).filter(H=>!z).map(({element:H,index:$,browserEvent:ie})=>({element:H,index:$,anchor:{x:ie.clientX+1,y:ie.clientY},browserEvent:ie})).event;return g.Event.any(P,V,U)}get onKeyDown(){return p.domEvent(this.view.domNode,"keydown")}createMouseController(z){return new B(this)}updateOptions(z={}){this._options=Object.assign(Object.assign({},this._options),z),this.typeLabelController&&this.typeLabelController.updateOptions(this._options),this.view.updateOptions(z)}get options(){return this._options}splice(z,P,V=[]){if(z<0||z>this.view.length)throw new c.ListError(this.user,`Invalid start index: ${z}`);if(P<0)throw new c.ListError(this.user,`Invalid delete count: ${P}`);P===0&&V.length===0||this.eventBufferer.bufferEvents(()=>this.spliceable.splice(z,P,V))}rerender(){this.view.rerender()}element(z){return this.view.element(z)}get length(){return this.view.length}get contentHeight(){return this.view.contentHeight}get scrollTop(){return this.view.getScrollTop()}set scrollTop(z){this.view.setScrollTop(z)}get ariaLabel(){return this._ariaLabel}set ariaLabel(z){this._ariaLabel=z,this.view.domNode.setAttribute("aria-label",z)}domFocus(){this.view.domNode.focus({preventScroll:!0})}layout(z,P){this.view.layout(z,P)}setSelection(z,P){for(const V of z)if(V<0||V>=this.length)throw new c.ListError(this.user,`Invalid index ${V}`);this.selection.set(z,P)}getSelection(){return this.selection.get()}getSelectedElements(){return this.getSelection().map(z=>this.view.element(z))}setFocus(z,P){for(const V of z)if(V<0||V>=this.length)throw new c.ListError(this.user,`Invalid index ${V}`);this.focus.set(z,P)}focusNext(z=1,P=!1,V,U){if(this.length!==0){const H=this.focus.get(),$=this.findNextIndex(H.length>0?H[0]+z:0,P,U);$>-1&&this.setFocus([$],V)}}focusPrevious(z=1,P=!1,V,U){if(this.length!==0){const H=this.focus.get(),$=this.findPreviousIndex(H.length>0?H[0]-z:0,P,U);$>-1&&this.setFocus([$],V)}}focusNextPage(z,P){let V=this.view.indexAt(this.view.getScrollTop()+this.view.renderHeight);V=V===0?0:V-1;const U=this.view.element(V),H=this.getFocusedElements()[0];if(H!==U){const $=this.findPreviousIndex(V,!1,P);$>-1&&H!==this.view.element($)?this.setFocus([$],z):this.setFocus([V],z)}else{const $=this.view.getScrollTop();this.view.setScrollTop($+this.view.renderHeight-this.view.elementHeight(V)),this.view.getScrollTop()!==$&&(this.setFocus([]),setTimeout(()=>this.focusNextPage(z,P),0))}}focusPreviousPage(z,P){let V;const U=this.view.getScrollTop();U===0?V=this.view.indexAt(U):V=this.view.indexAfter(U-1);const H=this.view.element(V),$=this.getFocusedElements()[0];if($!==H){const ie=this.findNextIndex(V,!1,P);ie>-1&&$!==this.view.element(ie)?this.setFocus([ie],z):this.setFocus([V],z)}else{const ie=U;this.view.setScrollTop(U-this.view.renderHeight),this.view.getScrollTop()!==ie&&(this.setFocus([]),setTimeout(()=>this.focusPreviousPage(z,P),0))}}focusLast(z,P){if(this.length!==0){const V=this.findPreviousIndex(this.length-1,!1,P);V>-1&&this.setFocus([V],z)}}focusFirst(z,P){this.focusNth(0,z,P)}focusNth(z,P,V){if(this.length!==0){const U=this.findNextIndex(z,!1,V);U>-1&&this.setFocus([U],P)}}findNextIndex(z,P=!1,V){for(let U=0;U=this.length&&!P)return-1;if(z=z%this.length,!V||V(this.element(z)))return z;z++}return-1}findPreviousIndex(z,P=!1,V){for(let U=0;Uthis.view.element(z))}reveal(z,P){if(z<0||z>=this.length)throw new c.ListError(this.user,`Invalid index ${z}`);const V=this.view.getScrollTop(),U=this.view.elementTop(z),H=this.view.elementHeight(z);if(N.isNumber(P)){const $=H-this.view.renderHeight;this.view.setScrollTop($*r.clamp(P,0,1)+U)}else{const $=U+H,ie=V+this.view.renderHeight;U=ie||(U=ie&&this.view.setScrollTop($-this.view.renderHeight))}}getRelativeTop(z){if(z<0||z>=this.length)throw new c.ListError(this.user,`Invalid index ${z}`);const P=this.view.getScrollTop(),V=this.view.elementTop(z),U=this.view.elementHeight(z);if(VP+this.view.renderHeight)return null;const H=U-this.view.renderHeight;return Math.abs((P-V)/H)}getHTMLElement(){return this.view.domNode}style(z){this.styleController.style(z)}toListEvent({indexes:z,browserEvent:P}){return{indexes:z,elements:z.map(V=>this.view.element(V)),browserEvent:P}}_onFocusChange(){const z=this.focus.get();this.view.domNode.classList.toggle("element-focused",z.length>0),this.onDidChangeActiveDescendant()}onDidChangeActiveDescendant(){var z;const P=this.focus.get();if(P.length>0){let V;((z=this.accessibilityProvider)===null||z===void 0?void 0:z.getActiveDescendantId)&&(V=this.accessibilityProvider.getActiveDescendantId(this.view.element(P[0]))),this.view.domNode.setAttribute("aria-activedescendant",V||this.view.getElementDomId(P[0]))}else this.view.domNode.removeAttribute("aria-activedescendant")}_onSelectionChange(){const z=this.selection.get();this.view.domNode.classList.toggle("selection-none",z.length===0),this.view.domNode.classList.toggle("selection-single",z.length===1),this.view.domNode.classList.toggle("selection-multiple",z.length>1)}dispose(){this._onDidDispose.fire(),this.disposables.dispose(),this._onDidDispose.dispose()}}Me([w.memoize],le.prototype,"onDidChangeFocus",null),Me([w.memoize],le.prototype,"onDidChangeSelection",null),Me([w.memoize],le.prototype,"onContextMenu",null),e.List=le}),define(Q[312],J([0,1,2,19,105,6,23,208]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PagedList=void 0;class C{constructor(o,s){this.renderer=o,this.modelProvider=s}get templateId(){return this.renderer.templateId}renderTemplate(o){return{data:this.renderer.renderTemplate(o),disposable:b.Disposable.None}}renderElement(o,s,a,u){if(a.disposable&&a.disposable.dispose(),!!a.data){const r=this.modelProvider();if(r.isResolved(o))return this.renderer.renderElement(r.get(o),o,a.data,u);const i=new S.CancellationTokenSource,n=r.resolve(o,i.token);a.disposable={dispose:()=>i.cancel()},this.renderer.renderPlaceholder(o,a.data),n.then(t=>this.renderer.renderElement(t,o,a.data,u))}}disposeTemplate(o){o.disposable&&(o.disposable.dispose(),o.disposable=void 0),o.data&&(this.renderer.disposeTemplate(o.data),o.data=void 0)}}class d{constructor(o,s){this.modelProvider=o,this.accessibilityProvider=s}getWidgetAriaLabel(){return this.accessibilityProvider.getWidgetAriaLabel()}getAriaLabel(o){const s=this.modelProvider();return s.isResolved(o)?this.accessibilityProvider.getAriaLabel(s.get(o)):null}}function g(c,o){return Object.assign(Object.assign({},o),{accessibilityProvider:o.accessibilityProvider&&new d(c,o.accessibilityProvider)})}class p{constructor(o,s,a,u,r={}){const i=()=>this.model,n=u.map(t=>new C(t,i));this.list=new M.List(o,s,a,n,g(i,r))}updateOptions(o){this.list.updateOptions(o)}getHTMLElement(){return this.list.getHTMLElement()}get onDidFocus(){return this.list.onDidFocus}get onDidDispose(){return this.list.onDidDispose}get onMouseDblClick(){return w.Event.map(this.list.onMouseDblClick,({element:o,index:s,browserEvent:a})=>({element:o===void 0?void 0:this._model.get(o),index:s,browserEvent:a}))}get onPointer(){return w.Event.map(this.list.onPointer,({element:o,index:s,browserEvent:a})=>({element:o===void 0?void 0:this._model.get(o),index:s,browserEvent:a}))}get onDidChangeFocus(){return w.Event.map(this.list.onDidChangeFocus,({elements:o,indexes:s,browserEvent:a})=>({elements:o.map(u=>this._model.get(u)),indexes:s,browserEvent:a}))}get onDidChangeSelection(){return w.Event.map(this.list.onDidChangeSelection,({elements:o,indexes:s,browserEvent:a})=>({elements:o.map(u=>this._model.get(u)),indexes:s,browserEvent:a}))}get model(){return this._model}set model(o){this._model=o,this.list.splice(0,this.list.length,N.range(o.length))}getFocus(){return this.list.getFocus()}setSelection(o,s){this.list.setSelection(o,s)}getSelection(){return this.list.getSelection()}getSelectedElements(){return this.getSelection().map(o=>this.model.get(o))}style(o){this.list.style(o)}dispose(){this.list.dispose()}}e.PagedList=p}),define(Q[313],J([10]),{}),define(Q[210],J([0,1,2,6,20,100,19,104,29,55,7,61,121,313]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SplitView=e.Sizing=void 0;const s={separatorBorder:d.Color.transparent};class a{constructor(h,m,_,f){this.container=h,this.view=m,this.disposable=f,this._cachedVisibleSize=void 0,typeof _=="number"?(this._size=_,this._cachedVisibleSize=void 0,h.classList.add("visible")):(this._size=0,this._cachedVisibleSize=_.cachedVisibleSize)}set size(h){this._size=h}get size(){return this._size}get visible(){return typeof this._cachedVisibleSize=="undefined"}setVisible(h,m){h!==this.visible&&(h?(this.size=w.clamp(this._cachedVisibleSize,this.viewMinimumSize,this.viewMaximumSize),this._cachedVisibleSize=void 0):(this._cachedVisibleSize=typeof m=="number"?m:this.size,this.size=0),this.container.classList.toggle("visible",h),this.view.setVisible&&this.view.setVisible(h))}get minimumSize(){return this.visible?this.view.minimumSize:0}get viewMinimumSize(){return this.view.minimumSize}get maximumSize(){return this.visible?this.view.maximumSize:0}get viewMaximumSize(){return this.view.maximumSize}get priority(){return this.view.priority}get snap(){return!!this.view.snap}set enabled(h){this.container.style.pointerEvents=h?"":"none"}layout(h,m){this.layoutContainer(h),this.view.layout(this.size,h,m)}dispose(){return this.disposable.dispose(),this.view}}class u extends a{layoutContainer(h){this.container.style.top=`${h}px`,this.container.style.height=`${this.size}px`}}class r extends a{layoutContainer(h){this.container.style.left=`${h}px`,this.container.style.width=`${this.size}px`}}var i;(function(l){l[l.Idle=0]="Idle",l[l.Busy=1]="Busy"})(i||(i={}));var n;(function(l){l.Distribute={type:"distribute"};function h(_){return{type:"split",index:_}}l.Split=h;function m(_){return{type:"invisible",cachedVisibleSize:_}}l.Invisible=m})(n=e.Sizing||(e.Sizing={}));class t extends b.Disposable{constructor(h,m={}){var _,f;super();this.size=0,this.contentSize=0,this.proportions=void 0,this.viewItems=[],this.sashItems=[],this.state=i.Idle,this._onDidSashChange=this._register(new N.Emitter),this.onDidSashChange=this._onDidSashChange.event,this._onDidSashReset=this._register(new N.Emitter),this._startSnappingEnabled=!0,this._endSnappingEnabled=!0,this.orientation=M.isUndefined(m.orientation)?0:m.orientation,this.inverseAltBehavior=!!m.inverseAltBehavior,this.proportionalLayout=M.isUndefined(m.proportionalLayout)?!0:!!m.proportionalLayout,this.getSashOrthogonalSize=m.getSashOrthogonalSize,this.el=document.createElement("div"),this.el.classList.add("monaco-split-view2"),this.el.classList.add(this.orientation===0?"vertical":"horizontal"),h.appendChild(this.el),this.sashContainer=p.append(this.el,p.$(".sash-container")),this.viewContainer=p.$(".split-view-container"),this.scrollable=new o.Scrollable(125,p.scheduleAtNextAnimationFrame),this.scrollableElement=this._register(new c.SmoothScrollableElement(this.viewContainer,{vertical:this.orientation===0?(_=m.scrollbarVisibility)!==null&&_!==void 0?_:1:2,horizontal:this.orientation===1?(f=m.scrollbarVisibility)!==null&&f!==void 0?f:1:2},this.scrollable)),this._register(this.scrollableElement.onScroll(v=>{this.viewContainer.scrollTop=v.scrollTop,this.viewContainer.scrollLeft=v.scrollLeft})),p.append(this.el,this.scrollableElement.getDomNode()),this.style(m.styles||s),m.descriptor&&(this.size=m.descriptor.size,m.descriptor.views.forEach((v,y)=>{const L=M.isUndefined(v.visible)||v.visible?v.size:{type:"invisible",cachedVisibleSize:v.size},I=v.view;this.doAddView(I,L,y,!0)}),this.contentSize=this.viewItems.reduce((v,y)=>v+y.size,0),this.saveProportions())}get orthogonalStartSash(){return this._orthogonalStartSash}set orthogonalStartSash(h){for(const m of this.sashItems)m.sash.orthogonalStartSash=h;this._orthogonalStartSash=h}get orthogonalEndSash(){return this._orthogonalEndSash}set orthogonalEndSash(h){for(const m of this.sashItems)m.sash.orthogonalEndSash=h;this._orthogonalEndSash=h}get startSnappingEnabled(){return this._startSnappingEnabled}set startSnappingEnabled(h){this._startSnappingEnabled!==h&&(this._startSnappingEnabled=h,this.updateSashEnablement())}get endSnappingEnabled(){return this._endSnappingEnabled}set endSnappingEnabled(h){this._endSnappingEnabled!==h&&(this._endSnappingEnabled=h,this.updateSashEnablement())}style(h){h.separatorBorder.isTransparent()?(this.el.classList.remove("separator-border"),this.el.style.removeProperty("--separator-border")):(this.el.classList.add("separator-border"),this.el.style.setProperty("--separator-border",h.separatorBorder.toString()))}addView(h,m,_=this.viewItems.length,f){this.doAddView(h,m,_,f)}layout(h,m){const _=Math.max(this.size,this.contentSize);if(this.size=h,this.layoutContext=m,this.proportions)for(let f=0;fthis.viewItems[L].priority===1),y=f.filter(L=>this.viewItems[L].priority===2);this.resize(this.viewItems.length-1,h-_,void 0,v,y)}this.distributeEmptySpace(),this.layoutViews()}saveProportions(){this.proportionalLayout&&this.contentSize>0&&(this.proportions=this.viewItems.map(h=>h.size/this.contentSize))}onSashStart({sash:h,start:m,alt:_}){for(const L of this.viewItems)L.enabled=!1;const f=this.sashItems.findIndex(L=>L.sash===h),v=b.combinedDisposable(g.domEvent(document.body,"keydown")(L=>y(this.sashDragState.current,L.altKey)),g.domEvent(document.body,"keyup")(()=>y(this.sashDragState.current,!1))),y=(L,I)=>{const k=this.viewItems.map(B=>B.size);let E=Number.NEGATIVE_INFINITY,T=Number.POSITIVE_INFINITY;if(this.inverseAltBehavior&&(I=!I),I)if(f===this.sashItems.length-1){const F=this.viewItems[f];E=(F.minimumSize-F.size)/2,T=(F.maximumSize-F.size)/2}else{const F=this.viewItems[f+1];E=(F.size-F.maximumSize)/2,T=(F.size-F.minimumSize)/2}let O,A;if(!I){const B=S.range(f,-1),F=S.range(f+1,this.viewItems.length),D=B.reduce((ne,le)=>ne+(this.viewItems[le].minimumSize-k[le]),0),R=B.reduce((ne,le)=>ne+(this.viewItems[le].viewMaximumSize-k[le]),0),W=F.length===0?Number.POSITIVE_INFINITY:F.reduce((ne,le)=>ne+(k[le]-this.viewItems[le].minimumSize),0),x=F.length===0?Number.NEGATIVE_INFINITY:F.reduce((ne,le)=>ne+(k[le]-this.viewItems[le].viewMaximumSize),0),K=Math.max(D,x),Y=Math.min(W,R),ee=this.findFirstSnapIndex(B),se=this.findFirstSnapIndex(F);if(typeof ee=="number"){const ne=this.viewItems[ee],le=Math.floor(ne.viewMinimumSize/2);O={index:ee,limitDelta:ne.visible?K-le:K+le,size:ne.size}}if(typeof se=="number"){const ne=this.viewItems[se],le=Math.floor(ne.viewMinimumSize/2);A={index:se,limitDelta:ne.visible?Y+le:Y-le,size:ne.size}}}this.sashDragState={start:L,current:L,index:f,sizes:k,minDelta:E,maxDelta:T,alt:I,snapBefore:O,snapAfter:A,disposable:v}};y(m,_)}onSashChange({current:h}){const{index:m,start:_,sizes:f,alt:v,minDelta:y,maxDelta:L,snapBefore:I,snapAfter:k}=this.sashDragState;this.sashDragState.current=h;const E=h-_,T=this.resize(m,E,f,void 0,void 0,y,L,I,k);if(v){const O=m===this.sashItems.length-1,A=this.viewItems.map(x=>x.size),B=O?m:m+1,F=this.viewItems[B],D=F.size-F.maximumSize,R=F.size-F.minimumSize,W=O?m-1:m+1;this.resize(W,-T,A,void 0,void 0,D,R)}this.distributeEmptySpace(),this.layoutViews()}onSashEnd(h){this._onDidSashChange.fire(h),this.sashDragState.disposable.dispose(),this.saveProportions();for(const m of this.viewItems)m.enabled=!0}onViewChange(h,m){const _=this.viewItems.indexOf(h);_<0||_>=this.viewItems.length||(m=typeof m=="number"?m:h.size,m=w.clamp(m,h.minimumSize,h.maximumSize),this.inverseAltBehavior&&_>0?(this.resize(_-1,Math.floor((h.size-m)/2)),this.distributeEmptySpace(),this.layoutViews()):(h.size=m,this.relayout([_],void 0)))}resizeView(h,m){if(this.state!==i.Idle)throw new Error("Cant modify splitview");if(this.state=i.Busy,!(h<0||h>=this.viewItems.length)){const _=S.range(this.viewItems.length).filter(L=>L!==h),f=[..._.filter(L=>this.viewItems[L].priority===1),h],v=_.filter(L=>this.viewItems[L].priority===2),y=this.viewItems[h];m=Math.round(m),m=w.clamp(m,y.minimumSize,Math.min(y.maximumSize,this.size)),y.size=m,this.relayout(f,v),this.state=i.Idle}}distributeViewSizes(){const h=[];let m=0;for(const L of this.viewItems)L.maximumSize-L.minimumSize>0&&(h.push(L),m+=L.size);const _=Math.floor(m/h.length);for(const L of h)L.size=w.clamp(_,L.minimumSize,L.maximumSize);const f=S.range(this.viewItems.length),v=f.filter(L=>this.viewItems[L].priority===1),y=f.filter(L=>this.viewItems[L].priority===2);this.relayout(v,y)}getViewSize(h){return h<0||h>=this.viewItems.length?-1:this.viewItems[h].size}doAddView(h,m,_=this.viewItems.length,f){if(this.state!==i.Idle)throw new Error("Cant modify splitview");this.state=i.Busy;const v=p.$(".split-view-view");_===this.viewItems.length?this.viewContainer.appendChild(v):this.viewContainer.insertBefore(v,this.viewContainer.children.item(_));const y=h.onDidChange(O=>this.onViewChange(E,O)),L=b.toDisposable(()=>this.viewContainer.removeChild(v)),I=b.combinedDisposable(y,L);let k;typeof m=="number"?k=m:m.type==="split"?k=this.getViewSize(m.index)/2:m.type==="invisible"?k={cachedVisibleSize:m.cachedVisibleSize}:k=h.minimumSize;const E=this.orientation===0?new u(v,h,k,I):new r(v,h,k,I);if(this.viewItems.splice(_,0,E),this.viewItems.length>1){let O={orthogonalStartSash:this.orthogonalStartSash,orthogonalEndSash:this.orthogonalEndSash};const A=this.orientation===0?new C.Sash(this.sashContainer,{getHorizontalSashTop:ne=>this.getSashPosition(ne),getHorizontalSashWidth:this.getSashOrthogonalSize},Object.assign(Object.assign({},O),{orientation:1})):new C.Sash(this.sashContainer,{getVerticalSashLeft:ne=>this.getSashPosition(ne),getVerticalSashHeight:this.getSashOrthogonalSize},Object.assign(Object.assign({},O),{orientation:0})),B=this.orientation===0?ne=>({sash:A,start:ne.startY,current:ne.currentY,alt:ne.altKey}):ne=>({sash:A,start:ne.startX,current:ne.currentX,alt:ne.altKey}),D=N.Event.map(A.onDidStart,B)(this.onSashStart,this),W=N.Event.map(A.onDidChange,B)(this.onSashChange,this),K=N.Event.map(A.onDidEnd,()=>this.sashItems.findIndex(ne=>ne.sash===A))(this.onSashEnd,this),Y=A.onDidReset(()=>{const ne=this.sashItems.findIndex(V=>V.sash===A),le=S.range(ne,-1),X=S.range(ne+1,this.viewItems.length),z=this.findFirstSnapIndex(le),P=this.findFirstSnapIndex(X);typeof z=="number"&&!this.viewItems[z].visible||typeof P=="number"&&!this.viewItems[P].visible||this._onDidSashReset.fire(ne)}),ee=b.combinedDisposable(D,W,K,Y,A),se={sash:A,disposable:ee};this.sashItems.splice(_-1,0,se)}v.appendChild(h.element);let T;typeof m!="number"&&m.type==="split"&&(T=[m.index]),f||this.relayout([_],T),this.state=i.Idle,!f&&typeof m!="number"&&m.type==="distribute"&&this.distributeViewSizes()}relayout(h,m){const _=this.viewItems.reduce((f,v)=>f+v.size,0);this.resize(this.viewItems.length-1,this.size-_,void 0,h,m),this.distributeEmptySpace(),this.layoutViews(),this.saveProportions()}resize(h,m,_=this.viewItems.map(E=>E.size),f,v,y=Number.NEGATIVE_INFINITY,L=Number.POSITIVE_INFINITY,I,k){if(h<0||h>=this.viewItems.length)return 0;const E=S.range(h,-1),T=S.range(h+1,this.viewItems.length);if(v)for(const se of v)S.pushToStart(E,se),S.pushToStart(T,se);if(f)for(const se of f)S.pushToEnd(E,se),S.pushToEnd(T,se);const O=E.map(se=>this.viewItems[se]),A=E.map(se=>_[se]),B=T.map(se=>this.viewItems[se]),F=T.map(se=>_[se]),D=E.reduce((se,ne)=>se+(this.viewItems[ne].minimumSize-_[ne]),0),R=E.reduce((se,ne)=>se+(this.viewItems[ne].maximumSize-_[ne]),0),W=T.length===0?Number.POSITIVE_INFINITY:T.reduce((se,ne)=>se+(_[ne]-this.viewItems[ne].minimumSize),0),x=T.length===0?Number.NEGATIVE_INFINITY:T.reduce((se,ne)=>se+(_[ne]-this.viewItems[ne].maximumSize),0),K=Math.max(D,x,y),Y=Math.min(W,R,L);let ee=!1;if(I){const se=this.viewItems[I.index],ne=m>=I.limitDelta;ee=ne!==se.visible,se.setVisible(ne,I.size)}if(!ee&&k){const se=this.viewItems[k.index],ne=mL+I.size,0);let _=this.size-m;const f=S.range(this.viewItems.length-1,-1),v=f.filter(L=>this.viewItems[L].priority===1),y=f.filter(L=>this.viewItems[L].priority===2);for(const L of y)S.pushToStart(f,L);for(const L of v)S.pushToEnd(f,L);typeof h=="number"&&S.pushToEnd(f,h);for(let L=0;_!==0&&Lm+_.size,0);let h=0;for(const m of this.viewItems)m.layout(h,this.layoutContext),h+=m.size;this.sashItems.forEach(m=>m.sash.layout()),this.updateSashEnablement(),this.updateScrollableElement()}updateScrollableElement(){this.orientation===0?this.scrollableElement.setScrollDimensions({height:this.size,scrollHeight:this.contentSize}):this.scrollableElement.setScrollDimensions({width:this.size,scrollWidth:this.contentSize})}updateSashEnablement(){let h=!1;const m=this.viewItems.map(I=>h=I.size-I.minimumSize>0||h);h=!1;const _=this.viewItems.map(I=>h=I.maximumSize-I.size>0||h),f=[...this.viewItems].reverse();h=!1;const v=f.map(I=>h=I.size-I.minimumSize>0||h).reverse();h=!1;const y=f.map(I=>h=I.maximumSize-I.size>0||h).reverse();let L=0;for(let I=0;I0||this.startSnappingEnabled)?k.state=1:W&&m[I]&&(L0)return;if(!_.visible&&_.snap)return m}}dispose(){super.dispose(),this.viewItems.forEach(h=>h.dispose()),this.viewItems=[],this.sashItems.forEach(h=>h.disposable.dispose()),this.sashItems=[]}}e.SplitView=t}),define(Q[314],J([10]),{}),define(Q[315],J([0,1,105,7,210,6,314]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Table=void 0;class S{constructor(c,o,s){this.columns=c,this.getColumnSize=s,this.templateId=S.TemplateId,this.renderedTemplates=new Set;const a=new Map(o.map(u=>[u.templateId,u]));this.renderers=[];for(const u of c){const r=a.get(u.templateId);if(!r)throw new Error(`Table cell renderer for template id ${u.templateId} not found.`);this.renderers.push(r)}}renderTemplate(c){const o=N.append(c,N.$(".monaco-table-tr")),s=[],a=[];for(let r=0;rnew d(l,h)),n={size:i.reduce((l,h)=>l+h.column.weight,0),views:i.map(l=>({size:l.column.weight,view:l}))};this.splitview=new M.SplitView(this.domNode,{orientation:1,scrollbarVisibility:2,getSashOrthogonalSize:()=>this.cachedHeight,descriptor:n}),this.splitview.el.style.height=`${s.headerRowHeight}px`,this.splitview.el.style.lineHeight=`${s.headerRowHeight}px`;const t=new S(a,u,l=>this.splitview.getViewSize(l));this.list=new b.List(c,this.domNode,C(s),[t],r),this.columnLayoutDisposable=w.Event.any(...i.map(l=>l.onDidLayout))(([l,h])=>t.layoutColumn(l,h)),this.styleElement=N.createStyleSheet(this.domNode),this.style({})}get onDidChangeFocus(){return this.list.onDidChangeFocus}get onDidChangeSelection(){return this.list.onDidChangeSelection}get onMouseDblClick(){return this.list.onMouseDblClick}get onPointer(){return this.list.onPointer}get onDidFocus(){return this.list.onDidFocus}get onDidDispose(){return this.list.onDidDispose}updateOptions(c){this.list.updateOptions(c)}splice(c,o,s=[]){this.list.splice(c,o,s)}getHTMLElement(){return this.domNode}style(c){const o=[];o.push(`.monaco-table.${this.domId} > .monaco-split-view2 .monaco-sash.vertical::before { + top: ${this.virtualDelegate.headerRowHeight+1}px; + height: calc(100% - ${this.virtualDelegate.headerRowHeight}px); + }`),this.styleElement.textContent=o.join(` +`),this.list.style(c)}getSelectedElements(){return this.list.getSelectedElements()}setSelection(c,o){this.list.setSelection(c,o)}getSelection(){return this.list.getSelection()}getFocus(){return this.list.getFocus()}dispose(){this.splitview.dispose(),this.list.dispose(),this.columnLayoutDisposable.dispose()}}e.Table=g,g.InstanceCount=0}),define(Q[316],J([10]),{}),define(Q[125],J([10]),{}),define(Q[211],J([0,1,7,119,125]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getIconClass=void 0;const M={},w=new N.IdGenerator("quick-input-button-icon-");function S(C){if(!!C){let d;const g=C.dark.toString();return M[g]?d=M[g]:(d=w.nextId(),b.createCSSRule(`.${d}`,`background-image: ${b.asCSSUrl(C.light||C.dark)}`),b.createCSSRule(`.vs-dark .${d}, .hc-black .${d}`,`background-image: ${b.asCSSUrl(C.dark)}`),M[g]=d),d}}e.getIconClass=S}),define(Q[317],J([10]),{}),define(Q[318],J([10]),{}),define(Q[319],J([10]),{}),define(Q[320],J([10]),{}),define(Q[321],J([10]),{}),define(Q[322],J([10]),{}),define(Q[323],J([10]),{}),define(Q[324],J([10]),{}),define(Q[325],J([10]),{}),define(Q[326],J([10]),{}),define(Q[327],J([10]),{}),define(Q[328],J([10]),{}),define(Q[329],J([10]),{}),define(Q[330],J([10]),{}),define(Q[331],J([10]),{}),define(Q[332],J([10]),{}),define(Q[333],J([10]),{}),define(Q[334],J([10]),{}),define(Q[335],J([10]),{}),define(Q[336],J([10]),{}),define(Q[337],J([10]),{}),define(Q[338],J([10]),{}),define(Q[339],J([10]),{}),define(Q[340],J([10]),{}),define(Q[341],J([10]),{}),define(Q[342],J([10]),{}),define(Q[343],J([10]),{}),define(Q[344],J([10]),{}),define(Q[345],J([10]),{}),define(Q[346],J([10]),{}),define(Q[347],J([10]),{}),define(Q[348],J([10]),{}),define(Q[349],J([10]),{}),define(Q[350],J([10]),{}),define(Q[351],J([10]),{}),define(Q[352],J([10]),{}),define(Q[353],J([10]),{}),define(Q[354],J([10]),{}),define(Q[355],J([10]),{}),define(Q[356],J([10]),{}),define(Q[357],J([10]),{}),define(Q[358],J([10]),{}),define(Q[359],J([10]),{}),define(Q[360],J([10]),{}),define(Q[361],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.readCharWidths=e.CharWidthRequest=void 0;class b{constructor(S,C){this.chr=S,this.type=C,this.width=0}fulfill(S){this.width=S}}e.CharWidthRequest=b;class N{constructor(S,C){this._bareFontInfo=S,this._requests=C,this._container=null,this._testElements=null}read(){this._createDomElements(),document.body.appendChild(this._container),this._readFromDomElements(),document.body.removeChild(this._container),this._container=null,this._testElements=null}_createDomElements(){const S=document.createElement("div");S.style.position="absolute",S.style.top="-50000px",S.style.width="50000px";const C=document.createElement("div");C.style.fontFamily=this._bareFontInfo.getMassagedFontFamily(),C.style.fontWeight=this._bareFontInfo.fontWeight,C.style.fontSize=this._bareFontInfo.fontSize+"px",C.style.fontFeatureSettings=this._bareFontInfo.fontFeatureSettings,C.style.lineHeight=this._bareFontInfo.lineHeight+"px",C.style.letterSpacing=this._bareFontInfo.letterSpacing+"px",S.appendChild(C);const d=document.createElement("div");d.style.fontFamily=this._bareFontInfo.getMassagedFontFamily(),d.style.fontWeight="bold",d.style.fontSize=this._bareFontInfo.fontSize+"px",d.style.fontFeatureSettings=this._bareFontInfo.fontFeatureSettings,d.style.lineHeight=this._bareFontInfo.lineHeight+"px",d.style.letterSpacing=this._bareFontInfo.letterSpacing+"px",S.appendChild(d);const g=document.createElement("div");g.style.fontFamily=this._bareFontInfo.getMassagedFontFamily(),g.style.fontWeight=this._bareFontInfo.fontWeight,g.style.fontSize=this._bareFontInfo.fontSize+"px",g.style.fontFeatureSettings=this._bareFontInfo.fontFeatureSettings,g.style.lineHeight=this._bareFontInfo.lineHeight+"px",g.style.letterSpacing=this._bareFontInfo.letterSpacing+"px",g.style.fontStyle="italic",S.appendChild(g);const p=[];for(const c of this._requests){let o;c.type===0&&(o=C),c.type===2&&(o=d),c.type===1&&(o=g),o.appendChild(document.createElement("br"));const s=document.createElement("span");N._render(s,c),o.appendChild(s),p.push(s)}this._container=S,this._testElements=p}static _render(S,C){if(C.chr===" "){let d="\xA0";for(let g=0;g<8;g++)d+=d;S.innerText=d}else{let d=C.chr;for(let g=0;g<8;g++)d+=d;S.textContent=d}}_readFromDomElements(){for(let S=0,C=this._requests.length;S{w&&w[0]&&w[0].contentRect?this.observe({width:w[0].contentRect.width,height:w[0].contentRect.height}):this.observe()}),this.resizeObserver.observe(this.referenceDomElement)):this.measureReferenceDomElementToken===-1&&(this.measureReferenceDomElementToken=setInterval(()=>this.observe(),100))}stopObserving(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.measureReferenceDomElementToken!==-1&&(clearInterval(this.measureReferenceDomElementToken),this.measureReferenceDomElementToken=-1)}observe(w){this.measureReferenceDomElement(!0,w)}measureReferenceDomElement(w,S){let C=0,d=0;S?(C=S.width,d=S.height):this.referenceDomElement&&(C=this.referenceDomElement.clientWidth,d=this.referenceDomElement.clientHeight),C=Math.max(5,C),d=Math.max(5,d),(this.width!==C||this.height!==d)&&(this.width=C,this.height=d,w&&this.changeCallback())}}e.ElementSizeObserver=N}),define(Q[162],J([0,1,7,90,50,2]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlobalEditorMouseMoveMonitor=e.EditorPointerEventFactory=e.EditorMouseEventFactory=e.EditorMouseEvent=e.createEditorPagePosition=e.EditorPagePosition=e.ClientCoordinates=e.PageCoordinates=void 0;class S{constructor(u,r){this.x=u,this.y=r}toClientCoordinates(){return new C(this.x-b.StandardWindow.scrollX,this.y-b.StandardWindow.scrollY)}}e.PageCoordinates=S;class C{constructor(u,r){this.clientX=u,this.clientY=r}toPageCoordinates(){return new S(this.clientX+b.StandardWindow.scrollX,this.clientY+b.StandardWindow.scrollY)}}e.ClientCoordinates=C;class d{constructor(u,r,i,n){this.x=u,this.y=r,this.width=i,this.height=n}}e.EditorPagePosition=d;function g(a){const u=b.getDomNodePagePosition(a);return new d(u.left,u.top,u.width,u.height)}e.createEditorPagePosition=g;class p extends M.StandardMouseEvent{constructor(u,r){super(u);this.pos=new S(this.posx,this.posy),this.editorPos=g(r)}}e.EditorMouseEvent=p;class c{constructor(u){this._editorViewDomNode=u}_create(u){return new p(u,this._editorViewDomNode)}onContextMenu(u,r){return b.addDisposableListener(u,"contextmenu",i=>{r(this._create(i))})}onMouseUp(u,r){return b.addDisposableListener(u,"mouseup",i=>{r(this._create(i))})}onMouseDown(u,r){return b.addDisposableListener(u,"mousedown",i=>{r(this._create(i))})}onMouseLeave(u,r){return b.addDisposableNonBubblingMouseOutListener(u,i=>{r(this._create(i))})}onMouseMoveThrottled(u,r,i,n){const t=(l,h)=>i(l,this._create(h));return b.addDisposableThrottledListener(u,"mousemove",r,t,n)}}e.EditorMouseEventFactory=c;class o{constructor(u){this._editorViewDomNode=u}_create(u){return new p(u,this._editorViewDomNode)}onPointerUp(u,r){return b.addDisposableListener(u,"pointerup",i=>{r(this._create(i))})}onPointerDown(u,r){return b.addDisposableListener(u,"pointerdown",i=>{r(this._create(i))})}onPointerLeave(u,r){return b.addDisposableNonBubblingPointerOutListener(u,i=>{r(this._create(i))})}onPointerMoveThrottled(u,r,i,n){const t=(l,h)=>i(l,this._create(h));return b.addDisposableThrottledListener(u,"pointermove",r,t,n)}}e.EditorPointerEventFactory=o;class s extends w.Disposable{constructor(u){super();this._editorViewDomNode=u,this._globalMouseMoveMonitor=this._register(new N.GlobalMouseMoveMonitor),this._keydownListener=null}startMonitoring(u,r,i,n,t){this._keydownListener=b.addStandardDisposableListener(document,"keydown",h=>{h.toKeybinding().isModifierKey()||this._globalMouseMoveMonitor.stopMonitoring(!0,h.browserEvent)},!0);const l=(h,m)=>i(h,new p(m,this._editorViewDomNode));this._globalMouseMoveMonitor.startMonitoring(u,r,l,n,h=>{this._keydownListener.dispose(),t(h)})}stopMonitoring(){this._globalMouseMoveMonitor.stopMonitoring(!0)}}e.GlobalEditorMouseMoveMonitor=s}),define(Q[362],J([0,1,6,2]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractCodeEditorService=void 0;class M extends N.Disposable{constructor(){super();this._onCodeEditorAdd=this._register(new b.Emitter),this.onCodeEditorAdd=this._onCodeEditorAdd.event,this._onCodeEditorRemove=this._register(new b.Emitter),this.onCodeEditorRemove=this._onCodeEditorRemove.event,this._onDiffEditorAdd=this._register(new b.Emitter),this._onDiffEditorRemove=this._register(new b.Emitter),this._onDecorationTypeRegistered=this._register(new b.Emitter),this._modelProperties=new Map,this._codeEditors=Object.create(null),this._diffEditors=Object.create(null)}addCodeEditor(S){this._codeEditors[S.getId()]=S,this._onCodeEditorAdd.fire(S)}removeCodeEditor(S){delete this._codeEditors[S.getId()]&&this._onCodeEditorRemove.fire(S)}listCodeEditors(){return Object.keys(this._codeEditors).map(S=>this._codeEditors[S])}addDiffEditor(S){this._diffEditors[S.getId()]=S,this._onDiffEditorAdd.fire(S)}removeDiffEditor(S){delete this._diffEditors[S.getId()]&&this._onDiffEditorRemove.fire(S)}listDiffEditors(){return Object.keys(this._diffEditors).map(S=>this._diffEditors[S])}getFocusedCodeEditor(){let S=null;const C=this.listCodeEditors();for(const d of C){if(d.hasTextFocus())return d;d.hasWidgetFocus()&&(S=d)}return S}setModelProperty(S,C,d){const g=S.toString();let p;this._modelProperties.has(g)?p=this._modelProperties.get(g):(p=new Map,this._modelProperties.set(g,p)),p.set(C,d)}getModelProperty(S,C){const d=S.toString();if(this._modelProperties.has(d))return this._modelProperties.get(d).get(C)}}e.AbstractCodeEditorService=M}),define(Q[213],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getCharIndex=e.allCharCodes=void 0,e.allCharCodes=(()=>{const N=[];for(let M=32;M<=126;M++)N.push(M);return N.push(65533),N})();const b=(N,M)=>(N-=32,N<0||N>96?M<=2?(N+96)%96:96-1:N);e.getCharIndex=b}),define(Q[363],J([0,1,213,122]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MinimapCharRenderer=void 0;class M{constructor(S,C){this.scale=C,this.charDataNormal=M.soften(S,12/15),this.charDataLight=M.soften(S,50/60)}static soften(S,C){let d=new Uint8ClampedArray(S.length);for(let g=0,p=S.length;gS.width||d+i>S.height){console.warn("bad render request outside image data");return}const n=s?this.charDataLight:this.charDataNormal,t=b.getCharIndex(g,o),l=S.width*4,h=c.r,m=c.g,_=c.b,f=p.r-h,v=p.g-m,y=p.b-_,L=S.data;let I=t*u*r,k=d*l+C*4;for(let E=0;ES.width||d+u>S.height){console.warn("bad render request outside image data");return}const r=S.width*4,i=.5,n=p.r,t=p.g,l=p.b,h=g.r-n,m=g.g-t,_=g.b-l,f=n+h*i,v=t+m*i,y=l+_*i,L=S.data;let I=d*r+C*4;for(let k=0;k{const S=new Uint8ClampedArray(w.length/2);for(let C=0;C>1]=N[w[C]]<<4|N[w[C+1]]&15;return S};e.prebakedMiniMaps={1:b.once(()=>M("0000511D6300CF609C709645A78432005642574171487021003C451900274D35D762755E8B629C5BA856AF57BA649530C167D1512A272A3F6038604460398526BCA2A968DB6F8957C768BE5FBE2FB467CF5D8D5B795DC7625B5DFF50DE64C466DB2FC47CD860A65E9A2EB96CB54CE06DA763AB2EA26860524D3763536601005116008177A8705E53AB738E6A982F88BAA35B5F5B626D9C636B449B737E5B7B678598869A662F6B5B8542706C704C80736A607578685B70594A49715A4522E792")),2:b.once(()=>M("000000000000000055394F383D2800008B8B1F210002000081B1CBCBCC820000847AAF6B9AAF2119BE08B8881AD60000A44FD07DCCF107015338130C00000000385972265F390B406E2437634B4B48031B12B8A0847000001E15B29A402F0000000000004B33460B00007A752C2A0000000000004D3900000084394B82013400ABA5CFC7AD9C0302A45A3E5A98AB000089A43382D97900008BA54AA087A70A0248A6A7AE6DBE0000BF6F94987EA40A01A06DCFA7A7A9030496C32F77891D0000A99FB1A0AFA80603B29AB9CA75930D010C0948354D3900000C0948354F37460D0028BE673D8400000000AF9D7B6E00002B007AA8933400007AA642675C2700007984CFB9C3985B768772A8A6B7B20000CAAECAAFC4B700009F94A6009F840009D09F9BA4CA9C0000CC8FC76DC87F0000C991C472A2000000A894A48CA7B501079BA2C9C69BA20000B19A5D3FA89000005CA6009DA2960901B0A7F0669FB200009D009E00B7890000DAD0F5D092820000D294D4C48BD10000B5A7A4A3B1A50402CAB6CBA6A2000000B5A7A4A3B1A8044FCDADD19D9CB00000B7778F7B8AAE0803C9AB5D3F5D3F00009EA09EA0BAB006039EA0989A8C7900009B9EF4D6B7C00000A9A7816CACA80000ABAC84705D3F000096DA635CDC8C00006F486F266F263D4784006124097B00374F6D2D6D2D6D4A3A95872322000000030000000000008D8939130000000000002E22A5C9CBC70600AB25C0B5C9B400061A2DB04CA67001082AA6BEBEBFC606002321DACBC19E03087AA08B6768380000282FBAC0B8CA7A88AD25BBA5A29900004C396C5894A6000040485A6E356E9442A32CD17EADA70000B4237923628600003E2DE9C1D7B500002F25BBA5A2990000231DB6AFB4A804023025C0B5CAB588062B2CBDBEC0C706882435A75CA20000002326BD6A82A908048B4B9A5A668000002423A09CB4BB060025259C9D8A7900001C1FCAB2C7C700002A2A9387ABA200002626A4A47D6E9D14333163A0C87500004B6F9C2D643A257049364936493647358A34438355497F1A0000A24C1D590000D38DFFBDD4CD3126"))}}),define(Q[365],J([0,1,363,213,364,122]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MinimapCharRendererFactory=void 0;class S{static create(d,g){if(this.lastCreated&&d===this.lastCreated.scale&&g===this.lastFontFamily)return this.lastCreated;let p;return M.prebakedMiniMaps[d]?p=new b.MinimapCharRenderer(M.prebakedMiniMaps[d](),d):p=S.createFromSampleData(S.createSampleData(g).data,d),this.lastFontFamily=g,this.lastCreated=p,p}static createSampleData(d){const g=document.createElement("canvas"),p=g.getContext("2d");g.style.height=`${16}px`,g.height=16,g.width=96*10,g.style.width=96*10+"px",p.fillStyle="#ffffff",p.font=`bold ${16}px ${d}`,p.textBaseline="middle";let c=0;for(const o of N.allCharCodes)p.fillText(String.fromCharCode(o),c,16/2),c+=10;return p.getImageData(0,0,96*10,16)}static createFromSampleData(d,g){const p=16*10*4*96;if(d.length!==p)throw new Error("Unexpected source in MinimapCharRenderer");let c=S._downsample(d,g);return new b.MinimapCharRenderer(c,g)}static _downsampleChar(d,g,p,c,o){const s=1*o,a=2*o;let u=c,r=0;for(let i=0;i0){const r=255/u;for(let i=0;i=0&&S<256?this._asciiMap[S]=d:this._map.set(S,d)}get(S){return S>=0&&S<256?this._asciiMap[S]:this._map.get(S)||this._defaultValue}}e.CharacterClassifier=N;class M{constructor(){this._actual=new N(0)}add(S){this._actual.set(S,1)}has(S){return this._actual.get(S)===1}}e.CharacterSet=M}),define(Q[106],J([0,1,91]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getMapForWordSeparators=e.WordCharacterClassifier=void 0;class N extends b.CharacterClassifier{constructor(S){super(0);for(let C=0,d=S.length;C(S.hasOwnProperty(C)||(S[C]=w(C)),S[C])}e.getMapForWordSeparators=M(w=>new N(w))}),define(Q[14],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Position=void 0;class b{constructor(M,w){this.lineNumber=M,this.column=w}with(M=this.lineNumber,w=this.column){return M===this.lineNumber&&w===this.column?this:new b(M,w)}delta(M=0,w=0){return this.with(this.lineNumber+M,this.column+w)}equals(M){return b.equals(this,M)}static equals(M,w){return!M&&!w?!0:!!M&&!!w&&M.lineNumber===w.lineNumber&&M.column===w.column}isBefore(M){return b.isBefore(this,M)}static isBefore(M,w){return M.lineNumberC||w===C&&S>d?(this.startLineNumber=C,this.startColumn=d,this.endLineNumber=w,this.endColumn=S):(this.startLineNumber=w,this.startColumn=S,this.endLineNumber=C,this.endColumn=d)}isEmpty(){return N.isEmpty(this)}static isEmpty(w){return w.startLineNumber===w.endLineNumber&&w.startColumn===w.endColumn}containsPosition(w){return N.containsPosition(this,w)}static containsPosition(w,S){return!(S.lineNumberw.endLineNumber||S.lineNumber===w.startLineNumber&&S.columnw.endColumn)}containsRange(w){return N.containsRange(this,w)}static containsRange(w,S){return!(S.startLineNumberw.endLineNumber||S.endLineNumber>w.endLineNumber||S.startLineNumber===w.startLineNumber&&S.startColumnw.endColumn)}strictContainsRange(w){return N.strictContainsRange(this,w)}static strictContainsRange(w,S){return!(S.startLineNumberw.endLineNumber||S.endLineNumber>w.endLineNumber||S.startLineNumber===w.startLineNumber&&S.startColumn<=w.startColumn||S.endLineNumber===w.endLineNumber&&S.endColumn>=w.endColumn)}plusRange(w){return N.plusRange(this,w)}static plusRange(w,S){let C,d,g,p;return S.startLineNumberw.endLineNumber?(g=S.endLineNumber,p=S.endColumn):S.endLineNumber===w.endLineNumber?(g=S.endLineNumber,p=Math.max(S.endColumn,w.endColumn)):(g=w.endLineNumber,p=w.endColumn),new N(C,d,g,p)}intersectRanges(w){return N.intersectRanges(this,w)}static intersectRanges(w,S){let C=w.startLineNumber,d=w.startColumn,g=w.endLineNumber,p=w.endColumn,c=S.startLineNumber,o=S.startColumn,s=S.endLineNumber,a=S.endColumn;return Cs?(g=s,p=a):g===s&&(p=Math.min(p,a)),C>g||C===g&&d>p?null:new N(C,d,g,p)}equalsRange(w){return N.equalsRange(this,w)}static equalsRange(w,S){return!!w&&!!S&&w.startLineNumber===S.startLineNumber&&w.startColumn===S.startColumn&&w.endLineNumber===S.endLineNumber&&w.endColumn===S.endColumn}getEndPosition(){return N.getEndPosition(this)}static getEndPosition(w){return new b.Position(w.endLineNumber,w.endColumn)}getStartPosition(){return N.getStartPosition(this)}static getStartPosition(w){return new b.Position(w.startLineNumber,w.startColumn)}toString(){return"["+this.startLineNumber+","+this.startColumn+" -> "+this.endLineNumber+","+this.endColumn+"]"}setEndPosition(w,S){return new N(this.startLineNumber,this.startColumn,w,S)}setStartPosition(w,S){return new N(w,S,this.endLineNumber,this.endColumn)}collapseToStart(){return N.collapseToStart(this)}static collapseToStart(w){return new N(w.startLineNumber,w.startColumn,w.startLineNumber,w.startColumn)}static fromPositions(w,S=w){return new N(w.lineNumber,w.column,S.lineNumber,S.column)}static lift(w){return w?new N(w.startLineNumber,w.startColumn,w.endLineNumber,w.endColumn):null}static isIRange(w){return w&&typeof w.startLineNumber=="number"&&typeof w.startColumn=="number"&&typeof w.endLineNumber=="number"&&typeof w.endColumn=="number"}static areIntersectingOrTouching(w,S){return!(w.endLineNumberw.startLineNumber}}e.Range=N}),define(Q[214],J([0,1,8,14,3]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PagedScreenReaderStrategy=e.TextAreaState=e._debugComposition=void 0,e._debugComposition=!1;class w{constructor(d,g,p,c,o){this.value=d,this.selectionStart=g,this.selectionEnd=p,this.selectionStartPosition=c,this.selectionEndPosition=o}toString(){return"[ <"+this.value+">, selectionStart: "+this.selectionStart+", selectionEnd: "+this.selectionEnd+"]"}static readFromTextArea(d){return new w(d.getValue(),d.getSelectionStart(),d.getSelectionEnd(),null,null)}collapseSelection(){return new w(this.value,this.value.length,this.value.length,null,null)}writeToTextArea(d,g,p){e._debugComposition&&console.log("writeToTextArea "+d+": "+this.toString()),g.setValue(d,this.value),p&&g.setSelectionRange(d,this.selectionStart,this.selectionEnd)}deduceEditorPosition(d){if(d<=this.selectionStart){const c=this.value.substring(d,this.selectionStart);return this._finishDeduceEditorPosition(this.selectionStartPosition,c,-1)}if(d>=this.selectionEnd){const c=this.value.substring(this.selectionEnd,d);return this._finishDeduceEditorPosition(this.selectionEndPosition,c,1)}const g=this.value.substring(this.selectionStart,d);if(g.indexOf(String.fromCharCode(8230))===-1)return this._finishDeduceEditorPosition(this.selectionStartPosition,g,1);const p=this.value.substring(d,this.selectionEnd);return this._finishDeduceEditorPosition(this.selectionEndPosition,p,-1)}_finishDeduceEditorPosition(d,g,p){let c=0,o=-1;for(;(o=g.indexOf(` +`,o+1))!==-1;)c++;return[d,p*g.length,c]}static selectedText(d){return new w(d,0,d.length,null,null)}static deduceInput(d,g,p){if(!d)return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0};e._debugComposition&&(console.log("------------------------deduceInput"),console.log("PREVIOUS STATE: "+d.toString()),console.log("CURRENT STATE: "+g.toString()));let c=d.value,o=d.selectionStart,s=d.selectionEnd,a=g.value,u=g.selectionStart,r=g.selectionEnd;const i=c.substring(s),n=a.substring(r),t=b.commonSuffixLength(i,n);a=a.substring(0,a.length-t),c=c.substring(0,c.length-t);const l=c.substring(0,o),h=a.substring(0,u),m=b.commonPrefixLength(l,h);if(a=a.substring(m),c=c.substring(m),u-=m,o-=m,r-=m,s-=m,e._debugComposition&&(console.log("AFTER DIFFING PREVIOUS STATE: <"+c+">, selectionStart: "+o+", selectionEnd: "+s),console.log("AFTER DIFFING CURRENT STATE: <"+a+">, selectionStart: "+u+", selectionEnd: "+r)),p&&u===r&&c.length>0){let f=null;if(u===a.length?a.startsWith(c)&&(f=a.substring(c.length)):a.endsWith(c)&&(f=a.substring(0,a.length-c.length)),f!==null&&f.length>0&&(/\uFE0F/.test(f)||b.containsEmoji(f)))return{text:f,replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0}}if(u===r){if(c===a&&o===0&&s===c.length&&u===a.length&&a.indexOf(` +`)===-1&&b.containsFullWidthCharacter(a))return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0};const f=l.length-m;return e._debugComposition&&console.log("REMOVE PREVIOUS: "+(l.length-m)+" chars"),{text:a,replacePrevCharCnt:f,replaceNextCharCnt:0,positionDelta:0}}const _=s-o;return{text:a,replacePrevCharCnt:_,replaceNextCharCnt:0,positionDelta:0}}static deduceAndroidCompositionInput(d,g){if(!d)return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0};if(e._debugComposition&&(console.log("------------------------deduceAndroidCompositionInput"),console.log("PREVIOUS STATE: "+d.toString()),console.log("CURRENT STATE: "+g.toString())),d.value===g.value)return{text:"",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:g.selectionEnd-d.selectionEnd};const p=Math.min(b.commonPrefixLength(d.value,g.value),d.selectionEnd),c=Math.min(b.commonSuffixLength(d.value,g.value),d.value.length-d.selectionEnd),o=d.value.substring(p,d.value.length-c),s=g.value.substring(p,g.value.length-c),a=d.selectionStart-p,u=d.selectionEnd-p,r=g.selectionStart-p,i=g.selectionEnd-p;return e._debugComposition&&(console.log("AFTER DIFFING PREVIOUS STATE: <"+o+">, selectionStart: "+a+", selectionEnd: "+u),console.log("AFTER DIFFING CURRENT STATE: <"+s+">, selectionStart: "+r+", selectionEnd: "+i)),{text:s,replacePrevCharCnt:u,replaceNextCharCnt:o.length-u,positionDelta:i-s.length}}}e.TextAreaState=w,w.EMPTY=new w("",0,0,null,null);class S{static _getPageOfLine(d,g){return Math.floor((d-1)/g)}static _getRangeForPage(d,g){const p=d*g,c=p+1,o=p+g;return new M.Range(c,1,o+1,1)}static fromEditorSelection(d,g,p,c,o){const s=S._getPageOfLine(p.startLineNumber,c),a=S._getRangeForPage(s,c),u=S._getPageOfLine(p.endLineNumber,c),r=S._getRangeForPage(u,c),i=a.intersectRanges(new M.Range(1,1,p.startLineNumber,p.startColumn));let n=g.getValueInRange(i,1);const t=g.getLineCount(),l=g.getLineMaxColumn(t),h=r.intersectRanges(new M.Range(p.endLineNumber,p.endColumn,t,l));let m=g.getValueInRange(h,1),_;if(s===u||s+1===u)_=g.getValueInRange(p,1);else{const f=a.intersectRanges(p),v=r.intersectRanges(p);_=g.getValueInRange(f,1)+String.fromCharCode(8230)+g.getValueInRange(v,1)}if(o){const f=500;n.length>f&&(n=n.substring(n.length-f,n.length)),m.length>f&&(m=m.substring(0,f)),_.length>2*f&&(_=_.substring(0,f)+String.fromCharCode(8230)+_.substring(_.length-f,_.length))}return new w(n+_+m,n.length,n.length+_.length,new N.Position(p.startLineNumber,p.startColumn),new N.Position(p.endLineNumber,p.endColumn))}}e.PagedScreenReaderStrategy=S}),define(Q[215],J([0,1,195,6,2,40,3]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffNavigator=void 0;const C={followsCaret:!0,ignoreCharChanges:!0,alwaysRevealFirst:!0};class d extends M.Disposable{constructor(p,c={}){super();this._onDidUpdate=this._register(new N.Emitter),this._editor=p,this._options=w.mixin(c,C,!1),this.disposed=!1,this.nextIdx=-1,this.ranges=[],this.ignoreSelectionChange=!1,this.revealFirst=Boolean(this._options.alwaysRevealFirst),this._register(this._editor.onDidDispose(()=>this.dispose())),this._register(this._editor.onDidUpdateDiff(()=>this._onDiffUpdated())),this._options.followsCaret&&this._register(this._editor.getModifiedEditor().onDidChangeCursorPosition(o=>{this.ignoreSelectionChange||(this.nextIdx=-1)})),this._options.alwaysRevealFirst&&this._register(this._editor.getModifiedEditor().onDidChangeModel(o=>{this.revealFirst=!0})),this._init()}_init(){!!this._editor.getLineChanges()}_onDiffUpdated(){this._init(),this._compute(this._editor.getLineChanges()),this.revealFirst&&this._editor.getLineChanges()!==null&&(this.revealFirst=!1,this.nextIdx=-1,this.next(1))}_compute(p){this.ranges=[],p&&p.forEach(c=>{!this._options.ignoreCharChanges&&c.charChanges?c.charChanges.forEach(o=>{this.ranges.push({rhs:!0,range:new S.Range(o.modifiedStartLineNumber,o.modifiedStartColumn,o.modifiedEndLineNumber,o.modifiedEndColumn)})}):this.ranges.push({rhs:!0,range:new S.Range(c.modifiedStartLineNumber,1,c.modifiedStartLineNumber,1)})}),this.ranges.sort((c,o)=>c.range.getStartPosition().isBeforeOrEqual(o.range.getStartPosition())?-1:o.range.getStartPosition().isBeforeOrEqual(c.range.getStartPosition())?1:0),this._onDidUpdate.fire(this)}_initIdx(p){let c=!1,o=this._editor.getPosition();if(!o){this.nextIdx=0;return}for(let s=0,a=this.ranges.length;s=this.ranges.length&&(this.nextIdx=0)):(this.nextIdx-=1,this.nextIdx<0&&(this.nextIdx=this.ranges.length-1));let o=this.ranges[this.nextIdx];this.ignoreSelectionChange=!0;try{let s=o.range.getStartPosition();this._editor.setPosition(s),this._editor.revealPositionInCenter(s,c)}finally{this.ignoreSelectionChange=!1}}}canNavigate(){return this.ranges&&this.ranges.length>0}next(p=0){this._move(!0,p)}previous(p=0){this._move(!1,p)}dispose(){super.dispose(),this.ranges=[],this.disposed=!0}}e.DiffNavigator=d}),define(Q[62],J([0,1,3]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditOperation=void 0;class N{static insert(w,S){return{range:new b.Range(w.lineNumber,w.column,w.lineNumber,w.column),text:S,forceMoveMarkers:!0}}static delete(w){return{range:w,text:null}}static replace(w,S){return{range:w,text:S}}static replaceMove(w,S){return{range:w,text:S,forceMoveMarkers:!0}}}e.EditOperation=N}),define(Q[366],J([0,1,8,62,3]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.trimTrailingWhitespace=e.TrimTrailingWhitespaceCommand=void 0;class w{constructor(d,g){this._selection=d,this._cursors=g,this._selectionId=null}getEditOperations(d,g){let p=S(d,this._cursors);for(let c=0,o=p.length;cs.lineNumber===a.lineNumber?s.column-a.column:s.lineNumber-a.lineNumber);for(let s=d.length-2;s>=0;s--)d[s].lineNumber===d[s+1].lineNumber&&d.splice(s,1);let g=[],p=0,c=0,o=d.length;for(let s=1,a=C.getLineCount();s<=a;s++){let u=C.getLineContent(s),r=u.length+1,i=0;if(!(c255?255:M|0}}e.RGBA8=b,b.Empty=new b(0,0,0,0)}),define(Q[21],J([0,1,14,3]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Selection=void 0;class M extends N.Range{constructor(S,C,d,g){super(S,C,d,g);this.selectionStartLineNumber=S,this.selectionStartColumn=C,this.positionLineNumber=d,this.positionColumn=g}toString(){return"["+this.selectionStartLineNumber+","+this.selectionStartColumn+" -> "+this.positionLineNumber+","+this.positionColumn+"]"}equalsSelection(S){return M.selectionsEqual(this,S)}static selectionsEqual(S,C){return S.selectionStartLineNumber===C.selectionStartLineNumber&&S.selectionStartColumn===C.selectionStartColumn&&S.positionLineNumber===C.positionLineNumber&&S.positionColumn===C.positionColumn}getDirection(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?0:1}setEndPosition(S,C){return this.getDirection()===0?new M(this.startLineNumber,this.startColumn,S,C):new M(S,C,this.startLineNumber,this.startColumn)}getPosition(){return new b.Position(this.positionLineNumber,this.positionColumn)}setStartPosition(S,C){return this.getDirection()===0?new M(S,C,this.endLineNumber,this.endColumn):new M(this.endLineNumber,this.endColumn,S,C)}static fromPositions(S,C=S){return new M(S.lineNumber,S.column,C.lineNumber,C.column)}static liftSelection(S){return new M(S.selectionStartLineNumber,S.selectionStartColumn,S.positionLineNumber,S.positionColumn)}static selectionsArrEqual(S,C){if(S&&!C||!S&&C)return!1;if(!S&&!C)return!0;if(S.length!==C.length)return!1;for(let d=0,g=S.length;dthis._onCut.fire(),0)),this._asyncFocusGainWriteScreenReaderContent=this._register(new M.RunOnceScheduler(()=>this.writeScreenReaderContent("asyncFocusGain"),0)),this._textAreaState=g.TextAreaState.EMPTY,this._selectionChangeListener=null,this.writeScreenReaderContent("ctor"),this._hasFocus=!1,this._isDoingComposition=!1,this._nextCommand=0;let l=null;this._register(N.addStandardDisposableListener(t.domNode,"keydown",f=>{(f.keyCode===109||this._isDoingComposition&&f.keyCode===1)&&f.stopPropagation(),f.equals(9)&&f.preventDefault(),l=f,this._onKeyDown.fire(f)})),this._register(N.addStandardDisposableListener(t.domNode,"keyup",f=>{this._onKeyUp.fire(f)})),this._register(N.addDisposableListener(t.domNode,"compositionstart",f=>{if(g._debugComposition&&console.log("[compositionstart]",f),!this._isDoingComposition){if(this._isDoingComposition=!0,C.isMacintosh&&this._textAreaState.selectionStart===this._textAreaState.selectionEnd&&this._textAreaState.selectionStart>0&&this._textAreaState.value.substr(this._textAreaState.selectionStart-1,1)===f.data&&(l&&l.equals(109)&&(l.code==="ArrowRight"||l.code==="ArrowLeft")||b.isFirefox)){g._debugComposition&&console.log("[compositionstart] Handling long press case on macOS + arrow key or Firefox",f),this._textAreaState=new g.TextAreaState(this._textAreaState.value,this._textAreaState.selectionStart-1,this._textAreaState.selectionEnd,this._textAreaState.selectionStartPosition?new p.Position(this._textAreaState.selectionStartPosition.lineNumber,this._textAreaState.selectionStartPosition.column-1):null,this._textAreaState.selectionEndPosition),this._onCompositionStart.fire({revealDeltaColumns:-1});return}if(b.isAndroid){this._onCompositionStart.fire({revealDeltaColumns:-this._textAreaState.selectionStart});return}this._setAndWriteTextAreaState("compositionstart",g.TextAreaState.EMPTY),this._onCompositionStart.fire({revealDeltaColumns:0})}}));const h=f=>{const v=this._textAreaState,y=g.TextAreaState.readFromTextArea(this._textArea);return[y,g.TextAreaState.deduceInput(v,y,f)]},m=()=>{const f=this._textAreaState,v=g.TextAreaState.readFromTextArea(this._textArea);return[v,g.TextAreaState.deduceAndroidCompositionInput(f,v)]},_=f=>{const v=this._textAreaState,y=g.TextAreaState.selectedText(f),L={text:y.value,replacePrevCharCnt:v.selectionEnd-v.selectionStart,replaceNextCharCnt:0,positionDelta:0};return[y,L]};this._register(N.addDisposableListener(t.domNode,"compositionupdate",f=>{if(g._debugComposition&&console.log("[compositionupdate]",f),b.isAndroid){const[L,I]=m();this._textAreaState=L,this._onType.fire(I),this._onCompositionUpdate.fire(f);return}const[v,y]=_(f.data||"");this._textAreaState=v,this._onType.fire(y),this._onCompositionUpdate.fire(f)})),this._register(N.addDisposableListener(t.domNode,"compositionend",f=>{if(g._debugComposition&&console.log("[compositionend]",f),!!this._isDoingComposition){if(this._isDoingComposition=!1,b.isAndroid){const[L,I]=m();this._textAreaState=L,this._onType.fire(I),this._onCompositionEnd.fire();return}const[v,y]=_(f.data||"");this._textAreaState=v,this._onType.fire(y),(b.isChrome||b.isFirefox)&&(this._textAreaState=g.TextAreaState.readFromTextArea(this._textArea)),this._onCompositionEnd.fire()}})),this._register(N.addDisposableListener(t.domNode,"input",()=>{if(this._textArea.setIgnoreSelectionChangeTime("received input event"),!this._isDoingComposition){const[f,v]=h(C.isMacintosh);v.replacePrevCharCnt===0&&v.text.length===1&&d.isHighSurrogate(v.text.charCodeAt(0))||(this._textAreaState=f,this._nextCommand===0?(v.text!==""||v.replacePrevCharCnt!==0)&&this._onType.fire(v):((v.text!==""||v.replacePrevCharCnt!==0)&&this._firePaste(v.text,null),this._nextCommand=0))}})),this._register(N.addDisposableListener(t.domNode,"cut",f=>{this._textArea.setIgnoreSelectionChangeTime("received cut event"),this._ensureClipboardGetsEditorSelection(f),this._asyncTriggerCut.schedule()})),this._register(N.addDisposableListener(t.domNode,"copy",f=>{this._ensureClipboardGetsEditorSelection(f)})),this._register(N.addDisposableListener(t.domNode,"paste",f=>{if(this._textArea.setIgnoreSelectionChangeTime("received paste event"),u.canUseTextData(f)){const[v,y]=u.getTextData(f);v!==""&&this._firePaste(v,y)}else this._textArea.getSelectionStart()!==this._textArea.getSelectionEnd()&&this._setAndWriteTextAreaState("paste",g.TextAreaState.EMPTY),this._nextCommand=1})),this._register(N.addDisposableListener(t.domNode,"focus",()=>{const f=this._hasFocus;this._setHasFocus(!0),b.isSafari&&!f&&this._hasFocus&&this._asyncFocusGainWriteScreenReaderContent.schedule()})),this._register(N.addDisposableListener(t.domNode,"blur",()=>{this._isDoingComposition&&(this._isDoingComposition=!1,this.writeScreenReaderContent("blurWithoutCompositionEnd"),this._onCompositionEnd.fire()),this._setHasFocus(!1)})),this._register(N.addDisposableListener(t.domNode,o.Tap,()=>{b.isAndroid&&this._isDoingComposition&&(this._isDoingComposition=!1,this.writeScreenReaderContent("tapWithoutCompositionEnd"),this._onCompositionEnd.fire())}))}_installSelectionChangeListener(){let n=0;return N.addDisposableListener(document,"selectionchange",t=>{if(!!this._hasFocus&&!this._isDoingComposition&&!!b.isChrome){const l=Date.now(),h=l-n;if(n=l,!(h<5)){const m=l-this._textArea.getIgnoreSelectionChangeTime();if(this._textArea.resetSelectionChangeTime(),!(m<100)&&!(!this._textAreaState.selectionStartPosition||!this._textAreaState.selectionEndPosition)){const _=this._textArea.getValue();if(this._textAreaState.value===_){const f=this._textArea.getSelectionStart(),v=this._textArea.getSelectionEnd();if(!(this._textAreaState.selectionStart===f&&this._textAreaState.selectionEnd===v)){const y=this._textAreaState.deduceEditorPosition(f),L=this._host.deduceModelPosition(y[0],y[1],y[2]),I=this._textAreaState.deduceEditorPosition(v),k=this._host.deduceModelPosition(I[0],I[1],I[2]),E=new c.Selection(L.lineNumber,L.column,k.lineNumber,k.column);this._onSelectionChangeRequest.fire(E)}}}}}})}dispose(){super.dispose(),this._selectionChangeListener&&(this._selectionChangeListener.dispose(),this._selectionChangeListener=null)}focusTextArea(){this._setHasFocus(!0),this.refreshFocusState()}isFocused(){return this._hasFocus}refreshFocusState(){const n=N.getShadowRoot(this.textArea.domNode);n?this._setHasFocus(n.activeElement===this.textArea.domNode):N.isInDOM(this.textArea.domNode)?this._setHasFocus(document.activeElement===this.textArea.domNode):this._setHasFocus(!1)}_setHasFocus(n){this._hasFocus!==n&&(this._hasFocus=n,this._selectionChangeListener&&(this._selectionChangeListener.dispose(),this._selectionChangeListener=null),this._hasFocus&&(this._selectionChangeListener=this._installSelectionChangeListener()),this._hasFocus&&this.writeScreenReaderContent("focusgain"),this._hasFocus?this._onFocus.fire():this._onBlur.fire())}_setAndWriteTextAreaState(n,t){this._hasFocus||(t=t.collapseSelection()),t.writeToTextArea(n,this._textArea,this._hasFocus),this._textAreaState=t}writeScreenReaderContent(n){this._isDoingComposition||this._setAndWriteTextAreaState(n,this._host.getScreenReaderContent(this._textAreaState))}_ensureClipboardGetsEditorSelection(n){const t=this._host.getDataToCopy(u.canUseTextData(n)),l={version:1,isFromEmptySelection:t.isFromEmptySelection,multicursorText:t.multicursorText,mode:t.mode};if(s.INSTANCE.set(b.isFirefox?t.text.replace(/\r\n/g,` +`):t.text,l),!u.canUseTextData(n)){this._setAndWriteTextAreaState("copy or cut",g.TextAreaState.selectedText(t.text));return}u.setTextData(n,t.text,t.html,l)}_firePaste(n,t){t||(t=s.INSTANCE.get(n)),this._onPaste.fire({text:n,metadata:t})}}e.TextAreaInput=a;class u{static canUseTextData(n){return!!(n.clipboardData||window.clipboardData)}static getTextData(n){if(n.clipboardData){n.preventDefault();const t=n.clipboardData.getData("text/plain");let l=null;const h=n.clipboardData.getData("vscode-editor-data");if(typeof h=="string")try{l=JSON.parse(h),l.version!==1&&(l=null)}catch(m){}return[t,l]}if(window.clipboardData)return n.preventDefault(),[window.clipboardData.getData("Text"),null];throw new Error("ClipboardEventUtils.getTextData: Cannot use text data!")}static setTextData(n,t,l,h){if(n.clipboardData){n.clipboardData.setData("text/plain",t),typeof l=="string"&&n.clipboardData.setData("text/html",l),n.clipboardData.setData("vscode-editor-data",JSON.stringify(h)),n.preventDefault();return}if(window.clipboardData){window.clipboardData.setData("Text",t),n.preventDefault();return}throw new Error("ClipboardEventUtils.setTextData: Cannot use text data!")}}class r extends S.Disposable{constructor(n){super();this._actual=n,this._ignoreSelectionChangeTime=0}setIgnoreSelectionChangeTime(n){this._ignoreSelectionChangeTime=Date.now()}getIgnoreSelectionChangeTime(){return this._ignoreSelectionChangeTime}resetSelectionChangeTime(){this._ignoreSelectionChangeTime=0}getValue(){return this._actual.domNode.value}setValue(n,t){const l=this._actual.domNode;l.value!==t&&(this.setIgnoreSelectionChangeTime("setValue"),l.value=t)}getSelectionStart(){return this._actual.domNode.selectionDirection==="backward"?this._actual.domNode.selectionEnd:this._actual.domNode.selectionStart}getSelectionEnd(){return this._actual.domNode.selectionDirection==="backward"?this._actual.domNode.selectionStart:this._actual.domNode.selectionEnd}setSelectionRange(n,t,l){const h=this._actual.domNode;let m=null;const _=N.getShadowRoot(h);_?m=_.activeElement:m=document.activeElement;const f=m===h,v=h.selectionStart,y=h.selectionEnd;if(f&&v===t&&y===l){b.isFirefox&&window.parent!==window&&h.focus();return}if(f){this.setIgnoreSelectionChangeTime("setSelectionRange"),h.setSelectionRange(t,l),b.isFirefox&&window.parent!==window&&h.focus();return}try{const L=N.saveParentsScrollTop(h);this.setIgnoreSelectionChangeTime("setSelectionRange"),h.focus(),h.setSelectionRange(t,l),N.restoreParentsScrollTop(h,L)}catch(L){}}}}),define(Q[92],J([0,1,21]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReplaceCommandThatPreservesSelection=e.ReplaceCommandWithOffsetCursorState=e.ReplaceCommandWithoutChangingPosition=e.ReplaceCommandThatSelectsText=e.ReplaceCommand=void 0;class N{constructor(g,p,c=!1){this._range=g,this._text=p,this.insertsAutoWhitespace=c}getEditOperations(g,p){p.addTrackedEditOperation(this._range,this._text)}computeCursorState(g,p){let o=p.getInverseEditOperations()[0].range;return new b.Selection(o.endLineNumber,o.endColumn,o.endLineNumber,o.endColumn)}}e.ReplaceCommand=N;class M{constructor(g,p){this._range=g,this._text=p}getEditOperations(g,p){p.addTrackedEditOperation(this._range,this._text)}computeCursorState(g,p){const o=p.getInverseEditOperations()[0].range;return new b.Selection(o.startLineNumber,o.startColumn,o.endLineNumber,o.endColumn)}}e.ReplaceCommandThatSelectsText=M;class w{constructor(g,p,c=!1){this._range=g,this._text=p,this.insertsAutoWhitespace=c}getEditOperations(g,p){p.addTrackedEditOperation(this._range,this._text)}computeCursorState(g,p){let o=p.getInverseEditOperations()[0].range;return new b.Selection(o.startLineNumber,o.startColumn,o.startLineNumber,o.startColumn)}}e.ReplaceCommandWithoutChangingPosition=w;class S{constructor(g,p,c,o,s=!1){this._range=g,this._text=p,this._columnDeltaOffset=o,this._lineNumberDeltaOffset=c,this.insertsAutoWhitespace=s}getEditOperations(g,p){p.addTrackedEditOperation(this._range,this._text)}computeCursorState(g,p){let o=p.getInverseEditOperations()[0].range;return new b.Selection(o.endLineNumber+this._lineNumberDeltaOffset,o.endColumn+this._columnDeltaOffset,o.endLineNumber+this._lineNumberDeltaOffset,o.endColumn+this._columnDeltaOffset)}}e.ReplaceCommandWithOffsetCursorState=S;class C{constructor(g,p,c,o=!1){this._range=g,this._text=p,this._initialSelection=c,this._forceMoveMarkers=o,this._selectionId=null}getEditOperations(g,p){p.addTrackedEditOperation(this._range,this._text,this._forceMoveMarkers),this._selectionId=p.trackSelection(this._initialSelection)}computeCursorState(g,p){return p.getTrackedSelection(this._selectionId)}}e.ReplaceCommandThatPreservesSelection=C}),define(Q[367],J([0,1,3,21]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SurroundSelectionCommand=void 0;class M{constructor(S,C,d){this._range=S,this._charBeforeSelection=C,this._charAfterSelection=d}getEditOperations(S,C){C.addTrackedEditOperation(new b.Range(this._range.startLineNumber,this._range.startColumn,this._range.startLineNumber,this._range.startColumn),this._charBeforeSelection),C.addTrackedEditOperation(new b.Range(this._range.endLineNumber,this._range.endColumn,this._range.endLineNumber,this._range.endColumn),this._charAfterSelection)}computeCursorState(S,C){let d=C.getInverseEditOperations(),g=d[0].range,p=d[1].range;return new N.Selection(g.endLineNumber,g.endColumn,p.endLineNumber,p.endColumn-this._charAfterSelection.length)}}e.SurroundSelectionCommand=M}),define(Q[93],J([0,1,8,17,101]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.decodeUTF16LE=e.createStringBuilder=e.hasTextDecoder=e.getPlatformTextDecoder=void 0;let w;function S(){return w||(w=new TextDecoder(N.isLittleEndian()?"UTF-16LE":"UTF-16BE")),w}e.getPlatformTextDecoder=S,e.hasTextDecoder=typeof TextDecoder!="undefined",e.hasTextDecoder?(e.createStringBuilder=c=>new g(c),e.decodeUTF16LE=C):(e.createStringBuilder=c=>new p,e.decodeUTF16LE=d);function C(c,o,s){const a=new Uint16Array(c.buffer,o,s);return S().decode(a)}function d(c,o,s){let a=[],u=0;for(let r=0;r=this._capacity){this._flushBuffer(),this._completedStrings[this._completedStrings.length]=o;return}for(let a=0;a=this._lines.length)throw new Error("Illegal value for lineNumber");return this._lines[p]}onLinesDeleted(g,p){if(this.getCount()===0)return null;const c=this.getStartLineNumber(),o=this.getEndLineNumber();if(po)return null;let s=0,a=0;for(let r=c;r<=o;r++){const i=r-this._rendLineNumberStart;g<=r&&r<=p&&(a===0?(s=i,a=1):a++)}if(g=c&&a<=o&&(this._lines[a-this._rendLineNumberStart].onContentChanged(),s=!0);return s}onLinesInserted(g,p){if(this.getCount()===0)return null;const c=p-g+1,o=this.getStartLineNumber(),s=this.getEndLineNumber();if(g<=o)return this._rendLineNumberStart+=c,null;if(g>s)return null;if(c+g>s)return this._lines.splice(g-this._rendLineNumberStart,s-g+1);const a=[];for(let t=0;tc)){const r=Math.max(p,u.fromLineNumber),i=Math.min(c,u.toLineNumber);for(let n=r;n<=i;n++){const t=n-this._rendLineNumberStart;this._lines[t].onTokensChanged(),o=!0}}}return o}}e.RenderedLinesCollection=w;class S{constructor(g){this._host=g,this.domNode=this._createDomNode(),this._linesCollection=new w(()=>this._host.createVisibleLine())}_createDomNode(){const g=b.createFastDomNode(document.createElement("div"));return g.setClassName("view-layer"),g.setPosition("absolute"),g.domNode.setAttribute("role","presentation"),g.domNode.setAttribute("aria-hidden","true"),g}onConfigurationChanged(g){return!!g.hasChanged(124)}onFlushed(g){return this._linesCollection.flush(),!0}onLinesChanged(g){return this._linesCollection.onLinesChanged(g.fromLineNumber,g.toLineNumber)}onLinesDeleted(g){const p=this._linesCollection.onLinesDeleted(g.fromLineNumber,g.toLineNumber);if(p)for(let c=0,o=p.length;cp){const a=p,u=Math.min(c,s.rendLineNumberStart-1);a<=u&&(this._insertLinesBefore(s,a,u,o,p),s.linesLength+=u-a+1)}else if(s.rendLineNumberStart0&&(this._removeLinesBefore(s,a),s.linesLength-=a)}if(s.rendLineNumberStart=p,s.rendLineNumberStart+s.linesLength-1c){const a=Math.max(0,c-s.rendLineNumberStart+1),r=s.linesLength-1-a+1;r>0&&(this._removeLinesAfter(s,r),s.linesLength-=r)}return this._finishRendering(s,!1,o),s}_renderUntouchedLines(g,p,c,o,s){const a=g.rendLineNumberStart,u=g.lines;for(let r=p;r<=c;r++){const i=a+r;u[r].layoutLine(i,o[i-s])}}_insertLinesBefore(g,p,c,o,s){const a=[];let u=0;for(let r=p;r<=c;r++)a[u++]=this.host.createVisibleLine();g.lines=a.concat(g.lines)}_removeLinesBefore(g,p){for(let c=0;c=0;u--){const r=g.lines[u];o[u]&&(r.setDomNode(a),a=a.previousSibling)}}_finishRenderingInvalidLines(g,p,c){const o=document.createElement("div");C._ttPolicy&&(p=C._ttPolicy.createHTML(p)),o.innerHTML=p;for(let s=0;sd}),C._sb=N.createStringBuilder(1e5)}),define(Q[127],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TokenizationResult2=e.TokenizationResult=e.Token=void 0;class b{constructor(S,C,d){this.offset=S|0,this.type=C,this.language=d}toString(){return"("+this.offset+", "+this.type+")"}}e.Token=b;class N{constructor(S,C){this.tokens=S,this.endState=C}}e.TokenizationResult=N;class M{constructor(S,C){this.tokens=S,this.endState=C}}e.TokenizationResult2=M}),define(Q[368],J([0,1,153,8]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DiffComputer=void 0;const M=3;function w(u,r,i,n){return new b.LcsDiff(u,r,i).ComputeDiff(n)}class S{constructor(r){const i=[],n=[];for(let t=0,l=r.length;t0&&i.originalLength<20&&i.modifiedLength>0&&i.modifiedLength<20&&l()){const I=n.createCharSequence(r,i.originalStart,i.originalStart+i.originalLength-1),k=t.createCharSequence(r,i.modifiedStart,i.modifiedStart+i.modifiedLength-1);let E=w(I,k,l,!0).changes;m&&(E=g(E)),L=[];for(let T=0,O=E.length;T1&&E>1;){const T=L.charCodeAt(k-2),O=I.charCodeAt(E-2);if(T!==O)break;k--,E--}(k>1||E>1)&&this._pushTrimWhitespaceCharChange(t,l+1,1,k,h+1,1,E)}{let k=s(L,1),E=s(I,1);const T=L.length+1,O=I.length+1;for(;k!0;const r=Date.now();return()=>Date.now()-r0&&o>0)&&!(s>0&&a>0)){let u=Math.abs(o-a),r=Math.abs(c-s);if(u===0){g.spacesDiff=r,r>0&&0<=s-1&&s-10?g++:v>1&&p++,N(c,o,h,f,r),!(r.looksLikeAlignment&&!(C&&S===r.spacesDiff)))){let L=r.spacesDiff;L<=a&&u[L]++,c=h,o=f}}let i=C;g!==p&&(i=g{let h=u[l];h>t&&(t=h,n=l)}),n===4&&u[4]>0&&u[2]>0&&u[2]>=u[4]/2&&(n=2)}return{insertSpaces:i,tabSize:n}}e.guessIndentation=M}),define(Q[370],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.intervalCompare=e.recomputeMaxEnd=e.nodeAcceptEdit=e.IntervalTree=e.SENTINEL=e.IntervalNode=e.getNodeIsInOverviewRuler=e.getNodeColor=void 0;function b(D){return(D.metadata&1)>>>0}e.getNodeColor=b;function N(D,R){D.metadata=D.metadata&254|R<<0}function M(D){return(D.metadata&2)>>>1==1}function w(D,R){D.metadata=D.metadata&253|(R?1:0)<<1}function S(D){return(D.metadata&4)>>>2==1}function C(D,R){D.metadata=D.metadata&251|(R?1:0)<<2}function d(D){return(D.metadata&8)>>>3==1}e.getNodeIsInOverviewRuler=d;function g(D,R){D.metadata=D.metadata&247|(R?1:0)<<3}function p(D){return(D.metadata&48)>>>4}function c(D,R){D.metadata=D.metadata&207|R<<4}function o(D){return(D.metadata&64)>>>6==1}function s(D,R){D.metadata=D.metadata&191|(R?1:0)<<6}class a{constructor(R,W,x){this.metadata=0,this.parent=this,this.left=this,this.right=this,N(this,1),this.start=W,this.end=x,this.delta=0,this.maxEnd=x,this.id=R,this.ownerId=0,this.options=null,C(this,!1),c(this,1),g(this,!1),s(this,!1),this.cachedVersionId=0,this.cachedAbsoluteStart=W,this.cachedAbsoluteEnd=x,this.range=null,w(this,!1)}reset(R,W,x,K){this.start=W,this.end=x,this.maxEnd=x,this.cachedVersionId=R,this.cachedAbsoluteStart=W,this.cachedAbsoluteEnd=x,this.range=K}setOptions(R){this.options=R;let W=this.options.className;C(this,W==="squiggly-error"||W==="squiggly-warning"||W==="squiggly-info"),c(this,this.options.stickiness),g(this,!!(this.options.overviewRuler&&this.options.overviewRuler.color)),s(this,this.options.collapseOnReplaceEdit)}setCachedOffsets(R,W,x){this.cachedVersionId!==x&&(this.range=null),this.cachedVersionId=x,this.cachedAbsoluteStart=R,this.cachedAbsoluteEnd=W}detach(){this.parent=null,this.left=null,this.right=null}}e.IntervalNode=a,e.SENTINEL=new a(null,0,0),e.SENTINEL.parent=e.SENTINEL,e.SENTINEL.left=e.SENTINEL,e.SENTINEL.right=e.SENTINEL,N(e.SENTINEL,0);class u{constructor(){this.root=e.SENTINEL,this.requestNormalizeDelta=!1}intervalSearch(R,W,x,K,Y){return this.root===e.SENTINEL?[]:f(this,R,W,x,K,Y)}search(R,W,x){return this.root===e.SENTINEL?[]:_(this,R,W,x)}collectNodesFromOwner(R){return h(this,R)}collectNodesPostOrder(){return m(this)}insert(R){v(this,R),this._normalizeDeltaIfNecessary()}delete(R){L(this,R),this._normalizeDeltaIfNecessary()}resolveNode(R,W){const x=R;let K=0;for(;R!==this.root;)R===R.parent.right&&(K+=R.parent.delta),R=R.parent;const Y=x.start+K,ee=x.end+K;x.setCachedOffsets(Y,ee,W)}acceptReplace(R,W,x,K){const Y=t(this,R,R+W);for(let ee=0,se=Y.length;eeW||x===1?!1:x===2?!0:R}function n(D,R,W,x,K){const Y=p(D),ee=Y===0||Y===2,se=Y===1||Y===2,ne=W-R,le=x,X=Math.min(ne,le),z=D.start;let P=!1;const V=D.end;let U=!1;R<=z&&V<=W&&o(D)&&(D.start=R,P=!0,D.end=R,U=!0);{const $=K?1:ne>0?2:0;!P&&i(z,ee,R,$)&&(P=!0),!U&&i(V,se,R,$)&&(U=!0)}if(X>0&&!K){const $=ne>le?2:0;!P&&i(z,ee,R+X,$)&&(P=!0),!U&&i(V,se,R+X,$)&&(U=!0)}{const $=K?1:0;!P&&i(z,ee,W,$)&&(D.start=R+le,P=!0),!U&&i(V,se,W,$)&&(D.end=R+le,U=!0)}const H=le-ne;P||(D.start=Math.max(0,z+H)),U||(D.end=Math.max(0,V+H)),D.start>D.end&&(D.end=D.start)}e.nodeAcceptEdit=n;function t(D,R,W){let x=D.root,K=0,Y=0,ee=0,se=0,ne=[],le=0;for(;x!==e.SENTINEL;){if(M(x)){w(x.left,!1),w(x.right,!1),x===x.parent.right&&(K-=x.parent.delta),x=x.parent;continue}if(!M(x.left)){if(Y=K+x.maxEnd,YW){w(x,!0);continue}if(se=K+x.end,se>=R&&(x.setCachedOffsets(ee,se,0),ne[le++]=x),w(x,!0),x.right!==e.SENTINEL&&!M(x.right)){K+=x.delta,x=x.right;continue}}return w(D.root,!1),ne}function l(D,R,W,x){let K=D.root,Y=0,ee=0,se=0;const ne=x-(W-R);for(;K!==e.SENTINEL;){if(M(K)){w(K.left,!1),w(K.right,!1),K===K.parent.right&&(Y-=K.parent.delta),A(K),K=K.parent;continue}if(!M(K.left)){if(ee=Y+K.maxEnd,eeW){K.start+=ne,K.end+=ne,K.delta+=ne,(K.delta<-1073741824||K.delta>1073741824)&&(D.requestNormalizeDelta=!0),w(K,!0);continue}if(w(K,!0),K.right!==e.SENTINEL&&!M(K.right)){Y+=K.delta,K=K.right;continue}}w(D.root,!1)}function h(D,R){let W=D.root,x=[],K=0;for(;W!==e.SENTINEL;){if(M(W)){w(W.left,!1),w(W.right,!1),W=W.parent;continue}if(W.left!==e.SENTINEL&&!M(W.left)){W=W.left;continue}if(W.ownerId===R&&(x[K++]=W),w(W,!0),W.right!==e.SENTINEL&&!M(W.right)){W=W.right;continue}}return w(D.root,!1),x}function m(D){let R=D.root,W=[],x=0;for(;R!==e.SENTINEL;){if(M(R)){w(R.left,!1),w(R.right,!1),R=R.parent;continue}if(R.left!==e.SENTINEL&&!M(R.left)){R=R.left;continue}if(R.right!==e.SENTINEL&&!M(R.right)){R=R.right;continue}W[x++]=R,w(R,!0)}return w(D.root,!1),W}function _(D,R,W,x){let K=D.root,Y=0,ee=0,se=0,ne=[],le=0;for(;K!==e.SENTINEL;){if(M(K)){w(K.left,!1),w(K.right,!1),K===K.parent.right&&(Y-=K.parent.delta),K=K.parent;continue}if(K.left!==e.SENTINEL&&!M(K.left)){K=K.left;continue}ee=Y+K.start,se=Y+K.end,K.setCachedOffsets(ee,se,x);let X=!0;if(R&&K.ownerId&&K.ownerId!==R&&(X=!1),W&&S(K)&&(X=!1),X&&(ne[le++]=K),w(K,!0),K.right!==e.SENTINEL&&!M(K.right)){Y+=K.delta,K=K.right;continue}}return w(D.root,!1),ne}function f(D,R,W,x,K,Y){let ee=D.root,se=0,ne=0,le=0,X=0,z=[],P=0;for(;ee!==e.SENTINEL;){if(M(ee)){w(ee.left,!1),w(ee.right,!1),ee===ee.parent.right&&(se-=ee.parent.delta),ee=ee.parent;continue}if(!M(ee.left)){if(ne=se+ee.maxEnd,neW){w(ee,!0);continue}if(X=se+ee.end,X>=R){ee.setCachedOffsets(le,X,Y);let V=!0;x&&ee.ownerId&&ee.ownerId!==x&&(V=!1),K&&S(ee)&&(V=!1),V&&(z[P++]=ee)}if(w(ee,!0),ee.right!==e.SENTINEL&&!M(ee.right)){se+=ee.delta,ee=ee.right;continue}}return w(D.root,!1),z}function v(D,R){if(D.root===e.SENTINEL)return R.parent=e.SENTINEL,R.left=e.SENTINEL,R.right=e.SENTINEL,N(R,0),D.root=R,D.root;y(D,R),B(R.parent);let W=R;for(;W!==D.root&&b(W.parent)===1;)if(W.parent===W.parent.parent.left){const x=W.parent.parent.right;b(x)===1?(N(W.parent,0),N(x,0),N(W.parent.parent,1),W=W.parent.parent):(W===W.parent.right&&(W=W.parent,E(D,W)),N(W.parent,0),N(W.parent.parent,1),T(D,W.parent.parent))}else{const x=W.parent.parent.left;b(x)===1?(N(W.parent,0),N(x,0),N(W.parent.parent,1),W=W.parent.parent):(W===W.parent.left&&(W=W.parent,T(D,W)),N(W.parent,0),N(W.parent.parent,1),E(D,W.parent.parent))}return N(D.root,0),R}function y(D,R){let W=0,x=D.root;const K=R.start,Y=R.end;for(;;)if(F(K,Y,x.start+W,x.end+W)<0)if(x.left===e.SENTINEL){R.start-=W,R.end-=W,R.maxEnd-=W,x.left=R;break}else x=x.left;else if(x.right===e.SENTINEL){R.start-=W+x.delta,R.end-=W+x.delta,R.maxEnd-=W+x.delta,x.right=R;break}else W+=x.delta,x=x.right;R.parent=x,R.left=e.SENTINEL,R.right=e.SENTINEL,N(R,1)}function L(D,R){let W,x;if(R.left===e.SENTINEL?(W=R.right,x=R,W.delta+=R.delta,(W.delta<-1073741824||W.delta>1073741824)&&(D.requestNormalizeDelta=!0),W.start+=R.delta,W.end+=R.delta):R.right===e.SENTINEL?(W=R.left,x=R):(x=I(R.right),W=x.right,W.start+=x.delta,W.end+=x.delta,W.delta+=x.delta,(W.delta<-1073741824||W.delta>1073741824)&&(D.requestNormalizeDelta=!0),x.start+=R.delta,x.end+=R.delta,x.delta=R.delta,(x.delta<-1073741824||x.delta>1073741824)&&(D.requestNormalizeDelta=!0)),x===D.root){D.root=W,N(W,0),R.detach(),k(),A(W),D.root.parent=e.SENTINEL;return}let K=b(x)===1;if(x===x.parent.left?x.parent.left=W:x.parent.right=W,x===R?W.parent=x.parent:(x.parent===R?W.parent=x:W.parent=x.parent,x.left=R.left,x.right=R.right,x.parent=R.parent,N(x,b(R)),R===D.root?D.root=x:R===R.parent.left?R.parent.left=x:R.parent.right=x,x.left!==e.SENTINEL&&(x.left.parent=x),x.right!==e.SENTINEL&&(x.right.parent=x)),R.detach(),K){B(W.parent),x!==R&&(B(x),B(x.parent)),k();return}B(W),B(W.parent),x!==R&&(B(x),B(x.parent));let Y;for(;W!==D.root&&b(W)===0;)W===W.parent.left?(Y=W.parent.right,b(Y)===1&&(N(Y,0),N(W.parent,1),E(D,W.parent),Y=W.parent.right),b(Y.left)===0&&b(Y.right)===0?(N(Y,1),W=W.parent):(b(Y.right)===0&&(N(Y.left,0),N(Y,1),T(D,Y),Y=W.parent.right),N(Y,b(W.parent)),N(W.parent,0),N(Y.right,0),E(D,W.parent),W=D.root)):(Y=W.parent.left,b(Y)===1&&(N(Y,0),N(W.parent,1),T(D,W.parent),Y=W.parent.left),b(Y.left)===0&&b(Y.right)===0?(N(Y,1),W=W.parent):(b(Y.left)===0&&(N(Y.right,0),N(Y,1),E(D,Y),Y=W.parent.left),N(Y,b(W.parent)),N(W.parent,0),N(Y.left,0),T(D,W.parent),W=D.root));N(W,0),k()}function I(D){for(;D.left!==e.SENTINEL;)D=D.left;return D}function k(){e.SENTINEL.parent=e.SENTINEL,e.SENTINEL.delta=0,e.SENTINEL.start=0,e.SENTINEL.end=0}function E(D,R){const W=R.right;W.delta+=R.delta,(W.delta<-1073741824||W.delta>1073741824)&&(D.requestNormalizeDelta=!0),W.start+=R.delta,W.end+=R.delta,R.right=W.left,W.left!==e.SENTINEL&&(W.left.parent=R),W.parent=R.parent,R.parent===e.SENTINEL?D.root=W:R===R.parent.left?R.parent.left=W:R.parent.right=W,W.left=R,R.parent=W,A(R),A(W)}function T(D,R){const W=R.left;R.delta-=W.delta,(R.delta<-1073741824||R.delta>1073741824)&&(D.requestNormalizeDelta=!0),R.start-=W.delta,R.end-=W.delta,R.left=W.right,W.right!==e.SENTINEL&&(W.right.parent=R),W.parent=R.parent,R.parent===e.SENTINEL?D.root=W:R===R.parent.right?R.parent.right=W:R.parent.left=W,W.right=R,R.parent=W,A(R),A(W)}function O(D){let R=D.end;if(D.left!==e.SENTINEL){const W=D.left.maxEnd;W>R&&(R=W)}if(D.right!==e.SENTINEL){const W=D.right.maxEnd+D.delta;W>R&&(R=W)}return R}function A(D){D.maxEnd=O(D)}e.recomputeMaxEnd=A;function B(D){for(;D!==e.SENTINEL;){const R=O(D);if(D.maxEnd===R)return;D.maxEnd=R,D=D.parent}}function F(D,R,W,x){return D===W?R-x:D-W}e.intervalCompare=F}),define(Q[371],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.recomputeTreeMetadata=e.updateTreeMetadata=e.fixInsert=e.rbDelete=e.rightRotate=e.leftRotate=e.resetSentinel=e.calculateLF=e.calculateSize=e.righttest=e.leftest=e.SENTINEL=e.TreeNode=void 0;class b{constructor(u,r){this.piece=u,this.color=r,this.size_left=0,this.lf_left=0,this.parent=this,this.left=this,this.right=this}next(){if(this.right!==e.SENTINEL)return N(this.right);let u=this;for(;u.parent!==e.SENTINEL&&u.parent.left!==u;)u=u.parent;return u.parent===e.SENTINEL?e.SENTINEL:u.parent}prev(){if(this.left!==e.SENTINEL)return M(this.left);let u=this;for(;u.parent!==e.SENTINEL&&u.parent.right!==u;)u=u.parent;return u.parent===e.SENTINEL?e.SENTINEL:u.parent}detach(){this.parent=null,this.left=null,this.right=null}}e.TreeNode=b,e.SENTINEL=new b(null,0),e.SENTINEL.parent=e.SENTINEL,e.SENTINEL.left=e.SENTINEL,e.SENTINEL.right=e.SENTINEL,e.SENTINEL.color=0;function N(a){for(;a.left!==e.SENTINEL;)a=a.left;return a}e.leftest=N;function M(a){for(;a.right!==e.SENTINEL;)a=a.right;return a}e.righttest=M;function w(a){return a===e.SENTINEL?0:a.size_left+a.piece.length+w(a.right)}e.calculateSize=w;function S(a){return a===e.SENTINEL?0:a.lf_left+a.piece.lineFeedCnt+S(a.right)}e.calculateLF=S;function C(){e.SENTINEL.parent=e.SENTINEL}e.resetSentinel=C;function d(a,u){let r=u.right;r.size_left+=u.size_left+(u.piece?u.piece.length:0),r.lf_left+=u.lf_left+(u.piece?u.piece.lineFeedCnt:0),u.right=r.left,r.left!==e.SENTINEL&&(r.left.parent=u),r.parent=u.parent,u.parent===e.SENTINEL?a.root=r:u.parent.left===u?u.parent.left=r:u.parent.right=r,r.left=u,u.parent=r}e.leftRotate=d;function g(a,u){let r=u.left;u.left=r.right,r.right!==e.SENTINEL&&(r.right.parent=u),r.parent=u.parent,u.size_left-=r.size_left+(r.piece?r.piece.length:0),u.lf_left-=r.lf_left+(r.piece?r.piece.lineFeedCnt:0),u.parent===e.SENTINEL?a.root=r:u===u.parent.right?u.parent.right=r:u.parent.left=r,r.right=u,u.parent=r}e.rightRotate=g;function p(a,u){let r,i;if(u.left===e.SENTINEL?(i=u,r=i.right):u.right===e.SENTINEL?(i=u,r=i.left):(i=N(u.right),r=i.right),i===a.root){a.root=r,r.color=0,u.detach(),C(),a.root.parent=e.SENTINEL;return}let n=i.color===1;if(i===i.parent.left?i.parent.left=r:i.parent.right=r,i===u?(r.parent=i.parent,s(a,r)):(i.parent===u?r.parent=i:r.parent=i.parent,s(a,r),i.left=u.left,i.right=u.right,i.parent=u.parent,i.color=u.color,u===a.root?a.root=i:u===u.parent.left?u.parent.left=i:u.parent.right=i,i.left!==e.SENTINEL&&(i.left.parent=i),i.right!==e.SENTINEL&&(i.right.parent=i),i.size_left=u.size_left,i.lf_left=u.lf_left,s(a,i)),u.detach(),r.parent.left===r){let l=w(r),h=S(r);if(l!==r.parent.size_left||h!==r.parent.lf_left){let m=l-r.parent.size_left,_=h-r.parent.lf_left;r.parent.size_left=l,r.parent.lf_left=h,o(a,r.parent,m,_)}}if(s(a,r.parent),n){C();return}let t;for(;r!==a.root&&r.color===0;)r===r.parent.left?(t=r.parent.right,t.color===1&&(t.color=0,r.parent.color=1,d(a,r.parent),t=r.parent.right),t.left.color===0&&t.right.color===0?(t.color=1,r=r.parent):(t.right.color===0&&(t.left.color=0,t.color=1,g(a,t),t=r.parent.right),t.color=r.parent.color,r.parent.color=0,t.right.color=0,d(a,r.parent),r=a.root)):(t=r.parent.left,t.color===1&&(t.color=0,r.parent.color=1,g(a,r.parent),t=r.parent.left),t.left.color===0&&t.right.color===0?(t.color=1,r=r.parent):(t.left.color===0&&(t.right.color=0,t.color=1,d(a,t),t=r.parent.left),t.color=r.parent.color,r.parent.color=0,t.left.color=0,g(a,r.parent),r=a.root));r.color=0,C()}e.rbDelete=p;function c(a,u){for(s(a,u);u!==a.root&&u.parent.color===1;)if(u.parent===u.parent.parent.left){const r=u.parent.parent.right;r.color===1?(u.parent.color=0,r.color=0,u.parent.parent.color=1,u=u.parent.parent):(u===u.parent.right&&(u=u.parent,d(a,u)),u.parent.color=0,u.parent.parent.color=1,g(a,u.parent.parent))}else{const r=u.parent.parent.left;r.color===1?(u.parent.color=0,r.color=0,u.parent.parent.color=1,u=u.parent.parent):(u===u.parent.left&&(u=u.parent,g(a,u)),u.parent.color=0,u.parent.parent.color=1,d(a,u.parent.parent))}a.root.color=0}e.fixInsert=c;function o(a,u,r,i){for(;u!==a.root&&u!==e.SENTINEL;)u.parent.left===u&&(u.parent.size_left+=r,u.parent.lf_left+=i),u=u.parent}e.updateTreeMetadata=o;function s(a,u){let r=0,i=0;if(u!==a.root){if(r===0){for(;u!==a.root&&u===u.parent.right;)u=u.parent;if(u===a.root)return;u=u.parent,r=w(u.left)-u.size_left,i=S(u.left)-u.lf_left,u.size_left+=r,u.lf_left+=i}for(;u!==a.root&&(r!==0||i!==0);)u.parent.left===u&&(u.parent.size_left+=r,u.parent.lf_left+=i),u=u.parent}}e.recomputeTreeMetadata=s}),define(Q[218],J([0,1,101,93]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compressConsecutiveTextChanges=e.TextChange=void 0;function M(d){return d.replace(/\n/g,"\\n").replace(/\r/g,"\\r")}class w{constructor(g,p,c,o){this.oldPosition=g,this.oldText=p,this.newPosition=c,this.newText=o}get oldLength(){return this.oldText.length}get oldEnd(){return this.oldPosition+this.oldText.length}get newLength(){return this.newText.length}get newEnd(){return this.newPosition+this.newText.length}toString(){return this.oldText.length===0?`(insert@${this.oldPosition} "${M(this.newText)}")`:this.newText.length===0?`(delete@${this.oldPosition} "${M(this.oldText)}")`:`(replace@${this.oldPosition} "${M(this.oldText)}" with "${M(this.newText)}")`}static _writeStringSize(g){return 4+2*g.length}static _writeString(g,p,c){const o=p.length;b.writeUInt32BE(g,o,c),c+=4;for(let s=0;s=0;let l=null;try{l=b.createRegExp(this.searchString,this.isRegex,{matchCase:this.matchCase,wholeWord:!1,multiline:t,global:!0,unicode:!0})}catch(m){return null}if(!l)return null;let h=!this.isRegex&&!t;return h&&this.searchString.toLowerCase()!==this.searchString.toUpperCase()&&(h=this.matchCase),new p(l,this.wordSeparators?N.getMapForWordSeparators(this.wordSeparators):null,h?this.searchString:null)}}e.SearchParams=d;function g(n){if(!n||n.length===0)return!1;for(let t=0,l=n.length;t=l)break;const m=n.charCodeAt(t);if(m===110||m===114||m===87||m===119)return!0}return!1}e.isMultilineRegexSource=g;class p{constructor(t,l,h){this.regex=t,this.wordSeparators=l,this.simpleSearch=h}}e.SearchData=p;function c(n,t,l){if(!l)return new S.FindMatch(n,null);let h=[];for(let m=0,_=t.length;m<_;m++)h[m]=t[m];return new S.FindMatch(n,h)}e.createFindMatch=c;class o{constructor(t){let l=[],h=0;for(let m=0,_=t.length;m<_;m++)t.charCodeAt(m)===10&&(l[h++]=m);this._lineFeedsOffsets=l}findLineFeedCountBeforeOffset(t){const l=this._lineFeedsOffsets;let h=0,m=l.length-1;if(m===-1||t<=l[0])return 0;for(;h>0);l[_]>=t?m=_-1:l[_+1]>=t?(h=_,m=_):h=_+1}return h+1}}class s{static findMatches(t,l,h,m,_){const f=l.parseSearchRequest();return f?f.regex.multiline?this._doFindMatchesMultiline(t,h,new i(f.wordSeparators,f.regex),m,_):this._doFindMatchesLineByLine(t,h,f,m,_):[]}static _getMultilineMatchRange(t,l,h,m,_,f){let v,y=0;m?(y=m.findLineFeedCountBeforeOffset(_),v=l+_+y):v=l+_;let L;if(m){let T=m.findLineFeedCountBeforeOffset(_+f.length)-y;L=v+f.length+T}else L=v+f.length;const I=t.getPositionAt(v),k=t.getPositionAt(L);return new w.Range(I.lineNumber,I.column,k.lineNumber,k.column)}static _doFindMatchesMultiline(t,l,h,m,_){const f=t.getOffsetAt(l.getStartPosition()),v=t.getValueInRange(l,1),y=t.getEOL()===`\r +`?new o(v):null,L=[];let I=0,k;for(h.reset(0);k=h.next(v);)if(L[I++]=c(this._getMultilineMatchRange(t,f,v,y,k.index,k[0]),k,m),I>=_)return L;return L}static _doFindMatchesLineByLine(t,l,h,m,_){const f=[];let v=0;if(l.startLineNumber===l.endLineNumber){const L=t.getLineContent(l.startLineNumber).substring(l.startColumn-1,l.endColumn-1);return v=this._findMatchesInLine(h,L,l.startLineNumber,l.startColumn-1,v,f,m,_),f}const y=t.getLineContent(l.startLineNumber).substring(l.startColumn-1);v=this._findMatchesInLine(h,y,l.startLineNumber,l.startColumn-1,v,f,m,_);for(let L=l.startLineNumber+1;L=y))return _;return _}const I=new i(t.wordSeparators,t.regex);let k;I.reset(0);do if(k=I.next(l),k&&(f[_++]=c(new w.Range(h,k.index+1+m,h,k.index+1+k[0].length+m),k,v),_>=y))return _;while(k);return _}static findNextMatch(t,l,h,m){const _=l.parseSearchRequest();if(!_)return null;const f=new i(_.wordSeparators,_.regex);return _.regex.multiline?this._doFindNextMatchMultiline(t,h,f,m):this._doFindNextMatchLineByLine(t,h,f,m)}static _doFindNextMatchMultiline(t,l,h,m){const _=new M.Position(l.lineNumber,1),f=t.getOffsetAt(_),v=t.getLineCount(),y=t.getValueInRange(new w.Range(_.lineNumber,_.column,v,t.getLineMaxColumn(v)),1),L=t.getEOL()===`\r +`?new o(y):null;h.reset(l.column-1);let I=h.next(y);return I?c(this._getMultilineMatchRange(t,f,y,L,I.index,I[0]),I,m):l.lineNumber!==1||l.column!==1?this._doFindNextMatchMultiline(t,new M.Position(1,1),h,m):null}static _doFindNextMatchLineByLine(t,l,h,m){const _=t.getLineCount(),f=l.lineNumber,v=t.getLineContent(f),y=this._findFirstMatchInLine(h,v,f,l.column,m);if(y)return y;for(let L=1;L<=_;L++){const I=(f+L-1)%_,k=t.getLineContent(I+1),E=this._findFirstMatchInLine(h,k,I+1,1,m);if(E)return E}return null}static _findFirstMatchInLine(t,l,h,m,_){t.reset(m-1);const f=t.next(l);return f?c(new w.Range(h,f.index+1,h,f.index+1+f[0].length),f,_):null}static findPreviousMatch(t,l,h,m){const _=l.parseSearchRequest();if(!_)return null;const f=new i(_.wordSeparators,_.regex);return _.regex.multiline?this._doFindPreviousMatchMultiline(t,h,f,m):this._doFindPreviousMatchLineByLine(t,h,f,m)}static _doFindPreviousMatchMultiline(t,l,h,m){const _=this._doFindMatchesMultiline(t,new w.Range(1,1,l.lineNumber,l.column),h,m,10*C);if(_.length>0)return _[_.length-1];const f=t.getLineCount();return l.lineNumber!==f||l.column!==t.getLineMaxColumn(f)?this._doFindPreviousMatchMultiline(t,new M.Position(f,t.getLineMaxColumn(f)),h,m):null}static _doFindPreviousMatchLineByLine(t,l,h,m){const _=t.getLineCount(),f=l.lineNumber,v=t.getLineContent(f).substring(0,l.column-1),y=this._findLastMatchInLine(h,v,f,m);if(y)return y;for(let L=1;L<=_;L++){const I=(_+f-L-1)%_,k=t.getLineContent(I+1),E=this._findLastMatchInLine(h,k,I+1,m);if(E)return E}return null}static _findLastMatchInLine(t,l,h,m){let _=null,f;for(t.reset(0);f=t.next(l);)_=c(new w.Range(h,f.index+1,h,f.index+1+f[0].length),f,m);return _}}e.TextModelSearch=s;function a(n,t,l,h,m){if(h===0)return!0;const _=t.charCodeAt(h-1);if(n.get(_)!==0||_===13||_===10)return!0;if(m>0){const f=t.charCodeAt(h);if(n.get(f)!==0)return!0}return!1}function u(n,t,l,h,m){if(h+m===l)return!0;const _=t.charCodeAt(h+m);if(n.get(_)!==0||_===13||_===10)return!0;if(m>0){const f=t.charCodeAt(h+m-1);if(n.get(f)!==0)return!0}return!1}function r(n,t,l,h,m){return a(n,t,l,h,m)&&u(n,t,l,h,m)}e.isValidMatch=r;class i{constructor(t,l){this._wordSeparators=t,this._searchRegex=l,this._prevMatchStartIndex=-1,this._prevMatchLength=0}reset(t){this._searchRegex.lastIndex=t,this._prevMatchStartIndex=-1,this._prevMatchLength=0}next(t){const l=t.length;let h;do{if(this._prevMatchStartIndex+this._prevMatchLength===l||(h=this._searchRegex.exec(t),!h))return null;const m=h.index,_=h[0].length;if(m===this._prevMatchStartIndex&&_===this._prevMatchLength){if(_===0){b.getNextCodePoint(t,l,this._searchRegex.lastIndex)>65535?this._searchRegex.lastIndex+=2:this._searchRegex.lastIndex+=1;continue}return null}if(this._prevMatchStartIndex=m,this._prevMatchLength=_,!this._wordSeparators||r(this._wordSeparators,t,l,m,_))return h}while(h);return null}}e.Searcher=i}),define(Q[219],J([0,1,14,3,53,371,166]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PieceTreeBase=e.StringBuffer=e.Piece=e.createLineStarts=e.createLineStartsFast=e.LineStarts=e.createUintArray=e.AverageBufferSize=void 0,e.AverageBufferSize=65535;function C(r){let i;return r[r.length-1]<65536?i=new Uint16Array(r.length):i=new Uint32Array(r.length),i.set(r,0),i}e.createUintArray=C;class d{constructor(i,n,t,l,h){this.lineStarts=i,this.cr=n,this.lf=t,this.crlf=l,this.isBasicASCII=h}}e.LineStarts=d;function g(r,i=!0){let n=[0],t=1;for(let l=0,h=r.length;l126)&&(m=!1)}const _=new d(C(r),t,l,h,m);return r.length=0,_}e.createLineStarts=p;class c{constructor(i,n,t,l,h){this.bufferIndex=i,this.start=n,this.end=t,this.lineFeedCnt=l,this.length=h}}e.Piece=c;class o{constructor(i,n){this.buffer=i,this.lineStarts=n}}e.StringBuffer=o;class s{constructor(i,n){this._pieces=[],this._tree=i,this._BOM=n,this._index=0,i.root!==w.SENTINEL&&i.iterate(i.root,t=>(t!==w.SENTINEL&&this._pieces.push(t.piece),!0))}read(){return this._pieces.length===0?this._index===0?(this._index++,this._BOM):null:this._index>this._pieces.length-1?null:this._index===0?this._BOM+this._tree.getPieceContent(this._pieces[this._index++]):this._tree.getPieceContent(this._pieces[this._index++])}}class a{constructor(i){this._limit=i,this._cache=[]}get(i){for(let n=this._cache.length-1;n>=0;n--){let t=this._cache[n];if(t.nodeStartOffset<=i&&t.nodeStartOffset+t.node.piece.length>=i)return t}return null}get2(i){for(let n=this._cache.length-1;n>=0;n--){let t=this._cache[n];if(t.nodeStartLineNumber&&t.nodeStartLineNumber=i)return t}return null}set(i){this._cache.length>=this._limit&&this._cache.shift(),this._cache.push(i)}validate(i){let n=!1,t=this._cache;for(let l=0;l=i){t[l]=null,n=!0;continue}}if(n){let l=[];for(const h of t)h!==null&&l.push(h);this._cache=l}}}class u{constructor(i,n,t){this.create(i,n,t)}create(i,n,t){this._buffers=[new o("",[0])],this._lastChangeBufferPos={line:0,column:0},this.root=w.SENTINEL,this._lineCnt=1,this._length=0,this._EOL=n,this._EOLLength=n.length,this._EOLNormalized=t;let l=null;for(let h=0,m=i.length;h0){i[h].lineStarts||(i[h].lineStarts=g(i[h].buffer));let _=new c(h+1,{line:0,column:0},{line:i[h].lineStarts.length-1,column:i[h].buffer.length-i[h].lineStarts[i[h].lineStarts.length-1]},i[h].lineStarts.length-1,i[h].buffer.length);this._buffers.push(i[h]),l=this.rbInsertRight(l,_)}this._searchCache=new a(1),this._lastVisitedLine={lineNumber:0,value:""},this.computeBufferMetadata()}normalizeEOL(i){let n=e.AverageBufferSize,t=n-Math.floor(n/3),l=t*2,h="",m=0,_=[];if(this.iterate(this.root,f=>{let v=this.getNodeContent(f),y=v.length;if(m<=t||m+y0){let f=h.replace(/\r\n|\r|\n/g,i);_.push(new o(f,g(f)))}this.create(_,i,!0)}getEOL(){return this._EOL}setEOL(i){this._EOL=i,this._EOLLength=this._EOL.length,this.normalizeEOL(i)}createSnapshot(i){return new s(this,i)}getOffsetAt(i,n){let t=0,l=this.root;for(;l!==w.SENTINEL;)if(l.left!==w.SENTINEL&&l.lf_left+1>=i)l=l.left;else{if(l.lf_left+l.piece.lineFeedCnt+1>=i)return t+=l.size_left,t+=this.getAccumulatedValue(l,i-l.lf_left-2)+n-1;i-=l.lf_left+l.piece.lineFeedCnt,t+=l.size_left+l.piece.length,l=l.right}return t}getPositionAt(i){i=Math.floor(i),i=Math.max(0,i);let n=this.root,t=0,l=i;for(;n!==w.SENTINEL;)if(n.size_left!==0&&n.size_left>=i)n=n.left;else if(n.size_left+n.piece.length>=i){let h=this.getIndexOf(n,i-n.size_left);if(t+=n.lf_left+h.index,h.index===0){let m=this.getOffsetAt(t+1,1),_=l-m;return new b.Position(t+1,_+1)}return new b.Position(t+1,h.remainder+1)}else if(i-=n.size_left+n.piece.length,t+=n.lf_left+n.piece.lineFeedCnt,n.right===w.SENTINEL){let h=this.getOffsetAt(t+1,1),m=l-i-h;return new b.Position(t+1,m+1)}else n=n.right;return new b.Position(1,1)}getValueInRange(i,n){if(i.startLineNumber===i.endLineNumber&&i.startColumn===i.endColumn)return"";let t=this.nodeAt2(i.startLineNumber,i.startColumn),l=this.nodeAt2(i.endLineNumber,i.endColumn),h=this.getValueInRange2(t,l);return n?n!==this._EOL||!this._EOLNormalized?h.replace(/\r\n|\r|\n/g,n):n===this.getEOL()&&this._EOLNormalized?h:h.replace(/\r\n|\r|\n/g,n):h}getValueInRange2(i,n){if(i.node===n.node){let _=i.node,f=this._buffers[_.piece.bufferIndex].buffer,v=this.offsetInBuffer(_.piece.bufferIndex,_.piece.start);return f.substring(v+i.remainder,v+n.remainder)}let t=i.node,l=this._buffers[t.piece.bufferIndex].buffer,h=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start),m=l.substring(h+i.remainder,h+t.piece.length);for(t=t.next();t!==w.SENTINEL;){let _=this._buffers[t.piece.bufferIndex].buffer,f=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start);if(t===n.node){m+=_.substring(f,f+n.remainder);break}else m+=_.substr(f,t.piece.length);t=t.next()}return m}getLinesContent(){let i=[],n=0,t="",l=!1;return this.iterate(this.root,h=>{if(h===w.SENTINEL)return!0;const m=h.piece;let _=m.length;if(_===0)return!0;const f=this._buffers[m.bufferIndex].buffer,v=this._buffers[m.bufferIndex].lineStarts,y=m.start.line,L=m.end.line;let I=v[y]+m.start.column;if(l&&(f.charCodeAt(I)===10&&(I++,_--),i[n++]=t,t="",l=!1,_===0))return!0;if(y===L)return!this._EOLNormalized&&f.charCodeAt(I+_-1)===13?(l=!0,t+=f.substr(I,_-1)):t+=f.substr(I,_),!0;t+=this._EOLNormalized?f.substring(I,Math.max(I,v[y+1]-this._EOLLength)):f.substring(I,v[y+1]).replace(/(\r\n|\r|\n)$/,""),i[n++]=t;for(let k=y+1;kD+E,n.reset(0)):(B=I.buffer,F=D=>D,n.reset(E));do if(O=n.next(B),O){if(F(O.index)>=T)return y;this.positionInBuffer(i,F(O.index)-k,A);let D=this.getLineFeedCnt(i.piece.bufferIndex,h,A),R=A.line===h.line?A.column-h.column+l:A.column+1,W=R+O[0].length;if(L[y++]=S.createFindMatch(new N.Range(t+D,R,t+D,W),O,f),F(O.index)+O[0].length>=T||y>=v)return y}while(O);return y}findMatchesLineByLine(i,n,t,l){const h=[];let m=0;const _=new S.Searcher(n.wordSeparators,n.regex);let f=this.nodeAt2(i.startLineNumber,i.startColumn);if(f===null)return[];let v=this.nodeAt2(i.endLineNumber,i.endColumn);if(v===null)return[];let y=this.positionInBuffer(f.node,f.remainder),L=this.positionInBuffer(v.node,v.remainder);if(f.node===v.node)return this.findMatchesInNode(f.node,_,i.startLineNumber,i.startColumn,y,L,n,t,l,m,h),h;let I=i.startLineNumber,k=f.node;for(;k!==v.node;){let T=this.getLineFeedCnt(k.piece.bufferIndex,y,k.piece.end);if(T>=1){let A=this._buffers[k.piece.bufferIndex].lineStarts,B=this.offsetInBuffer(k.piece.bufferIndex,k.piece.start),F=A[y.line+T],D=I===i.startLineNumber?i.startColumn:1;if(m=this.findMatchesInNode(k,_,I,D,y,this.positionInBuffer(k,F-B),n,t,l,m,h),m>=l)return h;I+=T}let O=I===i.startLineNumber?i.startColumn-1:0;if(I===i.endLineNumber){const A=this.getLineContent(I).substring(O,i.endColumn-1);return m=this._findMatchesInLine(n,_,A,i.endLineNumber,O,m,h,t,l),h}if(m=this._findMatchesInLine(n,_,this.getLineContent(I).substr(O),I,O,m,h,t,l),m>=l)return h;I++,f=this.nodeAt2(I,1),k=f.node,y=this.positionInBuffer(f.node,f.remainder)}if(I===i.endLineNumber){let T=I===i.startLineNumber?i.startColumn-1:0;const O=this.getLineContent(I).substring(T,i.endColumn-1);return m=this._findMatchesInLine(n,_,O,i.endLineNumber,T,m,h,t,l),h}let E=I===i.startLineNumber?i.startColumn:1;return m=this.findMatchesInNode(v.node,_,I,E,y,L,n,t,l,m,h),h}_findMatchesInLine(i,n,t,l,h,m,_,f,v){const y=i.wordSeparators;if(!f&&i.simpleSearch){const I=i.simpleSearch,k=I.length,E=t.length;let T=-k;for(;(T=t.indexOf(I,T+k))!==-1;)if((!y||S.isValidMatch(y,t,E,T,k))&&(_[m++]=new M.FindMatch(new N.Range(l,T+1+h,l,T+1+k+h),null),m>=v))return m;return m}let L;n.reset(0);do if(L=n.next(t),L&&(_[m++]=S.createFindMatch(new N.Range(l,L.index+1+h,l,L.index+1+L[0].length+h),L,f),m>=v))return m;while(L);return m}insert(i,n,t=!1){if(this._EOLNormalized=this._EOLNormalized&&t,this._lastVisitedLine.lineNumber=0,this._lastVisitedLine.value="",this.root!==w.SENTINEL){let{node:l,remainder:h,nodeStartOffset:m}=this.nodeAt(i),_=l.piece,f=_.bufferIndex,v=this.positionInBuffer(l,h);if(l.piece.bufferIndex===0&&_.end.line===this._lastChangeBufferPos.line&&_.end.column===this._lastChangeBufferPos.column&&m+_.length===i&&n.lengthi){let y=[],L=new c(_.bufferIndex,v,_.end,this.getLineFeedCnt(_.bufferIndex,v,_.end),this.offsetInBuffer(f,_.end)-this.offsetInBuffer(f,v));if(this.shouldCheckCRLF()&&this.endWithCR(n)&&this.nodeCharCodeAt(l,h)===10){let T={line:L.start.line+1,column:0};L=new c(L.bufferIndex,T,L.end,this.getLineFeedCnt(L.bufferIndex,T,L.end),L.length-1),n+=` +`}if(this.shouldCheckCRLF()&&this.startWithLF(n))if(this.nodeCharCodeAt(l,h-1)===13){let T=this.positionInBuffer(l,h-1);this.deleteNodeTail(l,T),n="\r"+n,l.piece.length===0&&y.push(l)}else this.deleteNodeTail(l,v);else this.deleteNodeTail(l,v);let I=this.createNewPieces(n);L.length>0&&this.rbInsertRight(l,L);let k=l;for(let E=0;E=0;m--)h=this.rbInsertLeft(h,l[m]);this.validateCRLFWithPrevNode(h),this.deleteNodes(t)}insertContentToNodeRight(i,n){this.adjustCarriageReturnFromNext(i,n)&&(i+=` +`);let t=this.createNewPieces(i),l=this.rbInsertRight(n,t[0]),h=l;for(let m=1;m=I)v=L+1;else break;return t?(t.line=L,t.column=f-k,null):{line:L,column:f-k}}getLineFeedCnt(i,n,t){if(t.column===0)return t.line-n.line;let l=this._buffers[i].lineStarts;if(t.line===l.length-1)return t.line-n.line;let h=l[t.line+1],m=l[t.line]+t.column;if(h>m+1)return t.line-n.line;let _=m-1;return this._buffers[i].buffer.charCodeAt(_)===13?t.line-n.line+1:t.line-n.line}offsetInBuffer(i,n){return this._buffers[i].lineStarts[n.line]+n.column}deleteNodes(i){for(let n=0;ne.AverageBufferSize){let y=[];for(;i.length>e.AverageBufferSize;){const I=i.charCodeAt(e.AverageBufferSize-1);let k;I===13||I>=55296&&I<=56319?(k=i.substring(0,e.AverageBufferSize-1),i=i.substring(e.AverageBufferSize-1)):(k=i.substring(0,e.AverageBufferSize),i=i.substring(e.AverageBufferSize));let E=g(k);y.push(new c(this._buffers.length,{line:0,column:0},{line:E.length-1,column:k.length-E[E.length-1]},E.length-1,k.length)),this._buffers.push(new o(k,E))}let L=g(i);return y.push(new c(this._buffers.length,{line:0,column:0},{line:L.length-1,column:i.length-L[L.length-1]},L.length-1,i.length)),this._buffers.push(new o(i,L)),y}let n=this._buffers[0].buffer.length;const t=g(i,!1);let l=this._lastChangeBufferPos;if(this._buffers[0].lineStarts[this._buffers[0].lineStarts.length-1]===n&&n!==0&&this.startWithLF(i)&&this.endWithCR(this._buffers[0].buffer)){this._lastChangeBufferPos={line:this._lastChangeBufferPos.line,column:this._lastChangeBufferPos.column+1},l=this._lastChangeBufferPos;for(let y=0;y=i-1)t=t.left;else if(t.lf_left+t.piece.lineFeedCnt>i-1){let f=this.getAccumulatedValue(t,i-t.lf_left-2),v=this.getAccumulatedValue(t,i-t.lf_left-1),y=this._buffers[t.piece.bufferIndex].buffer,L=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start);return m+=t.size_left,this._searchCache.set({node:t,nodeStartOffset:m,nodeStartLineNumber:_-(i-1-t.lf_left)}),y.substring(L+f,L+v-n)}else if(t.lf_left+t.piece.lineFeedCnt===i-1){let f=this.getAccumulatedValue(t,i-t.lf_left-2),v=this._buffers[t.piece.bufferIndex].buffer,y=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start);l=v.substring(y+f,y+t.piece.length);break}else i-=t.lf_left+t.piece.lineFeedCnt,m+=t.size_left+t.piece.length,t=t.right}for(t=t.next();t!==w.SENTINEL;){let m=this._buffers[t.piece.bufferIndex].buffer;if(t.piece.lineFeedCnt>0){let _=this.getAccumulatedValue(t,0),f=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start);return l+=m.substring(f,f+_-n),l}else{let _=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start);l+=m.substr(_,t.piece.length)}t=t.next()}return l}computeBufferMetadata(){let i=this.root,n=1,t=0;for(;i!==w.SENTINEL;)n+=i.lf_left+i.piece.lineFeedCnt,t+=i.size_left+i.piece.length,i=i.right;this._lineCnt=n,this._length=t,this._searchCache.validate(this._length)}getIndexOf(i,n){let t=i.piece,l=this.positionInBuffer(i,n),h=l.line-t.start.line;if(this.offsetInBuffer(t.bufferIndex,t.end)-this.offsetInBuffer(t.bufferIndex,t.start)===n){let m=this.getLineFeedCnt(i.piece.bufferIndex,t.start,l);if(m!==h)return{index:m,remainder:0}}return{index:h,remainder:l.column}}getAccumulatedValue(i,n){if(n<0)return 0;let t=i.piece,l=this._buffers[t.bufferIndex].lineStarts,h=t.start.line+n+1;return h>t.end.line?l[t.end.line]+t.end.column-l[t.start.line]-t.start.column:l[h]-l[t.start.line]-t.start.column}deleteNodeTail(i,n){const t=i.piece,l=t.lineFeedCnt,h=this.offsetInBuffer(t.bufferIndex,t.end),m=n,_=this.offsetInBuffer(t.bufferIndex,m),f=this.getLineFeedCnt(t.bufferIndex,t.start,m),v=f-l,y=_-h,L=t.length+y;i.piece=new c(t.bufferIndex,t.start,m,f,L),w.updateTreeMetadata(this,i,y,v)}deleteNodeHead(i,n){const t=i.piece,l=t.lineFeedCnt,h=this.offsetInBuffer(t.bufferIndex,t.start),m=n,_=this.getLineFeedCnt(t.bufferIndex,m,t.end),f=this.offsetInBuffer(t.bufferIndex,m),v=_-l,y=h-f,L=t.length+y;i.piece=new c(t.bufferIndex,m,t.end,_,L),w.updateTreeMetadata(this,i,y,v)}shrinkNode(i,n,t){const l=i.piece,h=l.start,m=l.end,_=l.length,f=l.lineFeedCnt,v=n,y=this.getLineFeedCnt(l.bufferIndex,l.start,v),L=this.offsetInBuffer(l.bufferIndex,n)-this.offsetInBuffer(l.bufferIndex,h);i.piece=new c(l.bufferIndex,l.start,v,y,L),w.updateTreeMetadata(this,i,L-_,y-f);let I=new c(l.bufferIndex,t,m,this.getLineFeedCnt(l.bufferIndex,t,m),this.offsetInBuffer(l.bufferIndex,m)-this.offsetInBuffer(l.bufferIndex,t)),k=this.rbInsertRight(i,I);this.validateCRLFWithPrevNode(k)}appendToNode(i,n){this.adjustCarriageReturnFromNext(n,i)&&(n+=` +`);const t=this.shouldCheckCRLF()&&this.startWithLF(n)&&this.endWithCR(i),l=this._buffers[0].buffer.length;this._buffers[0].buffer+=n;const h=g(n,!1);for(let k=0;ki)n=n.left;else if(n.size_left+n.piece.length>=i){l+=n.size_left;let h={node:n,remainder:i-n.size_left,nodeStartOffset:l};return this._searchCache.set(h),h}else i-=n.size_left+n.piece.length,l+=n.size_left+n.piece.length,n=n.right;return null}nodeAt2(i,n){let t=this.root,l=0;for(;t!==w.SENTINEL;)if(t.left!==w.SENTINEL&&t.lf_left>=i-1)t=t.left;else if(t.lf_left+t.piece.lineFeedCnt>i-1){let h=this.getAccumulatedValue(t,i-t.lf_left-2),m=this.getAccumulatedValue(t,i-t.lf_left-1);return l+=t.size_left,{node:t,remainder:Math.min(h+n-1,m),nodeStartOffset:l}}else if(t.lf_left+t.piece.lineFeedCnt===i-1){let h=this.getAccumulatedValue(t,i-t.lf_left-2);if(h+n-1<=t.piece.length)return{node:t,remainder:h+n-1,nodeStartOffset:l};n-=t.piece.length-h;break}else i-=t.lf_left+t.piece.lineFeedCnt,l+=t.size_left+t.piece.length,t=t.right;for(t=t.next();t!==w.SENTINEL;){if(t.piece.lineFeedCnt>0){let h=this.getAccumulatedValue(t,0),m=this.offsetOfNode(t);return{node:t,remainder:Math.min(n-1,h),nodeStartOffset:m}}else if(t.piece.length>=n-1){let h=this.offsetOfNode(t);return{node:t,remainder:n-1,nodeStartOffset:h}}else n-=t.piece.length;t=t.next()}return null}nodeCharCodeAt(i,n){if(i.piece.lineFeedCnt<1)return-1;let t=this._buffers[i.piece.bufferIndex],l=this.offsetInBuffer(i.piece.bufferIndex,i.piece.start)+n;return t.buffer.charCodeAt(l)}offsetOfNode(i){if(!i)return 0;let n=i.size_left;for(;i!==this.root;)i.parent.right===i&&(n+=i.parent.size_left+i.parent.piece.length),i=i.parent;return n}shouldCheckCRLF(){return!(this._EOLNormalized&&this._EOL===` +`)}startWithLF(i){if(typeof i=="string")return i.charCodeAt(0)===10;if(i===w.SENTINEL||i.piece.lineFeedCnt===0)return!1;let n=i.piece,t=this._buffers[n.bufferIndex].lineStarts,l=n.start.line,h=t[l]+n.start.column;return l===t.length-1||t[l+1]>h+1?!1:this._buffers[n.bufferIndex].buffer.charCodeAt(h)===10}endWithCR(i){return typeof i=="string"?i.charCodeAt(i.length-1)===13:i===w.SENTINEL||i.piece.lineFeedCnt===0?!1:this.nodeCharCodeAt(i,i.piece.length-1)===13}validateCRLFWithPrevNode(i){if(this.shouldCheckCRLF()&&this.startWithLF(i)){let n=i.prev();this.endWithCR(n)&&this.fixCRLF(n,i)}}validateCRLFWithNextNode(i){if(this.shouldCheckCRLF()&&this.endWithCR(i)){let n=i.next();this.startWithLF(n)&&this.fixCRLF(i,n)}}fixCRLF(i,n){let t=[],l=this._buffers[i.piece.bufferIndex].lineStarts,h;i.piece.end.column===0?h={line:i.piece.end.line-1,column:l[i.piece.end.line]-l[i.piece.end.line-1]-1}:h={line:i.piece.end.line,column:i.piece.end.column-1};const m=i.piece.length-1,_=i.piece.lineFeedCnt-1;i.piece=new c(i.piece.bufferIndex,i.piece.start,h,_,m),w.updateTreeMetadata(this,i,-1,-1),i.piece.length===0&&t.push(i);let f={line:n.piece.start.line+1,column:0};const v=n.piece.length-1,y=this.getLineFeedCnt(n.piece.bufferIndex,f,n.piece.end);n.piece=new c(n.piece.bufferIndex,f,n.piece.end,y,v),w.updateTreeMetadata(this,n,-1,-1),n.piece.length===0&&t.push(n);let L=this.createNewPieces(`\r +`);this.rbInsertRight(i,L[0]);for(let I=0;I/?";function b(C=""){let d="(-?\\d*\\.\\d\\w*)|([^";for(const g of e.USUAL_WORD_SEPARATORS)C.indexOf(g)>=0||(d+="\\"+g);return d+="\\s]+)",new RegExp(d,"g")}e.DEFAULT_WORD_REGEXP=b();function N(C){let d=e.DEFAULT_WORD_REGEXP;if(C&&C instanceof RegExp)if(C.global)d=C;else{let g="g";C.ignoreCase&&(g+="i"),C.multiline&&(g+="m"),C.unicode&&(g+="u"),d=new RegExp(C.source,g)}return d.lastIndex=0,d}e.ensureValidWordDefinition=N;const M={maxLen:1e3,windowSize:15,timeBudget:150};function w(C,d,g,p,c=M){if(g.length>c.maxLen){let r=C-c.maxLen/2;return r<0?r=0:p+=r,g=g.substring(r,C+c.maxLen/2),w(C,d,g,p,c)}const o=Date.now(),s=C-1-p;let a=-1,u=null;for(let r=1;!(Date.now()-o>=c.timeBudget);r++){const i=s-c.windowSize*r;d.lastIndex=Math.max(0,i);const n=S(d,g,s,a);if(!n&&u||(u=n,i<=0))break;a=i}if(u){let r={word:u[0],startColumn:p+1+u.index,endColumn:p+1+u.index+u[0].length};return d.lastIndex=0,r}return null}e.getWordAtText=w;function S(C,d,g,p){let c;for(;c=C.exec(d);){const o=c.index||0;if(o<=g&&C.lastIndex>=g)return c;if(p>0&&o>p)return null}return null}}),define(Q[373],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FrankensteinMode=void 0;class b{constructor(M){this._languageIdentifier=M}getId(){return this._languageIdentifier.language}}e.FrankensteinMode=b}),define(Q[109],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AutoClosingPairs=e.StandardAutoClosingPairConditional=e.IndentAction=void 0;var b;(function(S){S[S.None=0]="None",S[S.Indent=1]="Indent",S[S.IndentOutdent=2]="IndentOutdent",S[S.Outdent=3]="Outdent"})(b=e.IndentAction||(e.IndentAction={}));class N{constructor(C){if(this.open=C.open,this.close=C.close,this._standardTokenMask=0,Array.isArray(C.notIn))for(let d=0,g=C.notIn.length;dg&&(g=c)}return g}else{if(typeof w=="string")return d?w==="*"?5:w===C?10:0:0;if(w){const{language:g,pattern:p,scheme:c,hasAccessToAllModels:o}=w;if(!d&&!o)return 0;let s=0;if(c)if(c===S.scheme)s=10;else if(c==="*")s=5;else return 0;if(g)if(g===C)s=10;else if(g==="*")s=Math.max(s,5);else return 0;if(p){let a;if(typeof p=="string"?a=p:a=Object.assign(Object.assign({},p),{base:N.normalize(p.base)}),a===S.fsPath||b.match(a,S.fsPath))s=10;else return 0}return s}else return 0}}e.score=M}),define(Q[375],J([0,1,91]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.computeLinks=e.LinkComputer=e.StateMachine=e.Uint8Matrix=void 0;class N{constructor(o,s,a){const u=new Uint8Array(o*s);for(let r=0,i=o*s;rs&&(s=t),n>a&&(a=n),l>a&&(a=l)}s++,a++;let u=new N(a,s,0);for(let r=0,i=o.length;r=this._maxCharCode?0:this._states.get(o,s)}}e.StateMachine=M;let w=null;function S(){return w===null&&(w=new M([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),w}let C=null;function d(){if(C===null){C=new b.CharacterClassifier(0);const c=` <>'"\u3001\u3002\uFF61\uFF64\uFF0C\uFF0E\uFF1A\uFF1B\u2018\u201C\u3008\u300A\u300C\u300E\u3010\u3014\uFF08\uFF3B\uFF5B\uFF62\uFF63\uFF5D\uFF3D\uFF09\u3015\u3011\u300F\u300D\u300B\u3009\u201D\u2019\uFF40\uFF5E\u2026`;for(let s=0;su);if(u>0){const n=s.charCodeAt(u-1),t=s.charCodeAt(i);(n===40&&t===41||n===91&&t===93||n===123&&t===125)&&i--}return{range:{startLineNumber:a,startColumn:u+1,endLineNumber:a,endColumn:i+2},url:s.substring(u,i+1)}}static computeLinks(o,s=S()){const a=d();let u=[];for(let r=1,i=o.getLineCount();r<=i;r++){const n=o.getLineContent(r),t=n.length;let l=0,h=0,m=0,_=1,f=!1,v=!1,y=!1,L=!1;for(;l0&&w.getLanguageId(c-1)===g;)c--;return new N(w,g,c,p+1,w.getStartOffset(c),w.getEndOffset(p))}e.createScopedLineTokens=b;class N{constructor(S,C,d,g,p,c){this._actual=S,this.languageId=C,this._firstTokenIndex=d,this._lastTokenIndex=g,this.firstCharOffset=p,this._lastCharOffset=c}getLineContent(){return this._actual.getLineContent().substring(this.firstCharOffset,this._lastCharOffset)}getActualLineContentBefore(S){return this._actual.getLineContent().substring(0,this.firstCharOffset+S)}getTokenCount(){return this._lastTokenIndex-this._firstTokenIndex}findTokenIndexAtOffset(S){return this._actual.findTokenIndexAtOffset(S+this.firstCharOffset)-this._firstTokenIndex}getStandardTokenType(S){return this._actual.getStandardTokenType(S+this._firstTokenIndex)}}e.ScopedLineTokens=N;function M(w){return(w&7)!=0}e.ignoreBracketsInToken=M}),define(Q[376],J([0,1,109]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CharacterPairSupport=void 0;class N{constructor(w){if(w.autoClosingPairs?this._autoClosingPairs=w.autoClosingPairs.map(S=>new b.StandardAutoClosingPairConditional(S)):w.brackets?this._autoClosingPairs=w.brackets.map(S=>new b.StandardAutoClosingPairConditional({open:S[0],close:S[1]})):this._autoClosingPairs=[],w.__electricCharacterSupport&&w.__electricCharacterSupport.docComment){const S=w.__electricCharacterSupport.docComment;this._autoClosingPairs.push(new b.StandardAutoClosingPairConditional({open:S.open,close:S.close||""}))}this._autoCloseBefore=typeof w.autoCloseBefore=="string"?w.autoCloseBefore:N.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED,this._surroundingPairs=w.surroundingPairs||this._autoClosingPairs}getAutoClosingPairs(){return this._autoClosingPairs}getAutoCloseBeforeSet(){return this._autoCloseBefore}static shouldAutoClosePair(w,S,C){if(S.getTokenCount()===0)return!0;const d=S.findTokenIndexAtOffset(C-2),g=S.getStandardTokenType(d);return w.isOK(g)}getSurroundingPairs(){return this._surroundingPairs}}e.CharacterPairSupport=N,N.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED=`;:.,=}])> + `}),define(Q[377],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentRulesSupport=void 0;function b(M){return M.global&&(M.lastIndex=0),!0}class N{constructor(w){this._indentationRules=w}shouldIncrease(w){return!!(this._indentationRules&&this._indentationRules.increaseIndentPattern&&b(this._indentationRules.increaseIndentPattern)&&this._indentationRules.increaseIndentPattern.test(w))}shouldDecrease(w){return!!(this._indentationRules&&this._indentationRules.decreaseIndentPattern&&b(this._indentationRules.decreaseIndentPattern)&&this._indentationRules.decreaseIndentPattern.test(w))}shouldIndentNextLine(w){return!!(this._indentationRules&&this._indentationRules.indentNextLinePattern&&b(this._indentationRules.indentNextLinePattern)&&this._indentationRules.indentNextLinePattern.test(w))}shouldIgnore(w){return!!(this._indentationRules&&this._indentationRules.unIndentedLinePattern&&b(this._indentationRules.unIndentedLinePattern)&&this._indentationRules.unIndentedLinePattern.test(w))}getIndentMetadata(w){let S=0;return this.shouldIncrease(w)&&(S+=1),this.shouldDecrease(w)&&(S+=2),this.shouldIndentNextLine(w)&&(S+=4),this.shouldIgnore(w)&&(S+=8),S}}e.IndentRulesSupport=N}),define(Q[378],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BasicInplaceReplace=void 0;class b{constructor(){this._defaultValueSet=[["true","false"],["True","False"],["Private","Public","Friend","ReadOnly","Partial","Protected","WriteOnly"],["public","protected","private"]]}navigateValueSet(M,w,S,C,d){if(M&&w){let g=this.doNavigateValueSet(w,d);if(g)return{range:M,value:g}}if(S&&C){let g=this.doNavigateValueSet(C,d);if(g)return{range:S,value:g}}return null}doNavigateValueSet(M,w){let S=this.numberReplace(M,w);return S!==null?S:this.textReplace(M,w)}numberReplace(M,w){let S=Math.pow(10,M.length-(M.lastIndexOf(".")+1)),C=Number(M),d=parseFloat(M);return!isNaN(C)&&!isNaN(d)&&C===d?C===0&&!w?null:(C=Math.floor(C*S),C+=w?S:-S,String(C/S)):null}textReplace(M,w){return this.valueSetsReplace(this._defaultValueSet,M,w)}valueSetsReplace(M,w,S){let C=null;for(let d=0,g=M.length;C===null&&d=0?(C+=S?1:-1,C<0?C=M.length-1:C%=M.length,M[C]):null}}e.BasicInplaceReplace=b,b.INSTANCE=new b}),define(Q[379],J([0,1,12,8,109]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OnEnterSupport=void 0;class w{constructor(C){C=C||{},C.brackets=C.brackets||[["(",")"],["{","}"],["[","]"]],this._brackets=[],C.brackets.forEach(d=>{const g=w._createOpenBracketRegExp(d[0]),p=w._createCloseBracketRegExp(d[1]);g&&p&&this._brackets.push({open:d[0],openRegExp:g,close:d[1],closeRegExp:p})}),this._regExpRules=C.onEnterRules||[]}onEnter(C,d,g,p){if(C>=3)for(let c=0,o=this._regExpRules.length;cu.reg?u.reg.test(u.text):!0))return s.action}if(C>=2&&g.length>0&&p.length>0)for(let c=0,o=this._brackets.length;c=2&&g.length>0){for(let c=0,o=this._brackets.length;c[v[0].toLowerCase(),v[1].toLowerCase()]);const h=[];for(let v=0;v{const[L,I]=v,[k,E]=y;return L===k||L===E||I===k||I===E},_=(v,y)=>{const L=Math.min(v,y),I=Math.max(v,y);for(let k=0;k0&&f.push({open:y,close:L})}return f}class C{constructor(l,h){const m=S(h);this.brackets=m.map((_,f)=>new w(l,f,_.open,_.close,c(_.open,_.close,m,f),o(_.open,_.close,m,f))),this.forwardRegex=s(this.brackets),this.reversedRegex=a(this.brackets),this.textIsBracket={},this.textIsOpenBracket={},this.maxBracketLength=0;for(const _ of this.brackets){for(const f of _.open)this.textIsBracket[f]=_,this.textIsOpenBracket[f]=!0,this.maxBracketLength=Math.max(this.maxBracketLength,f.length);for(const f of _.close)this.textIsBracket[f]=_,this.textIsOpenBracket[f]=!1,this.maxBracketLength=Math.max(this.maxBracketLength,f.length)}}}e.RichEditBrackets=C;function d(t,l,h,m){for(let _=0,f=l.length;_=0&&m.push(y);for(const y of v.close)y.indexOf(t)>=0&&m.push(y)}}function g(t,l){return t.length-l.length}function p(t){if(t.length<=1)return t;const l=[],h=new Set;for(const m of t)h.has(m)||(l.push(m),h.add(m));return l}function c(t,l,h,m){let _=[];_=_.concat(t),_=_.concat(l);for(let f=0,v=_.length;f=0;v--)_[f++]=m.charCodeAt(v);return N.getPlatformTextDecoder().decode(_)}else{let _=[],f=0;for(let v=m.length-1;v>=0;v--)_[f++]=m.charAt(v);return _.join("")}}let l=null,h=null;return function(_){return l!==_&&(l=_,h=t(l)),h}}();class n{static _findPrevBracketInText(l,h,m,_){let f=m.match(l);if(!f)return null;let v=m.length-(f.index||0),y=f[0].length,L=_+v;return new M.Range(h,L-y+1,h,L+1)}static findPrevBracketInRange(l,h,m,_,f){const y=i(m).substring(m.length-f,m.length-_);return this._findPrevBracketInText(l,h,y,_)}static findNextBracketInText(l,h,m,_){let f=m.match(l);if(!f)return null;let v=f.index||0,y=f[0].length;if(y===0)return null;let L=_+v;return new M.Range(h,L+1,h,L+1+y)}static findNextBracketInRange(l,h,m,_,f){const v=m.substring(_,f);return this.findNextBracketInText(l,h,v,_)}}e.BracketsUtils=n}),define(Q[380],J([0,1,167,168]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketElectricCharacterSupport=void 0;class M{constructor(S){this._richEditBrackets=S}getElectricCharacters(){let S=[];if(this._richEditBrackets)for(const C of this._richEditBrackets.brackets)for(const d of C.close){const g=d.charAt(d.length-1);S.push(g)}return S=S.filter((C,d,g)=>g.indexOf(C)===d),S}onElectricCharacter(S,C,d){if(!this._richEditBrackets||this._richEditBrackets.brackets.length===0)return null;const g=C.findTokenIndexAtOffset(d-1);if(b.ignoreBracketsInToken(C.getStandardTokenType(g)))return null;const p=this._richEditBrackets.reversedRegex,c=C.getLineContent().substring(0,d-1)+S,o=N.BracketsUtils.findPrevBracketInRange(p,1,c,0,c.length);if(!o)return null;const s=c.substring(o.startColumn-1,o.endColumn-1).toLowerCase();if(this._richEditBrackets.textIsOpenBracket[s])return null;const u=C.getActualLineContentBefore(o.startColumn-1);return/^\s*$/.test(u)?{matchOpenBracket:s}:null}}e.BracketElectricCharacterSupport=M}),define(Q[41],J([0,1,6,2,8,128,109,167,376,380,377,379,168]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageConfigurationRegistry=e.LanguageConfigurationRegistryImpl=e.LanguageConfigurationChangeEvent=e.RichEditSupport=void 0;class s{constructor(t,l){this._languageIdentifier=t,this._brackets=null,this._electricCharacter=null,this._conf=l,this._onEnterSupport=this._conf.brackets||this._conf.indentationRules||this._conf.onEnterRules?new c.OnEnterSupport(this._conf):null,this.comments=s._handleComments(this._conf),this.characterPair=new d.CharacterPairSupport(this._conf),this.wordDefinition=this._conf.wordPattern||w.DEFAULT_WORD_REGEXP,this.indentationRules=this._conf.indentationRules,this._conf.indentationRules?this.indentRulesSupport=new p.IndentRulesSupport(this._conf.indentationRules):this.indentRulesSupport=null,this.foldingRules=this._conf.folding||{}}get brackets(){return!this._brackets&&this._conf.brackets&&(this._brackets=new o.RichEditBrackets(this._languageIdentifier,this._conf.brackets)),this._brackets}get electricCharacter(){return this._electricCharacter||(this._electricCharacter=new g.BracketElectricCharacterSupport(this.brackets)),this._electricCharacter}onEnter(t,l,h,m){return this._onEnterSupport?this._onEnterSupport.onEnter(t,l,h,m):null}static _handleComments(t){let l=t.comments;if(!l)return null;let h={};if(l.lineComment&&(h.lineCommentToken=l.lineComment),l.blockComment){let[m,_]=l.blockComment;h.blockCommentStartToken=m,h.blockCommentEndToken=_}return h}}e.RichEditSupport=s;class a{constructor(t){this.languageIdentifier=t}}e.LanguageConfigurationChangeEvent=a;class u{constructor(t,l,h){this.configuration=t,this.priority=l,this.order=h}static cmp(t,l){return t.priority===l.priority?t.order-l.order:t.priority-l.priority}}class r{constructor(t){this.languageIdentifier=t,this._resolved=null,this._entries=[],this._order=0,this._resolved=null}register(t,l){const h=new u(t,l,++this._order);return this._entries.push(h),this._resolved=null,N.toDisposable(()=>{for(let m=0;m{_.dispose(),this._onDidChange.fire(new a(t))})}_getRichEditSupport(t){const l=this._entries2.get(t);return l?l.getRichEditSupport():null}getIndentationRules(t){const l=this._getRichEditSupport(t);return l&&l.indentationRules||null}_getElectricCharacterSupport(t){let l=this._getRichEditSupport(t);return l&&l.electricCharacter||null}getElectricCharacters(t){let l=this._getElectricCharacterSupport(t);return l?l.getElectricCharacters():[]}onElectricCharacter(t,l,h){let m=C.createScopedLineTokens(l,h-1),_=this._getElectricCharacterSupport(m.languageId);return _?_.onElectricCharacter(t,m,h-m.firstCharOffset):null}getComments(t){let l=this._getRichEditSupport(t);return l&&l.comments||null}_getCharacterPairSupport(t){let l=this._getRichEditSupport(t);return l&&l.characterPair||null}getAutoClosingPairs(t){const l=this._getCharacterPairSupport(t);return new S.AutoClosingPairs(l?l.getAutoClosingPairs():[])}getAutoCloseBeforeSet(t){let l=this._getCharacterPairSupport(t);return l?l.getAutoCloseBeforeSet():d.CharacterPairSupport.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED}getSurroundingPairs(t){let l=this._getCharacterPairSupport(t);return l?l.getSurroundingPairs():[]}shouldAutoClosePair(t,l,h){const m=C.createScopedLineTokens(l,h-1);return d.CharacterPairSupport.shouldAutoClosePair(t,m,h-m.firstCharOffset)}getWordDefinition(t){let l=this._getRichEditSupport(t);return l?w.ensureValidWordDefinition(l.wordDefinition||null):w.ensureValidWordDefinition(null)}getFoldingRules(t){let l=this._getRichEditSupport(t);return l?l.foldingRules:{}}getIndentRulesSupport(t){let l=this._getRichEditSupport(t);return l&&l.indentRulesSupport||null}getPrecedingValidLine(t,l,h){let m=t.getLanguageIdAtPosition(l,0);if(l>1){let _,f=-1;for(_=l-1;_>=1;_--){if(t.getLanguageIdAtPosition(_,0)!==m)return f;let v=t.getLineContent(_);if(h.shouldIgnore(v)||/^\s+$/.test(v)||v===""){f=_;continue}return _}}return-1}getInheritIndentForLine(t,l,h,m=!0){if(t<4)return null;const _=this.getIndentRulesSupport(l.getLanguageIdentifier().id);if(!_)return null;if(h<=1)return{indentation:"",action:null};const f=this.getPrecedingValidLine(l,h,_);if(f<0)return null;if(f<1)return{indentation:"",action:null};const v=l.getLineContent(f);if(_.shouldIncrease(v)||_.shouldIndentNextLine(v))return{indentation:M.getLeadingWhitespace(v),action:S.IndentAction.Indent,line:f};if(_.shouldDecrease(v))return{indentation:M.getLeadingWhitespace(v),action:null,line:f};{if(f===1)return{indentation:M.getLeadingWhitespace(l.getLineContent(f)),action:null,line:f};const y=f-1,L=_.getIndentMetadata(l.getLineContent(y));if(!(L&(1|2))&&L&4){let I=0;for(let k=y-1;k>0;k--)if(!_.shouldIndentNextLine(l.getLineContent(k))){I=k;break}return{indentation:M.getLeadingWhitespace(l.getLineContent(I+1)),action:null,line:I+1}}if(m)return{indentation:M.getLeadingWhitespace(l.getLineContent(f)),action:null,line:f};for(let I=f;I>0;I--){const k=l.getLineContent(I);if(_.shouldIncrease(k))return{indentation:M.getLeadingWhitespace(k),action:S.IndentAction.Indent,line:I};if(_.shouldIndentNextLine(k)){let E=0;for(let T=I-1;T>0;T--)if(!_.shouldIndentNextLine(l.getLineContent(I))){E=T;break}return{indentation:M.getLeadingWhitespace(l.getLineContent(E+1)),action:null,line:E+1}}else if(_.shouldDecrease(k))return{indentation:M.getLeadingWhitespace(k),action:null,line:I}}return{indentation:M.getLeadingWhitespace(l.getLineContent(1)),action:null,line:1}}}getGoodIndentForLine(t,l,h,m,_){if(t<4)return null;const f=this._getRichEditSupport(h);if(!f)return null;const v=this.getIndentRulesSupport(h);if(!v)return null;const y=this.getInheritIndentForLine(t,l,m),L=l.getLineContent(m);if(y){const I=y.line;if(I!==void 0){const k=f.onEnter(t,"",l.getLineContent(I),"");if(k){let E=M.getLeadingWhitespace(l.getLineContent(I));return k.removeText&&(E=E.substring(0,E.length-k.removeText)),k.indentAction===S.IndentAction.Indent||k.indentAction===S.IndentAction.IndentOutdent?E=_.shiftIndent(E):k.indentAction===S.IndentAction.Outdent&&(E=_.unshiftIndent(E)),v.shouldDecrease(L)&&(E=_.unshiftIndent(E)),k.appendText&&(E+=k.appendText),M.getLeadingWhitespace(E)}}return v.shouldDecrease(L)?y.action===S.IndentAction.Indent?y.indentation:_.unshiftIndent(y.indentation):y.action===S.IndentAction.Indent?_.shiftIndent(y.indentation):y.indentation}return null}getIndentForEnter(t,l,h,m){if(t<4)return null;l.forceTokenization(h.startLineNumber);const _=l.getLineTokens(h.startLineNumber),f=C.createScopedLineTokens(_,h.startColumn-1),v=f.getLineContent();let y=!1,L;f.firstCharOffset>0&&_.getLanguageId(0)!==f.languageId?(y=!0,L=v.substr(0,h.startColumn-1-f.firstCharOffset)):L=_.getLineContent().substring(0,h.startColumn-1);let I;h.isEmpty()?I=v.substr(h.startColumn-1-f.firstCharOffset):I=this.getScopedLineTokens(l,h.endLineNumber,h.endColumn).getLineContent().substr(h.endColumn-1-f.firstCharOffset);const k=this.getIndentRulesSupport(f.languageId);if(!k)return null;const E=L,T=M.getLeadingWhitespace(L),O={getLineTokens:D=>l.getLineTokens(D),getLanguageIdentifier:()=>l.getLanguageIdentifier(),getLanguageIdAtPosition:(D,R)=>l.getLanguageIdAtPosition(D,R),getLineContent:D=>D===h.startLineNumber?E:l.getLineContent(D)},A=M.getLeadingWhitespace(_.getLineContent()),B=this.getInheritIndentForLine(t,O,h.startLineNumber+1);if(!B){const D=y?A:T;return{beforeEnter:D,afterEnter:D}}let F=y?A:B.indentation;return B.action===S.IndentAction.Indent&&(F=m.shiftIndent(F)),k.shouldDecrease(I)&&(F=m.unshiftIndent(F)),{beforeEnter:y?A:T,afterEnter:F}}getIndentActionForType(t,l,h,m,_){if(t<4)return null;const f=this.getScopedLineTokens(l,h.startLineNumber,h.startColumn);if(f.firstCharOffset)return null;const v=this.getIndentRulesSupport(f.languageId);if(!v)return null;const y=f.getLineContent(),L=y.substr(0,h.startColumn-1-f.firstCharOffset);let I;if(h.isEmpty()?I=y.substr(h.startColumn-1-f.firstCharOffset):I=this.getScopedLineTokens(l,h.endLineNumber,h.endColumn).getLineContent().substr(h.endColumn-1-f.firstCharOffset),!v.shouldDecrease(L+I)&&v.shouldDecrease(L+m+I)){const k=this.getInheritIndentForLine(t,l,h.startLineNumber,!1);if(!k)return null;let E=k.indentation;return k.action!==S.IndentAction.Indent&&(E=_.unshiftIndent(E)),E}return null}getIndentMetadata(t,l){const h=this.getIndentRulesSupport(t.getLanguageIdentifier().id);return!h||l<1||l>t.getLineCount()?null:h.getIndentMetadata(t.getLineContent(l))}getEnterAction(t,l,h){const m=this.getScopedLineTokens(l,h.startLineNumber,h.startColumn),_=this._getRichEditSupport(m.languageId);if(!_)return null;const f=m.getLineContent(),v=f.substr(0,h.startColumn-1-m.firstCharOffset);let y;h.isEmpty()?y=f.substr(h.startColumn-1-m.firstCharOffset):y=this.getScopedLineTokens(l,h.endLineNumber,h.endColumn).getLineContent().substr(h.endColumn-1-m.firstCharOffset);let L="";if(h.startLineNumber>1&&m.firstCharOffset===0){const A=this.getScopedLineTokens(l,h.startLineNumber-1);A.languageId===m.languageId&&(L=A.getLineContent())}const I=_.onEnter(t,L,v,y);if(!I)return null;const k=I.indentAction;let E=I.appendText;const T=I.removeText||0;E?k===S.IndentAction.Indent&&(E=" "+E):k===S.IndentAction.Indent||k===S.IndentAction.IndentOutdent?E=" ":E="";let O=this.getIndentationAtPosition(l,h.startLineNumber,h.startColumn);return T&&(O=O.substring(0,O.length-T)),{indentAction:k,appendText:E,removeText:T,indentation:O}}getIndentationAtPosition(t,l,h){const m=t.getLineContent(l);let _=M.getLeadingWhitespace(m);return _.length>h-1&&(_=_.substring(0,h-1)),_}getScopedLineTokens(t,l,h){t.forceTokenization(l);const m=t.getLineTokens(l),_=typeof h=="undefined"?t.getLineMaxColumn(l)-1:h-1;return C.createScopedLineTokens(m,_)}getBracketsSupport(t){const l=this._getRichEditSupport(t);return l&&l.brackets||null}}e.LanguageConfigurationRegistryImpl=i,e.LanguageConfigurationRegistry=new i}),define(Q[381],J([0,1,29]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.generateTokensCSSForColorMap=e.ThemeTrieElement=e.ThemeTrieElementRule=e.strcmp=e.toStandardTokenType=e.TokenTheme=e.ColorMap=e.parseTokenTheme=e.ParsedTokenThemeRule=void 0;class N{constructor(r,i,n,t,l){this.token=r,this.index=i,this.fontStyle=n,this.foreground=t,this.background=l}}e.ParsedTokenThemeRule=N;function M(u){if(!u||!Array.isArray(u))return[];let r=[],i=0;for(let n=0,t=u.length;n{let L=c(v.token,y.token);return L!==0?L:v.index-y.index});let i=0,n="000000",t="ffffff";for(;u.length>=1&&u[0].token==="";){let v=u.shift();v.fontStyle!==-1&&(i=v.fontStyle),v.foreground!==null&&(n=v.foreground),v.background!==null&&(t=v.background)}let l=new C;for(let v of r)l.getId(v);let h=l.getId(n),m=l.getId(t),_=new o(i,h,m),f=new s(_);for(let v=0,y=u.length;v>>0,this._cache.set(i,n)}return(n|r<<0)>>>0}}e.TokenTheme=d;const g=/\b(comment|string|regex|regexp)\b/;function p(u){let r=u.match(g);if(!r)return 0;switch(r[1]){case"comment":return 1;case"string":return 2;case"regex":return 4;case"regexp":return 4}throw new Error("Unexpected match for standard token type!")}e.toStandardTokenType=p;function c(u,r){return ur?1:0}e.strcmp=c;class o{constructor(r,i,n){this._fontStyle=r,this._foreground=i,this._background=n,this.metadata=(this._fontStyle<<11|this._foreground<<14|this._background<<23)>>>0}clone(){return new o(this._fontStyle,this._foreground,this._background)}acceptOverwrite(r,i,n){r!==-1&&(this._fontStyle=r),i!==0&&(this._foreground=i),n!==0&&(this._background=n),this.metadata=(this._fontStyle<<11|this._foreground<<14|this._background<<23)>>>0}}e.ThemeTrieElementRule=o;class s{constructor(r){this._mainRule=r,this._children=new Map}match(r){if(r==="")return this._mainRule;let i=r.indexOf("."),n,t;i===-1?(n=r,t=""):(n=r.substring(0,i),t=r.substring(i+1));let l=this._children.get(n);return typeof l!="undefined"?l.match(t):this._mainRule}insert(r,i,n,t){if(r===""){this._mainRule.acceptOverwrite(i,n,t);return}let l=r.indexOf("."),h,m;l===-1?(h=r,m=""):(h=r.substring(0,l),m=r.substring(l+1));let _=this._children.get(h);typeof _=="undefined"&&(_=new s(this._mainRule.clone()),this._children.set(h,_)),_.insert(m,i,n,t)}}e.ThemeTrieElement=s;function a(u){let r=[];for(let i=1,n=u.length;i{this._map.get(S)===C&&(this._map.delete(S),this.fire([S]))})}registerPromise(S,C){let d=null,g=!1;return this._promises.set(S,C.then(p=>{this._promises.delete(S),!(g||!p)&&(d=this.register(S,p))})),N.toDisposable(()=>{g=!0,d&&d.dispose()})}getPromise(S){const C=this.get(S);if(C)return Promise.resolve(C);const d=this._promises.get(S);return d?d.then(g=>this.get(S)):null}get(S){return this._map.get(S)||null}setColorMap(S){this._colorMap=S,this._onDidChange.fire({changedLanguages:Array.from(this._map.keys()),changedColorMap:!0})}getColorMap(){return this._colorMap}getDefaultBackground(){return this._colorMap&&this._colorMap.length>2?this._colorMap[2]:null}}e.TokenizationRegistryImpl=M}),define(Q[383],J([0,1,101,17]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.encodeSemanticTokensDto=void 0;function M(d){for(let g=0,p=d.length;gd&&(n=d-t);const l=u.color;let h=this._color2Id[l];h||(h=++this._lastAssignedId,this._color2Id[l]=h,this._id2Color[h]=l);const m=new b(n-t,n+t,h);u.setColorZone(m),o.push(m)}return this._colorZonesInvalid=!1,o.sort(b.compare),o}}e.OverviewZoneManager=M}),define(Q[110],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.VisibleRanges=e.HorizontalPosition=e.HorizontalRange=e.LineVisibleRanges=e.RenderingContext=e.RestrictedRenderingContext=void 0;class b{constructor(g,p){this._viewLayout=g,this.viewportData=p,this.scrollWidth=this._viewLayout.getScrollWidth(),this.scrollHeight=this._viewLayout.getScrollHeight(),this.visibleRange=this.viewportData.visibleRange,this.bigNumbersDelta=this.viewportData.bigNumbersDelta;const c=this._viewLayout.getCurrentViewport();this.scrollTop=c.top,this.scrollLeft=c.left,this.viewportWidth=c.width,this.viewportHeight=c.height}getScrolledTopFromAbsoluteTop(g){return g-this.scrollTop}getVerticalOffsetForLineNumber(g){return this._viewLayout.getVerticalOffsetForLineNumber(g)}getDecorationsInViewport(){return this.viewportData.getDecorationsInViewport()}}e.RestrictedRenderingContext=b;class N extends b{constructor(g,p,c){super(g,p);this._viewLines=c}linesVisibleRangesForRange(g,p){return this._viewLines.linesVisibleRangesForRange(g,p)}visibleRangeForPosition(g){return this._viewLines.visibleRangeForPosition(g)}}e.RenderingContext=N;class M{constructor(g,p,c){this.outsideRenderedLine=g,this.lineNumber=p,this.ranges=c}}e.LineVisibleRanges=M;class w{constructor(g,p){this.left=Math.round(g),this.width=Math.round(p)}toString(){return`[${this.left},${this.width}]`}}e.HorizontalRange=w;class S{constructor(g,p){this.outsideRenderedLine=g,this.left=Math.round(p)}}e.HorizontalPosition=S;class C{constructor(g,p){this.outsideRenderedLine=g,this.ranges=p}}e.VisibleRanges=C}),define(Q[384],J([0,1,110]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RangeUtil=void 0;class N{constructor(S,C){this.left=S,this.width=C}toString(){return`[${this.left},${this.width}]`}static compare(S,C){return S.left-C.left}}class M{static _createRange(){return this._handyReadyRange||(this._handyReadyRange=document.createRange()),this._handyReadyRange}static _detachRange(S,C){S.selectNodeContents(C)}static _readClientRects(S,C,d,g,p){const c=this._createRange();try{return c.setStart(S,C),c.setEnd(d,g),c.getClientRects()}catch(o){return null}finally{this._detachRange(c,p)}}static _mergeAdjacentRanges(S){if(S.length===1)return[new b.HorizontalRange(S[0].left,S[0].width)];S.sort(N.compare);let C=[],d=0,g=S[0].left,p=S[0].width;for(let c=1,o=S.length;c=a?p=Math.max(p,a+u-g):(C[d++]=new b.HorizontalRange(g,p),g=a,p=u)}return C[d++]=new b.HorizontalRange(g,p),C}static _createHorizontalRangesFromClientRects(S,C){if(!S||S.length===0)return null;const d=[];for(let g=0,p=S.length;ga)return null;if(C=Math.min(a,Math.max(s,C)),g=Math.min(a,Math.max(s,g)),C===g&&d===p&&d===0){const n=S.children[C].getClientRects();return this._createHorizontalRangesFromClientRects(n,c)}C!==g&&g>0&&p===0&&(g--,p=1073741824);let u=S.children[C].firstChild,r=S.children[g].firstChild;if((!u||!r)&&(!u&&d===0&&C>0&&(u=S.children[C-1].firstChild,d=1073741824),!r&&p===0&&g>0&&(r=S.children[g-1].firstChild,p=1073741824)),!u||!r)return null;d=Math.min(u.textContent.length,Math.max(0,d)),p=Math.min(r.textContent.length,Math.max(0,p));const i=this._readClientRects(u,d,r,p,o);return this._createHorizontalRangesFromClientRects(i,c)}}e.RangeUtil=M}),define(Q[385],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewContext=e.EditorTheme=void 0;class b{constructor(w){this._theme=w}get type(){return this._theme.type}update(w){this._theme=w}getColor(w){return this._theme.getColor(w)}}e.EditorTheme=b;class N{constructor(w,S,C){this.configuration=w,this.theme=new b(S),this.model=C,this.viewLayout=C.viewLayout}addEventHandler(w){this.model.addViewEventHandler(w)}removeEventHandler(w){this.model.removeViewEventHandler(w)}}e.ViewContext=N}),define(Q[170],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewZonesChangedEvent=e.ViewTokensColorsChangedEvent=e.ViewTokensChangedEvent=e.ViewThemeChangedEvent=e.ViewScrollChangedEvent=e.ViewRevealRangeRequestEvent=e.ViewLinesInsertedEvent=e.ViewLinesDeletedEvent=e.ViewLinesChangedEvent=e.ViewLineMappingChangedEvent=e.ViewLanguageConfigurationEvent=e.ViewFocusChangedEvent=e.ViewFlushedEvent=e.ViewDecorationsChangedEvent=e.ViewCursorStateChangedEvent=e.ViewConfigurationChangedEvent=e.ViewCompositionEndEvent=e.ViewCompositionStartEvent=void 0;class b{constructor(){this.type=0}}e.ViewCompositionStartEvent=b;class N{constructor(){this.type=1}}e.ViewCompositionEndEvent=N;class M{constructor(h){this.type=2,this._source=h}hasChanged(h){return this._source.hasChanged(h)}}e.ViewConfigurationChangedEvent=M;class w{constructor(h,m){this.type=3,this.selections=h,this.modelSelections=m}}e.ViewCursorStateChangedEvent=w;class S{constructor(h){this.type=4,h?(this.affectsMinimap=h.affectsMinimap,this.affectsOverviewRuler=h.affectsOverviewRuler):(this.affectsMinimap=!0,this.affectsOverviewRuler=!0)}}e.ViewDecorationsChangedEvent=S;class C{constructor(){this.type=5}}e.ViewFlushedEvent=C;class d{constructor(h){this.type=6,this.isFocused=h}}e.ViewFocusChangedEvent=d;class g{constructor(){this.type=7}}e.ViewLanguageConfigurationEvent=g;class p{constructor(){this.type=8}}e.ViewLineMappingChangedEvent=p;class c{constructor(h,m){this.type=9,this.fromLineNumber=h,this.toLineNumber=m}}e.ViewLinesChangedEvent=c;class o{constructor(h,m){this.type=10,this.fromLineNumber=h,this.toLineNumber=m}}e.ViewLinesDeletedEvent=o;class s{constructor(h,m){this.type=11,this.fromLineNumber=h,this.toLineNumber=m}}e.ViewLinesInsertedEvent=s;class a{constructor(h,m,_,f,v,y){this.type=12,this.source=h,this.range=m,this.selections=_,this.verticalType=f,this.revealHorizontal=v,this.scrollType=y}}e.ViewRevealRangeRequestEvent=a;class u{constructor(h){this.type=13,this.scrollWidth=h.scrollWidth,this.scrollLeft=h.scrollLeft,this.scrollHeight=h.scrollHeight,this.scrollTop=h.scrollTop,this.scrollWidthChanged=h.scrollWidthChanged,this.scrollLeftChanged=h.scrollLeftChanged,this.scrollHeightChanged=h.scrollHeightChanged,this.scrollTopChanged=h.scrollTopChanged}}e.ViewScrollChangedEvent=u;class r{constructor(){this.type=14}}e.ViewThemeChangedEvent=r;class i{constructor(h){this.type=15,this.ranges=h}}e.ViewTokensChangedEvent=i;class n{constructor(){this.type=16}}e.ViewTokensColorsChangedEvent=n;class t{constructor(){this.type=17}}e.ViewZonesChangedEvent=t}),define(Q[171],J([0,1,8]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineDecorationsNormalizer=e.DecorationSegment=e.LineDecoration=void 0;class N{constructor(d,g,p,c){this.startColumn=d,this.endColumn=g,this.className=p,this.type=c}static _equals(d,g){return d.startColumn===g.startColumn&&d.endColumn===g.endColumn&&d.className===g.className&&d.type===g.type}static equalsArr(d,g){const p=d.length,c=g.length;if(p!==c)return!1;for(let o=0;o=o||(a[u++]=new N(Math.max(1,r.startColumn-c+1),Math.min(s+1,r.endColumn-c+1),r.className,r.type));return a}static filter(d,g,p,c){if(d.length===0)return[];let o=[],s=0;for(let a=0,u=d.length;ag)&&!(i.isEmpty()&&(r.type===0||r.type===3))){const n=i.startLineNumber===g?i.startColumn:p,t=i.endLineNumber===g?i.endColumn:c;o[s++]=new N(n,t,r.inlineClassName,r.type)}}return o}static _typeCompare(d,g){const p=[2,0,1,3];return p[d]-p[g]}static compare(d,g){if(d.startColumn===g.startColumn){if(d.endColumn===g.endColumn){const p=N._typeCompare(d.type,g.type);return p===0?d.classNameg.className?1:0:p}return d.endColumn-g.endColumn}return d.startColumn-g.startColumn}}e.LineDecoration=N;class M{constructor(d,g,p,c){this.startOffset=d,this.endOffset=g,this.className=p,this.metadata=c}}e.DecorationSegment=M;class w{constructor(){this.stopOffsets=[],this.classNames=[],this.metadata=[],this.count=0}static _metadata(d){let g=0;for(let p=0,c=d.length;p0&&this.stopOffsets[0]0&&g=d){this.stopOffsets.splice(c,0,d),this.classNames.splice(c,0,g),this.metadata.splice(c,0,p);break}this.count++}}class S{static normalize(d,g){if(g.length===0)return[];let p=[];const c=new w;let o=0;for(let s=0,a=g.length;s1){const m=d.charCodeAt(r-2);b.isHighSurrogate(m)&&r--}if(i>1){const m=d.charCodeAt(i-2);b.isHighSurrogate(m)&&i--}const l=r-1,h=i-2;o=c.consumeLowerThan(l,o,p),c.count===0&&(o=l),c.insert(h,n,t)}return c.consumeLowerThan(1073741824,o,p),p}}e.LineDecorationsNormalizer=S}),define(Q[386],J([0,1,8]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinesLayout=e.EditorWhitespace=void 0;class N{constructor(){this._hasPending=!1,this._inserts=[],this._changes=[],this._removes=[]}insert(C){this._hasPending=!0,this._inserts.push(C)}change(C){this._hasPending=!0,this._changes.push(C)}remove(C){this._hasPending=!0,this._removes.push(C)}mustCommit(){return this._hasPending}commit(C){if(!!this._hasPending){const d=this._inserts,g=this._changes,p=this._removes;this._hasPending=!1,this._inserts=[],this._changes=[],this._removes=[],C._commitPendingChanges(d,g,p)}}}class M{constructor(C,d,g,p,c){this.id=C,this.afterLineNumber=d,this.ordinal=g,this.height=p,this.minWidth=c,this.prefixSum=0}}e.EditorWhitespace=M;class w{constructor(C,d,g,p){this._instanceId=b.singleLetterHash(++w.INSTANCE_COUNT),this._pendingChanges=new N,this._lastWhitespaceId=0,this._arr=[],this._prefixSumValidIndex=-1,this._minWidth=-1,this._lineCount=C,this._lineHeight=d,this._paddingTop=g,this._paddingBottom=p}static findInsertionIndex(C,d,g){let p=0,c=C.length;for(;p>>1;d===C[o].afterLineNumber?g{d=!0,p=p|0,c=c|0,o=o|0,s=s|0;const a=this._instanceId+ ++this._lastWhitespaceId;return this._pendingChanges.insert(new M(a,p,c,o,s)),a},changeOneWhitespace:(p,c,o)=>{d=!0,c=c|0,o=o|0,this._pendingChanges.change({id:p,newAfterLineNumber:c,newHeight:o})},removeWhitespace:p=>{d=!0,this._pendingChanges.remove({id:p})}})}finally{this._pendingChanges.commit(this)}return d}_commitPendingChanges(C,d,g){if((C.length>0||g.length>0)&&(this._minWidth=-1),C.length+d.length+g.length<=1){for(const a of C)this._insertWhitespace(a);for(const a of d)this._changeOneWhitespace(a.id,a.newAfterLineNumber,a.newHeight);for(const a of g){const u=this._findWhitespaceIndex(a.id);u!==-1&&this._removeWhitespace(u)}return}const p=new Set;for(const a of g)p.add(a.id);const c=new Map;for(const a of d)c.set(a.id,a);const o=a=>{let u=[];for(const r of a)if(!p.has(r.id)){if(c.has(r.id)){const i=c.get(r.id);r.afterLineNumber=i.newAfterLineNumber,r.height=i.newHeight}u.push(r)}return u},s=o(this._arr).concat(o(C));s.sort((a,u)=>a.afterLineNumber===u.afterLineNumber?a.ordinal-u.ordinal:a.afterLineNumber-u.afterLineNumber),this._arr=s,this._prefixSumValidIndex=-1}_checkPendingChanges(){this._pendingChanges.mustCommit()&&this._pendingChanges.commit(this)}_insertWhitespace(C){const d=w.findInsertionIndex(this._arr,C.afterLineNumber,C.ordinal);this._arr.splice(d,0,C),this._prefixSumValidIndex=Math.min(this._prefixSumValidIndex,d-1)}_findWhitespaceIndex(C){const d=this._arr;for(let g=0,p=d.length;gd&&(this._arr[g].afterLineNumber-=d-C+1)}}onLinesInserted(C,d){this._checkPendingChanges(),C=C|0,d=d|0,this._lineCount+=d-C+1;for(let g=0,p=this._arr.length;g=d.length||d[s+1].afterLineNumber>=C)return s;g=s+1|0}else p=s-1|0}return-1}_findFirstWhitespaceAfterLineNumber(C){C=C|0;const g=this._findLastWhitespaceBeforeLineNumber(C)+1;return g1?d=this._lineHeight*(C-1):d=0;const g=this.getWhitespaceAccumulatedHeightBeforeLineNumber(C);return d+g+this._paddingTop}getWhitespaceMinWidth(){if(this._checkPendingChanges(),this._minWidth===-1){let C=0;for(let d=0,g=this._arr.length;dd}isInTopPadding(C){return this._paddingTop===0?!1:(this._checkPendingChanges(),C=d-this._paddingBottom}getLineNumberAtOrAfterVerticalOffset(C){if(this._checkPendingChanges(),C=C|0,C<0)return 1;const d=this._lineCount|0,g=this._lineHeight;let p=1,c=d;for(;p=s+g)p=o+1;else{if(C>=s)return o;c=o}}return p>d?d:p}getLinesViewportData(C,d){this._checkPendingChanges(),C=C|0,d=d|0;const g=this._lineHeight,p=this.getLineNumberAtOrAfterVerticalOffset(C)|0,c=this.getVerticalOffsetForLineNumber(p)|0;let o=this._lineCount|0,s=this.getFirstWhitespaceIndexAfterLineNumber(p)|0;const a=this.getWhitespacesCount()|0;let u,r;s===-1?(s=a,r=o+1,u=0):(r=this.getAfterLineNumberForWhitespaceIndex(s)|0,u=this.getHeightForWhitespaceIndex(s)|0);let i=c,n=i;const t=5e5;let l=0;c>=t&&(l=Math.floor(c/t)*t,l=Math.floor(l/g)*g,n-=l);const h=[],m=C+(d-C)/2;let _=-1;for(let L=p;L<=o;L++){if(_===-1){const I=i,k=i+g;(I<=m&&mm)&&(_=L)}for(i+=g,h[L-p]=n,n+=g;r===L;)n+=u,i+=u,s++,s>=a?r=o+1:(r=this.getAfterLineNumberForWhitespaceIndex(s)|0,u=this.getHeightForWhitespaceIndex(s)|0);if(i>=d){o=L;break}}_===-1&&(_=o);const f=this.getVerticalOffsetForLineNumber(o)|0;let v=p,y=o;return vd&&y--,{bigNumbersDelta:l,startLineNumber:p,endLineNumber:o,relativeVerticalOffset:h,centeredLineNumber:_,completelyVisibleStartLineNumber:v,completelyVisibleEndLineNumber:y}}getVerticalOffsetForWhitespaceIndex(C){this._checkPendingChanges(),C=C|0;const d=this.getAfterLineNumberForWhitespaceIndex(C);let g;d>=1?g=this._lineHeight*d:g=0;let p;return C>0?p=this.getWhitespacesAccumulatedHeight(C-1):p=0,g+p+this._paddingTop}getWhitespaceIndexAtOrAfterVerticallOffset(C){this._checkPendingChanges(),C=C|0;let d=0,g=this.getWhitespacesCount()-1;if(g<0)return-1;const p=this.getVerticalOffsetForWhitespaceIndex(g),c=this.getHeightForWhitespaceIndex(g);if(C>=p+c)return-1;for(;d=s+a)d=o+1;else{if(C>=s)return o;g=o}}return d}getWhitespaceAtVerticalOffset(C){this._checkPendingChanges(),C=C|0;const d=this.getWhitespaceIndexAtOrAfterVerticallOffset(C);if(d<0||d>=this.getWhitespacesCount())return null;const g=this.getVerticalOffsetForWhitespaceIndex(d);if(g>C)return null;const p=this.getHeightForWhitespaceIndex(d),c=this.getIdForWhitespaceIndex(d),o=this.getAfterLineNumberForWhitespaceIndex(d);return{id:c,afterLineNumber:o,verticalOffset:g,height:p}}getWhitespaceViewportData(C,d){this._checkPendingChanges(),C=C|0,d=d|0;const g=this.getWhitespaceIndexAtOrAfterVerticallOffset(C),p=this.getWhitespacesCount()-1;if(g<0)return[];let c=[];for(let o=g;o<=p;o++){const s=this.getVerticalOffsetForWhitespaceIndex(o),a=this.getHeightForWhitespaceIndex(o);if(s>=d)break;c.push({id:this.getIdForWhitespaceIndex(o),afterLineNumber:this.getAfterLineNumberForWhitespaceIndex(o),verticalOffset:s,height:a})}return c}getWhitespaces(){return this._checkPendingChanges(),this._arr.slice(0)}getWhitespacesCount(){return this._checkPendingChanges(),this._arr.length}getIdForWhitespaceIndex(C){return this._checkPendingChanges(),C=C|0,this._arr[C].id}getAfterLineNumberForWhitespaceIndex(C){return this._checkPendingChanges(),C=C|0,this._arr[C].afterLineNumber}getHeightForWhitespaceIndex(C){return this._checkPendingChanges(),C=C|0,this._arr[C].height}}e.LinesLayout=w,w.INSTANCE_COUNT=0}),define(Q[129],J([0,1,8,93,171]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.renderViewLine2=e.RenderLineOutput2=e.renderViewLine=e.RenderLineOutput=e.CharacterMapping=e.RenderLineInput=e.LineRange=void 0;class w{constructor(h,m,_){this.endIndex=h,this.type=m,this.metadata=_}isWhitespace(){return!!(this.metadata&1)}}class S{constructor(h,m){this.startOffset=h,this.endOffset=m}equals(h){return this.startOffset===h.startOffset&&this.endOffset===h.endOffset}}e.LineRange=S;class C{constructor(h,m,_,f,v,y,L,I,k,E,T,O,A,B,F,D,R,W,x){this.useMonospaceOptimizations=h,this.canUseHalfwidthRightwardsArrow=m,this.lineContent=_,this.continuesWithWrappedLine=f,this.isBasicASCII=v,this.containsRTL=y,this.fauxIndentLength=L,this.lineTokens=I,this.lineDecorations=k.sort(M.LineDecoration.compare),this.tabSize=E,this.startVisibleColumn=T,this.spaceWidth=O,this.stopRenderingLineAfter=F,this.renderWhitespace=D==="all"?4:D==="boundary"?1:D==="selection"?2:D==="trailing"?3:0,this.renderControlCharacters=R,this.fontLigatures=W,this.selectionsOnLine=x&&x.sort((ee,se)=>ee.startOffset>>16}static getCharIndex(h){return(h&65535)>>>0}setPartData(h,m,_,f){let v=(m<<16|_<<0)>>>0;this._data[h]=v,this._absoluteOffsets[h]=f+_}getAbsoluteOffsets(){return this._absoluteOffsets}charOffsetToPartData(h){return this.length===0?0:h<0?this._data[0]:h>=this.length?this._data[this.length-1]:this._data[h]}partDataToCharOffset(h,m,_){if(this.length===0)return 0;let f=(h<<16|_<<0)>>>0,v=0,y=this.length-1;for(;v+1>>1,D=this._data[F];if(D===f)return F;D>f?y=F:v=F}if(v===y)return v;let L=this._data[v],I=this._data[y];if(L===f)return v;if(I===f)return y;let k=d.getPartIndex(L),E=d.getCharIndex(L),T=d.getPartIndex(I),O;k!==T?O=m:O=d.getCharIndex(I);let A=_-E,B=O-_;return A<=B?v:y}}e.CharacterMapping=d;class g{constructor(h,m,_){this.characterMapping=h,this.containsRTL=m,this.containsForeignElements=_}}e.RenderLineOutput=g;function p(l,h){if(l.lineContent.length===0){let m=0,_="";if(l.lineDecorations.length>0){const f=[],v=[];for(let y=0,L=l.lineDecorations.length;y0?``:"",L=v.length>0?``:"";_=`${y}${L}`}}return h.appendASCIIString(_),new g(new d(0,0),!1,m)}return t(a(l),h)}e.renderViewLine=p;class c{constructor(h,m,_,f){this.characterMapping=h,this.html=m,this.containsRTL=_,this.containsForeignElements=f}}e.RenderLineOutput2=c;function o(l){let h=N.createStringBuilder(1e4),m=p(l,h);return new c(m.characterMapping,h.build(),m.containsRTL,m.containsForeignElements)}e.renderViewLine2=o;class s{constructor(h,m,_,f,v,y,L,I,k,E,T,O,A,B,F){this.fontIsMonospace=h,this.canUseHalfwidthRightwardsArrow=m,this.lineContent=_,this.len=f,this.isOverflowing=v,this.parts=y,this.containsForeignElements=L,this.fauxIndentLength=I,this.tabSize=k,this.startVisibleColumn=E,this.containsRTL=T,this.spaceWidth=O,this.renderSpaceCharCode=A,this.renderWhitespace=B,this.renderControlCharacters=F}}function a(l){const h=l.lineContent;let m,_;l.stopRenderingLineAfter!==-1&&l.stopRenderingLineAfter0){for(let y=0,L=l.lineDecorations.length;y0&&(_[f++]=new w(h,"",0));for(let v=0,y=l.getCount();v=m){_[f++]=new w(m,I,0);break}_[f++]=new w(L,I,0)}}return _}function r(l,h,m){let _=0,f=[],v=0;if(m)for(let y=0,L=h.length;y=50&&(f[v++]=new w(O+1,E,T),A=O+1,O=-1);A!==k&&(f[v++]=new w(k,E,T))}else f[v++]=I;_=k}else for(let y=0,L=h.length;y50){const T=I.type,O=I.metadata,A=Math.ceil(E/50);for(let B=1;B=ne.endOffset&&(se++,ne=k&&k[se]);let V;if(zY)V=!0;else if(P===9)V=!0;else if(P===32)if(E)if(ee)V=!0;else{const U=z+1z),V&&T&&(V=x||z>Y),ee){if(!V||!I&&le>=y){if(O){const U=B>0?A[B-1].endIndex:v;for(let H=U+1;H<=z;H++)A[B++]=new w(H,"mtkw",1)}else A[B++]=new w(z,"mtkw",1);le=le%y}}else(z===R||V&&z>v)&&(A[B++]=new w(z,D,0),le=le%y);for(P===9?le=y:b.isFullWidthCharacter(P)?le+=2:le++,ee=V;z===R;)F++,F0?h.charCodeAt(m-1):0,P=m>1?h.charCodeAt(m-2):0;z===32&&P!==32&&P!==9||(X=!0)}else X=!0;if(X)if(O){const z=B>0?A[B-1].endIndex:v;for(let P=z+1;P<=m;P++)A[B++]=new w(P,"mtkw",1)}else A[B++]=new w(m,"mtkw",1);else A[B++]=new w(m,D,0);return A}function n(l,h,m,_){_.sort(M.LineDecoration.compare);const f=M.LineDecorationsNormalizer.normalize(l,_),v=f.length;let y=0,L=[],I=0,k=0;for(let T=0,O=m.length;Tk&&(k=R.startOffset,L[I++]=new w(k,F,D)),R.endOffset+1<=B)k=R.endOffset+1,L[I++]=new w(k,F+" "+R.className,D|R.metadata),y++;else{k=B,L[I++]=new w(k,F+" "+R.className,D|R.metadata);break}}B>k&&(k=B,L[I++]=new w(k,F,D))}const E=m[m.length-1].endIndex;if(y'):h.appendASCIIString("");for(let ne=0,le=I.length;ne=k&&(oe+=G)}}for(U&&(h.appendASCIIString(' style="width:'),h.appendASCIIString(String(A*$)),h.appendASCIIString('px"')),h.appendASCII(62);W1?h.write1(8594):h.write1(65515);for(let ae=2;ae<=oe;ae++)h.write1(160)}else oe=1,h.write1(B);K+=oe,W>=k&&(x+=oe)}ee=$}else{let $=0;for(h.appendASCII(62);W=k&&(x+=ae)}ee=$}H?Y++:Y=0,h.appendASCIIString("")}return R.setPartData(y,I.length-1,K,se),L&&h.appendASCIIString(""),h.appendASCIIString(""),new g(R,O,f)}}),define(Q[387],J([0,1,3]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewportData=void 0;class N{constructor(w,S,C,d){this.selections=w,this.startLineNumber=S.startLineNumber|0,this.endLineNumber=S.endLineNumber|0,this.relativeVerticalOffset=S.relativeVerticalOffset,this.bigNumbersDelta=S.bigNumbersDelta|0,this.whitespaceViewportData=C,this._model=d,this.visibleRange=new b.Range(S.startLineNumber,this._model.getLineMinColumn(S.startLineNumber),S.endLineNumber,this._model.getLineMaxColumn(S.endLineNumber))}getViewLineRenderingData(w){return this._model.getViewLineRenderingData(this.visibleRange,w)}getDecorationsInViewport(){return this._model.getDecorationsInViewport(this.visibleRange)}}e.ViewportData=N}),define(Q[222],J([0,1,122]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PrefixSumComputer=e.PrefixSumIndexOfResult=void 0;class N{constructor(S,C){this.index=S,this.remainder=C}}e.PrefixSumIndexOfResult=N;class M{constructor(S){this.values=S,this.prefixSum=new Uint32Array(S.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}insertValues(S,C){S=b.toUint32(S);const d=this.values,g=this.prefixSum,p=C.length;return p===0?!1:(this.values=new Uint32Array(d.length+p),this.values.set(d.subarray(0,S),0),this.values.set(d.subarray(S),S+p),this.values.set(C,S),S-1=0&&this.prefixSum.set(g.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}changeValue(S,C){return S=b.toUint32(S),C=b.toUint32(C),this.values[S]===C?!1:(this.values[S]=C,S-1=d.length)return!1;let p=d.length-S;return C>=p&&(C=p),C===0?!1:(this.values=new Uint32Array(d.length-C),this.values.set(d.subarray(0,S),0),this.values.set(d.subarray(S+C),S),this.prefixSum=new Uint32Array(this.values.length),S-1=0&&this.prefixSum.set(g.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}getTotalValue(){return this.values.length===0?0:this._getAccumulatedValue(this.values.length-1)}getAccumulatedValue(S){return S<0?0:(S=b.toUint32(S),this._getAccumulatedValue(S))}_getAccumulatedValue(S){if(S<=this.prefixSumValidIndex[0])return this.prefixSum[S];let C=this.prefixSumValidIndex[0]+1;C===0&&(this.prefixSum[0]=this.values[0],C++),S>=this.values.length&&(S=this.values.length-1);for(let d=C;d<=S;d++)this.prefixSum[d]=this.prefixSum[d-1]+this.values[d];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],S),this.prefixSum[S]}getIndexOf(S){S=Math.floor(S),this.getTotalValue();let C=0,d=this.values.length-1,g=0,p=0,c=0;for(;C<=d;)if(g=C+(d-C)/2|0,p=this.prefixSum[g],c=p-this.values[g],S=p)C=g+1;else break;return new N(g,S-c)}}e.PrefixSumComputer=M}),define(Q[388],J([0,1,8,14,222]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MirrorTextModel=void 0;class w{constructor(C,d,g,p){this._uri=C,this._lines=d,this._eol=g,this._versionId=p,this._lineStarts=null,this._cachedTextValue=null}dispose(){this._lines.length=0}getText(){return this._cachedTextValue===null&&(this._cachedTextValue=this._lines.join(this._eol)),this._cachedTextValue}onEvents(C){C.eol&&C.eol!==this._eol&&(this._eol=C.eol,this._lineStarts=null);const d=C.changes;for(const g of d)this._acceptDeleteRange(g.range),this._acceptInsertText(new N.Position(g.range.startLineNumber,g.range.startColumn),g.text);this._versionId=C.versionId,this._cachedTextValue=null}_ensureLineStarts(){if(!this._lineStarts){const C=this._eol.length,d=this._lines.length,g=new Uint32Array(d);for(let p=0;pthis._lines.length)h=this._lines.length,m=this._lines[h-1].length+1,_=!0;else{let f=this._lines[h-1].length+1;m<1?(m=1,_=!0):m>f&&(m=f,_=!0)}return _?{lineNumber:h,column:m}:l}}class i{constructor(l,h){this._host=l,this._models=Object.create(null),this._foreignModuleFactory=h,this._foreignModule=null}dispose(){this._models=Object.create(null)}_getModel(l){return this._models[l]}_getModels(){let l=[];return Object.keys(this._models).forEach(h=>l.push(this._models[h])),l}acceptNewModel(l){this._models[l.url]=new r(w.URI.parse(l.url),l.lines,l.EOL,l.versionId)}acceptModelChanged(l,h){!this._models[l]||this._models[l].onEvents(h)}acceptRemovedModel(l){!this._models[l]||delete this._models[l]}computeDiff(l,h,m,_){return Ie(this,void 0,void 0,function*(){const f=this._getModel(l),v=this._getModel(h);if(!f||!v)return null;const y=f.getLinesContent(),L=v.getLinesContent(),k=new d.DiffComputer(y,L,{shouldComputeCharChanges:!0,shouldPostProcessCharChanges:!0,shouldIgnoreTrimWhitespace:m,shouldMakePrettyDiff:!0,maxComputationTime:_}).computeDiff(),E=k.changes.length>0?!1:this._modelsAreIdentical(f,v);return{quitEarly:k.quitEarly,identical:E,changes:k.changes}})}_modelsAreIdentical(l,h){const m=l.getLineCount(),_=h.getLineCount();if(m!==_)return!1;for(let f=1;f<=m;f++){const v=l.getLineContent(f),y=h.getLineContent(f);if(v!==y)return!1}return!0}computeMoreMinimalEdits(l,h){return Ie(this,void 0,void 0,function*(){const m=this._getModel(l);if(!m)return h;const _=[];let f;h=b.mergeSort(h,(v,y)=>{if(v.range&&y.range)return C.Range.compareRangesUsingStarts(v.range,y.range);let L=v.range?0:1,I=y.range?0:1;return L-I});for(let{range:v,text:y,eol:L}of h)if(typeof L=="number"&&(f=L),!(C.Range.isEmpty(v)&&!y)){const I=m.getValueInRange(v);if(y=y.replace(/\r\n|\n|\r/g,m.eol),I!==y){if(Math.max(y.length,I.length)>i._diffLimit){_.push({range:v,text:y});continue}const k=N.stringDiff(I,y,!1),E=m.offsetAt(C.Range.lift(v).getStartPosition());for(const T of k){const O=m.positionAt(E+T.originalStart),A=m.positionAt(E+T.originalStart+T.originalLength),B={text:y.substr(T.modifiedStart,T.modifiedLength),range:{startLineNumber:O.lineNumber,startColumn:O.column,endLineNumber:A.lineNumber,endColumn:A.column}};m.getValueInRange(B.range)!==B.text&&_.push(B)}}}return typeof f=="number"&&_.push({eol:f,text:"",range:{startLineNumber:0,startColumn:0,endLineNumber:0,endColumn:0}}),_})}computeLinks(l){return Ie(this,void 0,void 0,function*(){let h=this._getModel(l);return h?c.computeLinks(h):null})}textualSuggest(l,h,m,_){return Ie(this,void 0,void 0,function*(){const f=new u.StopWatch(!0),v=new RegExp(m,_),y=new Set;e:for(let L of l){const I=this._getModel(L);if(!!I){for(let k of I.words(v))if(!(k===h||!isNaN(Number(k)))&&(y.add(k),y.size>i._suggestionsLimit))break e}}return{words:Array.from(y),duration:f.elapsed()}})}computeWordRanges(l,h,m,_){return Ie(this,void 0,void 0,function*(){let f=this._getModel(l);if(!f)return Object.create(null);const v=new RegExp(m,_),y=Object.create(null);for(let L=h.startLineNumber;Lthis._host.fhr(y,L);let v={host:a.createProxyObject(m,_),getMirrorModels:()=>this._getModels()};return this._foreignModuleFactory?(this._foreignModule=this._foreignModuleFactory(v,h),Promise.resolve(a.getAllMethodNames(this._foreignModule))):new Promise((y,L)=>{q([l],I=>{this._foreignModule=I.create(v,h),y(a.getAllMethodNames(this._foreignModule))},L)})}fmr(l,h){if(!this._foreignModule||typeof this._foreignModule[l]!="function")return Promise.reject(new Error("Missing requestHandler or method: "+l));try{return Promise.resolve(this._foreignModule[l].apply(this._foreignModule,h))}catch(m){return Promise.reject(m)}}}e.EditorSimpleWorker=i,i._diffLimit=1e5,i._suggestionsLimit=1e4;function n(t){return new i(t,null)}e.create=n,typeof importScripts=="function"&&(M.globals.monaco=s.createMonacoBaseAPI())}),define(Q[111],J([0,1,2]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewEventHandler=void 0;class N extends b.Disposable{constructor(){super();this._shouldRender=!0}shouldRender(){return this._shouldRender}forceShouldRender(){this._shouldRender=!0}setShouldRender(){this._shouldRender=!0}onDidRender(){this._shouldRender=!1}onCompositionStart(w){return!1}onCompositionEnd(w){return!1}onConfigurationChanged(w){return!1}onCursorStateChanged(w){return!1}onDecorationsChanged(w){return!1}onFlushed(w){return!1}onFocusChanged(w){return!1}onLanguageConfigurationChanged(w){return!1}onLineMappingChanged(w){return!1}onLinesChanged(w){return!1}onLinesDeleted(w){return!1}onLinesInserted(w){return!1}onRevealRangeRequest(w){return!1}onScrollChanged(w){return!1}onThemeChanged(w){return!1}onTokensChanged(w){return!1}onTokensColorsChanged(w){return!1}onZonesChanged(w){return!1}handleEvents(w){let S=!1;for(let C=0,d=w.length;C=s,h=i,m=n>=s;let _=p.left,f=c.left;return _+o>a.scrollLeft+a.viewportWidth&&(_=a.scrollLeft+a.viewportWidth-o),f+o>a.scrollLeft+a.viewportWidth&&(f=a.scrollLeft+a.viewportWidth-o),_u){const i=r-(u-s);r-=i,o-=i}if(r=v,I=t+s<=l.height-y;return this._fixedOverflowWidgets?{fitsAbove:L,aboveTop:Math.max(n,v),aboveLeft:m,fitsBelow:I,belowTop:t,belowLeft:f}:{fitsAbove:L,aboveTop:u,aboveLeft:h,fitsBelow:I,belowTop:r,belowLeft:_}}_prepareRenderWidgetAtExactPositionOverflowing(p){return new w(p.top,p.left+this._contentLeft)}_getTopAndBottomLeft(p){if(!this._viewRange)return[null,null];const c=p.linesVisibleRangesForRange(this._viewRange,!1);if(!c||c.length===0)return[null,null];let o=c[0],s=c[0];for(const l of c)l.lineNumbers.lineNumber&&(s=l);let a=1073741824;for(const l of o.ranges)l.leftp.endLineNumber||this.domNode.setMaxWidth(this._maxWidth)}prepareRender(p){this._renderData=this._prepareRenderWidget(p)}render(p){if(!this._renderData){this._isVisible&&(this.domNode.removeAttribute("monaco-visible-content-widget"),this._isVisible=!1,this.domNode.setVisibility("hidden")),typeof this._actual.afterRender=="function"&&d(this._actual.afterRender,this._actual,null);return}this.allowEditorOverflow?(this.domNode.setTop(this._renderData.coordinate.top),this.domNode.setLeft(this._renderData.coordinate.left)):(this.domNode.setTop(this._renderData.coordinate.top+p.scrollTop-p.bigNumbersDelta),this.domNode.setLeft(this._renderData.coordinate.left)),this._isVisible||(this.domNode.setVisibility("inherit"),this.domNode.setAttribute("monaco-visible-content-widget","true"),this._isVisible=!0),typeof this._actual.afterRender=="function"&&d(this._actual.afterRender,this._actual,this._renderData.position)}}function d(g,p,...c){try{return g.call(p,...c)}catch(o){return null}}}),define(Q[391],J([0,1,94,3,110,319]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DecorationsOverlay=void 0;class w extends b.DynamicViewOverlay{constructor(C){super();this._context=C;const d=this._context.configuration.options;this._lineHeight=d.get(53),this._typicalHalfwidthCharacterWidth=d.get(38).typicalHalfwidthCharacterWidth,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(C){const d=this._context.configuration.options;return this._lineHeight=d.get(53),this._typicalHalfwidthCharacterWidth=d.get(38).typicalHalfwidthCharacterWidth,!0}onDecorationsChanged(C){return!0}onFlushed(C){return!0}onLinesChanged(C){return!0}onLinesDeleted(C){return!0}onLinesInserted(C){return!0}onScrollChanged(C){return C.scrollTopChanged||C.scrollWidthChanged}onZonesChanged(C){return!0}prepareRender(C){const d=C.getDecorationsInViewport();let g=[],p=0;for(let a=0,u=d.length;a{if(a.options.zIndexu.options.zIndex)return 1;const r=a.options.className,i=u.options.className;return ri?1:N.Range.compareRangesUsingStarts(a.range,u.range)});const c=C.visibleRange.startLineNumber,o=C.visibleRange.endLineNumber,s=[];for(let a=c;a<=o;a++){const u=a-c;s[u]=""}this._renderWholeLineDecorations(C,g,s),this._renderNormalDecorations(C,g,s),this._renderResult=s}_renderWholeLineDecorations(C,d,g){const p=String(this._lineHeight),c=C.visibleRange.startLineNumber,o=C.visibleRange.endLineNumber;for(let s=0,a=d.length;s',i=Math.max(u.range.startLineNumber,c),n=Math.min(u.range.endLineNumber,o);for(let t=i;t<=n;t++){const l=t-c;g[l]+=r}}}}_renderNormalDecorations(C,d,g){const p=String(this._lineHeight),c=C.visibleRange.startLineNumber;let o=null,s=!1,a=null;for(let u=0,r=d.length;u';s[n]+=m}}}}render(C,d){if(!this._renderResult)return"";const g=d-C;return g<0||g>=this._renderResult.length?"":this._renderResult[g]}}e.DecorationsOverlay=w}),define(Q[172],J([0,1,94,320]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlyphMarginOverlay=e.DedupOverlay=e.DecorationToRender=void 0;class N{constructor(C,d,g){this.startLineNumber=+C,this.endLineNumber=+d,this.className=String(g)}}e.DecorationToRender=N;class M extends b.DynamicViewOverlay{_render(C,d,g){const p=[];for(let s=C;s<=d;s++){const a=s-C;p[a]=[]}if(g.length===0)return p;g.sort((s,a)=>s.className===a.className?s.startLineNumber===a.startLineNumber?s.endLineNumber-a.endLineNumber:s.startLineNumber-a.startLineNumber:s.className',u=[];for(let r=d;r<=g;r++){const i=r-d,n=p[i];n.length===0?u[i]="":u[i]='
    =this._renderResult.length?"":this._renderResult[g]}}e.GlyphMarginOverlay=w}),define(Q[392],J([0,1,172,324]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinesDecorationsOverlay=void 0;class N extends b.DedupOverlay{constructor(w){super();this._context=w;const C=this._context.configuration.options.get(124);this._decorationsLeft=C.decorationsLeft,this._decorationsWidth=C.decorationsWidth,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(w){const C=this._context.configuration.options.get(124);return this._decorationsLeft=C.decorationsLeft,this._decorationsWidth=C.decorationsWidth,!0}onDecorationsChanged(w){return!0}onFlushed(w){return!0}onLinesChanged(w){return!0}onLinesDeleted(w){return!0}onLinesInserted(w){return!0}onScrollChanged(w){return w.scrollTopChanged}onZonesChanged(w){return!0}_getDecorations(w){const S=w.getDecorationsInViewport();let C=[],d=0;for(let g=0,p=S.length;g
    ',o=[];for(let s=S;s<=C;s++){const a=s-S,u=d[a];let r="";for(let i=0,n=u.length;i';g[c]=s}this._renderResult=g}render(w,S){return this._renderResult?this._renderResult[S-w]:""}}e.MarginViewLineDecorationsOverlay=N}),define(Q[394],J([0,1,30,45,327]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewOverlayWidgets=void 0;class M extends N.ViewPart{constructor(S){super(S);const d=this._context.configuration.options.get(124);this._widgets={},this._verticalScrollbarWidth=d.verticalScrollbarWidth,this._minimapWidth=d.minimap.minimapWidth,this._horizontalScrollbarHeight=d.horizontalScrollbarHeight,this._editorHeight=d.height,this._editorWidth=d.width,this._domNode=b.createFastDomNode(document.createElement("div")),N.PartFingerprints.write(this._domNode,4),this._domNode.setClassName("overlayWidgets")}dispose(){super.dispose(),this._widgets={}}getDomNode(){return this._domNode}onConfigurationChanged(S){const d=this._context.configuration.options.get(124);return this._verticalScrollbarWidth=d.verticalScrollbarWidth,this._minimapWidth=d.minimap.minimapWidth,this._horizontalScrollbarHeight=d.horizontalScrollbarHeight,this._editorHeight=d.height,this._editorWidth=d.width,!0}addWidget(S){const C=b.createFastDomNode(S.getDomNode());this._widgets[S.getId()]={widget:S,preference:null,domNode:C},C.setPosition("absolute"),C.setAttribute("widgetId",S.getId()),this._domNode.appendChild(C),this.setShouldRender()}setWidgetPosition(S,C){const d=this._widgets[S.getId()];return d.preference===C?!1:(d.preference=C,this.setShouldRender(),!0)}removeWidget(S){const C=S.getId();if(this._widgets.hasOwnProperty(C)){const g=this._widgets[C].domNode.domNode;delete this._widgets[C],g.parentNode.removeChild(g),this.setShouldRender()}}_renderWidget(S){const C=S.domNode;if(S.preference===null){C.unsetTop();return}if(S.preference===0)C.setTop(0),C.setRight(2*this._verticalScrollbarWidth+this._minimapWidth);else if(S.preference===1){const d=C.domNode.clientHeight;C.setTop(this._editorHeight-d-2*this._horizontalScrollbarHeight),C.setRight(2*this._verticalScrollbarWidth+this._minimapWidth)}else S.preference===2&&(C.setTop(0),C.domNode.style.right="50%")}prepareRender(S){}render(S){this._domNode.setWidth(this._editorWidth);const C=Object.keys(this._widgets);for(let d=0,g=C.length;dthis._context.viewLayout.getVerticalOffsetForLineNumber(p)),this._zoneManager.setDOMWidth(0),this._zoneManager.setDOMHeight(0),this._zoneManager.setOuterHeight(this._context.viewLayout.getScrollHeight()),this._zoneManager.setLineHeight(g.get(53)),this._zoneManager.setPixelRatio(g.get(122)),this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}onConfigurationChanged(C){const d=this._context.configuration.options;return C.hasChanged(53)&&(this._zoneManager.setLineHeight(d.get(53)),this._render()),C.hasChanged(122)&&(this._zoneManager.setPixelRatio(d.get(122)),this._domNode.setWidth(this._zoneManager.getDOMWidth()),this._domNode.setHeight(this._zoneManager.getDOMHeight()),this._domNode.domNode.width=this._zoneManager.getCanvasWidth(),this._domNode.domNode.height=this._zoneManager.getCanvasHeight(),this._render()),!0}onFlushed(C){return this._render(),!0}onScrollChanged(C){return C.scrollHeightChanged&&(this._zoneManager.setOuterHeight(C.scrollHeight),this._render()),!0}onZonesChanged(C){return this._render(),!0}getDomNode(){return this._domNode.domNode}setLayout(C){this._domNode.setTop(C.top),this._domNode.setRight(C.right);let d=!1;d=this._zoneManager.setDOMWidth(C.width)||d,d=this._zoneManager.setDOMHeight(C.height)||d,d&&(this._domNode.setWidth(this._zoneManager.getDOMWidth()),this._domNode.setHeight(this._zoneManager.getDOMHeight()),this._domNode.domNode.width=this._zoneManager.getCanvasWidth(),this._domNode.domNode.height=this._zoneManager.getCanvasHeight(),this._render())}setZones(C){this._zoneManager.setZones(C),this._render()}_render(){if(this._zoneManager.getOuterHeight()===0)return!1;const C=this._zoneManager.getCanvasWidth(),d=this._zoneManager.getCanvasHeight(),g=this._zoneManager.resolveColorZones(),p=this._zoneManager.getId2Color(),c=this._domNode.domNode.getContext("2d");return c.clearRect(0,0,C,d),g.length>0&&this._renderOneLane(c,g,p,C),!0}_renderOneLane(C,d,g,p){let c=0,o=0,s=0;for(const a of d){const u=a.colorId,r=a.from,i=a.to;u!==c?(C.fillRect(0,o,p,s-o),c=u,C.fillStyle=g[c],o=r,s=i):s>=r?s=Math.max(s,i):(C.fillRect(0,o,p,s-o),o=r,s=i)}C.fillRect(0,o,p,s-o)}}e.OverviewRuler=w}),define(Q[396],J([0,1,30,12,45,14]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewZones=void 0;const S=()=>{throw new Error("Invalid change accessor")};class C extends M.ViewPart{constructor(p){super(p);const c=this._context.configuration.options,o=c.get(124);this._lineHeight=c.get(53),this._contentWidth=o.contentWidth,this._contentLeft=o.contentLeft,this.domNode=b.createFastDomNode(document.createElement("div")),this.domNode.setClassName("view-zones"),this.domNode.setPosition("absolute"),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this.marginDomNode=b.createFastDomNode(document.createElement("div")),this.marginDomNode.setClassName("margin-view-zones"),this.marginDomNode.setPosition("absolute"),this.marginDomNode.setAttribute("role","presentation"),this.marginDomNode.setAttribute("aria-hidden","true"),this._zones={}}dispose(){super.dispose(),this._zones={}}_recomputeWhitespacesProps(){const p=this._context.viewLayout.getWhitespaces(),c=new Map;for(const s of p)c.set(s.id,s);let o=!1;return this._context.model.changeWhitespace(s=>{const a=Object.keys(this._zones);for(let u=0,r=a.length;u{const s={addZone:a=>(c=!0,this._addZone(o,a)),removeZone:a=>{!a||(c=this._removeZone(o,a)||c)},layoutZone:a=>{!a||(c=this._layoutZone(o,a)||c)}};d(p,s),s.addZone=S,s.removeZone=S,s.layoutZone=S}),c}_addZone(p,c){const o=this._computeWhitespaceProps(c),a={whitespaceId:p.insertWhitespace(o.afterViewLineNumber,this._getZoneOrdinal(c),o.heightInPx,o.minWidthInPx),delegate:c,isVisible:!1,domNode:b.createFastDomNode(c.domNode),marginDomNode:c.marginDomNode?b.createFastDomNode(c.marginDomNode):null};return this._safeCallOnComputedHeight(a.delegate,o.heightInPx),a.domNode.setPosition("absolute"),a.domNode.domNode.style.width="100%",a.domNode.setDisplay("none"),a.domNode.setAttribute("monaco-view-zone",a.whitespaceId),this.domNode.appendChild(a.domNode),a.marginDomNode&&(a.marginDomNode.setPosition("absolute"),a.marginDomNode.domNode.style.width="100%",a.marginDomNode.setDisplay("none"),a.marginDomNode.setAttribute("monaco-view-zone",a.whitespaceId),this.marginDomNode.appendChild(a.marginDomNode)),this._zones[a.whitespaceId]=a,this.setShouldRender(),a.whitespaceId}_removeZone(p,c){if(this._zones.hasOwnProperty(c)){const o=this._zones[c];return delete this._zones[c],p.removeWhitespace(o.whitespaceId),o.domNode.removeAttribute("monaco-visible-view-zone"),o.domNode.removeAttribute("monaco-view-zone"),o.domNode.domNode.parentNode.removeChild(o.domNode.domNode),o.marginDomNode&&(o.marginDomNode.removeAttribute("monaco-visible-view-zone"),o.marginDomNode.removeAttribute("monaco-view-zone"),o.marginDomNode.domNode.parentNode.removeChild(o.marginDomNode.domNode)),this.setShouldRender(),!0}return!1}_layoutZone(p,c){if(this._zones.hasOwnProperty(c)){const o=this._zones[c],s=this._computeWhitespaceProps(o.delegate);return p.changeOneWhitespace(o.whitespaceId,s.afterViewLineNumber,s.heightInPx),this._safeCallOnComputedHeight(o.delegate,s.heightInPx),this.setShouldRender(),!0}return!1}shouldSuppressMouseDownOnViewZone(p){if(this._zones.hasOwnProperty(p)){const c=this._zones[p];return Boolean(c.delegate.suppressMouseDown)}return!1}_heightInPixels(p){return typeof p.heightInPx=="number"?p.heightInPx:typeof p.heightInLines=="number"?this._lineHeight*p.heightInLines:this._lineHeight}_minWidthInPixels(p){return typeof p.minWidthInPx=="number"?p.minWidthInPx:0}_safeCallOnComputedHeight(p,c){if(typeof p.onComputedHeight=="function")try{p.onComputedHeight(c)}catch(o){N.onUnexpectedError(o)}}_safeCallOnDomNodeTop(p,c){if(typeof p.onDomNodeTop=="function")try{p.onDomNodeTop(c)}catch(o){N.onUnexpectedError(o)}}prepareRender(p){}render(p){const c=p.viewportData.whitespaceViewportData,o={};let s=!1;for(let u=0,r=c.length;u0?o[r-1]:0,s=n)a=r+1;else break}return new M(r,s-i)}}e.LineBreakData=w;class S{constructor(o,s){this.tabSize=o,this.data=s}}e.MinimapLinesRenderingData=S;class C{constructor(o,s,a,u,r,i){this.content=o,this.continuesWithWrappedLine=s,this.minColumn=a,this.maxColumn=u,this.startVisibleColumn=r,this.tokens=i}}e.ViewLineData=C;class d{constructor(o,s,a,u,r,i,n,t,l,h){this.minColumn=o,this.maxColumn=s,this.content=a,this.continuesWithWrappedLine=u,this.isBasicASCII=d.isBasicASCII(a,i),this.containsRTL=d.containsRTL(a,this.isBasicASCII,r),this.tokens=n,this.inlineDecorations=t,this.tabSize=l,this.startVisibleColumn=h}static isBasicASCII(o,s){return s?b.isBasicASCII(o):!0}static containsRTL(o,s,a){return!s&&a?b.containsRTL(o):!1}}e.ViewLineRenderingData=d;class g{constructor(o,s,a){this.range=o,this.inlineClassName=s,this.type=a}}e.InlineDecoration=g;class p{constructor(o,s){this.range=o,this.options=s}}e.ViewModelDecoration=p}),define(Q[397],J([0,1,8,91,63]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MonospaceLineBreaksComputerFactory=void 0;class w extends N.CharacterClassifier{constructor(r,i){super(0);for(let n=0;n=0&&r<256?this._asciiMap[r]:r>=12352&&r<=12543||r>=13312&&r<=19903||r>=19968&&r<=40959?3:this._map.get(r)||this._defaultValue}}let S=[],C=[];class d{constructor(r,i){this.classifier=new w(r,i)}static create(r){return new d(r.get(113),r.get(112))}createLineBreaksComputer(r,i,n,t){i=i|0,n=+n;let l=[],h=[];return{addRequest:(m,_)=>{l.push(m),h.push(_)},finalize:()=>{const m=r.typicalFullwidthCharacterWidth/r.typicalHalfwidthCharacterWidth;let _=[];for(let f=0,v=l.length;f=0){let F=Math.abs(f[B]-O);for(;B+1=F)break;F=D,B++}}for(;BF&&(F=E,D=T);let R=0,W=0,x=0,K=0;if(D<=O){let ee=D,se=F===0?0:i.charCodeAt(F-1),ne=F===0?0:u.get(se),le=!0;for(let X=F;XE&&s(se,ne,P,V)&&(R=z,W=ee),ee+=U,ee>O){z>E?(x=z,K=ee-U):(x=X+1,K=ee),ee-W>y&&(R=0),le=!1;break}se=P,ne=V}if(le){k>0&&(L[k]=_[_.length-1],I[k]=f[_.length-1],k++);break}}if(R===0){let ee=D,se=i.charCodeAt(F),ne=u.get(se),le=!1;for(let X=F-1;X>=E;X--){const z=X+1,P=i.charCodeAt(X);if(P===9){le=!0;break}let V,U;if(b.isLowSurrogate(P)?(X--,V=0,U=2):(V=u.get(P),U=b.isFullWidthCharacter(P)?l:1),ee<=O){if(x===0&&(x=z,K=ee),ee<=O-y)break;if(s(P,V,se,ne)){R=z,W=ee;break}}ee-=U,se=P,ne=V}if(R!==0){const X=y-(K-W);if(X<=n){const z=i.charCodeAt(x);let P;b.isHighSurrogate(z)?P=2:P=c(z,K,n,l),X-P<0&&(R=0)}}if(le){B--;continue}}if(R===0&&(R=x,W=K),R<=E){const ee=i.charCodeAt(E);b.isHighSurrogate(ee)?(R=E+2,W=T+2):(R=E+1,W=T+c(ee,T,n,l))}for(E=R,L[k]=R,T=W,I[k]=W,k++,O=W+y;B<0||B=Y)break;Y=ee,B++}}return k===0?null:(L.length=k,I.length=k,S=r.breakOffsets,C=r.breakOffsetsVisibleColumn,r.breakOffsets=L,r.breakOffsetsVisibleColumn=I,r.wrappedTextIndentLength=v,r)}function p(u,r,i,n,t,l){if(n===-1)return null;const h=r.length;if(h<=1)return null;const m=a(r,i,n,t,l),_=n-m;let f=[],v=[],y=0,L=0,I=0,k=n,E=r.charCodeAt(0),T=u.get(E),O=c(E,0,i,t),A=1;b.isHighSurrogate(E)&&(O+=1,E=r.charCodeAt(1),T=u.get(E),A++);for(let B=A;Bk&&((L===0||O-I>_)&&(L=F,I=O-W),f[y]=L,v[y]=I,y++,k=I+_,L=0),E=D,T=R}return y===0?null:(f[y]=h,v[y]=O,new M.LineBreakData(f,v,m))}function c(u,r,i,n){return u===9?i-r%i:b.isFullWidthCharacter(u)||u<32?n:1}function o(u,r){return r-u%r}function s(u,r,i,n){return i!==32&&(r===2||r===3&&n!==2||n===1||n===3&&r!==1)}function a(u,r,i,n,t){let l=0;if(t!==0){const h=b.firstNonWhitespaceIndex(u);if(h!==-1){for(let _=0;_i&&(l=0)}}return l}}),define(Q[173],J([0,1,6,2]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReadOnlyEditAttemptEvent=e.CursorStateChangedEvent=e.ViewZonesChangedEvent=e.ScrollChangedEvent=e.FocusChangedEvent=e.ContentSizeChangedEvent=e.ViewModelEventsCollector=e.ViewModelEventDispatcher=void 0;class M extends N.Disposable{constructor(){super();this._onEvent=this._register(new b.Emitter),this.onEvent=this._onEvent.event,this._eventHandlers=[],this._viewEventQueue=null,this._isConsumingViewEventQueue=!1,this._collector=null,this._collectorCnt=0,this._outgoingEvents=[]}emitOutgoingEvent(s){this._addOutgoingEvent(s),this._emitOugoingEvents()}_addOutgoingEvent(s){for(let a=0,u=this._outgoingEvents.length;a0;){if(this._collector||this._isConsumingViewEventQueue)return;const s=this._outgoingEvents.shift();s.isNoOp()||this._onEvent.fire(s)}}addViewEventHandler(s){for(let a=0,u=this._eventHandlers.length;a0&&this._emitMany(a)}this._emitOugoingEvents()}emitSingleViewEvent(s){try{this.beginEmitViewEvents().emitViewEvent(s)}finally{this.endEmitViewEvents()}}_emitMany(s){this._viewEventQueue?this._viewEventQueue=this._viewEventQueue.concat(s):this._viewEventQueue=s,this._isConsumingViewEventQueue||this._consumeViewEventQueue()}_consumeViewEventQueue(){try{this._isConsumingViewEventQueue=!0,this._doConsumeQueue()}finally{this._isConsumingViewEventQueue=!1}}_doConsumeQueue(){for(;this._viewEventQueue;){const s=this._viewEventQueue;this._viewEventQueue=null;const a=this._eventHandlers.slice(0);for(const u of a)u.handleEvents(s)}}}e.ViewModelEventDispatcher=M;class w{constructor(){this.viewEvents=[],this.outgoingEvents=[]}emitViewEvent(s){this.viewEvents.push(s)}emitOutgoingEvent(s){this.outgoingEvents.push(s)}}e.ViewModelEventsCollector=w;class S{constructor(s,a,u,r){this.kind=0,this._oldContentWidth=s,this._oldContentHeight=a,this.contentWidth=u,this.contentHeight=r,this.contentWidthChanged=this._oldContentWidth!==this.contentWidth,this.contentHeightChanged=this._oldContentHeight!==this.contentHeight}isNoOp(){return!this.contentWidthChanged&&!this.contentHeightChanged}merge(s){return s.kind!==0?this:new S(this._oldContentWidth,this._oldContentHeight,s.contentWidth,s.contentHeight)}}e.ContentSizeChangedEvent=S;class C{constructor(s,a){this.kind=1,this.oldHasFocus=s,this.hasFocus=a}isNoOp(){return this.oldHasFocus===this.hasFocus}merge(s){return s.kind!==1?this:new C(this.oldHasFocus,s.hasFocus)}}e.FocusChangedEvent=C;class d{constructor(s,a,u,r,i,n,t,l){this.kind=2,this._oldScrollWidth=s,this._oldScrollLeft=a,this._oldScrollHeight=u,this._oldScrollTop=r,this.scrollWidth=i,this.scrollLeft=n,this.scrollHeight=t,this.scrollTop=l,this.scrollWidthChanged=this._oldScrollWidth!==this.scrollWidth,this.scrollLeftChanged=this._oldScrollLeft!==this.scrollLeft,this.scrollHeightChanged=this._oldScrollHeight!==this.scrollHeight,this.scrollTopChanged=this._oldScrollTop!==this.scrollTop}isNoOp(){return!this.scrollWidthChanged&&!this.scrollLeftChanged&&!this.scrollHeightChanged&&!this.scrollTopChanged}merge(s){return s.kind!==2?this:new d(this._oldScrollWidth,this._oldScrollLeft,this._oldScrollHeight,this._oldScrollTop,s.scrollWidth,s.scrollLeft,s.scrollHeight,s.scrollTop)}}e.ScrollChangedEvent=d;class g{constructor(){this.kind=3}isNoOp(){return!1}merge(s){return this}}e.ViewZonesChangedEvent=g;class p{constructor(s,a,u,r,i,n,t){this.kind=5,this.oldSelections=s,this.selections=a,this.oldModelVersionId=u,this.modelVersionId=r,this.source=i,this.reason=n,this.reachedMaxCursorCount=t}static _selectionsAreEqual(s,a){if(!s&&!a)return!0;if(!s||!a)return!1;const u=s.length,r=a.length;if(u!==r)return!1;for(let i=0;i=a?0:r.horizontalScrollbarSize}_getContentHeight(s,a,u){const r=this._configuration.options;let i=this._linesLayout.getLinesTotalHeight();return r.get(89)?i+=Math.max(0,a-r.get(53)-r.get(69).bottom):i+=this._getHorizontalScrollbarHeight(s,u),i}_updateHeight(){const s=this._scrollable.getScrollDimensions(),a=s.width,u=s.height,r=s.contentWidth;this._scrollable.setScrollDimensions(new g(a,s.contentWidth,u,this._getContentHeight(a,u,r)))}getCurrentViewport(){const s=this._scrollable.getScrollDimensions(),a=this._scrollable.getCurrentScrollPosition();return new S.Viewport(a.scrollTop,a.scrollLeft,s.width,s.height)}getFutureViewport(){const s=this._scrollable.getScrollDimensions(),a=this._scrollable.getFutureScrollPosition();return new S.Viewport(a.scrollTop,a.scrollLeft,s.width,s.height)}_computeContentWidth(s){const a=this._configuration.options,u=a.get(125),r=a.get(38);if(u.isViewportWrapping){const i=a.get(124),n=a.get(59);return s>i.contentWidth+r.typicalHalfwidthCharacterWidth&&n.enabled&&n.side==="right"?s+i.verticalScrollbarWidth:s}else{const i=a.get(88)*r.typicalHalfwidthCharacterWidth,n=this._linesLayout.getWhitespaceMinWidth();return Math.max(s+i,n)}}setMaxLineWidth(s){const a=this._scrollable.getScrollDimensions();this._scrollable.setScrollDimensions(new g(a.width,this._computeContentWidth(s),a.height,a.contentHeight)),this._updateHeight()}saveState(){const s=this._scrollable.getFutureScrollPosition();let a=s.scrollTop,u=this._linesLayout.getLineNumberAtOrAfterVerticalOffset(a),r=this._linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(u);return{scrollTop:a,scrollTopWithoutViewZones:a-r,scrollLeft:s.scrollLeft}}changeWhitespace(s){const a=this._linesLayout.changeWhitespace(s);return a&&this.onHeightMaybeChanged(),a}getVerticalOffsetForLineNumber(s){return this._linesLayout.getVerticalOffsetForLineNumber(s)}isAfterLines(s){return this._linesLayout.isAfterLines(s)}isInTopPadding(s){return this._linesLayout.isInTopPadding(s)}isInBottomPadding(s){return this._linesLayout.isInBottomPadding(s)}getLineNumberAtVerticalOffset(s){return this._linesLayout.getLineNumberAtOrAfterVerticalOffset(s)}getWhitespaceAtVerticalOffset(s){return this._linesLayout.getWhitespaceAtVerticalOffset(s)}getLinesViewportData(){const s=this.getCurrentViewport();return this._linesLayout.getLinesViewportData(s.top,s.top+s.height)}getLinesViewportDataAtScrollTop(s){const a=this._scrollable.getScrollDimensions();return s+a.height>a.scrollHeight&&(s=a.scrollHeight-a.height),s<0&&(s=0),this._linesLayout.getLinesViewportData(s,s+a.height)}getWhitespaceViewportData(){const s=this.getCurrentViewport();return this._linesLayout.getWhitespaceViewportData(s.top,s.top+s.height)}getWhitespaces(){return this._linesLayout.getWhitespaces()}getContentWidth(){return this._scrollable.getScrollDimensions().contentWidth}getScrollWidth(){return this._scrollable.getScrollDimensions().scrollWidth}getContentHeight(){return this._scrollable.getScrollDimensions().contentHeight}getScrollHeight(){return this._scrollable.getScrollDimensions().scrollHeight}getCurrentScrollLeft(){return this._scrollable.getCurrentScrollPosition().scrollLeft}getCurrentScrollTop(){return this._scrollable.getCurrentScrollPosition().scrollTop}validateScrollPosition(s){return this._scrollable.validateScrollPosition(s)}setScrollPosition(s,a){a===1?this._scrollable.setScrollPositionNow(s):this._scrollable.setScrollPositionSmooth(s)}deltaScrollNow(s,a){const u=this._scrollable.getCurrentScrollPosition();this._scrollable.setScrollPositionNow({scrollLeft:u.scrollLeft+s,scrollTop:u.scrollTop+a})}}e.ViewLayout=c}),define(Q[399],J([0,1,3,21]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MoveCaretCommand=void 0;class M{constructor(S,C){this._selection=S,this._isMovingLeft=C}getEditOperations(S,C){if(!(this._selection.startLineNumber!==this._selection.endLineNumber||this._selection.isEmpty())){const d=this._selection.startLineNumber,g=this._selection.startColumn,p=this._selection.endColumn;if(!(this._isMovingLeft&&g===1)&&!(!this._isMovingLeft&&p===S.getLineMaxColumn(d)))if(this._isMovingLeft){const c=new b.Range(d,g-1,d,g),o=S.getValueInRange(c);C.addEditOperation(c,null),C.addEditOperation(new b.Range(d,p,d,p),o)}else{const c=new b.Range(d,p,d,p+1),o=S.getValueInRange(c);C.addEditOperation(c,null),C.addEditOperation(new b.Range(d,g,d,g),o)}}}computeCursorState(S,C){return this._isMovingLeft?new N.Selection(this._selection.startLineNumber,this._selection.startColumn-1,this._selection.endLineNumber,this._selection.endColumn-1):new N.Selection(this._selection.startLineNumber,this._selection.startColumn+1,this._selection.endLineNumber,this._selection.endColumn+1)}}e.MoveCaretCommand=M}),define(Q[130],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionCommandArgs=e.filtersAction=e.mayIncludeActionsOfKind=e.CodeActionKind=void 0;class b{constructor(d){this.value=d}equals(d){return this.value===d.value}contains(d){return this.equals(d)||this.value===""||d.value.startsWith(this.value+b.sep)}intersects(d){return this.contains(d)||d.contains(this)}append(d){return new b(this.value+b.sep+d)}}e.CodeActionKind=b,b.sep=".",b.None=new b("@@none@@"),b.Empty=new b(""),b.QuickFix=new b("quickfix"),b.Refactor=new b("refactor"),b.Source=new b("source"),b.SourceOrganizeImports=b.Source.append("organizeImports"),b.SourceFixAll=b.Source.append("fixAll");function N(C,d){return!(C.include&&!C.include.intersects(d)||C.excludes&&C.excludes.some(g=>w(d,g,C.include))||!C.includeSourceActions&&b.Source.contains(d))}e.mayIncludeActionsOfKind=N;function M(C,d){const g=d.kind?new b(d.kind):void 0;return!(C.include&&(!g||!C.include.contains(g))||C.excludes&&g&&C.excludes.some(p=>w(g,p,C.include))||!C.includeSourceActions&&g&&b.Source.contains(g)||C.onlyIncludePreferredActions&&!d.isPreferred)}e.filtersAction=M;function w(C,d,g){return!(!d.contains(C)||g&&d.contains(g))}class S{constructor(d,g,p){this.kind=d,this.apply=g,this.preferred=p}static fromUser(d,g){return!d||typeof d!="object"?new S(g.kind,g.apply,!1):new S(S.getKindFromUser(d,g.kind),S.getApplyFromUser(d,g.apply),S.getPreferredUser(d))}static getApplyFromUser(d,g){switch(typeof d.apply=="string"?d.apply.toLowerCase():""){case"first":return"first";case"never":return"never";case"ifsingle":return"ifSingle";default:return g}}static getKindFromUser(d,g){return typeof d.kind=="string"?new b(d.kind):g}static getPreferredUser(d){return typeof d.preferred=="boolean"?d.preferred:!1}}e.CodeActionCommandArgs=S}),define(Q[400],J([0,1,6]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorPickerModel=void 0;class N{constructor(w,S,C){this.presentationIndex=C,this._onColorFlushed=new b.Emitter,this.onColorFlushed=this._onColorFlushed.event,this._onDidChangeColor=new b.Emitter,this.onDidChangeColor=this._onDidChangeColor.event,this._onDidChangePresentation=new b.Emitter,this.onDidChangePresentation=this._onDidChangePresentation.event,this.originalColor=w,this._color=w,this._colorPresentations=S}get color(){return this._color}set color(w){this._color.equals(w)||(this._color=w,this._onDidChangeColor.fire(w))}get presentation(){return this.colorPresentations[this.presentationIndex]}get colorPresentations(){return this._colorPresentations}set colorPresentations(w){this._colorPresentations=w,this.presentationIndex>w.length-1&&(this.presentationIndex=0),this._onDidChangePresentation.fire(this.presentation)}selectNextColorPresentation(){this.presentationIndex=(this.presentationIndex+1)%this.colorPresentations.length,this.flushColor(),this._onDidChangePresentation.fire(this.presentation)}guessColorPresentation(w,S){for(let C=0;Cs)return!1;for(let a=0;a=65&&u<=90&&u+32===r)&&!(r>=65&&r<=90&&r+32===u))return!1}return!0}_createOperationsForBlockComment(g,p,c,o,s,a){const u=g.startLineNumber,r=g.startColumn,i=g.endLineNumber,n=g.endColumn,t=s.getLineContent(u),l=s.getLineContent(i);let h=t.lastIndexOf(p,r-1+p.length),m=l.indexOf(c,n-1-c.length);if(h!==-1&&m!==-1)if(u===i)t.substring(h+p.length,m).indexOf(c)>=0&&(h=-1,m=-1);else{const f=t.substring(h+p.length),v=l.substring(0,m);(f.indexOf(c)>=0||v.indexOf(c)>=0)&&(h=-1,m=-1)}let _;h!==-1&&m!==-1?(o&&h+p.length0&&l.charCodeAt(m-1)===32&&(c=" "+c,m-=1),_=C._createRemoveBlockCommentOperations(new M.Range(u,h+p.length+1,i,m+1),p,c)):(_=C._createAddBlockCommentOperations(g,p,c,this._insertSpace),this._usedEndToken=_.length===1?c:null);for(const f of _)a.addTrackedEditOperation(f.range,f.text)}static _createRemoveBlockCommentOperations(g,p,c){let o=[];return M.Range.isEmpty(g)?o.push(b.EditOperation.delete(new M.Range(g.startLineNumber,g.startColumn-p.length,g.endLineNumber,g.endColumn+c.length))):(o.push(b.EditOperation.delete(new M.Range(g.startLineNumber,g.startColumn-p.length,g.startLineNumber,g.startColumn))),o.push(b.EditOperation.delete(new M.Range(g.endLineNumber,g.endColumn,g.endLineNumber,g.endColumn+c.length)))),o}static _createAddBlockCommentOperations(g,p,c,o){let s=[];return M.Range.isEmpty(g)?s.push(b.EditOperation.replace(new M.Range(g.startLineNumber,g.startColumn,g.endLineNumber,g.endColumn),p+" "+c)):(s.push(b.EditOperation.insert(new N.Position(g.startLineNumber,g.startColumn),p+(o?" ":""))),s.push(b.EditOperation.insert(new N.Position(g.endLineNumber,g.endColumn),(o?" ":"")+c))),s}getEditOperations(g,p){const c=this._selection.startLineNumber,o=this._selection.startColumn;g.tokenizeIfCheap(c);const s=g.getLanguageIdAtPosition(c,o),a=S.LanguageConfigurationRegistry.getComments(s);!a||!a.blockCommentStartToken||!a.blockCommentEndToken||this._createOperationsForBlockComment(this._selection,a.blockCommentStartToken,a.blockCommentEndToken,this._insertSpace,g,p)}computeCursorState(g,p){const c=p.getInverseEditOperations();if(c.length===2){const o=c[0],s=c[1];return new w.Selection(o.range.endLineNumber,o.range.endColumn,s.range.startLineNumber,s.range.startColumn)}else{const o=c[0].range,s=this._usedEndToken?-this._usedEndToken.length-1:0;return new w.Selection(o.endLineNumber,o.endColumn+s,o.endLineNumber,o.endColumn+s)}}}e.BlockCommentCommand=C}),define(Q[401],J([0,1,8,62,14,3,21,41,224]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineCommentCommand=void 0;class g{constructor(c,o,s,a,u,r){this._selection=c,this._tabSize=o,this._type=s,this._insertSpace=a,this._selectionId=null,this._deltaColumn=0,this._moveEndPositionDown=!1,this._ignoreEmptyLines=u,this._ignoreFirstLine=r||!1}static _gatherPreflightCommentStrings(c,o,s){c.tokenizeIfCheap(o);const a=c.getLanguageIdAtPosition(o,1),u=C.LanguageConfigurationRegistry.getComments(a),r=u?u.lineCommentToken:null;if(!r)return null;let i=[];for(let n=0,t=s-o+1;nu?o[n].commentStrOffset=r-1:o[n].commentStrOffset=r}}}e.LineCommentCommand=g}),define(Q[402],J([0,1,21,3]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DragAndDropCommand=void 0;class M{constructor(S,C,d){this.selection=S,this.targetPosition=C,this.copy=d,this.targetSelection=null}getEditOperations(S,C){let d=S.getValueInRange(this.selection);if(this.copy||C.addEditOperation(this.selection,null),C.addEditOperation(new N.Range(this.targetPosition.lineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.targetPosition.column),d),this.selection.containsPosition(this.targetPosition)&&!(this.copy&&(this.selection.getEndPosition().equals(this.targetPosition)||this.selection.getStartPosition().equals(this.targetPosition)))){this.targetSelection=this.selection;return}if(this.copy){this.targetSelection=new b.Selection(this.targetPosition.lineNumber,this.targetPosition.column,this.selection.endLineNumber-this.selection.startLineNumber+this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn);return}if(this.targetPosition.lineNumber>this.selection.endLineNumber){this.targetSelection=new b.Selection(this.targetPosition.lineNumber-this.selection.endLineNumber+this.selection.startLineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn);return}if(this.targetPosition.lineNumber0){let C=[];for(let p=0;pb.Range.compareRangesUsingStarts(p.range,c.range));let d=[],g=C[0];for(let p=1;p0){let i=[],n=u.caseOps.length,t=0;for(let l=0,h=r.length;l=n){i.push(r.slice(l));break}switch(u.caseOps[t]){case"U":i.push(r[l].toUpperCase());break;case"u":i.push(r[l].toUpperCase()),t++;break;case"L":i.push(r[l].toLowerCase());break;case"l":i.push(r[l].toLowerCase()),t++;break;default:i.push(r[l])}}r=i.join("")}o+=r}return o}static _substitute(p,c){if(c===null)return"";if(p===0)return c[0];let o="";for(;p>0;){if(p=s)break;let u=g.charCodeAt(o);switch(u){case 92:c.emitUnchanged(o-1),c.emitStatic("\\",o+1);break;case 110:c.emitUnchanged(o-1),c.emitStatic(` +`,o+1);break;case 116:c.emitUnchanged(o-1),c.emitStatic(" ",o+1);break;case 117:case 85:case 108:case 76:c.emitUnchanged(o-1),c.emitStatic("",o+1),p.push(String.fromCharCode(u));break}continue}if(a===36){if(o++,o>=s)break;let u=g.charCodeAt(o);if(u===36){c.emitUnchanged(o-1),c.emitStatic("$",o+1);continue}if(u===48||u===38){c.emitUnchanged(o-1),c.emitMatchIndex(0,o+1,p),p.length=0;continue}if(49<=u&&u<=57){let r=u-48;if(o+1e.MAX_FOLDING_REGIONS)throw new Error("invalid startIndexes or endIndexes size");this._startIndexes=S,this._endIndexes=C,this._collapseStates=new Uint32Array(Math.ceil(S.length/32)),this._types=d,this._parentsComputed=!1}ensureParentIndices(){if(!this._parentsComputed){this._parentsComputed=!0;let S=[],C=(d,g)=>{let p=S[S.length-1];return this.getStartLineNumber(p)<=d&&this.getEndLineNumber(p)>=g};for(let d=0,g=this._startIndexes.length;de.MAX_LINE_NUMBER||c>e.MAX_LINE_NUMBER)throw new Error("startLineNumber or endLineNumber must not exceed "+e.MAX_LINE_NUMBER);for(;S.length>0&&!C(p,c);)S.pop();let o=S.length>0?S[S.length-1]:-1;S.push(d),this._startIndexes[d]=p+((o&255)<<24),this._endIndexes[d]=c+((o&65280)<<16)}}}get length(){return this._startIndexes.length}getStartLineNumber(S){return this._startIndexes[S]&e.MAX_LINE_NUMBER}getEndLineNumber(S){return this._endIndexes[S]&e.MAX_LINE_NUMBER}getType(S){return this._types?this._types[S]:void 0}hasTypes(){return!!this._types}isCollapsed(S){let C=S/32|0,d=S%32;return(this._collapseStates[C]&1<>>24)+((this._endIndexes[S]&b)>>>16);return C===e.MAX_FOLDING_REGIONS?-1:C}contains(S,C){return this.getStartLineNumber(S)<=C&&this.getEndLineNumber(S)>=C}findIndex(S){let C=0,d=this._startIndexes.length;if(d===0)return-1;for(;C=0){if(this.getEndLineNumber(C)>=S)return C;for(C=this.getParentIndex(C);C!==-1;){if(this.contains(C,S))return C;C=this.getParentIndex(C)}}return-1}toString(){let S=[];for(let C=0;C=this.endLineNumber}containsLine(S){return this.startLineNumber<=S&&S<=this.endLineNumber}}e.FoldingRegion=M}),define(Q[405],J([0,1,6,174]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.setCollapseStateForType=e.setCollapseStateForMatchingLines=e.setCollapseStateAtLevel=e.setCollapseStateUp=e.setCollapseStateLevelsUp=e.setCollapseStateLevelsDown=e.toggleCollapseState=e.FoldingModel=void 0;class M{constructor(s,a){this._updateEventEmitter=new b.Emitter,this.onDidChange=this._updateEventEmitter.event,this._textModel=s,this._decorationProvider=a,this._regions=new N.FoldingRegions(new Uint32Array(0),new Uint32Array(0)),this._editorDecorationIds=[],this._isInitialized=!1}get regions(){return this._regions}get textModel(){return this._textModel}get isInitialized(){return this._isInitialized}toggleCollapseState(s){if(!!s.length){s=s.sort((u,r)=>u.regionIndex-r.regionIndex);const a={};this._decorationProvider.changeDecorations(u=>{let r=0,i=-1,n=-1;const t=l=>{for(;rn&&(n=h),r++}};for(let l of s){let h=l.regionIndex,m=this._editorDecorationIds[h];if(m&&!a[m]){a[m]=!0,t(h);let _=!this._regions.isCollapsed(h);this._regions.setCollapsed(h,_),i=Math.max(i,this._regions.getEndLineNumber(h))}}t(this._regions.length)}),this._updateEventEmitter.fire({model:this,collapseStateChanged:s})}}update(s,a=[]){let u=[],r=(_,f)=>{for(let v of a)if(_{const v=s.getStartLineNumber(_),y=s.getEndLineNumber(_);f&&r(v,y)&&(f=!1),s.setCollapsed(_,f);const L=this._textModel.getLineMaxColumn(v),I={startLineNumber:v,startColumn:Math.max(L-1,1),endLineNumber:v,endColumn:L};u.push({range:I,options:this._decorationProvider.getDecorationOption(f,y<=i)}),f&&y>i&&(i=y)},t=0,l=()=>{for(;t=v)n(h,f===v),h++;else break}}m=l()}for(;h0)return s}applyMemento(s){if(!!Array.isArray(s)){let a=[];for(let u of s){let r=this.getRegionAtLine(u.startLineNumber);r&&!r.isCollapsed&&a.push(r)}this.toggleCollapseState(a)}}dispose(){this._decorationProvider.deltaDecorations(this._editorDecorationIds,[])}getAllRegionsAtLine(s,a){let u=[];if(this._regions){let r=this._regions.findRange(s),i=1;for(;r>=0;){let n=this._regions.toRegion(r);(!a||a(n,i))&&u.push(n),i++,r=n.parentIndex}}return u}getRegionAtLine(s){if(this._regions){let a=this._regions.findRange(s);if(a>=0)return this._regions.toRegion(a)}return null}getRegionsInside(s,a){let u=[],r=s?s.regionIndex+1:0,i=s?s.endLineNumber:Number.MAX_VALUE;if(a&&a.length===2){const n=[];for(let t=r,l=this._regions.length;t0&&!h.containedBy(n[n.length-1]);)n.pop();n.push(h),a(h,n.length)&&u.push(h)}else break}}else for(let n=r,t=this._regions.length;n1){let t=o.getRegionsInside(i,(l,h)=>l.isCollapsed!==n&&h0)for(let i of u){let n=o.getRegionAtLine(i);if(n&&(n.isCollapsed!==s&&r.push(n),a>1)){let t=o.getRegionsInside(n,(l,h)=>l.isCollapsed!==s&&hn.isCollapsed!==s&&tt.isCollapsed!==s&&l<=a);r.push(...n)}o.toggleCollapseState(r)}e.setCollapseStateLevelsUp=C;function d(o,s,a){let u=[];for(let r of a){let i=o.getAllRegionsAtLine(r,n=>n.isCollapsed!==s);i.length>0&&u.push(i[0])}o.toggleCollapseState(u)}e.setCollapseStateUp=d;function g(o,s,a,u){let r=(n,t)=>t===s&&n.isCollapsed!==a&&!u.some(l=>n.containsLine(l)),i=o.getRegionsInside(null,r);o.toggleCollapseState(i)}e.setCollapseStateAtLevel=g;function p(o,s,a){let u=o.textModel,r=o.regions,i=[];for(let n=r.length-1;n>=0;n--)if(a!==r.isCollapsed(n)){let t=r.getStartLineNumber(n);s.test(u.getLineContent(t))&&i.push(r.toRegion(n))}o.toggleCollapseState(i)}e.setCollapseStateForMatchingLines=p;function c(o,s,a){let u=o.regions,r=[];for(let i=u.length-1;i>=0;i--)a!==u.isCollapsed(i)&&s===u.getType(i)&&r.push(u.toRegion(i));o.toggleCollapseState(r)}e.setCollapseStateForType=c}),define(Q[406],J([0,1,6,3,19]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HiddenRangeModel=void 0;class w{constructor(g){this._updateEventEmitter=new b.Emitter,this._foldingModel=g,this._foldingModelListener=g.onDidChange(p=>this.updateHiddenRanges()),this._hiddenRanges=[],g.regions.length&&this.updateHiddenRanges()}get onDidChange(){return this._updateEventEmitter.event}get hiddenRanges(){return this._hiddenRanges}updateHiddenRanges(){let g=!1,p=[],c=0,o=0,s=Number.MAX_VALUE,a=-1,u=this._foldingModel.regions;for(;c({startLineNumber:g.startLineNumber-1,endLineNumber:g.endLineNumber}))}applyHiddenRanges(g){this._hiddenRanges=g,this._updateEventEmitter.fire(g)}hasRanges(){return this._hiddenRanges.length>0}isHidden(g){return C(this._hiddenRanges,g)!==null}adjustSelections(g){let p=!1,c=this._foldingModel.textModel,o=null,s=a=>((!o||!S(a,o))&&(o=C(this._hiddenRanges,a)),o?o.startLineNumber-1:null);for(let a=0,u=g.length;a0&&(this._hiddenRanges=[],this._updateEventEmitter.fire(this._hiddenRanges)),this._foldingModelListener&&(this._foldingModelListener.dispose(),this._foldingModelListener=null)}}e.HiddenRangeModel=w;function S(d,g){return d>=g.startLineNumber&&d<=g.endLineNumber}function C(d,g){let p=M.findFirstInSorted(d,c=>g=0&&d[p].endLineNumber>=g?d[p]:null}}),define(Q[225],J([0,1,12,174,2]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.sanitizeRanges=e.RangesCollector=e.SyntaxRangeProvider=e.ID_SYNTAX_PROVIDER=void 0;const w=5e3,S={};e.ID_SYNTAX_PROVIDER="syntax";class C{constructor(o,s,a,u=w){this.editorModel=o,this.providers=s,this.limit=u,this.id=e.ID_SYNTAX_PROVIDER;for(const r of s)typeof r.onDidChange=="function"&&(this.disposables||(this.disposables=new M.DisposableStore),this.disposables.add(r.onDidChange(a)))}compute(o){return d(this.providers,this.editorModel,o).then(s=>s?p(s,this.limit):null)}dispose(){var o;(o=this.disposables)===null||o===void 0||o.dispose()}}e.SyntaxRangeProvider=C;function d(c,o,s){let a=null,u=c.map((r,i)=>Promise.resolve(r.provideFoldingRanges(o,S,s)).then(n=>{if(!s.isCancellationRequested&&Array.isArray(n)){Array.isArray(a)||(a=[]);let t=o.getLineCount();for(let l of n)l.start>0&&l.end>l.start&&l.end<=t&&a.push({start:l.start,end:l.end,rank:i,kind:l.kind})}},b.onUnexpectedExternalError));return Promise.all(u).then(r=>a)}class g{constructor(o){this._startIndexes=[],this._endIndexes=[],this._nestingLevels=[],this._nestingLevelCounts=[],this._types=[],this._length=0,this._foldingRangesLimit=o}add(o,s,a,u){if(!(o>N.MAX_LINE_NUMBER||s>N.MAX_LINE_NUMBER)){let r=this._length;this._startIndexes[r]=o,this._endIndexes[r]=s,this._nestingLevels[r]=u,this._types[r]=a,this._length++,u<30&&(this._nestingLevelCounts[u]=(this._nestingLevelCounts[u]||0)+1)}}toIndentRanges(){if(this._length<=this._foldingRangesLimit){let o=new Uint32Array(this._length),s=new Uint32Array(this._length);for(let a=0;athis._foldingRangesLimit){s=i;break}o+=n}}let a=new Uint32Array(this._foldingRangesLimit),u=new Uint32Array(this._foldingRangesLimit),r=[];for(let i=0,n=0;i{let t=i.start-n.start;return t===0&&(t=i.rank-n.rank),t}),a=new g(o),u,r=[];for(let i of s)if(!u)u=i,a.add(i.start,i.end,i.kind&&i.kind.value,r.length);else if(i.start>u.start)if(i.end<=u.end)r.push(u),u=i,a.add(i.start,i.end,i.kind&&i.kind.value,r.length);else{if(i.start>u.end){do u=r.pop();while(u&&i.start>u.end);u&&r.push(u),u=i}a.add(i.start,i.end,i.kind&&i.kind.value,r.length)}return a.toIndentRanges()}e.sanitizeRanges=p}),define(Q[407],J([0,1,225]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InitializingRangeProvider=e.ID_INIT_PROVIDER=void 0,e.ID_INIT_PROVIDER="init";class N{constructor(w,S,C,d){if(this.editorModel=w,this.id=e.ID_INIT_PROVIDER,S.length){let g=p=>({range:{startLineNumber:p.startLineNumber,startColumn:0,endLineNumber:p.endLineNumber,endColumn:w.getLineLength(p.endLineNumber)},options:{stickiness:1}});this.decorationIds=w.deltaDecorations([],S.map(g)),this.timeout=setTimeout(C,d)}}dispose(){this.decorationIds&&(this.editorModel.deltaDecorations(this.decorationIds,[]),this.decorationIds=void 0),typeof this.timeout=="number"&&(clearTimeout(this.timeout),this.timeout=void 0)}compute(w){let S=[];if(this.decorationIds)for(let C of this.decorationIds){let d=this.editorModel.getDecorationRange(C);d&&S.push({start:d.startLineNumber,end:d.endLineNumber,rank:1})}return Promise.resolve(b.sanitizeRanges(S,Number.MAX_VALUE))}}e.InitializingRangeProvider=N}),define(Q[226],J([0,1,62,3]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FormattingEdit=void 0;class M{static _handleEolEdits(S,C){let d,g=[];for(let p of C)typeof p.eol=="number"&&(d=p.eol),p.range&&typeof p.text=="string"&&g.push(p);return typeof d=="number"&&S.hasModel()&&S.getModel().pushEOL(d),g}static _isFullModelReplaceEdit(S,C){if(!S.hasModel())return!1;const d=S.getModel(),g=d.validateRange(C.range);return d.getFullModelRange().equalsRange(g)}static execute(S,C,d){d&&S.pushUndoStop();const g=M._handleEolEdits(S,C);g.length===1&&M._isFullModelReplaceEdit(S,g[0])?S.executeEdits("formatEditsCommand",g.map(p=>b.EditOperation.replace(N.Range.lift(p.range),p.text))):S.executeEdits("formatEditsCommand",g.map(p=>b.EditOperation.replaceMove(N.Range.lift(p.range),p.text))),d&&S.pushUndoStop()}}e.FormattingEdit=M}),define(Q[227],J([0,1,2,6,17]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ClickLinkGesture=e.ClickLinkOptions=e.ClickLinkKeyboardEvent=e.ClickLinkMouseEvent=void 0;function w(c,o){return!!c[o]}class S{constructor(o,s){this.target=o.target,this.hasTriggerModifier=w(o.event,s.triggerModifier),this.hasSideBySideModifier=w(o.event,s.triggerSideBySideModifier),this.isNoneOrSingleMouseDown=o.event.detail<=1}}e.ClickLinkMouseEvent=S;class C{constructor(o,s){this.keyCodeIsTriggerKey=o.keyCode===s.triggerKey,this.keyCodeIsSideBySideKey=o.keyCode===s.triggerSideBySideKey,this.hasTriggerModifier=w(o,s.triggerModifier)}}e.ClickLinkKeyboardEvent=C;class d{constructor(o,s,a,u){this.triggerKey=o,this.triggerModifier=s,this.triggerSideBySideKey=a,this.triggerSideBySideModifier=u}equals(o){return this.triggerKey===o.triggerKey&&this.triggerModifier===o.triggerModifier&&this.triggerSideBySideKey===o.triggerSideBySideKey&&this.triggerSideBySideModifier===o.triggerSideBySideModifier}}e.ClickLinkOptions=d;function g(c){return c==="altKey"?M.isMacintosh?new d(57,"metaKey",6,"altKey"):new d(5,"ctrlKey",6,"altKey"):M.isMacintosh?new d(6,"altKey",57,"metaKey"):new d(6,"altKey",5,"ctrlKey")}class p extends b.Disposable{constructor(o){super();this._onMouseMoveOrRelevantKeyDown=this._register(new N.Emitter),this.onMouseMoveOrRelevantKeyDown=this._onMouseMoveOrRelevantKeyDown.event,this._onExecute=this._register(new N.Emitter),this.onExecute=this._onExecute.event,this._onCancel=this._register(new N.Emitter),this.onCancel=this._onCancel.event,this._editor=o,this._opts=g(this._editor.getOption(64)),this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._lineNumberOnMouseDown=0,this._register(this._editor.onDidChangeConfiguration(s=>{if(s.hasChanged(64)){const a=g(this._editor.getOption(64));if(this._opts.equals(a))return;this._opts=a,this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._lineNumberOnMouseDown=0,this._onCancel.fire()}})),this._register(this._editor.onMouseMove(s=>this._onEditorMouseMove(new S(s,this._opts)))),this._register(this._editor.onMouseDown(s=>this._onEditorMouseDown(new S(s,this._opts)))),this._register(this._editor.onMouseUp(s=>this._onEditorMouseUp(new S(s,this._opts)))),this._register(this._editor.onKeyDown(s=>this._onEditorKeyDown(new C(s,this._opts)))),this._register(this._editor.onKeyUp(s=>this._onEditorKeyUp(new C(s,this._opts)))),this._register(this._editor.onMouseDrag(()=>this._resetHandler())),this._register(this._editor.onDidChangeCursorSelection(s=>this._onDidChangeCursorSelection(s))),this._register(this._editor.onDidChangeModel(s=>this._resetHandler())),this._register(this._editor.onDidChangeModelContent(()=>this._resetHandler())),this._register(this._editor.onDidScrollChange(s=>{(s.scrollTopChanged||s.scrollLeftChanged)&&this._resetHandler()}))}_onDidChangeCursorSelection(o){o.selection&&o.selection.startColumn!==o.selection.endColumn&&this._resetHandler()}_onEditorMouseMove(o){this._lastMouseMoveEvent=o,this._onMouseMoveOrRelevantKeyDown.fire([o,null])}_onEditorMouseDown(o){this._hasTriggerKeyOnMouseDown=o.hasTriggerModifier,this._lineNumberOnMouseDown=o.target.position?o.target.position.lineNumber:0}_onEditorMouseUp(o){const s=o.target.position?o.target.position.lineNumber:0;this._hasTriggerKeyOnMouseDown&&this._lineNumberOnMouseDown&&this._lineNumberOnMouseDown===s&&this._onExecute.fire(o)}_onEditorKeyDown(o){this._lastMouseMoveEvent&&(o.keyCodeIsTriggerKey||o.keyCodeIsSideBySideKey&&o.hasTriggerModifier)?this._onMouseMoveOrRelevantKeyDown.fire([this._lastMouseMoveEvent,o]):o.hasTriggerModifier&&this._onCancel.fire()}_onEditorKeyUp(o){o.keyCodeIsTriggerKey&&this._onCancel.fire()}_resetHandler(){this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._onCancel.fire()}}e.ClickLinkGesture=p}),define(Q[228],J([0,1,15,12]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HoverOperation=void 0;class M{constructor(S,C,d,g,p){this._computer=S,this._state=0,this._hoverTime=p,this._firstWaitScheduler=new b.RunOnceScheduler(()=>this._triggerAsyncComputation(),0),this._secondWaitScheduler=new b.RunOnceScheduler(()=>this._triggerSyncComputation(),0),this._loadingMessageScheduler=new b.RunOnceScheduler(()=>this._showLoadingMessage(),0),this._asyncComputationPromise=null,this._asyncComputationPromiseDone=!1,this._completeCallback=C,this._errorCallback=d,this._progressCallback=g}setHoverTime(S){this._hoverTime=S}_firstWaitTime(){return this._hoverTime/2}_secondWaitTime(){return this._hoverTime/2}_loadingMessageTime(){return 3*this._hoverTime}_triggerAsyncComputation(){this._state=2,this._secondWaitScheduler.schedule(this._secondWaitTime()),this._computer.computeAsync?(this._asyncComputationPromiseDone=!1,this._asyncComputationPromise=b.createCancelablePromise(S=>this._computer.computeAsync(S)),this._asyncComputationPromise.then(S=>{this._asyncComputationPromiseDone=!0,this._withAsyncResult(S)},S=>this._onError(S))):this._asyncComputationPromiseDone=!0}_triggerSyncComputation(){this._computer.computeSync&&this._computer.onResult(this._computer.computeSync(),!0),this._asyncComputationPromiseDone?(this._state=0,this._onComplete(this._computer.getResult())):(this._state=3,this._onProgress(this._computer.getResult()))}_showLoadingMessage(){this._state===3&&this._onProgress(this._computer.getResultWithLoadingMessage())}_withAsyncResult(S){S&&this._computer.onResult(S,!1),this._state===3&&(this._state=0,this._onComplete(this._computer.getResult()))}_onComplete(S){this._completeCallback(S)}_onError(S){this._errorCallback?this._errorCallback(S):N.onUnexpectedError(S)}_onProgress(S){this._progressCallback(S)}start(S){if(S===0)this._state===0&&(this._state=1,this._firstWaitScheduler.schedule(this._firstWaitTime()),this._loadingMessageScheduler.schedule(this._loadingMessageTime()));else switch(this._state){case 0:this._triggerAsyncComputation(),this._secondWaitScheduler.cancel(),this._triggerSyncComputation();break;case 2:this._secondWaitScheduler.cancel(),this._triggerSyncComputation();break}}cancel(){this._loadingMessageScheduler.cancel(),this._state===1&&this._firstWaitScheduler.cancel(),this._state===2&&(this._secondWaitScheduler.cancel(),this._asyncComputationPromise&&(this._asyncComputationPromise.cancel(),this._asyncComputationPromise=null)),this._state===3&&this._asyncComputationPromise&&(this._asyncComputationPromise.cancel(),this._asyncComputationPromise=null),this._state=0}}e.HoverOperation=M}),define(Q[408],J([0,1,52]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GlyphHoverWidget=void 0;class N extends b.Widget{constructor(w,S){super();this._id=w,this._editor=S,this._isVisible=!1,this._domNode=document.createElement("div"),this._domNode.className="monaco-hover hidden",this._domNode.setAttribute("aria-hidden","true"),this._domNode.setAttribute("role","tooltip"),this._showAtLineNumber=-1,this._register(this._editor.onDidChangeConfiguration(C=>{C.hasChanged(38)&&this.updateFont()})),this._editor.addOverlayWidget(this)}get isVisible(){return this._isVisible}set isVisible(w){this._isVisible=w,this._domNode.classList.toggle("hidden",!this._isVisible)}getId(){return this._id}getDomNode(){return this._domNode}showAt(w){this._showAtLineNumber=w,this.isVisible||(this.isVisible=!0);const S=this._editor.getLayoutInfo(),C=this._editor.getTopForLineNumber(this._showAtLineNumber),d=this._editor.getScrollTop(),g=this._editor.getOption(53),p=this._domNode.clientHeight,c=C-d-(p-g)/2;this._domNode.style.left=`${S.glyphMarginLeft+S.glyphMarginWidth}px`,this._domNode.style.top=`${Math.max(Math.round(c),0)}px`}hide(){!this.isVisible||(this.isVisible=!1)}getPosition(){return null}dispose(){this._editor.removeOverlayWidget(this),super.dispose()}updateFont(){const w=Array.prototype.slice.call(this._domNode.getElementsByTagName("code")),S=Array.prototype.slice.call(this._domNode.getElementsByClassName("code"));[...w,...S].forEach(C=>this._editor.applyFontInfo(C))}updateContents(w){this._domNode.textContent="",this._domNode.appendChild(w),this.updateFont()}}e.GlyphHoverWidget=N}),define(Q[409],J([0,1,21]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InPlaceReplaceCommand=void 0;class N{constructor(w,S,C){this._editRange=w,this._originalSelection=S,this._text=C}getEditOperations(w,S){S.addTrackedEditOperation(this._editRange,this._text)}computeCursorState(w,S){const d=S.getInverseEditOperations()[0].range;return this._originalSelection.isEmpty()?new b.Selection(d.endLineNumber,Math.min(this._originalSelection.positionColumn,d.endColumn),d.endLineNumber,Math.min(this._originalSelection.positionColumn,d.endColumn)):new b.Selection(d.endLineNumber,d.endColumn-this._text.length,d.endLineNumber,d.endColumn)}}e.InPlaceReplaceCommand=N}),define(Q[229],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.generateIndent=e.getSpaceCnt=void 0;function b(M,w){let S=0;for(let C=0;C=c)return null;let o=[];for(let a=p;a<=c;a++)o.push(C.getLineContent(a));let s=o.slice(0);return s.sort(M.getCollator().compare),g===!0&&(s=s.reverse()),{startLineNumber:p,endLineNumber:c,before:o,after:s}}function S(C,d,g){let p=w(C,d,g);return p?b.EditOperation.replace(new N.Range(p.startLineNumber,1,p.endLineNumber,C.getLineMaxColumn(p.endLineNumber)),p.after.join(` +`)):null}}),define(Q[230],J([0,1,14,3,71]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketSelectionRangeProvider=void 0;class w{provideSelectionRanges(C,d){return Ie(this,void 0,void 0,function*(){const g=[];for(const p of d){const c=[];g.push(c);const o=new Map;yield new Promise(s=>w._bracketsRightYield(s,0,C,p,o)),yield new Promise(s=>w._bracketsLeftYield(s,0,C,p,o,c))}return g})}static _bracketsRightYield(C,d,g,p,c){const o=new Map,s=Date.now();for(;;){if(d>=w._maxRounds){C();break}if(!p){C();break}let a=g.findNextBracket(p);if(!a){C();break}if(Date.now()-s>w._maxDuration){setTimeout(()=>w._bracketsRightYield(C,d+1,g,p,c));break}const r=a.close[0];if(a.isOpen){let i=o.has(r)?o.get(r):0;o.set(r,i+1)}else{let i=o.has(r)?o.get(r):0;if(i-=1,o.set(r,Math.max(0,i)),i<0){let n=c.get(r);n||(n=new M.LinkedList,c.set(r,n)),n.push(a.range)}}p=a.range.getEndPosition()}}static _bracketsLeftYield(C,d,g,p,c,o){const s=new Map,a=Date.now();for(;;){if(d>=w._maxRounds&&c.size===0){C();break}if(!p){C();break}let u=g.findPrevBracket(p);if(!u){C();break}if(Date.now()-a>w._maxDuration){setTimeout(()=>w._bracketsLeftYield(C,d+1,g,p,c,o));break}const i=u.close[0];if(u.isOpen){let n=s.has(i)?s.get(i):0;if(n-=1,s.set(i,Math.max(0,n)),n<0){let t=c.get(i);if(t){let l=t.shift();t.size===0&&c.delete(i);const h=N.Range.fromPositions(u.range.getEndPosition(),l.getStartPosition()),m=N.Range.fromPositions(u.range.getStartPosition(),l.getEndPosition());o.push({range:h}),o.push({range:m}),w._addBracketLeading(g,m,o)}}}else{let n=s.has(i)?s.get(i):0;s.set(i,n+1)}p=u.range.getStartPosition()}}static _addBracketLeading(C,d,g){if(d.startLineNumber!==d.endLineNumber){const p=d.startLineNumber,c=C.getLineFirstNonWhitespaceColumn(p);c!==0&&c!==d.startColumn&&(g.push({range:N.Range.fromPositions(new b.Position(p,c),d.getEndPosition())}),g.push({range:N.Range.fromPositions(new b.Position(p,1),d.getEndPosition())}));const o=p-1;if(o>0){const s=C.getLineFirstNonWhitespaceColumn(o);s===d.startColumn&&s!==C.getLineLastNonWhitespaceColumn(o)&&(g.push({range:N.Range.fromPositions(new b.Position(o,s),d.getEndPosition())}),g.push({range:N.Range.fromPositions(new b.Position(o,1),d.getEndPosition())}))}}}}e.BracketSelectionRangeProvider=w,w._maxDuration=30,w._maxRounds=2}),define(Q[412],J([0,1,3,8]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WordSelectionRangeProvider=void 0;class M{provideSelectionRanges(S,C){const d=[];for(const g of C){const p=[];d.push(p),this._addInWordRanges(p,S,g),this._addWordRanges(p,S,g),this._addWhitespaceLine(p,S,g),p.push({range:S.getFullModelRange()})}return d}_addInWordRanges(S,C,d){const g=C.getWordAtPosition(d);if(!!g){let{word:p,startColumn:c}=g,o=d.column-c,s=o,a=o,u=0;for(;s>=0;s--){let r=p.charCodeAt(s);if(s!==o&&(r===95||r===45))break;if(N.isLowerAsciiLetter(r)&&N.isUpperAsciiLetter(u))break;u=r}for(s+=1;a0&&C.getLineFirstNonWhitespaceColumn(d.lineNumber)===0&&C.getLineLastNonWhitespaceColumn(d.lineNumber)===0&&S.push({range:new b.Range(d.lineNumber,1,d.lineNumber,C.getLineMaxColumn(d.lineNumber))})}}e.WordSelectionRangeProvider=M}),define(Q[131],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SnippetParser=e.TextmateSnippet=e.Variable=e.FormatString=e.Transform=e.Choice=e.Placeholder=e.TransformableMarker=e.Text=e.Marker=e.Scanner=void 0;class b{constructor(){this.value="",this.pos=0}static isDigitCharacter(u){return u>=48&&u<=57}static isVariableCharacter(u){return u===95||u>=97&&u<=122||u>=65&&u<=90}text(u){this.value=u,this.pos=0}tokenText(u){return this.value.substr(u.pos,u.len)}next(){if(this.pos>=this.value.length)return{type:14,pos:this.pos,len:0};let u=this.pos,r=0,i=this.value.charCodeAt(u),n;if(n=b._table[i],typeof n=="number")return this.pos+=1,{type:n,pos:u,len:1};if(b.isDigitCharacter(i)){n=8;do r+=1,i=this.value.charCodeAt(u+r);while(b.isDigitCharacter(i));return this.pos+=r,{type:n,pos:u,len:r}}if(b.isVariableCharacter(i)){n=9;do i=this.value.charCodeAt(u+ ++r);while(b.isVariableCharacter(i)||b.isDigitCharacter(i));return this.pos+=r,{type:n,pos:u,len:r}}n=10;do r+=1,i=this.value.charCodeAt(u+r);while(!isNaN(i)&&typeof b._table[i]=="undefined"&&!b.isDigitCharacter(i)&&!b.isVariableCharacter(i));return this.pos+=r,{type:n,pos:u,len:r}}}e.Scanner=b,b._table={[36]:0,[58]:1,[44]:2,[123]:3,[125]:4,[92]:5,[47]:6,[124]:7,[43]:11,[45]:12,[63]:13};class N{constructor(){this._children=[]}appendChild(u){return u instanceof M&&this._children[this._children.length-1]instanceof M?this._children[this._children.length-1].value+=u.value:(u.parent=this,this._children.push(u)),this}replace(u,r){const{parent:i}=u,n=i.children.indexOf(u),t=i.children.slice(0);t.splice(n,1,...r),i._children=t,function l(h,m){for(const _ of h)_.parent=m,l(_.children,_)}(r,i)}get children(){return this._children}get snippet(){let u=this;for(;;){if(!u)return;if(u instanceof o)return u;u=u.parent}}toString(){return this.children.reduce((u,r)=>u+r.toString(),"")}len(){return 0}}e.Marker=N;class M extends N{constructor(u){super();this.value=u}toString(){return this.value}len(){return this.value.length}clone(){return new M(this.value)}}e.Text=M;class w extends N{}e.TransformableMarker=w;class S extends w{constructor(u){super();this.index=u}static compareByIndex(u,r){return u.index===r.index?0:u.isFinalTabstop?1:r.isFinalTabstop||u.indexr.index?1:0}get isFinalTabstop(){return this.index===0}get choice(){return this._children.length===1&&this._children[0]instanceof C?this._children[0]:void 0}clone(){let u=new S(this.index);return this.transform&&(u.transform=this.transform.clone()),u._children=this.children.map(r=>r.clone()),u}}e.Placeholder=S;class C extends N{constructor(){super(...arguments);this.options=[]}appendChild(u){return u instanceof M&&(u.parent=this,this.options.push(u)),this}toString(){return this.options[0].value}len(){return this.options[0].len()}clone(){let u=new C;return this.options.forEach(u.appendChild,u),u}}e.Choice=C;class d extends N{constructor(){super(...arguments);this.regexp=new RegExp("")}resolve(u){const r=this;let i=!1,n=u.replace(this.regexp,function(){return i=!0,r._replace(Array.prototype.slice.call(arguments,0,-2))});return!i&&this._children.some(t=>t instanceof g&&Boolean(t.elseValue))&&(n=this._replace([])),n}_replace(u){let r="";for(const i of this._children)if(i instanceof g){let n=u[i.index]||"";n=i.resolve(n),r+=n}else r+=i.toString();return r}toString(){return""}clone(){let u=new d;return u.regexp=new RegExp(this.regexp.source,""+(this.regexp.ignoreCase?"i":"")+(this.regexp.global?"g":"")),u._children=this.children.map(r=>r.clone()),u}}e.Transform=d;class g extends N{constructor(u,r,i,n){super();this.index=u,this.shorthandName=r,this.ifValue=i,this.elseValue=n}resolve(u){return this.shorthandName==="upcase"?u?u.toLocaleUpperCase():"":this.shorthandName==="downcase"?u?u.toLocaleLowerCase():"":this.shorthandName==="capitalize"?u?u[0].toLocaleUpperCase()+u.substr(1):"":this.shorthandName==="pascalcase"?u?this._toPascalCase(u):"":Boolean(u)&&typeof this.ifValue=="string"?this.ifValue:!Boolean(u)&&typeof this.elseValue=="string"?this.elseValue:u||""}_toPascalCase(u){const r=u.match(/[a-z]+/gi);return r?r.map(function(i){return i.charAt(0).toUpperCase()+i.substr(1).toLowerCase()}).join(""):u}clone(){return new g(this.index,this.shorthandName,this.ifValue,this.elseValue)}}e.FormatString=g;class p extends w{constructor(u){super();this.name=u}resolve(u){let r=u.resolve(this);return this.transform&&(r=this.transform.resolve(r||"")),r!==void 0?(this._children=[new M(r)],!0):!1}clone(){const u=new p(this.name);return this.transform&&(u.transform=this.transform.clone()),u._children=this.children.map(r=>r.clone()),u}}e.Variable=p;function c(a,u){const r=[...a];for(;r.length>0;){const i=r.shift();if(!u(i))break;r.unshift(...i.children)}}class o extends N{get placeholderInfo(){if(!this._placeholders){let u=[],r;this.walk(function(i){return i instanceof S&&(u.push(i),r=!r||r.indexn===u?(i=!0,!1):(r+=n.len(),!0)),i?r:-1}fullLen(u){let r=0;return c([u],i=>(r+=i.len(),!0)),r}enclosingPlaceholders(u){let r=[],{parent:i}=u;for(;i;)i instanceof S&&r.push(i),i=i.parent;return r}resolveVariables(u){return this.walk(r=>(r instanceof p&&r.resolve(u)&&(this._placeholders=void 0),!0)),this}appendChild(u){return this._placeholders=void 0,super.appendChild(u)}replace(u,r){return this._placeholders=void 0,super.replace(u,r)}clone(){let u=new o;return this._children=this.children.map(r=>r.clone()),u}walk(u){c(this.children,u)}}e.TextmateSnippet=o;class s{constructor(){this._scanner=new b,this._token={type:14,pos:0,len:0}}static escape(u){return u.replace(/\$|}|\\/g,"\\$&")}static guessNeedsClipboard(u){return/\${?CLIPBOARD/.test(u)}parse(u,r,i){this._scanner.text(u),this._token=this._scanner.next();const n=new o;for(;this._parse(n););const t=new Map,l=[];let h=0;n.walk(m=>(m instanceof S&&(h+=1,m.isFinalTabstop?t.set(0,void 0):!t.has(m.index)&&m.children.length>0?t.set(m.index,m.children):l.push(m)),!0));for(const m of l){const _=t.get(m.index);if(_){const f=new S(m.index);f.transform=m.transform;for(const v of _)f.appendChild(v.clone());n.replace(m,[f])}}return i||(i=h>0&&r),!t.has(0)&&i&&n.appendChild(new S(0)),n}_accept(u,r){if(u===void 0||this._token.type===u){let i=r?this._scanner.tokenText(this._token):!0;return this._token=this._scanner.next(),i}return!1}_backTo(u){return this._scanner.pos=u.pos+u.len,this._token=u,!1}_until(u){const r=this._token;for(;this._token.type!==u;){if(this._token.type===14)return!1;if(this._token.type===5){const n=this._scanner.next();if(n.type!==0&&n.type!==4&&n.type!==5)return!1}this._token=this._scanner.next()}const i=this._scanner.value.substring(r.pos,this._token.pos).replace(/\\(\$|}|\\)/g,"$1");return this._token=this._scanner.next(),i}_parse(u){return this._parseEscaped(u)||this._parseTabstopOrVariableName(u)||this._parseComplexPlaceholder(u)||this._parseComplexVariable(u)||this._parseAnything(u)}_parseEscaped(u){let r;return(r=this._accept(5,!0))?(r=this._accept(0,!0)||this._accept(4,!0)||this._accept(5,!0)||r,u.appendChild(new M(r)),!0):!1}_parseTabstopOrVariableName(u){let r;const i=this._token;return this._accept(0)&&(r=this._accept(9,!0)||this._accept(8,!0))?(u.appendChild(/^\d+$/.test(r)?new S(Number(r)):new p(r)),!0):this._backTo(i)}_parseComplexPlaceholder(u){let r;const i=this._token;if(!(this._accept(0)&&this._accept(3)&&(r=this._accept(8,!0))))return this._backTo(i);const t=new S(Number(r));if(this._accept(1))for(;;){if(this._accept(4))return u.appendChild(t),!0;if(!this._parse(t))return u.appendChild(new M("${"+r+":")),t.children.forEach(u.appendChild,u),!0}else if(t.index>0&&this._accept(7)){const l=new C;for(;;){if(this._parseChoiceElement(l)){if(this._accept(2))continue;if(this._accept(7)&&(t.appendChild(l),this._accept(4)))return u.appendChild(t),!0}return this._backTo(i),!1}}else return this._accept(6)?this._parseTransform(t)?(u.appendChild(t),!0):(this._backTo(i),!1):this._accept(4)?(u.appendChild(t),!0):this._backTo(i)}_parseChoiceElement(u){const r=this._token,i=[];for(;!(this._token.type===2||this._token.type===7);){let n;if((n=this._accept(5,!0))?n=this._accept(2,!0)||this._accept(7,!0)||this._accept(5,!0)||n:n=this._accept(void 0,!0),!n)return this._backTo(r),!1;i.push(n)}return i.length===0?(this._backTo(r),!1):(u.appendChild(new M(i.join(""))),!0)}_parseComplexVariable(u){let r;const i=this._token;if(!(this._accept(0)&&this._accept(3)&&(r=this._accept(9,!0))))return this._backTo(i);const t=new p(r);if(this._accept(1))for(;;){if(this._accept(4))return u.appendChild(t),!0;if(!this._parse(t))return u.appendChild(new M("${"+r+":")),t.children.forEach(u.appendChild,u),!0}else return this._accept(6)?this._parseTransform(t)?(u.appendChild(t),!0):(this._backTo(i),!1):this._accept(4)?(u.appendChild(t),!0):this._backTo(i)}_parseTransform(u){let r=new d,i="",n="";for(;!this._accept(6);){let t;if(t=this._accept(5,!0)){t=this._accept(6,!0)||t,i+=t;continue}if(this._token.type!==14){i+=this._accept(void 0,!0);continue}return!1}for(;!this._accept(6);){let t;if(t=this._accept(5,!0)){t=this._accept(5,!0)||this._accept(6,!0)||t,r.appendChild(new M(t));continue}if(!(this._parseFormatString(r)||this._parseAnything(r)))return!1}for(;!this._accept(4);){if(this._token.type!==14){n+=this._accept(void 0,!0);continue}return!1}try{r.regexp=new RegExp(i,n)}catch(t){return!1}return u.transform=r,!0}_parseFormatString(u){const r=this._token;if(!this._accept(0))return!1;let i=!1;this._accept(3)&&(i=!0);let n=this._accept(8,!0);if(n)if(i){if(this._accept(4))return u.appendChild(new g(Number(n))),!0;if(!this._accept(1))return this._backTo(r),!1}else return u.appendChild(new g(Number(n))),!0;else return this._backTo(r),!1;if(this._accept(6)){let t=this._accept(9,!0);return!t||!this._accept(4)?(this._backTo(r),!1):(u.appendChild(new g(Number(n),t)),!0)}else if(this._accept(11)){let t=this._until(4);if(t)return u.appendChild(new g(Number(n),void 0,t,void 0)),!0}else if(this._accept(12)){let t=this._until(4);if(t)return u.appendChild(new g(Number(n),void 0,void 0,t)),!0}else if(this._accept(13)){let t=this._until(1);if(t){let l=this._until(4);if(l)return u.appendChild(new g(Number(n),void 0,t,l)),!0}}else{let t=this._until(4);if(t)return u.appendChild(new g(Number(n),void 0,void 0,t)),!0}return this._backTo(r),!1}_parseAnything(u){return this._token.type!==14?(u.appendChild(new M(this._scanner.tokenText(this._token))),this._accept(void 0),!0):!1}}e.SnippetParser=s}),define(Q[413],J([0,1,66,8,19]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompletionModel=e.LineContext=void 0;class w{constructor(d,g){this.leadingLineContent=d,this.characterCountDelta=g}}e.LineContext=w;class S{constructor(d,g,p,c,o,s,a){this.clipboardText=a,this._snippetCompareFn=S._compareCompletionItems,this._items=d,this._column=g,this._wordDistance=c,this._options=o,this._refilterKind=1,this._lineContext=p,s==="top"?this._snippetCompareFn=S._compareCompletionItemsSnippetsUp:s==="bottom"&&(this._snippetCompareFn=S._compareCompletionItemsSnippetsDown)}get lineContext(){return this._lineContext}set lineContext(d){(this._lineContext.leadingLineContent!==d.leadingLineContent||this._lineContext.characterCountDelta!==d.characterCountDelta)&&(this._refilterKind=this._lineContext.characterCountDelta2e3?b.fuzzyScore:b.fuzzyScoreGracefulAggressive;for(let r=0;r=t)i.score=b.FuzzyScore.Default;else if(typeof i.completion.filterText=="string"){let m=u(c,o,h,i.completion.filterText,i.filterTextLow,0,!1);if(!m)continue;N.compareIgnoreCase(i.completion.filterText,l)===0?i.score=m:(i.score=b.anyScore(c,o,h,l,i.labelLow,0),i.score[0]=m[0])}else{let m=u(c,o,h,l,i.labelLow,0,!1);if(!m)continue;i.score=m}}i.idx=r,i.distance=this._wordDistance.distance(i.position,i.completion),a.push(i),d.push(l.length)}}this._filteredItems=a.sort(this._snippetCompareFn),this._refilterKind=0,this._stats={pLabelLen:d.length?M.quickSelect(d.length-.85,d,(r,i)=>r-i):0}}static _compareCompletionItems(d,g){return d.score[0]>g.score[0]?-1:d.score[0]g.distance?1:d.idxg.idx?1:0}static _compareCompletionItemsSnippetsDown(d,g){if(d.completion.kind!==g.completion.kind){if(d.completion.kind===27)return 1;if(g.completion.kind===27)return-1}return S._compareCompletionItems(d,g)}static _compareCompletionItemsSnippetsUp(d,g){if(d.completion.kind!==g.completion.kind){if(d.completion.kind===27)return-1;if(g.completion.kind===27)return 1}return S._compareCompletionItems(d,g)}}e.CompletionModel=S}),define(Q[231],J([0,1,6,2,7,104]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResizableHTMLElement=void 0;class S{constructor(){this._onDidWillResize=new b.Emitter,this.onDidWillResize=this._onDidWillResize.event,this._onDidResize=new b.Emitter,this.onDidResize=this._onDidResize.event,this._sashListener=new N.DisposableStore,this._size=new M.Dimension(0,0),this._minSize=new M.Dimension(0,0),this._maxSize=new M.Dimension(Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER),this.domNode=document.createElement("div"),this._eastSash=new w.Sash(this.domNode,{getVerticalSashLeft:()=>this._size.width},{orientation:0}),this._westSash=new w.Sash(this.domNode,{getVerticalSashLeft:()=>0},{orientation:0}),this._northSash=new w.Sash(this.domNode,{getHorizontalSashTop:()=>0},{orientation:1,orthogonalEdge:w.OrthogonalEdge.North}),this._southSash=new w.Sash(this.domNode,{getHorizontalSashTop:()=>this._size.height},{orientation:1,orthogonalEdge:w.OrthogonalEdge.South}),this._northSash.orthogonalStartSash=this._westSash,this._northSash.orthogonalEndSash=this._eastSash,this._southSash.orthogonalStartSash=this._westSash,this._southSash.orthogonalEndSash=this._eastSash;let d,g=0,p=0;this._sashListener.add(b.Event.any(this._northSash.onDidStart,this._eastSash.onDidStart,this._southSash.onDidStart,this._westSash.onDidStart)(()=>{d===void 0&&(this._onDidWillResize.fire(),d=this._size,g=0,p=0)})),this._sashListener.add(b.Event.any(this._northSash.onDidEnd,this._eastSash.onDidEnd,this._southSash.onDidEnd,this._westSash.onDidEnd)(()=>{d!==void 0&&(d=void 0,g=0,p=0,this._onDidResize.fire({dimension:this._size,done:!0}))})),this._sashListener.add(this._eastSash.onDidChange(c=>{d&&(p=c.currentX-c.startX,this.layout(d.height+g,d.width+p),this._onDidResize.fire({dimension:this._size,done:!1,east:!0}))})),this._sashListener.add(this._westSash.onDidChange(c=>{d&&(p=-(c.currentX-c.startX),this.layout(d.height+g,d.width+p),this._onDidResize.fire({dimension:this._size,done:!1,west:!0}))})),this._sashListener.add(this._northSash.onDidChange(c=>{d&&(g=-(c.currentY-c.startY),this.layout(d.height+g,d.width+p),this._onDidResize.fire({dimension:this._size,done:!1,north:!0}))})),this._sashListener.add(this._southSash.onDidChange(c=>{d&&(g=c.currentY-c.startY,this.layout(d.height+g,d.width+p),this._onDidResize.fire({dimension:this._size,done:!1,south:!0}))})),this._sashListener.add(b.Event.any(this._eastSash.onDidReset,this._westSash.onDidReset)(c=>{this._preferredSize&&(this.layout(this._size.height,this._preferredSize.width),this._onDidResize.fire({dimension:this._size,done:!0}))})),this._sashListener.add(b.Event.any(this._northSash.onDidReset,this._southSash.onDidReset)(c=>{this._preferredSize&&(this.layout(this._preferredSize.height,this._size.width),this._onDidResize.fire({dimension:this._size,done:!0}))}))}dispose(){this._northSash.dispose(),this._southSash.dispose(),this._eastSash.dispose(),this._westSash.dispose(),this._sashListener.dispose(),this.domNode.remove()}enableSashes(d,g,p,c){this._northSash.state=d?3:0,this._eastSash.state=g?3:0,this._southSash.state=p?3:0,this._westSash.state=c?3:0}layout(d=this.size.height,g=this.size.width){const{height:p,width:c}=this._minSize,{height:o,width:s}=this._maxSize;d=Math.max(p,Math.min(o,d)),g=Math.max(c,Math.min(s,g));const a=new M.Dimension(g,d);M.Dimension.equals(a,this._size)||(this.domNode.style.height=d+"px",this.domNode.style.width=g+"px",this._size=a,this._northSash.layout(),this._eastSash.layout(),this._southSash.layout(),this._westSash.layout())}get size(){return this._size}set maxSize(d){this._maxSize=d}get maxSize(){return this._maxSize}set minSize(d){this._minSize=d}get minSize(){return this._minSize}set preferredSize(d){this._preferredSize=d}get preferredSize(){return this._preferredSize}}e.ResizableHTMLElement=S}),define(Q[414],J([0,1,19,2,91]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CommitCharacterController=void 0;class w{constructor(C,d,g){this._disposables=new N.DisposableStore,this._disposables.add(d.onDidShow(()=>this._onItem(d.getFocusedItem()))),this._disposables.add(d.onDidFocus(this._onItem,this)),this._disposables.add(d.onDidHide(this.reset,this)),this._disposables.add(C.onWillType(p=>{if(this._active&&!d.isFrozen()){const c=p.charCodeAt(p.length-1);this._active.acceptCharacters.has(c)&&C.getOption(0)&&g(this._active.item)}}))}_onItem(C){if(!C||!b.isNonEmptyArray(C.item.completion.commitCharacters)){this.reset();return}if(!(this._active&&this._active.item.item===C.item)){const d=new M.CharacterSet;for(const g of C.item.completion.commitCharacters)g.length>0&&d.add(g.charCodeAt(0));this._active={acceptCharacters:d,item:C}}}reset(){this._active=void 0}dispose(){this._disposables.dispose()}}e.CommitCharacterController=w}),define(Q[415],J([0,1,2]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OvertypingCapturer=void 0;class N{constructor(w,S){this._disposables=new b.DisposableStore,this._lastOvertyped=[],this._empty=!0,this._disposables.add(w.onWillType(()=>{if(!!this._empty&&!!w.hasModel()){const C=w.getSelections(),d=C.length;let g=!1;for(let c=0;cN._maxSelectionLength)return;this._lastOvertyped[c]={value:p.getValueInRange(o),multiline:o.startLineNumber!==o.endLineNumber}}this._empty=!1}}})),this._disposables.add(S.onDidCancel(C=>{!this._empty&&!C.retrigger&&(this._empty=!0)}))}getLastOvertypedInfo(w){if(!this._empty&&w>=0&&w=0?i[n]:i[Math.max(0,~n-1)],l=c.length;for(const h of c){if(!N.Range.containsRange(h.range,t))break;l-=1}return l}}})}}e.WordDistance=w,w.None=new class extends w{distance(){return 0}}}),define(Q[232],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.stateExists=e.findRules=e.substituteMatches=e.createError=e.log=e.sanitize=e.fixCase=e.empty=e.isIAction=e.isString=e.isFuzzyAction=e.isFuzzyActionArr=void 0;function b(a){return Array.isArray(a)}e.isFuzzyActionArr=b;function N(a){return!b(a)}e.isFuzzyAction=N;function M(a){return typeof a=="string"}e.isString=M;function w(a){return!M(a)}e.isIAction=w;function S(a){return!a}e.empty=S;function C(a,u){return a.ignoreCase&&u?u.toLowerCase():u}e.fixCase=C;function d(a){return a.replace(/[&<>'"_]/g,"-")}e.sanitize=d;function g(a,u){console.log(`${a.languageId}: ${u}`)}e.log=g;function p(a,u){return new Error(`${a.languageId}: ${u}`)}e.createError=p;function c(a,u,r,i,n){const t=/\$((\$)|(#)|(\d\d?)|[sS](\d\d?)|@(\w+))/g;let l=null;return u.replace(t,function(h,m,_,f,v,y,L,I,k){return S(_)?S(f)?!S(v)&&v0;){const i=a.tokenizer[r];if(i)return i;const n=r.lastIndexOf(".");n<0?r=null:r=r.substr(0,n)}return null}e.findRules=o;function s(a,u){let r=u;for(;r&&r.length>0;){if(a.stateNames[r])return!0;const n=r.lastIndexOf(".");n<0?r=null:r=r.substr(0,n)}return!1}e.stateExists=s}),define(Q[417],J([0,1,232]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.compile=void 0;function N(a,u){if(!u||!Array.isArray(u))return!1;for(const r of u)if(!a(r))return!1;return!0}function M(a,u){return typeof a=="boolean"?a:u}function w(a,u){return typeof a=="string"?a:u}function S(a){const u={};for(const r of a)u[r]=!0;return u}function C(a,u=!1){u&&(a=a.map(function(i){return i.toLowerCase()}));const r=S(a);return u?function(i){return r[i.toLowerCase()]!==void 0&&r.hasOwnProperty(i.toLowerCase())}:function(i){return r[i]!==void 0&&r.hasOwnProperty(i)}}function d(a,u){let r=0,i;do i=!1,u=u.replace(/(.|^)@(\w+)/g,function(t,l,h){if(l==="@")return t;i=!0;let m="";if(typeof a[h]=="string")m=a[h];else if(a[h]&&a[h]instanceof RegExp)m=a[h].source;else throw a[h]===void 0?b.createError(a,"language definition does not contain attribute '"+h+"', used at: "+u):b.createError(a,"attribute reference '"+h+"' must be a string, used at: "+u);return l+(b.empty(m)?"":"(?:"+m+")")}),r++;while(i&&r<5);u=u.replace(/@@/g,"@");let n=(a.ignoreCase?"i":"")+(a.unicode?"u":"");return new RegExp(u,n)}function g(a,u,r,i){if(i<0)return a;if(i=100){i=i-100;let n=r.split(".");if(n.unshift(r),i=0&&(i.tokenSubst=!0),typeof r.bracket=="string")if(r.bracket==="@open")i.bracket=1;else if(r.bracket==="@close")i.bracket=-1;else throw b.createError(a,"a 'bracket' attribute must be either '@open' or '@close', in rule: "+u);if(r.next){if(typeof r.next!="string")throw b.createError(a,"the next state must be a string value in rule: "+u);{let n=r.next;if(!/^(@pop|@push|@popall)$/.test(n)&&(n[0]==="@"&&(n=n.substr(1)),n.indexOf("$")<0&&!b.stateExists(a,b.substituteMatches(a,n,"",[],""))))throw b.createError(a,"the next state '"+r.next+"' is not defined in rule: "+u);i.next=n}}return typeof r.goBack=="number"&&(i.goBack=r.goBack),typeof r.switchTo=="string"&&(i.switchTo=r.switchTo),typeof r.log=="string"&&(i.log=r.log),typeof r.nextEmbedded=="string"&&(i.nextEmbedded=r.nextEmbedded,a.usesEmbedded=!0),i}}else if(Array.isArray(r)){let i=[];for(let n=0,t=r.length;n0&&i[0]==="^",this.name=this.name+": "+i,this.regex=d(u,"^(?:"+(this.matchOnlyAtLineStart?i.substr(1):i)+")")}setAction(u,r){this.action=c(u,this.name,r)}}function s(a,u){if(!u||typeof u!="object")throw new Error("Monarch: expecting a language definition object");let r={};r.languageId=a,r.includeLF=M(u.includeLF,!1),r.noThrow=!1,r.maxStack=100,r.start=typeof u.start=="string"?u.start:null,r.ignoreCase=M(u.ignoreCase,!1),r.unicode=M(u.unicode,!1),r.tokenPostfix=w(u.tokenPostfix,"."+r.languageId),r.defaultToken=w(u.defaultToken,"source"),r.usesEmbedded=!1;let i=u;i.languageId=a,i.includeLF=r.includeLF,i.ignoreCase=r.ignoreCase,i.unicode=r.unicode,i.noThrow=r.noThrow,i.usesEmbedded=r.usesEmbedded,i.stateNames=u.tokenizer,i.defaultToken=r.defaultToken;function n(l,h,m){for(const _ of m){let f=_.include;if(f){if(typeof f!="string")throw b.createError(r,"an 'include' attribute must be a string at: "+l);if(f[0]==="@"&&(f=f.substr(1)),!u.tokenizer[f])throw b.createError(r,"include target '"+f+"' is not defined at: "+l);n(l+"."+f,h,u.tokenizer[f])}else{const v=new o(l);if(Array.isArray(_)&&_.length>=1&&_.length<=3)if(v.setRegex(i,_[0]),_.length>=3)if(typeof _[1]=="string")v.setAction(i,{token:_[1],next:_[2]});else if(typeof _[1]=="object"){const y=_[1];y.next=_[2],v.setAction(i,y)}else throw b.createError(r,"a next state as the last element of a rule can only be given if the action is either an object or a string, at: "+l);else v.setAction(i,_[1]);else{if(!_.regex)throw b.createError(r,"a rule must either be an array, or an object with a 'regex' or 'include' field at: "+l);_.name&&typeof _.name=="string"&&(v.name=_.name),_.matchOnlyAtStart&&(v.matchOnlyAtLineStart=M(_.matchOnlyAtLineStart,!1)),v.setRegex(i,_.regex),v.setAction(i,_.action)}h.push(v)}}}if(!u.tokenizer||typeof u.tokenizer!="object")throw b.createError(r,"a language definition must define the 'tokenizer' attribute as an object");r.tokenizer=[];for(let l in u.tokenizer)if(u.tokenizer.hasOwnProperty(l)){r.start||(r.start=l);const h=u.tokenizer[l];r.tokenizer[l]=new Array,n("tokenizer."+l,r.tokenizer[l],h)}if(r.usesEmbedded=i.usesEmbedded,u.brackets){if(!Array.isArray(u.brackets))throw b.createError(r,"the 'brackets' attribute must be defined as an array")}else u.brackets=[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}];let t=[];for(let l of u.brackets){let h=l;if(h&&Array.isArray(h)&&h.length===3&&(h={token:h[2],open:h[0],close:h[1]}),h.open===h.close)throw b.createError(r,"open and close brackets in a 'brackets' attribute must be different: "+h.open+` + hint: use the 'bracket' attribute if matching on equal brackets is required.`);if(typeof h.open=="string"&&typeof h.token=="string"&&typeof h.close=="string")t.push({token:h.token+r.tokenPostfix,open:b.fixCase(r,h.open),close:b.fixCase(r,h.close)});else throw b.createError(r,"every element in the 'brackets' array must be a '{open,close,token}' object or array")}return r.brackets=t,r.noThrow=!0,r}e.compile=s}),define(Q[418],J([4,5]),function(q,e){return q.create("vs/base/browser/ui/actionbar/actionViewItems",e)}),define(Q[419],J([4,5]),function(q,e){return q.create("vs/base/browser/ui/findinput/findInput",e)}),define(Q[420],J([4,5]),function(q,e){return q.create("vs/base/browser/ui/findinput/findInputCheckboxes",e)}),define(Q[233],J([0,1,160,420,27]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RegexCheckbox=e.WholeWordsCheckbox=e.CaseSensitiveCheckbox=void 0;const w=N.localize(0,null),S=N.localize(1,null),C=N.localize(2,null);class d extends b.Checkbox{constructor(o){super({icon:M.Codicon.caseSensitive,title:w+o.appendTitle,isChecked:o.isChecked,inputActiveOptionBorder:o.inputActiveOptionBorder,inputActiveOptionForeground:o.inputActiveOptionForeground,inputActiveOptionBackground:o.inputActiveOptionBackground})}}e.CaseSensitiveCheckbox=d;class g extends b.Checkbox{constructor(o){super({icon:M.Codicon.wholeWord,title:S+o.appendTitle,isChecked:o.isChecked,inputActiveOptionBorder:o.inputActiveOptionBorder,inputActiveOptionForeground:o.inputActiveOptionForeground,inputActiveOptionBackground:o.inputActiveOptionBackground})}}e.WholeWordsCheckbox=g;class p extends b.Checkbox{constructor(o){super({icon:M.Codicon.regex,title:C+o.appendTitle,isChecked:o.isChecked,inputActiveOptionBorder:o.inputActiveOptionBorder,inputActiveOptionForeground:o.inputActiveOptionForeground,inputActiveOptionBackground:o.inputActiveOptionBackground})}}e.RegexCheckbox=p}),define(Q[421],J([4,5]),function(q,e){return q.create("vs/base/browser/ui/findinput/replaceInput",e)}),define(Q[422],J([4,5]),function(q,e){return q.create("vs/base/browser/ui/iconLabel/iconLabel",e)}),define(Q[175],J([0,1,7,157,2,120,40,17,20,55,422,23,304]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IconLabel=void 0;class o{constructor(n){this._element=n}get element(){return this._element}set textContent(n){this.disposed||n===this._textContent||(this._textContent=n,this._element.textContent=n)}set className(n){this.disposed||n===this._className||(this._className=n,this._element.className=n)}set empty(n){this.disposed||n===this._empty||(this._empty=n,this._element.style.marginLeft=n?"0":"")}dispose(){this.disposed=!0}}class s extends M.Disposable{constructor(n,t){super();this.hoverDelegate=void 0,this.customHovers=new Map,this.domNode=this._register(new o(b.append(n,b.$(".monaco-icon-label")))),this.labelContainer=b.append(this.domNode.element,b.$(".monaco-icon-label-container"));const l=b.append(this.labelContainer,b.$("span.monaco-icon-name-container"));this.descriptionContainer=this._register(new o(b.append(this.labelContainer,b.$("span.monaco-icon-description-container")))),(t==null?void 0:t.supportHighlights)?this.nameNode=new r(l,!!t.supportIcons):this.nameNode=new a(l),(t==null?void 0:t.supportDescriptionHighlights)?this.descriptionNodeFactory=()=>new N.HighlightedLabel(b.append(this.descriptionContainer.element,b.$("span.label-description")),!!t.supportIcons):this.descriptionNodeFactory=()=>this._register(new o(b.append(this.descriptionContainer.element,b.$("span.label-description")))),(t==null?void 0:t.hoverDelegate)&&(this.hoverDelegate=t.hoverDelegate)}setLabel(n,t,l){const h=["monaco-icon-label"];l&&(l.extraClasses&&h.push(...l.extraClasses),l.italic&&h.push("italic"),l.strikethrough&&h.push("strikethrough")),this.domNode.className=h.join(" "),this.setupHover(this.labelContainer,l==null?void 0:l.title),this.nameNode.setLabel(n,l),(t||this.descriptionNode)&&(this.descriptionNode||(this.descriptionNode=this.descriptionNodeFactory()),this.descriptionNode instanceof N.HighlightedLabel?(this.descriptionNode.set(t||"",l?l.descriptionMatches:void 0),this.setupHover(this.descriptionNode.element,l==null?void 0:l.descriptionTitle)):(this.descriptionNode.textContent=t||"",this.setupHover(this.descriptionNode.element,(l==null?void 0:l.descriptionTitle)||""),this.descriptionNode.empty=!t))}setupHover(n,t){const l=this.customHovers.get(n);if(l&&(l.dispose(),this.customHovers.delete(n)),!t){n.removeAttribute("title");return}return this.hoverDelegate?this.setupCustomHover(this.hoverDelegate,n,t):this.setupNativeHover(n,t)}static adjustXAndShowCustomHover(n,t,l,h){if(n&&h)return t!==void 0&&(n.target.x=t+10),l.showHover(n)}getTooltipForCustom(n){if(d.isString(n))return()=>Ie(this,void 0,void 0,function*(){return n});if(d.isFunction(n.markdown))return n.markdown;{const t=n.markdown;return()=>Ie(this,void 0,void 0,function*(){return t})}}setupCustomHover(n,t,l){t.setAttribute("title",""),t.removeAttribute("title");let h=this.getTooltipForCustom(l);const m=C.isMacintosh?1500:500;let _,f,v=!1,y,L;function I(E){if(!v){y=new c.CancellationTokenSource;function T(D){(D.type===b.EventType.MOUSE_DOWN||D.fromElement===t)&&(L==null||L.dispose(),L=void 0,v=!1,_=void 0,y.dispose(!0),O.dispose(),A.dispose())}const O=g.domEvent(t,b.EventType.MOUSE_LEAVE,!0)(T.bind(t)),A=g.domEvent(t,b.EventType.MOUSE_DOWN,!0)(T.bind(t));v=!0;function B(D){f=D.x}const F=g.domEvent(t,b.EventType.MOUSE_MOVE,!0)(B.bind(t));setTimeout(()=>Ie(this,void 0,void 0,function*(){var D;if(v&&h&&!_){const R={targetElements:[this],dispose:()=>{}};_={text:p.localize(0,null),target:R,anchorPosition:0},L=s.adjustXAndShowCustomHover(_,f,n,v);const W=(D=yield h(y.token))!==null&&D!==void 0?D:d.isString(l)?void 0:l.markdownNotSupportedFallback;W?(_={text:W,target:R,anchorPosition:0},L=s.adjustXAndShowCustomHover(_,f,n,v)):L&&(L.dispose(),L=void 0)}F.dispose()}),m)}}const k=this._register(g.domEvent(t,b.EventType.MOUSE_OVER,!0)(I.bind(t)));this.customHovers.set(t,k)}setupNativeHover(n,t){let l="";d.isString(t)?l=t:(t==null?void 0:t.markdownNotSupportedFallback)&&(l=t.markdownNotSupportedFallback),n.title=l}}e.IconLabel=s;class a{constructor(n){this.container=n,this.label=void 0,this.singleLabel=void 0}setLabel(n,t){if(!(this.label===n&&S.equals(this.options,t)))if(this.label=n,this.options=t,typeof n=="string")this.singleLabel||(this.container.innerText="",this.container.classList.remove("multiple"),this.singleLabel=b.append(this.container,b.$("a.label-name",{id:t==null?void 0:t.domId}))),this.singleLabel.textContent=n;else{this.container.innerText="",this.container.classList.add("multiple"),this.singleLabel=void 0;for(let l=0;l{const m={start:l,end:l+h.length},_=t.map(f=>w.Range.intersect(m,f)).filter(f=>!w.Range.isEmpty(f)).map(({start:f,end:v})=>({start:f-l,end:v-l}));return l=m.end+n.length,_})}}class r{constructor(n,t){this.container=n,this.supportIcons=t,this.label=void 0,this.singleLabel=void 0}setLabel(n,t){if(!(this.label===n&&S.equals(this.options,t)))if(this.label=n,this.options=t,typeof n=="string")this.singleLabel||(this.container.innerText="",this.container.classList.remove("multiple"),this.singleLabel=new N.HighlightedLabel(b.append(this.container,b.$("a.label-name",{id:t==null?void 0:t.domId})),this.supportIcons)),this.singleLabel.set(n,t==null?void 0:t.matches,void 0,t==null?void 0:t.labelEscapeNewLines);else{this.container.innerText="",this.container.classList.add("multiple"),this.singleLabel=void 0;const l=(t==null?void 0:t.separator)||"/",h=u(n,l,t==null?void 0:t.matches);for(let m=0;mW.element));this.data=R}}function h(D){return D instanceof p.ElementsDragAndDropData?new l(D):D}class m{constructor(R,W){this.modelProvider=R,this.dnd=W,this.autoExpandDisposable=b.Disposable.None}getDragURI(R){return this.dnd.getDragURI(R.element)}getDragLabel(R,W){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(R.map(x=>x.element),W)}onDragStart(R,W){this.dnd.onDragStart&&this.dnd.onDragStart(h(R),W)}onDragOver(R,W,x,K,Y=!0){const ee=this.dnd.onDragOver(h(R),W&&W.element,x,K),se=this.autoExpandNode!==W;if(se&&(this.autoExpandDisposable.dispose(),this.autoExpandNode=W),typeof W=="undefined")return ee;if(se&&typeof ee!="boolean"&&ee.autoExpand&&(this.autoExpandDisposable=u.disposableTimeout(()=>{const P=this.modelProvider(),V=P.getNodeLocation(W);P.isCollapsed(V)&&P.setCollapsed(V,!1),this.autoExpandNode=void 0},500)),typeof ee=="boolean"||!ee.accept||typeof ee.bubble=="undefined"||ee.feedback){if(!Y){const P=typeof ee=="boolean"?ee:ee.accept,V=typeof ee=="boolean"?void 0:ee.effect;return{accept:P,effect:V,feedback:[x]}}return ee}if(ee.bubble===1){const P=this.modelProvider(),V=P.getNodeLocation(W),U=P.getParentNodeLocation(V),H=P.getNode(U),$=U&&P.getListIndex(U);return this.onDragOver(R,H,$,K,!1)}const ne=this.modelProvider(),le=ne.getNodeLocation(W),X=ne.getListIndex(le),z=ne.getListRenderCount(le);return Object.assign(Object.assign({},ee),{feedback:g.range(X,X+z)})}drop(R,W,x,K){this.autoExpandDisposable.dispose(),this.autoExpandNode=void 0,this.dnd.drop(h(R),W&&W.element,x,K)}onDragEnd(R){this.dnd.onDragEnd&&this.dnd.onDragEnd(R)}}function _(D,R){return R&&Object.assign(Object.assign({},R),{identityProvider:R.identityProvider&&{getId(W){return R.identityProvider.getId(W.element)}},dnd:R.dnd&&new m(D,R.dnd),multipleSelectionController:R.multipleSelectionController&&{isSelectionSingleChangeEvent(W){return R.multipleSelectionController.isSelectionSingleChangeEvent(Object.assign(Object.assign({},W),{element:W.element}))},isSelectionRangeChangeEvent(W){return R.multipleSelectionController.isSelectionRangeChangeEvent(Object.assign(Object.assign({},W),{element:W.element}))}},accessibilityProvider:R.accessibilityProvider&&Object.assign(Object.assign({},R.accessibilityProvider),{getSetSize(W){const x=D(),K=x.getNodeLocation(W),Y=x.getParentNodeLocation(K);return x.getNode(Y).visibleChildrenCount},getPosInSet(W){return W.visibleChildIndex+1},isChecked:R.accessibilityProvider&&R.accessibilityProvider.isChecked?W=>R.accessibilityProvider.isChecked(W.element):void 0,getRole:R.accessibilityProvider&&R.accessibilityProvider.getRole?W=>R.accessibilityProvider.getRole(W.element):()=>"treeitem",getAriaLabel(W){return R.accessibilityProvider.getAriaLabel(W.element)},getWidgetAriaLabel(){return R.accessibilityProvider.getWidgetAriaLabel()},getWidgetRole:R.accessibilityProvider&&R.accessibilityProvider.getWidgetRole?()=>R.accessibilityProvider.getWidgetRole():()=>"tree",getAriaLevel:R.accessibilityProvider&&R.accessibilityProvider.getAriaLevel?W=>R.accessibilityProvider.getAriaLevel(W.element):W=>W.depth,getActiveDescendantId:R.accessibilityProvider.getActiveDescendantId&&(W=>R.accessibilityProvider.getActiveDescendantId(W.element))}),keyboardNavigationLabelProvider:R.keyboardNavigationLabelProvider&&Object.assign(Object.assign({},R.keyboardNavigationLabelProvider),{getKeyboardNavigationLabel(W){return R.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(W.element)}}),enableKeyboardNavigation:R.simpleKeyboardNavigation})}class f{constructor(R){this.delegate=R}getHeight(R){return this.delegate.getHeight(R.element)}getTemplateId(R){return this.delegate.getTemplateId(R.element)}hasDynamicHeight(R){return!!this.delegate.hasDynamicHeight&&this.delegate.hasDynamicHeight(R.element)}setDynamicHeight(R,W){this.delegate.setDynamicHeight&&this.delegate.setDynamicHeight(R.element,W)}}e.ComposedTreeDelegate=f;var v;(function(D){D.None="none",D.OnHover="onHover",D.Always="always"})(v=e.RenderIndentGuides||(e.RenderIndentGuides={}));class y{constructor(R,W=[]){this._elements=W,this.onDidChange=w.Event.forEach(R,x=>this._elements=x)}get elements(){return this._elements}}class L{constructor(R,W,x,K,Y={}){this.renderer=R,this.modelProvider=W,this.activeNodes=K,this.renderedElements=new Map,this.renderedNodes=new Map,this.indent=L.DefaultIndent,this.hideTwistiesOfChildlessElements=!1,this.shouldRenderIndentGuides=!1,this.renderedIndentGuides=new n.SetMap,this.activeIndentNodes=new Set,this.indentGuidesDisposable=b.Disposable.None,this.disposables=new b.DisposableStore,this.templateId=R.templateId,this.updateOptions(Y),w.Event.map(x,ee=>ee.node)(this.onDidChangeNodeTwistieState,this,this.disposables),R.onDidChangeTwistieState&&R.onDidChangeTwistieState(this.onDidChangeTwistieState,this,this.disposables)}updateOptions(R={}){if(typeof R.indent!="undefined"&&(this.indent=i.clamp(R.indent,0,40)),typeof R.renderIndentGuides!="undefined"){const W=R.renderIndentGuides!==v.None;if(W!==this.shouldRenderIndentGuides&&(this.shouldRenderIndentGuides=W,this.indentGuidesDisposable.dispose(),W)){const x=new b.DisposableStore;this.activeNodes.onDidChange(this._onDidChangeActiveNodes,this,x),this.indentGuidesDisposable=x,this._onDidChangeActiveNodes(this.activeNodes.elements)}}typeof R.hideTwistiesOfChildlessElements!="undefined"&&(this.hideTwistiesOfChildlessElements=R.hideTwistiesOfChildlessElements)}renderTemplate(R){const W=M.append(R,M.$(".monaco-tl-row")),x=M.append(W,M.$(".monaco-tl-indent")),K=M.append(W,M.$(".monaco-tl-twistie")),Y=M.append(W,M.$(".monaco-tl-contents")),ee=this.renderer.renderTemplate(Y);return{container:R,indent:x,twistie:K,indentGuidesDisposable:b.Disposable.None,templateData:ee}}renderElement(R,W,x,K){typeof K=="number"&&(this.renderedNodes.set(R,{templateData:x,height:K}),this.renderedElements.set(R.element,R));const Y=L.DefaultIndent+(R.depth-1)*this.indent;x.twistie.style.paddingLeft=`${Y}px`,x.indent.style.width=`${Y+this.indent-16}px`,this.renderTwistie(R,x),typeof K=="number"&&this.renderIndentGuides(R,x),this.renderer.renderElement(R,W,x.templateData,K)}disposeElement(R,W,x,K){x.indentGuidesDisposable.dispose(),this.renderer.disposeElement&&this.renderer.disposeElement(R,W,x.templateData,K),typeof K=="number"&&(this.renderedNodes.delete(R),this.renderedElements.delete(R.element))}disposeTemplate(R){this.renderer.disposeTemplate(R.templateData)}onDidChangeTwistieState(R){const W=this.renderedElements.get(R);!W||this.onDidChangeNodeTwistieState(W)}onDidChangeNodeTwistieState(R){const W=this.renderedNodes.get(R);!W||(this.renderTwistie(R,W.templateData),this._onDidChangeActiveNodes(this.activeNodes.elements),this.renderIndentGuides(R,W.templateData))}renderTwistie(R,W){W.twistie.classList.remove(...t.treeItemExpandedIcon.classNamesArray);let x=!1;this.renderer.renderTwistie&&(x=this.renderer.renderTwistie(R.element,W.twistie)),R.collapsible&&(!this.hideTwistiesOfChildlessElements||R.visibleChildrenCount>0)?(x||W.twistie.classList.add(...t.treeItemExpandedIcon.classNamesArray),W.twistie.classList.add("collapsible"),W.twistie.classList.toggle("collapsed",R.collapsed)):W.twistie.classList.remove("collapsible","collapsed"),R.collapsible?W.container.setAttribute("aria-expanded",String(!R.collapsed)):W.container.removeAttribute("aria-expanded")}renderIndentGuides(R,W){if(M.clearNode(W.indent),W.indentGuidesDisposable.dispose(),!!this.shouldRenderIndentGuides){const x=new b.DisposableStore,K=this.modelProvider();let Y=R;for(;;){const ee=K.getNodeLocation(Y),se=K.getParentNodeLocation(ee);if(!se)break;const ne=K.getNode(se),le=M.$(".indent-guide",{style:`width: ${this.indent}px`});this.activeIndentNodes.has(ne)&&le.classList.add("active"),W.indent.childElementCount===0?W.indent.appendChild(le):W.indent.insertBefore(le,W.indent.firstElementChild),this.renderedIndentGuides.add(ne,le),x.add(b.toDisposable(()=>this.renderedIndentGuides.delete(ne,le))),Y=ne}W.indentGuidesDisposable=x}}_onDidChangeActiveNodes(R){if(!!this.shouldRenderIndentGuides){const W=new Set,x=this.modelProvider();R.forEach(K=>{const Y=x.getNodeLocation(K);try{const ee=x.getParentNodeLocation(Y);K.collapsible&&K.children.length>0&&!K.collapsed?W.add(K):ee&&W.add(x.getNode(ee))}catch(ee){}}),this.activeIndentNodes.forEach(K=>{W.has(K)||this.renderedIndentGuides.forEach(K,Y=>Y.classList.remove("active"))}),W.forEach(K=>{this.activeIndentNodes.has(K)||this.renderedIndentGuides.forEach(K,Y=>Y.classList.add("active"))}),this.activeIndentNodes=W}}dispose(){this.renderedNodes.clear(),this.renderedElements.clear(),this.indentGuidesDisposable.dispose(),b.dispose(this.disposables)}}L.DefaultIndent=8;class I{constructor(R,W,x){this.tree=R,this.keyboardNavigationLabelProvider=W,this._filter=x,this._totalCount=0,this._matchCount=0,this._pattern="",this._lowercasePattern="",this.disposables=new b.DisposableStore,R.onWillRefilter(this.reset,this,this.disposables)}get totalCount(){return this._totalCount}get matchCount(){return this._matchCount}set pattern(R){this._pattern=R,this._lowercasePattern=R.toLowerCase()}filter(R,W){if(this._filter){const Y=this._filter.filter(R,W);if(this.tree.options.simpleKeyboardNavigation)return Y;let ee;if(typeof Y=="boolean"?ee=Y?1:0:s.isFilterResult(Y)?ee=s.getVisibleState(Y.visibility):ee=Y,ee===0)return!1}if(this._totalCount++,this.tree.options.simpleKeyboardNavigation||!this._pattern)return this._matchCount++,{data:o.FuzzyScore.Default,visibility:!0};const x=this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(R),K=Array.isArray(x)?x:[x];for(const Y of K){const ee=Y&&Y.toString();if(typeof ee=="undefined")return{data:o.FuzzyScore.Default,visibility:!0};const se=o.fuzzyScore(this._pattern,this._lowercasePattern,0,ee,ee.toLowerCase(),0,!0);if(se)return this._matchCount++,K.length===1?{data:se,visibility:!0}:{data:{label:ee,score:se},visibility:!0}}return this.tree.options.filterOnType?2:{data:o.FuzzyScore.Default,visibility:!0}}reset(){this._totalCount=0,this._matchCount=0}dispose(){b.dispose(this.disposables)}}class k{constructor(R,W,x,K,Y){this.tree=R,this.view=x,this.filter=K,this.keyboardNavigationDelegate=Y,this._enabled=!1,this._pattern="",this._empty=!1,this._onDidChangeEmptyState=new w.Emitter,this.positionClassName="ne",this.automaticKeyboardNavigation=!0,this.triggered=!1,this._onDidChangePattern=new w.Emitter,this.enabledDisposables=new b.DisposableStore,this.disposables=new b.DisposableStore,this.domNode=M.$(`.monaco-list-type-filter.${this.positionClassName}`),this.domNode.draggable=!0,c.domEvent(this.domNode,"dragstart")(this.onDragStart,this,this.disposables),this.messageDomNode=M.append(x.getHTMLElement(),M.$(".monaco-list-type-filter-message")),this.labelDomNode=M.append(this.domNode,M.$("span.label"));const ee=M.append(this.domNode,M.$(".controls"));this._filterOnType=!!R.options.filterOnType,this.filterOnTypeDomNode=M.append(ee,M.$("input.filter")),this.filterOnTypeDomNode.type="checkbox",this.filterOnTypeDomNode.checked=this._filterOnType,this.filterOnTypeDomNode.tabIndex=-1,this.updateFilterOnTypeTitleAndIcon(),c.domEvent(this.filterOnTypeDomNode,"input")(this.onDidChangeFilterOnType,this,this.disposables),this.clearDomNode=M.append(ee,M.$("button.clear"+t.treeFilterClearIcon.cssSelector)),this.clearDomNode.tabIndex=-1,this.clearDomNode.title=a.localize(0,null),this.keyboardNavigationEventFilter=R.options.keyboardNavigationEventFilter,W.onDidSplice(this.onDidSpliceModel,this,this.disposables),this.updateOptions(R.options)}get enabled(){return this._enabled}get pattern(){return this._pattern}get filterOnType(){return this._filterOnType}updateOptions(R){R.simpleKeyboardNavigation?this.disable():this.enable(),typeof R.filterOnType!="undefined"&&(this._filterOnType=!!R.filterOnType,this.filterOnTypeDomNode.checked=this._filterOnType),typeof R.automaticKeyboardNavigation!="undefined"&&(this.automaticKeyboardNavigation=R.automaticKeyboardNavigation),this.tree.refilter(),this.render(),this.automaticKeyboardNavigation||this.onEventOrInput("")}enable(){if(!this._enabled){const R=w.Event.chain(c.domEvent(this.view.getHTMLElement(),"keydown")).filter(x=>!N.isInputElement(x.target)||x.target===this.filterOnTypeDomNode).filter(x=>x.key!=="Dead"&&!/^Media/.test(x.key)).map(x=>new S.StandardKeyboardEvent(x)).filter(this.keyboardNavigationEventFilter||(()=>!0)).filter(()=>this.automaticKeyboardNavigation||this.triggered).filter(x=>this.keyboardNavigationDelegate.mightProducePrintableCharacter(x)&&!(x.keyCode===18||x.keyCode===16||x.keyCode===15||x.keyCode===17)||(this.pattern.length>0||this.triggered)&&(x.keyCode===9||x.keyCode===1)&&!x.altKey&&!x.ctrlKey&&!x.metaKey||x.keyCode===1&&(r.isMacintosh?x.altKey&&!x.metaKey:x.ctrlKey)&&!x.shiftKey).forEach(x=>{x.stopPropagation(),x.preventDefault()}).event,W=c.domEvent(this.clearDomNode,"click");w.Event.chain(w.Event.any(R,W)).event(this.onEventOrInput,this,this.enabledDisposables),this.filter.pattern="",this.tree.refilter(),this.render(),this._enabled=!0,this.triggered=!1}}disable(){!this._enabled||(this.domNode.remove(),this.enabledDisposables.clear(),this.tree.refilter(),this.render(),this._enabled=!1,this.triggered=!1)}onEventOrInput(R){typeof R=="string"?this.onInput(R):R instanceof MouseEvent||R.keyCode===9||R.keyCode===1&&(r.isMacintosh?R.altKey:R.ctrlKey)?this.onInput(""):R.keyCode===1?this.onInput(this.pattern.length===0?"":this.pattern.substr(0,this.pattern.length-1)):this.onInput(this.pattern+R.browserEvent.key)}onInput(R){const W=this.view.getHTMLElement();R&&!this.domNode.parentElement?W.append(this.domNode):!R&&this.domNode.parentElement&&(this.domNode.remove(),this.tree.domFocus()),this._pattern=R,this._onDidChangePattern.fire(R),this.filter.pattern=R,this.tree.refilter(),R&&this.tree.focusNext(0,!0,void 0,K=>!o.FuzzyScore.isDefault(K.filterData));const x=this.tree.getFocus();if(x.length>0){const K=x[0];this.tree.getRelativeTop(K)===null&&this.tree.reveal(K,.5)}this.render(),R||(this.triggered=!1)}onDragStart(){const R=this.view.getHTMLElement(),{left:W}=M.getDomNodePagePosition(R),x=R.clientWidth,K=x/2,Y=this.domNode.clientWidth,ee=new b.DisposableStore;let se=this.positionClassName;const ne=()=>{switch(se){case"nw":this.domNode.style.top="4px",this.domNode.style.left="4px";break;case"ne":this.domNode.style.top="4px",this.domNode.style.left=`${x-Y-6}px`;break}},le=z=>{z.preventDefault();const P=z.clientX-W;z.dataTransfer&&(z.dataTransfer.dropEffect="none"),P{this.positionClassName=se,this.domNode.className=`monaco-list-type-filter ${this.positionClassName}`,this.domNode.style.top="",this.domNode.style.left="",b.dispose(ee)};ne(),this.domNode.classList.remove(se),this.domNode.classList.add("dragging"),ee.add(b.toDisposable(()=>this.domNode.classList.remove("dragging"))),c.domEvent(document,"dragover")(le,null,ee),c.domEvent(this.domNode,"dragend")(X,null,ee),d.StaticDND.CurrentDragAndDropData=new d.DragAndDropData("vscode-ui"),ee.add(b.toDisposable(()=>d.StaticDND.CurrentDragAndDropData=void 0))}onDidSpliceModel(){!this._enabled||this.pattern.length===0||(this.tree.refilter(),this.render())}onDidChangeFilterOnType(){this.tree.updateOptions({filterOnType:this.filterOnTypeDomNode.checked}),this.tree.refilter(),this.tree.domFocus(),this.render(),this.updateFilterOnTypeTitleAndIcon()}updateFilterOnTypeTitleAndIcon(){this.filterOnType?(this.filterOnTypeDomNode.classList.remove(...t.treeFilterOnTypeOffIcon.classNamesArray),this.filterOnTypeDomNode.classList.add(...t.treeFilterOnTypeOnIcon.classNamesArray),this.filterOnTypeDomNode.title=a.localize(1,null)):(this.filterOnTypeDomNode.classList.remove(...t.treeFilterOnTypeOnIcon.classNamesArray),this.filterOnTypeDomNode.classList.add(...t.treeFilterOnTypeOffIcon.classNamesArray),this.filterOnTypeDomNode.title=a.localize(2,null))}render(){const R=this.filter.totalCount>0&&this.filter.matchCount===0;this.pattern&&this.tree.options.filterOnType&&R?(this.messageDomNode.textContent=a.localize(3,null),this._empty=!0):(this.messageDomNode.innerText="",this._empty=!1),this.domNode.classList.toggle("no-matches",R),this.domNode.title=a.localize(4,null,this.filter.matchCount,this.filter.totalCount),this.labelDomNode.textContent=this.pattern.length>16?"\u2026"+this.pattern.substr(this.pattern.length-16):this.pattern,this._onDidChangeEmptyState.fire(this._empty)}shouldAllowFocus(R){return!this.enabled||!this.pattern||this.filterOnType||this.filter.totalCount>0&&this.filter.matchCount<=1?!0:!o.FuzzyScore.isDefault(R.filterData)}dispose(){this._enabled&&(this.domNode.remove(),this.enabledDisposables.dispose(),this._enabled=!1,this.triggered=!1),this._onDidChangePattern.dispose(),b.dispose(this.disposables)}}function E(D){let R=C.TreeMouseEventTarget.Unknown;return M.hasParentWithClass(D.browserEvent.target,"monaco-tl-twistie","monaco-tl-row")?R=C.TreeMouseEventTarget.Twistie:M.hasParentWithClass(D.browserEvent.target,"monaco-tl-contents","monaco-tl-row")&&(R=C.TreeMouseEventTarget.Element),{browserEvent:D.browserEvent,element:D.element?D.element.element:null,target:R}}function T(D,R){R(D),D.children.forEach(W=>T(W,R))}class O{constructor(R){this.identityProvider=R,this.nodes=[],this._onDidChange=new w.Emitter,this.onDidChange=this._onDidChange.event}get nodeSet(){return this._nodeSet||(this._nodeSet=this.createNodeSet()),this._nodeSet}set(R,W){var x;!((x=W)===null||x===void 0?void 0:x.__forceEvent)&&g.equals(this.nodes,R)||this._set(R,!1,W)}_set(R,W,x){if(this.nodes=[...R],this.elements=void 0,this._nodeSet=void 0,!W){const K=this;this._onDidChange.fire({get elements(){return K.get()},browserEvent:x})}}get(){return this.elements||(this.elements=this.nodes.map(R=>R.element)),[...this.elements]}getNodes(){return this.nodes}has(R){return this.nodeSet.has(R)}onDidModelSplice({insertedNodes:R,deletedNodes:W}){if(!this.identityProvider){const ne=this.createNodeSet(),le=X=>ne.delete(X);W.forEach(X=>T(X,le)),this.set([...ne.values()]);return}const x=new Set,K=ne=>x.add(this.identityProvider.getId(ne.element).toString());W.forEach(ne=>T(ne,K));const Y=new Map,ee=ne=>Y.set(this.identityProvider.getId(ne.element).toString(),ne);R.forEach(ne=>T(ne,ee));const se=[];for(const ne of this.nodes){const le=this.identityProvider.getId(ne.element).toString();if(!x.has(le))se.push(ne);else{const z=Y.get(le);z&&se.push(z)}}this._set(se,!0)}createNodeSet(){const R=new Set;for(const W of this.nodes)R.add(W);return R}}class A extends N.MouseController{constructor(R,W){super(R);this.tree=W}onViewPointer(R){if(!(N.isInputElement(R.browserEvent.target)||N.isMonacoEditor(R.browserEvent.target))){const W=R.element;if(!W)return super.onViewPointer(R);if(this.isSelectionRangeChangeEvent(R)||this.isSelectionSingleChangeEvent(R))return super.onViewPointer(R);const x=R.browserEvent.target,K=x.classList.contains("monaco-tl-twistie")||x.classList.contains("monaco-icon-label")&&x.classList.contains("folder-icon")&&R.browserEvent.offsetX<16;let Y=!1;if(typeof this.tree.expandOnlyOnTwistieClick=="function"?Y=this.tree.expandOnlyOnTwistieClick(W.element):Y=!!this.tree.expandOnlyOnTwistieClick,Y&&!K&&R.browserEvent.detail!==2)return super.onViewPointer(R);if(!this.tree.expandOnDoubleClick&&R.browserEvent.detail===2)return super.onViewPointer(R);if(W.collapsible){const ee=this.tree.model,se=ee.getNodeLocation(W),ne=R.browserEvent.altKey;if(this.tree.setFocus([se]),ee.setCollapsed(se,void 0,ne),Y&&K)return}super.onViewPointer(R)}}onDoubleClick(R){R.browserEvent.target.classList.contains("monaco-tl-twistie")||!this.tree.expandOnDoubleClick||super.onDoubleClick(R)}}class B extends N.List{constructor(R,W,x,K,Y,ee,se){super(R,W,x,K,se);this.focusTrait=Y,this.selectionTrait=ee}createMouseController(R){return new A(this,R.tree)}splice(R,W,x=[]){if(super.splice(R,W,x),x.length!==0){const K=[],Y=[];x.forEach((ee,se)=>{this.focusTrait.has(ee)&&K.push(R+se),this.selectionTrait.has(ee)&&Y.push(R+se)}),K.length>0&&super.setFocus(g.distinctES6([...super.getFocus(),...K])),Y.length>0&&super.setSelection(g.distinctES6([...super.getSelection(),...Y]))}}setFocus(R,W,x=!1){super.setFocus(R,W),x||this.focusTrait.set(R.map(K=>this.element(K)),W)}setSelection(R,W,x=!1){super.setSelection(R,W),x||this.selectionTrait.set(R.map(K=>this.element(K)),W)}}class F{constructor(R,W,x,K,Y={}){this._options=Y,this.eventBufferer=new w.EventBufferer,this.disposables=new b.DisposableStore,this._onWillRefilter=new w.Emitter,this.onWillRefilter=this._onWillRefilter.event,this._onDidUpdateOptions=new w.Emitter;const ee=new f(x),se=new w.Relay,ne=new w.Relay,le=new y(ne.event);this.renderers=K.map(P=>new L(P,()=>this.model,se.event,le,Y));for(let P of this.renderers)this.disposables.add(P);let X;Y.keyboardNavigationLabelProvider&&(X=new I(this,Y.keyboardNavigationLabelProvider,Y.filter),Y=Object.assign(Object.assign({},Y),{filter:X}),this.disposables.add(X)),this.focus=new O(Y.identityProvider),this.selection=new O(Y.identityProvider),this.view=new B(R,W,ee,this.renderers,this.focus,this.selection,Object.assign(Object.assign({},_(()=>this.model,Y)),{tree:this})),this.model=this.createModel(R,this.view,Y),se.input=this.model.onDidChangeCollapseState;const z=w.Event.forEach(this.model.onDidSplice,P=>{this.eventBufferer.bufferEvents(()=>{this.focus.onDidModelSplice(P),this.selection.onDidModelSplice(P)})});if(z(()=>null,null,this.disposables),ne.input=w.Event.chain(w.Event.any(z,this.focus.onDidChange,this.selection.onDidChange)).debounce(()=>null,0).map(()=>{const P=new Set;for(const V of this.focus.getNodes())P.add(V);for(const V of this.selection.getNodes())P.add(V);return[...P.values()]}).event,Y.keyboardSupport!==!1){const P=w.Event.chain(this.view.onKeyDown).filter(V=>!N.isInputElement(V.target)).map(V=>new S.StandardKeyboardEvent(V));P.filter(V=>V.keyCode===15).on(this.onLeftArrow,this,this.disposables),P.filter(V=>V.keyCode===17).on(this.onRightArrow,this,this.disposables),P.filter(V=>V.keyCode===10).on(this.onSpace,this,this.disposables)}if(Y.keyboardNavigationLabelProvider){const P=Y.keyboardNavigationDelegate||N.DefaultKeyboardNavigationDelegate;this.typeFilterController=new k(this,this.model,this.view,X,P),this.focusNavigationFilter=V=>this.typeFilterController.shouldAllowFocus(V),this.disposables.add(this.typeFilterController)}this.styleElement=M.createStyleSheet(this.view.getHTMLElement()),this.getHTMLElement().classList.toggle("always",this._options.renderIndentGuides===v.Always)}get onDidChangeFocus(){return this.eventBufferer.wrapEvent(this.focus.onDidChange)}get onDidChangeSelection(){return this.eventBufferer.wrapEvent(this.selection.onDidChange)}get onMouseDblClick(){return w.Event.map(this.view.onMouseDblClick,E)}get onPointer(){return w.Event.map(this.view.onPointer,E)}get onDidFocus(){return this.view.onDidFocus}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}get expandOnDoubleClick(){return typeof this._options.expandOnDoubleClick=="undefined"?!0:this._options.expandOnDoubleClick}get expandOnlyOnTwistieClick(){return typeof this._options.expandOnlyOnTwistieClick=="undefined"?!0:this._options.expandOnlyOnTwistieClick}get onDidDispose(){return this.view.onDidDispose}updateOptions(R={}){this._options=Object.assign(Object.assign({},this._options),R);for(const W of this.renderers)W.updateOptions(R);this.view.updateOptions({enableKeyboardNavigation:this._options.simpleKeyboardNavigation,automaticKeyboardNavigation:this._options.automaticKeyboardNavigation,smoothScrolling:this._options.smoothScrolling,horizontalScrolling:this._options.horizontalScrolling}),this.typeFilterController&&this.typeFilterController.updateOptions(this._options),this._onDidUpdateOptions.fire(this._options),this.getHTMLElement().classList.toggle("always",this._options.renderIndentGuides===v.Always)}get options(){return this._options}getHTMLElement(){return this.view.getHTMLElement()}get scrollTop(){return this.view.scrollTop}set scrollTop(R){this.view.scrollTop=R}domFocus(){this.view.domFocus()}layout(R,W){this.view.layout(R,W)}style(R){const W=`.${this.view.domId}`,x=[];R.treeIndentGuidesStroke&&(x.push(`.monaco-list${W}:hover .monaco-tl-indent > .indent-guide, .monaco-list${W}.always .monaco-tl-indent > .indent-guide { border-color: ${R.treeIndentGuidesStroke.transparent(.4)}; }`),x.push(`.monaco-list${W} .monaco-tl-indent > .indent-guide.active { border-color: ${R.treeIndentGuidesStroke}; }`)),this.styleElement.textContent=x.join(` +`),this.view.style(R)}collapse(R,W=!1){return this.model.setCollapsed(R,!0,W)}expand(R,W=!1){return this.model.setCollapsed(R,!1,W)}isCollapsible(R){return this.model.isCollapsible(R)}setCollapsible(R,W){return this.model.setCollapsible(R,W)}isCollapsed(R){return this.model.isCollapsed(R)}refilter(){this._onWillRefilter.fire(void 0),this.model.refilter()}setSelection(R,W){const x=R.map(Y=>this.model.getNode(Y));this.selection.set(x,W);const K=R.map(Y=>this.model.getListIndex(Y)).filter(Y=>Y>-1);this.view.setSelection(K,W,!0)}getSelection(){return this.selection.get()}setFocus(R,W){const x=R.map(Y=>this.model.getNode(Y));this.focus.set(x,W);const K=R.map(Y=>this.model.getListIndex(Y)).filter(Y=>Y>-1);this.view.setFocus(K,W,!0)}focusNext(R=1,W=!1,x,K=this.focusNavigationFilter){this.view.focusNext(R,W,x,K)}getFocus(){return this.focus.get()}reveal(R,W){this.model.expandTo(R);const x=this.model.getListIndex(R);x!==-1&&this.view.reveal(x,W)}getRelativeTop(R){const W=this.model.getListIndex(R);return W===-1?null:this.view.getRelativeTop(W)}onLeftArrow(R){R.preventDefault(),R.stopPropagation();const W=this.view.getFocusedElements();if(W.length!==0){const x=W[0],K=this.model.getNodeLocation(x);if(!this.model.setCollapsed(K,!0)){const ee=this.model.getParentNodeLocation(K);if(!ee)return;const se=this.model.getListIndex(ee);this.view.reveal(se),this.view.setFocus([se])}}}onRightArrow(R){R.preventDefault(),R.stopPropagation();const W=this.view.getFocusedElements();if(W.length!==0){const x=W[0],K=this.model.getNodeLocation(x);if(!this.model.setCollapsed(K,!1)){if(!x.children.some(ne=>ne.visible))return;const[ee]=this.view.getFocus(),se=ee+1;this.view.reveal(se),this.view.setFocus([se])}}}onSpace(R){R.preventDefault(),R.stopPropagation();const W=this.view.getFocusedElements();if(W.length!==0){const x=W[0],K=this.model.getNodeLocation(x),Y=R.browserEvent.altKey;this.model.setCollapsed(K,void 0,Y)}}dispose(){b.dispose(this.disposables),this.view.dispose()}}e.AbstractTree=F}),define(Q[427],J([0,1,176,155]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DataTree=void 0;class M extends b.AbstractTree{constructor(S,C,d,g,p,c={}){super(S,C,d,g,c);this.user=S,this.dataSource=p,this.identityProvider=c.identityProvider}createModel(S,C,d){return new N.ObjectTreeModel(S,C,d)}}e.DataTree=M}),define(Q[234],J([0,1,54,176,155,284,99]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompressibleObjectTree=e.ObjectTree=void 0;class C extends N.AbstractTree{constructor(o,s,a,u,r={}){super(o,s,a,u,r)}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}setChildren(o,s=b.Iterable.empty(),a){this.model.setChildren(o,s,a)}rerender(o){if(o===void 0){this.view.rerender();return}this.model.rerender(o)}hasElement(o){return this.model.has(o)}createModel(o,s,a){return new M.ObjectTreeModel(o,s,a)}}e.ObjectTree=C;class d{constructor(o,s){this._compressedTreeNodeProvider=o,this.renderer=s,this.templateId=s.templateId,s.onDidChangeTwistieState&&(this.onDidChangeTwistieState=s.onDidChangeTwistieState)}get compressedTreeNodeProvider(){return this._compressedTreeNodeProvider()}renderTemplate(o){const s=this.renderer.renderTemplate(o);return{compressedTreeNode:void 0,data:s}}renderElement(o,s,a,u){const r=this.compressedTreeNodeProvider.getCompressedTreeNode(o.element);r.element.elements.length===1?(a.compressedTreeNode=void 0,this.renderer.renderElement(o,s,a.data,u)):(a.compressedTreeNode=r,this.renderer.renderCompressedElements(r,s,a.data,u))}disposeElement(o,s,a,u){a.compressedTreeNode?this.renderer.disposeCompressedElements&&this.renderer.disposeCompressedElements(a.compressedTreeNode,s,a.data,u):this.renderer.disposeElement&&this.renderer.disposeElement(o,s,a.data,u)}disposeTemplate(o){this.renderer.disposeTemplate(o.data)}renderTwistie(o,s){return this.renderer.renderTwistie?this.renderer.renderTwistie(o,s):!1}}Me([S.memoize],d.prototype,"compressedTreeNodeProvider",null);function g(c,o){return o&&Object.assign(Object.assign({},o),{keyboardNavigationLabelProvider:o.keyboardNavigationLabelProvider&&{getKeyboardNavigationLabel(s){let a;try{a=c().getCompressedTreeNode(s)}catch(u){return o.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(s)}return a.element.elements.length===1?o.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(s):o.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(a.element.elements)}}})}class p extends C{constructor(o,s,a,u,r={}){const i=()=>this,n=u.map(t=>new d(i,t));super(o,s,a,n,g(i,r))}setChildren(o,s=b.Iterable.empty(),a){this.model.setChildren(o,s,a)}createModel(o,s,a){return new w.CompressibleObjectTreeModel(o,s,a)}updateOptions(o={}){super.updateOptions(o),typeof o.compressionEnabled!="undefined"&&this.model.setCompressionEnabled(o.compressionEnabled)}getCompressedTreeNode(o=null){return this.model.getCompressedTreeNode(o)}}e.CompressibleObjectTree=p}),define(Q[428],J([0,1,176,234,98,2,6,15,54,161,12,154,197]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CompressibleAsyncDataTree=e.AsyncDataTree=void 0;function s(T){return Object.assign(Object.assign({},T),{children:[],refreshPromise:void 0,stale:!0,slow:!1,collapsedByDefault:void 0})}function a(T,O){return O.parent?O.parent===T?!0:a(T,O.parent):!1}function u(T,O){return T===O||a(T,O)||a(O,T)}class r{constructor(O){this.node=O}get element(){return this.node.element.element}get children(){return this.node.children.map(O=>new r(O))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}}class i{constructor(O,A,B){this.renderer=O,this.nodeMapper=A,this.onDidChangeTwistieState=B,this.renderedNodes=new Map,this.templateId=O.templateId}renderTemplate(O){return{templateData:this.renderer.renderTemplate(O)}}renderElement(O,A,B,F){this.renderer.renderElement(this.nodeMapper.map(O),A,B.templateData,F)}renderTwistie(O,A){return O.slow?(A.classList.add(...o.treeItemLoadingIcon.classNamesArray),!0):(A.classList.remove(...o.treeItemLoadingIcon.classNamesArray),!1)}disposeElement(O,A,B,F){this.renderer.disposeElement&&this.renderer.disposeElement(this.nodeMapper.map(O),A,B.templateData,F)}disposeTemplate(O){this.renderer.disposeTemplate(O.templateData)}dispose(){this.renderedNodes.clear()}}function n(T){return{browserEvent:T.browserEvent,elements:T.elements.map(O=>O.element)}}function t(T){return{browserEvent:T.browserEvent,element:T.element&&T.element.element,target:T.target}}class l extends g.ElementsDragAndDropData{constructor(O){super(O.elements.map(A=>A.element));this.data=O}}function h(T){return T instanceof g.ElementsDragAndDropData?new l(T):T}class m{constructor(O){this.dnd=O}getDragURI(O){return this.dnd.getDragURI(O.element)}getDragLabel(O,A){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(O.map(B=>B.element),A)}onDragStart(O,A){this.dnd.onDragStart&&this.dnd.onDragStart(h(O),A)}onDragOver(O,A,B,F,D=!0){return this.dnd.onDragOver(h(O),A&&A.element,B,F)}drop(O,A,B,F){this.dnd.drop(h(O),A&&A.element,B,F)}onDragEnd(O){this.dnd.onDragEnd&&this.dnd.onDragEnd(O)}}function _(T){return T&&Object.assign(Object.assign({},T),{collapseByDefault:!0,identityProvider:T.identityProvider&&{getId(O){return T.identityProvider.getId(O.element)}},dnd:T.dnd&&new m(T.dnd),multipleSelectionController:T.multipleSelectionController&&{isSelectionSingleChangeEvent(O){return T.multipleSelectionController.isSelectionSingleChangeEvent(Object.assign(Object.assign({},O),{element:O.element}))},isSelectionRangeChangeEvent(O){return T.multipleSelectionController.isSelectionRangeChangeEvent(Object.assign(Object.assign({},O),{element:O.element}))}},accessibilityProvider:T.accessibilityProvider&&Object.assign(Object.assign({},T.accessibilityProvider),{getPosInSet:void 0,getSetSize:void 0,getRole:T.accessibilityProvider.getRole?O=>T.accessibilityProvider.getRole(O.element):()=>"treeitem",isChecked:T.accessibilityProvider.isChecked?O=>{var A;return!!((A=T.accessibilityProvider)===null||A===void 0?void 0:A.isChecked(O.element))}:void 0,getAriaLabel(O){return T.accessibilityProvider.getAriaLabel(O.element)},getWidgetAriaLabel(){return T.accessibilityProvider.getWidgetAriaLabel()},getWidgetRole:T.accessibilityProvider.getWidgetRole?()=>T.accessibilityProvider.getWidgetRole():()=>"tree",getAriaLevel:T.accessibilityProvider.getAriaLevel&&(O=>T.accessibilityProvider.getAriaLevel(O.element)),getActiveDescendantId:T.accessibilityProvider.getActiveDescendantId&&(O=>T.accessibilityProvider.getActiveDescendantId(O.element))}),filter:T.filter&&{filter(O,A){return T.filter.filter(O.element,A)}},keyboardNavigationLabelProvider:T.keyboardNavigationLabelProvider&&Object.assign(Object.assign({},T.keyboardNavigationLabelProvider),{getKeyboardNavigationLabel(O){return T.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(O.element)}}),sorter:void 0,expandOnlyOnTwistieClick:typeof T.expandOnlyOnTwistieClick=="undefined"?void 0:typeof T.expandOnlyOnTwistieClick!="function"?T.expandOnlyOnTwistieClick:O=>T.expandOnlyOnTwistieClick(O.element),additionalScrollHeight:T.additionalScrollHeight})}function f(T,O){O(T),T.children.forEach(A=>f(A,O))}class v{constructor(O,A,B,F,D,R={}){this.user=O,this.dataSource=D,this.nodes=new Map,this.subTreeRefreshPromises=new Map,this.refreshPromises=new Map,this._onDidRender=new S.Emitter,this._onDidChangeNodeSlowState=new S.Emitter,this.nodeMapper=new M.WeakMapper(W=>new r(W)),this.disposables=new w.DisposableStore,this.identityProvider=R.identityProvider,this.autoExpandSingleChildren=typeof R.autoExpandSingleChildren=="undefined"?!1:R.autoExpandSingleChildren,this.sorter=R.sorter,this.collapseByDefault=R.collapseByDefault,this.tree=this.createTree(O,A,B,F,R),this.root=s({element:void 0,parent:null,hasChildren:!0}),this.identityProvider&&(this.root=Object.assign(Object.assign({},this.root),{id:null})),this.nodes.set(null,this.root),this.tree.onDidChangeCollapseState(this._onDidChangeCollapseState,this,this.disposables)}get onDidChangeFocus(){return S.Event.map(this.tree.onDidChangeFocus,n)}get onDidChangeSelection(){return S.Event.map(this.tree.onDidChangeSelection,n)}get onMouseDblClick(){return S.Event.map(this.tree.onMouseDblClick,t)}get onPointer(){return S.Event.map(this.tree.onPointer,t)}get onDidFocus(){return this.tree.onDidFocus}get onDidDispose(){return this.tree.onDidDispose}createTree(O,A,B,F,D){const R=new b.ComposedTreeDelegate(B),W=F.map(K=>new i(K,this.nodeMapper,this._onDidChangeNodeSlowState.event)),x=_(D)||{};return new N.ObjectTree(O,A,R,W,x)}updateOptions(O={}){this.tree.updateOptions(O)}getHTMLElement(){return this.tree.getHTMLElement()}get scrollTop(){return this.tree.scrollTop}set scrollTop(O){this.tree.scrollTop=O}domFocus(){this.tree.domFocus()}layout(O,A){this.tree.layout(O,A)}style(O){this.tree.style(O)}getInput(){return this.root.element}setInput(O,A){return Ie(this,void 0,void 0,function*(){this.refreshPromises.forEach(F=>F.cancel()),this.refreshPromises.clear(),this.root.element=O;const B=A&&{viewState:A,focus:[],selection:[]};yield this._updateChildren(O,!0,!1,B),B&&(this.tree.setFocus(B.focus),this.tree.setSelection(B.selection)),A&&typeof A.scrollTop=="number"&&(this.scrollTop=A.scrollTop)})}_updateChildren(O=this.root.element,A=!0,B=!1,F,D){return Ie(this,void 0,void 0,function*(){if(typeof this.root.element=="undefined")throw new M.TreeError(this.user,"Tree input not set");this.root.refreshPromise&&(yield this.root.refreshPromise,yield S.Event.toPromise(this._onDidRender.event));const R=this.getDataNode(O);if(yield this.refreshAndRenderNode(R,A,F,D),B)try{this.tree.rerender(R)}catch(W){}})}rerender(O){if(O===void 0||O===this.root.element){this.tree.rerender();return}const A=this.getDataNode(O);this.tree.rerender(A)}collapse(O,A=!1){const B=this.getDataNode(O);return this.tree.collapse(B===this.root?null:B,A)}expand(O,A=!1){return Ie(this,void 0,void 0,function*(){if(typeof this.root.element=="undefined")throw new M.TreeError(this.user,"Tree input not set");this.root.refreshPromise&&(yield this.root.refreshPromise,yield S.Event.toPromise(this._onDidRender.event));const B=this.getDataNode(O);if(this.tree.hasElement(B)&&!this.tree.isCollapsible(B)||(B.refreshPromise&&(yield this.root.refreshPromise,yield S.Event.toPromise(this._onDidRender.event)),B!==this.root&&!B.refreshPromise&&!this.tree.isCollapsed(B)))return!1;const F=this.tree.expand(B===this.root?null:B,A);return B.refreshPromise&&(yield this.root.refreshPromise,yield S.Event.toPromise(this._onDidRender.event)),F})}setSelection(O,A){const B=O.map(F=>this.getDataNode(F));this.tree.setSelection(B,A)}getSelection(){return this.tree.getSelection().map(A=>A.element)}setFocus(O,A){const B=O.map(F=>this.getDataNode(F));this.tree.setFocus(B,A)}getFocus(){return this.tree.getFocus().map(A=>A.element)}reveal(O,A){this.tree.reveal(this.getDataNode(O),A)}getDataNode(O){const A=this.nodes.get(O===this.root.element?null:O);if(!A)throw new M.TreeError(this.user,`Data tree node not found: ${O}`);return A}refreshAndRenderNode(O,A,B,F){return Ie(this,void 0,void 0,function*(){yield this.refreshNode(O,A,B),this.render(O,B,F)})}refreshNode(O,A,B){return Ie(this,void 0,void 0,function*(){let F;return this.subTreeRefreshPromises.forEach((D,R)=>{!F&&u(R,O)&&(F=D.then(()=>this.refreshNode(O,A,B)))}),F||this.doRefreshSubTree(O,A,B)})}doRefreshSubTree(O,A,B){return Ie(this,void 0,void 0,function*(){let F;O.refreshPromise=new Promise(D=>F=D),this.subTreeRefreshPromises.set(O,O.refreshPromise),O.refreshPromise.finally(()=>{O.refreshPromise=void 0,this.subTreeRefreshPromises.delete(O)});try{const D=yield this.doRefreshNode(O,A,B);O.stale=!1,yield C.Promises.settled(D.map(R=>this.doRefreshSubTree(R,A,B)))}finally{F()}})}doRefreshNode(O,A,B){return Ie(this,void 0,void 0,function*(){O.hasChildren=!!this.dataSource.hasChildren(O.element);let F;if(!O.hasChildren)F=Promise.resolve(d.Iterable.empty());else{const D=C.timeout(800);D.then(()=>{O.slow=!0,this._onDidChangeNodeSlowState.fire(O)},R=>null),F=this.doGetChildren(O).finally(()=>D.cancel())}try{const D=yield F;return this.setChildren(O,D,A,B)}catch(D){if(O!==this.root&&this.tree.hasElement(O)&&this.tree.collapse(O),p.isPromiseCanceledError(D))return[];throw D}finally{O.slow&&(O.slow=!1,this._onDidChangeNodeSlowState.fire(O))}})}doGetChildren(O){let A=this.refreshPromises.get(O);return A||(A=C.createCancelablePromise(()=>Ie(this,void 0,void 0,function*(){const B=yield this.dataSource.getChildren(O.element);return this.processChildren(B)})),this.refreshPromises.set(O,A),A.finally(()=>{this.refreshPromises.delete(O)}))}_onDidChangeCollapseState({node:O,deep:A}){O.element!==null&&!O.collapsed&&O.element.stale&&(A?this.collapse(O.element.element):this.refreshAndRenderNode(O.element,!1).catch(p.onUnexpectedError))}setChildren(O,A,B,F){const D=[...A];if(O.children.length===0&&D.length===0)return[];const R=new Map,W=new Map;for(const Y of O.children)if(R.set(Y.element,Y),this.identityProvider){const ee=this.tree.isCollapsed(Y);W.set(Y.id,{node:Y,collapsed:ee})}const x=[],K=D.map(Y=>{const ee=!!this.dataSource.hasChildren(Y);if(!this.identityProvider){const X=s({element:Y,parent:O,hasChildren:ee});return ee&&this.collapseByDefault&&!this.collapseByDefault(Y)&&(X.collapsedByDefault=!1,x.push(X)),X}const se=this.identityProvider.getId(Y).toString(),ne=W.get(se);if(ne){const X=ne.node;return R.delete(X.element),this.nodes.delete(X.element),this.nodes.set(Y,X),X.element=Y,X.hasChildren=ee,B?ne.collapsed?(X.children.forEach(z=>f(z,P=>this.nodes.delete(P.element))),X.children.splice(0,X.children.length),X.stale=!0):x.push(X):ee&&this.collapseByDefault&&!this.collapseByDefault(Y)&&(X.collapsedByDefault=!1,x.push(X)),X}const le=s({element:Y,parent:O,id:se,hasChildren:ee});return F&&F.viewState.focus&&F.viewState.focus.indexOf(se)>-1&&F.focus.push(le),F&&F.viewState.selection&&F.viewState.selection.indexOf(se)>-1&&F.selection.push(le),F&&F.viewState.expanded&&F.viewState.expanded.indexOf(se)>-1?x.push(le):ee&&this.collapseByDefault&&!this.collapseByDefault(Y)&&(le.collapsedByDefault=!1,x.push(le)),le});for(const Y of R.values())f(Y,ee=>this.nodes.delete(ee.element));for(const Y of K)this.nodes.set(Y.element,Y);return O.children.splice(0,O.children.length,...K),O!==this.root&&this.autoExpandSingleChildren&&K.length===1&&x.length===0&&(K[0].collapsedByDefault=!1,x.push(K[0])),x}render(O,A,B){const F=O.children.map(R=>this.asTreeElement(R,A)),D=B&&Object.assign(Object.assign({},B),{diffIdentityProvider:B.diffIdentityProvider&&{getId(R){return B.diffIdentityProvider.getId(R.element)}}});this.tree.setChildren(O===this.root?null:O,F,D),O!==this.root&&this.tree.setCollapsible(O,O.hasChildren),this._onDidRender.fire()}asTreeElement(O,A){if(O.stale)return{element:O,collapsible:O.hasChildren,collapsed:!0};let B;return A&&A.viewState.expanded&&O.id&&A.viewState.expanded.indexOf(O.id)>-1?B=!1:B=O.collapsedByDefault,O.collapsedByDefault=void 0,{element:O,children:O.hasChildren?d.Iterable.map(O.children,F=>this.asTreeElement(F,A)):[],collapsible:O.hasChildren,collapsed:B}}processChildren(O){return this.sorter&&(O=[...O].sort(this.sorter.compare.bind(this.sorter))),O}dispose(){this.disposables.dispose()}}e.AsyncDataTree=v;class y{constructor(O){this.node=O}get element(){return{elements:this.node.element.elements.map(O=>O.element),incompressible:this.node.element.incompressible}}get children(){return this.node.children.map(O=>new y(O))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}}class L{constructor(O,A,B,F){this.renderer=O,this.nodeMapper=A,this.compressibleNodeMapperProvider=B,this.onDidChangeTwistieState=F,this.renderedNodes=new Map,this.disposables=[],this.templateId=O.templateId}renderTemplate(O){return{templateData:this.renderer.renderTemplate(O)}}renderElement(O,A,B,F){this.renderer.renderElement(this.nodeMapper.map(O),A,B.templateData,F)}renderCompressedElements(O,A,B,F){this.renderer.renderCompressedElements(this.compressibleNodeMapperProvider().map(O),A,B.templateData,F)}renderTwistie(O,A){return O.slow?(A.classList.add(...o.treeItemLoadingIcon.classNamesArray),!0):(A.classList.remove(...o.treeItemLoadingIcon.classNamesArray),!1)}disposeElement(O,A,B,F){this.renderer.disposeElement&&this.renderer.disposeElement(this.nodeMapper.map(O),A,B.templateData,F)}disposeCompressedElements(O,A,B,F){this.renderer.disposeCompressedElements&&this.renderer.disposeCompressedElements(this.compressibleNodeMapperProvider().map(O),A,B.templateData,F)}disposeTemplate(O){this.renderer.disposeTemplate(O.templateData)}dispose(){this.renderedNodes.clear(),this.disposables=w.dispose(this.disposables)}}function I(T){const O=T&&_(T);return O&&Object.assign(Object.assign({},O),{keyboardNavigationLabelProvider:O.keyboardNavigationLabelProvider&&Object.assign(Object.assign({},O.keyboardNavigationLabelProvider),{getCompressedNodeKeyboardNavigationLabel(A){return T.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(A.map(B=>B.element))}})})}class k extends v{constructor(O,A,B,F,D,R,W={}){super(O,A,B,D,R,W);this.compressionDelegate=F,this.compressibleNodeMapper=new M.WeakMapper(x=>new y(x)),this.filter=W.filter}createTree(O,A,B,F,D){const R=new b.ComposedTreeDelegate(B),W=F.map(K=>new L(K,this.nodeMapper,()=>this.compressibleNodeMapper,this._onDidChangeNodeSlowState.event)),x=I(D)||{};return new N.CompressibleObjectTree(O,A,R,W,x)}asTreeElement(O,A){return Object.assign({incompressible:this.compressionDelegate.isIncompressible(O.element)},super.asTreeElement(O,A))}updateOptions(O={}){this.tree.updateOptions(O)}render(O,A){if(!this.identityProvider)return super.render(O,A);const B=se=>this.identityProvider.getId(se).toString(),F=se=>{const ne=new Set;for(const le of se){const X=this.tree.getCompressedTreeNode(le===this.root?null:le);if(!!X.element)for(const z of X.element.elements)ne.add(B(z.element))}return ne},D=F(this.tree.getSelection()),R=F(this.tree.getFocus());super.render(O,A);const W=this.getSelection();let x=!1;const K=this.getFocus();let Y=!1;const ee=se=>{const ne=se.element;if(ne)for(let le=0;le{const B=this.filter.filter(A,1),F=E(B);if(F===2)throw new Error("Recursive tree visibility not supported in async data compressed trees");return F===1})),super.processChildren(O)}}e.CompressibleAsyncDataTree=k;function E(T){return typeof T=="boolean"?T?1:0:c.isFilterResult(T)?c.getVisibleState(T.visibility):c.getVisibleState(T)}}),define(Q[429],J([4,5]),function(q,e){return q.create("vs/base/common/actions",e)}),define(Q[48],J([0,1,429,2,6]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EmptySubmenuAction=e.SubmenuAction=e.Separator=e.ActionRunner=e.Action=void 0;class w extends N.Disposable{constructor(c,o="",s="",a=!0,u){super();this._onDidChange=this._register(new M.Emitter),this.onDidChange=this._onDidChange.event,this._enabled=!0,this._checked=!1,this._id=c,this._label=o,this._cssClass=s,this._enabled=a,this._actionCallback=u}get id(){return this._id}get label(){return this._label}set label(c){this._setLabel(c)}_setLabel(c){this._label!==c&&(this._label=c,this._onDidChange.fire({label:c}))}get tooltip(){return this._tooltip||""}set tooltip(c){this._setTooltip(c)}_setTooltip(c){this._tooltip!==c&&(this._tooltip=c,this._onDidChange.fire({tooltip:c}))}get class(){return this._cssClass}set class(c){this._setClass(c)}_setClass(c){this._cssClass!==c&&(this._cssClass=c,this._onDidChange.fire({class:c}))}get enabled(){return this._enabled}set enabled(c){this._setEnabled(c)}_setEnabled(c){this._enabled!==c&&(this._enabled=c,this._onDidChange.fire({enabled:c}))}get checked(){return this._checked}set checked(c){this._setChecked(c)}_setChecked(c){this._checked!==c&&(this._checked=c,this._onDidChange.fire({checked:c}))}run(c,o){return this._actionCallback?this._actionCallback(c):Promise.resolve(!0)}}e.Action=w;class S extends N.Disposable{constructor(){super(...arguments);this._onBeforeRun=this._register(new M.Emitter),this.onBeforeRun=this._onBeforeRun.event,this._onDidRun=this._register(new M.Emitter),this.onDidRun=this._onDidRun.event}run(c,o){return Ie(this,void 0,void 0,function*(){if(!c.enabled)return Promise.resolve(null);this._onBeforeRun.fire({action:c});try{const s=yield this.runAction(c,o);this._onDidRun.fire({action:c,result:s})}catch(s){this._onDidRun.fire({action:c,error:s})}})}runAction(c,o){const s=o?c.run(o):c.run();return Promise.resolve(s)}}e.ActionRunner=S;class C extends w{constructor(c){super(C.ID,c,c?"separator text":"separator");this.checked=!1,this.enabled=!1}}e.Separator=C,C.ID="vs.actions.separator";class d{constructor(c,o,s,a){this.tooltip="",this.enabled=!0,this.checked=!1,this.id=c,this.label=o,this.class=a,this._actions=s}dispose(){}get actions(){return this._actions}run(){return Ie(this,void 0,void 0,function*(){})}}e.SubmenuAction=d;class g extends w{constructor(){super(g.ID,b.localize(0,null),void 0,!1)}}e.EmptySubmenuAction=g,g.ID="vs.actions.empty"}),define(Q[112],J([0,1,17,418,2,48,20,60,149,35,7,203]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ActionViewItem=e.BaseActionViewItem=void 0;class c extends M.Disposable{constructor(a,u,r={}){super();this.options=r,this._context=a||this,this._action=u,u instanceof w.Action&&this._register(u.onDidChange(i=>{!this.element||this.handleActionChangeEvent(i)}))}handleActionChangeEvent(a){a.enabled!==void 0&&this.updateEnabled(),a.checked!==void 0&&this.updateChecked(),a.class!==void 0&&this.updateClass(),a.label!==void 0&&(this.updateLabel(),this.updateTooltip()),a.tooltip!==void 0&&this.updateTooltip()}get actionRunner(){return this._actionRunner||(this._actionRunner=this._register(new w.ActionRunner)),this._actionRunner}set actionRunner(a){this._actionRunner=a}getAction(){return this._action}isEnabled(){return this._action.enabled}setActionContext(a){this._context=a}render(a){const u=this.element=a;this._register(C.Gesture.addTarget(a));const r=this.options&&this.options.draggable;r&&(a.draggable=!0,g.isFirefox&&this._register(p.addDisposableListener(a,p.EventType.DRAG_START,i=>{var n;return(n=i.dataTransfer)===null||n===void 0?void 0:n.setData(d.DataTransfers.TEXT,this._action.label)}))),this._register(p.addDisposableListener(u,C.EventType.Tap,i=>this.onClick(i))),this._register(p.addDisposableListener(u,p.EventType.MOUSE_DOWN,i=>{r||p.EventHelper.stop(i,!0),this._action.enabled&&i.button===0&&u.classList.add("active")})),b.isMacintosh&&this._register(p.addDisposableListener(u,p.EventType.CONTEXT_MENU,i=>{i.button===0&&i.ctrlKey===!0&&this.onClick(i)})),this._register(p.addDisposableListener(u,p.EventType.CLICK,i=>{p.EventHelper.stop(i,!0),this.options&&this.options.isMenu||b.setImmediate(()=>this.onClick(i))})),this._register(p.addDisposableListener(u,p.EventType.DBLCLICK,i=>{p.EventHelper.stop(i,!0)})),[p.EventType.MOUSE_UP,p.EventType.MOUSE_OUT].forEach(i=>{this._register(p.addDisposableListener(u,i,n=>{p.EventHelper.stop(n),u.classList.remove("active")}))})}onClick(a){var u;p.EventHelper.stop(a,!0);const r=S.isUndefinedOrNull(this._context)?((u=this.options)===null||u===void 0?void 0:u.useEventAsContext)?a:void 0:this._context;this.actionRunner.run(this._action,r)}focus(){this.element&&(this.element.tabIndex=0,this.element.focus(),this.element.classList.add("focused"))}blur(){this.element&&(this.element.blur(),this.element.tabIndex=-1,this.element.classList.remove("focused"))}setFocusable(a){this.element&&(this.element.tabIndex=a?0:-1)}get trapsArrowNavigation(){return!1}updateEnabled(){}updateLabel(){}updateTooltip(){}updateClass(){}updateChecked(){}dispose(){this.element&&(this.element.remove(),this.element=void 0),super.dispose()}}e.BaseActionViewItem=c;class o extends c{constructor(a,u,r={}){super(a,u,r);this.options=r,this.options.icon=r.icon!==void 0?r.icon:!1,this.options.label=r.label!==void 0?r.label:!0,this.cssClass=""}render(a){super.render(a),this.element&&(this.label=p.append(this.element,p.$("a.action-label"))),this.label&&(this._action.id===w.Separator.ID?this.label.setAttribute("role","presentation"):this.options.isMenu?this.label.setAttribute("role","menuitem"):this.label.setAttribute("role","button")),this.options.label&&this.options.keybinding&&this.element&&(p.append(this.element,p.$("span.keybinding")).textContent=this.options.keybinding),this.updateClass(),this.updateLabel(),this.updateTooltip(),this.updateEnabled(),this.updateChecked()}focus(){this.label&&(this.label.tabIndex=0,this.label.focus())}blur(){this.label&&(this.label.tabIndex=-1)}setFocusable(a){this.label&&(this.label.tabIndex=a?0:-1)}updateLabel(){this.options.label&&this.label&&(this.label.textContent=this.getAction().label)}updateTooltip(){let a=null;this.getAction().tooltip?a=this.getAction().tooltip:!this.options.label&&this.getAction().label&&this.options.icon&&(a=this.getAction().label,this.options.keybinding&&(a=N.localize(0,null,a,this.options.keybinding))),a&&this.label&&(this.label.title=a)}updateClass(){this.cssClass&&this.label&&this.label.classList.remove(...this.cssClass.split(" ")),this.options.icon?(this.cssClass=this.getAction().class,this.label&&(this.label.classList.add("codicon"),this.cssClass&&this.label.classList.add(...this.cssClass.split(" "))),this.updateEnabled()):this.label&&this.label.classList.remove("codicon")}updateEnabled(){this.getAction().enabled?(this.label&&(this.label.removeAttribute("aria-disabled"),this.label.classList.remove("disabled")),this.element&&this.element.classList.remove("disabled")):(this.label&&(this.label.setAttribute("aria-disabled","true"),this.label.classList.add("disabled")),this.element&&this.element.classList.add("disabled"))}updateChecked(){this.label&&(this.getAction().checked?this.label.classList.add("checked"):this.label.classList.remove("checked"))}}e.ActionViewItem=o}),define(Q[83],J([0,1,2,48,7,20,56,6,112,203]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ActionBar=void 0;class g extends b.Disposable{constructor(c,o={}){var s,a,u,r,i,n;super();this.triggerKeyDown=!1,this.focusable=!0,this._onDidBlur=this._register(new C.Emitter),this.onDidBlur=this._onDidBlur.event,this._onDidCancel=this._register(new C.Emitter({onFirstListenerAdd:()=>this.cancelHasListener=!0})),this.onDidCancel=this._onDidCancel.event,this.cancelHasListener=!1,this._onDidRun=this._register(new C.Emitter),this.onDidRun=this._onDidRun.event,this._onBeforeRun=this._register(new C.Emitter),this.onBeforeRun=this._onBeforeRun.event,this.options=o,this._context=(s=o.context)!==null&&s!==void 0?s:null,this._orientation=(a=this.options.orientation)!==null&&a!==void 0?a:0,this._triggerKeys={keyDown:(r=(u=this.options.triggerKeys)===null||u===void 0?void 0:u.keyDown)!==null&&r!==void 0?r:!1,keys:(n=(i=this.options.triggerKeys)===null||i===void 0?void 0:i.keys)!==null&&n!==void 0?n:[3,10]},this.options.actionRunner?this._actionRunner=this.options.actionRunner:(this._actionRunner=new N.ActionRunner,this._register(this._actionRunner)),this._register(this._actionRunner.onDidRun(h=>this._onDidRun.fire(h))),this._register(this._actionRunner.onBeforeRun(h=>this._onBeforeRun.fire(h))),this._actionIds=[],this.viewItems=[],this.focusedItem=void 0,this.domNode=document.createElement("div"),this.domNode.className="monaco-action-bar",o.animated!==!1&&this.domNode.classList.add("animated");let t,l;switch(this._orientation){case 0:t=[15],l=[17];break;case 1:t=[17],l=[15],this.domNode.className+=" reverse";break;case 2:t=[16],l=[18],this.domNode.className+=" vertical";break;case 3:t=[18],l=[16],this.domNode.className+=" vertical reverse";break}this._register(M.addDisposableListener(this.domNode,M.EventType.KEY_DOWN,h=>{const m=new S.StandardKeyboardEvent(h);let _=!0;const f=typeof this.focusedItem=="number"?this.viewItems[this.focusedItem]:void 0;t&&(m.equals(t[0])||m.equals(t[1]))?_=this.focusPrevious():l&&(m.equals(l[0])||m.equals(l[1]))?_=this.focusNext():m.equals(9)&&this.cancelHasListener?this._onDidCancel.fire():m.equals(2)&&f instanceof d.BaseActionViewItem&&f.trapsArrowNavigation?this.focusNext():this.isTriggerKeyEvent(m)?this._triggerKeys.keyDown?this.doTrigger(m):this.triggerKeyDown=!0:_=!1,_&&(m.preventDefault(),m.stopPropagation())})),this._register(M.addDisposableListener(this.domNode,M.EventType.KEY_UP,h=>{const m=new S.StandardKeyboardEvent(h);this.isTriggerKeyEvent(m)?(!this._triggerKeys.keyDown&&this.triggerKeyDown&&(this.triggerKeyDown=!1,this.doTrigger(m)),m.preventDefault(),m.stopPropagation()):(m.equals(2)||m.equals(1024|2))&&this.updateFocusedItem()})),this.focusTracker=this._register(M.trackFocus(this.domNode)),this._register(this.focusTracker.onDidBlur(()=>{(M.getActiveElement()===this.domNode||!M.isAncestor(M.getActiveElement(),this.domNode))&&(this._onDidBlur.fire(),this.focusedItem=void 0,this.triggerKeyDown=!1)})),this._register(this.focusTracker.onDidFocus(()=>this.updateFocusedItem())),this.actionsList=document.createElement("ul"),this.actionsList.className="actions-container",this.actionsList.setAttribute("role","toolbar"),this.options.ariaLabel&&this.actionsList.setAttribute("aria-label",this.options.ariaLabel),this.domNode.appendChild(this.actionsList),c.appendChild(this.domNode)}isTriggerKeyEvent(c){let o=!1;return this._triggerKeys.keys.forEach(s=>{o=o||c.equals(s)}),o}updateFocusedItem(){for(let c=0;co.setActionContext(c))}get actionRunner(){return this._actionRunner}set actionRunner(c){c&&(this._actionRunner=c,this.viewItems.forEach(o=>o.actionRunner=c))}getContainer(){return this.domNode}push(c,o={}){const s=Array.isArray(c)?c:[c];let a=w.isNumber(o.index)?o.index:null;s.forEach(u=>{const r=document.createElement("li");r.className="action-item",r.setAttribute("role","presentation"),this.options.allowContextMenu||this._register(M.addDisposableListener(r,M.EventType.CONTEXT_MENU,n=>{M.EventHelper.stop(n,!0)}));let i;this.options.actionViewItemProvider&&(i=this.options.actionViewItemProvider(u)),i||(i=new d.ActionViewItem(this.context,u,o)),i.actionRunner=this._actionRunner,i.setActionContext(this.context),i.render(r),this.focusable&&i instanceof d.BaseActionViewItem&&this.viewItems.length===0&&i.setFocusable(!0),a===null||a<0||a>=this.actionsList.children.length?(this.actionsList.appendChild(r),this.viewItems.push(i),this._actionIds.push(u.id)):(this.actionsList.insertBefore(r,this.actionsList.children[a]),this.viewItems.splice(a,0,i),this._actionIds.splice(a,0,u.id),a++)}),typeof this.focusedItem=="number"&&this.focus(this.focusedItem)}clear(){b.dispose(this.viewItems),this.viewItems=[],this._actionIds=[],M.clearNode(this.actionsList)}focus(c){let o=!1,s;if(c===void 0?o=!0:typeof c=="number"?s=c:typeof c=="boolean"&&(o=c),o&&typeof this.focusedItem=="undefined"){const a=this.viewItems.findIndex(u=>u.isEnabled());this.focusedItem=a===-1?void 0:a,this.updateFocus()}else s!==void 0&&(this.focusedItem=s),this.updateFocus()}focusNext(){typeof this.focusedItem=="undefined"&&(this.focusedItem=this.viewItems.length-1);const c=this.focusedItem;let o;do{if(this.options.preventLoopNavigation&&this.focusedItem+1>=this.viewItems.length)return this.focusedItem=c,!1;this.focusedItem=(this.focusedItem+1)%this.viewItems.length,o=this.viewItems[this.focusedItem]}while(this.focusedItem!==c&&this.options.focusOnlyEnabledItems&&!o.isEnabled());return this.updateFocus(),!0}focusPrevious(){typeof this.focusedItem=="undefined"&&(this.focusedItem=0);const c=this.focusedItem;let o;do{if(this.focusedItem=this.focusedItem-1,this.focusedItem<0){if(this.options.preventLoopNavigation)return this.focusedItem=c,!1;this.focusedItem=this.viewItems.length-1}o=this.viewItems[this.focusedItem]}while(this.focusedItem!==c&&this.options.focusOnlyEnabledItems&&!o.isEnabled());return this.updateFocus(!0),!0}updateFocus(c,o){typeof this.focusedItem=="undefined"&&this.actionsList.focus({preventScroll:o});for(let s=0;s(a.textContent=c.label||"",null));for(const a of[M.EventType.CLICK,M.EventType.MOUSE_DOWN,b.EventType.Tap])this._register(M.addDisposableListener(this.element,a,u=>M.EventHelper.stop(u,!0)));for(const a of[M.EventType.MOUSE_DOWN,b.EventType.Tap])this._register(M.addDisposableListener(this._label,a,u=>{u instanceof MouseEvent&&u.detail>1||(this.visible?this.hide():this.show())}));this._register(M.addDisposableListener(this._label,M.EventType.KEY_UP,a=>{const u=new w.StandardKeyboardEvent(a);(u.equals(3)||u.equals(10))&&(M.EventHelper.stop(a,!0),this.visible?this.hide():this.show())}));const s=o(this._label);s&&this._register(s),this._register(b.Gesture.addTarget(this._label))}get element(){return this._element}show(){this.visible||(this.visible=!0,this._onDidChangeVisibility.fire(!0))}hide(){this.visible&&(this.visible=!1,this._onDidChangeVisibility.fire(!1))}dispose(){super.dispose(),this.hide(),this.boxContainer&&(this.boxContainer.remove(),this.boxContainer=void 0),this.contents&&(this.contents.remove(),this.contents=void 0),this._label&&(this._label.remove(),this._label=void 0)}}e.BaseDropdown=C;class d extends C{constructor(p,c){super(p,c);this._actions=[],this._contextMenuProvider=c.contextMenuProvider,this.actions=c.actions||[],this.actionProvider=c.actionProvider,this.menuClassName=c.menuClassName||"",this.menuAsChild=!!c.menuAsChild}set menuOptions(p){this._menuOptions=p}get menuOptions(){return this._menuOptions}get actions(){return this.actionProvider?this.actionProvider.getActions():this._actions}set actions(p){this._actions=p}show(){super.show(),this.element.classList.add("active"),this._contextMenuProvider.showContextMenu({getAnchor:()=>this.element,getActions:()=>this.actions,getActionsContext:()=>this.menuOptions?this.menuOptions.context:null,getActionViewItem:p=>this.menuOptions&&this.menuOptions.actionViewItemProvider?this.menuOptions.actionViewItemProvider(p):void 0,getKeyBinding:p=>this.menuOptions&&this.menuOptions.getKeyBinding?this.menuOptions.getKeyBinding(p):void 0,getMenuClassName:()=>this.menuClassName,onHide:()=>this.onHide(),actionRunner:this.menuOptions?this.menuOptions.actionRunner:void 0,anchorAlignment:this.menuOptions?this.menuOptions.anchorAlignment:0,domForShadowRoot:this.menuAsChild?this.element:void 0})}hide(){super.hide()}onHide(){this.hide(),this.element.classList.remove("active")}}e.DropdownMenu=d}),define(Q[431],J([0,1,7,6,112,430,206]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DropdownMenuActionViewItem=void 0;class S extends M.BaseActionViewItem{constructor(d,g,p,c={}){super(null,d,c);this.options=c,this.actionItem=null,this._onDidChangeVisibility=this._register(new N.Emitter),this.menuActionsOrProvider=g,this.contextMenuProvider=p,this.options.actionRunner&&(this.actionRunner=this.options.actionRunner)}render(d){this.actionItem=d;const g=o=>{this.element=b.append(o,b.$("a.action-label"));let s=[];return typeof this.options.classNames=="string"?s=this.options.classNames.split(/\s+/g).filter(a=>!!a):this.options.classNames&&(s=this.options.classNames),s.find(a=>a==="icon")||s.push("codicon"),this.element.classList.add(...s),this.element.setAttribute("role","button"),this.element.setAttribute("aria-haspopup","true"),this.element.setAttribute("aria-expanded","false"),this.element.title=this._action.label||"",null},p=Array.isArray(this.menuActionsOrProvider),c={contextMenuProvider:this.contextMenuProvider,labelRenderer:g,menuAsChild:this.options.menuAsChild,actions:p?this.menuActionsOrProvider:void 0,actionProvider:p?void 0:this.menuActionsOrProvider};if(this.dropdownMenu=this._register(new w.DropdownMenu(d,c)),this._register(this.dropdownMenu.onDidChangeVisibility(o=>{var s;(s=this.element)===null||s===void 0||s.setAttribute("aria-expanded",`${o}`),this._onDidChangeVisibility.fire(o)})),this.dropdownMenu.menuOptions={actionViewItemProvider:this.options.actionViewItemProvider,actionRunner:this.actionRunner,getKeyBinding:this.options.keybindingProvider,context:this._context},this.options.anchorAlignmentProvider){const o=this;this.dropdownMenu.menuOptions=Object.assign(Object.assign({},this.dropdownMenu.menuOptions),{get anchorAlignment(){return o.options.anchorAlignmentProvider()}})}this.updateEnabled()}setActionContext(d){super.setActionContext(d),this.dropdownMenu&&(this.dropdownMenu.menuOptions?this.dropdownMenu.menuOptions.context=d:this.dropdownMenu.menuOptions={context:d})}updateEnabled(){var d,g;const p=!this.getAction().enabled;(d=this.actionItem)===null||d===void 0||d.classList.toggle("disabled",p),(g=this.element)===null||g===void 0||g.classList.toggle("disabled",p)}}e.DropdownMenuActionViewItem=S}),define(Q[177],J([0,1,423,7,156,47,83,6,52,29,40,279,61,55,305]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HistoryInputBox=e.InputBox=void 0;const a=N.$,u={inputBackground:g.Color.fromHex("#3C3C3C"),inputForeground:g.Color.fromHex("#CCCCCC"),inputValidationInfoBorder:g.Color.fromHex("#55AAFF"),inputValidationInfoBackground:g.Color.fromHex("#063B49"),inputValidationWarningBorder:g.Color.fromHex("#B89500"),inputValidationWarningBackground:g.Color.fromHex("#352A05"),inputValidationErrorBorder:g.Color.fromHex("#BE1100"),inputValidationErrorBackground:g.Color.fromHex("#5A1D1D")};class r extends d.Widget{constructor(t,l,h){super();this.state="idle",this.maxHeight=Number.POSITIVE_INFINITY,this._onDidChange=this._register(new C.Emitter),this.onDidChange=this._onDidChange.event,this._onDidHeightChange=this._register(new C.Emitter),this.onDidHeightChange=this._onDidHeightChange.event,this.contextViewProvider=l,this.options=h||Object.create(null),p.mixin(this.options,u,!1),this.message=null,this.placeholder=this.options.placeholder||"",this.ariaLabel=this.options.ariaLabel||"",this.inputBackground=this.options.inputBackground,this.inputForeground=this.options.inputForeground,this.inputBorder=this.options.inputBorder,this.inputValidationInfoBorder=this.options.inputValidationInfoBorder,this.inputValidationInfoBackground=this.options.inputValidationInfoBackground,this.inputValidationInfoForeground=this.options.inputValidationInfoForeground,this.inputValidationWarningBorder=this.options.inputValidationWarningBorder,this.inputValidationWarningBackground=this.options.inputValidationWarningBackground,this.inputValidationWarningForeground=this.options.inputValidationWarningForeground,this.inputValidationErrorBorder=this.options.inputValidationErrorBorder,this.inputValidationErrorBackground=this.options.inputValidationErrorBackground,this.inputValidationErrorForeground=this.options.inputValidationErrorForeground,this.options.validationOptions&&(this.validation=this.options.validationOptions.validation),this.element=N.append(t,a(".monaco-inputbox.idle"));let m=this.options.flexibleHeight?"textarea":"input",_=N.append(this.element,a(".ibwrapper"));if(this.input=N.append(_,a(m+".input.empty")),this.input.setAttribute("autocorrect","off"),this.input.setAttribute("autocapitalize","off"),this.input.setAttribute("spellcheck","false"),this.onfocus(this.input,()=>this.element.classList.add("synthetic-focus")),this.onblur(this.input,()=>this.element.classList.remove("synthetic-focus")),this.options.flexibleHeight){this.maxHeight=typeof this.options.flexibleMaxHeight=="number"?this.options.flexibleMaxHeight:Number.POSITIVE_INFINITY,this.mirror=N.append(_,a("div.mirror")),this.mirror.innerText="\xA0",this.scrollableElement=new o.ScrollableElement(this.element,{vertical:1}),this.options.flexibleWidth&&(this.input.setAttribute("wrap","off"),this.mirror.style.whiteSpace="pre",this.mirror.style.wordWrap="initial"),N.append(t,this.scrollableElement.getDomNode()),this._register(this.scrollableElement),this._register(this.scrollableElement.onScroll(v=>this.input.scrollTop=v.scrollTop));const f=C.Event.filter(s.domEvent(document,"selectionchange"),()=>{const v=document.getSelection();return(v==null?void 0:v.anchorNode)===_});this._register(f(this.updateScrollDimensions,this)),this._register(this.onDidHeightChange(this.updateScrollDimensions,this))}else this.input.type=this.options.type||"text",this.input.setAttribute("wrap","off");this.ariaLabel&&this.input.setAttribute("aria-label",this.ariaLabel),this.placeholder&&this.setPlaceHolder(this.placeholder),this.oninput(this.input,()=>this.onValueChange()),this.onblur(this.input,()=>this.onBlur()),this.onfocus(this.input,()=>this.onFocus()),this.ignoreGesture(this.input),setTimeout(()=>this.updateMirror(),0),this.options.actions&&(this.actionbar=this._register(new S.ActionBar(this.element)),this.actionbar.push(this.options.actions,{icon:!0,label:!1})),this.applyStyles()}onBlur(){this._hideMessage()}onFocus(){this._showMessage()}setPlaceHolder(t){this.placeholder=t,this.input.setAttribute("placeholder",t),this.input.title=t}setAriaLabel(t){this.ariaLabel=t,t?this.input.setAttribute("aria-label",this.ariaLabel):this.input.removeAttribute("aria-label")}getAriaLabel(){return this.ariaLabel}get inputElement(){return this.input}get value(){return this.input.value}set value(t){this.input.value!==t&&(this.input.value=t,this.onValueChange())}get height(){return typeof this.cachedHeight=="number"?this.cachedHeight:N.getTotalHeight(this.element)}focus(){this.input.focus()}blur(){this.input.blur()}hasFocus(){return document.activeElement===this.input}select(t=null){this.input.select(),t&&(this.input.setSelectionRange(t.start,t.end),t.end===this.input.value.length&&(this.input.scrollLeft=this.input.scrollWidth))}isSelectionAtEnd(){return this.input.selectionEnd===this.input.value.length&&this.input.selectionStart===this.input.selectionEnd}enable(){this.input.removeAttribute("disabled")}disable(){this.blur(),this.input.disabled=!0,this._hideMessage()}get width(){return N.getTotalWidth(this.input)}set width(t){if(this.options.flexibleHeight&&this.options.flexibleWidth){let l=0;if(this.mirror){const h=parseFloat(this.mirror.style.paddingLeft||"")||0,m=parseFloat(this.mirror.style.paddingRight||"")||0;l=h+m}this.input.style.width=t-l+"px"}else this.input.style.width=t+"px";this.mirror&&(this.mirror.style.width=t+"px")}set paddingRight(t){this.options.flexibleHeight&&this.options.flexibleWidth?this.input.style.width=`calc(100% - ${t}px)`:this.input.style.paddingRight=t+"px",this.mirror&&(this.mirror.style.paddingRight=t+"px")}updateScrollDimensions(){if(!(typeof this.cachedContentHeight!="number"||typeof this.cachedHeight!="number"||!this.scrollableElement)){const t=this.cachedContentHeight,l=this.cachedHeight,h=this.input.scrollTop;this.scrollableElement.setScrollDimensions({scrollHeight:t,height:l}),this.scrollableElement.setScrollPosition({scrollTop:h})}}showMessage(t,l){this.message=t,this.element.classList.remove("idle"),this.element.classList.remove("info"),this.element.classList.remove("warning"),this.element.classList.remove("error"),this.element.classList.add(this.classForType(t.type));const h=this.stylesForType(this.message.type);this.element.style.border=h.border?`1px solid ${h.border}`:"",(this.hasFocus()||l)&&this._showMessage()}hideMessage(){this.message=null,this.element.classList.remove("info"),this.element.classList.remove("warning"),this.element.classList.remove("error"),this.element.classList.add("idle"),this._hideMessage(),this.applyStyles()}validate(){let t=null;return this.validation&&(t=this.validation(this.value),t?(this.inputElement.setAttribute("aria-invalid","true"),this.showMessage(t)):this.inputElement.hasAttribute("aria-invalid")&&(this.inputElement.removeAttribute("aria-invalid"),this.hideMessage())),t==null?void 0:t.type}stylesForType(t){switch(t){case 1:return{border:this.inputValidationInfoBorder,background:this.inputValidationInfoBackground,foreground:this.inputValidationInfoForeground};case 2:return{border:this.inputValidationWarningBorder,background:this.inputValidationWarningBackground,foreground:this.inputValidationWarningForeground};default:return{border:this.inputValidationErrorBorder,background:this.inputValidationErrorBackground,foreground:this.inputValidationErrorForeground}}}classForType(t){switch(t){case 1:return"info";case 2:return"warning";default:return"error"}}_showMessage(){if(!(!this.contextViewProvider||!this.message)){let t,l=()=>t.style.width=N.getTotalWidth(this.element)+"px";this.contextViewProvider.showContextView({getAnchor:()=>this.element,anchorAlignment:1,render:m=>{if(!this.message)return null;t=N.append(m,a(".monaco-inputbox-container")),l();const _={inline:!0,className:"monaco-inputbox-message"},f=this.message.formatContent?M.renderFormattedText(this.message.content,_):M.renderText(this.message.content,_);f.classList.add(this.classForType(this.message.type));const v=this.stylesForType(this.message.type);return f.style.backgroundColor=v.background?v.background.toString():"",f.style.color=v.foreground?v.foreground.toString():"",f.style.border=v.border?`1px solid ${v.border}`:"",N.append(t,f),null},onHide:()=>{this.state="closed"},layout:l});let h;this.message.type===3?h=b.localize(0,null,this.message.content):this.message.type===2?h=b.localize(1,null,this.message.content):h=b.localize(2,null,this.message.content),w.alert(h),this.state="open"}}_hideMessage(){!this.contextViewProvider||(this.state==="open"&&this.contextViewProvider.hideContextView(),this.state="idle")}onValueChange(){this._onDidChange.fire(this.value),this.validate(),this.updateMirror(),this.input.classList.toggle("empty",!this.value),this.state==="open"&&this.contextViewProvider&&this.contextViewProvider.layout()}updateMirror(){if(!!this.mirror){const t=this.value,h=t.charCodeAt(t.length-1)===10?" ":"";t+h?this.mirror.textContent=t+h:this.mirror.innerText="\xA0",this.layout()}}style(t){this.inputBackground=t.inputBackground,this.inputForeground=t.inputForeground,this.inputBorder=t.inputBorder,this.inputValidationInfoBackground=t.inputValidationInfoBackground,this.inputValidationInfoForeground=t.inputValidationInfoForeground,this.inputValidationInfoBorder=t.inputValidationInfoBorder,this.inputValidationWarningBackground=t.inputValidationWarningBackground,this.inputValidationWarningForeground=t.inputValidationWarningForeground,this.inputValidationWarningBorder=t.inputValidationWarningBorder,this.inputValidationErrorBackground=t.inputValidationErrorBackground,this.inputValidationErrorForeground=t.inputValidationErrorForeground,this.inputValidationErrorBorder=t.inputValidationErrorBorder,this.applyStyles()}applyStyles(){const t=this.inputBackground?this.inputBackground.toString():"",l=this.inputForeground?this.inputForeground.toString():"",h=this.inputBorder?this.inputBorder.toString():"";this.element.style.backgroundColor=t,this.element.style.color=l,this.input.style.backgroundColor="inherit",this.input.style.color=l,this.element.style.borderWidth=h?"1px":"",this.element.style.borderStyle=h?"solid":"",this.element.style.borderColor=h}layout(){if(!!this.mirror){const t=this.cachedContentHeight;this.cachedContentHeight=N.getTotalHeight(this.mirror),t!==this.cachedContentHeight&&(this.cachedHeight=Math.min(this.cachedContentHeight,this.maxHeight),this.input.style.height=this.cachedHeight+"px",this._onDidHeightChange.fire(this.cachedContentHeight))}}insertAtCursor(t){const l=this.inputElement,h=l.selectionStart,m=l.selectionEnd,_=l.value;h!==null&&m!==null&&(this.value=_.substr(0,h)+t+_.substr(m),l.setSelectionRange(h+1,h+1),this.layout())}dispose(){this._hideMessage(),this.message=null,this.actionbar&&this.actionbar.dispose(),super.dispose()}}e.InputBox=r;class i extends r{constructor(t,l,h){super(t,l,h);this.history=new c.HistoryNavigator(h.history,100)}addToHistory(){this.value&&this.value!==this.getCurrentValue()&&this.history.add(this.value)}showNextValue(){this.history.has(this.value)||this.addToHistory();let t=this.getNextValue();t&&(t=t===this.value?this.getNextValue():t),t&&(this.value=t,w.status(this.value))}showPreviousValue(){this.history.has(this.value)||this.addToHistory();let t=this.getPreviousValue();t&&(t=t===this.value?this.getPreviousValue():t),t&&(this.value=t,w.status(this.value))}getCurrentValue(){let t=this.history.current();return t||(t=this.history.last(),this.history.next()),t}getPreviousValue(){return this.history.previous()||this.history.first()}getNextValue(){return this.history.next()||this.history.last()}}e.HistoryInputBox=i}),define(Q[432],J([0,1,419,7,177,52,6,233,207]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindInput=void 0;const d=b.localize(0,null);class g extends w.Widget{constructor(c,o,s,a){super();this._showOptionButtons=s,this.fixFocusOnOptionClickEnabled=!0,this._onDidOptionChange=this._register(new S.Emitter),this.onDidOptionChange=this._onDidOptionChange.event,this._onKeyDown=this._register(new S.Emitter),this.onKeyDown=this._onKeyDown.event,this._onMouseDown=this._register(new S.Emitter),this.onMouseDown=this._onMouseDown.event,this._onInput=this._register(new S.Emitter),this._onKeyUp=this._register(new S.Emitter),this._onCaseSensitiveKeyDown=this._register(new S.Emitter),this.onCaseSensitiveKeyDown=this._onCaseSensitiveKeyDown.event,this._onRegexKeyDown=this._register(new S.Emitter),this.onRegexKeyDown=this._onRegexKeyDown.event,this._lastHighlightFindOptions=0,this.contextViewProvider=o,this.placeholder=a.placeholder||"",this.validation=a.validation,this.label=a.label||d,this.inputActiveOptionBorder=a.inputActiveOptionBorder,this.inputActiveOptionForeground=a.inputActiveOptionForeground,this.inputActiveOptionBackground=a.inputActiveOptionBackground,this.inputBackground=a.inputBackground,this.inputForeground=a.inputForeground,this.inputBorder=a.inputBorder,this.inputValidationInfoBorder=a.inputValidationInfoBorder,this.inputValidationInfoBackground=a.inputValidationInfoBackground,this.inputValidationInfoForeground=a.inputValidationInfoForeground,this.inputValidationWarningBorder=a.inputValidationWarningBorder,this.inputValidationWarningBackground=a.inputValidationWarningBackground,this.inputValidationWarningForeground=a.inputValidationWarningForeground,this.inputValidationErrorBorder=a.inputValidationErrorBorder,this.inputValidationErrorBackground=a.inputValidationErrorBackground,this.inputValidationErrorForeground=a.inputValidationErrorForeground;const u=a.appendCaseSensitiveLabel||"",r=a.appendWholeWordsLabel||"",i=a.appendRegexLabel||"",n=a.history||[],t=!!a.flexibleHeight,l=!!a.flexibleWidth,h=a.flexibleMaxHeight;this.domNode=document.createElement("div"),this.domNode.classList.add("monaco-findInput"),this.inputBox=this._register(new M.HistoryInputBox(this.domNode,this.contextViewProvider,{placeholder:this.placeholder||"",ariaLabel:this.label||"",validationOptions:{validation:this.validation},inputBackground:this.inputBackground,inputForeground:this.inputForeground,inputBorder:this.inputBorder,inputValidationInfoBackground:this.inputValidationInfoBackground,inputValidationInfoForeground:this.inputValidationInfoForeground,inputValidationInfoBorder:this.inputValidationInfoBorder,inputValidationWarningBackground:this.inputValidationWarningBackground,inputValidationWarningForeground:this.inputValidationWarningForeground,inputValidationWarningBorder:this.inputValidationWarningBorder,inputValidationErrorBackground:this.inputValidationErrorBackground,inputValidationErrorForeground:this.inputValidationErrorForeground,inputValidationErrorBorder:this.inputValidationErrorBorder,history:n,flexibleHeight:t,flexibleWidth:l,flexibleMaxHeight:h})),this.regex=this._register(new C.RegexCheckbox({appendTitle:i,isChecked:!1,inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground})),this._register(this.regex.onChange(f=>{this._onDidOptionChange.fire(f),!f&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.regex.onKeyDown(f=>{this._onRegexKeyDown.fire(f)})),this.wholeWords=this._register(new C.WholeWordsCheckbox({appendTitle:r,isChecked:!1,inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground})),this._register(this.wholeWords.onChange(f=>{this._onDidOptionChange.fire(f),!f&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this.caseSensitive=this._register(new C.CaseSensitiveCheckbox({appendTitle:u,isChecked:!1,inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground})),this._register(this.caseSensitive.onChange(f=>{this._onDidOptionChange.fire(f),!f&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.caseSensitive.onKeyDown(f=>{this._onCaseSensitiveKeyDown.fire(f)})),this._showOptionButtons&&(this.inputBox.paddingRight=this.caseSensitive.width()+this.wholeWords.width()+this.regex.width());let m=[this.caseSensitive.domNode,this.wholeWords.domNode,this.regex.domNode];this.onkeydown(this.domNode,f=>{if(f.equals(15)||f.equals(17)||f.equals(9)){let v=m.indexOf(document.activeElement);if(v>=0){let y=-1;f.equals(17)?y=(v+1)%m.length:f.equals(15)&&(v===0?y=m.length-1:y=v-1),f.equals(9)?(m[v].blur(),this.inputBox.focus()):y>=0&&m[y].focus(),N.EventHelper.stop(f,!0)}}});let _=document.createElement("div");_.className="controls",_.style.display=this._showOptionButtons?"block":"none",_.appendChild(this.caseSensitive.domNode),_.appendChild(this.wholeWords.domNode),_.appendChild(this.regex.domNode),this.domNode.appendChild(_),c&&c.appendChild(this.domNode),this.onkeydown(this.inputBox.inputElement,f=>this._onKeyDown.fire(f)),this.onkeyup(this.inputBox.inputElement,f=>this._onKeyUp.fire(f)),this.oninput(this.inputBox.inputElement,f=>this._onInput.fire()),this.onmousedown(this.inputBox.inputElement,f=>this._onMouseDown.fire(f))}enable(){this.domNode.classList.remove("disabled"),this.inputBox.enable(),this.regex.enable(),this.wholeWords.enable(),this.caseSensitive.enable()}disable(){this.domNode.classList.add("disabled"),this.inputBox.disable(),this.regex.disable(),this.wholeWords.disable(),this.caseSensitive.disable()}setFocusInputOnOptionClick(c){this.fixFocusOnOptionClickEnabled=c}setEnabled(c){c?this.enable():this.disable()}getValue(){return this.inputBox.value}setValue(c){this.inputBox.value!==c&&(this.inputBox.value=c)}style(c){this.inputActiveOptionBorder=c.inputActiveOptionBorder,this.inputActiveOptionForeground=c.inputActiveOptionForeground,this.inputActiveOptionBackground=c.inputActiveOptionBackground,this.inputBackground=c.inputBackground,this.inputForeground=c.inputForeground,this.inputBorder=c.inputBorder,this.inputValidationInfoBackground=c.inputValidationInfoBackground,this.inputValidationInfoForeground=c.inputValidationInfoForeground,this.inputValidationInfoBorder=c.inputValidationInfoBorder,this.inputValidationWarningBackground=c.inputValidationWarningBackground,this.inputValidationWarningForeground=c.inputValidationWarningForeground,this.inputValidationWarningBorder=c.inputValidationWarningBorder,this.inputValidationErrorBackground=c.inputValidationErrorBackground,this.inputValidationErrorForeground=c.inputValidationErrorForeground,this.inputValidationErrorBorder=c.inputValidationErrorBorder,this.applyStyles()}applyStyles(){if(this.domNode){const c={inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground};this.regex.style(c),this.wholeWords.style(c),this.caseSensitive.style(c);const o={inputBackground:this.inputBackground,inputForeground:this.inputForeground,inputBorder:this.inputBorder,inputValidationInfoBackground:this.inputValidationInfoBackground,inputValidationInfoForeground:this.inputValidationInfoForeground,inputValidationInfoBorder:this.inputValidationInfoBorder,inputValidationWarningBackground:this.inputValidationWarningBackground,inputValidationWarningForeground:this.inputValidationWarningForeground,inputValidationWarningBorder:this.inputValidationWarningBorder,inputValidationErrorBackground:this.inputValidationErrorBackground,inputValidationErrorForeground:this.inputValidationErrorForeground,inputValidationErrorBorder:this.inputValidationErrorBorder};this.inputBox.style(o)}}select(){this.inputBox.select()}focus(){this.inputBox.focus()}getCaseSensitive(){return this.caseSensitive.checked}setCaseSensitive(c){this.caseSensitive.checked=c}getWholeWords(){return this.wholeWords.checked}setWholeWords(c){this.wholeWords.checked=c}getRegex(){return this.regex.checked}setRegex(c){this.regex.checked=c,this.validate()}focusOnCaseSensitive(){this.caseSensitive.focus()}highlightFindOptions(){this.domNode.classList.remove("highlight-"+this._lastHighlightFindOptions),this._lastHighlightFindOptions=1-this._lastHighlightFindOptions,this.domNode.classList.add("highlight-"+this._lastHighlightFindOptions)}validate(){this.inputBox.validate()}clearMessage(){this.inputBox.hideMessage()}}e.FindInput=g}),define(Q[433],J([0,1,421,7,177,52,6,160,27,207]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReplaceInput=e.PreserveCaseCheckbox=void 0;const g=b.localize(0,null),p=b.localize(1,null);class c extends C.Checkbox{constructor(a){super({icon:d.Codicon.preserveCase,title:p+a.appendTitle,isChecked:a.isChecked,inputActiveOptionBorder:a.inputActiveOptionBorder,inputActiveOptionForeground:a.inputActiveOptionForeground,inputActiveOptionBackground:a.inputActiveOptionBackground})}}e.PreserveCaseCheckbox=c;class o extends w.Widget{constructor(a,u,r,i){super();this._showOptionButtons=r,this.fixFocusOnOptionClickEnabled=!0,this.cachedOptionsWidth=0,this._onDidOptionChange=this._register(new S.Emitter),this.onDidOptionChange=this._onDidOptionChange.event,this._onKeyDown=this._register(new S.Emitter),this.onKeyDown=this._onKeyDown.event,this._onMouseDown=this._register(new S.Emitter),this._onInput=this._register(new S.Emitter),this._onKeyUp=this._register(new S.Emitter),this._onPreserveCaseKeyDown=this._register(new S.Emitter),this.onPreserveCaseKeyDown=this._onPreserveCaseKeyDown.event,this.contextViewProvider=u,this.placeholder=i.placeholder||"",this.validation=i.validation,this.label=i.label||g,this.inputActiveOptionBorder=i.inputActiveOptionBorder,this.inputActiveOptionForeground=i.inputActiveOptionForeground,this.inputActiveOptionBackground=i.inputActiveOptionBackground,this.inputBackground=i.inputBackground,this.inputForeground=i.inputForeground,this.inputBorder=i.inputBorder,this.inputValidationInfoBorder=i.inputValidationInfoBorder,this.inputValidationInfoBackground=i.inputValidationInfoBackground,this.inputValidationInfoForeground=i.inputValidationInfoForeground,this.inputValidationWarningBorder=i.inputValidationWarningBorder,this.inputValidationWarningBackground=i.inputValidationWarningBackground,this.inputValidationWarningForeground=i.inputValidationWarningForeground,this.inputValidationErrorBorder=i.inputValidationErrorBorder,this.inputValidationErrorBackground=i.inputValidationErrorBackground,this.inputValidationErrorForeground=i.inputValidationErrorForeground;const n=i.appendPreserveCaseLabel||"",t=i.history||[],l=!!i.flexibleHeight,h=!!i.flexibleWidth,m=i.flexibleMaxHeight;this.domNode=document.createElement("div"),this.domNode.classList.add("monaco-findInput"),this.inputBox=this._register(new M.HistoryInputBox(this.domNode,this.contextViewProvider,{ariaLabel:this.label||"",placeholder:this.placeholder||"",validationOptions:{validation:this.validation},inputBackground:this.inputBackground,inputForeground:this.inputForeground,inputBorder:this.inputBorder,inputValidationInfoBackground:this.inputValidationInfoBackground,inputValidationInfoForeground:this.inputValidationInfoForeground,inputValidationInfoBorder:this.inputValidationInfoBorder,inputValidationWarningBackground:this.inputValidationWarningBackground,inputValidationWarningForeground:this.inputValidationWarningForeground,inputValidationWarningBorder:this.inputValidationWarningBorder,inputValidationErrorBackground:this.inputValidationErrorBackground,inputValidationErrorForeground:this.inputValidationErrorForeground,inputValidationErrorBorder:this.inputValidationErrorBorder,history:t,flexibleHeight:l,flexibleWidth:h,flexibleMaxHeight:m})),this.preserveCase=this._register(new c({appendTitle:n,isChecked:!1,inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground})),this._register(this.preserveCase.onChange(v=>{this._onDidOptionChange.fire(v),!v&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.preserveCase.onKeyDown(v=>{this._onPreserveCaseKeyDown.fire(v)})),this._showOptionButtons?this.cachedOptionsWidth=this.preserveCase.width():this.cachedOptionsWidth=0;let _=[this.preserveCase.domNode];this.onkeydown(this.domNode,v=>{if(v.equals(15)||v.equals(17)||v.equals(9)){let y=_.indexOf(document.activeElement);if(y>=0){let L=-1;v.equals(17)?L=(y+1)%_.length:v.equals(15)&&(y===0?L=_.length-1:L=y-1),v.equals(9)?(_[y].blur(),this.inputBox.focus()):L>=0&&_[L].focus(),N.EventHelper.stop(v,!0)}}});let f=document.createElement("div");f.className="controls",f.style.display=this._showOptionButtons?"block":"none",f.appendChild(this.preserveCase.domNode),this.domNode.appendChild(f),a&&a.appendChild(this.domNode),this.onkeydown(this.inputBox.inputElement,v=>this._onKeyDown.fire(v)),this.onkeyup(this.inputBox.inputElement,v=>this._onKeyUp.fire(v)),this.oninput(this.inputBox.inputElement,v=>this._onInput.fire()),this.onmousedown(this.inputBox.inputElement,v=>this._onMouseDown.fire(v))}enable(){this.domNode.classList.remove("disabled"),this.inputBox.enable(),this.preserveCase.enable()}disable(){this.domNode.classList.add("disabled"),this.inputBox.disable(),this.preserveCase.disable()}setEnabled(a){a?this.enable():this.disable()}style(a){this.inputActiveOptionBorder=a.inputActiveOptionBorder,this.inputActiveOptionForeground=a.inputActiveOptionForeground,this.inputActiveOptionBackground=a.inputActiveOptionBackground,this.inputBackground=a.inputBackground,this.inputForeground=a.inputForeground,this.inputBorder=a.inputBorder,this.inputValidationInfoBackground=a.inputValidationInfoBackground,this.inputValidationInfoForeground=a.inputValidationInfoForeground,this.inputValidationInfoBorder=a.inputValidationInfoBorder,this.inputValidationWarningBackground=a.inputValidationWarningBackground,this.inputValidationWarningForeground=a.inputValidationWarningForeground,this.inputValidationWarningBorder=a.inputValidationWarningBorder,this.inputValidationErrorBackground=a.inputValidationErrorBackground,this.inputValidationErrorForeground=a.inputValidationErrorForeground,this.inputValidationErrorBorder=a.inputValidationErrorBorder,this.applyStyles()}applyStyles(){if(this.domNode){const a={inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground};this.preserveCase.style(a);const u={inputBackground:this.inputBackground,inputForeground:this.inputForeground,inputBorder:this.inputBorder,inputValidationInfoBackground:this.inputValidationInfoBackground,inputValidationInfoForeground:this.inputValidationInfoForeground,inputValidationInfoBorder:this.inputValidationInfoBorder,inputValidationWarningBackground:this.inputValidationWarningBackground,inputValidationWarningForeground:this.inputValidationWarningForeground,inputValidationWarningBorder:this.inputValidationWarningBorder,inputValidationErrorBackground:this.inputValidationErrorBackground,inputValidationErrorForeground:this.inputValidationErrorForeground,inputValidationErrorBorder:this.inputValidationErrorBorder};this.inputBox.style(u)}}select(){this.inputBox.select()}focus(){this.inputBox.focus()}getPreserveCase(){return this.preserveCase.checked}setPreserveCase(a){this.preserveCase.checked=a}focusOnPreserve(){this.preserveCase.focus()}validate(){this.inputBox&&this.inputBox.validate()}set width(a){this.inputBox.paddingRight=this.cachedOptionsWidth,this.inputBox.width=a,this.domNode.style.width=a+"px"}dispose(){super.dispose()}}e.ReplaceInput=o}),define(Q[434],J([0,1,425,8,48,83,7,56,15,2,61,204,17,27,112,123,35,50,102]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.cleanMnemonic=e.Menu=e.Direction=e.MENU_ESCAPED_MNEMONIC_REGEX=e.MENU_MNEMONIC_REGEX=void 0,e.MENU_MNEMONIC_REGEX=/\(&([^\s&])\)|(^|[^&])&([^\s&])/,e.MENU_ESCAPED_MNEMONIC_REGEX=/(&)?(&)([^\s&])/g;const t=s.registerCodicon("menu-selection",s.Codicon.check),l=s.registerCodicon("menu-submenu",s.Codicon.chevronRight);var h;(function(I){I[I.Right=0]="Right",I[I.Left=1]="Left"})(h=e.Direction||(e.Direction={}));class m extends w.ActionBar{constructor(k,E,T={}){k.classList.add("monaco-menu-container"),k.setAttribute("role","presentation");const O=document.createElement("div");O.classList.add("monaco-menu"),O.setAttribute("role","presentation"),super(O,{orientation:2,actionViewItemProvider:F=>this.doGetActionViewItem(F,T,A),context:T.context,actionRunner:T.actionRunner,ariaLabel:T.ariaLabel,focusOnlyEnabledItems:!0,triggerKeys:{keys:[3,...o.isMacintosh||o.isLinux?[10]:[]],keyDown:!0}}),this.menuElement=O,this.actionsList.setAttribute("role","menu"),this.actionsList.tabIndex=0,this.menuDisposables=this._register(new g.DisposableStore),this.initializeStyleSheet(k),S.addDisposableListener(O,S.EventType.KEY_DOWN,F=>{new C.StandardKeyboardEvent(F).equals(2)&&F.preventDefault()}),T.enableMnemonics&&this.menuDisposables.add(S.addDisposableListener(O,S.EventType.KEY_DOWN,F=>{const D=F.key.toLocaleLowerCase();if(this.mnemonics.has(D)){S.EventHelper.stop(F,!0);const R=this.mnemonics.get(D);if(R.length===1&&(R[0]instanceof f&&R[0].container&&this.focusItemByElement(R[0].container),R[0].onClick(F)),R.length>1){const W=R.shift();W&&W.container&&(this.focusItemByElement(W.container),R.push(W)),this.mnemonics.set(D,R)}}})),o.isLinux&&this._register(S.addDisposableListener(O,S.EventType.KEY_DOWN,F=>{const D=new C.StandardKeyboardEvent(F);D.equals(14)||D.equals(11)?(this.focusedItem=this.viewItems.length-1,this.focusNext(),S.EventHelper.stop(F,!0)):(D.equals(13)||D.equals(12))&&(this.focusedItem=0,this.focusPrevious(),S.EventHelper.stop(F,!0))})),this._register(S.addDisposableListener(this.domNode,S.EventType.MOUSE_OUT,F=>{let D=F.relatedTarget;S.isAncestor(D,this.domNode)||(this.focusedItem=void 0,this.updateFocus(),F.stopPropagation())})),this._register(S.addDisposableListener(this.actionsList,S.EventType.MOUSE_OVER,F=>{let D=F.target;if(!(!D||!S.isAncestor(D,this.actionsList)||D===this.actionsList)){for(;D.parentElement!==this.actionsList&&D.parentElement!==null;)D=D.parentElement;if(D.classList.contains("action-item")){const R=this.focusedItem;this.setFocusedItem(D),R!==this.focusedItem&&this.updateFocus()}}}));let A={parent:this};this.mnemonics=new Map,this.scrollableElement=this._register(new p.DomScrollableElement(O,{alwaysConsumeMouseWheel:!0,horizontal:2,vertical:3,verticalScrollbarSize:7,handleMouseWheel:!0,useShadows:!0}));const B=this.scrollableElement.getDomNode();B.style.position="",this._register(S.addDisposableListener(B,S.EventType.MOUSE_UP,F=>{F.preventDefault()})),O.style.maxHeight=`${Math.max(10,window.innerHeight-k.getBoundingClientRect().top-35)}px`,E=E.filter(F=>{var D;return((D=T.submenuIds)===null||D===void 0?void 0:D.has(F.id))?(console.warn(`Found submenu cycle: ${F.id}`),!1):!0}),this.push(E,{icon:!0,label:!0,isMenu:!0}),k.appendChild(this.scrollableElement.getDomNode()),this.scrollableElement.scanDomNode(),this.viewItems.filter(F=>!(F instanceof v)).forEach((F,D,R)=>{F.updatePositionInSet(D+1,R.length)})}initializeStyleSheet(k){S.isInShadowDOM(k)?(this.styleSheet=S.createStyleSheet(k),this.styleSheet.textContent=L):(m.globalStyleSheet||(m.globalStyleSheet=S.createStyleSheet(),m.globalStyleSheet.textContent=L),this.styleSheet=m.globalStyleSheet)}style(k){const E=this.getContainer(),T=k.foregroundColor?`${k.foregroundColor}`:"",O=k.backgroundColor?`${k.backgroundColor}`:"",A=k.borderColor?`1px solid ${k.borderColor}`:"",B=k.shadowColor?`0 2px 4px ${k.shadowColor}`:"";E.style.border=A,this.domNode.style.color=T,this.domNode.style.backgroundColor=O,E.style.boxShadow=B,this.viewItems&&this.viewItems.forEach(F=>{(F instanceof _||F instanceof v)&&F.style(k)})}getContainer(){return this.scrollableElement.getDomNode()}get onScroll(){return this.scrollableElement.onScroll}focusItemByElement(k){const E=this.focusedItem;this.setFocusedItem(k),E!==this.focusedItem&&this.updateFocus()}setFocusedItem(k){for(let E=0;E{!this.element||(this._register(S.addDisposableListener(this.element,S.EventType.MOUSE_UP,O=>{if(S.EventHelper.stop(O,!0),r.isFirefox){if(new i.StandardMouseEvent(O).rightButton)return;this.onClick(O)}else setTimeout(()=>{this.onClick(O)},0)})),this._register(S.addDisposableListener(this.element,S.EventType.CONTEXT_MENU,O=>{S.EventHelper.stop(O,!0)})))},100),this._register(this.runOnceToEnableMouseUp)}render(k){super.render(k),!!this.element&&(this.container=k,this.item=S.append(this.element,S.$("a.action-menu-item")),this._action.id===M.Separator.ID?this.item.setAttribute("role","presentation"):(this.item.setAttribute("role","menuitem"),this.mnemonic&&this.item.setAttribute("aria-keyshortcuts",`${this.mnemonic}`)),this.check=S.append(this.item,S.$("span.menu-item-check"+t.cssSelector)),this.check.setAttribute("role","none"),this.label=S.append(this.item,S.$("span.action-label")),this.options.label&&this.options.keybinding&&(S.append(this.item,S.$("span.keybinding")).textContent=this.options.keybinding),this.runOnceToEnableMouseUp.schedule(),this.updateClass(),this.updateLabel(),this.updateTooltip(),this.updateEnabled(),this.updateChecked())}blur(){super.blur(),this.applyStyle()}focus(){super.focus(),this.item&&this.item.focus(),this.applyStyle()}updatePositionInSet(k,E){this.item&&(this.item.setAttribute("aria-posinset",`${k}`),this.item.setAttribute("aria-setsize",`${E}`))}updateLabel(){if(!!this.label&&this.options.label){S.clearNode(this.label);let k=n.stripIcons(this.getAction().label);if(k){const E=y(k);this.options.enableMnemonics||(k=E),this.label.setAttribute("aria-label",E.replace(/&&/g,"&"));const T=e.MENU_MNEMONIC_REGEX.exec(k);if(T){k=N.escape(k),e.MENU_ESCAPED_MNEMONIC_REGEX.lastIndex=0;let O=e.MENU_ESCAPED_MNEMONIC_REGEX.exec(k);for(;O&&O[1];)O=e.MENU_ESCAPED_MNEMONIC_REGEX.exec(k);const A=B=>B.replace(/&&/g,"&");O?this.label.append(N.ltrim(A(k.substr(0,O.index))," "),S.$("u",{"aria-hidden":"true"},O[3]),N.rtrim(A(k.substr(O.index+O[0].length))," ")):this.label.innerText=A(k).trim(),this.item&&this.item.setAttribute("aria-keyshortcuts",(T[1]?T[1]:T[3]).toLocaleLowerCase())}else this.label.innerText=k.replace(/&&/g,"&").trim()}}}updateTooltip(){let k=null;this.getAction().tooltip?k=this.getAction().tooltip:!this.options.label&&this.getAction().label&&this.options.icon&&(k=this.getAction().label,this.options.keybinding&&(k=b.localize(0,null,k,this.options.keybinding))),k&&this.item&&(this.item.title=k)}updateClass(){this.cssClass&&this.item&&this.item.classList.remove(...this.cssClass.split(" ")),this.options.icon&&this.label?(this.cssClass=this.getAction().class||"",this.label.classList.add("icon"),this.cssClass&&this.label.classList.add(...this.cssClass.split(" ")),this.updateEnabled()):this.label&&this.label.classList.remove("icon")}updateEnabled(){this.getAction().enabled?(this.element&&(this.element.classList.remove("disabled"),this.element.removeAttribute("aria-disabled")),this.item&&(this.item.classList.remove("disabled"),this.item.removeAttribute("aria-disabled"),this.item.tabIndex=0)):(this.element&&(this.element.classList.add("disabled"),this.element.setAttribute("aria-disabled","true")),this.item&&(this.item.classList.add("disabled"),this.item.setAttribute("aria-disabled","true")))}updateChecked(){!this.item||(this.getAction().checked?(this.item.classList.add("checked"),this.item.setAttribute("role","menuitemcheckbox"),this.item.setAttribute("aria-checked","true")):(this.item.classList.remove("checked"),this.item.setAttribute("role","menuitem"),this.item.setAttribute("aria-checked","false")))}getMnemonic(){return this.mnemonic}applyStyle(){if(!!this.menuStyle){const k=this.element&&this.element.classList.contains("focused"),E=k&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor,T=k&&this.menuStyle.selectionBackgroundColor?this.menuStyle.selectionBackgroundColor:void 0,O=k&&this.menuStyle.selectionBorderColor?`thin solid ${this.menuStyle.selectionBorderColor}`:"";this.item&&(this.item.style.color=E?E.toString():"",this.item.style.backgroundColor=T?T.toString():""),this.check&&(this.check.style.color=E?E.toString():""),this.container&&(this.container.style.border=O)}}style(k){this.menuStyle=k,this.applyStyle()}}class f extends _{constructor(k,E,T,O){super(k,k,O);this.submenuActions=E,this.parentData=T,this.submenuOptions=O,this.mysubmenu=null,this.submenuDisposables=this._register(new g.DisposableStore),this.mouseOver=!1,this.expandDirection=O&&O.expandDirection!==void 0?O.expandDirection:h.Right,this.showScheduler=new d.RunOnceScheduler(()=>{this.mouseOver&&(this.cleanupExistingSubmenu(!1),this.createSubmenu(!1))},250),this.hideScheduler=new d.RunOnceScheduler(()=>{this.element&&!S.isAncestor(S.getActiveElement(),this.element)&&this.parentData.submenu===this.mysubmenu&&(this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!0))},750)}render(k){super.render(k),!!this.element&&(this.item&&(this.item.classList.add("monaco-submenu-item"),this.item.tabIndex=0,this.item.setAttribute("aria-haspopup","true"),this.updateAriaExpanded("false"),this.submenuIndicator=S.append(this.item,S.$("span.submenu-indicator"+l.cssSelector)),this.submenuIndicator.setAttribute("aria-hidden","true")),this._register(S.addDisposableListener(this.element,S.EventType.KEY_UP,E=>{let T=new C.StandardKeyboardEvent(E);(T.equals(17)||T.equals(3))&&(S.EventHelper.stop(E,!0),this.createSubmenu(!0))})),this._register(S.addDisposableListener(this.element,S.EventType.KEY_DOWN,E=>{let T=new C.StandardKeyboardEvent(E);S.getActiveElement()===this.item&&(T.equals(17)||T.equals(3))&&S.EventHelper.stop(E,!0)})),this._register(S.addDisposableListener(this.element,S.EventType.MOUSE_OVER,E=>{this.mouseOver||(this.mouseOver=!0,this.showScheduler.schedule())})),this._register(S.addDisposableListener(this.element,S.EventType.MOUSE_LEAVE,E=>{this.mouseOver=!1})),this._register(S.addDisposableListener(this.element,S.EventType.FOCUS_OUT,E=>{this.element&&!S.isAncestor(S.getActiveElement(),this.element)&&this.hideScheduler.schedule()})),this._register(this.parentData.parent.onScroll(()=>{this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!1)})))}updateEnabled(){}onClick(k){S.EventHelper.stop(k,!0),this.cleanupExistingSubmenu(!1),this.createSubmenu(!0)}cleanupExistingSubmenu(k){if(this.parentData.submenu&&(k||this.parentData.submenu!==this.mysubmenu)){try{this.parentData.submenu.dispose()}catch(E){}this.parentData.submenu=void 0,this.updateAriaExpanded("false"),this.submenuContainer&&(this.submenuDisposables.clear(),this.submenuContainer=void 0)}}calculateSubmenuMenuLayout(k,E,T,O){const A={top:0,left:0};return A.left=c.layout(k.width,E.width,{position:O===h.Right?0:1,offset:T.left,size:T.width}),A.left>=T.left&&A.left{new C.StandardKeyboardEvent(R).equals(15)&&(S.EventHelper.stop(R,!0),this.parentData.parent.focus(),this.cleanupExistingSubmenu(!0))})),this.submenuDisposables.add(S.addDisposableListener(this.submenuContainer,S.EventType.KEY_DOWN,R=>{new C.StandardKeyboardEvent(R).equals(15)&&S.EventHelper.stop(R,!0)})),this.submenuDisposables.add(this.parentData.submenu.onDidCancel(()=>{this.parentData.parent.focus(),this.cleanupExistingSubmenu(!0)})),this.parentData.submenu.focus(k),this.mysubmenu=this.parentData.submenu}}updateAriaExpanded(k){var E;this.item&&((E=this.item)===null||E===void 0||E.setAttribute("aria-expanded",k))}applyStyle(){if(super.applyStyle(),!!this.menuStyle){const E=this.element&&this.element.classList.contains("focused")&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor;this.submenuIndicator&&(this.submenuIndicator.style.color=E?`${E}`:""),this.parentData.submenu&&this.parentData.submenu.style(this.menuStyle)}}dispose(){super.dispose(),this.hideScheduler.dispose(),this.mysubmenu&&(this.mysubmenu.dispose(),this.mysubmenu=null),this.submenuContainer&&(this.submenuContainer=void 0)}}class v extends a.ActionViewItem{style(k){this.label&&(this.label.style.borderBottomColor=k.separatorColor?`${k.separatorColor}`:"")}}function y(I){const k=e.MENU_MNEMONIC_REGEX,E=k.exec(I);if(!E)return I;const T=!E[1];return I.replace(k,T?"$2$3":"").trim()}e.cleanMnemonic=y;let L=` +.monaco-menu { + font-size: 13px; + +} + +${u.formatRule(t)} +${u.formatRule(l)} + +.monaco-menu .monaco-action-bar { + text-align: right; + overflow: hidden; + white-space: nowrap; +} + +.monaco-menu .monaco-action-bar .actions-container { + display: flex; + margin: 0 auto; + padding: 0; + width: 100%; + justify-content: flex-end; +} + +.monaco-menu .monaco-action-bar.vertical .actions-container { + display: inline-block; +} + +.monaco-menu .monaco-action-bar.reverse .actions-container { + flex-direction: row-reverse; +} + +.monaco-menu .monaco-action-bar .action-item { + cursor: pointer; + display: inline-block; + transition: transform 50ms ease; + position: relative; /* DO NOT REMOVE - this is the key to preventing the ghosting icon bug in Chrome 42 */ +} + +.monaco-menu .monaco-action-bar .action-item.disabled { + cursor: default; +} + +.monaco-menu .monaco-action-bar.animated .action-item.active { + transform: scale(1.272019649, 1.272019649); /* 1.272019649 = \u221A\u03C6 */ +} + +.monaco-menu .monaco-action-bar .action-item .icon, +.monaco-menu .monaco-action-bar .action-item .codicon { + display: inline-block; +} + +.monaco-menu .monaco-action-bar .action-item .codicon { + display: flex; + align-items: center; +} + +.monaco-menu .monaco-action-bar .action-label { + font-size: 11px; + margin-right: 4px; +} + +.monaco-menu .monaco-action-bar .action-item.disabled .action-label, +.monaco-menu .monaco-action-bar .action-item.disabled .action-label:hover { + opacity: 0.4; +} + +/* Vertical actions */ + +.monaco-menu .monaco-action-bar.vertical { + text-align: left; +} + +.monaco-menu .monaco-action-bar.vertical .action-item { + display: block; +} + +.monaco-menu .monaco-action-bar.vertical .action-label.separator { + display: block; + border-bottom: 1px solid #bbb; + padding-top: 1px; + margin-left: .8em; + margin-right: .8em; +} + +.monaco-menu .secondary-actions .monaco-action-bar .action-label { + margin-left: 6px; +} + +/* Action Items */ +.monaco-menu .monaco-action-bar .action-item.select-container { + overflow: hidden; /* somehow the dropdown overflows its container, we prevent it here to not push */ + flex: 1; + max-width: 170px; + min-width: 60px; + display: flex; + align-items: center; + justify-content: center; + margin-right: 10px; +} + +.monaco-menu .monaco-action-bar.vertical { + margin-left: 0; + overflow: visible; +} + +.monaco-menu .monaco-action-bar.vertical .actions-container { + display: block; +} + +.monaco-menu .monaco-action-bar.vertical .action-item { + padding: 0; + transform: none; + display: flex; +} + +.monaco-menu .monaco-action-bar.vertical .action-item.active { + transform: none; +} + +.monaco-menu .monaco-action-bar.vertical .action-menu-item { + flex: 1 1 auto; + display: flex; + height: 2em; + align-items: center; + position: relative; +} + +.monaco-menu .monaco-action-bar.vertical .action-label { + flex: 1 1 auto; + text-decoration: none; + padding: 0 1em; + background: none; + font-size: 12px; + line-height: 1; +} + +.monaco-menu .monaco-action-bar.vertical .keybinding, +.monaco-menu .monaco-action-bar.vertical .submenu-indicator { + display: inline-block; + flex: 2 1 auto; + padding: 0 1em; + text-align: right; + font-size: 12px; + line-height: 1; +} + +.monaco-menu .monaco-action-bar.vertical .submenu-indicator { + height: 100%; +} + +.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon { + font-size: 16px !important; + display: flex; + align-items: center; +} + +.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon::before { + margin-left: auto; + margin-right: -20px; +} + +.monaco-menu .monaco-action-bar.vertical .action-item.disabled .keybinding, +.monaco-menu .monaco-action-bar.vertical .action-item.disabled .submenu-indicator { + opacity: 0.4; +} + +.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator) { + display: inline-block; + box-sizing: border-box; + margin: 0; +} + +.monaco-menu .monaco-action-bar.vertical .action-item { + position: static; + overflow: visible; +} + +.monaco-menu .monaco-action-bar.vertical .action-item .monaco-submenu { + position: absolute; +} + +.monaco-menu .monaco-action-bar.vertical .action-label.separator { + padding: 0.5em 0 0 0; + margin-bottom: 0.5em; + width: 100%; + height: 0px !important; + margin-left: .8em !important; + margin-right: .8em !important; +} + +.monaco-menu .monaco-action-bar.vertical .action-label.separator.text { + padding: 0.7em 1em 0.1em 1em; + font-weight: bold; + opacity: 1; +} + +.monaco-menu .monaco-action-bar.vertical .action-label:hover { + color: inherit; +} + +.monaco-menu .monaco-action-bar.vertical .menu-item-check { + position: absolute; + visibility: hidden; + width: 1em; + height: 100%; +} + +.monaco-menu .monaco-action-bar.vertical .action-menu-item.checked .menu-item-check { + visibility: visible; + display: flex; + align-items: center; + justify-content: center; +} + +/* Context Menu */ + +.context-view.monaco-menu-container { + outline: 0; + border: none; + animation: fadeIn 0.083s linear; + -webkit-app-region: no-drag; +} + +.context-view.monaco-menu-container :focus, +.context-view.monaco-menu-container .monaco-action-bar.vertical:focus, +.context-view.monaco-menu-container .monaco-action-bar.vertical :focus { + outline: 0; +} + +.monaco-menu .monaco-action-bar.vertical .action-item { + border: thin solid transparent; /* prevents jumping behaviour on hover or focus */ +} + + +/* High Contrast Theming */ +:host-context(.hc-black) .context-view.monaco-menu-container { + box-shadow: none; +} + +:host-context(.hc-black) .monaco-menu .monaco-action-bar.vertical .action-item.focused { + background: none; +} + +/* Vertical Action Bar Styles */ + +.monaco-menu .monaco-action-bar.vertical { + padding: .5em 0; +} + +.monaco-menu .monaco-action-bar.vertical .action-menu-item { + height: 1.8em; +} + +.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator), +.monaco-menu .monaco-action-bar.vertical .keybinding { + font-size: inherit; + padding: 0 2em; +} + +.monaco-menu .monaco-action-bar.vertical .menu-item-check { + font-size: inherit; + width: 2em; +} + +.monaco-menu .monaco-action-bar.vertical .action-label.separator { + font-size: inherit; + padding: 0.2em 0 0 0; + margin-bottom: 0.2em; +} + +:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .action-label.separator { + margin-left: 0; + margin-right: 0; +} + +.monaco-menu .monaco-action-bar.vertical .submenu-indicator { + font-size: 60%; + padding: 0 1.8em; +} + +:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .submenu-indicator { + height: 100%; + mask-size: 10px 10px; + -webkit-mask-size: 10px 10px; +} + +.monaco-menu .action-item { + cursor: default; +} + +/* Arrows */ +.monaco-scrollable-element > .scrollbar > .scra { + cursor: pointer; + font-size: 11px !important; +} + +.monaco-scrollable-element > .visible { + opacity: 1; + + /* Background rule added for IE9 - to allow clicks on dom node */ + background:rgba(0,0,0,0); + + transition: opacity 100ms linear; +} +.monaco-scrollable-element > .invisible { + opacity: 0; + pointer-events: none; +} +.monaco-scrollable-element > .invisible.fade { + transition: opacity 800ms linear; +} + +/* Scrollable Content Inset Shadow */ +.monaco-scrollable-element > .shadow { + position: absolute; + display: none; +} +.monaco-scrollable-element > .shadow.top { + display: block; + top: 0; + left: 3px; + height: 3px; + width: 100%; + box-shadow: #DDD 0 6px 6px -6px inset; +} +.monaco-scrollable-element > .shadow.left { + display: block; + top: 3px; + left: 0; + height: 100%; + width: 3px; + box-shadow: #DDD 6px 0 6px -6px inset; +} +.monaco-scrollable-element > .shadow.top-left-corner { + display: block; + top: 0; + left: 0; + height: 3px; + width: 3px; +} +.monaco-scrollable-element > .shadow.top.left { + box-shadow: #DDD 6px 6px 6px -6px inset; +} + +/* ---------- Default Style ---------- */ + +:host-context(.vs) .monaco-scrollable-element > .scrollbar > .slider { + background: rgba(100, 100, 100, .4); +} +:host-context(.vs-dark) .monaco-scrollable-element > .scrollbar > .slider { + background: rgba(121, 121, 121, .4); +} +:host-context(.hc-black) .monaco-scrollable-element > .scrollbar > .slider { + background: rgba(111, 195, 223, .6); +} + +.monaco-scrollable-element > .scrollbar > .slider:hover { + background: rgba(100, 100, 100, .7); +} +:host-context(.hc-black) .monaco-scrollable-element > .scrollbar > .slider:hover { + background: rgba(111, 195, 223, .8); +} + +.monaco-scrollable-element > .scrollbar > .slider.active { + background: rgba(0, 0, 0, .6); +} +:host-context(.vs-dark) .monaco-scrollable-element > .scrollbar > .slider.active { + background: rgba(191, 191, 191, .4); +} +:host-context(.hc-black) .monaco-scrollable-element > .scrollbar > .slider.active { + background: rgba(111, 195, 223, 1); +} + +:host-context(.vs-dark) .monaco-scrollable-element .shadow.top { + box-shadow: none; +} + +:host-context(.vs-dark) .monaco-scrollable-element .shadow.left { + box-shadow: #000 6px 0 6px -6px inset; +} + +:host-context(.vs-dark) .monaco-scrollable-element .shadow.top.left { + box-shadow: #000 6px 6px 6px -6px inset; +} + +:host-context(.hc-black) .monaco-scrollable-element .shadow.top { + box-shadow: none; +} + +:host-context(.hc-black) .monaco-scrollable-element .shadow.left { + box-shadow: none; +} + +:host-context(.hc-black) .monaco-scrollable-element .shadow.top.left { + box-shadow: none; +} +`}),define(Q[435],J([0,1,7,177,2,56,82,50,125]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputBox=void 0;const d=b.$;class g extends M.Disposable{constructor(c){super();this.parent=c,this.onKeyDown=o=>b.addDisposableListener(this.inputBox.inputElement,b.EventType.KEY_DOWN,s=>{o(new w.StandardKeyboardEvent(s))}),this.onMouseDown=o=>b.addDisposableListener(this.inputBox.inputElement,b.EventType.MOUSE_DOWN,s=>{o(new C.StandardMouseEvent(s))}),this.onDidChange=o=>this.inputBox.onDidChange(o),this.container=b.append(this.parent,d(".quick-input-box")),this.inputBox=this._register(new N.InputBox(this.container,void 0))}get value(){return this.inputBox.value}set value(c){this.inputBox.value=c}select(c=null){this.inputBox.select(c)}isSelectionAtEnd(){return this.inputBox.isSelectionAtEnd()}get placeholder(){return this.inputBox.inputElement.getAttribute("placeholder")||""}set placeholder(c){this.inputBox.setPlaceHolder(c)}get ariaLabel(){return this.inputBox.getAriaLabel()}set ariaLabel(c){this.inputBox.setAriaLabel(c)}get password(){return this.inputBox.inputElement.type==="password"}set password(c){this.inputBox.inputElement.type=c?"password":"text"}setAttribute(c,o){this.inputBox.inputElement.setAttribute(c,o)}removeAttribute(c){this.inputBox.inputElement.removeAttribute(c)}showDecoration(c){c===S.default.Ignore?this.inputBox.hideMessage():this.inputBox.showMessage({type:c===S.default.Info?1:c===S.default.Warning?2:3,content:""})}stylesForType(c){return this.inputBox.stylesForType(c===S.default.Info?1:c===S.default.Warning?2:3)}setFocus(){this.inputBox.focus()}layout(){this.inputBox.layout()}style(c){this.inputBox.style(c)}}e.QuickInputBox=g}),define(Q[436],J([4,5]),function(q,e){return q.create("vs/base/common/errorMessage",e)}),define(Q[437],J([0,1,436,20,19]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toErrorMessage=void 0;function w(g,p){return p&&(g.stack||g.stacktrace)?b.localize(0,null,C(g),S(g.stack)||S(g.stacktrace)):C(g)}function S(g){return Array.isArray(g)?g.join(` +`):g}function C(g){return typeof g.code=="string"&&typeof g.errno=="number"&&typeof g.syscall=="string"?b.localize(1,null,g.message):g.message||b.localize(2,null)}function d(g=null,p=!1){if(!g)return b.localize(3,null);if(Array.isArray(g)){const c=M.coalesce(g),o=d(c[0],p);return c.length>1?b.localize(4,null,o,c.length):o}if(N.isString(g))return g;if(g.detail){const c=g.detail;if(c.error)return w(c.error,p);if(c.exception)return w(c.exception,p)}return g.stack?w(g,p):g.message?g.message:b.localize(5,null)}e.toErrorMessage=d}),define(Q[438],J([4,5]),function(q,e){return q.create("vs/base/common/keybindingLabels",e)}),define(Q[235],J([0,1,438]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AriaLabelProvider=e.UILabelProvider=e.ModifierLabelProvider=void 0;class N{constructor(S,C,d=C){this.modifierLabels=[null],this.modifierLabels[2]=S,this.modifierLabels[1]=C,this.modifierLabels[3]=d}toLabel(S,C,d){if(C.length===0)return null;const g=[];for(let p=0,c=C.length;p{k.checkbox.offsetParent||D.preventDefault()})),k.checkbox=b.append(E,t("input.quick-input-list-checkbox")),k.checkbox.type="checkbox",k.toDisposeTemplate.push(b.addStandardDisposableListener(k.checkbox,b.EventType.CHANGE,D=>{k.element.checked=k.checkbox.checked}));const T=b.append(E,t(".quick-input-list-rows")),O=b.append(T,t(".quick-input-list-row")),A=b.append(T,t(".quick-input-list-row"));k.label=new d.IconLabel(O,{supportHighlights:!0,supportDescriptionHighlights:!0,supportIcons:!0});const B=b.append(O,t(".quick-input-list-entry-keybinding"));k.keybinding=new i.KeybindingLabel(B,o.OS);const F=b.append(A,t(".quick-input-list-label-meta"));return k.detail=new g.HighlightedLabel(F,!0),k.separator=b.append(k.entry,t(".quick-input-list-separator")),k.actionBar=new s.ActionBar(k.entry),k.actionBar.domNode.classList.add("quick-input-list-entry-action-bar"),k.toDisposeTemplate.push(k.actionBar),k}renderElement(I,k,E){E.toDisposeElement=N.dispose(E.toDisposeElement),E.element=I,E.checkbox.checked=I.checked,E.toDisposeElement.push(I.onChecked(D=>E.checkbox.checked=D));const{labelHighlights:T,descriptionHighlights:O,detailHighlights:A}=I,B=Object.create(null);B.matches=T||[],B.descriptionTitle=I.saneDescription,B.descriptionMatches=O||[],B.extraClasses=I.item.iconClasses,B.italic=I.item.italic,B.strikethrough=I.item.strikethrough,E.label.setLabel(I.saneLabel,I.saneDescription,B),E.keybinding.set(I.item.keybinding),E.detail.set(I.saneDetail,A),I.separator&&I.separator.label?(E.separator.textContent=I.separator.label,E.separator.style.display=""):E.separator.style.display="none",E.entry.classList.toggle("quick-input-list-separator-border",!!I.separator),E.actionBar.clear();const F=I.item.buttons;F&&F.length?(E.actionBar.push(F.map((D,R)=>{let W=D.iconClass||(D.iconPath?u.getIconClass(D.iconPath):void 0);D.alwaysVisible&&(W=W?`${W} always-visible`:"always-visible");const x=new a.Action(`id-${R}`,"",W,!0,()=>Ie(this,void 0,void 0,function*(){I.fireButtonTriggered({button:D,item:I.item})}));return x.tooltip=D.tooltip||"",x}),{icon:!0,label:!1}),E.entry.classList.add("has-actions")):E.entry.classList.remove("has-actions")}disposeElement(I,k,E){E.toDisposeElement=N.dispose(E.toDisposeElement)}disposeTemplate(I){I.toDisposeElement=N.dispose(I.toDisposeElement),I.toDisposeTemplate=N.dispose(I.toDisposeTemplate)}}h.ID="listelement";class m{getHeight(I){return I.saneDetail?44:22}getTemplateId(I){return h.ID}}var _;(function(L){L[L.First=1]="First",L[L.Second=2]="Second",L[L.Last=3]="Last",L[L.Next=4]="Next",L[L.Previous=5]="Previous",L[L.NextPage=6]="NextPage",L[L.PreviousPage=7]="PreviousPage"})(_=e.QuickInputListFocus||(e.QuickInputListFocus={}));class f{constructor(I,k,E){this.parent=I,this.inputElements=[],this.elements=[],this.elementsToIndexes=new Map,this.matchOnDescription=!1,this.matchOnDetail=!1,this.matchOnLabel=!0,this.matchOnMeta=!0,this.sortByLabel=!0,this._onChangedAllVisibleChecked=new S.Emitter,this.onChangedAllVisibleChecked=this._onChangedAllVisibleChecked.event,this._onChangedCheckedCount=new S.Emitter,this.onChangedCheckedCount=this._onChangedCheckedCount.event,this._onChangedVisibleCount=new S.Emitter,this.onChangedVisibleCount=this._onChangedVisibleCount.event,this._onChangedCheckedElements=new S.Emitter,this.onChangedCheckedElements=this._onChangedCheckedElements.event,this._onButtonTriggered=new S.Emitter,this.onButtonTriggered=this._onButtonTriggered.event,this._onKeyDown=new S.Emitter,this.onKeyDown=this._onKeyDown.event,this._onLeave=new S.Emitter,this.onLeave=this._onLeave.event,this._fireCheckedEvents=!0,this.elementDisposables=[],this.disposables=[],this.id=k,this.container=b.append(this.parent,t(".quick-input-list"));const T=new m,O=new y;this.list=E.createList("QuickInput",this.container,T,[new h],{identityProvider:{getId:A=>A.saneLabel},setRowLineHeight:!1,multipleSelectionSupport:!1,horizontalScrolling:!1,accessibilityProvider:O}),this.list.getHTMLElement().id=k,this.disposables.push(this.list),this.disposables.push(this.list.onKeyDown(A=>{const B=new C.StandardKeyboardEvent(A);switch(B.keyCode){case 10:this.toggleCheckbox();break;case 31:(o.isMacintosh?A.metaKey:A.ctrlKey)&&this.list.setFocus(c.range(this.list.length));break;case 16:const F=this.list.getFocus();F.length===1&&F[0]===0&&this._onLeave.fire();break;case 18:const D=this.list.getFocus();D.length===1&&D[0]===this.list.length-1&&this._onLeave.fire();break}this._onKeyDown.fire(B)})),this.disposables.push(this.list.onMouseDown(A=>{A.browserEvent.button!==2&&A.browserEvent.preventDefault()})),this.disposables.push(b.addDisposableListener(this.container,b.EventType.CLICK,A=>{(A.x||A.y)&&this._onLeave.fire()})),this.disposables.push(this.list.onMouseMiddleClick(A=>{this._onLeave.fire()})),this.disposables.push(this.list.onContextMenu(A=>{typeof A.index=="number"&&(A.browserEvent.preventDefault(),this.list.setSelection([A.index]))})),this.disposables.push(this._onChangedAllVisibleChecked,this._onChangedCheckedCount,this._onChangedVisibleCount,this._onChangedCheckedElements,this._onButtonTriggered,this._onLeave,this._onKeyDown)}get onDidChangeFocus(){return S.Event.map(this.list.onDidChangeFocus,I=>I.elements.map(k=>k.item))}get onDidChangeSelection(){return S.Event.map(this.list.onDidChangeSelection,I=>({items:I.elements.map(k=>k.item),event:I.browserEvent}))}getAllVisibleChecked(){return this.allVisibleChecked(this.elements,!1)}allVisibleChecked(I,k=!0){for(let E=0,T=I.length;E{k.hidden||(k.checked=I)})}finally{this._fireCheckedEvents=!0,this.fireCheckedEvents()}}setElements(I){this.elementDisposables=N.dispose(this.elementDisposables);const k=E=>this.fireButtonTriggered(E);this.inputElements=I,this.elements=I.reduce((E,T,O)=>{var A,B,F;if(T.type!=="separator"){const D=O&&I[O-1],R=T.label&&T.label.replace(/\r?\n/g," "),W=T.meta&&T.meta.replace(/\r?\n/g," "),x=T.description&&T.description.replace(/\r?\n/g," "),K=T.detail&&T.detail.replace(/\r?\n/g," "),Y=T.ariaLabel||[R,x,K].map(ee=>ee&&M.parseLabelWithIcons(ee).text).filter(ee=>!!ee).join(", ");E.push(new l({index:O,item:T,saneLabel:R,saneMeta:W,saneAriaLabel:Y,saneDescription:x,saneDetail:K,labelHighlights:(A=T.highlights)===null||A===void 0?void 0:A.label,descriptionHighlights:(B=T.highlights)===null||B===void 0?void 0:B.description,detailHighlights:(F=T.highlights)===null||F===void 0?void 0:F.detail,checked:!1,separator:D&&D.type==="separator"?D:void 0,fireButtonTriggered:k}))}return E},[]),this.elementDisposables.push(...this.elements),this.elementDisposables.push(...this.elements.map(E=>E.onChecked(()=>this.fireCheckedEvents()))),this.elementsToIndexes=this.elements.reduce((E,T,O)=>(E.set(T.item,O),E),new Map),this.list.splice(0,this.list.length),this.list.splice(0,this.list.length,this.elements),this._onChangedVisibleCount.fire(this.elements.length)}getFocusedElements(){return this.list.getFocusedElements().map(I=>I.item)}setFocusedElements(I){if(this.list.setFocus(I.filter(k=>this.elementsToIndexes.has(k)).map(k=>this.elementsToIndexes.get(k))),I.length>0){const k=this.list.getFocus()[0];typeof k=="number"&&this.list.reveal(k)}}getActiveDescendant(){return this.list.getHTMLElement().getAttribute("aria-activedescendant")}setSelectedElements(I){this.list.setSelection(I.filter(k=>this.elementsToIndexes.has(k)).map(k=>this.elementsToIndexes.get(k)))}getCheckedElements(){return this.elements.filter(I=>I.checked).map(I=>I.item)}setCheckedElements(I){try{this._fireCheckedEvents=!1;const k=new Set;for(const E of I)k.add(E);for(const E of this.elements)E.checked=k.has(E.item)}finally{this._fireCheckedEvents=!0,this.fireCheckedEvents()}}set enabled(I){this.list.getHTMLElement().style.pointerEvents=I?"":"none"}focus(I){if(!!this.list.length){switch(I===_.Next&&this.list.getFocus()[0]===this.list.length-1&&(I=_.First),I===_.Previous&&this.list.getFocus()[0]===0&&(I=_.Last),I===_.Second&&this.list.length<2&&(I=_.First),I){case _.First:this.list.focusFirst();break;case _.Second:this.list.focusNth(1);break;case _.Last:this.list.focusLast();break;case _.Next:this.list.focusNext();break;case _.Previous:this.list.focusPrevious();break;case _.NextPage:this.list.focusNextPage();break;case _.PreviousPage:this.list.focusPreviousPage();break}const k=this.list.getFocus()[0];typeof k=="number"&&this.list.reveal(k)}}clearFocus(){this.list.setFocus([])}domFocus(){this.list.domFocus()}layout(I){this.list.getHTMLElement().style.maxHeight=I?`calc(${Math.floor(I/44)*44}px)`:"",this.list.layout()}filter(I){if(!(this.sortByLabel||this.matchOnLabel||this.matchOnDescription||this.matchOnDetail))return this.list.layout(),!1;I=I.trim(),!I||!(this.matchOnLabel||this.matchOnDescription||this.matchOnDetail)?this.elements.forEach(E=>{E.labelHighlights=void 0,E.descriptionHighlights=void 0,E.detailHighlights=void 0,E.hidden=!1;const T=E.index&&this.inputElements[E.index-1];E.separator=T&&T.type==="separator"?T:void 0}):this.elements.forEach(E=>{const T=this.matchOnLabel?r.withNullAsUndefined(M.matchesFuzzyIconAware(I,M.parseLabelWithIcons(E.saneLabel))):void 0,O=this.matchOnDescription?r.withNullAsUndefined(M.matchesFuzzyIconAware(I,M.parseLabelWithIcons(E.saneDescription||""))):void 0,A=this.matchOnDetail?r.withNullAsUndefined(M.matchesFuzzyIconAware(I,M.parseLabelWithIcons(E.saneDetail||""))):void 0,B=this.matchOnMeta?r.withNullAsUndefined(M.matchesFuzzyIconAware(I,M.parseLabelWithIcons(E.saneMeta||""))):void 0;T||O||A||B?(E.labelHighlights=T,E.descriptionHighlights=O,E.detailHighlights=A,E.hidden=!1):(E.labelHighlights=void 0,E.descriptionHighlights=void 0,E.detailHighlights=void 0,E.hidden=!E.item.alwaysShow),E.separator=void 0});const k=this.elements.filter(E=>!E.hidden);if(this.sortByLabel&&I){const E=I.toLowerCase();k.sort((T,O)=>v(T,O,E))}return this.elementsToIndexes=k.reduce((E,T,O)=>(E.set(T.item,O),E),new Map),this.list.splice(0,this.list.length,k),this.list.setFocus([]),this.list.layout(),this._onChangedAllVisibleChecked.fire(this.getAllVisibleChecked()),this._onChangedVisibleCount.fire(k.length),!0}toggleCheckbox(){try{this._fireCheckedEvents=!1;const I=this.list.getFocusedElements(),k=this.allVisibleChecked(I);for(const E of I)E.checked=!k}finally{this._fireCheckedEvents=!0,this.fireCheckedEvents()}}display(I){this.container.style.display=I?"":"none"}isDisplayed(){return this.container.style.display!=="none"}dispose(){this.elementDisposables=N.dispose(this.elementDisposables),this.disposables=N.dispose(this.disposables)}fireCheckedEvents(){this._fireCheckedEvents&&(this._onChangedAllVisibleChecked.fire(this.getAllVisibleChecked()),this._onChangedCheckedCount.fire(this.getCheckedCount()),this._onChangedCheckedElements.fire(this.getCheckedElements()))}fireButtonTriggered(I){this._onButtonTriggered.fire(I)}style(I){this.list.style(I)}}Me([p.memoize],f.prototype,"onDidChangeFocus",null),Me([p.memoize],f.prototype,"onDidChangeSelection",null),e.QuickInputList=f;function v(L,I,k){const E=L.labelHighlights||[],T=I.labelHighlights||[];return E.length&&!T.length?-1:!E.length&&T.length?1:E.length===0&&T.length===0?0:w.compareAnything(L.saneLabel,I.saneLabel,k)}class y{getWidgetAriaLabel(){return n.localize(0,null)}getAriaLabel(I){return I.saneAriaLabel}getWidgetRole(){return"listbox"}getRole(){return"option"}}}),define(Q[443],J([0,1,202,7,23,442,435,56,440,205,309,6,297,2,82,83,48,19,15,211,27,8,103,125]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputController=void 0;const _=N.$,v={iconClass:l.registerCodicon("quick-input-back",l.Codicon.arrowLeft).classNames,tooltip:d.localize(0,null),handle:-1};class y extends s.Disposable{constructor(E){super();this.ui=E,this.visible=!1,this._enabled=!0,this._busy=!1,this._ignoreFocusOut=!1,this._buttons=[],this.buttonsUpdated=!1,this.onDidTriggerButtonEmitter=this._register(new c.Emitter),this.onDidHideEmitter=this._register(new c.Emitter),this.onDisposeEmitter=this._register(new c.Emitter),this.visibleDisposables=this._register(new s.DisposableStore),this.onDidHide=this.onDidHideEmitter.event}get title(){return this._title}set title(E){this._title=E,this.update()}get description(){return this._description}set description(E){this._description=E,this.update()}get step(){return this._steps}set step(E){this._steps=E,this.update()}get totalSteps(){return this._totalSteps}set totalSteps(E){this._totalSteps=E,this.update()}get enabled(){return this._enabled}set enabled(E){this._enabled=E,this.update()}get contextKey(){return this._contextKey}set contextKey(E){this._contextKey=E,this.update()}get busy(){return this._busy}set busy(E){this._busy=E,this.update()}get ignoreFocusOut(){return this._ignoreFocusOut}set ignoreFocusOut(E){this._ignoreFocusOut=E,this.update()}get buttons(){return this._buttons}set buttons(E){this._buttons=E,this.buttonsUpdated=!0,this.update()}show(){this.visible||(this.visibleDisposables.add(this.ui.onDidTriggerButton(E=>{this.buttons.indexOf(E)!==-1&&this.onDidTriggerButtonEmitter.fire(E)})),this.ui.show(this),this.visible=!0,this.update())}hide(){!this.visible||this.ui.hide()}didHide(){this.visible=!1,this.visibleDisposables.clear(),this.onDidHideEmitter.fire()}update(){if(!!this.visible){const E=this.getTitle();E&&this.ui.title.textContent!==E?this.ui.title.textContent=E:!E&&this.ui.title.innerHTML!==" "&&(this.ui.title.innerText="\xA0;");const T=this.getDescription();if(this.ui.description1.textContent!==T&&(this.ui.description1.textContent=T),this.ui.description2.textContent!==T&&(this.ui.description2.textContent=T),this.busy&&!this.busyDelay&&(this.busyDelay=new n.TimeoutTimer,this.busyDelay.setIfNotSet(()=>{this.visible&&this.ui.progressBar.infinite()},800)),!this.busy&&this.busyDelay&&(this.ui.progressBar.stop(),this.busyDelay.cancel(),this.busyDelay=void 0),this.buttonsUpdated){this.buttonsUpdated=!1,this.ui.leftActionBar.clear();const O=this.buttons.filter(B=>B===v);this.ui.leftActionBar.push(O.map((B,F)=>{const D=new r.Action(`id-${F}`,"",B.iconClass||t.getIconClass(B.iconPath),!0,()=>Ie(this,void 0,void 0,function*(){this.onDidTriggerButtonEmitter.fire(B)}));return D.tooltip=B.tooltip||"",D}),{icon:!0,label:!1}),this.ui.rightActionBar.clear();const A=this.buttons.filter(B=>B!==v);this.ui.rightActionBar.push(A.map((B,F)=>{const D=new r.Action(`id-${F}`,"",B.iconClass||t.getIconClass(B.iconPath),!0,()=>Ie(this,void 0,void 0,function*(){this.onDidTriggerButtonEmitter.fire(B)}));return D.tooltip=B.tooltip||"",D}),{icon:!0,label:!1})}this.ui.ignoreFocusOut=this.ignoreFocusOut,this.ui.setEnabled(this.enabled),this.ui.setContextKey(this.contextKey)}}getTitle(){return this.title&&this.step?`${this.title} (${this.getSteps()})`:this.title?this.title:this.step?this.getSteps():""}getDescription(){return this.description||""}getSteps(){return this.step&&this.totalSteps?d.localize(1,null,this.step,this.totalSteps):this.step?String(this.step):""}showMessageDecoration(E){if(this.ui.inputBox.showDecoration(E),E===a.default.Error){const T=this.ui.inputBox.stylesForType(E);this.ui.message.style.color=T.foreground?`${T.foreground}`:"",this.ui.message.style.backgroundColor=T.background?`${T.background}`:"",this.ui.message.style.border=T.border?`1px solid ${T.border}`:"",this.ui.message.style.paddingBottom="4px"}else this.ui.message.style.color="",this.ui.message.style.backgroundColor="",this.ui.message.style.border="",this.ui.message.style.paddingBottom=""}dispose(){this.hide(),this.onDisposeEmitter.fire(),super.dispose()}}class L extends y{constructor(){super(...arguments);this._value="",this.onDidChangeValueEmitter=this._register(new c.Emitter),this.onDidAcceptEmitter=this._register(new c.Emitter),this.onDidCustomEmitter=this._register(new c.Emitter),this._items=[],this.itemsUpdated=!1,this._canSelectMany=!1,this._canAcceptInBackground=!1,this._matchOnDescription=!1,this._matchOnDetail=!1,this._matchOnLabel=!0,this._sortByLabel=!0,this._autoFocusOnList=!0,this._itemActivation=this.ui.isScreenReaderOptimized()?b.ItemActivation.NONE:b.ItemActivation.FIRST,this._activeItems=[],this.activeItemsUpdated=!1,this.activeItemsToConfirm=[],this.onDidChangeActiveEmitter=this._register(new c.Emitter),this._selectedItems=[],this.selectedItemsUpdated=!1,this.selectedItemsToConfirm=[],this.onDidChangeSelectionEmitter=this._register(new c.Emitter),this.onDidTriggerItemButtonEmitter=this._register(new c.Emitter),this.valueSelectionUpdated=!0,this._ok="default",this._customButton=!1,this.filterValue=E=>E,this.onDidChangeValue=this.onDidChangeValueEmitter.event,this.onDidAccept=this.onDidAcceptEmitter.event,this.onDidChangeActive=this.onDidChangeActiveEmitter.event,this.onDidChangeSelection=this.onDidChangeSelectionEmitter.event,this.onDidTriggerItemButton=this.onDidTriggerItemButtonEmitter.event}get quickNavigate(){return this._quickNavigate}set quickNavigate(E){this._quickNavigate=E,this.update()}get value(){return this._value}set value(E){this._value=E||"",this.update()}set ariaLabel(E){this._ariaLabel=E,this.update()}get ariaLabel(){return this._ariaLabel}get placeholder(){return this._placeholder}set placeholder(E){this._placeholder=E,this.update()}get items(){return this._items}set items(E){this._items=E,this.itemsUpdated=!0,this.update()}get canSelectMany(){return this._canSelectMany}set canSelectMany(E){this._canSelectMany=E,this.update()}get canAcceptInBackground(){return this._canAcceptInBackground}set canAcceptInBackground(E){this._canAcceptInBackground=E}get matchOnDescription(){return this._matchOnDescription}set matchOnDescription(E){this._matchOnDescription=E,this.update()}get matchOnDetail(){return this._matchOnDetail}set matchOnDetail(E){this._matchOnDetail=E,this.update()}get matchOnLabel(){return this._matchOnLabel}set matchOnLabel(E){this._matchOnLabel=E,this.update()}get sortByLabel(){return this._sortByLabel}set sortByLabel(E){this._sortByLabel=E,this.update()}get autoFocusOnList(){return this._autoFocusOnList}set autoFocusOnList(E){this._autoFocusOnList=E,this.update()}get itemActivation(){return this._itemActivation}set itemActivation(E){this._itemActivation=E}get activeItems(){return this._activeItems}set activeItems(E){this._activeItems=E,this.activeItemsUpdated=!0,this.update()}get selectedItems(){return this._selectedItems}set selectedItems(E){this._selectedItems=E,this.selectedItemsUpdated=!0,this.update()}get keyMods(){return this._quickNavigate?b.NO_KEY_MODS:this.ui.keyMods}set valueSelection(E){this._valueSelection=E,this.valueSelectionUpdated=!0,this.update()}get validationMessage(){return this._validationMessage}set validationMessage(E){this._validationMessage=E,this.update()}get customButton(){return this._customButton}set customButton(E){this._customButton=E,this.update()}get customLabel(){return this._customButtonLabel}set customLabel(E){this._customButtonLabel=E,this.update()}get customHover(){return this._customButtonHover}set customHover(E){this._customButtonHover=E,this.update()}get ok(){return this._ok}set ok(E){this._ok=E,this.update()}get hideInput(){return!!this._hideInput}set hideInput(E){this._hideInput=E,this.update()}trySelectFirst(){this.autoFocusOnList&&(this.canSelectMany||this.ui.list.focus(w.QuickInputListFocus.First))}show(){this.visible||(this.visibleDisposables.add(this.ui.inputBox.onDidChange(E=>{E!==this.value&&(this._value=E,this.ui.list.filter(this.filterValue(this.ui.inputBox.value))&&this.trySelectFirst(),this.onDidChangeValueEmitter.fire(E))})),this.visibleDisposables.add(this.ui.inputBox.onMouseDown(E=>{this.autoFocusOnList||this.ui.list.clearFocus()})),this.visibleDisposables.add((this._hideInput?this.ui.list:this.ui.inputBox).onKeyDown(E=>{switch(E.keyCode){case 18:this.ui.list.focus(w.QuickInputListFocus.Next),this.canSelectMany&&this.ui.list.domFocus(),N.EventHelper.stop(E,!0);break;case 16:this.ui.list.getFocusedElements().length?this.ui.list.focus(w.QuickInputListFocus.Previous):this.ui.list.focus(w.QuickInputListFocus.Last),this.canSelectMany&&this.ui.list.domFocus(),N.EventHelper.stop(E,!0);break;case 12:this.ui.list.focus(w.QuickInputListFocus.NextPage),this.canSelectMany&&this.ui.list.domFocus(),N.EventHelper.stop(E,!0);break;case 11:this.ui.list.focus(w.QuickInputListFocus.PreviousPage),this.canSelectMany&&this.ui.list.domFocus(),N.EventHelper.stop(E,!0);break;case 17:if(!this._canAcceptInBackground||!this.ui.inputBox.isSelectionAtEnd())return;this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems),this.onDidAcceptEmitter.fire({inBackground:!0}));break;case 14:(E.ctrlKey||E.metaKey)&&!E.shiftKey&&!E.altKey&&(this.ui.list.focus(w.QuickInputListFocus.First),N.EventHelper.stop(E,!0));break;case 13:(E.ctrlKey||E.metaKey)&&!E.shiftKey&&!E.altKey&&(this.ui.list.focus(w.QuickInputListFocus.Last),N.EventHelper.stop(E,!0));break}})),this.visibleDisposables.add(this.ui.onDidAccept(()=>{!this.canSelectMany&&this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems)),this.onDidAcceptEmitter.fire({inBackground:!1})})),this.visibleDisposables.add(this.ui.onDidCustom(()=>{this.onDidCustomEmitter.fire()})),this.visibleDisposables.add(this.ui.list.onDidChangeFocus(E=>{this.activeItemsUpdated||this.activeItemsToConfirm!==this._activeItems&&i.equals(E,this._activeItems,(T,O)=>T===O)||(this._activeItems=E,this.onDidChangeActiveEmitter.fire(E))})),this.visibleDisposables.add(this.ui.list.onDidChangeSelection(({items:E,event:T})=>{if(this.canSelectMany){E.length&&this.ui.list.setSelectedElements([]);return}this.selectedItemsToConfirm!==this._selectedItems&&i.equals(E,this._selectedItems,(O,A)=>O===A)||(this._selectedItems=E,this.onDidChangeSelectionEmitter.fire(E),E.length&&this.onDidAcceptEmitter.fire({inBackground:T instanceof MouseEvent&&T.button===1}))})),this.visibleDisposables.add(this.ui.list.onChangedCheckedElements(E=>{!this.canSelectMany||this.selectedItemsToConfirm!==this._selectedItems&&i.equals(E,this._selectedItems,(T,O)=>T===O)||(this._selectedItems=E,this.onDidChangeSelectionEmitter.fire(E))})),this.visibleDisposables.add(this.ui.list.onButtonTriggered(E=>this.onDidTriggerItemButtonEmitter.fire(E))),this.visibleDisposables.add(this.registerQuickNavigation()),this.valueSelectionUpdated=!0),super.show()}registerQuickNavigation(){return N.addDisposableListener(this.ui.container,N.EventType.KEY_UP,E=>{if(!(this.canSelectMany||!this._quickNavigate)){const T=new C.StandardKeyboardEvent(E),O=T.keyCode;this._quickNavigate.keybindings.some(F=>{const[D,R]=F.getParts();return R?!1:D.shiftKey&&O===4?!(T.ctrlKey||T.altKey||T.metaKey):!!(D.altKey&&O===6||D.ctrlKey&&O===5||D.metaKey&&O===57)})&&(this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems),this.onDidAcceptEmitter.fire({inBackground:!1})),this._quickNavigate=void 0)}})}update(){if(!!this.visible){let E=!1,T=!1;!!this._hideInput&&this._items.length>0&&(this.ui.isScreenReaderOptimized()?T=!0:E=!0),this.ui.container.classList.toggle("hidden-input",E&&!this.description);const O={title:!!this.title||!!this.step||!!this.buttons.length,description:!!this.description,checkAll:this.canSelectMany&&!this._hideCheckAll,checkBox:this.canSelectMany,inputBox:!E,progressBar:!E,visibleCount:!0,count:this.canSelectMany,ok:this.ok==="default"?this.canSelectMany:this.ok,list:!0,message:!!this.validationMessage,customButton:this.customButton};if(this.ui.setVisibilities(O),super.update(),this.ui.inputBox.value!==this.value&&(this.ui.inputBox.value=this.value),this.valueSelectionUpdated&&(this.valueSelectionUpdated=!1,this.ui.inputBox.select(this._valueSelection&&{start:this._valueSelection[0],end:this._valueSelection[1]})),this.ui.inputBox.placeholder!==(this.placeholder||"")&&(this.ui.inputBox.placeholder=this.placeholder||""),T)this.ui.inputBox.ariaLabel="";else{const B=this.ariaLabel||this.placeholder||L.DEFAULT_ARIA_LABEL;this.ui.inputBox.ariaLabel!==B&&(this.ui.inputBox.ariaLabel=B)}if(this.ui.list.matchOnDescription=this.matchOnDescription,this.ui.list.matchOnDetail=this.matchOnDetail,this.ui.list.matchOnLabel=this.matchOnLabel,this.ui.list.sortByLabel=this.sortByLabel,this.itemsUpdated)switch(this.itemsUpdated=!1,this.ui.list.setElements(this.items),this.ui.list.filter(this.filterValue(this.ui.inputBox.value)),this.ui.checkAll.checked=this.ui.list.getAllVisibleChecked(),this.ui.visibleCount.setCount(this.ui.list.getVisibleCount()),this.ui.count.setCount(this.ui.list.getCheckedCount()),this._itemActivation){case b.ItemActivation.NONE:this._itemActivation=b.ItemActivation.FIRST;break;case b.ItemActivation.SECOND:this.ui.list.focus(w.QuickInputListFocus.Second),this._itemActivation=b.ItemActivation.FIRST;break;case b.ItemActivation.LAST:this.ui.list.focus(w.QuickInputListFocus.Last),this._itemActivation=b.ItemActivation.FIRST;break;default:this.trySelectFirst();break}this.ui.container.classList.contains("show-checkboxes")!==!!this.canSelectMany&&(this.canSelectMany?this.ui.list.clearFocus():this.trySelectFirst()),this.activeItemsUpdated&&(this.activeItemsUpdated=!1,this.activeItemsToConfirm=this._activeItems,this.ui.list.setFocusedElements(this.activeItems),this.activeItemsToConfirm===this._activeItems&&(this.activeItemsToConfirm=null)),this.selectedItemsUpdated&&(this.selectedItemsUpdated=!1,this.selectedItemsToConfirm=this._selectedItems,this.canSelectMany?this.ui.list.setCheckedElements(this.selectedItems):this.ui.list.setSelectedElements(this.selectedItems),this.selectedItemsToConfirm===this._selectedItems&&(this.selectedItemsToConfirm=null));const A=this.validationMessage||"";this._lastValidationMessage!==A&&(this._lastValidationMessage=A,N.reset(this.ui.message,...m.renderLabelWithIcons(h.escape(A))),this.showMessageDecoration(this.validationMessage?a.default.Error:a.default.Ignore)),this.ui.customButton.label=this.customLabel||"",this.ui.customButton.element.title=this.customHover||"",this.ui.setComboboxAccessibility(!0),O.inputBox||(this.ui.list.domFocus(),this.canSelectMany&&this.ui.list.focus(w.QuickInputListFocus.First))}}}L.DEFAULT_ARIA_LABEL=d.localize(2,null);class I extends s.Disposable{constructor(E){super();this.options=E,this.comboboxAccessibility=!1,this.enabled=!0,this.onDidAcceptEmitter=this._register(new c.Emitter),this.onDidCustomEmitter=this._register(new c.Emitter),this.onDidTriggerButtonEmitter=this._register(new c.Emitter),this.keyMods={ctrlCmd:!1,alt:!1},this.controller=null,this.onShowEmitter=this._register(new c.Emitter),this.onShow=this.onShowEmitter.event,this.onHideEmitter=this._register(new c.Emitter),this.onHide=this.onHideEmitter.event,this.idPrefix=E.idPrefix,this.parentElement=E.container,this.styles=E.styles,this.registerKeyModsListeners()}registerKeyModsListeners(){const E=T=>{this.keyMods.ctrlCmd=T.ctrlKey||T.metaKey,this.keyMods.alt=T.altKey};this._register(N.addDisposableListener(window,N.EventType.KEY_DOWN,E,!0)),this._register(N.addDisposableListener(window,N.EventType.KEY_UP,E,!0)),this._register(N.addDisposableListener(window,N.EventType.MOUSE_DOWN,E,!0))}getUI(){if(this.ui)return this.ui;const E=N.append(this.parentElement,_(".quick-input-widget.show-file-icons"));E.tabIndex=-1,E.style.display="none";const T=N.createStyleSheet(E),O=N.append(E,_(".quick-input-titlebar")),A=this._register(new u.ActionBar(O));A.domNode.classList.add("quick-input-left-action-bar");const B=N.append(O,_(".quick-input-title")),F=this._register(new u.ActionBar(O));F.domNode.classList.add("quick-input-right-action-bar");const D=N.append(E,_(".quick-input-description")),R=N.append(E,_(".quick-input-header")),W=N.append(R,_("input.quick-input-check-all"));W.type="checkbox",this._register(N.addStandardDisposableListener(W,N.EventType.CHANGE,ae=>{const G=W.checked;ie.setAllVisibleChecked(G)})),this._register(N.addDisposableListener(W,N.EventType.CLICK,ae=>{(ae.x||ae.y)&&ee.setFocus()}));const x=N.append(R,_(".quick-input-description")),K=N.append(R,_(".quick-input-and-message")),Y=N.append(K,_(".quick-input-filter")),ee=this._register(new S.QuickInputBox(Y));ee.setAttribute("aria-describedby",`${this.idPrefix}message`);const se=N.append(Y,_(".quick-input-visible-count"));se.setAttribute("aria-live","polite"),se.setAttribute("aria-atomic","true");const ne=new g.CountBadge(se,{countFormat:d.localize(3,null)}),le=N.append(Y,_(".quick-input-count"));le.setAttribute("aria-live","polite");const X=new g.CountBadge(le,{countFormat:d.localize(4,null)}),z=N.append(R,_(".quick-input-action")),P=new o.Button(z);P.label=d.localize(5,null),this._register(P.onDidClick(ae=>{this.onDidAcceptEmitter.fire()}));const V=N.append(R,_(".quick-input-action")),U=new o.Button(V);U.label=d.localize(6,null),this._register(U.onDidClick(ae=>{this.onDidCustomEmitter.fire()}));const H=N.append(K,_(`#${this.idPrefix}message.quick-input-message`)),$=new p.ProgressBar(E);$.getContainer().classList.add("quick-input-progress");const ie=this._register(new w.QuickInputList(E,this.idPrefix+"list",this.options));this._register(ie.onChangedAllVisibleChecked(ae=>{W.checked=ae})),this._register(ie.onChangedVisibleCount(ae=>{ne.setCount(ae)})),this._register(ie.onChangedCheckedCount(ae=>{X.setCount(ae)})),this._register(ie.onLeave(()=>{setTimeout(()=>{ee.setFocus(),this.controller instanceof L&&this.controller.canSelectMany&&ie.clearFocus()},0)})),this._register(ie.onDidChangeFocus(()=>{this.comboboxAccessibility&&this.getUI().inputBox.setAttribute("aria-activedescendant",this.getUI().list.getActiveDescendant()||"")}));const oe=N.trackFocus(E);return this._register(oe),this._register(N.addDisposableListener(E,N.EventType.FOCUS,ae=>{this.previousFocusElement=ae.relatedTarget instanceof HTMLElement?ae.relatedTarget:void 0},!0)),this._register(oe.onDidBlur(()=>{!this.getUI().ignoreFocusOut&&!this.options.ignoreFocusOut()&&this.hide(),this.previousFocusElement=void 0})),this._register(N.addDisposableListener(E,N.EventType.FOCUS,ae=>{ee.setFocus()})),this._register(N.addDisposableListener(E,N.EventType.KEY_DOWN,ae=>{const G=new C.StandardKeyboardEvent(ae);switch(G.keyCode){case 3:N.EventHelper.stop(ae,!0),this.onDidAcceptEmitter.fire();break;case 9:N.EventHelper.stop(ae,!0),this.hide();break;case 2:if(!G.altKey&&!G.ctrlKey&&!G.metaKey){const j=[".action-label.codicon"];E.classList.contains("show-checkboxes")?j.push("input"):j.push("input[type=text]"),this.getUI().list.isDisplayed()&&j.push(".monaco-list");const te=E.querySelectorAll(j.join(", "));G.shiftKey&&G.target===te[0]?(N.EventHelper.stop(ae,!0),te[te.length-1].focus()):!G.shiftKey&&G.target===te[te.length-1]&&(N.EventHelper.stop(ae,!0),te[0].focus())}break}})),this.ui={container:E,styleSheet:T,leftActionBar:A,titleBar:O,title:B,description1:D,description2:x,rightActionBar:F,checkAll:W,filterContainer:Y,inputBox:ee,visibleCountContainer:se,visibleCount:ne,countContainer:le,count:X,okContainer:z,ok:P,message:H,customButtonContainer:V,customButton:U,progressBar:$,list:ie,onDidAccept:this.onDidAcceptEmitter.event,onDidCustom:this.onDidCustomEmitter.event,onDidTriggerButton:this.onDidTriggerButtonEmitter.event,ignoreFocusOut:!1,keyMods:this.keyMods,isScreenReaderOptimized:()=>this.options.isScreenReaderOptimized(),show:ae=>this.show(ae),hide:()=>this.hide(),setVisibilities:ae=>this.setVisibilities(ae),setComboboxAccessibility:ae=>this.setComboboxAccessibility(ae),setEnabled:ae=>this.setEnabled(ae),setContextKey:ae=>this.options.setContextKey(ae)},this.updateStyles(),this.ui}pick(E,T={},O=M.CancellationToken.None){return new Promise((A,B)=>{let F=x=>{F=A,T.onKeyMods&&T.onKeyMods(D.keyMods),A(x)};if(O.isCancellationRequested){F(void 0);return}const D=this.createQuickPick();let R;const W=[D,D.onDidAccept(()=>{if(D.canSelectMany)F(D.selectedItems.slice()),D.hide();else{const x=D.activeItems[0];x&&(F(x),D.hide())}}),D.onDidChangeActive(x=>{const K=x[0];K&&T.onDidFocus&&T.onDidFocus(K)}),D.onDidChangeSelection(x=>{if(!D.canSelectMany){const K=x[0];K&&(F(K),D.hide())}}),D.onDidTriggerItemButton(x=>T.onDidTriggerItemButton&&T.onDidTriggerItemButton(Object.assign(Object.assign({},x),{removeItem:()=>{const K=D.items.indexOf(x.item);if(K!==-1){const Y=D.items.slice();Y.splice(K,1),D.items=Y}}}))),D.onDidChangeValue(x=>{R&&!x&&(D.activeItems.length!==1||D.activeItems[0]!==R)&&(D.activeItems=[R])}),O.onCancellationRequested(()=>{D.hide()}),D.onDidHide(()=>{s.dispose(W),F(void 0)})];D.canSelectMany=!!T.canPickMany,D.placeholder=T.placeHolder,D.ignoreFocusOut=!!T.ignoreFocusLost,D.matchOnDescription=!!T.matchOnDescription,D.matchOnDetail=!!T.matchOnDetail,D.matchOnLabel=T.matchOnLabel===void 0||T.matchOnLabel,D.autoFocusOnList=T.autoFocusOnList===void 0||T.autoFocusOnList,D.quickNavigate=T.quickNavigate,D.contextKey=T.contextKey,D.busy=!0,Promise.all([E,T.activeItem]).then(([x,K])=>{R=K,D.busy=!1,D.items=x,D.canSelectMany&&(D.selectedItems=x.filter(Y=>Y.type!=="separator"&&Y.picked)),R&&(D.activeItems=[R])}),D.show(),Promise.resolve(E).then(void 0,x=>{B(x),D.hide()})})}createQuickPick(){const E=this.getUI();return new L(E)}show(E){const T=this.getUI();this.onShowEmitter.fire();const O=this.controller;this.controller=E,O&&O.didHide(),this.setEnabled(!0),T.leftActionBar.clear(),T.title.textContent="",T.description1.textContent="",T.description2.textContent="",T.rightActionBar.clear(),T.checkAll.checked=!1,T.inputBox.placeholder="",T.inputBox.password=!1,T.inputBox.showDecoration(a.default.Ignore),T.visibleCount.setCount(0),T.count.setCount(0),N.reset(T.message),T.progressBar.stop(),T.list.setElements([]),T.list.matchOnDescription=!1,T.list.matchOnDetail=!1,T.list.matchOnLabel=!0,T.list.sortByLabel=!0,T.ignoreFocusOut=!1,this.setComboboxAccessibility(!1),T.inputBox.ariaLabel="";const A=this.options.backKeybindingLabel();v.tooltip=A?d.localize(7,null,A):d.localize(8,null),T.container.style.display="",this.updateLayout(),T.inputBox.setFocus()}setVisibilities(E){const T=this.getUI();T.title.style.display=E.title?"":"none",T.description1.style.display=E.description&&(E.inputBox||E.checkAll)?"":"none",T.description2.style.display=E.description&&!(E.inputBox||E.checkAll)?"":"none",T.checkAll.style.display=E.checkAll?"":"none",T.filterContainer.style.display=E.inputBox?"":"none",T.visibleCountContainer.style.display=E.visibleCount?"":"none",T.countContainer.style.display=E.count?"":"none",T.okContainer.style.display=E.ok?"":"none",T.customButtonContainer.style.display=E.customButton?"":"none",T.message.style.display=E.message?"":"none",T.progressBar.getContainer().style.display=E.progressBar?"":"none",T.list.display(!!E.list),T.container.classList[E.checkBox?"add":"remove"]("show-checkboxes"),this.updateLayout()}setComboboxAccessibility(E){if(E!==this.comboboxAccessibility){const T=this.getUI();this.comboboxAccessibility=E,this.comboboxAccessibility?(T.inputBox.setAttribute("role","combobox"),T.inputBox.setAttribute("aria-haspopup","true"),T.inputBox.setAttribute("aria-autocomplete","list"),T.inputBox.setAttribute("aria-activedescendant",T.list.getActiveDescendant()||"")):(T.inputBox.removeAttribute("role"),T.inputBox.removeAttribute("aria-haspopup"),T.inputBox.removeAttribute("aria-autocomplete"),T.inputBox.removeAttribute("aria-activedescendant"))}}setEnabled(E){if(E!==this.enabled){this.enabled=E;for(const T of this.getUI().leftActionBar.viewItems)T.getAction().enabled=E;for(const T of this.getUI().rightActionBar.viewItems)T.getAction().enabled=E;this.getUI().checkAll.disabled=!E,this.getUI().ok.enabled=E,this.getUI().list.enabled=E}}hide(){var E;const T=this.controller;if(T){const O=!((E=this.ui)===null||E===void 0?void 0:E.container.contains(document.activeElement));this.controller=null,this.onHideEmitter.fire(),this.getUI().container.style.display="none",O||(this.previousFocusElement&&this.previousFocusElement.offsetParent?(this.previousFocusElement.focus(),this.previousFocusElement=void 0):this.options.returnFocus()),T.didHide()}}layout(E,T){this.dimension=E,this.titleBarOffset=T,this.updateLayout()}updateLayout(){if(this.ui){this.ui.container.style.top=`${this.titleBarOffset}px`;const E=this.ui.container.style,T=Math.min(this.dimension.width*.62,I.MAX_WIDTH);E.width=T+"px",E.marginLeft="-"+T/2+"px",this.ui.inputBox.layout(),this.ui.list.layout(this.dimension&&this.dimension.height*.4)}}applyStyles(E){this.styles=E,this.updateStyles()}updateStyles(){if(this.ui){const{quickInputTitleBackground:E,quickInputBackground:T,quickInputForeground:O,contrastBorder:A,widgetShadow:B}=this.styles.widget;this.ui.titleBar.style.backgroundColor=E?E.toString():"",this.ui.container.style.backgroundColor=T?T.toString():"",this.ui.container.style.color=O?O.toString():"",this.ui.container.style.border=A?`1px solid ${A}`:"",this.ui.container.style.boxShadow=B?`0 0 8px 2px ${B}`:"",this.ui.inputBox.style(this.styles.inputBox),this.ui.count.style(this.styles.countBadge),this.ui.ok.style(this.styles.button),this.ui.customButton.style(this.styles.button),this.ui.progressBar.style(this.styles.progressBar),this.ui.list.style(this.styles.list);const F=[];this.styles.list.pickerGroupBorder&&F.push(`.quick-input-list .quick-input-list-entry { border-top-color: ${this.styles.list.pickerGroupBorder}; }`),this.styles.list.pickerGroupForeground&&F.push(`.quick-input-list .quick-input-list-separator { color: ${this.styles.list.pickerGroupForeground}; }`);const D=F.join(` +`);D!==this.ui.styleSheet.textContent&&(this.ui.styleSheet.textContent=D)}}}e.QuickInputController=I,I.MAX_WIDTH=600}),define(Q[444],J([4,5]),function(q,e){return q.create("vs/editor/browser/controller/coreCommands",e)}),define(Q[445],J([4,5]),function(q,e){return q.create("vs/editor/browser/controller/textAreaHandler",e)}),define(Q[446],J([4,5]),function(q,e){return q.create("vs/editor/browser/core/keybindingCancellation",e)}),define(Q[447],J([4,5]),function(q,e){return q.create("vs/editor/browser/editorExtensions",e)}),define(Q[448],J([4,5]),function(q,e){return q.create("vs/editor/browser/widget/codeEditorWidget",e)}),define(Q[449],J([4,5]),function(q,e){return q.create("vs/editor/browser/widget/diffEditorWidget",e)}),define(Q[450],J([4,5]),function(q,e){return q.create("vs/editor/browser/widget/diffReview",e)}),define(Q[451],J([4,5]),function(q,e){return q.create("vs/editor/browser/widget/inlineDiffMargin",e)}),define(Q[452],J([0,1,451,7,48,2,3,27]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InlineDiffMargin=void 0;class d extends w.Disposable{constructor(p,c,o,s,a,u){super();this._viewZoneId=p,this._marginDomNode=c,this.editor=o,this.diff=s,this._contextMenuService=a,this._clipboardService=u,this._visibility=!1,this._marginDomNode.style.zIndex="10",this._diffActions=document.createElement("div"),this._diffActions.className=C.Codicon.lightBulb.classNames+" lightbulb-glyph",this._diffActions.style.position="absolute";const r=o.getOption(53),i=o.getModel().getEOL();this._diffActions.style.right="0px",this._diffActions.style.visibility="hidden",this._diffActions.style.height=`${r}px`,this._diffActions.style.lineHeight=`${r}px`,this._marginDomNode.appendChild(this._diffActions);const n=[];n.push(new M.Action("diff.clipboard.copyDeletedContent",s.originalEndLineNumber>s.modifiedStartLineNumber?b.localize(0,null):b.localize(1,null),void 0,!0,()=>Ie(this,void 0,void 0,function*(){const _=new S.Range(s.originalStartLineNumber,1,s.originalEndLineNumber+1,1),f=s.originalModel.getValueInRange(_);yield this._clipboardService.writeText(f)})));let t=0,l;s.originalEndLineNumber>s.modifiedStartLineNumber&&(l=new M.Action("diff.clipboard.copyDeletedLineContent",b.localize(2,null,s.originalStartLineNumber),void 0,!0,()=>Ie(this,void 0,void 0,function*(){const _=s.originalModel.getLineContent(s.originalStartLineNumber+t);yield this._clipboardService.writeText(_)})),n.push(l)),o.getOption(75)||n.push(new M.Action("diff.inline.revertChange",b.localize(3,null),void 0,!0,()=>Ie(this,void 0,void 0,function*(){const _=new S.Range(s.originalStartLineNumber,1,s.originalEndLineNumber,s.originalModel.getLineMaxColumn(s.originalEndLineNumber)),f=s.originalModel.getValueInRange(_);if(s.modifiedEndLineNumber===0){const v=o.getModel().getLineMaxColumn(s.modifiedStartLineNumber);o.executeEdits("diffEditor",[{range:new S.Range(s.modifiedStartLineNumber,v,s.modifiedStartLineNumber,v),text:i+f}])}else{const v=o.getModel().getLineMaxColumn(s.modifiedEndLineNumber);o.executeEdits("diffEditor",[{range:new S.Range(s.modifiedStartLineNumber,1,s.modifiedEndLineNumber,v),text:f}])}})));const m=(_,f)=>{this._contextMenuService.showContextMenu({getAnchor:()=>({x:_,y:f}),getActions:()=>(l&&(l.label=b.localize(4,null,s.originalStartLineNumber+t)),n),autoSelectFirstItem:!0})};this._register(N.addStandardDisposableListener(this._diffActions,"mousedown",_=>{const{top:f,height:v}=N.getDomNodePagePosition(this._diffActions);let y=Math.floor(r/3);_.preventDefault(),m(_.posx,f+v+y)})),this._register(o.onMouseMove(_=>{_.target.type===8||_.target.type===5?_.target.detail.viewZoneId===this._viewZoneId?(this.visibility=!0,t=this._updateLightBulbPosition(this._marginDomNode,_.event.browserEvent.y,r)):this.visibility=!1:this.visibility=!1})),this._register(o.onMouseDown(_=>{!_.event.rightButton||(_.target.type===8||_.target.type===5)&&_.target.detail.viewZoneId===this._viewZoneId&&(_.event.preventDefault(),t=this._updateLightBulbPosition(this._marginDomNode,_.event.browserEvent.y,r),m(_.event.posx,_.event.posy+r))}))}get visibility(){return this._visibility}set visibility(p){this._visibility!==p&&(this._visibility=p,p?this._diffActions.style.visibility="visible":this._diffActions.style.visibility="hidden")}_updateLightBulbPosition(p,c,o){const{top:s}=N.getDomNodePagePosition(p),a=c-s,u=Math.floor(a/o),r=u*o;if(this._diffActions.style.top=`${r}px`,this.diff.viewLineCounts){let i=0;for(let n=0;nhe?he:Z}static float(Z,ue){if(typeof Z=="number")return Z;if(typeof Z=="undefined")return ue;const he=parseFloat(Z);return isNaN(he)?ue:he}validate(Z){return this.validationFn(a.float(Z,this.defaultValue))}}class u extends p{static string(Z,ue){return typeof Z!="string"?ue:Z}constructor(Z,ue,he,re=void 0){typeof re!="undefined"&&(re.type="string",re.default=he),super(Z,ue,he,re)}validate(Z){return u.string(Z,this.defaultValue)}}function r(te,Z,ue){return typeof te!="string"||ue.indexOf(te)===-1?Z:te}e.stringSet=r;class i extends p{constructor(Z,ue,he,re,ce=void 0){typeof ce!="undefined"&&(ce.type="string",ce.enum=re,ce.default=he),super(Z,ue,he,ce),this._allowedValues=re}validate(Z){return r(Z,this.defaultValue,this._allowedValues)}}class n extends d{constructor(Z,ue,he,re,ce,me,Ce=void 0){typeof Ce!="undefined"&&(Ce.type="string",Ce.enum=ce,Ce.default=re),super(Z,ue,he,Ce),this._allowedValues=ce,this._convert=me}validate(Z){return typeof Z!="string"?this.defaultValue:this._allowedValues.indexOf(Z)===-1?this.defaultValue:this._convert(Z)}}function t(te){switch(te){case"none":return 0;case"keep":return 1;case"brackets":return 2;case"advanced":return 3;case"full":return 4}}class l extends d{constructor(){super(2,"accessibilitySupport",0,{type:"string",enum:["auto","on","off"],enumDescriptions:[b.localize(0,null),b.localize(1,null),b.localize(2,null)],default:"auto",description:b.localize(3,null)})}validate(Z){switch(Z){case"auto":return 0;case"off":return 1;case"on":return 2}return this.defaultValue}compute(Z,ue,he){return he===0?Z.accessibilitySupport:he}}class h extends d{constructor(){const Z={insertSpace:!0,ignoreEmptyLines:!0};super(16,"comments",Z,{"editor.comments.insertSpace":{type:"boolean",default:Z.insertSpace,description:b.localize(4,null)},"editor.comments.ignoreEmptyLines":{type:"boolean",default:Z.ignoreEmptyLines,description:b.localize(5,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{insertSpace:c(ue.insertSpace,this.defaultValue.insertSpace),ignoreEmptyLines:c(ue.ignoreEmptyLines,this.defaultValue.ignoreEmptyLines)}}}function m(te){switch(te){case"blink":return 1;case"smooth":return 2;case"phase":return 3;case"expand":return 4;case"solid":return 5}}var _;(function(te){te[te.Line=1]="Line",te[te.Block=2]="Block",te[te.Underline=3]="Underline",te[te.LineThin=4]="LineThin",te[te.BlockOutline=5]="BlockOutline",te[te.UnderlineThin=6]="UnderlineThin"})(_=e.TextEditorCursorStyle||(e.TextEditorCursorStyle={}));function f(te){switch(te){case"line":return _.Line;case"block":return _.Block;case"underline":return _.Underline;case"line-thin":return _.LineThin;case"block-outline":return _.BlockOutline;case"underline-thin":return _.UnderlineThin}}class v extends g{constructor(){super(121,[60,29])}compute(Z,ue,he){const re=["monaco-editor"];return ue.get(29)&&re.push(ue.get(29)),Z.extraEditorClassName&&re.push(Z.extraEditorClassName),ue.get(60)==="default"?re.push("mouse-default"):ue.get(60)==="copy"&&re.push("mouse-copy"),ue.get(95)&&re.push("showUnused"),ue.get(119)&&re.push("showDeprecated"),re.join(" ")}}class y extends o{constructor(){super(28,"emptySelectionClipboard",!0,{description:b.localize(6,null)})}compute(Z,ue,he){return he&&Z.emptySelectionClipboard}}class L extends d{constructor(){const Z={cursorMoveOnType:!0,seedSearchStringFromSelection:!0,autoFindInSelection:"never",globalFindClipboard:!1,addExtraSpaceOnTop:!0,loop:!0};super(31,"find",Z,{"editor.find.cursorMoveOnType":{type:"boolean",default:Z.cursorMoveOnType,description:b.localize(7,null)},"editor.find.seedSearchStringFromSelection":{type:"boolean",default:Z.seedSearchStringFromSelection,description:b.localize(8,null)},"editor.find.autoFindInSelection":{type:"string",enum:["never","always","multiline"],default:Z.autoFindInSelection,enumDescriptions:[b.localize(9,null),b.localize(10,null),b.localize(11,null)],description:b.localize(12,null)},"editor.find.globalFindClipboard":{type:"boolean",default:Z.globalFindClipboard,description:b.localize(13,null),included:N.isMacintosh},"editor.find.addExtraSpaceOnTop":{type:"boolean",default:Z.addExtraSpaceOnTop,description:b.localize(14,null)},"editor.find.loop":{type:"boolean",default:Z.loop,description:b.localize(15,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{cursorMoveOnType:c(ue.cursorMoveOnType,this.defaultValue.cursorMoveOnType),seedSearchStringFromSelection:c(ue.seedSearchStringFromSelection,this.defaultValue.seedSearchStringFromSelection),autoFindInSelection:typeof Z.autoFindInSelection=="boolean"?Z.autoFindInSelection?"always":"never":r(ue.autoFindInSelection,this.defaultValue.autoFindInSelection,["never","always","multiline"]),globalFindClipboard:c(ue.globalFindClipboard,this.defaultValue.globalFindClipboard),addExtraSpaceOnTop:c(ue.addExtraSpaceOnTop,this.defaultValue.addExtraSpaceOnTop),loop:c(ue.loop,this.defaultValue.loop)}}}class I extends d{constructor(){super(39,"fontLigatures",I.OFF,{anyOf:[{type:"boolean",description:b.localize(16,null)},{type:"string",description:b.localize(17,null)}],description:b.localize(18,null),default:!1})}validate(Z){return typeof Z=="undefined"?this.defaultValue:typeof Z=="string"?Z==="false"?I.OFF:Z==="true"?I.ON:Z:Boolean(Z)?I.ON:I.OFF}}e.EditorFontLigatures=I,I.OFF='"liga" off, "calt" off',I.ON='"liga" on, "calt" on';class k extends g{constructor(){super(38)}compute(Z,ue,he){return Z.fontInfo}}class E extends p{constructor(){super(40,"fontSize",e.EDITOR_FONT_DEFAULTS.fontSize,{type:"number",minimum:6,maximum:100,default:e.EDITOR_FONT_DEFAULTS.fontSize,description:b.localize(19,null)})}validate(Z){let ue=a.float(Z,this.defaultValue);return ue===0?e.EDITOR_FONT_DEFAULTS.fontSize:a.clamp(ue,6,100)}compute(Z,ue,he){return Z.fontInfo.fontSize}}class T extends d{constructor(){super(41,"fontWeight",e.EDITOR_FONT_DEFAULTS.fontWeight,{anyOf:[{type:"number",minimum:T.MINIMUM_VALUE,maximum:T.MAXIMUM_VALUE,errorMessage:b.localize(20,null)},{type:"string",pattern:"^(normal|bold|1000|[1-9][0-9]{0,2})$"},{enum:T.SUGGESTION_VALUES}],default:e.EDITOR_FONT_DEFAULTS.fontWeight,description:b.localize(21,null)})}validate(Z){return Z==="normal"||Z==="bold"?Z:String(s.clampedInt(Z,e.EDITOR_FONT_DEFAULTS.fontWeight,T.MINIMUM_VALUE,T.MAXIMUM_VALUE))}}T.SUGGESTION_VALUES=["normal","bold","100","200","300","400","500","600","700","800","900"],T.MINIMUM_VALUE=1,T.MAXIMUM_VALUE=1e3;class O extends d{constructor(){const Z={multiple:"peek",multipleDefinitions:"peek",multipleTypeDefinitions:"peek",multipleDeclarations:"peek",multipleImplementations:"peek",multipleReferences:"peek",alternativeDefinitionCommand:"editor.action.goToReferences",alternativeTypeDefinitionCommand:"editor.action.goToReferences",alternativeDeclarationCommand:"editor.action.goToReferences",alternativeImplementationCommand:"",alternativeReferenceCommand:""},ue={type:"string",enum:["peek","gotoAndPeek","goto"],default:Z.multiple,enumDescriptions:[b.localize(22,null),b.localize(23,null),b.localize(24,null)]};super(45,"gotoLocation",Z,{"editor.gotoLocation.multiple":{deprecationMessage:b.localize(25,null)},"editor.gotoLocation.multipleDefinitions":Object.assign({description:b.localize(26,null)},ue),"editor.gotoLocation.multipleTypeDefinitions":Object.assign({description:b.localize(27,null)},ue),"editor.gotoLocation.multipleDeclarations":Object.assign({description:b.localize(28,null)},ue),"editor.gotoLocation.multipleImplementations":Object.assign({description:b.localize(29,null)},ue),"editor.gotoLocation.multipleReferences":Object.assign({description:b.localize(30,null)},ue),"editor.gotoLocation.alternativeDefinitionCommand":{type:"string",default:Z.alternativeDefinitionCommand,description:b.localize(31,null)},"editor.gotoLocation.alternativeTypeDefinitionCommand":{type:"string",default:Z.alternativeTypeDefinitionCommand,description:b.localize(32,null)},"editor.gotoLocation.alternativeDeclarationCommand":{type:"string",default:Z.alternativeDeclarationCommand,description:b.localize(33,null)},"editor.gotoLocation.alternativeImplementationCommand":{type:"string",default:Z.alternativeImplementationCommand,description:b.localize(34,null)},"editor.gotoLocation.alternativeReferenceCommand":{type:"string",default:Z.alternativeReferenceCommand,description:b.localize(35,null)}})}validate(Z){var ue,he,re,ce,me;if(!Z||typeof Z!="object")return this.defaultValue;const Ce=Z;return{multiple:r(Ce.multiple,this.defaultValue.multiple,["peek","gotoAndPeek","goto"]),multipleDefinitions:(ue=Ce.multipleDefinitions)!==null&&ue!==void 0?ue:r(Ce.multipleDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleTypeDefinitions:(he=Ce.multipleTypeDefinitions)!==null&&he!==void 0?he:r(Ce.multipleTypeDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleDeclarations:(re=Ce.multipleDeclarations)!==null&&re!==void 0?re:r(Ce.multipleDeclarations,"peek",["peek","gotoAndPeek","goto"]),multipleImplementations:(ce=Ce.multipleImplementations)!==null&&ce!==void 0?ce:r(Ce.multipleImplementations,"peek",["peek","gotoAndPeek","goto"]),multipleReferences:(me=Ce.multipleReferences)!==null&&me!==void 0?me:r(Ce.multipleReferences,"peek",["peek","gotoAndPeek","goto"]),alternativeDefinitionCommand:u.string(Ce.alternativeDefinitionCommand,this.defaultValue.alternativeDefinitionCommand),alternativeTypeDefinitionCommand:u.string(Ce.alternativeTypeDefinitionCommand,this.defaultValue.alternativeTypeDefinitionCommand),alternativeDeclarationCommand:u.string(Ce.alternativeDeclarationCommand,this.defaultValue.alternativeDeclarationCommand),alternativeImplementationCommand:u.string(Ce.alternativeImplementationCommand,this.defaultValue.alternativeImplementationCommand),alternativeReferenceCommand:u.string(Ce.alternativeReferenceCommand,this.defaultValue.alternativeReferenceCommand)}}}class A extends d{constructor(){const Z={enabled:!0,delay:300,sticky:!0};super(48,"hover",Z,{"editor.hover.enabled":{type:"boolean",default:Z.enabled,description:b.localize(36,null)},"editor.hover.delay":{type:"number",default:Z.delay,description:b.localize(37,null)},"editor.hover.sticky":{type:"boolean",default:Z.sticky,description:b.localize(38,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{enabled:c(ue.enabled,this.defaultValue.enabled),delay:s.clampedInt(ue.delay,this.defaultValue.delay,0,1e4),sticky:c(ue.sticky,this.defaultValue.sticky)}}}class B extends g{constructor(){super(124,[44,52,33,59,87,54,55,89,111,114,115,116,2])}compute(Z,ue,he){return B.computeLayout(ue,{memory:Z.memory,outerWidth:Z.outerWidth,outerHeight:Z.outerHeight,isDominatedByLongLines:Z.isDominatedByLongLines,lineHeight:Z.fontInfo.lineHeight,viewLineCount:Z.viewLineCount,lineNumbersDigitCount:Z.lineNumbersDigitCount,typicalHalfwidthCharacterWidth:Z.fontInfo.typicalHalfwidthCharacterWidth,maxDigitWidth:Z.fontInfo.maxDigitWidth,pixelRatio:Z.pixelRatio})}static computeContainedMinimapLineCount(Z){const ue=Z.height/Z.lineHeight,he=Z.scrollBeyondLastLine?ue-1:0,re=(Z.viewLineCount+he)/(Z.pixelRatio*Z.height),ce=Math.floor(Z.viewLineCount/re);return{typicalViewportLineCount:ue,extraLinesBeyondLastLine:he,desiredRatio:re,minimapLineCount:ce}}static _computeMinimapLayout(Z,ue){const he=Z.outerWidth,re=Z.outerHeight,ce=Z.pixelRatio;if(!Z.minimap.enabled)return{renderMinimap:0,minimapLeft:0,minimapWidth:0,minimapHeightIsEditorHeight:!1,minimapIsSampling:!1,minimapScale:1,minimapLineHeight:1,minimapCanvasInnerWidth:0,minimapCanvasInnerHeight:Math.floor(ce*re),minimapCanvasOuterWidth:0,minimapCanvasOuterHeight:re};const me=ue.stableMinimapLayoutInput,Ce=me&&Z.outerHeight===me.outerHeight&&Z.lineHeight===me.lineHeight&&Z.typicalHalfwidthCharacterWidth===me.typicalHalfwidthCharacterWidth&&Z.pixelRatio===me.pixelRatio&&Z.scrollBeyondLastLine===me.scrollBeyondLastLine&&Z.minimap.enabled===me.minimap.enabled&&Z.minimap.side===me.minimap.side&&Z.minimap.size===me.minimap.size&&Z.minimap.showSlider===me.minimap.showSlider&&Z.minimap.renderCharacters===me.minimap.renderCharacters&&Z.minimap.maxColumn===me.minimap.maxColumn&&Z.minimap.scale===me.minimap.scale&&Z.verticalScrollbarWidth===me.verticalScrollbarWidth&&Z.isViewportWrapping===me.isViewportWrapping,be=Z.lineHeight,Le=Z.typicalHalfwidthCharacterWidth,De=Z.scrollBeyondLastLine,Re=Z.minimap.renderCharacters;let Ee=ce>=2?Math.round(Z.minimap.scale*2):Z.minimap.scale;const Ae=Z.minimap.maxColumn,Se=Z.minimap.size,we=Z.minimap.side,ye=Z.verticalScrollbarWidth,fe=Z.viewLineCount,de=Z.remainingWidth,ge=Z.isViewportWrapping,pe=Re?2:3;let ve=Math.floor(ce*re);const ke=ve/ce;let Ne=!1,Te=!1,Oe=pe*Ee,Fe=Ee/ce,Pe=1;if(Se==="fill"||Se==="fit"){const{typicalViewportLineCount:Ve,extraLinesBeyondLastLine:Ue,desiredRatio:Ye,minimapLineCount:je}=B.computeContainedMinimapLineCount({viewLineCount:fe,scrollBeyondLastLine:De,height:re,lineHeight:be,pixelRatio:ce});if(fe/je>1)Ne=!0,Te=!0,Ee=1,Oe=1,Fe=Ee/ce;else{let $e=!1,Ze=Ee+1;if(Se==="fit"){const Qe=Math.ceil((fe+Ue)*Oe);ge&&Ce&&de<=ue.stableFitRemainingWidth?($e=!0,Ze=ue.stableFitMaxMinimapScale):($e=Qe>ve,ge&&$e?(ue.stableMinimapLayoutInput=Z,ue.stableFitRemainingWidth=de):(ue.stableMinimapLayoutInput=null,ue.stableFitRemainingWidth=0))}if(Se==="fill"||$e){Ne=!0;const Qe=Ee;Oe=Math.min(be*ce,Math.max(1,Math.floor(1/Ye))),Ee=Math.min(Ze,Math.max(1,Math.floor(Oe/pe))),Ee>Qe&&(Pe=Math.min(2,Ee/Qe)),Fe=Ee/ce/Pe,ve=Math.ceil(Math.max(Ve,fe+Ue)*Oe),ge&&$e&&(ue.stableFitMaxMinimapScale=Ee)}}}const xe=Math.floor(Ae*Fe),We=Math.min(xe,Math.max(0,Math.floor((de-ye-2)*Fe/(Le+Fe)))+e.MINIMAP_GUTTER_WIDTH);let ze=Math.floor(ce*We);const Ke=ze/ce;ze=Math.floor(ze*Pe);const Be=Re?1:2,He=we==="left"?0:he-We-ye;return{renderMinimap:Be,minimapLeft:He,minimapWidth:We,minimapHeightIsEditorHeight:Ne,minimapIsSampling:Te,minimapScale:Ee,minimapLineHeight:Oe,minimapCanvasInnerWidth:ze,minimapCanvasInnerHeight:ve,minimapCanvasOuterWidth:Ke,minimapCanvasOuterHeight:ke}}static computeLayout(Z,ue){const he=ue.outerWidth|0,re=ue.outerHeight|0,ce=ue.lineHeight|0,me=ue.lineNumbersDigitCount|0,Ce=ue.typicalHalfwidthCharacterWidth,be=ue.maxDigitWidth,Le=ue.pixelRatio,De=ue.viewLineCount,Re=Z.get(116),Ee=Re==="inherit"?Z.get(115):Re,Ae=Ee==="inherit"?Z.get(111):Ee,Se=Z.get(114),we=Z.get(2),ye=ue.isDominatedByLongLines,fe=Z.get(44),de=Z.get(54).renderType!==0,ge=Z.get(55),pe=Z.get(89),ve=Z.get(59),ke=Z.get(87),Ne=ke.verticalScrollbarSize,Te=ke.verticalHasArrows,Oe=ke.arrowSize,Fe=ke.horizontalScrollbarSize,Pe=Z.get(52),xe=Z.get(33);let We;if(typeof Pe=="string"&&/^\d+(\.\d+)?ch$/.test(Pe)){const nt=parseFloat(Pe.substr(0,Pe.length-2));We=s.clampedInt(nt*Ce,0,0,1e3)}else We=s.clampedInt(Pe,0,0,1e3);xe&&(We+=16);let ze=0;if(de){const nt=Math.max(me,ge);ze=Math.round(nt*be)}let Ke=0;fe&&(Ke=ce);let Be=0,He=Be+Ke,Ve=He+ze,Ue=Ve+We;const Ye=he-Ke-ze-We;let je=!1,Xe=!1,$e=-1;we!==2&&(Ee==="inherit"&&ye?(je=!0,Xe=!0):Ae==="on"||Ae==="bounded"?Xe=!0:Ae==="wordWrapColumn"&&($e=Se));const Ze=B._computeMinimapLayout({outerWidth:he,outerHeight:re,lineHeight:ce,typicalHalfwidthCharacterWidth:Ce,pixelRatio:Le,scrollBeyondLastLine:pe,minimap:ve,verticalScrollbarWidth:Ne,viewLineCount:De,remainingWidth:Ye,isViewportWrapping:Xe},ue.memory||new C);Ze.renderMinimap!==0&&Ze.minimapLeft===0&&(Be+=Ze.minimapWidth,He+=Ze.minimapWidth,Ve+=Ze.minimapWidth,Ue+=Ze.minimapWidth);const Qe=Ye-Ze.minimapWidth,it=Math.max(1,Math.floor((Qe-Ne-2)/Ce)),Je=Te?Oe:0;return Xe&&($e=Math.max(1,it),Ae==="bounded"&&($e=Math.min($e,Se))),{width:he,height:re,glyphMarginLeft:Be,glyphMarginWidth:Ke,lineNumbersLeft:He,lineNumbersWidth:ze,decorationsLeft:Ve,decorationsWidth:We,contentLeft:Ue,contentWidth:Qe,minimap:Ze,viewportColumn:it,isWordWrapMinified:je,isViewportWrapping:Xe,wrappingColumn:$e,verticalScrollbarWidth:Ne,horizontalScrollbarHeight:Fe,overviewRuler:{top:Je,width:Ne,height:re-2*Je,right:0}}}}e.EditorLayoutInfoComputer=B;class F extends d{constructor(){const Z={enabled:!0};super(51,"lightbulb",Z,{"editor.lightbulb.enabled":{type:"boolean",default:Z.enabled,description:b.localize(39,null)}})}validate(Z){return!Z||typeof Z!="object"?this.defaultValue:{enabled:c(Z.enabled,this.defaultValue.enabled)}}}class D extends d{constructor(){const Z={enabled:!0,fontSize:0,fontFamily:e.EDITOR_FONT_DEFAULTS.fontFamily};super(120,"inlineHints",Z,{"editor.inlineHints.enabled":{type:"boolean",default:Z.enabled,description:b.localize(40,null)},"editor.inlineHints.fontSize":{type:"number",default:Z.fontSize,description:b.localize(41,null)},"editor.inlineHints.fontFamily":{type:"string",default:Z.fontFamily,description:b.localize(42,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{enabled:c(ue.enabled,this.defaultValue.enabled),fontSize:s.clampedInt(ue.fontSize,this.defaultValue.fontSize,0,100),fontFamily:u.string(ue.fontFamily,this.defaultValue.fontFamily)}}}class R extends s{constructor(){super(53,"lineHeight",e.EDITOR_FONT_DEFAULTS.lineHeight,0,150,{description:b.localize(43,null)})}compute(Z,ue,he){return Z.fontInfo.lineHeight}}class W extends d{constructor(){const Z={enabled:!0,size:"proportional",side:"right",showSlider:"mouseover",renderCharacters:!0,maxColumn:120,scale:1};super(59,"minimap",Z,{"editor.minimap.enabled":{type:"boolean",default:Z.enabled,description:b.localize(44,null)},"editor.minimap.size":{type:"string",enum:["proportional","fill","fit"],enumDescriptions:[b.localize(45,null),b.localize(46,null),b.localize(47,null)],default:Z.size,description:b.localize(48,null)},"editor.minimap.side":{type:"string",enum:["left","right"],default:Z.side,description:b.localize(49,null)},"editor.minimap.showSlider":{type:"string",enum:["always","mouseover"],default:Z.showSlider,description:b.localize(50,null)},"editor.minimap.scale":{type:"number",default:Z.scale,minimum:1,maximum:3,enum:[1,2,3],description:b.localize(51,null)},"editor.minimap.renderCharacters":{type:"boolean",default:Z.renderCharacters,description:b.localize(52,null)},"editor.minimap.maxColumn":{type:"number",default:Z.maxColumn,description:b.localize(53,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{enabled:c(ue.enabled,this.defaultValue.enabled),size:r(ue.size,this.defaultValue.size,["proportional","fill","fit"]),side:r(ue.side,this.defaultValue.side,["right","left"]),showSlider:r(ue.showSlider,this.defaultValue.showSlider,["always","mouseover"]),renderCharacters:c(ue.renderCharacters,this.defaultValue.renderCharacters),scale:s.clampedInt(ue.scale,1,1,3),maxColumn:s.clampedInt(ue.maxColumn,this.defaultValue.maxColumn,1,1e4)}}}function x(te){return te==="ctrlCmd"?N.isMacintosh?"metaKey":"ctrlKey":"altKey"}class K extends d{constructor(){super(69,"padding",{top:0,bottom:0},{"editor.padding.top":{type:"number",default:0,minimum:0,maximum:1e3,description:b.localize(54,null)},"editor.padding.bottom":{type:"number",default:0,minimum:0,maximum:1e3,description:b.localize(55,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{top:s.clampedInt(ue.top,0,0,1e3),bottom:s.clampedInt(ue.bottom,0,0,1e3)}}}class Y extends d{constructor(){const Z={enabled:!0,cycle:!1};super(70,"parameterHints",Z,{"editor.parameterHints.enabled":{type:"boolean",default:Z.enabled,description:b.localize(56,null)},"editor.parameterHints.cycle":{type:"boolean",default:Z.cycle,description:b.localize(57,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{enabled:c(ue.enabled,this.defaultValue.enabled),cycle:c(ue.cycle,this.defaultValue.cycle)}}}class ee extends g{constructor(){super(122)}compute(Z,ue,he){return Z.pixelRatio}}class se extends d{constructor(){const Z={other:!0,comments:!1,strings:!1};super(73,"quickSuggestions",Z,{anyOf:[{type:"boolean"},{type:"object",properties:{strings:{type:"boolean",default:Z.strings,description:b.localize(58,null)},comments:{type:"boolean",default:Z.comments,description:b.localize(59,null)},other:{type:"boolean",default:Z.other,description:b.localize(60,null)}}}],default:Z,description:b.localize(61,null)});this.defaultValue=Z}validate(Z){if(typeof Z=="boolean")return Z;if(Z&&typeof Z=="object"){const ue=Z,he={other:c(ue.other,this.defaultValue.other),comments:c(ue.comments,this.defaultValue.comments),strings:c(ue.strings,this.defaultValue.strings)};return he.other&&he.comments&&he.strings?!0:!he.other&&!he.comments&&!he.strings?!1:he}return this.defaultValue}}class ne extends d{constructor(){super(54,"lineNumbers",{renderType:1,renderFn:null},{type:"string",enum:["off","on","relative","interval"],enumDescriptions:[b.localize(62,null),b.localize(63,null),b.localize(64,null),b.localize(65,null)],default:"on",description:b.localize(66,null)})}validate(Z){let ue=this.defaultValue.renderType,he=this.defaultValue.renderFn;return typeof Z!="undefined"&&(typeof Z=="function"?(ue=4,he=Z):Z==="interval"?ue=3:Z==="relative"?ue=2:Z==="on"?ue=1:ue=0),{renderType:ue,renderFn:he}}}function le(te){const Z=te.get(82);return Z==="editable"?te.get(75):Z!=="on"}e.filterValidationDecorations=le;class X extends d{constructor(){const Z=[],ue={type:"number",description:b.localize(67,null)};super(86,"rulers",Z,{type:"array",items:{anyOf:[ue,{type:["object"],properties:{column:ue,color:{type:"string",description:b.localize(68,null),format:"color-hex"}}}]},default:Z,description:b.localize(69,null)})}validate(Z){if(Array.isArray(Z)){let ue=[];for(let he of Z)if(typeof he=="number")ue.push({column:s.clampedInt(he,0,0,1e4),color:null});else if(he&&typeof he=="object"){const re=he;ue.push({column:s.clampedInt(re.column,0,0,1e4),color:re.color})}return ue.sort((he,re)=>he.column-re.column),ue}return this.defaultValue}}function z(te,Z){if(typeof te!="string")return Z;switch(te){case"hidden":return 2;case"visible":return 3;default:return 1}}class P extends d{constructor(){super(87,"scrollbar",{vertical:1,horizontal:1,arrowSize:11,useShadows:!0,verticalHasArrows:!1,horizontalHasArrows:!1,horizontalScrollbarSize:12,horizontalSliderSize:12,verticalScrollbarSize:14,verticalSliderSize:14,handleMouseWheel:!0,alwaysConsumeMouseWheel:!0,scrollByPage:!1})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z,he=s.clampedInt(ue.horizontalScrollbarSize,this.defaultValue.horizontalScrollbarSize,0,1e3),re=s.clampedInt(ue.verticalScrollbarSize,this.defaultValue.verticalScrollbarSize,0,1e3);return{arrowSize:s.clampedInt(ue.arrowSize,this.defaultValue.arrowSize,0,1e3),vertical:z(ue.vertical,this.defaultValue.vertical),horizontal:z(ue.horizontal,this.defaultValue.horizontal),useShadows:c(ue.useShadows,this.defaultValue.useShadows),verticalHasArrows:c(ue.verticalHasArrows,this.defaultValue.verticalHasArrows),horizontalHasArrows:c(ue.horizontalHasArrows,this.defaultValue.horizontalHasArrows),handleMouseWheel:c(ue.handleMouseWheel,this.defaultValue.handleMouseWheel),alwaysConsumeMouseWheel:c(ue.alwaysConsumeMouseWheel,this.defaultValue.alwaysConsumeMouseWheel),horizontalScrollbarSize:he,horizontalSliderSize:s.clampedInt(ue.horizontalSliderSize,he,0,1e3),verticalScrollbarSize:re,verticalSliderSize:s.clampedInt(ue.verticalSliderSize,re,0,1e3),scrollByPage:c(ue.scrollByPage,this.defaultValue.scrollByPage)}}}class V extends d{constructor(){const Z={insertMode:"insert",filterGraceful:!0,snippetsPreventQuickSuggestions:!0,localityBonus:!1,shareSuggestSelections:!1,showIcons:!0,showStatusBar:!1,showInlineDetails:!0,showMethods:!0,showFunctions:!0,showConstructors:!0,showFields:!0,showVariables:!0,showClasses:!0,showStructs:!0,showInterfaces:!0,showModules:!0,showProperties:!0,showEvents:!0,showOperators:!0,showUnits:!0,showValues:!0,showConstants:!0,showEnums:!0,showEnumMembers:!0,showKeywords:!0,showWords:!0,showColors:!0,showFiles:!0,showReferences:!0,showFolders:!0,showTypeParameters:!0,showSnippets:!0,showUsers:!0,showIssues:!0};super(101,"suggest",Z,{"editor.suggest.insertMode":{type:"string",enum:["insert","replace"],enumDescriptions:[b.localize(70,null),b.localize(71,null)],default:Z.insertMode,description:b.localize(72,null)},"editor.suggest.filterGraceful":{type:"boolean",default:Z.filterGraceful,description:b.localize(73,null)},"editor.suggest.localityBonus":{type:"boolean",default:Z.localityBonus,description:b.localize(74,null)},"editor.suggest.shareSuggestSelections":{type:"boolean",default:Z.shareSuggestSelections,markdownDescription:b.localize(75,null)},"editor.suggest.snippetsPreventQuickSuggestions":{type:"boolean",default:Z.snippetsPreventQuickSuggestions,description:b.localize(76,null)},"editor.suggest.showIcons":{type:"boolean",default:Z.showIcons,description:b.localize(77,null)},"editor.suggest.showStatusBar":{type:"boolean",default:Z.showStatusBar,description:b.localize(78,null)},"editor.suggest.showInlineDetails":{type:"boolean",default:Z.showInlineDetails,description:b.localize(79,null)},"editor.suggest.maxVisibleSuggestions":{type:"number",deprecationMessage:b.localize(80,null)},"editor.suggest.filteredTypes":{type:"object",deprecationMessage:b.localize(81,null)},"editor.suggest.showMethods":{type:"boolean",default:!0,markdownDescription:b.localize(82,null)},"editor.suggest.showFunctions":{type:"boolean",default:!0,markdownDescription:b.localize(83,null)},"editor.suggest.showConstructors":{type:"boolean",default:!0,markdownDescription:b.localize(84,null)},"editor.suggest.showFields":{type:"boolean",default:!0,markdownDescription:b.localize(85,null)},"editor.suggest.showVariables":{type:"boolean",default:!0,markdownDescription:b.localize(86,null)},"editor.suggest.showClasses":{type:"boolean",default:!0,markdownDescription:b.localize(87,null)},"editor.suggest.showStructs":{type:"boolean",default:!0,markdownDescription:b.localize(88,null)},"editor.suggest.showInterfaces":{type:"boolean",default:!0,markdownDescription:b.localize(89,null)},"editor.suggest.showModules":{type:"boolean",default:!0,markdownDescription:b.localize(90,null)},"editor.suggest.showProperties":{type:"boolean",default:!0,markdownDescription:b.localize(91,null)},"editor.suggest.showEvents":{type:"boolean",default:!0,markdownDescription:b.localize(92,null)},"editor.suggest.showOperators":{type:"boolean",default:!0,markdownDescription:b.localize(93,null)},"editor.suggest.showUnits":{type:"boolean",default:!0,markdownDescription:b.localize(94,null)},"editor.suggest.showValues":{type:"boolean",default:!0,markdownDescription:b.localize(95,null)},"editor.suggest.showConstants":{type:"boolean",default:!0,markdownDescription:b.localize(96,null)},"editor.suggest.showEnums":{type:"boolean",default:!0,markdownDescription:b.localize(97,null)},"editor.suggest.showEnumMembers":{type:"boolean",default:!0,markdownDescription:b.localize(98,null)},"editor.suggest.showKeywords":{type:"boolean",default:!0,markdownDescription:b.localize(99,null)},"editor.suggest.showWords":{type:"boolean",default:!0,markdownDescription:b.localize(100,null)},"editor.suggest.showColors":{type:"boolean",default:!0,markdownDescription:b.localize(101,null)},"editor.suggest.showFiles":{type:"boolean",default:!0,markdownDescription:b.localize(102,null)},"editor.suggest.showReferences":{type:"boolean",default:!0,markdownDescription:b.localize(103,null)},"editor.suggest.showCustomcolors":{type:"boolean",default:!0,markdownDescription:b.localize(104,null)},"editor.suggest.showFolders":{type:"boolean",default:!0,markdownDescription:b.localize(105,null)},"editor.suggest.showTypeParameters":{type:"boolean",default:!0,markdownDescription:b.localize(106,null)},"editor.suggest.showSnippets":{type:"boolean",default:!0,markdownDescription:b.localize(107,null)},"editor.suggest.showUsers":{type:"boolean",default:!0,markdownDescription:b.localize(108,null)},"editor.suggest.showIssues":{type:"boolean",default:!0,markdownDescription:b.localize(109,null)}})}validate(Z){if(!Z||typeof Z!="object")return this.defaultValue;const ue=Z;return{insertMode:r(ue.insertMode,this.defaultValue.insertMode,["insert","replace"]),filterGraceful:c(ue.filterGraceful,this.defaultValue.filterGraceful),snippetsPreventQuickSuggestions:c(ue.snippetsPreventQuickSuggestions,this.defaultValue.filterGraceful),localityBonus:c(ue.localityBonus,this.defaultValue.localityBonus),shareSuggestSelections:c(ue.shareSuggestSelections,this.defaultValue.shareSuggestSelections),showIcons:c(ue.showIcons,this.defaultValue.showIcons),showStatusBar:c(ue.showStatusBar,this.defaultValue.showStatusBar),showInlineDetails:c(ue.showInlineDetails,this.defaultValue.showInlineDetails),showMethods:c(ue.showMethods,this.defaultValue.showMethods),showFunctions:c(ue.showFunctions,this.defaultValue.showFunctions),showConstructors:c(ue.showConstructors,this.defaultValue.showConstructors),showFields:c(ue.showFields,this.defaultValue.showFields),showVariables:c(ue.showVariables,this.defaultValue.showVariables),showClasses:c(ue.showClasses,this.defaultValue.showClasses),showStructs:c(ue.showStructs,this.defaultValue.showStructs),showInterfaces:c(ue.showInterfaces,this.defaultValue.showInterfaces),showModules:c(ue.showModules,this.defaultValue.showModules),showProperties:c(ue.showProperties,this.defaultValue.showProperties),showEvents:c(ue.showEvents,this.defaultValue.showEvents),showOperators:c(ue.showOperators,this.defaultValue.showOperators),showUnits:c(ue.showUnits,this.defaultValue.showUnits),showValues:c(ue.showValues,this.defaultValue.showValues),showConstants:c(ue.showConstants,this.defaultValue.showConstants),showEnums:c(ue.showEnums,this.defaultValue.showEnums),showEnumMembers:c(ue.showEnumMembers,this.defaultValue.showEnumMembers),showKeywords:c(ue.showKeywords,this.defaultValue.showKeywords),showWords:c(ue.showWords,this.defaultValue.showWords),showColors:c(ue.showColors,this.defaultValue.showColors),showFiles:c(ue.showFiles,this.defaultValue.showFiles),showReferences:c(ue.showReferences,this.defaultValue.showReferences),showFolders:c(ue.showFolders,this.defaultValue.showFolders),showTypeParameters:c(ue.showTypeParameters,this.defaultValue.showTypeParameters),showSnippets:c(ue.showSnippets,this.defaultValue.showSnippets),showUsers:c(ue.showUsers,this.defaultValue.showUsers),showIssues:c(ue.showIssues,this.defaultValue.showIssues)}}}class U extends d{constructor(){super(97,"smartSelect",{selectLeadingAndTrailingWhitespace:!0},{"editor.smartSelect.selectLeadingAndTrailingWhitespace":{description:b.localize(110,null),default:!0,type:"boolean"}})}validate(Z){return!Z||typeof Z!="object"?this.defaultValue:{selectLeadingAndTrailingWhitespace:c(Z.selectLeadingAndTrailingWhitespace,this.defaultValue.selectLeadingAndTrailingWhitespace)}}}class H extends g{constructor(){super(123,[75])}compute(Z,ue,he){return ue.get(75)?!0:Z.tabFocusMode}}function $(te){switch(te){case"none":return 0;case"same":return 1;case"indent":return 2;case"deepIndent":return 3}}class ie extends g{constructor(){super(125,[124])}compute(Z,ue,he){const re=ue.get(124);return{isDominatedByLongLines:Z.isDominatedByLongLines,isWordWrapMinified:re.isWordWrapMinified,isViewportWrapping:re.isViewportWrapping,wrappingColumn:re.wrappingColumn}}}const oe="Consolas, 'Courier New', monospace",ae="Menlo, Monaco, 'Courier New', monospace",G="'Droid Sans Mono', 'monospace', monospace, 'Droid Sans Fallback'";e.EDITOR_FONT_DEFAULTS={fontFamily:N.isMacintosh?ae:N.isLinux?G:oe,fontWeight:"normal",fontSize:N.isMacintosh?12:14,lineHeight:0,letterSpacing:0},e.EDITOR_MODEL_DEFAULTS={tabSize:4,indentSize:4,insertSpaces:!0,detectIndentation:!0,trimAutoWhitespace:!0,largeFileOptimizations:!0},e.editorOptionsRegistry=[];function j(te){return e.editorOptionsRegistry[te.id]=te,te}e.EditorOptions={acceptSuggestionOnCommitCharacter:j(new o(0,"acceptSuggestionOnCommitCharacter",!0,{markdownDescription:b.localize(111,null)})),acceptSuggestionOnEnter:j(new i(1,"acceptSuggestionOnEnter","on",["on","smart","off"],{markdownEnumDescriptions:["",b.localize(112,null),""],markdownDescription:b.localize(113,null)})),accessibilitySupport:j(new l),accessibilityPageSize:j(new s(3,"accessibilityPageSize",10,1,1073741824,{description:b.localize(114,null)})),ariaLabel:j(new u(4,"ariaLabel",b.localize(115,null))),autoClosingBrackets:j(new i(5,"autoClosingBrackets","languageDefined",["always","languageDefined","beforeWhitespace","never"],{enumDescriptions:["",b.localize(116,null),b.localize(117,null),""],description:b.localize(118,null)})),autoClosingOvertype:j(new i(6,"autoClosingOvertype","auto",["always","auto","never"],{enumDescriptions:["",b.localize(119,null),""],description:b.localize(120,null)})),autoClosingQuotes:j(new i(7,"autoClosingQuotes","languageDefined",["always","languageDefined","beforeWhitespace","never"],{enumDescriptions:["",b.localize(121,null),b.localize(122,null),""],description:b.localize(123,null)})),autoIndent:j(new n(8,"autoIndent",4,"full",["none","keep","brackets","advanced","full"],t,{enumDescriptions:[b.localize(124,null),b.localize(125,null),b.localize(126,null),b.localize(127,null),b.localize(128,null)],description:b.localize(129,null)})),automaticLayout:j(new o(9,"automaticLayout",!1)),autoSurround:j(new i(10,"autoSurround","languageDefined",["languageDefined","quotes","brackets","never"],{enumDescriptions:[b.localize(130,null),b.localize(131,null),b.localize(132,null),""],description:b.localize(133,null)})),stickyTabStops:j(new o(99,"stickyTabStops",!1,{description:b.localize(134,null)})),codeLens:j(new o(11,"codeLens",!0,{description:b.localize(135,null)})),codeLensFontFamily:j(new u(12,"codeLensFontFamily","",{description:b.localize(136,null)})),codeLensFontSize:j(new s(13,"codeLensFontSize",0,0,100,{type:"number",default:0,minimum:0,maximum:100,description:b.localize(137,null)})),colorDecorators:j(new o(14,"colorDecorators",!0,{description:b.localize(138,null)})),columnSelection:j(new o(15,"columnSelection",!1,{description:b.localize(139,null)})),comments:j(new h),contextmenu:j(new o(17,"contextmenu",!0)),copyWithSyntaxHighlighting:j(new o(18,"copyWithSyntaxHighlighting",!0,{description:b.localize(140,null)})),cursorBlinking:j(new n(19,"cursorBlinking",1,"blink",["blink","smooth","phase","expand","solid"],m,{description:b.localize(141,null)})),cursorSmoothCaretAnimation:j(new o(20,"cursorSmoothCaretAnimation",!1,{description:b.localize(142,null)})),cursorStyle:j(new n(21,"cursorStyle",_.Line,"line",["line","block","underline","line-thin","block-outline","underline-thin"],f,{description:b.localize(143,null)})),cursorSurroundingLines:j(new s(22,"cursorSurroundingLines",0,0,1073741824,{description:b.localize(144,null)})),cursorSurroundingLinesStyle:j(new i(23,"cursorSurroundingLinesStyle","default",["default","all"],{enumDescriptions:[b.localize(145,null),b.localize(146,null)],description:b.localize(147,null)})),cursorWidth:j(new s(24,"cursorWidth",0,0,1073741824,{markdownDescription:b.localize(148,null)})),disableLayerHinting:j(new o(25,"disableLayerHinting",!1)),disableMonospaceOptimizations:j(new o(26,"disableMonospaceOptimizations",!1)),dragAndDrop:j(new o(27,"dragAndDrop",!0,{description:b.localize(149,null)})),emptySelectionClipboard:j(new y),extraEditorClassName:j(new u(29,"extraEditorClassName","")),fastScrollSensitivity:j(new a(30,"fastScrollSensitivity",5,te=>te<=0?5:te,{markdownDescription:b.localize(150,null)})),find:j(new L),fixedOverflowWidgets:j(new o(32,"fixedOverflowWidgets",!1)),folding:j(new o(33,"folding",!0,{description:b.localize(151,null)})),foldingStrategy:j(new i(34,"foldingStrategy","auto",["auto","indentation"],{enumDescriptions:[b.localize(152,null),b.localize(153,null)],description:b.localize(154,null)})),foldingHighlight:j(new o(35,"foldingHighlight",!0,{description:b.localize(155,null)})),unfoldOnClickAfterEndOfLine:j(new o(36,"unfoldOnClickAfterEndOfLine",!1,{description:b.localize(156,null)})),fontFamily:j(new u(37,"fontFamily",e.EDITOR_FONT_DEFAULTS.fontFamily,{description:b.localize(157,null)})),fontInfo:j(new k),fontLigatures2:j(new I),fontSize:j(new E),fontWeight:j(new T),formatOnPaste:j(new o(42,"formatOnPaste",!1,{description:b.localize(158,null)})),formatOnType:j(new o(43,"formatOnType",!1,{description:b.localize(159,null)})),glyphMargin:j(new o(44,"glyphMargin",!0,{description:b.localize(160,null)})),gotoLocation:j(new O),hideCursorInOverviewRuler:j(new o(46,"hideCursorInOverviewRuler",!1,{description:b.localize(161,null)})),highlightActiveIndentGuide:j(new o(47,"highlightActiveIndentGuide",!0,{description:b.localize(162,null)})),hover:j(new A),inDiffEditor:j(new o(49,"inDiffEditor",!1)),letterSpacing:j(new a(50,"letterSpacing",e.EDITOR_FONT_DEFAULTS.letterSpacing,te=>a.clamp(te,-5,20),{description:b.localize(163,null)})),lightbulb:j(new F),lineDecorationsWidth:j(new p(52,"lineDecorationsWidth",10)),lineHeight:j(new R),lineNumbers:j(new ne),lineNumbersMinChars:j(new s(55,"lineNumbersMinChars",5,1,300)),linkedEditing:j(new o(56,"linkedEditing",!1,{description:b.localize(164,null)})),links:j(new o(57,"links",!0,{description:b.localize(165,null)})),matchBrackets:j(new i(58,"matchBrackets","always",["always","near","never"],{description:b.localize(166,null)})),minimap:j(new W),mouseStyle:j(new i(60,"mouseStyle","text",["text","default","copy"])),mouseWheelScrollSensitivity:j(new a(61,"mouseWheelScrollSensitivity",1,te=>te===0?1:te,{markdownDescription:b.localize(167,null)})),mouseWheelZoom:j(new o(62,"mouseWheelZoom",!1,{markdownDescription:b.localize(168,null)})),multiCursorMergeOverlapping:j(new o(63,"multiCursorMergeOverlapping",!0,{description:b.localize(169,null)})),multiCursorModifier:j(new n(64,"multiCursorModifier","altKey","alt",["ctrlCmd","alt"],x,{markdownEnumDescriptions:[b.localize(170,null),b.localize(171,null)],markdownDescription:b.localize(172,null)})),multiCursorPaste:j(new i(65,"multiCursorPaste","spread",["spread","full"],{markdownEnumDescriptions:[b.localize(173,null),b.localize(174,null)],markdownDescription:b.localize(175,null)})),occurrencesHighlight:j(new o(66,"occurrencesHighlight",!0,{description:b.localize(176,null)})),overviewRulerBorder:j(new o(67,"overviewRulerBorder",!0,{description:b.localize(177,null)})),overviewRulerLanes:j(new s(68,"overviewRulerLanes",3,0,3)),padding:j(new K),parameterHints:j(new Y),peekWidgetDefaultFocus:j(new i(71,"peekWidgetDefaultFocus","tree",["tree","editor"],{enumDescriptions:[b.localize(178,null),b.localize(179,null)],description:b.localize(180,null)})),definitionLinkOpensInPeek:j(new o(72,"definitionLinkOpensInPeek",!1,{description:b.localize(181,null)})),quickSuggestions:j(new se),quickSuggestionsDelay:j(new s(74,"quickSuggestionsDelay",10,0,1073741824,{description:b.localize(182,null)})),readOnly:j(new o(75,"readOnly",!1)),renameOnType:j(new o(76,"renameOnType",!1,{description:b.localize(183,null),markdownDeprecationMessage:b.localize(184,null)})),renderControlCharacters:j(new o(77,"renderControlCharacters",!1,{description:b.localize(185,null)})),renderIndentGuides:j(new o(78,"renderIndentGuides",!0,{description:b.localize(186,null)})),renderFinalNewline:j(new o(79,"renderFinalNewline",!0,{description:b.localize(187,null)})),renderLineHighlight:j(new i(80,"renderLineHighlight","line",["none","gutter","line","all"],{enumDescriptions:["","","",b.localize(188,null)],description:b.localize(189,null)})),renderLineHighlightOnlyWhenFocus:j(new o(81,"renderLineHighlightOnlyWhenFocus",!1,{description:b.localize(190,null)})),renderValidationDecorations:j(new i(82,"renderValidationDecorations","editable",["editable","on","off"])),renderWhitespace:j(new i(83,"renderWhitespace","selection",["none","boundary","selection","trailing","all"],{enumDescriptions:["",b.localize(191,null),b.localize(192,null),b.localize(193,null),""],description:b.localize(194,null)})),revealHorizontalRightPadding:j(new s(84,"revealHorizontalRightPadding",30,0,1e3)),roundedSelection:j(new o(85,"roundedSelection",!0,{description:b.localize(195,null)})),rulers:j(new X),scrollbar:j(new P),scrollBeyondLastColumn:j(new s(88,"scrollBeyondLastColumn",5,0,1073741824,{description:b.localize(196,null)})),scrollBeyondLastLine:j(new o(89,"scrollBeyondLastLine",!0,{description:b.localize(197,null)})),scrollPredominantAxis:j(new o(90,"scrollPredominantAxis",!0,{description:b.localize(198,null)})),selectionClipboard:j(new o(91,"selectionClipboard",!0,{description:b.localize(199,null),included:N.isLinux})),selectionHighlight:j(new o(92,"selectionHighlight",!0,{description:b.localize(200,null)})),selectOnLineNumbers:j(new o(93,"selectOnLineNumbers",!0)),showFoldingControls:j(new i(94,"showFoldingControls","mouseover",["always","mouseover"],{enumDescriptions:[b.localize(201,null),b.localize(202,null)],description:b.localize(203,null)})),showUnused:j(new o(95,"showUnused",!0,{description:b.localize(204,null)})),showDeprecated:j(new o(119,"showDeprecated",!0,{description:b.localize(205,null)})),inlineHints:j(new D),snippetSuggestions:j(new i(96,"snippetSuggestions","inline",["top","bottom","inline","none"],{enumDescriptions:[b.localize(206,null),b.localize(207,null),b.localize(208,null),b.localize(209,null)],description:b.localize(210,null)})),smartSelect:j(new U),smoothScrolling:j(new o(98,"smoothScrolling",!1,{description:b.localize(211,null)})),stopRenderingLineAfter:j(new s(100,"stopRenderingLineAfter",1e4,-1,1073741824)),suggest:j(new V),suggestFontSize:j(new s(102,"suggestFontSize",0,0,1e3,{markdownDescription:b.localize(212,null)})),suggestLineHeight:j(new s(103,"suggestLineHeight",0,0,1e3,{markdownDescription:b.localize(213,null)})),suggestOnTriggerCharacters:j(new o(104,"suggestOnTriggerCharacters",!0,{description:b.localize(214,null)})),suggestSelection:j(new i(105,"suggestSelection","recentlyUsed",["first","recentlyUsed","recentlyUsedByPrefix"],{markdownEnumDescriptions:[b.localize(215,null),b.localize(216,null),b.localize(217,null)],description:b.localize(218,null)})),tabCompletion:j(new i(106,"tabCompletion","off",["on","off","onlySnippets"],{enumDescriptions:[b.localize(219,null),b.localize(220,null),b.localize(221,null)],description:b.localize(222,null)})),tabIndex:j(new s(107,"tabIndex",0,-1,1073741824)),unusualLineTerminators:j(new i(108,"unusualLineTerminators","prompt",["auto","off","prompt"],{enumDescriptions:[b.localize(223,null),b.localize(224,null),b.localize(225,null)],description:b.localize(226,null)})),useTabStops:j(new o(109,"useTabStops",!0,{description:b.localize(227,null)})),wordSeparators:j(new u(110,"wordSeparators",M.USUAL_WORD_SEPARATORS,{description:b.localize(228,null)})),wordWrap:j(new i(111,"wordWrap","off",["off","on","wordWrapColumn","bounded"],{markdownEnumDescriptions:[b.localize(229,null),b.localize(230,null),b.localize(231,null),b.localize(232,null)],description:b.localize(233,null)})),wordWrapBreakAfterCharacters:j(new u(112,"wordWrapBreakAfterCharacters"," })]?|/&.,;\xA2\xB0\u2032\u2033\u2030\u2103\u3001\u3002\uFF61\uFF64\uFFE0\uFF0C\uFF0E\uFF1A\uFF1B\uFF1F\uFF01\uFF05\u30FB\uFF65\u309D\u309E\u30FD\u30FE\u30FC\u30A1\u30A3\u30A5\u30A7\u30A9\u30C3\u30E3\u30E5\u30E7\u30EE\u30F5\u30F6\u3041\u3043\u3045\u3047\u3049\u3063\u3083\u3085\u3087\u308E\u3095\u3096\u31F0\u31F1\u31F2\u31F3\u31F4\u31F5\u31F6\u31F7\u31F8\u31F9\u31FA\u31FB\u31FC\u31FD\u31FE\u31FF\u3005\u303B\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C\uFF6D\uFF6E\uFF6F\uFF70\u201D\u3009\u300B\u300D\u300F\u3011\u3015\uFF09\uFF3D\uFF5D\uFF63")),wordWrapBreakBeforeCharacters:j(new u(113,"wordWrapBreakBeforeCharacters","([{\u2018\u201C\u3008\u300A\u300C\u300E\u3010\u3014\uFF08\uFF3B\uFF5B\uFF62\xA3\xA5\uFF04\uFFE1\uFFE5+\uFF0B")),wordWrapColumn:j(new s(114,"wordWrapColumn",80,1,1073741824,{markdownDescription:b.localize(234,null)})),wordWrapOverride1:j(new i(115,"wordWrapOverride1","inherit",["off","on","inherit"])),wordWrapOverride2:j(new i(116,"wordWrapOverride2","inherit",["off","on","inherit"])),wrappingIndent:j(new n(117,"wrappingIndent",1,"same",["none","same","indent","deepIndent"],$,{enumDescriptions:[b.localize(235,null),b.localize(236,null),b.localize(237,null),b.localize(238,null)],description:b.localize(239,null)})),wrappingStrategy:j(new i(118,"wrappingStrategy","simple",["simple","advanced"],{enumDescriptions:[b.localize(240,null),b.localize(241,null)],description:b.localize(242,null)})),editorClassName:j(new v),pixelRatio:j(new ee),tabFocusMode:j(new H),layoutInfo:j(new B),wrappingInfo:j(new ie)}}),define(Q[455],J([0,1,14,3,63,38]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewModelDecorations=void 0;class S{constructor(d,g,p,c,o){this.editorId=d,this.model=g,this.configuration=p,this._linesCollection=c,this._coordinatesConverter=o,this._decorationsCache=Object.create(null),this._cachedModelDecorationsResolver=null,this._cachedModelDecorationsResolverViewRange=null}_clearCachedModelDecorationsResolver(){this._cachedModelDecorationsResolver=null,this._cachedModelDecorationsResolverViewRange=null}dispose(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}reset(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}onModelDecorationsChanged(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}onLineMappingChanged(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}_getOrCreateViewModelDecoration(d){const g=d.id;let p=this._decorationsCache[g];if(!p){const c=d.range,o=d.options;let s;if(o.isWholeLine){const a=this._coordinatesConverter.convertModelPositionToViewPosition(new b.Position(c.startLineNumber,1)),u=this._coordinatesConverter.convertModelPositionToViewPosition(new b.Position(c.endLineNumber,this.model.getLineMaxColumn(c.endLineNumber)));s=new N.Range(a.lineNumber,a.column,u.lineNumber,u.column)}else s=this._coordinatesConverter.convertModelRangeToViewRange(c);p=new M.ViewModelDecoration(s,o),this._decorationsCache[g]=p}return p}getDecorationsViewportData(d){let g=this._cachedModelDecorationsResolver!==null;return g=g&&d.equalsRange(this._cachedModelDecorationsResolverViewRange),g||(this._cachedModelDecorationsResolver=this._getDecorationsViewportData(d),this._cachedModelDecorationsResolverViewRange=d),this._cachedModelDecorationsResolver}_getDecorationsViewportData(d){const g=this._linesCollection.getDecorationsInRange(d,this.editorId,w.filterValidationDecorations(this.configuration.options)),p=d.startLineNumber,c=d.endLineNumber;let o=[],s=0,a=[];for(let u=p;u<=c;u++)a[u-p]=[];for(let u=0,r=g.length;u0&&(this.changes=S.compressConsecutiveTextChanges(this.changes,n)),this.afterEOL=t,this.afterVersionId=l,this.afterCursorState=h}static _writeSelectionsSize(i){return 4+4*4*(i?i.length:0)}static _writeSelections(i,n,t){if(C.writeUInt32BE(i,n?n.length:0,t),t+=4,n)for(const l of n)C.writeUInt32BE(i,l.selectionStartLineNumber,t),t+=4,C.writeUInt32BE(i,l.selectionStartColumn,t),t+=4,C.writeUInt32BE(i,l.positionLineNumber,t),t+=4,C.writeUInt32BE(i,l.positionColumn,t),t+=4;return t}static _readSelections(i,n,t){const l=C.readUInt32BE(i,n);n+=4;for(let h=0;hn.toString()).join(", ")}matchesResource(i){return(w.URI.isUri(this.model)?this.model:this.model.uri).toString()===i.toString()}setModel(i){this.model=i}canAppend(i){return this.model===i&&this._data instanceof p}append(i,n,t,l,h){this._data instanceof p&&this._data.append(i,n,t,l,h)}close(){this._data instanceof p&&(this._data=this._data.serialize())}open(){this._data instanceof p||(this._data=p.deserialize(this._data))}undo(){if(w.URI.isUri(this.model))throw new Error("Invalid SingleModelEditStackElement");this._data instanceof p&&(this._data=this._data.serialize());const i=p.deserialize(this._data);this.model._applyUndo(i.changes,i.beforeEOL,i.beforeVersionId,i.beforeCursorState)}redo(){if(w.URI.isUri(this.model))throw new Error("Invalid SingleModelEditStackElement");this._data instanceof p&&(this._data=this._data.serialize());const i=p.deserialize(this._data);this.model._applyRedo(i.changes,i.afterEOL,i.afterVersionId,i.afterCursorState)}heapSize(){return this._data instanceof p&&(this._data=this._data.serialize()),this._data.byteLength+168}}e.SingleModelEditStackElement=c;class o{constructor(i,n){this.type=1,this.label=i,this._isOpen=!0,this._editStackElementsArr=n.slice(0),this._editStackElementsMap=new Map;for(const t of this._editStackElementsArr){const l=g(t.resource);this._editStackElementsMap.set(l,t)}this._delegate=null}get resources(){return this._editStackElementsArr.map(i=>i.resource)}prepareUndoRedo(){if(this._delegate)return this._delegate.prepareUndoRedo(this)}matchesResource(i){const n=g(i);return this._editStackElementsMap.has(n)}setModel(i){const n=g(w.URI.isUri(i)?i:i.uri);this._editStackElementsMap.has(n)&&this._editStackElementsMap.get(n).setModel(i)}canAppend(i){if(!this._isOpen)return!1;const n=g(i.uri);return this._editStackElementsMap.has(n)?this._editStackElementsMap.get(n).canAppend(i):!1}append(i,n,t,l,h){const m=g(i.uri);this._editStackElementsMap.get(m).append(i,n,t,l,h)}close(){this._isOpen=!1}open(){}undo(){this._isOpen=!1;for(const i of this._editStackElementsArr)i.undo()}redo(){for(const i of this._editStackElementsArr)i.redo()}heapSize(i){const n=g(i);return this._editStackElementsMap.has(n)?this._editStackElementsMap.get(n).heapSize():0}split(){return this._editStackElementsArr}toString(){let i=[];for(const n of this._editStackElementsArr)i.push(`${d.basename(n.resource)}: ${n}`);return`{${i.join(", ")}}`}}e.MultiModelEditStackElement=o;function s(r){return r.getEOL()===` +`?0:1}function a(r){return r?r instanceof c||r instanceof o:!1}e.isEditStackElement=a;class u{constructor(i,n){this._model=i,this._undoRedoService=n}pushStackElement(){const i=this._undoRedoService.getLastElement(this._model.uri);a(i)&&i.close()}popStackElement(){const i=this._undoRedoService.getLastElement(this._model.uri);a(i)&&i.open()}clear(){this._undoRedoService.removeElements(this._model.uri)}_getOrCreateEditStackElement(i){const n=this._undoRedoService.getLastElement(this._model.uri);if(a(n)&&n.canAppend(this._model))return n;const t=new c(this._model,i);return this._undoRedoService.pushElement(t),t}pushEOL(i){const n=this._getOrCreateEditStackElement(null);this._model.setEOL(i),n.append(this._model,[],s(this._model),this._model.getAlternativeVersionId(),null)}pushEditOperation(i,n,t){const l=this._getOrCreateEditStackElement(i),h=this._model.applyEdits(n,!0),m=u._computeCursorState(t,h),_=h.map((f,v)=>({index:v,textChange:f.textChange}));return _.sort((f,v)=>f.textChange.oldPosition===v.textChange.oldPosition?f.index-v.index:f.textChange.oldPosition-v.textChange.oldPosition),l.append(this._model,_.map(f=>f.textChange),s(this._model),this._model.getAlternativeVersionId(),m),m}static _computeCursorState(i,n){try{return i?i(n):null}catch(t){return N.onUnexpectedError(t),null}}}e.EditStack=u}),define(Q[458],J([4,5]),function(q,e){return q.create("vs/editor/common/modes/modesRegistry",e)}),define(Q[459],J([4,5]),function(q,e){return q.create("vs/editor/common/standaloneStrings",e)}),define(Q[64],J([0,1,459]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SimpleServicesNLS=e.ToggleHighContrastNLS=e.StandaloneCodeEditorNLS=e.QuickOutlineNLS=e.QuickCommandNLS=e.QuickHelpNLS=e.GoToLineNLS=e.InspectTokensNLS=e.AccessibilityHelpNLS=void 0;var N;(function(o){o.noSelection=b.localize(0,null),o.singleSelectionRange=b.localize(1,null),o.singleSelection=b.localize(2,null),o.multiSelectionRange=b.localize(3,null),o.multiSelection=b.localize(4,null),o.emergencyConfOn=b.localize(5,null),o.openingDocs=b.localize(6,null),o.readonlyDiffEditor=b.localize(7,null),o.editableDiffEditor=b.localize(8,null),o.readonlyEditor=b.localize(9,null),o.editableEditor=b.localize(10,null),o.changeConfigToOnMac=b.localize(11,null),o.changeConfigToOnWinLinux=b.localize(12,null),o.auto_on=b.localize(13,null),o.auto_off=b.localize(14,null),o.tabFocusModeOnMsg=b.localize(15,null),o.tabFocusModeOnMsgNoKb=b.localize(16,null),o.tabFocusModeOffMsg=b.localize(17,null),o.tabFocusModeOffMsgNoKb=b.localize(18,null),o.openDocMac=b.localize(19,null),o.openDocWinLinux=b.localize(20,null),o.outroMsg=b.localize(21,null),o.showAccessibilityHelpAction=b.localize(22,null)})(N=e.AccessibilityHelpNLS||(e.AccessibilityHelpNLS={}));var M;(function(o){o.inspectTokensAction=b.localize(23,null)})(M=e.InspectTokensNLS||(e.InspectTokensNLS={}));var w;(function(o){o.gotoLineActionLabel=b.localize(24,null)})(w=e.GoToLineNLS||(e.GoToLineNLS={}));var S;(function(o){o.helpQuickAccessActionLabel=b.localize(25,null)})(S=e.QuickHelpNLS||(e.QuickHelpNLS={}));var C;(function(o){o.quickCommandActionLabel=b.localize(26,null),o.quickCommandHelp=b.localize(27,null)})(C=e.QuickCommandNLS||(e.QuickCommandNLS={}));var d;(function(o){o.quickOutlineActionLabel=b.localize(28,null),o.quickOutlineByCategoryActionLabel=b.localize(29,null)})(d=e.QuickOutlineNLS||(e.QuickOutlineNLS={}));var g;(function(o){o.editorViewAccessibleLabel=b.localize(30,null),o.accessibilityHelpMessage=b.localize(31,null)})(g=e.StandaloneCodeEditorNLS||(e.StandaloneCodeEditorNLS={}));var p;(function(o){o.toggleHighContrast=b.localize(32,null)})(p=e.ToggleHighContrastNLS||(e.ToggleHighContrastNLS={}));var c;(function(o){o.bulkEditServiceSummary=b.localize(33,null)})(c=e.SimpleServicesNLS||(e.SimpleServicesNLS={}))}),define(Q[460],J([4,5]),function(q,e){return q.create("vs/editor/common/view/editorColorRegistry",e)}),define(Q[461],J([4,5]),function(q,e){return q.create("vs/editor/contrib/anchorSelect/anchorSelect",e)}),define(Q[462],J([4,5]),function(q,e){return q.create("vs/editor/contrib/bracketMatching/bracketMatching",e)}),define(Q[463],J([4,5]),function(q,e){return q.create("vs/editor/contrib/caretOperations/caretOperations",e)}),define(Q[464],J([4,5]),function(q,e){return q.create("vs/editor/contrib/caretOperations/transpose",e)}),define(Q[465],J([4,5]),function(q,e){return q.create("vs/editor/contrib/clipboard/clipboard",e)}),define(Q[466],J([4,5]),function(q,e){return q.create("vs/editor/contrib/codeAction/codeActionCommands",e)}),define(Q[467],J([4,5]),function(q,e){return q.create("vs/editor/contrib/codeAction/lightBulbWidget",e)}),define(Q[468],J([4,5]),function(q,e){return q.create("vs/editor/contrib/codelens/codelensController",e)}),define(Q[469],J([4,5]),function(q,e){return q.create("vs/editor/contrib/comment/comment",e)}),define(Q[470],J([4,5]),function(q,e){return q.create("vs/editor/contrib/contextmenu/contextmenu",e)}),define(Q[471],J([4,5]),function(q,e){return q.create("vs/editor/contrib/cursorUndo/cursorUndo",e)}),define(Q[472],J([4,5]),function(q,e){return q.create("vs/editor/contrib/find/findController",e)}),define(Q[473],J([4,5]),function(q,e){return q.create("vs/editor/contrib/find/findWidget",e)}),define(Q[474],J([4,5]),function(q,e){return q.create("vs/editor/contrib/folding/folding",e)}),define(Q[475],J([4,5]),function(q,e){return q.create("vs/editor/contrib/folding/foldingDecorations",e)}),define(Q[476],J([4,5]),function(q,e){return q.create("vs/editor/contrib/fontZoom/fontZoom",e)}),define(Q[477],J([4,5]),function(q,e){return q.create("vs/editor/contrib/format/format",e)}),define(Q[478],J([4,5]),function(q,e){return q.create("vs/editor/contrib/format/formatActions",e)}),define(Q[479],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoError/gotoError",e)}),define(Q[480],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoError/gotoErrorWidget",e)}),define(Q[481],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/goToCommands",e)}),define(Q[482],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition",e)}),define(Q[483],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/peek/referencesController",e)}),define(Q[484],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/peek/referencesTree",e)}),define(Q[485],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/peek/referencesWidget",e)}),define(Q[486],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/referencesModel",e)}),define(Q[132],J([0,1,486,6,44,2,8,119,3,51,12]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReferencesModel=e.FileReferences=e.FilePreview=e.OneReference=void 0;class c{constructor(r,i,n,t,l){this.isProviderFirst=r,this.parent=i,this.uri=n,this._range=t,this._rangeCallback=l,this.id=C.defaultGenerator.nextId()}get range(){return this._range}set range(r){this._range=r,this._rangeCallback(this)}get ariaMessage(){var r;const i=(r=this.parent.getPreview(this))===null||r===void 0?void 0:r.preview(this.range);return i?b.localize(1,null,M.basename(this.uri),this.range.startLineNumber,this.range.startColumn,i.value):b.localize(0,null,M.basename(this.uri),this.range.startLineNumber,this.range.startColumn)}}e.OneReference=c;class o{constructor(r){this._modelReference=r}dispose(){this._modelReference.dispose()}preview(r,i=8){const n=this._modelReference.object.textEditorModel;if(!!n){const{startLineNumber:t,startColumn:l,endLineNumber:h,endColumn:m}=r,_=n.getWordUntilPosition({lineNumber:t,column:l-i}),f=new d.Range(t,_.startColumn,t,l),v=new d.Range(h,m,h,1073741824),y=n.getValueInRange(f).replace(/^\s+/,""),L=n.getValueInRange(r),I=n.getValueInRange(v).replace(/\s+$/,"");return{value:y+L+I,highlight:{start:y.length,end:y.length+L.length}}}}}e.FilePreview=o;class s{constructor(r,i){this.parent=r,this.uri=i,this.children=[],this._previews=new g.ResourceMap}dispose(){w.dispose(this._previews.values()),this._previews.clear()}getPreview(r){return this._previews.get(r.uri)}get ariaMessage(){const r=this.children.length;return r===1?b.localize(2,null,M.basename(this.uri),this.uri.fsPath):b.localize(3,null,r,M.basename(this.uri),this.uri.fsPath)}resolve(r){return Ie(this,void 0,void 0,function*(){if(this._previews.size!==0)return this;for(let i of this.children)if(!this._previews.has(i.uri))try{const n=yield r.createModelReference(i.uri);this._previews.set(i.uri,new o(n))}catch(n){p.onUnexpectedError(n)}return this})}}e.FileReferences=s;class a{constructor(r,i){this.groups=[],this.references=[],this._onDidChangeReferenceRange=new N.Emitter,this.onDidChangeReferenceRange=this._onDidChangeReferenceRange.event,this._links=r,this._title=i;const[n]=r;r.sort(a._compareReferences);let t;for(let l of r)if((!t||!M.extUri.isEqual(t.uri,l.uri,!0))&&(t=new s(this,l.uri),this.groups.push(t)),t.children.length===0||a._compareReferences(l,t.children[t.children.length-1])!==0){const h=new c(n===l,t,l.uri,l.targetSelectionRange||l.range,m=>this._onDidChangeReferenceRange.fire(m));this.references.push(h),t.children.push(h)}}dispose(){w.dispose(this.groups),this._onDidChangeReferenceRange.dispose(),this.groups.length=0}clone(){return new a(this._links,this._title)}get title(){return this._title}get isEmpty(){return this.groups.length===0}get ariaMessage(){return this.isEmpty?b.localize(4,null):this.references.length===1?b.localize(5,null,this.references[0].uri.fsPath):this.groups.length===1?b.localize(6,null,this.references.length,this.groups[0].uri.fsPath):b.localize(7,null,this.references.length,this.groups.length)}nextOrPreviousReference(r,i){let{parent:n}=r,t=n.children.indexOf(r),l=n.children.length,h=n.parent.groups.length;return h===1||i&&t+10?(i?t=(t+1)%l:t=(t+l-1)%l,n.children[t]):(t=n.parent.groups.indexOf(n),i?(t=(t+1)%h,n.parent.groups[t].children[0]):(t=(t+h-1)%h,n.parent.groups[t].children[n.parent.groups[t].children.length-1]))}nearestReference(r,i){const n=this.references.map((t,l)=>({idx:l,prefixLen:S.commonPrefixLength(t.uri.toString(),r.toString()),offsetDist:Math.abs(t.range.startLineNumber-i.lineNumber)*100+Math.abs(t.range.startColumn-i.column)})).sort((t,l)=>t.prefixLen>l.prefixLen?-1:t.prefixLenl.offsetDist?1:0)[0];if(n)return this.references[n.idx]}referenceAt(r,i){for(const n of this.references)if(n.uri.toString()===r.toString()&&d.Range.containsPosition(n.range,i))return n}firstReference(){for(const r of this.references)if(r.isProviderFirst)return r;return this.references[0]}static _compareReferences(r,i){return M.extUri.compare(r.uri,i.uri)||d.Range.compareRangesUsingStarts(r.range,i.range)}}e.ReferencesModel=a}),define(Q[487],J([4,5]),function(q,e){return q.create("vs/editor/contrib/gotoSymbol/symbolNavigation",e)}),define(Q[488],J([4,5]),function(q,e){return q.create("vs/editor/contrib/hover/hover",e)}),define(Q[489],J([4,5]),function(q,e){return q.create("vs/editor/contrib/hover/markdownHoverParticipant",e)}),define(Q[490],J([4,5]),function(q,e){return q.create("vs/editor/contrib/hover/markerHoverParticipant",e)}),define(Q[491],J([4,5]),function(q,e){return q.create("vs/editor/contrib/inPlaceReplace/inPlaceReplace",e)}),define(Q[492],J([4,5]),function(q,e){return q.create("vs/editor/contrib/indentation/indentation",e)}),define(Q[493],J([4,5]),function(q,e){return q.create("vs/editor/contrib/linesOperations/linesOperations",e)}),define(Q[494],J([4,5]),function(q,e){return q.create("vs/editor/contrib/linkedEditing/linkedEditing",e)}),define(Q[495],J([4,5]),function(q,e){return q.create("vs/editor/contrib/links/links",e)}),define(Q[496],J([4,5]),function(q,e){return q.create("vs/editor/contrib/message/messageController",e)}),define(Q[497],J([4,5]),function(q,e){return q.create("vs/editor/contrib/multicursor/multicursor",e)}),define(Q[498],J([4,5]),function(q,e){return q.create("vs/editor/contrib/parameterHints/parameterHints",e)}),define(Q[499],J([4,5]),function(q,e){return q.create("vs/editor/contrib/parameterHints/parameterHintsWidget",e)}),define(Q[500],J([4,5]),function(q,e){return q.create("vs/editor/contrib/peekView/peekView",e)}),define(Q[501],J([4,5]),function(q,e){return q.create("vs/editor/contrib/quickAccess/gotoLineQuickAccess",e)}),define(Q[502],J([4,5]),function(q,e){return q.create("vs/editor/contrib/quickAccess/gotoSymbolQuickAccess",e)}),define(Q[503],J([4,5]),function(q,e){return q.create("vs/editor/contrib/rename/rename",e)}),define(Q[504],J([4,5]),function(q,e){return q.create("vs/editor/contrib/rename/renameInputField",e)}),define(Q[505],J([4,5]),function(q,e){return q.create("vs/editor/contrib/smartSelect/smartSelect",e)}),define(Q[506],J([4,5]),function(q,e){return q.create("vs/editor/contrib/snippet/snippetVariables",e)}),define(Q[507],J([4,5]),function(q,e){return q.create("vs/editor/contrib/suggest/suggestController",e)}),define(Q[508],J([4,5]),function(q,e){return q.create("vs/editor/contrib/suggest/suggestWidget",e)}),define(Q[509],J([4,5]),function(q,e){return q.create("vs/editor/contrib/suggest/suggestWidgetDetails",e)}),define(Q[510],J([4,5]),function(q,e){return q.create("vs/editor/contrib/suggest/suggestWidgetRenderer",e)}),define(Q[511],J([4,5]),function(q,e){return q.create("vs/editor/contrib/suggest/suggestWidgetStatus",e)}),define(Q[512],J([4,5]),function(q,e){return q.create("vs/editor/contrib/symbolIcons/symbolIcons",e)}),define(Q[513],J([4,5]),function(q,e){return q.create("vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode",e)}),define(Q[514],J([4,5]),function(q,e){return q.create("vs/editor/contrib/tokenization/tokenization",e)}),define(Q[515],J([4,5]),function(q,e){return q.create("vs/editor/contrib/unusualLineTerminators/unusualLineTerminators",e)}),define(Q[516],J([4,5]),function(q,e){return q.create("vs/editor/contrib/wordHighlighter/wordHighlighter",e)}),define(Q[517],J([4,5]),function(q,e){return q.create("vs/editor/contrib/wordOperations/wordOperations",e)}),define(Q[518],J([4,5]),function(q,e){return q.create("vs/platform/actions/browser/menuEntryActionViewItem",e)}),define(Q[519],J([4,5]),function(q,e){return q.create("vs/platform/configuration/common/configurationRegistry",e)}),define(Q[520],J([4,5]),function(q,e){return q.create("vs/platform/contextkey/browser/contextKeyService",e)}),define(Q[521],J([4,5]),function(q,e){return q.create("vs/platform/contextkey/common/contextkeys",e)}),define(Q[522],J([4,5]),function(q,e){return q.create("vs/platform/keybinding/common/abstractKeybindingService",e)}),define(Q[523],J([4,5]),function(q,e){return q.create("vs/platform/list/browser/listService",e)}),define(Q[524],J([4,5]),function(q,e){return q.create("vs/platform/markers/common/markers",e)}),define(Q[525],J([4,5]),function(q,e){return q.create("vs/platform/quickinput/browser/commandsQuickAccess",e)}),define(Q[526],J([4,5]),function(q,e){return q.create("vs/platform/quickinput/browser/helpQuickAccess",e)}),define(Q[527],J([4,5]),function(q,e){return q.create("vs/platform/theme/common/colorRegistry",e)}),define(Q[528],J([4,5]),function(q,e){return q.create("vs/platform/theme/common/iconRegistry",e)}),define(Q[529],J([4,5]),function(q,e){return q.create("vs/platform/undoRedo/common/undoRedoService",e)}),define(Q[530],J([0,1,7]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BrowserClipboardService=void 0;class N{constructor(){this.mapTextToType=new Map,this.findText=""}writeText(w,S){return Ie(this,void 0,void 0,function*(){if(S){this.mapTextToType.set(S,w);return}try{return yield navigator.clipboard.writeText(w)}catch(g){console.error(g)}const C=document.activeElement,d=document.body.appendChild(b.$("textarea",{"aria-hidden":!0}));d.style.height="1px",d.style.width="1px",d.style.position="absolute",d.value=w,d.focus(),d.select(),document.execCommand("copy"),C instanceof HTMLElement&&C.focus(),document.body.removeChild(d)})}readText(w){return Ie(this,void 0,void 0,function*(){if(w)return this.mapTextToType.get(w)||"";try{return yield navigator.clipboard.readText()}catch(S){return console.error(S),""}})}readFindText(){return Ie(this,void 0,void 0,function*(){return this.findText})}writeFindText(w){return Ie(this,void 0,void 0,function*(){this.findText=w})}}e.BrowserClipboardService=N}),define(Q[531],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorOpenContext=void 0;var b;(function(N){N[N.API=0]="API",N[N.USER=1]="USER"})(b=e.EditorOpenContext||(e.EditorOpenContext={}))}),define(Q[532],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ExtensionIdentifier=void 0;class b{constructor(M){this.value=M,this._lower=M.toLowerCase()}static toKey(M){return typeof M=="string"?M.toLowerCase():M._lower}}e.ExtensionIdentifier=b}),define(Q[237],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FileKind=void 0;var b;(function(N){N[N.FILE=0]="FILE",N[N.FOLDER=1]="FOLDER",N[N.ROOT_FOLDER=2]="ROOT_FOLDER"})(b=e.FileKind||(e.FileKind={}))}),define(Q[238],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SyncDescriptor=void 0;class b{constructor(M,w=[],S=!1){this.ctor=M,this.staticArguments=w,this.supportsDelayedInstantiation=S}}e.SyncDescriptor=b}),define(Q[74],J([0,1,238]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getSingletonServiceDescriptors=e.registerSingleton=void 0;const N=[];function M(S,C,d){C instanceof b.SyncDescriptor||(C=new b.SyncDescriptor(C,[],d)),N.push([S,C])}e.registerSingleton=M;function w(){return N}e.getSingletonServiceDescriptors=w}),define(Q[533],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Graph=e.Node=void 0;class b{constructor(w){this.incoming=new Map,this.outgoing=new Map,this.data=w}}e.Node=b;class N{constructor(w){this._hashFn=w,this._nodes=new Map}roots(){const w=[];for(let S of this._nodes.values())S.outgoing.size===0&&w.push(S);return w}insertEdge(w,S){const C=this.lookupOrInsertNode(w),d=this.lookupOrInsertNode(S);C.outgoing.set(this._hashFn(S),d),d.incoming.set(this._hashFn(w),C)}removeNode(w){const S=this._hashFn(w);this._nodes.delete(S);for(let C of this._nodes.values())C.outgoing.delete(S),C.incoming.delete(S)}lookupOrInsertNode(w){const S=this._hashFn(w);let C=this._nodes.get(S);return C||(C=new b(w),this._nodes.set(S,C)),C}isEmpty(){return this._nodes.size===0}toString(){let w=[];for(let[S,C]of this._nodes)w.push(`${S}, (incoming)[${[...C.incoming.keys()].join(", ")}], (outgoing)[${[...C.outgoing.keys()].join(",")}]`);return w.join(` +`)}}e.Graph=N}),define(Q[9],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.optional=e.createDecorator=e.IInstantiationService=e._util=void 0;var b;(function(S){S.serviceIds=new Map,S.DI_TARGET="$di$target",S.DI_DEPENDENCIES="$di$dependencies";function C(d){return d[S.DI_DEPENDENCIES]||[]}S.getServiceDependencies=C})(b=e._util||(e._util={})),e.IInstantiationService=M("instantiationService");function N(S,C,d,g){C[b.DI_TARGET]===C?C[b.DI_DEPENDENCIES].push({id:S,index:d,optional:g}):(C[b.DI_DEPENDENCIES]=[{id:S,index:d,optional:g}],C[b.DI_TARGET]=C)}function M(S){if(b.serviceIds.has(S))return b.serviceIds.get(S);const C=function(d,g,p){if(arguments.length!==3)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");N(C,d,p,!1)};return C.toString=()=>S,b.serviceIds.set(S,C),C}e.createDecorator=M;function w(S){return function(C,d,g){if(arguments.length!==3)throw new Error("@optional-decorator can only be used to decorate a parameter");N(S,C,g,!0)}}e.optional=w}),define(Q[133],J([0,1,9,24,20]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ResourceFileEdit=e.ResourceTextEdit=e.ResourceEdit=e.IBulkEditService=void 0,e.IBulkEditService=b.createDecorator("IWorkspaceEditService");function w(p){return M.isObject(p)&&(Boolean(p.newUri)||Boolean(p.oldUri))}function S(p){return M.isObject(p)&&N.URI.isUri(p.resource)&&M.isObject(p.edit)}class C{constructor(c){this.metadata=c}static convert(c){return c.edits.map(o=>{if(S(o))return new d(o.resource,o.edit,o.modelVersionId,o.metadata);if(w(o))return new g(o.oldUri,o.newUri,o.options,o.metadata);throw new Error("Unsupported edit")})}}e.ResourceEdit=C;class d extends C{constructor(c,o,s,a){super(a);this.resource=c,this.textEdit=o,this.versionId=s,this.metadata=a}}e.ResourceTextEdit=d;class g extends C{constructor(c,o,s,a){super(a);this.oldResource=c,this.newResource=o,this.options=s,this.metadata=a}}e.ResourceFileEdit=g}),define(Q[28],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ICodeEditorService=void 0,e.ICodeEditorService=b.createDecorator("codeEditorService")}),define(Q[75],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IEditorWorkerService=e.ID_EDITOR_WORKER_SERVICE=void 0,e.ID_EDITOR_WORKER_SERVICE="editorWorkerService",e.IEditorWorkerService=b.createDecorator(e.ID_EDITOR_WORKER_SERVICE)}),define(Q[178],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IMarkerDecorationsService=void 0,e.IMarkerDecorationsService=b.createDecorator("markerDecorationsService")}),define(Q[57],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IModeService=void 0,e.IModeService=b.createDecorator("modeService")}),define(Q[36],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.shouldSynchronizeModel=e.IModelService=void 0,e.IModelService=b.createDecorator("modelService");function N(M){return!M.isTooLargeForSyncing()&&!M.isForSimpleWidget}e.shouldSynchronizeModel=N}),define(Q[134],J([0,1,6,89,2,51,100,374,36]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguageFeatureRequestDelays=e.LanguageFeatureRegistry=void 0;function g(o){return typeof o=="string"?!1:Array.isArray(o)?o.every(g):!!o.exclusive}class p{constructor(){this._clock=0,this._entries=[],this._onDidChange=new b.Emitter}get onDidChange(){return this._onDidChange.event}register(s,a){let u={selector:s,provider:a,_score:-1,_time:this._clock++};return this._entries.push(u),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),M.toDisposable(()=>{if(u){let r=this._entries.indexOf(u);r>=0&&(this._entries.splice(r,1),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),u=void 0)}})}has(s){return this.all(s).length>0}all(s){if(!s)return[];this._updateScores(s);const a=[];for(let u of this._entries)u._score>0&&a.push(u.provider);return a}ordered(s){const a=[];return this._orderedForEach(s,u=>a.push(u.provider)),a}orderedGroups(s){const a=[];let u,r;return this._orderedForEach(s,i=>{u&&r===i._score?u.push(i.provider):(r=i._score,u=[i.provider],a.push(u))}),a}_orderedForEach(s,a){if(!!s){this._updateScores(s);for(const u of this._entries)u._score>0&&a(u)}}_updateScores(s){let a={uri:s.uri.toString(),language:s.getLanguageIdentifier().language};if(!(this._lastCandidate&&this._lastCandidate.language===a.language&&this._lastCandidate.uri===a.uri)){this._lastCandidate=a;for(let u of this._entries)if(u._score=C.score(u.selector,s.uri,s.getLanguageIdentifier().language,d.shouldSynchronizeModel(s)),g(u.selector)&&u._score>0){for(let r of this._entries)r._score=0;u._score=1e3;break}this._entries.sort(p._compareByScoreAndTime)}}static _compareByScoreAndTime(s,a){return s._scorea._score?-1:s._timea._time?-1:0}}e.LanguageFeatureRegistry=p;class c{constructor(s,a,u=Number.MAX_SAFE_INTEGER){this._registry=s,this.min=a,this.max=u,this._cache=new w.LRUCache(50,.7)}_key(s){return s.id+N.hash(this._registry.all(s))}_clamp(s){return s===void 0?this.min:Math.min(this.max,Math.max(this.min,Math.floor(s*1.3)))}get(s){const a=this._key(s),u=this._cache.get(a);return this._clamp(u==null?void 0:u.value)}update(s,a){const u=this._key(s);let r=this._cache.get(u);return r||(r=new S.MovingAverage,this._cache.set(u,r)),r.update(a),this.get(s)}}e.LanguageFeatureRequestDelays=c}),define(Q[18],J([0,1,24,3,134,382,27]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TokenizationRegistry=e.DocumentRangeSemanticTokensProviderRegistry=e.DocumentSemanticTokensProviderRegistry=e.FoldingRangeProviderRegistry=e.SelectionRangeRegistry=e.ColorProviderRegistry=e.LinkProviderRegistry=e.OnTypeFormattingEditProviderRegistry=e.DocumentRangeFormattingEditProviderRegistry=e.DocumentFormattingEditProviderRegistry=e.CodeActionProviderRegistry=e.InlineHintsProviderRegistry=e.CodeLensProviderRegistry=e.TypeDefinitionProviderRegistry=e.ImplementationProviderRegistry=e.DeclarationProviderRegistry=e.DefinitionProviderRegistry=e.LinkedEditingRangeProviderRegistry=e.DocumentHighlightProviderRegistry=e.DocumentSymbolProviderRegistry=e.HoverProviderRegistry=e.SignatureHelpProviderRegistry=e.CompletionProviderRegistry=e.RenameProviderRegistry=e.ReferenceProviderRegistry=e.InlineHintKind=e.FoldingRangeKind=e.SymbolKinds=e.isLocationLink=e.DocumentHighlightKind=e.SignatureHelpTriggerKind=e.completionKindFromString=e.completionKindToCssClass=e.TokenMetadata=e.LanguageIdentifier=void 0;class C{constructor(r,i){this.language=r,this.id=i}}e.LanguageIdentifier=C;class d{static getLanguageId(r){return(r&255)>>>0}static getTokenType(r){return(r&1792)>>>8}static getFontStyle(r){return(r&14336)>>>11}static getForeground(r){return(r&8372224)>>>14}static getBackground(r){return(r&4286578688)>>>23}static getClassNameFromMetadata(r){let i=this.getForeground(r),n="mtk"+i,t=this.getFontStyle(r);return t&1&&(n+=" mtki"),t&2&&(n+=" mtkb"),t&4&&(n+=" mtku"),n}static getInlineStyleFromMetadata(r,i){const n=this.getForeground(r),t=this.getFontStyle(r);let l=`color: ${i[n]};`;return t&1&&(l+="font-style: italic;"),t&2&&(l+="font-weight: bold;"),t&4&&(l+="text-decoration: underline;"),l}}e.TokenMetadata=d,e.completionKindToCssClass=function(){let u=Object.create(null);return u[0]="symbol-method",u[1]="symbol-function",u[2]="symbol-constructor",u[3]="symbol-field",u[4]="symbol-variable",u[5]="symbol-class",u[6]="symbol-struct",u[7]="symbol-interface",u[8]="symbol-module",u[9]="symbol-property",u[10]="symbol-event",u[11]="symbol-operator",u[12]="symbol-unit",u[13]="symbol-value",u[14]="symbol-constant",u[15]="symbol-enum",u[16]="symbol-enum-member",u[17]="symbol-keyword",u[27]="symbol-snippet",u[18]="symbol-text",u[19]="symbol-color",u[20]="symbol-file",u[21]="symbol-reference",u[22]="symbol-customcolor",u[23]="symbol-folder",u[24]="symbol-type-parameter",u[25]="account",u[26]="issues",function(r){const i=u[r];let n=i&&S.iconRegistry.get(i);return n||(console.info("No codicon found for CompletionItemKind "+r),n=S.Codicon.symbolProperty),n.classNames}}(),e.completionKindFromString=function(){let u=Object.create(null);return u.method=0,u.function=1,u.constructor=2,u.field=3,u.variable=4,u.class=5,u.struct=6,u.interface=7,u.module=8,u.property=9,u.event=10,u.operator=11,u.unit=12,u.value=13,u.constant=14,u.enum=15,u["enum-member"]=16,u.enumMember=16,u.keyword=17,u.snippet=27,u.text=18,u.color=19,u.file=20,u.reference=21,u.customcolor=22,u.folder=23,u["type-parameter"]=24,u.typeParameter=24,u.account=25,u.issue=26,function(r,i){let n=u[r];return typeof n=="undefined"&&!i&&(n=9),n}}();var g;(function(u){u[u.Invoke=1]="Invoke",u[u.TriggerCharacter=2]="TriggerCharacter",u[u.ContentChange=3]="ContentChange"})(g=e.SignatureHelpTriggerKind||(e.SignatureHelpTriggerKind={}));var p;(function(u){u[u.Text=0]="Text",u[u.Read=1]="Read",u[u.Write=2]="Write"})(p=e.DocumentHighlightKind||(e.DocumentHighlightKind={}));function c(u){return u&&b.URI.isUri(u.uri)&&N.Range.isIRange(u.range)&&(N.Range.isIRange(u.originSelectionRange)||N.Range.isIRange(u.targetSelectionRange))}e.isLocationLink=c;var o;(function(u){const r=new Map;r.set("file",0),r.set("module",1),r.set("namespace",2),r.set("package",3),r.set("class",4),r.set("method",5),r.set("property",6),r.set("field",7),r.set("constructor",8),r.set("enum",9),r.set("interface",10),r.set("function",11),r.set("variable",12),r.set("constant",13),r.set("string",14),r.set("number",15),r.set("boolean",16),r.set("array",17),r.set("object",18),r.set("key",19),r.set("null",20),r.set("enum-member",21),r.set("struct",22),r.set("event",23),r.set("operator",24),r.set("type-parameter",25);const i=new Map;i.set(0,"file"),i.set(1,"module"),i.set(2,"namespace"),i.set(3,"package"),i.set(4,"class"),i.set(5,"method"),i.set(6,"property"),i.set(7,"field"),i.set(8,"constructor"),i.set(9,"enum"),i.set(10,"interface"),i.set(11,"function"),i.set(12,"variable"),i.set(13,"constant"),i.set(14,"string"),i.set(15,"number"),i.set(16,"boolean"),i.set(17,"array"),i.set(18,"object"),i.set(19,"key"),i.set(20,"null"),i.set(21,"enum-member"),i.set(22,"struct"),i.set(23,"event"),i.set(24,"operator"),i.set(25,"type-parameter");function n(h){return r.get(h)}u.fromString=n;function t(h){return i.get(h)}u.toString=t;function l(h,m){const _=i.get(h);let f=_&&S.iconRegistry.get("symbol-"+_);return f||(console.info("No codicon found for SymbolKind "+h),f=S.Codicon.symbolProperty),`${m?"inline":"block"} ${f.classNames}`}u.toCssClassName=l})(o=e.SymbolKinds||(e.SymbolKinds={}));class s{constructor(r){this.value=r}}e.FoldingRangeKind=s,s.Comment=new s("comment"),s.Imports=new s("imports"),s.Region=new s("region");var a;(function(u){u[u.Other=0]="Other",u[u.Type=1]="Type",u[u.Parameter=2]="Parameter"})(a=e.InlineHintKind||(e.InlineHintKind={})),e.ReferenceProviderRegistry=new M.LanguageFeatureRegistry,e.RenameProviderRegistry=new M.LanguageFeatureRegistry,e.CompletionProviderRegistry=new M.LanguageFeatureRegistry,e.SignatureHelpProviderRegistry=new M.LanguageFeatureRegistry,e.HoverProviderRegistry=new M.LanguageFeatureRegistry,e.DocumentSymbolProviderRegistry=new M.LanguageFeatureRegistry,e.DocumentHighlightProviderRegistry=new M.LanguageFeatureRegistry,e.LinkedEditingRangeProviderRegistry=new M.LanguageFeatureRegistry,e.DefinitionProviderRegistry=new M.LanguageFeatureRegistry,e.DeclarationProviderRegistry=new M.LanguageFeatureRegistry,e.ImplementationProviderRegistry=new M.LanguageFeatureRegistry,e.TypeDefinitionProviderRegistry=new M.LanguageFeatureRegistry,e.CodeLensProviderRegistry=new M.LanguageFeatureRegistry,e.InlineHintsProviderRegistry=new M.LanguageFeatureRegistry,e.CodeActionProviderRegistry=new M.LanguageFeatureRegistry,e.DocumentFormattingEditProviderRegistry=new M.LanguageFeatureRegistry,e.DocumentRangeFormattingEditProviderRegistry=new M.LanguageFeatureRegistry,e.OnTypeFormattingEditProviderRegistry=new M.LanguageFeatureRegistry,e.LinkProviderRegistry=new M.LanguageFeatureRegistry,e.ColorProviderRegistry=new M.LanguageFeatureRegistry,e.SelectionRangeRegistry=new M.LanguageFeatureRegistry,e.FoldingRangeProviderRegistry=new M.LanguageFeatureRegistry,e.DocumentSemanticTokensProviderRegistry=new M.LanguageFeatureRegistry,e.DocumentRangeSemanticTokensProviderRegistry=new M.LanguageFeatureRegistry,e.TokenizationRegistry=new w.TokenizationRegistryImpl}),define(Q[113],J([0,1,18]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SlicedLineTokens=e.LineTokens=void 0;class N{constructor(S,C){this._tokens=S,this._tokensCount=this._tokens.length>>>1,this._text=C}equals(S){return S instanceof N?this.slicedEquals(S,0,this._tokensCount):!1}slicedEquals(S,C,d){if(this._text!==S._text||this._tokensCount!==S._tokensCount)return!1;const g=C<<1,p=g+(d<<1);for(let c=g;c0?this._tokens[S-1<<1]:0}getMetadata(S){return this._tokens[(S<<1)+1]}getLanguageId(S){const C=this._tokens[(S<<1)+1];return b.TokenMetadata.getLanguageId(C)}getStandardTokenType(S){const C=this._tokens[(S<<1)+1];return b.TokenMetadata.getTokenType(C)}getForeground(S){const C=this._tokens[(S<<1)+1];return b.TokenMetadata.getForeground(C)}getClassName(S){const C=this._tokens[(S<<1)+1];return b.TokenMetadata.getClassNameFromMetadata(C)}getInlineStyle(S,C){const d=this._tokens[(S<<1)+1];return b.TokenMetadata.getInlineStyleFromMetadata(d,C)}getEndOffset(S){return this._tokens[S<<1]}findTokenIndexAtOffset(S){return N.findIndexInTokensArray(this._tokens,S)}inflate(){return this}sliceAndInflate(S,C,d){return new M(this,S,C,d)}static convertToEndOffset(S,C){const g=(S.length>>>1)-1;for(let p=0;p>>1)-1;for(;dC&&(g=p)}return d}}e.LineTokens=N;class M{constructor(S,C,d,g){this._source=S,this._startOffset=C,this._endOffset=d,this._deltaOffset=g,this._firstTokenIndex=S.findTokenIndexAtOffset(C),this._tokensCount=0;for(let p=this._firstTokenIndex,c=S.getCount();p=d);p++)this._tokensCount++}equals(S){return S instanceof M?this._startOffset===S._startOffset&&this._endOffset===S._endOffset&&this._deltaOffset===S._deltaOffset&&this._source.slicedEquals(S._source,this._firstTokenIndex,this._tokensCount):!1}getCount(){return this._tokensCount}getForeground(S){return this._source.getForeground(this._firstTokenIndex+S)}getEndOffset(S){const C=this._source.getEndOffset(this._firstTokenIndex+S);return Math.min(this._endOffset,C)-this._startOffset+this._deltaOffset}getClassName(S){return this._source.getClassName(this._firstTokenIndex+S)}getInlineStyle(S,C){return this._source.getInlineStyle(this._firstTokenIndex+S,C)}findTokenIndexAtOffset(S){return this._source.findTokenIndexAtOffset(S+this._startOffset-this._deltaOffset)-this._firstTokenIndex}}e.SlicedLineTokens=M}),define(Q[135],J([0,1,19,113,14,3,18]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TokensStore=e.TokensStore2=e.MultilineTokens=e.MultilineTokens2=e.LineTokens2=e.SparseEncodedTokens=e.MultilineTokensBuilder=e.countEOL=void 0;function C(n){let t=0,l=0,h=0,m=0;for(let _=0,f=n.length;_>>0}const g=new Uint32Array(0).buffer;class p{constructor(){this.tokens=[]}add(t,l){if(this.tokens.length>0){const h=this.tokens[this.tokens.length-1];if(h.startLineNumber+h.tokens.length-1+1===t){h.tokens.push(l);return}}this.tokens.push(new a(t,[l]))}}e.MultilineTokensBuilder=p;class c{constructor(t){this._tokens=t,this._tokenCount=t.length/4}toString(t){let l=[];for(let h=0;ht)h=m-1;else{let f=m;for(;f>l&&this._getDeltaLine(f-1)===t;)f--;let v=m;for(;vt||E===t&&O>=l)&&(Et||O===t&&B>=l){if(O_?A-=_-h:A=h;else if(T===l&&O===h)if(T===m&&A>_)A-=_-h;else{I=!0;continue}else if(T_)T===l?(O=h,A=O+(A-_)):(O=0,A=O+(A-_));else{I=!0;continue}else if(T>m){if(y===0&&!I){L=v;break}T-=y}else if(T===m&&O>=_)t&&T===0&&(O+=t,A+=t),T-=y,O-=_-h,A-=_-h;else throw new Error("Not possible!");const F=4*L;f[F]=T,f[F+1]=O,f[F+2]=A,f[F+3]=B,L++}this._tokenCount=L}acceptInsertText(t,l,h,m,_,f){const v=h===0&&m===1&&(f>=48&&f<=57||f>=65&&f<=90||f>=97&&f<=122),y=this._tokens,L=this._tokenCount;for(let I=0;I0?l.charCodeAt(0):0)}acceptEdit(t,l,h,m,_){this._acceptDeleteRange(t),this._acceptInsertText(new M.Position(t.startLineNumber,t.startColumn),l,h,m,_),this._updateEndLineNumber()}_acceptDeleteRange(t){if(!(t.startLineNumber===t.endLineNumber&&t.startColumn===t.endColumn)){const l=t.startLineNumber-this.startLineNumber,h=t.endLineNumber-this.startLineNumber;if(h<0){const _=h-l;this.startLineNumber-=_;return}const m=this.tokens.getMaxDeltaLine();if(!(l>=m+1)){if(l<0&&h>=m+1){this.startLineNumber=0,this.tokens.clear();return}if(l<0){const _=-l;this.startLineNumber-=_,this.tokens.acceptDeleteRange(t.startColumn-1,0,0,h,t.endColumn-1)}else this.tokens.acceptDeleteRange(0,l,t.startColumn-1,h,t.endColumn-1)}}}_acceptInsertText(t,l,h,m,_){if(!(l===0&&h===0)){const f=t.lineNumber-this.startLineNumber;if(f<0){this.startLineNumber+=l;return}const v=this.tokens.getMaxDeltaLine();f>=v+1||this.tokens.acceptInsertText(f,t.column-1,l,h,m,_)}}}e.MultilineTokens2=s;class a{constructor(t,l){this.startLineNumber=t,this.tokens=l}}e.MultilineTokens=a;function u(n){return n instanceof Uint32Array?n:new Uint32Array(n)}class r{constructor(){this._pieces=[],this._isComplete=!1}flush(){this._pieces=[],this._isComplete=!1}isEmpty(){return this._pieces.length===0}set(t,l){this._pieces=t||[],this._isComplete=l}setPartial(t,l){let h=t;if(l.length>0){const _=l[0].getRange(),f=l[l.length-1].getRange();if(!_||!f)return t;h=t.plusRange(_).plusRange(f)}let m=null;for(let _=0,f=this._pieces.length;_h.endLineNumber){m=m||{index:_};break}if(v.removeTokens(h),v.isEmpty()){this._pieces.splice(_,1),_--,f--;continue}if(!(v.endLineNumberh.endLineNumber){m=m||{index:_};continue}const[y,L]=v.split(h);if(y.isEmpty()){m=m||{index:_};continue}L.isEmpty()||(this._pieces.splice(_,1,y,L),_++,f++,m=m||{index:_})}}}return m=m||{index:this._pieces.length},l.length>0&&(this._pieces=b.arrayInsert(this._pieces,m.index,l)),h}isComplete(){return this._isComplete}addSemanticTokens(t,l){const h=this._pieces;if(h.length===0)return l;const m=r._findFirstPieceWithLine(h,t),_=h[m].getLineTokens(t);if(!_)return l;const f=l.getCount(),v=_.getCount();let y=0,L=[],I=0,k=0;const E=(T,O)=>{T!==k&&(k=T,L[I++]=T,L[I++]=O)};for(let T=0;T>>0,D=~F>>>0;for(;yl)m=_-1;else{for(;_>h&&t[_-1].startLineNumber<=l&&l<=t[_-1].endLineNumber;)_--;return _}}return h}acceptEdit(t,l,h,m,_){for(const f of this._pieces)f.acceptEdit(t,l,h,m,_)}}e.TokensStore2=r;class i{constructor(){this._lineTokens=[],this._len=0}flush(){this._lineTokens=[],this._len=0}getTokens(t,l,h){let m=null;if(l1&&(_=S.TokenMetadata.getLanguageId(m[1])!==t),!_)return g}if(!m||m.length===0){const _=new Uint32Array(2);return _[0]=l,_[1]=d(t),_.buffer}return m[m.length-2]=l,m.byteOffset===0&&m.byteLength===m.buffer.byteLength?m.buffer:m}_ensureLine(t){for(;t>=this._len;)this._lineTokens[this._len]=null,this._len++}_deleteLines(t,l){l!==0&&(t+l>this._len&&(l=this._len-t),this._lineTokens.splice(t,l),this._len-=l)}_insertLines(t,l){if(l!==0){let h=[];for(let m=0;m=this._len)){if(t.startLineNumber===t.endLineNumber){if(t.startColumn===t.endColumn)return;this._lineTokens[l]=i._delete(this._lineTokens[l],t.startColumn-1,t.endColumn-1);return}this._lineTokens[l]=i._deleteEnding(this._lineTokens[l],t.startColumn-1);const h=t.endLineNumber-1;let m=null;h=this._len)){if(l===0){this._lineTokens[m]=i._insert(this._lineTokens[m],t.column-1,h);return}this._lineTokens[m]=i._deleteEnding(this._lineTokens[m],t.column-1),this._lineTokens[m]=i._insert(this._lineTokens[m],t.column-1,h),this._insertLines(t.lineNumber,l)}}}static _deleteBeginning(t,l){return t===null||t===g?t:i._delete(t,0,l)}static _deleteEnding(t,l){if(t===null||t===g)return t;const h=u(t),m=h[h.length-2];return i._delete(t,l,m)}static _delete(t,l,h){if(t===null||t===g||l===h)return t;const m=u(t),_=m.length>>>1;if(l===0&&m[m.length-2]===h)return g;const f=N.LineTokens.findIndexInTokensArray(m,l),v=f>0?m[f-1<<1]:0,y=m[f<<1];if(hI&&(m[L++]=O,m[L++]=m[(T<<1)+1],I=O)}if(L===m.length)return t;let E=new Uint32Array(L);return E.set(m.subarray(0,L),0),E.buffer}static _append(t,l){if(l===g)return t;if(t===g)return l;if(t===null)return t;if(l===null)return null;const h=u(t),m=u(l),_=m.length>>>1;let f=new Uint32Array(h.length+m.length);f.set(h,0);let v=h.length;const y=h[h.length-2];for(let L=0;L<_;L++)f[v++]=m[L<<1]+y,f[v++]=m[(L<<1)+1];return f.buffer}static _insert(t,l,h){if(t===null||t===g)return t;const m=u(t),_=m.length>>>1;let f=N.LineTokens.findIndexInTokensArray(m,l);f>0&&m[f-1<<1]===l&&f--;for(let v=f;v<_;v++)m[v<<1]+=h;return t}}e.TokensStore=i}),define(Q[239],J([0,1,6,8,3,53,219,135,218,2]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PieceTreeTextBuffer=void 0;class p extends g.Disposable{constructor(o,s,a,u,r,i,n){super();this._onDidChangeContent=this._register(new b.Emitter),this._BOM=s,this._mightContainNonBasicASCII=!i,this._mightContainRTL=u,this._mightContainUnusualLineTerminators=r,this._pieceTree=new S.PieceTreeBase(o,a,n)}mightContainRTL(){return this._mightContainRTL}mightContainUnusualLineTerminators(){return this._mightContainUnusualLineTerminators}resetMightContainUnusualLineTerminators(){this._mightContainUnusualLineTerminators=!1}mightContainNonBasicASCII(){return this._mightContainNonBasicASCII}getBOM(){return this._BOM}getEOL(){return this._pieceTree.getEOL()}createSnapshot(o){return this._pieceTree.createSnapshot(o?this._BOM:"")}getOffsetAt(o,s){return this._pieceTree.getOffsetAt(o,s)}getPositionAt(o){return this._pieceTree.getPositionAt(o)}getRangeAt(o,s){let a=o+s;const u=this.getPositionAt(o),r=this.getPositionAt(a);return new M.Range(u.lineNumber,u.column,r.lineNumber,r.column)}getValueInRange(o,s=0){if(o.isEmpty())return"";const a=this._getEndOfLine(s);return this._pieceTree.getValueInRange(o,a)}getValueLengthInRange(o,s=0){if(o.isEmpty())return 0;if(o.startLineNumber===o.endLineNumber)return o.endColumn-o.startColumn;let a=this.getOffsetAt(o.startLineNumber,o.startColumn);return this.getOffsetAt(o.endLineNumber,o.endColumn)-a}getCharacterCountInRange(o,s=0){if(this._mightContainNonBasicASCII){let a=0;const u=o.startLineNumber,r=o.endLineNumber;for(let i=u;i<=r;i++){const n=this.getLineContent(i),t=i===u?o.startColumn-1:0,l=i===r?o.endColumn-1:n.length;for(let h=t;hL.sortIndex-I.sortIndex)}this._mightContainRTL=u,this._mightContainUnusualLineTerminators=r,this._mightContainNonBasicASCII=i;const f=this._doApplyEdits(t);let v=null;if(s&&m.length>0){m.sort((y,L)=>L.lineNumber-y.lineNumber),v=[];for(let y=0,L=m.length;y0&&m[y-1].lineNumber===I)){let k=m[y].oldContent,E=this.getLineContent(I);E.length===0||E===k||N.firstNonWhitespaceIndex(E)!==-1||v.push(I)}}}return this._onDidChangeContent.fire(),new w.ApplyEditsResult(_,f,v)}_reduceOperations(o){return o.length<1e3?o:[this._toSingleEditOperation(o)]}_toSingleEditOperation(o){let s=!1;const a=o[0].range,u=o[o.length-1].range,r=new M.Range(a.startLineNumber,a.startColumn,u.endLineNumber,u.endColumn);let i=a.startLineNumber,n=a.startColumn;const t=[];for(let f=0,v=o.length;f0&&t.push(y.text),i=L.endLineNumber,n=L.endColumn}const l=t.join(""),[h,m,_]=C.countEOL(l);return{sortIndex:0,identifier:o[0].identifier,range:r,rangeOffset:this.getOffsetAt(r.startLineNumber,r.startColumn),rangeLength:this.getValueLengthInRange(r,0),text:l,eolCount:h,firstLineLength:m,lastLineLength:_,forceMoveMarkers:s,isAutoWhitespaceEdit:!1}}_doApplyEdits(o){o.sort(p._sortOpsDescending);let s=[];for(let a=0;a0){const _=t.eolCount+1;_===1?m=new M.Range(l,h,l,h+t.firstLineLength):m=new M.Range(l,h,l+_-1,t.lastLineLength+1)}else m=new M.Range(l,h,l,h);a=m.endLineNumber,u=m.endColumn,s.push(m),r=t}return s}static _sortOpsAscending(o,s){let a=M.Range.compareRangesUsingEnds(o.range,s.range);return a===0?o.sortIndex-s.sortIndex:a}static _sortOpsDescending(o,s){let a=M.Range.compareRangesUsingEnds(o.range,s.range);return a===0?s.sortIndex-o.sortIndex:-a}}e.PieceTreeTextBuffer=p}),define(Q[534],J([0,1,8,219,239]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PieceTreeTextBufferBuilder=e.PieceTreeTextBufferFactory=void 0;class w{constructor(d,g,p,c,o,s,a,u,r){this._chunks=d,this._bom=g,this._cr=p,this._lf=c,this._crlf=o,this._containsRTL=s,this._containsUnusualLineTerminators=a,this._isBasicASCII=u,this._normalizeEOL=r}_getEOL(d){const g=this._cr+this._lf+this._crlf,p=this._cr+this._crlf;return g===0?d===1?` +`:`\r +`:p>g/2?`\r +`:` +`}create(d){const g=this._getEOL(d);let p=this._chunks;if(this._normalizeEOL&&(g===`\r +`&&(this._cr>0||this._lf>0)||g===` +`&&(this._cr>0||this._crlf>0)))for(let o=0,s=p.length;o=55296&&g<=56319?(this._acceptChunk1(d.substr(0,d.length-1),!1),this._hasPreviousChar=!0,this._previousChar=g):(this._acceptChunk1(d,!1),this._hasPreviousChar=!1,this._previousChar=g)}}_acceptChunk1(d,g){!g&&d.length===0||(this._hasPreviousChar?this._acceptChunk2(String.fromCharCode(this._previousChar)+d):this._acceptChunk2(d))}_acceptChunk2(d){const g=N.createLineStarts(this._tmpLineStarts,d);this.chunks.push(new N.StringBuffer(d,g.lineStarts)),this.cr+=g.cr,this.lf+=g.lf,this.crlf+=g.crlf,this.isBasicASCII&&(this.isBasicASCII=g.isBasicASCII),!this.isBasicASCII&&!this.containsRTL&&(this.containsRTL=b.containsRTL(d)),!this.isBasicASCII&&!this.containsUnusualLineTerminators&&(this.containsUnusualLineTerminators=b.containsUnusualLineTerminators(d))}finish(d=!0){return this._finish(),new w(this.chunks,this.BOM,this.cr,this.lf,this.crlf,this.containsRTL,this.containsUnusualLineTerminators,this.isBasicASCII,d)}_finish(){if(this.chunks.length===0&&this._acceptChunk1("",!0),this._hasPreviousChar){this._hasPreviousChar=!1;let d=this.chunks[this.chunks.length-1];d.buffer+=String.fromCharCode(this._previousChar);let g=N.createLineStartsFast(d.buffer);d.lineStarts=g,this._previousChar===13&&this.cr++}}}e.PieceTreeTextBufferBuilder=S}),define(Q[76],J([0,1,127,18]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.nullTokenize2=e.nullTokenize=e.NULL_LANGUAGE_IDENTIFIER=e.NULL_MODE_ID=e.NULL_STATE=void 0;class M{clone(){return this}equals(d){return this===d}}e.NULL_STATE=new M,e.NULL_MODE_ID="vs.editor.nullMode",e.NULL_LANGUAGE_IDENTIFIER=new N.LanguageIdentifier(e.NULL_MODE_ID,0);function w(C,d,g,p){return new b.TokenizationResult([new b.Token(p,"",C)],g)}e.nullTokenize=w;function S(C,d,g,p){let c=new Uint32Array(2);return c[0]=p,c[1]=(C<<0|0<<8|0<<11|1<<14|2<<23)>>>0,new b.TokenizationResult2(c,g===null?e.NULL_STATE:g)}e.nullTokenize2=S}),define(Q[535],J([0,1,19,12,113,14,18,76,2,81,135,17]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextModelTokenization=e.TokenizationStateStore=void 0;class o{constructor(){this._beginState=[],this._valid=[],this._len=0,this._invalidLineStartIndex=0}_reset(i){this._beginState=[],this._valid=[],this._len=0,this._invalidLineStartIndex=0,i&&this._setBeginState(0,i)}flush(i){this._reset(i)}get invalidLineStartIndex(){return this._invalidLineStartIndex}_invalidateLine(i){i=this._len;)this._beginState[this._len]=null,this._valid[this._len]=!1,this._len++}_deleteLines(i,n){n!==0&&(i+n>this._len&&(n=this._len-i),this._beginState.splice(i,n),this._valid.splice(i,n),this._len-=n)}_insertLines(i,n){if(n!==0){let t=[],l=[];for(let h=0;h=0;m--)this._invalidateLine(i.startLineNumber+m-1);this._acceptDeleteRange(i),this._acceptInsertText(new w.Position(i.startLineNumber,i.startColumn),n)}_acceptDeleteRange(i){i.startLineNumber-1>=this._len||this._deleteLines(i.startLineNumber,i.endLineNumber-i.startLineNumber)}_acceptInsertText(i,n){i.lineNumber-1>=this._len||this._insertLines(i.lineNumber,n)}}e.TokenizationStateStore=o;class s extends d.Disposable{constructor(i){super();this._isDisposed=!1,this._textModel=i,this._tokenizationStateStore=new o,this._tokenizationSupport=null,this._register(S.TokenizationRegistry.onDidChange(n=>{const t=this._textModel.getLanguageIdentifier();n.changedLanguages.indexOf(t.language)!==-1&&(this._resetTokenizationState(),this._textModel.clearTokens())})),this._register(this._textModel.onDidChangeRawContentFast(n=>{if(n.containsEvent(1)){this._resetTokenizationState();return}})),this._register(this._textModel.onDidChangeContentFast(n=>{for(let t=0,l=n.changes.length;t{this._beginBackgroundTokenization()})),this._register(this._textModel.onDidChangeLanguage(()=>{this._resetTokenizationState(),this._textModel.clearTokens()})),this._resetTokenizationState()}dispose(){this._isDisposed=!0,super.dispose()}_resetTokenizationState(){const[i,n]=a(this._textModel);this._tokenizationSupport=i,this._tokenizationStateStore.flush(n),this._beginBackgroundTokenization()}_beginBackgroundTokenization(){this._textModel.isAttachedToEditor()&&this._hasLinesToTokenize()&&c.setImmediate(()=>{this._isDisposed||this._revalidateTokensNow()})}_revalidateTokensNow(i=this._textModel.getLineCount()){const n=1,t=new p.MultilineTokensBuilder,l=g.StopWatch.create(!1);for(;this._hasLinesToTokenize()&&!(l.elapsed()>n||this._tokenizeOneInvalidLine(t)>=i););this._beginBackgroundTokenization(),this._textModel.setTokens(t.tokens)}tokenizeViewport(i,n){const t=new p.MultilineTokensBuilder;this._tokenizeViewport(t,i,n),this._textModel.setTokens(t.tokens)}reset(){this._resetTokenizationState(),this._textModel.clearTokens()}forceTokenization(i){const n=new p.MultilineTokensBuilder;this._updateTokensUntilLine(n,i),this._textModel.setTokens(n.tokens)}isCheapToTokenize(i){if(!this._tokenizationSupport)return!0;const n=this._tokenizationStateStore.invalidLineStartIndex+1;return i>n?!1:i0&&v>=1;v--){let y=this._textModel.getLineFirstNonWhitespaceColumn(v);if(y!==0&&y=0;v--)f=u(_,this._tokenizationSupport,h[v],!1,f).endState;for(let v=n;v<=t;v++){let y=this._textModel.getLineContent(v),L=u(_,this._tokenizationSupport,y,!0,f);i.add(v,L.tokens),this._tokenizationStateStore.setFakeTokens(v-1),f=L.endState}}}}e.TextModelTokenization=s;function a(r){const i=r.getLanguageIdentifier();let n=r.isTooLargeForTokenization()?null:S.TokenizationRegistry.get(i.language),t=null;if(n)try{t=n.getInitialState()}catch(l){N.onUnexpectedError(l),n=null}return[n,t]}function u(r,i,n,t,l){let h=null;if(i)try{h=i.tokenize2(n,t,l.clone(),0)}catch(m){N.onUnexpectedError(m)}return h||(h=C.nullTokenize2(r.id,n,l,0)),M.LineTokens.convertToEndOffset(h.tokens,n.length),h}}),define(Q[31],J([0,1,12,6,2,8,24,38,14,3,21,53,236,369,370,534,372,166,535,128,41,76,167,168,135,29,239]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DidChangeContentEmitter=e.DidChangeDecorationsEmitter=e.ModelDecorationOptions=e.ModelDecorationMinimapOptions=e.ModelDecorationOverviewRulerOptions=e.TextModel=e.LONG_LINE_BOUNDARY=e.createTextBuffer=e.createTextBufferFactory=void 0;function L(){return new u.PieceTreeTextBufferBuilder}function I(z){const P=L();return P.acceptChunk(z),P.finish()}e.createTextBufferFactory=I;function k(z,P){return(typeof z=="string"?I(z):z).create(P)}e.createTextBuffer=k;let E=0;const T=999;e.LONG_LINE_BOUNDARY=1e4;class O{constructor(P){this._source=P,this._eos=!1}read(){if(this._eos)return null;let P=[],V=0,U=0;do{let H=this._source.read();if(H===null)return this._eos=!0,V===0?null:P.join("");if(H.length>0&&(P[V++]=H,U+=H.length),U>=64*1024)return P.join("")}while(!0)}}const A=()=>{throw new Error("Invalid change accessor")};class B{constructor(){this._searchCanceledBrand=void 0}}B.INSTANCE=new B;function F(z){return z instanceof B?null:z}class D extends M.Disposable{constructor(P,V,U,H=null,$){super();this._onWillDispose=this._register(new N.Emitter),this.onWillDispose=this._onWillDispose.event,this._onDidChangeDecorations=this._register(new le),this.onDidChangeDecorations=this._onDidChangeDecorations.event,this._onDidChangeLanguage=this._register(new N.Emitter),this.onDidChangeLanguage=this._onDidChangeLanguage.event,this._onDidChangeLanguageConfiguration=this._register(new N.Emitter),this.onDidChangeLanguageConfiguration=this._onDidChangeLanguageConfiguration.event,this._onDidChangeTokens=this._register(new N.Emitter),this.onDidChangeTokens=this._onDidChangeTokens.event,this._onDidChangeOptions=this._register(new N.Emitter),this.onDidChangeOptions=this._onDidChangeOptions.event,this._onDidChangeAttached=this._register(new N.Emitter),this.onDidChangeAttached=this._onDidChangeAttached.event,this._eventEmitter=this._register(new X),E++,this.id="$model"+E,this.isForSimpleWidget=V.isForSimpleWidget,typeof H=="undefined"||H===null?this._associatedResource=S.URI.parse("inmemory://model/"+E):this._associatedResource=H,this._undoRedoService=$,this._attachedEditorCount=0;const{textBuffer:ie,disposable:oe}=k(P,V.defaultEOL);this._buffer=ie,this._bufferDisposable=oe,this._options=D.resolveOptions(this._buffer,V);const ae=this._buffer.getLineCount(),G=this._buffer.getValueLengthInRange(new g.Range(1,1,ae,this._buffer.getLineLength(ae)+1),0);V.largeFileOptimizations?this._isTooLargeForTokenization=G>D.LARGE_FILE_SIZE_THRESHOLD||ae>D.LARGE_FILE_LINE_COUNT_THRESHOLD:this._isTooLargeForTokenization=!1,this._isTooLargeForSyncing=G>D.MODEL_SYNC_LIMIT,this._versionId=1,this._alternativeVersionId=1,this._initialUndoRedoSnapshot=null,this._isDisposed=!1,this._isDisposing=!1,this._languageIdentifier=U||h.NULL_LANGUAGE_IDENTIFIER,this._languageRegistryListener=l.LanguageConfigurationRegistry.onDidChange(j=>{j.languageIdentifier.id===this._languageIdentifier.id&&this._onDidChangeLanguageConfiguration.fire({})}),this._instanceId=w.singleLetterHash(E),this._lastDecorationId=0,this._decorations=Object.create(null),this._decorationsTree=new R,this._commandManager=new o.EditStack(this,$),this._isUndoing=!1,this._isRedoing=!1,this._trimAutoWhitespaceLines=null,this._tokens=new f.TokensStore,this._tokens2=new f.TokensStore2,this._tokenization=new n.TextModelTokenization(this)}static resolveOptions(P,V){if(V.detectIndentation){const U=s.guessIndentation(P,V.tabSize,V.insertSpaces);return new c.TextModelResolvedOptions({tabSize:U.tabSize,indentSize:U.tabSize,insertSpaces:U.insertSpaces,trimAutoWhitespace:V.trimAutoWhitespace,defaultEOL:V.defaultEOL})}return new c.TextModelResolvedOptions({tabSize:V.tabSize,indentSize:V.indentSize,insertSpaces:V.insertSpaces,trimAutoWhitespace:V.trimAutoWhitespace,defaultEOL:V.defaultEOL})}onDidChangeRawContentFast(P){return this._eventEmitter.fastEvent(V=>P(V.rawContentChangedEvent))}onDidChangeContentFast(P){return this._eventEmitter.fastEvent(V=>P(V.contentChangedEvent))}onDidChangeContent(P){return this._eventEmitter.slowEvent(V=>P(V.contentChangedEvent))}dispose(){this._isDisposing=!0,this._onWillDispose.fire(),this._languageRegistryListener.dispose(),this._tokenization.dispose(),this._isDisposed=!0,super.dispose(),this._bufferDisposable.dispose(),this._isDisposing=!1;const P=new y.PieceTreeTextBuffer([],"",` +`,!1,!1,!0,!0);P.dispose(),this._buffer=P}_assertNotDisposed(){if(this._isDisposed)throw new Error("Model is disposed!")}_emitContentChangedEvent(P,V){this._isDisposing||this._eventEmitter.fire(new r.InternalModelContentChangeEvent(P,V))}setValue(P){if(this._assertNotDisposed(),P!==null){const{textBuffer:V,disposable:U}=k(P,this._options.defaultEOL);this._setValueFromTextBuffer(V,U)}}_createContentChanged2(P,V,U,H,$,ie,oe){return{changes:[{range:P,rangeOffset:V,rangeLength:U,text:H}],eol:this._buffer.getEOL(),versionId:this.getVersionId(),isUndoing:$,isRedoing:ie,isFlush:oe}}_setValueFromTextBuffer(P,V){this._assertNotDisposed();const U=this.getFullModelRange(),H=this.getValueLengthInRange(U),$=this.getLineCount(),ie=this.getLineMaxColumn($);this._buffer=P,this._bufferDisposable.dispose(),this._bufferDisposable=V,this._increaseVersionId(),this._tokens.flush(),this._tokens2.flush(),this._decorations=Object.create(null),this._decorationsTree=new R,this._commandManager.clear(),this._trimAutoWhitespaceLines=null,this._emitContentChangedEvent(new r.ModelRawContentChangedEvent([new r.ModelRawFlush],this._versionId,!1,!1),this._createContentChanged2(new g.Range(1,1,$,ie),0,H,this.getValue(),!1,!1,!0))}setEOL(P){this._assertNotDisposed();const V=P===1?`\r +`:` +`;if(this._buffer.getEOL()!==V){const U=this.getFullModelRange(),H=this.getValueLengthInRange(U),$=this.getLineCount(),ie=this.getLineMaxColumn($);this._onBeforeEOLChange(),this._buffer.setEOL(V),this._increaseVersionId(),this._onAfterEOLChange(),this._emitContentChangedEvent(new r.ModelRawContentChangedEvent([new r.ModelRawEOLChanged],this._versionId,!1,!1),this._createContentChanged2(new g.Range(1,1,$,ie),0,H,this.getValue(),!1,!1,!1))}}_onBeforeEOLChange(){const P=this.getVersionId(),V=this._decorationsTree.search(0,!1,!1,P);this._ensureNodesHaveRanges(V)}_onAfterEOLChange(){const P=this.getVersionId(),V=this._decorationsTree.collectNodesPostOrder();for(let U=0,H=V.length;U0}getAttachedEditorCount(){return this._attachedEditorCount}isTooLargeForSyncing(){return this._isTooLargeForSyncing}isTooLargeForTokenization(){return this._isTooLargeForTokenization}isDisposed(){return this._isDisposed}isDominatedByLongLines(){if(this._assertNotDisposed(),this.isTooLargeForTokenization())return!1;let P=0,V=0;const U=this._buffer.getLineCount();for(let H=1;H<=U;H++){const $=this._buffer.getLineLength(H);$>=e.LONG_LINE_BOUNDARY?V+=$:P+=$}return V>P}get uri(){return this._associatedResource}getOptions(){return this._assertNotDisposed(),this._options}getFormattingOptions(){return{tabSize:this._options.indentSize,insertSpaces:this._options.insertSpaces}}updateOptions(P){this._assertNotDisposed();let V=typeof P.tabSize!="undefined"?P.tabSize:this._options.tabSize,U=typeof P.indentSize!="undefined"?P.indentSize:this._options.indentSize,H=typeof P.insertSpaces!="undefined"?P.insertSpaces:this._options.insertSpaces,$=typeof P.trimAutoWhitespace!="undefined"?P.trimAutoWhitespace:this._options.trimAutoWhitespace,ie=new c.TextModelResolvedOptions({tabSize:V,indentSize:U,insertSpaces:H,defaultEOL:this._options.defaultEOL,trimAutoWhitespace:$});if(!this._options.equals(ie)){let oe=this._options.createChangeEvent(ie);this._options=ie,this._onDidChangeOptions.fire(oe)}}detectIndentation(P,V){this._assertNotDisposed();let U=s.guessIndentation(this._buffer,V,P);this.updateOptions({insertSpaces:U.insertSpaces,tabSize:U.tabSize,indentSize:U.tabSize})}static _normalizeIndentationFromWhitespace(P,V,U){let H=0;for(let ie=0;ie({range:U.range,text:null})),()=>null)}mightContainNonBasicASCII(){return this._buffer.mightContainNonBasicASCII()}getAlternativeVersionId(){return this._assertNotDisposed(),this._alternativeVersionId}getInitialUndoRedoSnapshot(){return this._assertNotDisposed(),this._initialUndoRedoSnapshot}getOffsetAt(P){this._assertNotDisposed();let V=this._validatePosition(P.lineNumber,P.column,0);return this._buffer.getOffsetAt(V.lineNumber,V.column)}getPositionAt(P){this._assertNotDisposed();let V=Math.min(this._buffer.getLength(),Math.max(0,P));return this._buffer.getPositionAt(V)}_increaseVersionId(){this._versionId=this._versionId+1,this._alternativeVersionId=this._versionId}_overwriteVersionId(P){this._versionId=P}_overwriteAlternativeVersionId(P){this._alternativeVersionId=P}_overwriteInitialUndoRedoSnapshot(P){this._initialUndoRedoSnapshot=P}getValue(P,V=!1){this._assertNotDisposed();const U=this.getFullModelRange(),H=this.getValueInRange(U,P);return V?this._buffer.getBOM()+H:H}createSnapshot(P=!1){return new O(this._buffer.createSnapshot(P))}getValueLength(P,V=!1){this._assertNotDisposed();const U=this.getFullModelRange(),H=this.getValueLengthInRange(U,P);return V?this._buffer.getBOM().length+H:H}getValueInRange(P,V=0){return this._assertNotDisposed(),this._buffer.getValueInRange(this.validateRange(P),V)}getValueLengthInRange(P,V=0){return this._assertNotDisposed(),this._buffer.getValueLengthInRange(this.validateRange(P),V)}getCharacterCountInRange(P,V=0){return this._assertNotDisposed(),this._buffer.getCharacterCountInRange(this.validateRange(P),V)}getLineCount(){return this._assertNotDisposed(),this._buffer.getLineCount()}getLineContent(P){if(this._assertNotDisposed(),P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");return this._buffer.getLineContent(P)}getLineLength(P){if(this._assertNotDisposed(),P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");return this._buffer.getLineLength(P)}getLinesContent(){return this._assertNotDisposed(),this._buffer.getLinesContent()}getEOL(){return this._assertNotDisposed(),this._buffer.getEOL()}getEndOfLineSequence(){return this._assertNotDisposed(),this._buffer.getEOL()===` +`?0:1}getLineMinColumn(P){return this._assertNotDisposed(),1}getLineMaxColumn(P){if(this._assertNotDisposed(),P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");return this._buffer.getLineLength(P)+1}getLineFirstNonWhitespaceColumn(P){if(this._assertNotDisposed(),P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");return this._buffer.getLineFirstNonWhitespaceColumn(P)}getLineLastNonWhitespaceColumn(P){if(this._assertNotDisposed(),P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");return this._buffer.getLineLastNonWhitespaceColumn(P)}_validateRangeRelaxedNoAllocations(P){const V=this._buffer.getLineCount(),U=P.startLineNumber,H=P.startColumn;let $,ie;if(U<1)$=1,ie=1;else if(U>V)$=V,ie=this.getLineMaxColumn($);else if($=U|0,H<=1)ie=1;else{const te=this.getLineMaxColumn($);H>=te?ie=te:ie=H|0}const oe=P.endLineNumber,ae=P.endColumn;let G,j;if(oe<1)G=1,j=1;else if(oe>V)G=V,j=this.getLineMaxColumn(G);else if(G=oe|0,ae<=1)j=1;else{const te=this.getLineMaxColumn(G);ae>=te?j=te:j=ae|0}return U===$&&H===ie&&oe===G&&ae===j&&P instanceof g.Range&&!(P instanceof p.Selection)?P:new g.Range($,ie,G,j)}_isValidPosition(P,V,U){if(typeof P!="number"||typeof V!="number"||isNaN(P)||isNaN(V)||P<1||V<1||(P|0)!==P||(V|0)!==V)return!1;const H=this._buffer.getLineCount();if(P>H)return!1;if(V===1)return!0;const $=this.getLineMaxColumn(P);if(V>$)return!1;if(U===1){const ie=this._buffer.getLineCharCode(P,V-2);if(w.isHighSurrogate(ie))return!1}return!0}_validatePosition(P,V,U){const H=Math.floor(typeof P=="number"&&!isNaN(P)?P:1),$=Math.floor(typeof V=="number"&&!isNaN(V)?V:1),ie=this._buffer.getLineCount();if(H<1)return new d.Position(1,1);if(H>ie)return new d.Position(ie,this.getLineMaxColumn(ie));if($<=1)return new d.Position(H,1);const oe=this.getLineMaxColumn(H);if($>=oe)return new d.Position(H,oe);if(U===1){const ae=this._buffer.getLineCharCode(H,$-2);if(w.isHighSurrogate(ae))return new d.Position(H,$-1)}return new d.Position(H,$)}validatePosition(P){const V=1;return this._assertNotDisposed(),P instanceof d.Position&&this._isValidPosition(P.lineNumber,P.column,V)?P:this._validatePosition(P.lineNumber,P.column,V)}_isValidRange(P,V){const U=P.startLineNumber,H=P.startColumn,$=P.endLineNumber,ie=P.endColumn;if(!this._isValidPosition(U,H,0)||!this._isValidPosition($,ie,0))return!1;if(V===1){const oe=H>1?this._buffer.getLineCharCode(U,H-2):0,ae=ie>1&&ie<=this._buffer.getLineLength($)?this._buffer.getLineCharCode($,ie-2):0,G=w.isHighSurrogate(oe),j=w.isHighSurrogate(ae);return!G&&!j}return!0}validateRange(P){const V=1;if(this._assertNotDisposed(),P instanceof g.Range&&!(P instanceof p.Selection)&&this._isValidRange(P,V))return P;const U=this._validatePosition(P.startLineNumber,P.startColumn,0),H=this._validatePosition(P.endLineNumber,P.endColumn,0),$=U.lineNumber,ie=U.column,oe=H.lineNumber,ae=H.column;if(V===1){const G=ie>1?this._buffer.getLineCharCode($,ie-2):0,j=ae>1&&ae<=this._buffer.getLineLength(oe)?this._buffer.getLineCharCode(oe,ae-2):0,te=w.isHighSurrogate(G),Z=w.isHighSurrogate(j);return!te&&!Z?new g.Range($,ie,oe,ae):$===oe&&ie===ae?new g.Range($,ie-1,oe,ae-1):te&&Z?new g.Range($,ie-1,oe,ae+1):te?new g.Range($,ie-1,oe,ae):new g.Range($,ie,oe,ae+1)}return new g.Range($,ie,oe,ae)}modifyPosition(P,V){this._assertNotDisposed();let U=this.getOffsetAt(P)+V;return this.getPositionAt(Math.min(this._buffer.getLength(),Math.max(0,U)))}getFullModelRange(){this._assertNotDisposed();const P=this.getLineCount();return new g.Range(1,1,P,this.getLineMaxColumn(P))}findMatchesLineByLine(P,V,U,H){return this._buffer.findMatchesLineByLine(P,V,U,H)}findMatches(P,V,U,H,$,ie,oe=T){this._assertNotDisposed();let ae=null;V!==null&&(Array.isArray(V)||(V=[V]),V.every(te=>g.Range.isIRange(te))&&(ae=V.map(te=>this.validateRange(te)))),ae===null&&(ae=[this.getFullModelRange()]),ae=ae.sort((te,Z)=>te.startLineNumber-Z.startLineNumber||te.startColumn-Z.startColumn);const G=[];G.push(ae.reduce((te,Z)=>g.Range.areIntersecting(te,Z)?te.plusRange(Z):(G.push(te),Z)));let j;if(!U&&P.indexOf(` +`)<0){const Z=new i.SearchParams(P,U,H,$).parseSearchRequest();if(!Z)return[];j=ue=>this.findMatchesLineByLine(ue,Z,ie,oe)}else j=te=>i.TextModelSearch.findMatches(this,new i.SearchParams(P,U,H,$),te,ie,oe);return G.map(j).reduce((te,Z)=>te.concat(Z),[])}findNextMatch(P,V,U,H,$,ie){this._assertNotDisposed();const oe=this.validatePosition(V);if(!U&&P.indexOf(` +`)<0){const G=new i.SearchParams(P,U,H,$).parseSearchRequest();if(!G)return null;const j=this.getLineCount();let te=new g.Range(oe.lineNumber,oe.column,j,this.getLineMaxColumn(j)),Z=this.findMatchesLineByLine(te,G,ie,1);return i.TextModelSearch.findNextMatch(this,new i.SearchParams(P,U,H,$),oe,ie),Z.length>0||(te=new g.Range(1,1,oe.lineNumber,this.getLineMaxColumn(oe.lineNumber)),Z=this.findMatchesLineByLine(te,G,ie,1),Z.length>0)?Z[0]:null}return i.TextModelSearch.findNextMatch(this,new i.SearchParams(P,U,H,$),oe,ie)}findPreviousMatch(P,V,U,H,$,ie){this._assertNotDisposed();const oe=this.validatePosition(V);return i.TextModelSearch.findPreviousMatch(this,new i.SearchParams(P,U,H,$),oe,ie)}pushStackElement(){this._commandManager.pushStackElement()}popStackElement(){this._commandManager.popStackElement()}pushEOL(P){if((this.getEOL()===` +`?0:1)!==P)try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._initialUndoRedoSnapshot===null&&(this._initialUndoRedoSnapshot=this._undoRedoService.createSnapshot(this.uri)),this._commandManager.pushEOL(P)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_validateEditOperation(P){return P instanceof c.ValidAnnotatedEditOperation?P:new c.ValidAnnotatedEditOperation(P.identifier||null,this.validateRange(P.range),P.text,P.forceMoveMarkers||!1,P.isAutoWhitespaceEdit||!1,P._isTracked||!1)}_validateEditOperations(P){const V=[];for(let U=0,H=P.length;U({range:this.validateRange(ie.range),text:ie.text})),$=!0;if(P)for(let ie=0,oe=P.length;ieae.endLineNumber,he=ae.startLineNumber>Z.endLineNumber;if(!ue&&!he){G=!0;break}}if(!G){$=!1;break}}if($)for(let ie=0,oe=this._trimAutoWhitespaceLines.length;ieue.endLineNumber)&&!(ae===ue.startLineNumber&&ue.startColumn===G&&ue.isEmpty()&&he&&he.length>0&&he.charAt(0)===` +`)&&!(ae===ue.startLineNumber&&ue.startColumn===1&&ue.isEmpty()&&he&&he.length>0&&he.charAt(he.length-1)===` +`)){j=!1;break}}if(j){const te=new g.Range(ae,1,ae,G);V.push(new c.ValidAnnotatedEditOperation(null,te,null,!1,!1,!1))}}this._trimAutoWhitespaceLines=null}return this._initialUndoRedoSnapshot===null&&(this._initialUndoRedoSnapshot=this._undoRedoService.createSnapshot(this.uri)),this._commandManager.pushEditOperation(P,V,U)}_applyUndo(P,V,U,H){const $=P.map(ie=>{const oe=this.getPositionAt(ie.newPosition),ae=this.getPositionAt(ie.newEnd);return{range:new g.Range(oe.lineNumber,oe.column,ae.lineNumber,ae.column),text:ie.oldText}});this._applyUndoRedoEdits($,V,!0,!1,U,H)}_applyRedo(P,V,U,H){const $=P.map(ie=>{const oe=this.getPositionAt(ie.oldPosition),ae=this.getPositionAt(ie.oldEnd);return{range:new g.Range(oe.lineNumber,oe.column,ae.lineNumber,ae.column),text:ie.newText}});this._applyUndoRedoEdits($,V,!1,!0,U,H)}_applyUndoRedoEdits(P,V,U,H,$,ie){try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._isUndoing=U,this._isRedoing=H,this.applyEdits(P,!1),this.setEOL(V),this._overwriteAlternativeVersionId($)}finally{this._isUndoing=!1,this._isRedoing=!1,this._eventEmitter.endDeferredEmit(ie),this._onDidChangeDecorations.endDeferredEmit()}}applyEdits(P,V=!1){try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit();const U=this._validateEditOperations(P);return this._doApplyEdits(U,V)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_doApplyEdits(P,V){const U=this._buffer.getLineCount(),H=this._buffer.applyEdits(P,this._options.trimAutoWhitespace,V),$=this._buffer.getLineCount(),ie=H.changes;if(this._trimAutoWhitespaceLines=H.trimAutoWhitespaceLineNumbers,ie.length!==0){let oe=[],ae=U;for(let G=0,j=ie.length;G0?te.text.charCodeAt(0):0),this._onDidChangeDecorations.fire(),this._decorationsTree.acceptReplace(te.rangeOffset,te.rangeLength,te.text.length,te.forceMoveMarkers);const re=te.range.startLineNumber,ce=te.range.endLineNumber,me=ce-re,Ce=Z,be=Math.min(me,Ce),Le=Ce-me;for(let De=be;De>=0;De--){const Re=re+De,Ee=$-ae-Le+Re;oe.push(new r.ModelRawLineChanged(Re,this.getLineContent(Ee)))}if(bethis._deltaDecorationsImpl(P,[],[{range:$,options:ie}])[0],changeDecoration:($,ie)=>{this._changeDecorationImpl($,ie)},changeDecorationOptions:($,ie)=>{this._changeDecorationOptionsImpl($,ne(ie))},removeDecoration:$=>{this._deltaDecorationsImpl(P,[$],[])},deltaDecorations:($,ie)=>$.length===0&&ie.length===0?[]:this._deltaDecorationsImpl(P,$,ie)},H=null;try{H=V(U)}catch($){b.onUnexpectedError($)}return U.addDecoration=A,U.changeDecoration=A,U.changeDecorationOptions=A,U.removeDecoration=A,U.deltaDecorations=A,H}deltaDecorations(P,V,U=0){if(this._assertNotDisposed(),P||(P=[]),P.length===0&&V.length===0)return[];try{return this._onDidChangeDecorations.beginDeferredEmit(),this._deltaDecorationsImpl(U,P,V)}finally{this._onDidChangeDecorations.endDeferredEmit()}}_getTrackedRange(P){return this.getDecorationRange(P)}_setTrackedRange(P,V,U){const H=P?this._decorations[P]:null;if(!H)return V?this._deltaDecorationsImpl(0,[],[{range:V,options:se[U]}])[0]:null;if(!V)return this._decorationsTree.delete(H),delete this._decorations[H.id],null;const $=this._validateRangeRelaxedNoAllocations(V),ie=this._buffer.getOffsetAt($.startLineNumber,$.startColumn),oe=this._buffer.getOffsetAt($.endLineNumber,$.endColumn);return this._decorationsTree.delete(H),H.reset(this.getVersionId(),ie,oe,$),H.setOptions(se[U]),this._decorationsTree.insert(H),H.id}removeAllDecorationsWithOwnerId(P){if(!this._isDisposed){const V=this._decorationsTree.collectNodesFromOwner(P);for(let U=0,H=V.length;Uthis.getLineCount()?[]:this.getLinesDecorations(P,P,V,U)}getLinesDecorations(P,V,U=0,H=!1){let $=this.getLineCount(),ie=Math.min($,Math.max(1,P)),oe=Math.min($,Math.max(1,V)),ae=this.getLineMaxColumn(oe);return this._getDecorationsInRange(new g.Range(ie,1,oe,ae),U,H)}getDecorationsInRange(P,V=0,U=!1){let H=this.validateRange(P);return this._getDecorationsInRange(H,V,U)}getOverviewRulerDecorations(P=0,V=!1){const U=this.getVersionId(),H=this._decorationsTree.search(P,V,!0,U);return this._ensureNodesHaveRanges(H)}getAllDecorations(P=0,V=!1){const U=this.getVersionId(),H=this._decorationsTree.search(P,V,!1,U);return this._ensureNodesHaveRanges(H)}_getDecorationsInRange(P,V,U){const H=this._buffer.getOffsetAt(P.startLineNumber,P.startColumn),$=this._buffer.getOffsetAt(P.endLineNumber,P.endColumn),ie=this.getVersionId(),oe=this._decorationsTree.intervalSearch(H,$,V,U,ie);return this._ensureNodesHaveRanges(oe)}_ensureNodesHaveRanges(P){for(let V=0,U=P.length;V0&&this._emitModelTokensChangedEvent({tokenizationSupportChanged:!1,semanticTokensApplied:!1,ranges:V})}}setSemanticTokens(P,V){this._tokens2.set(P,V),this._emitModelTokensChangedEvent({tokenizationSupportChanged:!1,semanticTokensApplied:P!==null,ranges:[{fromLineNumber:1,toLineNumber:this.getLineCount()}]})}hasCompleteSemanticTokens(){return this._tokens2.isComplete()}hasSomeSemanticTokens(){return!this._tokens2.isEmpty()}setPartialSemanticTokens(P,V){if(!this.hasCompleteSemanticTokens()){const U=this._tokens2.setPartial(P,V);this._emitModelTokensChangedEvent({tokenizationSupportChanged:!1,semanticTokensApplied:!0,ranges:[{fromLineNumber:U.startLineNumber,toLineNumber:U.endLineNumber}]})}}tokenizeViewport(P,V){P=Math.max(1,P),V=Math.min(this._buffer.getLineCount(),V),this._tokenization.tokenizeViewport(P,V)}clearTokens(){this._tokens.flush(),this._emitModelTokensChangedEvent({tokenizationSupportChanged:!0,semanticTokensApplied:!1,ranges:[{fromLineNumber:1,toLineNumber:this._buffer.getLineCount()}]})}_emitModelTokensChangedEvent(P){this._isDisposing||this._onDidChangeTokens.fire(P)}resetTokenization(){this._tokenization.reset()}forceTokenization(P){if(P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");this._tokenization.forceTokenization(P)}isCheapToTokenize(P){return this._tokenization.isCheapToTokenize(P)}tokenizeIfCheap(P){this.isCheapToTokenize(P)&&this.forceTokenization(P)}getLineTokens(P){if(P<1||P>this.getLineCount())throw new Error("Illegal value for lineNumber");return this._getLineTokens(P)}_getLineTokens(P){const V=this.getLineContent(P),U=this._tokens.getTokens(this._languageIdentifier.id,P-1,V);return this._tokens2.addSemanticTokens(P,U)}getLanguageIdentifier(){return this._languageIdentifier}getModeId(){return this._languageIdentifier.language}setMode(P){if(this._languageIdentifier.id!==P.id){let V={oldLanguage:this._languageIdentifier.language,newLanguage:P.language};this._languageIdentifier=P,this._onDidChangeLanguage.fire(V),this._onDidChangeLanguageConfiguration.fire({})}}getLanguageIdAtPosition(P,V){const U=this.validatePosition(new d.Position(P,V)),H=this.getLineTokens(U.lineNumber);return H.getLanguageId(H.findTokenIndexAtOffset(U.column-1))}getWordAtPosition(P){this._assertNotDisposed();const V=this.validatePosition(P),U=this.getLineContent(V.lineNumber),H=this._getLineTokens(V.lineNumber),$=H.findTokenIndexAtOffset(V.column-1),[ie,oe]=D._findLanguageBoundaries(H,$),ae=t.getWordAtText(V.column,l.LanguageConfigurationRegistry.getWordDefinition(H.getLanguageId($)),U.substring(ie,oe),ie);if(ae&&ae.startColumn<=P.column&&P.column<=ae.endColumn)return ae;if($>0&&ie===V.column-1){const[G,j]=D._findLanguageBoundaries(H,$-1),te=t.getWordAtText(V.column,l.LanguageConfigurationRegistry.getWordDefinition(H.getLanguageId($-1)),U.substring(G,j),G);if(te&&te.startColumn<=P.column&&P.column<=te.endColumn)return te}return null}static _findLanguageBoundaries(P,V){const U=P.getLanguageId(V);let H=0;for(let ie=V;ie>=0&&P.getLanguageId(ie)===U;ie--)H=P.getStartOffset(ie);let $=P.getLineContent().length;for(let ie=V,oe=P.getCount();ie=0;te--){const Z=U.getEndOffset(te);if(Z<=ae)break;m.ignoreBracketsInToken(U.getStandardTokenType(te))&&(ae=Z)}const G=Math.min($.length,P.column-1+oe.maxBracketLength);let j=null;for(;;){const te=_.BracketsUtils.findNextBracketInRange(oe.forwardRegex,V,$,ae,G);if(!te)break;if(te.startColumn<=P.column&&P.column<=te.endColumn){const Z=$.substring(te.startColumn-1,te.endColumn-1).toLowerCase(),ue=this._matchFoundBracket(te,oe.textIsBracket[Z],oe.textIsOpenBracket[Z],null);if(ue){if(ue instanceof B)return null;j=ue}}ae=te.endColumn-1}if(j)return j}if(ie>0&&U.getStartOffset(ie)===P.column-1){const ae=ie-1,G=l.LanguageConfigurationRegistry.getBracketsSupport(U.getLanguageId(ae));if(G&&!m.ignoreBracketsInToken(U.getStandardTokenType(ae))){const j=Math.max(0,P.column-1-G.maxBracketLength);let te=Math.min($.length,P.column-1+G.maxBracketLength);for(let ue=ae+1;ue=te)break;m.ignoreBracketsInToken(U.getStandardTokenType(ue))&&(te=he)}const Z=_.BracketsUtils.findPrevBracketInRange(G.reversedRegex,V,$,j,te);if(Z&&Z.startColumn<=P.column&&P.column<=Z.endColumn){const ue=$.substring(Z.startColumn-1,Z.endColumn-1).toLowerCase(),he=this._matchFoundBracket(Z,G.textIsBracket[ue],G.textIsOpenBracket[ue],null);if(he)return he instanceof B?null:he}}}return null}_matchFoundBracket(P,V,U,H){if(!V)return null;const $=U?this._findMatchingBracketDown(V,P.getEndPosition(),H):this._findMatchingBracketUp(V,P.getStartPosition(),H);return $?$ instanceof B?$:[P,$]:null}_findMatchingBracketUp(P,V,U){const H=P.languageIdentifier.id,$=P.reversedRegex;let ie=-1,oe=0;const ae=(G,j,te,Z)=>{for(;;){if(U&&++oe%100==0&&!U())return B.INSTANCE;const ue=_.BracketsUtils.findPrevBracketInRange($,G,j,te,Z);if(!ue)break;const he=j.substring(ue.startColumn-1,ue.endColumn-1).toLowerCase();if(P.isOpen(he)?ie++:P.isClose(he)&&ie--,ie===0)return ue;Z=ue.startColumn-1}return null};for(let G=V.lineNumber;G>=1;G--){const j=this._getLineTokens(G),te=j.getCount(),Z=this._buffer.getLineContent(G);let ue=te-1,he=Z.length,re=Z.length;G===V.lineNumber&&(ue=j.findTokenIndexAtOffset(V.column-1),he=V.column-1,re=V.column-1);let ce=!0;for(;ue>=0;ue--){const me=j.getLanguageId(ue)===H&&!m.ignoreBracketsInToken(j.getStandardTokenType(ue));if(me)ce?he=j.getStartOffset(ue):(he=j.getStartOffset(ue),re=j.getEndOffset(ue));else if(ce&&he!==re){const Ce=ae(G,Z,he,re);if(Ce)return Ce}ce=me}if(ce&&he!==re){const me=ae(G,Z,he,re);if(me)return me}}return null}_findMatchingBracketDown(P,V,U){const H=P.languageIdentifier.id,$=P.forwardRegex;let ie=1,oe=0;const ae=(j,te,Z,ue)=>{for(;;){if(U&&++oe%100==0&&!U())return B.INSTANCE;const he=_.BracketsUtils.findNextBracketInRange($,j,te,Z,ue);if(!he)break;const re=te.substring(he.startColumn-1,he.endColumn-1).toLowerCase();if(P.isOpen(re)?ie++:P.isClose(re)&&ie--,ie===0)return he;Z=he.endColumn-1}return null},G=this.getLineCount();for(let j=V.lineNumber;j<=G;j++){const te=this._getLineTokens(j),Z=te.getCount(),ue=this._buffer.getLineContent(j);let he=0,re=0,ce=0;j===V.lineNumber&&(he=te.findTokenIndexAtOffset(V.column-1),re=V.column-1,ce=V.column-1);let me=!0;for(;he=1;$--){const ie=this._getLineTokens($),oe=ie.getCount(),ae=this._buffer.getLineContent($);let G=oe-1,j=ae.length,te=ae.length;if($===V.lineNumber){G=ie.findTokenIndexAtOffset(V.column-1),j=V.column-1,te=V.column-1;const ue=ie.getLanguageId(G);U!==ue&&(U=ue,H=l.LanguageConfigurationRegistry.getBracketsSupport(U))}let Z=!0;for(;G>=0;G--){const ue=ie.getLanguageId(G);if(U!==ue){if(H&&Z&&j!==te){const re=_.BracketsUtils.findPrevBracketInRange(H.reversedRegex,$,ae,j,te);if(re)return this._toFoundBracket(H,re);Z=!1}U=ue,H=l.LanguageConfigurationRegistry.getBracketsSupport(U)}const he=!!H&&!m.ignoreBracketsInToken(ie.getStandardTokenType(G));if(he)Z?j=ie.getStartOffset(G):(j=ie.getStartOffset(G),te=ie.getEndOffset(G));else if(H&&Z&&j!==te){const re=_.BracketsUtils.findPrevBracketInRange(H.reversedRegex,$,ae,j,te);if(re)return this._toFoundBracket(H,re)}Z=he}if(H&&Z&&j!==te){const ue=_.BracketsUtils.findPrevBracketInRange(H.reversedRegex,$,ae,j,te);if(ue)return this._toFoundBracket(H,ue)}}return null}findNextBracket(P){const V=this.validatePosition(P),U=this.getLineCount();let H=-1,$=null;for(let ie=V.lineNumber;ie<=U;ie++){const oe=this._getLineTokens(ie),ae=oe.getCount(),G=this._buffer.getLineContent(ie);let j=0,te=0,Z=0;if(ie===V.lineNumber){j=oe.findTokenIndexAtOffset(V.column-1),te=V.column-1,Z=V.column-1;const he=oe.getLanguageId(j);H!==he&&(H=he,$=l.LanguageConfigurationRegistry.getBracketsSupport(H))}let ue=!0;for(;jDate.now()-ue<=V}const H=this.validatePosition(P),$=this.getLineCount(),ie=new Map;let oe=[];const ae=(ue,he)=>{if(!ie.has(ue)){let re=[];for(let ce=0,me=he?he.brackets.length:0;ce{for(;;){if(U&&++G%100==0&&!U())return B.INSTANCE;const Ce=_.BracketsUtils.findNextBracketInRange(ue.forwardRegex,he,re,ce,me);if(!Ce)break;const be=re.substring(Ce.startColumn-1,Ce.endColumn-1).toLowerCase(),Le=ue.textIsBracket[be];if(Le&&(Le.isOpen(be)?oe[Le.index]++:Le.isClose(be)&&oe[Le.index]--,oe[Le.index]===-1))return this._matchFoundBracket(Ce,Le,!1,U);ce=Ce.endColumn-1}return null};let te=-1,Z=null;for(let ue=H.lineNumber;ue<=$;ue++){const he=this._getLineTokens(ue),re=he.getCount(),ce=this._buffer.getLineContent(ue);let me=0,Ce=0,be=0;if(ue===H.lineNumber){me=he.findTokenIndexAtOffset(H.column-1),Ce=H.column-1,be=H.column-1;const De=he.getLanguageId(me);te!==De&&(te=De,Z=l.LanguageConfigurationRegistry.getBracketsSupport(te),ae(te,Z))}let Le=!0;for(;meH)throw new Error("Illegal value for lineNumber");const $=l.LanguageConfigurationRegistry.getFoldingRules(this._languageIdentifier.id),ie=Boolean($&&$.offSide);let oe=-2,ae=-1,G=-2,j=-1;const te=Ee=>{if(oe!==-1&&(oe===-2||oe>Ee-1)){oe=-1,ae=-1;for(let Ae=Ee-2;Ae>=0;Ae--){let Se=this._computeIndentLevel(Ae);if(Se>=0){oe=Ae,ae=Se;break}}}if(G===-2){G=-1,j=-1;for(let Ae=Ee;Ae=0){G=Ae,j=Se;break}}}};let Z=-2,ue=-1,he=-2,re=-1;const ce=Ee=>{if(Z===-2){Z=-1,ue=-1;for(let Ae=Ee-2;Ae>=0;Ae--){let Se=this._computeIndentLevel(Ae);if(Se>=0){Z=Ae,ue=Se;break}}}if(he!==-1&&(he===-2||he=0){he=Ae,re=Se;break}}}};let me=0,Ce=!0,be=0,Le=!0,De=0,Re=0;for(let Ee=0;Ce||Le;Ee++){const Ae=P-Ee,Se=P+Ee;Ee>1&&(Ae<1||Ae1&&(Se>H||Se>U)&&(Le=!1),Ee>5e4&&(Ce=!1,Le=!1);let we=-1;if(Ce){const fe=this._computeIndentLevel(Ae-1);fe>=0?(G=Ae-1,j=fe,we=Math.ceil(fe/this._options.indentSize)):(te(Ae),we=this._getIndentLevelForWhitespaceLine(ie,ae,j))}let ye=-1;if(Le){const fe=this._computeIndentLevel(Se-1);fe>=0?(Z=Se-1,ue=fe,ye=Math.ceil(fe/this._options.indentSize)):(ce(Se),ye=this._getIndentLevelForWhitespaceLine(ie,ue,re))}if(Ee===0){Re=we;continue}if(Ee===1){if(Se<=H&&ye>=0&&Re+1===ye){Ce=!1,me=Se,be=Se,De=ye;continue}if(Ae>=1&&we>=0&&we-1===Re){Le=!1,me=Ae,be=Ae,De=we;continue}if(me=P,be=P,De=Re,De===0)return{startLineNumber:me,endLineNumber:be,indent:De}}Ce&&(we>=De?me=Ae:Ce=!1),Le&&(ye>=De?be=Se:Le=!1)}return{startLineNumber:me,endLineNumber:be,indent:De}}getLinesIndentGuides(P,V){this._assertNotDisposed();const U=this.getLineCount();if(P<1||P>U)throw new Error("Illegal value for startLineNumber");if(V<1||V>U)throw new Error("Illegal value for endLineNumber");const H=l.LanguageConfigurationRegistry.getFoldingRules(this._languageIdentifier.id),$=Boolean(H&&H.offSide);let ie=new Array(V-P+1),oe=-2,ae=-1,G=-2,j=-1;for(let te=P;te<=V;te++){let Z=te-P;const ue=this._computeIndentLevel(te-1);if(ue>=0){oe=te-1,ae=ue,ie[Z]=Math.ceil(ue/this._options.indentSize);continue}if(oe===-2){oe=-1,ae=-1;for(let he=te-2;he>=0;he--){let re=this._computeIndentLevel(he);if(re>=0){oe=he,ae=re;break}}}if(G!==-1&&(G===-2||G=0){G=he,j=re;break}}}ie[Z]=this._getIndentLevelForWhitespaceLine($,ae,j)}return ie}_getIndentLevelForWhitespaceLine(P,V,U){return V===-1||U===-1?0:V0){this._deferredEvent?this._deferredEvent=this._deferredEvent.merge(P):this._deferredEvent=P;return}this._fastEmitter.fire(P),this._slowEmitter.fire(P)}}e.DidChangeContentEmitter=X}),define(Q[42],J([0,1,12,8,14,3,21,31,41]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isQuote=e.CursorColumns=e.EditOperationResult=e.CursorState=e.PartialViewCursorState=e.PartialModelCursorState=e.CursorContext=e.SingleCursorState=e.CursorConfiguration=void 0;const g=()=>!0,p=()=>!1,c=h=>h===" "||h===" ";class o{constructor(m,_,f){this._languageIdentifier=m;const v=f.options,y=v.get(124);this.readOnly=v.get(75),this.tabSize=_.tabSize,this.indentSize=_.indentSize,this.insertSpaces=_.insertSpaces,this.stickyTabStops=v.get(99),this.lineHeight=v.get(53),this.pageSize=Math.max(1,Math.floor(y.height/this.lineHeight)-2),this.useTabStops=v.get(109),this.wordSeparators=v.get(110),this.emptySelectionClipboard=v.get(28),this.copyWithSyntaxHighlighting=v.get(18),this.multiCursorMergeOverlapping=v.get(63),this.multiCursorPaste=v.get(65),this.autoClosingBrackets=v.get(5),this.autoClosingQuotes=v.get(7),this.autoClosingOvertype=v.get(6),this.autoSurround=v.get(10),this.autoIndent=v.get(8),this.surroundingPairs={},this._electricChars=null,this.shouldAutoCloseBefore={quote:o._getShouldAutoClose(m,this.autoClosingQuotes),bracket:o._getShouldAutoClose(m,this.autoClosingBrackets)},this.autoClosingPairs=d.LanguageConfigurationRegistry.getAutoClosingPairs(m.id);let L=o._getSurroundingPairs(m);if(L)for(const I of L)this.surroundingPairs[I.open]=I.close}static shouldRecreate(m){return m.hasChanged(124)||m.hasChanged(110)||m.hasChanged(28)||m.hasChanged(63)||m.hasChanged(65)||m.hasChanged(5)||m.hasChanged(7)||m.hasChanged(6)||m.hasChanged(10)||m.hasChanged(109)||m.hasChanged(53)||m.hasChanged(75)}get electricChars(){if(!this._electricChars){this._electricChars={};let m=o._getElectricCharacters(this._languageIdentifier);if(m)for(const _ of m)this._electricChars[_]=!0}return this._electricChars}normalizeIndentation(m){return C.TextModel.normalizeIndentation(m,this.indentSize,this.insertSpaces)}static _getElectricCharacters(m){try{return d.LanguageConfigurationRegistry.getElectricCharacters(m.id)}catch(_){return b.onUnexpectedError(_),null}}static _getShouldAutoClose(m,_){switch(_){case"beforeWhitespace":return c;case"languageDefined":return o._getLanguageDefinedShouldAutoClose(m);case"always":return g;case"never":return p}}static _getLanguageDefinedShouldAutoClose(m){try{const _=d.LanguageConfigurationRegistry.getAutoCloseBeforeSet(m.id);return f=>_.indexOf(f)!==-1}catch(_){return b.onUnexpectedError(_),p}}static _getSurroundingPairs(m){try{return d.LanguageConfigurationRegistry.getSurroundingPairs(m.id)}catch(_){return b.onUnexpectedError(_),null}}}e.CursorConfiguration=o;class s{constructor(m,_,f,v){this.selectionStart=m,this.selectionStartLeftoverVisibleColumns=_,this.position=f,this.leftoverVisibleColumns=v,this.selection=s._computeSelection(this.selectionStart,this.position)}equals(m){return this.selectionStartLeftoverVisibleColumns===m.selectionStartLeftoverVisibleColumns&&this.leftoverVisibleColumns===m.leftoverVisibleColumns&&this.position.equals(m.position)&&this.selectionStart.equalsRange(m.selectionStart)}hasSelection(){return!this.selection.isEmpty()||!this.selectionStart.isEmpty()}move(m,_,f,v){return m?new s(this.selectionStart,this.selectionStartLeftoverVisibleColumns,new M.Position(_,f),v):new s(new w.Range(_,f,_,f),v,new M.Position(_,f),v)}static _computeSelection(m,_){let f,v,y,L;return m.isEmpty()?(f=m.startLineNumber,v=m.startColumn,y=_.lineNumber,L=_.column):_.isBeforeOrEqual(m.getStartPosition())?(f=m.endLineNumber,v=m.endColumn,y=_.lineNumber,L=_.column):(f=m.startLineNumber,v=m.startColumn,y=_.lineNumber,L=_.column),new S.Selection(f,v,y,L)}}e.SingleCursorState=s;class a{constructor(m,_,f){this.model=m,this.coordinatesConverter=_,this.cursorConfig=f}}e.CursorContext=a;class u{constructor(m){this.modelState=m,this.viewState=null}}e.PartialModelCursorState=u;class r{constructor(m){this.modelState=null,this.viewState=m}}e.PartialViewCursorState=r;class i{constructor(m,_){this.modelState=m,this.viewState=_}static fromModelState(m){return new u(m)}static fromViewState(m){return new r(m)}static fromModelSelection(m){const _=m.selectionStartLineNumber,f=m.selectionStartColumn,v=m.positionLineNumber,y=m.positionColumn,L=new s(new w.Range(_,f,_,f),0,new M.Position(v,y),0);return i.fromModelState(L)}static fromModelSelections(m){let _=[];for(let f=0,v=m.length;f=65536?2:1,k===9)L=t.nextRenderTabStop(L,f);else{let E=N.getGraphemeBreakType(k);for(;I=65536?2:1,E=O}N.isFullWidthCharacter(k)||N.isEmojiImprecise(k)?L=L+2:L=L+1}}return L}static visibleColumnFromColumn2(m,_,f){return this.visibleColumnFromColumn(_.getLineContent(f.lineNumber),f.column,m.tabSize)}static columnFromVisibleColumn(m,_,f){if(_<=0)return 1;const v=m.length;let y=0,L=1,I=0;for(;I=65536?2:1;let E;if(k===9)E=t.nextRenderTabStop(y,f);else{let O=N.getGraphemeBreakType(k);for(;I=65536?2:1,O=B}N.isFullWidthCharacter(k)||N.isEmojiImprecise(k)?E=y+2:E=y+1}const T=I+1;if(E>=_){const O=_-y;return E-_I?I:y}static nextRenderTabStop(m,_){return m+_-m%_}static nextIndentTabStop(m,_){return m+_-m%_}static prevRenderTabStop(m,_){return m-1-(m-1)%_}static prevIndentTabStop(m,_){return m-1-(m-1)%_}}e.CursorColumns=t;function l(h){return h==="'"||h==='"'||h==="`"}e.isQuote=l}),define(Q[179],J([0,1,8,42,3,21,41]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ShiftCommand=e.cachedStringRepeat=void 0;const C=Object.create(null);function d(p,c){C[p]||(C[p]=["",p]);const o=C[p];for(let s=o.length;s<=c;s++)o[s]=o[s-1]+p;return o[c]}e.cachedStringRepeat=d;class g{constructor(c,o){this._opts=o,this._selection=c,this._selectionId=null,this._useLastEditRangeForCursorEndPosition=!1,this._selectionStartColumnStaysPut=!1}static unshiftIndent(c,o,s,a,u){const r=N.CursorColumns.visibleColumnFromColumn(c,o,s);if(u){const i=d(" ",a),t=N.CursorColumns.prevIndentTabStop(r,a)/a;return d(i,t)}else{const i=" ",t=N.CursorColumns.prevRenderTabStop(r,s)/s;return d(i,t)}}static shiftIndent(c,o,s,a,u){const r=N.CursorColumns.visibleColumnFromColumn(c,o,s);if(u){const i=d(" ",a),t=N.CursorColumns.nextIndentTabStop(r,a)/a;return d(i,t)}else{const i=" ",t=N.CursorColumns.nextRenderTabStop(r,s)/s;return d(i,t)}}_addEditOperation(c,o,s){this._useLastEditRangeForCursorEndPosition?c.addTrackedEditOperation(o,s):c.addEditOperation(o,s)}getEditOperations(c,o){const s=this._selection.startLineNumber;let a=this._selection.endLineNumber;this._selection.endColumn===1&&s!==a&&(a=a-1);const{tabSize:u,indentSize:r,insertSpaces:i}=this._opts,n=s===a;if(this._opts.useTabStops){this._selection.isEmpty()&&/^\s*$/.test(c.getLineContent(s))&&(this._useLastEditRangeForCursorEndPosition=!0);let t=0,l=0;for(let h=s;h<=a;h++,t=l){l=0;let m=c.getLineContent(h),_=b.firstNonWhitespaceIndex(m);if(!(this._opts.isUnshift&&(m.length===0||_===0))&&!(!n&&!this._opts.isUnshift&&m.length===0)){if(_===-1&&(_=m.length),h>1&&N.CursorColumns.visibleColumnFromColumn(m,_+1,u)%r!=0&&c.isCheapToTokenize(h-1)){let y=S.LanguageConfigurationRegistry.getEnterAction(this._opts.autoIndent,c,new M.Range(h-1,c.getLineMaxColumn(h-1),h-1,c.getLineMaxColumn(h-1)));if(y){if(l=t,y.appendText)for(let L=0,I=y.appendText.length;Lc,u=p>o,r=po||_p||m1&&p--,w.columnSelect(C,d,g.fromViewLineNumber,g.fromViewVisualColumn,g.toViewLineNumber,p)}static columnSelectRight(C,d,g){let p=0;const c=Math.min(g.fromViewLineNumber,g.toViewLineNumber),o=Math.max(g.fromViewLineNumber,g.toViewLineNumber);for(let a=c;a<=o;a++){const u=d.getLineMaxColumn(a),r=b.CursorColumns.visibleColumnFromColumn2(C,d,new N.Position(a,u));p=Math.max(p,r)}let s=g.toViewVisualColumn;return sp.getLineMinColumn(c)?o=o-w.prevCharLength(p.getLineContent(c),o-1):c>1&&(c=c-1,o=p.getLineMaxColumn(c)),new N.Position(c,o)}static leftPositionAtomicSoftTabs(p,c,o,s){const a=p.getLineMinColumn(c),u=p.getLineContent(c),r=S.AtomicTabMoveOperations.atomicPosition(u,o-1,s,0);return r===-1||r+1n?(o=n,r?s=c.getLineMaxColumn(o):s=Math.min(c.getLineMaxColumn(o),s)):s=b.CursorColumns.columnFromVisibleColumn2(p,c,o,i),t?a=0:a=i-b.CursorColumns.visibleColumnFromColumn(c.getLineContent(o),s,p.tabSize),new C(o,s,a)}static moveDown(p,c,o,s,a){let u,r;o.hasSelection()&&!s?(u=o.selection.endLineNumber,r=o.selection.endColumn):(u=o.position.lineNumber,r=o.position.column);let i=d.down(p,c,u,r,o.leftoverVisibleColumns,a,!0);return o.move(s,i.lineNumber,i.column,i.leftoverVisibleColumns)}static translateDown(p,c,o){let s=o.selection,a=d.down(p,c,s.selectionStartLineNumber,s.selectionStartColumn,o.selectionStartLeftoverVisibleColumns,1,!1),u=d.down(p,c,s.positionLineNumber,s.positionColumn,o.leftoverVisibleColumns,1,!1);return new b.SingleCursorState(new M.Range(a.lineNumber,a.column,a.lineNumber,a.column),a.leftoverVisibleColumns,new N.Position(u.lineNumber,u.column),u.leftoverVisibleColumns)}static up(p,c,o,s,a,u,r){const i=b.CursorColumns.visibleColumnFromColumn(c.getLineContent(o),s,p.tabSize)+a,n=o===1&&s===1;return o=o-u,o<1?(o=1,r?s=c.getLineMinColumn(o):s=Math.min(c.getLineMaxColumn(o),s)):s=b.CursorColumns.columnFromVisibleColumn2(p,c,o,i),n?a=0:a=i-b.CursorColumns.visibleColumnFromColumn(c.getLineContent(o),s,p.tabSize),new C(o,s,a)}static moveUp(p,c,o,s,a){let u,r;o.hasSelection()&&!s?(u=o.selection.startLineNumber,r=o.selection.startColumn):(u=o.position.lineNumber,r=o.position.column);let i=d.up(p,c,u,r,o.leftoverVisibleColumns,a,!0);return o.move(s,i.lineNumber,i.column,i.leftoverVisibleColumns)}static translateUp(p,c,o){let s=o.selection,a=d.up(p,c,s.selectionStartLineNumber,s.selectionStartColumn,o.selectionStartLeftoverVisibleColumns,1,!1),u=d.up(p,c,s.positionLineNumber,s.positionColumn,o.leftoverVisibleColumns,1,!1);return new b.SingleCursorState(new M.Range(a.lineNumber,a.column,a.lineNumber,a.column),a.leftoverVisibleColumns,new N.Position(u.lineNumber,u.column),u.leftoverVisibleColumns)}static _isBlankLine(p,c){return p.getLineFirstNonWhitespaceColumn(c)===0}static moveToPrevBlankLine(p,c,o,s){let a=o.position.lineNumber;for(;a>1&&this._isBlankLine(c,a);)a--;for(;a>1&&!this._isBlankLine(c,a);)a--;return o.move(s,a,c.getLineMinColumn(a),0)}static moveToNextBlankLine(p,c,o,s){const a=c.getLineCount();let u=o.position.lineNumber;for(;u=n.length+1)return!1;const t=n.charAt(i.column-2),l=c.get(t);if(!l)return!1;if(M.isQuote(t)){if(p==="never")return!1}else if(g==="never")return!1;const h=n.charAt(i.column-1);let m=!1;for(const _ of l)_.open===t&&_.close===h&&(m=!0);if(!m)return!1}return!0}static _runAutoClosingPairDelete(g,p,c){let o=[];for(let s=0,a=c.length;s1){let l=c.getLineContent(t.lineNumber),h=b.firstNonWhitespaceIndex(l),m=h===-1?l.length+1:h+1;if(t.column<=m){let _=M.CursorColumns.visibleColumnFromColumn2(p,c,t),f=M.CursorColumns.prevIndentTabStop(_,p.indentSize),v=M.CursorColumns.columnFromVisibleColumn2(p,c,t.lineNumber,f);n=new S.Range(t.lineNumber,v,t.lineNumber,t.column)}else n=new S.Range(t.lineNumber,t.column-1,t.lineNumber,t.column)}else{let l=w.MoveOperations.left(p,c,t.lineNumber,t.column);n=new S.Range(l.lineNumber,l.column,t.lineNumber,t.column)}}if(n.isEmpty()){s[u]=null;continue}n.startLineNumber!==n.endLineNumber&&(a=!0),s[u]=new N.ReplaceCommand(n,"")}return[a,s]}static cut(g,p,c){let o=[];for(let s=0,a=c.length;s1?(i=r.lineNumber-1,n=p.getLineMaxColumn(r.lineNumber-1),t=r.lineNumber,l=p.getLineMaxColumn(r.lineNumber)):(i=r.lineNumber,n=1,t=r.lineNumber,l=p.getLineMaxColumn(r.lineNumber));let h=new S.Range(i,n,t,l);h.isEmpty()?o[s]=null:o[s]=new N.ReplaceCommand(h,"")}else o[s]=null;else o[s]=new N.ReplaceCommand(u,"")}return new M.EditOperationResult(0,o,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!0})}}e.DeleteOperations=C}),define(Q[182],J([0,1,12,8,92,179,367,42,106,3,21,109,41]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TypeWithAutoClosingCommand=e.TypeOperations=void 0;class s{static indent(r,i,n){if(i===null||n===null)return[];let t=[];for(let l=0,h=n.length;l1){let m;for(m=n-1;m>=1;m--){const v=i.getLineContent(m);if(N.lastNonWhitespaceIndex(v)>=0)break}if(m<1)return null;const _=i.getLineMaxColumn(m),f=o.LanguageConfigurationRegistry.getEnterAction(r.autoIndent,i,new g.Range(m,_,m,_));f&&(l=f.indentation+f.appendText)}return t&&(t===c.IndentAction.Indent&&(l=s.shiftIndent(r,l)),t===c.IndentAction.Outdent&&(l=s.unshiftIndent(r,l)),l=r.normalizeIndentation(l)),l||null}static _replaceJumpToNextIndent(r,i,n,t){let l="",h=n.getStartPosition();if(r.insertSpaces){let m=C.CursorColumns.visibleColumnFromColumn2(r,i,h),_=r.indentSize,f=_-m%_;for(let v=0;vthis._compositionType(n,v,l,h,m,_));return new C.EditOperationResult(1,f,{shouldPushStackElementBefore:r!==1,shouldPushStackElementAfter:!1})}static _compositionType(r,i,n,t,l,h){if(!i.isEmpty())return null;const m=i.getPosition(),_=Math.max(1,m.column-t),f=Math.min(r.getLineMaxColumn(m.lineNumber),m.column+l),v=new g.Range(m.lineNumber,_,m.lineNumber,f);return r.getValueInRange(v)===n&&h===0?null:new M.ReplaceCommandWithOffsetCursorState(v,n,0,h)}static _typeCommand(r,i,n){return n?new M.ReplaceCommandWithoutChangingPosition(r,i,!0):new M.ReplaceCommand(r,i,!0)}static _enter(r,i,n,t){if(r.autoIndent===0)return s._typeCommand(t,` +`,n);if(!i.isCheapToTokenize(t.getStartPosition().lineNumber)||r.autoIndent===1){let _=i.getLineContent(t.startLineNumber),f=N.getLeadingWhitespace(_).substring(0,t.startColumn-1);return s._typeCommand(t,` +`+r.normalizeIndentation(f),n)}const l=o.LanguageConfigurationRegistry.getEnterAction(r.autoIndent,i,t);if(l){if(l.indentAction===c.IndentAction.None)return s._typeCommand(t,` +`+r.normalizeIndentation(l.indentation+l.appendText),n);if(l.indentAction===c.IndentAction.Indent)return s._typeCommand(t,` +`+r.normalizeIndentation(l.indentation+l.appendText),n);if(l.indentAction===c.IndentAction.IndentOutdent){const _=r.normalizeIndentation(l.indentation),f=r.normalizeIndentation(l.indentation+l.appendText),v=` +`+f+` +`+_;return n?new M.ReplaceCommandWithoutChangingPosition(t,v,!0):new M.ReplaceCommandWithOffsetCursorState(t,v,-1,f.length-_.length,!0)}else if(l.indentAction===c.IndentAction.Outdent){const _=s.unshiftIndent(r,l.indentation);return s._typeCommand(t,` +`+r.normalizeIndentation(_+l.appendText),n)}}const h=i.getLineContent(t.startLineNumber),m=N.getLeadingWhitespace(h).substring(0,t.startColumn-1);if(r.autoIndent>=4){const _=o.LanguageConfigurationRegistry.getIndentForEnter(r.autoIndent,i,t,{unshiftIndent:f=>s.unshiftIndent(r,f),shiftIndent:f=>s.shiftIndent(r,f),normalizeIndentation:f=>r.normalizeIndentation(f)});if(_){let f=C.CursorColumns.visibleColumnFromColumn2(r,i,t.getEndPosition());const v=t.endColumn,y=i.getLineContent(t.endLineNumber),L=N.firstNonWhitespaceIndex(y);if(L>=0?t=t.setEndPosition(t.endLineNumber,Math.max(t.endColumn,L+1)):t=t.setEndPosition(t.endLineNumber,i.getLineMaxColumn(t.endLineNumber)),n)return new M.ReplaceCommandWithoutChangingPosition(t,` +`+r.normalizeIndentation(_.afterEnter),!0);{let I=0;return v<=L+1&&(r.insertSpaces||(f=Math.ceil(f/r.indentSize)),I=Math.min(f+1-r.normalizeIndentation(_.afterEnter).length-1,0)),new M.ReplaceCommandWithOffsetCursorState(t,` +`+r.normalizeIndentation(_.afterEnter),0,I,!0)}}}return s._typeCommand(t,` +`+r.normalizeIndentation(m),n)}static _isAutoIndentType(r,i,n){if(r.autoIndent<4)return!1;for(let t=0,l=n.length;ts.shiftIndent(r,m),unshiftIndent:m=>s.unshiftIndent(r,m)});if(h===null)return null;if(h!==r.normalizeIndentation(l)){const m=i.getLineFirstNonWhitespaceColumn(n.startLineNumber);return m===0?s._typeCommand(new g.Range(n.startLineNumber,1,n.endLineNumber,n.endColumn),r.normalizeIndentation(h)+t,!1):s._typeCommand(new g.Range(n.startLineNumber,1,n.endLineNumber,n.endColumn),r.normalizeIndentation(h)+i.getLineContent(n.startLineNumber).substring(m-1,n.startColumn-1)+t,!1)}return null}static _isAutoClosingOvertype(r,i,n,t,l){if(r.autoClosingOvertype==="never"||!r.autoClosingPairs.autoClosingPairsCloseSingleChar.has(l))return!1;for(let h=0,m=n.length;h2?v.charCodeAt(f.column-2):0)===92&&L)return!1;if(r.autoClosingOvertype==="auto"){let k=!1;for(let E=0,T=t.length;Ei.startsWith(_.open)),m=l.some(_=>i.startsWith(_.close));return!h&&m}static _findAutoClosingPairOpen(r,i,n,t){const l=r.autoClosingPairs.autoClosingPairsOpenByEnd.get(t);if(!l)return null;let h=null;for(const m of l)if(h===null||m.open.length>h.open.length){let _=!0;for(const f of n)if(i.getValueInRange(new g.Range(f.lineNumber,f.column-m.open.length+1,f.lineNumber,f.column))+t!==m.open){_=!1;break}_&&(h=m)}return h}static _findSubAutoClosingPairClose(r,i){if(i.open.length<=1)return"";const n=i.close.charAt(i.close.length-1),t=r.autoClosingPairs.autoClosingPairsCloseByEnd.get(n)||[];let l=null;for(const h of t)h.open!==i.open&&i.open.includes(h.open)&&i.close.endsWith(h.close)&&(!l||h.open.length>l.open.length)&&(l=h);return l?l.close:""}static _getAutoClosingPairClose(r,i,n,t,l){const h=C.isQuote(t),m=h?r.autoClosingQuotes:r.autoClosingBrackets;if(m==="never")return null;const _=this._findAutoClosingPairOpen(r,i,n.map(L=>L.getPosition()),t);if(!_)return null;const f=this._findSubAutoClosingPairClose(r,_);let v=!0;const y=h?r.shouldAutoCloseBefore.quote:r.shouldAutoCloseBefore.bracket;for(let L=0,I=n.length;LE.column-1){const F=T.charAt(E.column-1);if(!s._isBeforeClosingBrace(r,O)&&!y(F))return null}if(!i.isCheapToTokenize(E.lineNumber))return null;if(_.open.length===1&&h&&m!=="always"){const F=d.getMapForWordSeparators(r.wordSeparators);if(l&&E.column>1&&F.get(T.charCodeAt(E.column-2))===0||!l&&E.column>2&&F.get(T.charCodeAt(E.column-3))===0)return null}i.forceTokenization(E.lineNumber);const A=i.getLineTokens(E.lineNumber);let B=!1;try{B=o.LanguageConfigurationRegistry.shouldAutoClosePair(_,A,l?E.column:E.column-1)}catch(F){b.onUnexpectedError(F)}if(!B)return null}return v?_.close.substring(0,_.close.length-f.length):_.close}static _runAutoClosingOpenCharType(r,i,n,t,l,h,m){let _=[];for(let f=0,v=t.length;fnew M.ReplaceCommand(new g.Range(v.positionLineNumber,v.positionColumn,v.positionLineNumber,v.positionColumn+1),"",!1));return new C.EditOperationResult(1,f,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}const _=this._getAutoClosingPairClose(i,n,l,m,!1);return _!==null?this._runAutoClosingOpenCharType(r,i,n,l,m,!1,_):null}static typeWithInterceptors(r,i,n,t,l,h,m){if(!r&&m===` +`){let v=[];for(let y=0,L=l.length;y=0;r--){let i=o.charCodeAt(r),n=s.get(i);if(n===0){if(u===2)return this._createWord(o,u,n,r+1,this._findEndOfWord(o,s,u,r+1));u=1}else if(n===2){if(u===1)return this._createWord(o,u,n,r+1,this._findEndOfWord(o,s,u,r+1));u=2}else if(n===1&&u!==0)return this._createWord(o,u,n,r+1,this._findEndOfWord(o,s,u,r+1))}return u!==0?this._createWord(o,u,1,0,this._findEndOfWord(o,s,u,0)):null}static _findEndOfWord(o,s,a,u){let r=o.length;for(let i=u;i=0;r--){let i=o.charCodeAt(r),n=s.get(i);if(n===1||a===1&&n===2||a===2&&n===0)return r+1}return 0}static moveWordLeft(o,s,a,u){let r=a.lineNumber,i=a.column;i===1&&r>1&&(r=r-1,i=s.getLineMaxColumn(r));let n=d._findPreviousWordOnLine(o,s,new S.Position(r,i));if(u===0)return new S.Position(r,n?n.start+1:1);if(u===1)return n&&n.wordType===2&&n.end-n.start==1&&n.nextCharClass===0&&(n=d._findPreviousWordOnLine(o,s,new S.Position(r,n.start+1))),new S.Position(r,n?n.start+1:1);if(u===3){for(;n&&n.wordType===2;)n=d._findPreviousWordOnLine(o,s,new S.Position(r,n.start+1));return new S.Position(r,n?n.start+1:1)}return n&&i<=n.end+1&&(n=d._findPreviousWordOnLine(o,s,new S.Position(r,n.start+1))),new S.Position(r,n?n.end+1:1)}static _moveWordPartLeft(o,s){const a=s.lineNumber,u=o.getLineMaxColumn(a);if(s.column===1)return a>1?new S.Position(a-1,o.getLineMaxColumn(a-1)):s;const r=o.getLineContent(a);for(let i=s.column-1;i>1;i--){const n=r.charCodeAt(i-2),t=r.charCodeAt(i-1);if(n===95&&t!==95)return new S.Position(a,i);if(b.isLowerAsciiLetter(n)&&b.isUpperAsciiLetter(t))return new S.Position(a,i);if(b.isUpperAsciiLetter(n)&&b.isUpperAsciiLetter(t)&&i+1=t.start+1&&(t=d._findNextWordOnLine(o,s,new S.Position(r,t.end+1))),t?i=t.start+1:i=s.getLineMaxColumn(r);return new S.Position(r,i)}static _moveWordPartRight(o,s){const a=s.lineNumber,u=o.getLineMaxColumn(a);if(s.column===u)return a1?l=1:(t--,l=u.getLineMaxColumn(t)):(h&&l<=h.end+1&&(h=d._findPreviousWordOnLine(a,u,new S.Position(t,h.start+1))),h?l=h.end+1:l>1?l=1:(t--,l=u.getLineMaxColumn(t))),new C.Range(t,l,n.lineNumber,n.column)}static deleteInsideWord(o,s,a){if(!a.isEmpty())return a;const u=new S.Position(a.positionLineNumber,a.positionColumn);let r=this._deleteInsideWordWhitespace(s,u);return r||this._deleteInsideWordDetermineDeleteRange(o,s,u)}static _charAtIsWhitespace(o,s){const a=o.charCodeAt(s);return a===32||a===9}static _deleteInsideWordWhitespace(o,s){const a=o.getLineContent(s.lineNumber),u=a.length;if(u===0)return null;let r=Math.max(s.column-2,0);if(!this._charAtIsWhitespace(a,r))return null;let i=Math.min(s.column-1,u-1);if(!this._charAtIsWhitespace(a,i))return null;for(;r>0&&this._charAtIsWhitespace(a,r-1);)r--;for(;i+11?new C.Range(a.lineNumber-1,s.getLineMaxColumn(a.lineNumber-1),a.lineNumber,1):a.lineNumberm.start+1<=a.column&&a.column<=m.end+1,n=(m,_)=>(m=Math.min(m,a.column),_=Math.max(_,a.column),new C.Range(a.lineNumber,m,a.lineNumber,_)),t=m=>{let _=m.start+1,f=m.end+1,v=!1;for(;f-11&&this._charAtIsWhitespace(u,_-2);)_--;return n(_,f)},l=d._findPreviousWordOnLine(o,s,a);if(l&&i(l))return t(l);const h=d._findNextWordOnLine(o,s,a);return h&&i(h)?t(h):l&&h?n(l.end+1,h.start+1):l?n(l.start+1,l.end+1):h?n(h.start+1,h.end+1):n(1,r+1)}static _deleteWordPartLeft(o,s){if(!s.isEmpty())return s;const a=s.getPosition(),u=d._moveWordPartLeft(o,a);return new C.Range(a.lineNumber,a.column,u.lineNumber,u.column)}static _findFirstNonWhitespaceChar(o,s){let a=o.length;for(let u=s;u=_.start+1&&(_=d._findNextWordOnLine(a,u,new S.Position(t,_.end+1))),_?l=_.start+1:lBoolean(o))}}),define(Q[241],J([0,1,20,42,180,136,14,3]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorMove=e.CursorMoveCommands=void 0;class d{static addCursorDown(c,o,s){let a=[],u=0;for(let r=0,i=o.length;rt&&(l=t,h=c.model.getLineMaxColumn(l)),N.CursorState.fromModelState(new N.SingleCursorState(new C.Range(r.lineNumber,1,l,h),0,new S.Position(l,h),0))}const n=o.modelState.selectionStart.getStartPosition().lineNumber;if(r.lineNumbern){const t=c.getLineCount();let l=i.lineNumber+1,h=1;return l>t&&(l=t,h=c.getLineMaxColumn(l)),N.CursorState.fromViewState(o.viewState.move(o.modelState.hasSelection(),l,h,0))}else{const t=o.modelState.selectionStart.getEndPosition();return N.CursorState.fromModelState(o.modelState.move(o.modelState.hasSelection(),t.lineNumber,t.column,0))}}static word(c,o,s,a){const u=c.model.validatePosition(a);return N.CursorState.fromModelState(w.WordOperations.word(c.cursorConfig,c.model,o.modelState,s,u))}static cancelSelection(c,o){if(!o.modelState.hasSelection())return new N.CursorState(o.modelState,o.viewState);const s=o.viewState.position.lineNumber,a=o.viewState.position.column;return N.CursorState.fromViewState(new N.SingleCursorState(new C.Range(s,a,s,a),0,new S.Position(s,a),0))}static moveTo(c,o,s,a,u){const r=c.model.validatePosition(a),i=u?c.coordinatesConverter.validateViewPosition(new S.Position(u.lineNumber,u.column),r):c.coordinatesConverter.convertModelPositionToViewPosition(r);return N.CursorState.fromViewState(o.viewState.move(s,i.lineNumber,i.column,0))}static simpleMove(c,o,s,a,u,r){switch(s){case 0:return r===4?this._moveHalfLineLeft(c,o,a):this._moveLeft(c,o,a,u);case 1:return r===4?this._moveHalfLineRight(c,o,a):this._moveRight(c,o,a,u);case 2:return r===2?this._moveUpByViewLines(c,o,a,u):this._moveUpByModelLines(c,o,a,u);case 3:return r===2?this._moveDownByViewLines(c,o,a,u):this._moveDownByModelLines(c,o,a,u);case 4:return r===2?o.map(i=>N.CursorState.fromViewState(M.MoveOperations.moveToPrevBlankLine(c.cursorConfig,c,i.viewState,a))):o.map(i=>N.CursorState.fromModelState(M.MoveOperations.moveToPrevBlankLine(c.cursorConfig,c.model,i.modelState,a)));case 5:return r===2?o.map(i=>N.CursorState.fromViewState(M.MoveOperations.moveToNextBlankLine(c.cursorConfig,c,i.viewState,a))):o.map(i=>N.CursorState.fromModelState(M.MoveOperations.moveToNextBlankLine(c.cursorConfig,c.model,i.modelState,a)));case 6:return this._moveToViewMinColumn(c,o,a);case 7:return this._moveToViewFirstNonWhitespaceColumn(c,o,a);case 8:return this._moveToViewCenterColumn(c,o,a);case 9:return this._moveToViewMaxColumn(c,o,a);case 10:return this._moveToViewLastNonWhitespaceColumn(c,o,a);default:return null}}static viewportMove(c,o,s,a,u){const r=c.getCompletelyVisibleViewRange(),i=c.coordinatesConverter.convertViewRangeToModelRange(r);switch(s){case 11:{const n=this._firstLineNumberInRange(c.model,i,u),t=c.model.getLineFirstNonWhitespaceColumn(n);return[this._moveToModelPosition(c,o[0],a,n,t)]}case 13:{const n=this._lastLineNumberInRange(c.model,i,u),t=c.model.getLineFirstNonWhitespaceColumn(n);return[this._moveToModelPosition(c,o[0],a,n,t)]}case 12:{const n=Math.round((i.startLineNumber+i.endLineNumber)/2),t=c.model.getLineFirstNonWhitespaceColumn(n);return[this._moveToModelPosition(c,o[0],a,n,t)]}case 14:{let n=[];for(let t=0,l=o.length;ts.endLineNumber-1&&(u=s.endLineNumber-1),u1;let r=[];for(let i=0,n=o.length;i1;let r=[];for(let i=0,n=o.length;ig){let p=d-g;for(let c=0;c=C+1&&this.lastAddedCursorIndex--,this.secondaryCursors[C].dispose(this.context),this.secondaryCursors.splice(C,1)}_getAll(){let C=[];C[0]=this.primaryCursor;for(let d=0,g=this.secondaryCursors.length;dg.selection.startLineNumber===p.selection.startLineNumber?g.selection.startColumn-p.selection.startColumn:g.selection.startLineNumber-p.selection.startLineNumber);for(let g=0;gi&&h.index--;C.splice(i,1),d.splice(r,1),this._removeSecondaryCursor(i-1),g--}}}}}}e.CursorCollection=w}),define(Q[242],J([0,1,12,8,538,42,181,182,3,21,170,2,173]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Cursor=e.CursorModelState=void 0;class s{constructor(n,t){this.modelVersionId=n.getVersionId(),this.cursorState=t.getCursorStates()}equals(n){if(!n||this.modelVersionId!==n.modelVersionId||this.cursorState.length!==n.cursorState.length)return!1;for(let t=0,l=this.cursorState.length;t=t.length||!t[l].strictContainsRange(n[l]))return!1;return!0}}class u extends c.Disposable{constructor(n,t,l,h){super();this._model=n,this._knownModelVersionId=this._model.getVersionId(),this._viewModel=t,this._coordinatesConverter=l,this.context=new w.CursorContext(this._model,this._coordinatesConverter,h),this._cursors=new M.CursorCollection(this.context),this._hasFocus=!1,this._isHandling=!1,this._isDoingComposition=!1,this._selectionsWhenCompositionStarted=null,this._columnSelectData=null,this._autoClosedActions=[],this._prevEditOperationType=0}dispose(){this._cursors.dispose(),this._autoClosedActions=c.dispose(this._autoClosedActions),super.dispose()}updateConfiguration(n){this.context=new w.CursorContext(this._model,this._coordinatesConverter,n),this._cursors.updateContext(this.context)}onLineMappingChanged(n){this._knownModelVersionId===this._model.getVersionId()&&this.setStates(n,"viewModel",0,this.getCursorStates())}setHasFocus(n){this._hasFocus=n}_validateAutoClosedActions(){if(this._autoClosedActions.length>0){let n=this._cursors.getSelections();for(let t=0;tu.MAX_CURSOR_COUNT&&(h=h.slice(0,u.MAX_CURSOR_COUNT),m=!0);const _=new s(this._model,this);return this._cursors.setStates(h),this._cursors.normalize(),this._columnSelectData=null,this._validateAutoClosedActions(),this._emitStateChangedIfNecessary(n,t,l,_,m)}setCursorColumnSelectData(n){this._columnSelectData=n}revealPrimary(n,t,l,h){const m=this._cursors.getViewPositions();if(m.length>1){this._emitCursorRevealRange(n,t,null,this._cursors.getViewSelections(),0,l,h);return}else{const _=m[0],f=new d.Range(_.lineNumber,_.column,_.lineNumber,_.column);this._emitCursorRevealRange(n,t,f,null,0,l,h)}}_revealPrimaryCursor(n,t,l,h,m){const _=this._cursors.getViewPositions();if(_.length>1)this._emitCursorRevealRange(n,t,null,this._cursors.getViewSelections(),l,h,m);else{const f=_[0],v=new d.Range(f.lineNumber,f.column,f.lineNumber,f.column);this._emitCursorRevealRange(n,t,v,null,l,h,m)}}_emitCursorRevealRange(n,t,l,h,m,_,f){n.emitViewEvent(new p.ViewRevealRangeRequestEvent(t,l,h,m,_,f))}saveState(){let n=[];const t=this._cursors.getSelections();for(let l=0,h=t.length;l0){const h=w.CursorState.fromModelSelections(t.resultingSelection);this.setStates(n,"modelChange",t.isUndoing?5:t.isRedoing?6:2,h)&&this._revealPrimaryCursor(n,"modelChange",0,!0,0)}else{const h=this._cursors.readSelectionFromMarkers();this.setStates(n,"modelChange",2,w.CursorState.fromModelSelections(h))}}}getSelection(){return this._cursors.getPrimaryCursor().modelState.selection}getTopMostViewPosition(){return this._cursors.getTopMostViewPosition()}getBottomMostViewPosition(){return this._cursors.getBottomMostViewPosition()}getCursorColumnSelectData(){if(this._columnSelectData)return this._columnSelectData;const n=this._cursors.getPrimaryCursor(),t=n.viewState.selectionStart.getStartPosition(),l=n.viewState.position;return{isReal:!1,fromViewLineNumber:t.lineNumber,fromViewVisualColumn:w.CursorColumns.visibleColumnFromColumn2(this.context.cursorConfig,this._viewModel,t),toViewLineNumber:l.lineNumber,toViewVisualColumn:w.CursorColumns.visibleColumnFromColumn2(this.context.cursorConfig,this._viewModel,l)}}getSelections(){return this._cursors.getSelections()}setSelections(n,t,l,h){this.setStates(n,t,h,w.CursorState.fromModelSelections(l))}getPrevEditOperationType(){return this._prevEditOperationType}setPrevEditOperationType(n){this._prevEditOperationType=n}_pushAutoClosedAction(n,t){let l=[],h=[];for(let f=0,v=n.length;f0&&this._pushAutoClosedAction(l,h),this._prevEditOperationType=n.type}n.shouldPushStackElementAfter&&this._model.pushStackElement()}}_interpretCommandResult(n){(!n||n.length===0)&&(n=this._cursors.readSelectionFromMarkers()),this._columnSelectData=null,this._cursors.setSelections(n),this._cursors.normalize()}_emitStateChangedIfNecessary(n,t,l,h,m){const _=new s(this._model,this);if(_.equals(h))return!1;const f=this._cursors.getSelections(),v=this._cursors.getViewSelections();if(n.emitViewEvent(new p.ViewCursorStateChangedEvent(v,f)),!h||h.cursorState.length!==_.cursorState.length||_.cursorState.some((y,L)=>!y.modelState.equals(h.cursorState[L].modelState))){const y=h?h.cursorState.map(I=>I.modelState.selection):null,L=h?h.modelVersionId:0;n.emitOutgoingEvent(new o.CursorStateChangedEvent(y,f,L,_.modelVersionId,t||"keyboard",l,m))}return!0}_findAutoClosingPairs(n){if(!n.length)return null;let t=[];for(let l=0,h=n.length;l=0)return null;const _=m.text.match(/([)\]}>'"`])([^)\]}>'"`]*)$/);if(!_)return null;const f=_[1],v=this.context.cursorConfig.autoClosingPairs.autoClosingPairsCloseSingleChar.get(f);if(!v||v.length!==1)return null;const y=v[0].open,L=m.text.length-_[2].length-1,I=m.text.lastIndexOf(y,L-1);if(I===-1)return null;t.push([I,L])}return t}executeEdits(n,t,l,h){let m=null;t==="snippet"&&(m=this._findAutoClosingPairs(l)),m&&(l[0]._isTracked=!0);let _=[],f=[];const v=this._model.pushEditOperations(this.getSelections(),l,y=>{if(m)for(let I=0,k=m.length;I0&&this._pushAutoClosedAction(_,f)}_executeEdit(n,t,l,h=0){if(!this.context.cursorConfig.readOnly){const m=new s(this._model,this);this._cursors.stopTrackingSelections(),this._isHandling=!0;try{this._cursors.ensureValidState(),n()}catch(_){b.onUnexpectedError(_)}this._isHandling=!1,this._cursors.startTrackingSelections(),this._validateAutoClosedActions(),this._emitStateChangedIfNecessary(t,l,h,m,!1)&&this._revealPrimaryCursor(t,l,0,!0,0)}}setIsDoingComposition(n){this._isDoingComposition=n}startComposition(n){this._selectionsWhenCompositionStarted=this.getSelections().slice(0)}endComposition(n,t){this._executeEdit(()=>{if(t==="keyboard"){const l=a.getAllAutoClosedCharacters(this._autoClosedActions);this._executeEditOperation(C.TypeOperations.compositionEndWithInterceptors(this._prevEditOperationType,this.context.cursorConfig,this._model,this._selectionsWhenCompositionStarted,this.getSelections(),l)),this._selectionsWhenCompositionStarted=null}},n,t)}type(n,t,l){this._executeEdit(()=>{if(l==="keyboard"){const h=t.length;let m=0;for(;m{const y=v.getPosition();return new g.Selection(y.lineNumber,y.column+m,y.lineNumber,y.column+m)});this.setSelections(n,_,f,0)}return}this._executeEdit(()=>{this._executeEditOperation(C.TypeOperations.compositionType(this._prevEditOperationType,this.context.cursorConfig,this._model,this.getSelections(),t,l,h,m))},n,_)}paste(n,t,l,h,m){this._executeEdit(()=>{this._executeEditOperation(C.TypeOperations.paste(this.context.cursorConfig,this._model,this.getSelections(),t,l,h||[]))},n,m,4)}cut(n,t){this._executeEdit(()=>{this._executeEditOperation(S.DeleteOperations.cut(this.context.cursorConfig,this._model,this.getSelections()))},n,t)}executeCommand(n,t,l){this._executeEdit(()=>{this._cursors.killSecondaryCursors(),this._executeEditOperation(new w.EditOperationResult(0,[t],{shouldPushStackElementBefore:!1,shouldPushStackElementAfter:!1}))},n,l)}executeCommands(n,t,l){this._executeEdit(()=>{this._executeEditOperation(new w.EditOperationResult(0,t,{shouldPushStackElementBefore:!1,shouldPushStackElementAfter:!1}))},n,l)}}e.Cursor=u,u.MAX_CURSOR_COUNT=1e4;class r{static executeCommands(n,t,l){const h={model:n,selectionsBefore:t,trackedRanges:[],trackedRangesDirection:[]},m=this._innerExecuteCommands(h,l);for(let _=0,f=h.trackedRanges.length;_0&&(_[0]._isTracked=!0);let f=n.model.pushEditOperations(n.selectionsBefore,_,y=>{let L=[];for(let E=0;EE.identifier.minor-T.identifier.minor;let k=[];for(let E=0;E0?(L[E].sort(I),k[E]=t[E].computeCursorState(n.model,{getInverseEditOperations:()=>L[E],getTrackedSelection:T=>{const O=parseInt(T,10),A=n.model._getTrackedRange(n.trackedRanges[O]);return n.trackedRangesDirection[O]===0?new g.Selection(A.startLineNumber,A.startColumn,A.endLineNumber,A.endColumn):new g.Selection(A.endLineNumber,A.endColumn,A.startLineNumber,A.startColumn)}})):k[E]=n.selectionsBefore[E];return k});f||(f=n.selectionsBefore);let v=[];for(let y in m)m.hasOwnProperty(y)&&v.push(parseInt(y,10));v.sort((y,L)=>L-y);for(const y of v)f.splice(y,1);return f}static _arrayIsEmpty(n){for(let t=0,l=n.length;t{d.Range.isEmpty(I)&&k===""||h.push({identifier:{major:t,minor:m++},range:I,text:k,forceMoveMarkers:E,isAutoWhitespaceEdit:l.insertsAutoWhitespace})};let f=!1;const L={addEditOperation:_,addTrackedEditOperation:(I,k,E)=>{f=!0,_(I,k,E)},trackSelection:(I,k)=>{const E=g.Selection.liftSelection(I);let T;if(E.isEmpty())if(typeof k=="boolean")k?T=2:T=3;else{const B=n.model.getLineMaxColumn(E.startLineNumber);E.startColumn===B?T=2:T=3}else T=1;const O=n.trackedRanges.length,A=n.model._setTrackedRange(null,E,T);return n.trackedRanges[O]=A,n.trackedRangesDirection[O]=E.getDirection(),O.toString()}};try{l.getEditOperations(n.model,L)}catch(I){return b.onUnexpectedError(I),{operations:[],hadTrackedEditOperation:!1}}return{operations:h,hadTrackedEditOperation:f}}static _getLoserCursorMap(n){n=n.slice(0),n.sort((l,h)=>-d.Range.compareRangesUsingEnds(l.range,h.range));let t={};for(let l=1;lm.identifier.major?_=h.identifier.major:_=m.identifier.major,t[_.toString()]=!0;for(let f=0;f0&&l--}}return t}}}),define(Q[243],J([0,1,8,113,76]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.tokenizeLineToHTML=e.tokenizeToString=void 0;const w={getInitialState:()=>M.NULL_STATE,tokenize2:(g,p,c,o)=>M.nullTokenize2(0,g,c,o)};function S(g,p=w){return d(g,p||w)}e.tokenizeToString=S;function C(g,p,c,o,s,a,u){let r="
    ",i=o,n=0;for(let t=0,l=p.getCount();t0;)m+=u?" ":" ",f--;break;case 60:m+="<";break;case 62:m+=">";break;case 38:m+="&";break;case 0:m+="�";break;case 65279:case 8232:case 8233:case 133:m+="\uFFFD";break;case 13:m+="​";break;case 32:m+=u?" ":" ";break;default:m+=String.fromCharCode(_)}}if(r+=`${m}`,h>s||i>=s)break}}return r+="
    ",r}e.tokenizeLineToHTML=C;function d(g,p){let c='
    ',o=b.splitLines(g),s=p.getInitialState();for(let a=0,u=o.length;a0&&(c+="
    ");let i=p.tokenize2(r,!0,s,0);N.LineTokens.convertToEndOffset(i.tokens,r.length);let t=new N.LineTokens(i.tokens,r).inflate(),l=0;for(let h=0,m=t.getCount();h${b.escape(r.substring(l,f))}`,l=f}s=i.endState}return c+="
    ",c}}),define(Q[67],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITextModelService=void 0,e.ITextModelService=b.createDecorator("textModelService")}),define(Q[137],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITextResourcePropertiesService=e.ITextResourceConfigurationService=void 0,e.ITextResourceConfigurationService=b.createDecorator("textResourceConfigurationService"),e.ITextResourcePropertiesService=b.createDecorator("textResourcePropertiesService")}),define(Q[244],J([0,1,6,216,18]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MinimapTokensColorTracker=void 0;class w{constructor(){this._onDidChange=new b.Emitter,this.onDidChange=this._onDidChange.event,this._updateColorMap(),M.TokenizationRegistry.onDidChange(C=>{C.changedColorMap&&this._updateColorMap()})}static getInstance(){return this._INSTANCE||(this._INSTANCE=new w),this._INSTANCE}_updateColorMap(){const C=M.TokenizationRegistry.getColorMap();if(!C){this._colors=[N.RGBA8.Empty],this._backgroundIsLight=!0;return}this._colors=[N.RGBA8.Empty];for(let g=1;g=.5,this._onDidChange.fire(void 0)}getColor(C){return(C<1||C>=this._colors.length)&&(C=2),this._colors[C]}backgroundIsLight(){return this._backgroundIsLight}}e.MinimapTokensColorTracker=w,w._INSTANCE=null}),define(Q[539],J([0,1,19,14,3,31,170,222,63]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IdentityLinesCollection=e.IdentityCoordinatesConverter=e.SplitLine=e.SplitLinesCollection=e.CoordinatesConverter=void 0;class g{constructor(_){this._lines=_}convertViewPositionToModelPosition(_){return this._lines.convertViewPositionToModelPosition(_.lineNumber,_.column)}convertViewRangeToModelRange(_){return this._lines.convertViewRangeToModelRange(_)}validateViewPosition(_,f){return this._lines.validateViewPosition(_.lineNumber,_.column,f)}validateViewRange(_,f){return this._lines.validateViewRange(_,f)}convertModelPositionToViewPosition(_){return this._lines.convertModelPositionToViewPosition(_.lineNumber,_.column)}convertModelRangeToViewRange(_){return this._lines.convertModelRangeToViewRange(_)}modelPositionIsVisible(_){return this._lines.modelPositionIsVisible(_.lineNumber,_.column)}getModelLineViewLineCount(_){return this._lines.getModelLineViewLineCount(_)}}e.CoordinatesConverter=g;class p{constructor(_){this._counts=_,this._isValid=!1,this._validEndIndex=-1,this._modelToView=[],this._viewToModel=[]}_invalidate(_){this._isValid=!1,this._validEndIndex=Math.min(this._validEndIndex,_-1)}_ensureValid(){if(!this._isValid){for(let _=this._validEndIndex+1,f=this._counts.length;_0?this._modelToView[_-1]:0;this._modelToView[_]=y+v;for(let L=0;L0?this._modelToView[f-1]:0;return new C.PrefixSumIndexOfResult(f,_-v)}}class c{constructor(_,f,v,y,L,I,k,E){this.model=_,this._validModelVersionId=-1,this._domLineBreaksComputerFactory=f,this._monospaceLineBreaksComputerFactory=v,this.fontInfo=y,this.tabSize=L,this.wrappingStrategy=I,this.wrappingColumn=k,this.wrappingIndent=E,this._constructLines(!0,null)}dispose(){this.hiddenAreasIds=this.model.deltaDecorations(this.hiddenAreasIds,[])}createCoordinatesConverter(){return new g(this)}_constructLines(_,f){this.lines=[],_&&(this.hiddenAreasIds=[]);let v=this.model.getLinesContent();const y=v.length,L=this.createLineBreaksComputer();for(let F=0;Fthis.model.getDecorationRange(F)).sort(M.Range.compareRangesUsingStarts),T=1,O=0,A=-1,B=A+1=T&&D<=O,W=n(I[F],!R);k[F]=W.getViewLineCount(),this.lines[F]=W}this._validModelVersionId=this.model.getVersionId(),this.prefixSumComputer=new p(k)}getHiddenAreas(){return this.hiddenAreasIds.map(_=>this.model.getDecorationRange(_))}_reduceRanges(_){if(_.length===0)return[];let f=_.map(I=>this.model.validateRange(I)).sort(M.Range.compareRangesUsingStarts),v=[],y=f[0].startLineNumber,L=f[0].endLineNumber;for(let I=1,k=f.length;IL+1?(v.push(new M.Range(y,1,L,1)),y=E.startLineNumber,L=E.endLineNumber):E.endLineNumber>L&&(L=E.endLineNumber)}return v.push(new M.Range(y,1,L,1)),v}setHiddenAreas(_){let f=this._reduceRanges(_),v=this.hiddenAreasIds.map(A=>this.model.getDecorationRange(A)).sort(M.Range.compareRangesUsingStarts);if(f.length===v.length){let A=!1;for(let B=0;B=I&&B<=k?this.lines[A].isVisible()&&(this.lines[A]=this.lines[A].setVisible(!1),F=!0):(O=!0,this.lines[A].isVisible()||(this.lines[A]=this.lines[A].setVisible(!0),F=!0)),F){let D=this.lines[A].getViewLineCount();this.prefixSumComputer.changeValue(A,D)}}return O||this.setHiddenAreas([]),!0}modelPositionIsVisible(_,f){return _<1||_>this.lines.length?!1:this.lines[_-1].isVisible()}getModelLineViewLineCount(_){return _<1||_>this.lines.length?1:this.lines[_-1].getViewLineCount()}setTabSize(_){return this.tabSize===_?!1:(this.tabSize=_,this._constructLines(!1,null),!0)}setWrappingSettings(_,f,v,y){const L=this.fontInfo.equals(_),I=this.wrappingStrategy===f,k=this.wrappingColumn===v,E=this.wrappingIndent===y;if(L&&I&&k&&E)return!1;const T=L&&I&&!k&&E;this.fontInfo=_,this.wrappingStrategy=f,this.wrappingColumn=v,this.wrappingIndent=y;let O=null;if(T){O=[];for(let A=0,B=this.lines.length;A2&&!this.lines[f-2].isVisible();let I=f===1?1:this.prefixSumComputer.getAccumulatedValue(f-2)+1,k=0,E=[],T=[];for(let O=0,A=y.length;OE?(O=f===1?1:this.prefixSumComputer.getAccumulatedValue(f-2)+1,A=O+E-1,D=A+1,R=D+(L-E)-1,T=!0):Lf?f:_|0}getActiveIndentGuide(_,f,v){_=this._toValidViewLineNumber(_),f=this._toValidViewLineNumber(f),v=this._toValidViewLineNumber(v);const y=this.convertViewPositionToModelPosition(_,this.getViewLineMinColumn(_)),L=this.convertViewPositionToModelPosition(f,this.getViewLineMinColumn(f)),I=this.convertViewPositionToModelPosition(v,this.getViewLineMinColumn(v)),k=this.model.getActiveIndentGuide(y.lineNumber,L.lineNumber,I.lineNumber),E=this.convertModelPositionToViewPosition(k.startLineNumber,1),T=this.convertModelPositionToViewPosition(k.endLineNumber,this.model.getLineMaxColumn(k.endLineNumber));return{startLineNumber:E.lineNumber,endLineNumber:T.lineNumber,indent:k.indent}}getViewLinesIndentGuides(_,f){_=this._toValidViewLineNumber(_),f=this._toValidViewLineNumber(f);const v=this.convertViewPositionToModelPosition(_,this.getViewLineMinColumn(_)),y=this.convertViewPositionToModelPosition(f,this.getViewLineMaxColumn(f));let L=[],I=[],k=[];const E=v.lineNumber-1,T=y.lineNumber-1;let O=null;for(let D=E;D<=T;D++){const R=this.lines[D];if(R.isVisible()){let W=R.getViewLineNumberOfModelPosition(0,D===E?v.column:1),x=R.getViewLineNumberOfModelPosition(0,this.model.getLineMaxColumn(D+1)),K=x-W+1,Y=0;K>1&&R.getViewLineMinColumn(this.model,D+1,x)===1&&(Y=W===0?1:2),I.push(K),k.push(Y),O===null&&(O=new N.Position(D+1,0))}else O!==null&&(L=L.concat(this.model.getLinesIndentGuides(O.lineNumber,D)),O=null)}O!==null&&(L=L.concat(this.model.getLinesIndentGuides(O.lineNumber,y.lineNumber)),O=null);const A=f-_+1;let B=new Array(A),F=0;for(let D=0,R=L.length;Df&&(D=!0,F=f-L+1);let R=B+F;if(A.getViewLinesData(this.model,T+1,B,R,L-_,v,E),L+=F,D)break}}return E}validateViewPosition(_,f,v){_=this._toValidViewLineNumber(_);let y=this.prefixSumComputer.getIndexOf(_-1),L=y.index,I=y.remainder,k=this.lines[L],E=k.getViewLineMinColumn(this.model,L+1,I),T=k.getViewLineMaxColumn(this.model,L+1,I);fT&&(f=T);let O=k.getModelColumnOfViewPosition(I,f);return this.model.validatePosition(new N.Position(L+1,O)).equals(v)?new N.Position(_,f):this.convertModelPositionToViewPosition(v.lineNumber,v.column)}validateViewRange(_,f){const v=this.validateViewPosition(_.startLineNumber,_.startColumn,f.getStartPosition()),y=this.validateViewPosition(_.endLineNumber,_.endColumn,f.getEndPosition());return new M.Range(v.lineNumber,v.column,y.lineNumber,y.column)}convertViewPositionToModelPosition(_,f){_=this._toValidViewLineNumber(_);let v=this.prefixSumComputer.getIndexOf(_-1),y=v.index,L=v.remainder,I=this.lines[y].getModelColumnOfViewPosition(L,f);return this.model.validatePosition(new N.Position(y+1,I))}convertViewRangeToModelRange(_){const f=this.convertViewPositionToModelPosition(_.startLineNumber,_.startColumn),v=this.convertViewPositionToModelPosition(_.endLineNumber,_.endColumn);return new M.Range(f.lineNumber,f.column,v.lineNumber,v.column)}convertModelPositionToViewPosition(_,f){const v=this.model.validatePosition(new N.Position(_,f)),y=v.lineNumber,L=v.column;let I=y-1,k=!1;for(;I>0&&!this.lines[I].isVisible();)I--,k=!0;if(I===0&&!this.lines[I].isVisible())return new N.Position(1,1);const E=1+(I===0?0:this.prefixSumComputer.getAccumulatedValue(I-1));let T;return k?T=this.lines[I].getViewPositionOfModelPosition(E,this.model.getLineMaxColumn(I+1)):T=this.lines[y-1].getViewPositionOfModelPosition(E,L),T}convertModelRangeToViewRange(_){let f=this.convertModelPositionToViewPosition(_.startLineNumber,_.startColumn),v=this.convertModelPositionToViewPosition(_.endLineNumber,_.endColumn);return _.startLineNumber===_.endLineNumber&&f.lineNumber!==v.lineNumber&&v.column===this.getViewLineMinColumn(v.lineNumber)?new M.Range(f.lineNumber,f.column,v.lineNumber-1,this.getViewLineMaxColumn(v.lineNumber-1)):new M.Range(f.lineNumber,f.column,v.lineNumber,v.column)}_getViewLineNumberForModelPosition(_,f){let v=_-1;if(this.lines[v].isVisible()){const L=1+(v===0?0:this.prefixSumComputer.getAccumulatedValue(v-1));return this.lines[v].getViewLineNumberOfModelPosition(L,f)}for(;v>0&&!this.lines[v].isVisible();)v--;if(v===0&&!this.lines[v].isVisible())return 1;const y=1+(v===0?0:this.prefixSumComputer.getAccumulatedValue(v-1));return this.lines[v].getViewLineNumberOfModelPosition(y,this.model.getLineMaxColumn(v+1))}getAllOverviewRulerDecorations(_,f,v){const y=this.model.getOverviewRulerDecorations(_,f),L=new h;for(const I of y){const k=I.options.overviewRuler,E=k?k.position:0;if(E!==0){const T=k.getColor(v),O=this._getViewLineNumberForModelPosition(I.range.startLineNumber,I.range.startColumn),A=this._getViewLineNumberForModelPosition(I.range.endLineNumber,I.range.endColumn);L.accept(T,O,A,E)}}return L.result}getDecorationsInRange(_,f,v){const y=this.convertViewPositionToModelPosition(_.startLineNumber,_.startColumn),L=this.convertViewPositionToModelPosition(_.endLineNumber,_.endColumn);if(L.lineNumber-y.lineNumber<=_.endLineNumber-_.startLineNumber)return this.model.getDecorationsInRange(new M.Range(y.lineNumber,1,L.lineNumber,L.column),f,v);let I=[];const k=y.lineNumber-1,E=L.lineNumber-1;let T=null;for(let F=k;F<=E;F++)if(this.lines[F].isVisible())T===null&&(T=new N.Position(F+1,F===k?y.column:1));else if(T!==null){const R=this.model.getLineMaxColumn(F);I=I.concat(this.model.getDecorationsInRange(new M.Range(T.lineNumber,T.column,F,R),f,v)),T=null}T!==null&&(I=I.concat(this.model.getDecorationsInRange(new M.Range(T.lineNumber,T.column,L.lineNumber,L.column),f,v)),T=null),I.sort((F,D)=>{const R=M.Range.compareRangesUsingStarts(F.range,D.range);return R===0?F.idD.id?1:0:R});let O=[],A=0,B=null;for(const F of I){const D=F.id;B!==D&&(B=D,O[A++]=F)}return O}}e.SplitLinesCollection=c;class o{constructor(){}isVisible(){return!0}setVisible(_){return _?this:s.INSTANCE}getLineBreakData(){return null}getViewLineCount(){return 1}getViewLineContent(_,f,v){return _.getLineContent(f)}getViewLineLength(_,f,v){return _.getLineLength(f)}getViewLineMinColumn(_,f,v){return _.getLineMinColumn(f)}getViewLineMaxColumn(_,f,v){return _.getLineMaxColumn(f)}getViewLineData(_,f,v){let y=_.getLineTokens(f),L=y.getLineContent();return new d.ViewLineData(L,!1,1,L.length+1,0,y.inflate())}getViewLinesData(_,f,v,y,L,I,k){if(!I[L]){k[L]=null;return}k[L]=this.getViewLineData(_,f,0)}getModelColumnOfViewPosition(_,f){return f}getViewPositionOfModelPosition(_,f){return new N.Position(_,f)}getViewLineNumberOfModelPosition(_,f){return _}}o.INSTANCE=new o;class s{constructor(){}isVisible(){return!1}setVisible(_){return _?o.INSTANCE:this}getLineBreakData(){return null}getViewLineCount(){return 0}getViewLineContent(_,f,v){throw new Error("Not supported")}getViewLineLength(_,f,v){throw new Error("Not supported")}getViewLineMinColumn(_,f,v){throw new Error("Not supported")}getViewLineMaxColumn(_,f,v){throw new Error("Not supported")}getViewLineData(_,f,v){throw new Error("Not supported")}getViewLinesData(_,f,v,y,L,I,k){throw new Error("Not supported")}getModelColumnOfViewPosition(_,f){throw new Error("Not supported")}getViewPositionOfModelPosition(_,f){throw new Error("Not supported")}getViewLineNumberOfModelPosition(_,f){throw new Error("Not supported")}}s.INSTANCE=new s;class a{constructor(_,f){this._lineBreakData=_,this._isVisible=f}isVisible(){return this._isVisible}setVisible(_){return this._isVisible=_,this}getLineBreakData(){return this._lineBreakData}getViewLineCount(){return this._isVisible?this._lineBreakData.breakOffsets.length:0}getInputStartOffsetOfOutputLineIndex(_){return d.LineBreakData.getInputOffsetOfOutputPosition(this._lineBreakData.breakOffsets,_,0)}getInputEndOffsetOfOutputLineIndex(_,f,v){return v+1===this._lineBreakData.breakOffsets.length?_.getLineMaxColumn(f)-1:d.LineBreakData.getInputOffsetOfOutputPosition(this._lineBreakData.breakOffsets,v+1,0)}getViewLineContent(_,f,v){if(!this._isVisible)throw new Error("Not supported");let y=this.getInputStartOffsetOfOutputLineIndex(v),L=this.getInputEndOffsetOfOutputLineIndex(_,f,v),I=_.getValueInRange({startLineNumber:f,startColumn:y+1,endLineNumber:f,endColumn:L+1});return v>0&&(I=r(this._lineBreakData.wrappedTextIndentLength)+I),I}getViewLineLength(_,f,v){if(!this._isVisible)throw new Error("Not supported");let y=this.getInputStartOffsetOfOutputLineIndex(v),I=this.getInputEndOffsetOfOutputLineIndex(_,f,v)-y;return v>0&&(I=this._lineBreakData.wrappedTextIndentLength+I),I}getViewLineMinColumn(_,f,v){if(!this._isVisible)throw new Error("Not supported");return v>0?this._lineBreakData.wrappedTextIndentLength+1:1}getViewLineMaxColumn(_,f,v){if(!this._isVisible)throw new Error("Not supported");return this.getViewLineContent(_,f,v).length+1}getViewLineData(_,f,v){if(!this._isVisible)throw new Error("Not supported");let y=this.getInputStartOffsetOfOutputLineIndex(v),L=this.getInputEndOffsetOfOutputLineIndex(_,f,v),I=_.getValueInRange({startLineNumber:f,startColumn:y+1,endLineNumber:f,endColumn:L+1});v>0&&(I=r(this._lineBreakData.wrappedTextIndentLength)+I);let k=v>0?this._lineBreakData.wrappedTextIndentLength+1:1,E=I.length+1,T=v+10&&(O=this._lineBreakData.wrappedTextIndentLength);let A=_.getLineTokens(f);const B=v===0?0:this._lineBreakData.breakOffsetsVisibleColumn[v-1];return new d.ViewLineData(I,T,k,E,B,A.sliceAndInflate(y,L,O))}getViewLinesData(_,f,v,y,L,I,k){if(!this._isVisible)throw new Error("Not supported");for(let E=v;E0&&(v0&&(L+=this._lineBreakData.wrappedTextIndentLength),new N.Position(_+y,L)}getViewLineNumberOfModelPosition(_,f){if(!this._isVisible)throw new Error("Not supported");const v=d.LineBreakData.getOutputPositionOfInputOffset(this._lineBreakData.breakOffsets,f-1);return _+v.outputLineIndex}}e.SplitLine=a;let u=[""];function r(m){if(m>=u.length)for(let _=1;_<=m;_++)u[_]=i(_);return u[m]}function i(m){return new Array(m+1).join(" ")}function n(m,_){return m===null?_?o.INSTANCE:s.INSTANCE:new a(m,_)}class t{constructor(_){this._lines=_}_validPosition(_){return this._lines.model.validatePosition(_)}_validRange(_){return this._lines.model.validateRange(_)}convertViewPositionToModelPosition(_){return this._validPosition(_)}convertViewRangeToModelRange(_){return this._validRange(_)}validateViewPosition(_,f){return this._validPosition(f)}validateViewRange(_,f){return this._validRange(f)}convertModelPositionToViewPosition(_){return this._validPosition(_)}convertModelRangeToViewRange(_){return this._validRange(_)}modelPositionIsVisible(_){const f=this._lines.model.getLineCount();return!(_.lineNumber<1||_.lineNumber>f)}getModelLineViewLineCount(_){return 1}}e.IdentityCoordinatesConverter=t;class l{constructor(_){this.model=_}dispose(){}createCoordinatesConverter(){return new t(this)}getHiddenAreas(){return[]}setHiddenAreas(_){return!1}setTabSize(_){return!1}setWrappingSettings(_,f,v,y){return!1}createLineBreaksComputer(){let _=[];return{addRequest:(f,v)=>{_.push(null)},finalize:()=>_}}onModelFlushed(){}onModelLinesDeleted(_,f,v){return new S.ViewLinesDeletedEvent(f,v)}onModelLinesInserted(_,f,v,y){return new S.ViewLinesInsertedEvent(f,v)}onModelLineChanged(_,f,v){return[!1,new S.ViewLinesChangedEvent(f,f),null,null]}acceptVersionId(_){}getViewLineCount(){return this.model.getLineCount()}getActiveIndentGuide(_,f,v){return{startLineNumber:_,endLineNumber:_,indent:0}}getViewLinesIndentGuides(_,f){const v=f-_+1;let y=new Array(v);for(let L=0;L=f){v>k&&(L[L.length-1]=v);return}L.push(y,f,v)}else this.result[_]=[y,f,v]}}}),define(Q[540],J([0,1,29,2,8,38,14,3,18,243,244,170,398,539,63,455,15,17,242,42,173]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewModel=void 0;const h=!0;class m extends N.Disposable{constructor(f,v,y,L,I,k){super();if(this._editorId=f,this._configuration=v,this.model=y,this._eventDispatcher=new l.ViewModelEventDispatcher,this.onEvent=this._eventDispatcher.onEvent,this.cursorConfig=new t.CursorConfiguration(this.model.getLanguageIdentifier(),this.model.getOptions(),this._configuration),this._tokenizeViewportSoon=this._register(new r.RunOnceScheduler(()=>this.tokenizeViewport(),50)),this._updateConfigurationViewLineCount=this._register(new r.RunOnceScheduler(()=>this._updateConfigurationViewLineCountNow(),0)),this._hasFocus=!1,this._viewportStartLine=-1,this._viewportStartLineTrackedRange=null,this._viewportStartLineDelta=0,h&&this.model.isTooLargeForTokenization())this._lines=new s.IdentityLinesCollection(this.model);else{const E=this._configuration.options,T=E.get(38),O=E.get(118),A=E.get(125),B=E.get(117);this._lines=new s.SplitLinesCollection(this.model,L,I,T,this.model.getOptions().tabSize,O,A.wrappingColumn,B)}this.coordinatesConverter=this._lines.createCoordinatesConverter(),this._cursor=this._register(new n.Cursor(y,this,this.coordinatesConverter,this.cursorConfig)),this.viewLayout=this._register(new o.ViewLayout(this._configuration,this.getLineCount(),k)),this._register(this.viewLayout.onDidScroll(E=>{E.scrollTopChanged&&this._tokenizeViewportSoon.schedule(),this._eventDispatcher.emitSingleViewEvent(new c.ViewScrollChangedEvent(E)),this._eventDispatcher.emitOutgoingEvent(new l.ScrollChangedEvent(E.oldScrollWidth,E.oldScrollLeft,E.oldScrollHeight,E.oldScrollTop,E.scrollWidth,E.scrollLeft,E.scrollHeight,E.scrollTop))})),this._register(this.viewLayout.onDidContentSizeChange(E=>{this._eventDispatcher.emitOutgoingEvent(E)})),this._decorations=new u.ViewModelDecorations(this._editorId,this.model,this._configuration,this._lines,this.coordinatesConverter),this._registerModelEvents(),this._register(this._configuration.onDidChangeFast(E=>{try{const T=this._eventDispatcher.beginEmitViewEvents();this._onConfigurationChanged(T,E)}finally{this._eventDispatcher.endEmitViewEvents()}})),this._register(p.MinimapTokensColorTracker.getInstance().onDidChange(()=>{this._eventDispatcher.emitSingleViewEvent(new c.ViewTokensColorsChangedEvent)})),this._updateConfigurationViewLineCountNow()}dispose(){super.dispose(),this._decorations.dispose(),this._lines.dispose(),this.invalidateMinimapColorCache(),this._viewportStartLineTrackedRange=this.model._setTrackedRange(this._viewportStartLineTrackedRange,null,1),this._eventDispatcher.dispose()}createLineBreaksComputer(){return this._lines.createLineBreaksComputer()}addViewEventHandler(f){this._eventDispatcher.addViewEventHandler(f)}removeViewEventHandler(f){this._eventDispatcher.removeViewEventHandler(f)}_updateConfigurationViewLineCountNow(){this._configuration.setViewLineCount(this._lines.getViewLineCount())}tokenizeViewport(){const f=this.viewLayout.getLinesViewportData(),v=this.coordinatesConverter.convertViewPositionToModelPosition(new S.Position(f.startLineNumber,1)),y=this.coordinatesConverter.convertViewPositionToModelPosition(new S.Position(f.endLineNumber,1));this.model.tokenizeViewport(v.lineNumber,y.lineNumber)}setHasFocus(f){this._hasFocus=f,this._cursor.setHasFocus(f),this._eventDispatcher.emitSingleViewEvent(new c.ViewFocusChangedEvent(f)),this._eventDispatcher.emitOutgoingEvent(new l.FocusChangedEvent(!f,f))}onCompositionStart(){this._eventDispatcher.emitSingleViewEvent(new c.ViewCompositionStartEvent)}onCompositionEnd(){this._eventDispatcher.emitSingleViewEvent(new c.ViewCompositionEndEvent)}onDidColorThemeChange(){this._eventDispatcher.emitSingleViewEvent(new c.ViewThemeChangedEvent)}_onConfigurationChanged(f,v){let y=null;if(this._viewportStartLine!==-1){let A=new S.Position(this._viewportStartLine,this.getLineMinColumn(this._viewportStartLine));y=this.coordinatesConverter.convertViewPositionToModelPosition(A)}let L=!1;const I=this._configuration.options,k=I.get(38),E=I.get(118),T=I.get(125),O=I.get(117);if(this._lines.setWrappingSettings(k,E,T.wrappingColumn,O)&&(f.emitViewEvent(new c.ViewFlushedEvent),f.emitViewEvent(new c.ViewLineMappingChangedEvent),f.emitViewEvent(new c.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(f),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount()),this.viewLayout.getCurrentScrollTop()!==0&&(L=!0),this._updateConfigurationViewLineCount.schedule()),v.hasChanged(75)&&(this._decorations.reset(),f.emitViewEvent(new c.ViewDecorationsChangedEvent(null))),f.emitViewEvent(new c.ViewConfigurationChangedEvent(v)),this.viewLayout.onConfigurationChanged(v),L&&y){const A=this.coordinatesConverter.convertModelPositionToViewPosition(y),B=this.viewLayout.getVerticalOffsetForLineNumber(A.lineNumber);this.viewLayout.setScrollPosition({scrollTop:B+this._viewportStartLineDelta},1)}t.CursorConfiguration.shouldRecreate(v)&&(this.cursorConfig=new t.CursorConfiguration(this.model.getLanguageIdentifier(),this.model.getOptions(),this._configuration),this._cursor.updateConfiguration(this.cursorConfig))}_registerModelEvents(){this._register(this.model.onDidChangeRawContentFast(f=>{try{const v=this._eventDispatcher.beginEmitViewEvents();let y=!1,L=!1;const I=f.changes,k=f.versionId,E=this._lines.createLineBreaksComputer();for(const A of I)switch(A.changeType){case 4:{for(const B of A.detail)E.addRequest(B,null);break}case 2:{E.addRequest(A.detail,null);break}}const T=E.finalize();let O=0;for(const A of I)switch(A.changeType){case 1:{this._lines.onModelFlushed(),v.emitViewEvent(new c.ViewFlushedEvent),this._decorations.reset(),this.viewLayout.onFlushed(this.getLineCount()),y=!0;break}case 3:{const B=this._lines.onModelLinesDeleted(k,A.fromLineNumber,A.toLineNumber);B!==null&&(v.emitViewEvent(B),this.viewLayout.onLinesDeleted(B.fromLineNumber,B.toLineNumber)),y=!0;break}case 4:{const B=T.slice(O,O+A.detail.length);O+=A.detail.length;const F=this._lines.onModelLinesInserted(k,A.fromLineNumber,A.toLineNumber,B);F!==null&&(v.emitViewEvent(F),this.viewLayout.onLinesInserted(F.fromLineNumber,F.toLineNumber)),y=!0;break}case 2:{const B=T[O];O++;const[F,D,R,W]=this._lines.onModelLineChanged(k,A.lineNumber,B);L=F,D&&v.emitViewEvent(D),R&&(v.emitViewEvent(R),this.viewLayout.onLinesInserted(R.fromLineNumber,R.toLineNumber)),W&&(v.emitViewEvent(W),this.viewLayout.onLinesDeleted(W.fromLineNumber,W.toLineNumber));break}case 5:break}this._lines.acceptVersionId(k),this.viewLayout.onHeightMaybeChanged(),!y&&L&&(v.emitViewEvent(new c.ViewLineMappingChangedEvent),v.emitViewEvent(new c.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(v),this._decorations.onLineMappingChanged())}finally{this._eventDispatcher.endEmitViewEvents()}if(this._viewportStartLine=-1,this._configuration.setMaxLineNumber(this.model.getLineCount()),this._updateConfigurationViewLineCountNow(),!this._hasFocus&&this.model.getAttachedEditorCount()>=2&&this._viewportStartLineTrackedRange){const v=this.model._getTrackedRange(this._viewportStartLineTrackedRange);if(v){const y=this.coordinatesConverter.convertModelPositionToViewPosition(v.getStartPosition()),L=this.viewLayout.getVerticalOffsetForLineNumber(y.lineNumber);this.viewLayout.setScrollPosition({scrollTop:L+this._viewportStartLineDelta},1)}}try{const v=this._eventDispatcher.beginEmitViewEvents();this._cursor.onModelContentChanged(v,f)}finally{this._eventDispatcher.endEmitViewEvents()}})),this._register(this.model.onDidChangeTokens(f=>{let v=[];for(let y=0,L=f.ranges.length;y{this._eventDispatcher.emitSingleViewEvent(new c.ViewLanguageConfigurationEvent),this.cursorConfig=new t.CursorConfiguration(this.model.getLanguageIdentifier(),this.model.getOptions(),this._configuration),this._cursor.updateConfiguration(this.cursorConfig)})),this._register(this.model.onDidChangeLanguage(f=>{this.cursorConfig=new t.CursorConfiguration(this.model.getLanguageIdentifier(),this.model.getOptions(),this._configuration),this._cursor.updateConfiguration(this.cursorConfig)})),this._register(this.model.onDidChangeOptions(f=>{if(this._lines.setTabSize(this.model.getOptions().tabSize)){try{const v=this._eventDispatcher.beginEmitViewEvents();v.emitViewEvent(new c.ViewFlushedEvent),v.emitViewEvent(new c.ViewLineMappingChangedEvent),v.emitViewEvent(new c.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(v),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount())}finally{this._eventDispatcher.endEmitViewEvents()}this._updateConfigurationViewLineCount.schedule()}this.cursorConfig=new t.CursorConfiguration(this.model.getLanguageIdentifier(),this.model.getOptions(),this._configuration),this._cursor.updateConfiguration(this.cursorConfig)})),this._register(this.model.onDidChangeDecorations(f=>{this._decorations.onModelDecorationsChanged(),this._eventDispatcher.emitSingleViewEvent(new c.ViewDecorationsChangedEvent(f))}))}setHiddenAreas(f){try{const v=this._eventDispatcher.beginEmitViewEvents();this._lines.setHiddenAreas(f)&&(v.emitViewEvent(new c.ViewFlushedEvent),v.emitViewEvent(new c.ViewLineMappingChangedEvent),v.emitViewEvent(new c.ViewDecorationsChangedEvent(null)),this._cursor.onLineMappingChanged(v),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount()),this.viewLayout.onHeightMaybeChanged())}finally{this._eventDispatcher.endEmitViewEvents()}this._updateConfigurationViewLineCount.schedule()}getVisibleRangesPlusViewportAboveBelow(){const f=this._configuration.options.get(124),v=this._configuration.options.get(53),y=Math.max(20,Math.round(f.height/v)),L=this.viewLayout.getLinesViewportData(),I=Math.max(1,L.completelyVisibleStartLineNumber-y),k=Math.min(this.getLineCount(),L.completelyVisibleEndLineNumber+y);return this._toModelVisibleRanges(new C.Range(I,this.getLineMinColumn(I),k,this.getLineMaxColumn(k)))}getVisibleRanges(){const f=this.getCompletelyVisibleViewRange();return this._toModelVisibleRanges(f)}_toModelVisibleRanges(f){const v=this.coordinatesConverter.convertViewRangeToModelRange(f),y=this._lines.getHiddenAreas();if(y.length===0)return[v];let L=[],I=0,k=v.startLineNumber,E=v.startColumn,T=v.endLineNumber,O=v.endColumn;for(let A=0,B=y.length;AT||(kA.startLineNumber);let O="";for(let A=0;A0&&T[A-1]===T[A]||(O+=this.model.getLineContent(T[A])+L);return O}if(I&&v){let T=[],O=0;for(const A of f){const B=A.startLineNumber;A.isEmpty()?B!==O&&T.push(this.model.getLineContent(B)):T.push(this.model.getValueInRange(A,y?2:0)),O=B}return T.length===1?T[0]:T}let E=[];for(const T of f)T.isEmpty()||E.push(this.model.getValueInRange(T,y?2:0));return E.length===1?E[0]:E}getRichTextToCopy(f,v){const y=this.model.getLanguageIdentifier();if(y.id===1||f.length!==1)return null;let L=f[0];if(L.isEmpty()){if(!v)return null;const T=L.startLineNumber;L=new C.Range(T,this.model.getLineMinColumn(T),T,this.model.getLineMaxColumn(T))}const I=this._configuration.options.get(38),k=this._getColorMap(),E=I.fontFamily===w.EDITOR_FONT_DEFAULTS.fontFamily?I.fontFamily:`'${I.fontFamily}', ${w.EDITOR_FONT_DEFAULTS.fontFamily}`;return{mode:y.language,html:`
    `+this._getHTMLToCopy(L,k)+"
    "}}_getHTMLToCopy(f,v){const y=f.startLineNumber,L=f.startColumn,I=f.endLineNumber,k=f.endColumn,E=this.getTabSize();let T="";for(let O=y;O<=I;O++){const A=this.model.getLineTokens(O),B=A.getLineContent(),F=O===y?L-1:0,D=O===I?k-1:B.length;B===""?T+="
    ":T+=g.tokenizeLineToHTML(B,A.inflate(),v,F,D,E,i.isWindows)}return T}_getColorMap(){let f=d.TokenizationRegistry.getColorMap(),v=["#000000"];if(f)for(let y=1,L=f.length;ythis._cursor.setStates(L,f,v,y))}getCursorColumnSelectData(){return this._cursor.getCursorColumnSelectData()}setCursorColumnSelectData(f){this._cursor.setCursorColumnSelectData(f)}getPrevEditOperationType(){return this._cursor.getPrevEditOperationType()}setPrevEditOperationType(f){this._cursor.setPrevEditOperationType(f)}getSelection(){return this._cursor.getSelection()}getSelections(){return this._cursor.getSelections()}getPosition(){return this._cursor.getPrimaryCursorState().modelState.position}setSelections(f,v,y=0){this._withViewEventsCollector(L=>this._cursor.setSelections(L,f,v,y))}saveCursorState(){return this._cursor.saveState()}restoreCursorState(f){this._withViewEventsCollector(v=>this._cursor.restoreState(v,f))}_executeCursorEdit(f){if(this._cursor.context.cursorConfig.readOnly){this._eventDispatcher.emitOutgoingEvent(new l.ReadOnlyEditAttemptEvent);return}this._withViewEventsCollector(f)}executeEdits(f,v,y){this._executeCursorEdit(L=>this._cursor.executeEdits(L,f,v,y))}startComposition(){this._cursor.setIsDoingComposition(!0),this._executeCursorEdit(f=>this._cursor.startComposition(f))}endComposition(f){this._cursor.setIsDoingComposition(!1),this._executeCursorEdit(v=>this._cursor.endComposition(v,f))}type(f,v){this._executeCursorEdit(y=>this._cursor.type(y,f,v))}compositionType(f,v,y,L,I){this._executeCursorEdit(k=>this._cursor.compositionType(k,f,v,y,L,I))}paste(f,v,y,L){this._executeCursorEdit(I=>this._cursor.paste(I,f,v,y,L))}cut(f){this._executeCursorEdit(v=>this._cursor.cut(v,f))}executeCommand(f,v){this._executeCursorEdit(y=>this._cursor.executeCommand(y,f,v))}executeCommands(f,v){this._executeCursorEdit(y=>this._cursor.executeCommands(y,f,v))}revealPrimaryCursor(f,v){this._withViewEventsCollector(y=>this._cursor.revealPrimary(y,f,v,0))}revealTopMostCursor(f){const v=this._cursor.getTopMostViewPosition(),y=new C.Range(v.lineNumber,v.column,v.lineNumber,v.column);this._withViewEventsCollector(L=>L.emitViewEvent(new c.ViewRevealRangeRequestEvent(f,y,null,0,!0,0)))}revealBottomMostCursor(f){const v=this._cursor.getBottomMostViewPosition(),y=new C.Range(v.lineNumber,v.column,v.lineNumber,v.column);this._withViewEventsCollector(L=>L.emitViewEvent(new c.ViewRevealRangeRequestEvent(f,y,null,0,!0,0)))}revealRange(f,v,y,L,I){this._withViewEventsCollector(k=>k.emitViewEvent(new c.ViewRevealRangeRequestEvent(f,y,null,L,v,I)))}getVerticalOffsetForLineNumber(f){return this.viewLayout.getVerticalOffsetForLineNumber(f)}getScrollTop(){return this.viewLayout.getCurrentScrollTop()}setScrollTop(f,v){this.viewLayout.setScrollPosition({scrollTop:f},v)}setScrollPosition(f,v){this.viewLayout.setScrollPosition(f,v)}deltaScrollNow(f,v){this.viewLayout.deltaScrollNow(f,v)}changeWhitespace(f){this.viewLayout.changeWhitespace(f)&&(this._eventDispatcher.emitSingleViewEvent(new c.ViewZonesChangedEvent),this._eventDispatcher.emitOutgoingEvent(new l.ViewZonesChangedEvent))}setMaxLineWidth(f){this.viewLayout.setMaxLineWidth(f)}_withViewEventsCollector(f){try{const v=this._eventDispatcher.beginEmitViewEvents();f(v)}finally{this._eventDispatcher.endEmitViewEvents()}}}e.ViewModel=m}),define(Q[245],J([0,1,19,23,12,51,3,18,54,134]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OutlineModel=e.OutlineGroup=e.OutlineElement=e.TreeElement=void 0;class p{remove(){this.parent&&this.parent.children.delete(this.id)}static findId(u,r){let i;typeof u=="string"?i=`${r.id}/${u}`:(i=`${r.id}/${u.name}`,r.children.get(i)!==void 0&&(i=`${r.id}/${u.name}_${u.range.startLineNumber}_${u.range.startColumn}`));let n=i;for(let t=0;r.children.get(n)!==void 0;t++)n=`${i}_${t}`;return n}static empty(u){return u.children.size===0}}e.TreeElement=p;class c extends p{constructor(u,r,i){super();this.id=u,this.parent=r,this.symbol=i,this.children=new Map}}e.OutlineElement=c;class o extends p{constructor(u,r,i,n){super();this.id=u,this.parent=r,this.label=i,this.order=n,this.children=new Map}}e.OutlineGroup=o;class s extends p{constructor(u){super();this.uri=u,this.id="root",this.parent=void 0,this._groups=new Map,this.children=new Map,this.id="root",this.parent=void 0}static create(u,r){let i=this._keys.for(u,!0),n=s._requests.get(i);if(!n){let t=new N.CancellationTokenSource;n={promiseCnt:0,source:t,promise:s._create(u,t.token),model:void 0},s._requests.set(i,n);const l=Date.now();n.promise.then(()=>{this._requestDurations.update(u,Date.now()-l)})}return n.model?Promise.resolve(n.model):(n.promiseCnt+=1,r.onCancellationRequested(()=>{--n.promiseCnt==0&&(n.source.cancel(),s._requests.delete(i))}),new Promise((t,l)=>{n.promise.then(h=>{n.model=h,t(h)},h=>{s._requests.delete(i),l(h)})}))}static _create(u,r){const i=new N.CancellationTokenSource(r),n=new s(u.uri),t=C.DocumentSymbolProviderRegistry.ordered(u),l=t.map((m,_)=>{var f;let v=p.findId(`provider_${_}`,n),y=new o(v,n,(f=m.displayName)!==null&&f!==void 0?f:"Unknown Outline Provider",_);return Promise.resolve(m.provideDocumentSymbols(u,i.token)).then(L=>{for(const I of L||[])s._makeOutlineElement(I,y);return y},L=>(M.onUnexpectedExternalError(L),y)).then(L=>{p.empty(L)?L.remove():n._groups.set(v,L)})}),h=C.DocumentSymbolProviderRegistry.onDidChange(()=>{const m=C.DocumentSymbolProviderRegistry.ordered(u);b.equals(m,t)||i.cancel()});return Promise.all(l).then(()=>i.token.isCancellationRequested&&!r.isCancellationRequested?s._create(u,r):n._compact()).finally(()=>{h.dispose()})}static _makeOutlineElement(u,r){let i=p.findId(u,r),n=new c(i,r,u);if(u.children)for(const t of u.children)s._makeOutlineElement(t,n);r.children.set(n.id,n)}_compact(){let u=0;for(const[r,i]of this._groups)i.children.size===0?this._groups.delete(r):u+=1;if(u!==1)this.children=this._groups;else{let r=d.Iterable.first(this._groups.values());for(let[,i]of r.children)i.parent=this,this.children.set(i.id,i)}return this}getTopLevelSymbols(){const u=[];for(const r of this.children.values())r instanceof c?u.push(r.symbol):u.push(...d.Iterable.map(r.children.values(),i=>i.symbol));return u.sort((r,i)=>S.Range.compareRangesUsingStarts(r.range,i.range))}asListOfDocumentSymbols(){const u=this.getTopLevelSymbols(),r=[];return s._flattenDocumentSymbols(r,u,""),r.sort((i,n)=>S.Range.compareRangesUsingStarts(i.range,n.range))}static _flattenDocumentSymbols(u,r,i){for(const n of r)u.push({kind:n.kind,tags:n.tags,name:n.name,detail:n.detail,containerName:n.containerName||i,range:n.range,selectionRange:n.selectionRange,children:void 0}),n.children&&s._flattenDocumentSymbols(u,n.children,n.name)}}e.OutlineModel=s,s._requestDurations=new g.LanguageFeatureRequestDelays(C.DocumentSymbolProviderRegistry,350),s._requests=new w.LRUCache(9,.75),s._keys=new class{constructor(){this._counter=1,this._data=new WeakMap}for(a,u){return`${a.id}/${u?a.getVersionId():""}/${this._hash(C.DocumentSymbolProviderRegistry.all(a))}`}_hash(a){let u="";for(const r of a){let i=this._data.get(r);typeof i=="undefined"&&(i=this._counter++,this._data.set(r,i)),u+=i}return u}}}),define(Q[541],J([0,1,174,31,41]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.computeRanges=e.RangesCollector=e.IndentRangeProvider=e.ID_INDENT_PROVIDER=void 0;const w=5e3;e.ID_INDENT_PROVIDER="indent";class S{constructor(p){this.editorModel=p,this.id=e.ID_INDENT_PROVIDER}dispose(){}compute(p){let c=M.LanguageConfigurationRegistry.getFoldingRules(this.editorModel.getLanguageIdentifier().id),o=c&&!!c.offSide,s=c&&c.markers;return Promise.resolve(d(this.editorModel,o,s))}}e.IndentRangeProvider=S;class C{constructor(p){this._startIndexes=[],this._endIndexes=[],this._indentOccurrences=[],this._length=0,this._foldingRangesLimit=p}insertFirst(p,c,o){if(!(p>b.MAX_LINE_NUMBER||c>b.MAX_LINE_NUMBER)){let s=this._length;this._startIndexes[s]=p,this._endIndexes[s]=c,this._length++,o<1e3&&(this._indentOccurrences[o]=(this._indentOccurrences[o]||0)+1)}}toIndentRanges(p){if(this._length<=this._foldingRangesLimit){let c=new Uint32Array(this._length),o=new Uint32Array(this._length);for(let s=this._length-1,a=0;s>=0;s--,a++)c[a]=this._startIndexes[s],o[a]=this._endIndexes[s];return new b.FoldingRegions(c,o)}else{let c=0,o=this._indentOccurrences.length;for(let r=0;rthis._foldingRangesLimit){o=r;break}c+=i}}const s=p.getOptions().tabSize;let a=new Uint32Array(this._foldingRangesLimit),u=new Uint32Array(this._foldingRangesLimit);for(let r=this._length-1,i=0;r>=0;r--){let n=this._startIndexes[r],t=p.getLineContent(n),l=N.TextModel.computeIndentLevel(t,s);(l0;n--){let t=g.getLineContent(n),l=N.TextModel.computeIndentLevel(t,s),h=r[r.length-1];if(l===-1){p&&(h.endAbove=n);continue}let m;if(u&&(m=t.match(u)))if(m[1]){let _=r.length-1;for(;_>0&&r[_].indent!==-2;)_--;if(_>0){r.length=_+1,h=r[_],a.insertFirst(n,h.line,l),h.line=n,h.indent=l,h.endAbove=n;continue}}else{r.push({indent:-2,endAbove:n,line:n});continue}if(h.indent>l){do r.pop(),h=r[r.length-1];while(h.indent>l);let _=h.endAbove-1;_-n>=1&&a.insertFirst(n,_,l)}h.indent===l?h.endAbove=n:r.push({indent:l,endAbove:n,line:n})}return a.toIndentRanges(g)}e.computeRanges=d}),define(Q[542],J([0,1,8,179,3,21,109,41,229]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MoveLinesCommand=void 0;class g{constructor(c,o,s){this._selection=c,this._isMovingDown=o,this._autoIndent=s,this._selectionId=null,this._moveEndLineSelectionShrink=!1}getEditOperations(c,o){let s=c.getLineCount();if(this._isMovingDown&&this._selection.endLineNumber===s){this._selectionId=o.trackSelection(this._selection);return}if(!this._isMovingDown&&this._selection.startLineNumber===1){this._selectionId=o.trackSelection(this._selection);return}this._moveEndPositionDown=!1;let a=this._selection;a.startLineNumberc.getLineTokens(l),getLanguageIdentifier:()=>c.getLanguageIdentifier(),getLanguageIdAtPosition:(l,h)=>c.getLanguageIdAtPosition(l,h),getLineContent:null};if(a.startLineNumber===a.endLineNumber&&c.getLineMaxColumn(a.startLineNumber)===1){let l=a.startLineNumber,h=this._isMovingDown?l+1:l-1;c.getLineMaxColumn(h)===1?o.addEditOperation(new M.Range(1,1,1,1),null):(o.addEditOperation(new M.Range(l,1,l,1),c.getLineContent(h)),o.addEditOperation(new M.Range(h,1,h,c.getLineMaxColumn(h)),null)),a=new w.Selection(h,1,h,1)}else{let l,h;if(this._isMovingDown){l=a.endLineNumber+1,h=c.getLineContent(l),o.addEditOperation(new M.Range(l-1,c.getLineMaxColumn(l-1),l,c.getLineMaxColumn(l)),null);let m=h;if(this.shouldAutoIndent(c,a)){let _=this.matchEnterRule(c,n,u,l,a.startLineNumber-1);if(_!==null){let v=b.getLeadingWhitespace(c.getLineContent(l)),y=_+d.getSpaceCnt(v,u);m=d.generateIndent(y,u,i)+this.trimLeft(h)}else{t.getLineContent=y=>y===a.startLineNumber?c.getLineContent(l):c.getLineContent(y);let v=C.LanguageConfigurationRegistry.getGoodIndentForLine(this._autoIndent,t,c.getLanguageIdAtPosition(l,1),a.startLineNumber,n);if(v!==null){let y=b.getLeadingWhitespace(c.getLineContent(l)),L=d.getSpaceCnt(v,u),I=d.getSpaceCnt(y,u);L!==I&&(m=d.generateIndent(L,u,i)+this.trimLeft(h))}}o.addEditOperation(new M.Range(a.startLineNumber,1,a.startLineNumber,1),m+` +`);let f=this.matchEnterRuleMovingDown(c,n,u,a.startLineNumber,l,m);if(f!==null)f!==0&&this.getIndentEditsOfMovingBlock(c,o,a,u,i,f);else{t.getLineContent=y=>y===a.startLineNumber?m:y>=a.startLineNumber+1&&y<=a.endLineNumber+1?c.getLineContent(y-1):c.getLineContent(y);let v=C.LanguageConfigurationRegistry.getGoodIndentForLine(this._autoIndent,t,c.getLanguageIdAtPosition(l,1),a.startLineNumber+1,n);if(v!==null){const y=b.getLeadingWhitespace(c.getLineContent(a.startLineNumber)),L=d.getSpaceCnt(v,u),I=d.getSpaceCnt(y,u);if(L!==I){const k=L-I;this.getIndentEditsOfMovingBlock(c,o,a,u,i,k)}}}}else o.addEditOperation(new M.Range(a.startLineNumber,1,a.startLineNumber,1),m+` +`)}else if(l=a.startLineNumber-1,h=c.getLineContent(l),o.addEditOperation(new M.Range(l,1,l+1,1),null),o.addEditOperation(new M.Range(a.endLineNumber,c.getLineMaxColumn(a.endLineNumber),a.endLineNumber,c.getLineMaxColumn(a.endLineNumber)),` +`+h),this.shouldAutoIndent(c,a)){t.getLineContent=_=>_===l?c.getLineContent(a.startLineNumber):c.getLineContent(_);let m=this.matchEnterRule(c,n,u,a.startLineNumber,a.startLineNumber-2);if(m!==null)m!==0&&this.getIndentEditsOfMovingBlock(c,o,a,u,i,m);else{let _=C.LanguageConfigurationRegistry.getGoodIndentForLine(this._autoIndent,t,c.getLanguageIdAtPosition(a.startLineNumber,1),l,n);if(_!==null){let f=b.getLeadingWhitespace(c.getLineContent(a.startLineNumber)),v=d.getSpaceCnt(_,u),y=d.getSpaceCnt(f,u);if(v!==y){let L=v-y;this.getIndentEditsOfMovingBlock(c,o,a,u,i,L)}}}}}this._selectionId=o.trackSelection(a)}buildIndentConverter(c,o,s){return{shiftIndent:a=>N.ShiftCommand.shiftIndent(a,a.length+1,c,o,s),unshiftIndent:a=>N.ShiftCommand.unshiftIndent(a,a.length+1,c,o,s)}}parseEnterResult(c,o,s,a,u){if(u){let r=u.indentation;u.indentAction===S.IndentAction.None||u.indentAction===S.IndentAction.Indent?r=u.indentation+u.appendText:u.indentAction===S.IndentAction.IndentOutdent?r=u.indentation:u.indentAction===S.IndentAction.Outdent&&(r=o.unshiftIndent(u.indentation)+u.appendText);let i=c.getLineContent(a);if(this.trimLeft(i).indexOf(this.trimLeft(r))>=0){let n=b.getLeadingWhitespace(c.getLineContent(a)),t=b.getLeadingWhitespace(r),l=C.LanguageConfigurationRegistry.getIndentMetadata(c,a);l!==null&&l&2&&(t=o.unshiftIndent(t));let h=d.getSpaceCnt(t,s),m=d.getSpaceCnt(n,s);return h-m}}return null}matchEnterRuleMovingDown(c,o,s,a,u,r){if(b.lastNonWhitespaceIndex(r)>=0){let i=c.getLineMaxColumn(u),n=C.LanguageConfigurationRegistry.getEnterAction(this._autoIndent,c,new M.Range(u,i,u,i));return this.parseEnterResult(c,o,s,a,n)}else{let i=a-1;for(;i>=1;){let l=c.getLineContent(i);if(b.lastNonWhitespaceIndex(l)>=0)break;i--}if(i<1||a>c.getLineCount())return null;let n=c.getLineMaxColumn(i),t=C.LanguageConfigurationRegistry.getEnterAction(this._autoIndent,c,new M.Range(i,n,i,n));return this.parseEnterResult(c,o,s,a,t)}}matchEnterRule(c,o,s,a,u,r){let i=u;for(;i>=1;){let l;if(i===u&&r!==void 0?l=r:l=c.getLineContent(i),b.lastNonWhitespaceIndex(l)>=0)break;i--}if(i<1||a>c.getLineCount())return null;let n=c.getLineMaxColumn(i),t=C.LanguageConfigurationRegistry.getEnterAction(this._autoIndent,c,new M.Range(i,n,i,n));return this.parseEnterResult(c,o,s,a,t)}trimLeft(c){return c.replace(/^\s+/,"")}shouldAutoIndent(c,o){if(this._autoIndent<4||!c.isCheapToTokenize(o.startLineNumber))return!1;let s=c.getLanguageIdAtPosition(o.startLineNumber,1),a=c.getLanguageIdAtPosition(o.endLineNumber,1);return!(s!==a||C.LanguageConfigurationRegistry.getIndentRulesSupport(s)===null)}getIndentEditsOfMovingBlock(c,o,s,a,u,r){for(let i=s.startLineNumber;i<=s.endLineNumber;i++){let n=c.getLineContent(i),t=b.getLeadingWhitespace(n),h=d.getSpaceCnt(t,a)+r,m=d.generateIndent(h,a,u);m!==t&&(o.addEditOperation(new M.Range(i,1,i,t.length+1),m),i===s.endLineNumber&&s.endColumn<=t.length+1&&m===""&&(this._moveEndLineSelectionShrink=!0))}}computeCursorState(c,o){let s=o.getTrackedSelection(this._selectionId);return this._moveEndPositionDown&&(s=s.setEndPosition(s.endLineNumber+1,1)),this._moveEndLineSelectionShrink&&s.startLineNumber{const h=this._getWidth(l);this.domNode.style.width=h+"px",this.domNode.style.left=this._getLeft(l)+"px",this._onWidth(h)}))}dispose(){this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this._viewZone&&this.editor.changeViewZones(n=>{this._viewZone&&n.removeZone(this._viewZone.id),this._viewZone=null}),this.editor.deltaDecorations(this._positionMarkerId,[]),this._positionMarkerId=[],this._disposables.dispose()}create(){this.domNode.classList.add("zone-widget"),this.options.className&&this.domNode.classList.add(this.options.className),this.container=document.createElement("div"),this.container.classList.add("zone-widget-container"),this.domNode.appendChild(this.container),this.options.showArrow&&(this._arrow=new u(this.editor),this._disposables.add(this._arrow)),this._fillContainer(this.container),this._initSash(),this._applyStyles()}style(n){n.frameColor&&(this.options.frameColor=n.frameColor),n.arrowColor&&(this.options.arrowColor=n.arrowColor),this._applyStyles()}_applyStyles(){if(this.container&&this.options.frameColor){let n=this.options.frameColor.toString();this.container.style.borderTopColor=n,this.container.style.borderBottomColor=n}if(this._arrow&&this.options.arrowColor){let n=this.options.arrowColor.toString();this._arrow.color=n}}_getWidth(n){return n.width-n.minimap.minimapWidth-n.verticalScrollbarWidth}_getLeft(n){return n.minimap.minimapWidth>0&&n.minimap.minimapLeft===0?n.minimap.minimapWidth:0}_onViewZoneTop(n){this.domNode.style.top=n+"px"}_onViewZoneHeight(n){if(this.domNode.style.height=`${n}px`,this.container){let t=n-this._decoratingElementsHeight();this.container.style.height=`${t}px`;const l=this.editor.getLayoutInfo();this._doLayout(t,this._getWidth(l))}this._resizeSash&&this._resizeSash.layout()}get position(){const[n]=this._positionMarkerId;if(!!n){const t=this.editor.getModel();if(!!t){const l=t.getDecorationRange(n);if(!!l)return l.getStartPosition()}}}show(n,t){const l=d.Range.isIRange(n)?d.Range.lift(n):d.Range.fromPositions(n);this._isShowing=!0,this._showImpl(l,t),this._isShowing=!1,this._positionMarkerId=this.editor.deltaDecorations(this._positionMarkerId,[{range:l,options:g.ModelDecorationOptions.EMPTY}])}hide(){this._viewZone&&(this.editor.changeViewZones(n=>{this._viewZone&&n.removeZone(this._viewZone.id)}),this._viewZone=null),this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this._arrow&&this._arrow.hide()}_decoratingElementsHeight(){let n=this.editor.getOption(53),t=0;if(this.options.showArrow){let l=Math.round(n/3);t+=2*l}if(this.options.showFrame){let l=Math.round(n/9);t+=2*l}return t}_showImpl(n,t){const l=n.getStartPosition(),h=this.editor.getLayoutInfo(),m=this._getWidth(h);this.domNode.style.width=`${m}px`,this.domNode.style.left=this._getLeft(h)+"px";const _=document.createElement("div");_.style.overflow="hidden";const f=this.editor.getOption(53),v=Math.max(12,this.editor.getLayoutInfo().height/f*.8);t=Math.min(t,v);let y=0,L=0;if(this._arrow&&this.options.showArrow&&(y=Math.round(f/3),this._arrow.height=y,this._arrow.show(l)),this.options.showFrame&&(L=Math.round(f/9)),this.editor.changeViewZones(E=>{this._viewZone&&E.removeZone(this._viewZone.id),this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this.domNode.style.top="-1000px",this._viewZone=new s(_,l.lineNumber,l.column,t,T=>this._onViewZoneTop(T),T=>this._onViewZoneHeight(T)),this._viewZone.id=E.addZone(this._viewZone),this._overlayWidget=new a(o+this._viewZone.id,this.domNode),this.editor.addOverlayWidget(this._overlayWidget)}),this.container&&this.options.showFrame){const E=this.options.frameWidth?this.options.frameWidth:L;this.container.style.borderTopWidth=E+"px",this.container.style.borderBottomWidth=E+"px"}let I=t*f-this._decoratingElementsHeight();this.container&&(this.container.style.top=y+"px",this.container.style.height=I+"px",this.container.style.overflow="hidden"),this._doLayout(I,m),this.options.keepEditorSelection||this.editor.setSelection(n);const k=this.editor.getModel();if(k){const E=n.endLineNumber+1;E<=k.getLineCount()?this.revealLine(E,!1):this.revealLine(k.getLineCount(),!0)}}revealLine(n,t){t?this.editor.revealLineInCenter(n,0):this.editor.revealLine(n,0)}setCssClass(n,t){!this.container||(t&&this.container.classList.remove(t),this.container.classList.add(n))}_onWidth(n){}_doLayout(n,t){}_relayout(n){this._viewZone&&this._viewZone.heightInLines!==n&&this.editor.changeViewZones(t=>{this._viewZone&&(this._viewZone.heightInLines=n,t.layoutZone(this._viewZone.id))})}_initSash(){if(!this._resizeSash){this._resizeSash=this._disposables.add(new N.Sash(this.domNode,this,{orientation:1})),this.options.isResizeable||(this._resizeSash.hide(),this._resizeSash.state=0);let n;this._disposables.add(this._resizeSash.onDidStart(t=>{this._viewZone&&(n={startY:t.startY,heightInLines:this._viewZone.heightInLines})})),this._disposables.add(this._resizeSash.onDidEnd(()=>{n=void 0})),this._disposables.add(this._resizeSash.onDidChange(t=>{if(n){let l=(t.currentY-n.startY)/this.editor.getOption(53),h=l<0?Math.ceil(l):Math.floor(l),m=n.heightInLines+h;m>5&&m<35&&this._relayout(m)}}))}}getHorizontalSashLeft(){return 0}getHorizontalSashTop(){return(this.domNode.style.height===null?0:parseInt(this.domNode.style.height))-this._decoratingElementsHeight()/2}getHorizontalSashWidth(){const n=this.editor.getLayoutInfo();return n.width-n.minimap.minimapWidth}}e.ZoneWidget=r}),define(Q[246],J([0,1,127,18,76,232]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createTokenizationSupport=e.MonarchTokenizer=void 0;const S=5;class C{constructor(n){this._maxCacheDepth=n,this._entries=Object.create(null)}static create(n,t){return this._INSTANCE.create(n,t)}create(n,t){if(n!==null&&n.depth>=this._maxCacheDepth)return new d(n,t);let l=d.getStackElementId(n);l.length>0&&(l+="|"),l+=t;let h=this._entries[l];return h||(h=new d(n,t),this._entries[l]=h,h)}}C._INSTANCE=new C(S);class d{constructor(n,t){this.parent=n,this.state=t,this.depth=(this.parent?this.parent.depth:0)+1}static getStackElementId(n){let t="";for(;n!==null;)t.length>0&&(t+="|"),t+=n.state,n=n.parent;return t}static _equals(n,t){for(;n!==null&&t!==null;){if(n===t)return!0;if(n.state!==t.state)return!1;n=n.parent,t=t.parent}return n===null&&t===null}equals(n){return d._equals(this,n)}push(n){return C.create(this,n)}pop(){return this.parent}popall(){let n=this;for(;n.parent;)n=n.parent;return n}switchTo(n){return C.create(this.parent,n)}}class g{constructor(n,t){this.modeId=n,this.state=t}equals(n){return this.modeId===n.modeId&&this.state.equals(n.state)}clone(){return this.state.clone()===this.state?this:new g(this.modeId,this.state)}}class p{constructor(n){this._maxCacheDepth=n,this._entries=Object.create(null)}static create(n,t){return this._INSTANCE.create(n,t)}create(n,t){if(t!==null)return new c(n,t);if(n!==null&&n.depth>=this._maxCacheDepth)return new c(n,t);let l=d.getStackElementId(n),h=this._entries[l];return h||(h=new c(n,null),this._entries[l]=h,h)}}p._INSTANCE=new p(S);class c{constructor(n,t){this.stack=n,this.embeddedModeData=t}clone(){return(this.embeddedModeData?this.embeddedModeData.clone():null)===this.embeddedModeData?this:p.create(this.stack,this.embeddedModeData)}equals(n){return!(n instanceof c)||!this.stack.equals(n.stack)?!1:this.embeddedModeData===null&&n.embeddedModeData===null?!0:this.embeddedModeData===null||n.embeddedModeData===null?!1:this.embeddedModeData.equals(n.embeddedModeData)}}class o{constructor(){this._tokens=[],this._language=null,this._lastTokenType=null,this._lastTokenLanguage=null}enterMode(n,t){this._language=t}emit(n,t){this._lastTokenType===t&&this._lastTokenLanguage===this._language||(this._lastTokenType=t,this._lastTokenLanguage=this._language,this._tokens.push(new b.Token(n,t,this._language)))}nestedModeTokenize(n,t,l,h){const m=l.modeId,_=l.state,f=N.TokenizationRegistry.get(m);if(!f)return this.enterMode(h,m),this.emit(h,""),_;let v=f.tokenize(n,t,_,h);return this._tokens=this._tokens.concat(v.tokens),this._lastTokenType=null,this._lastTokenLanguage=null,this._language=null,v.endState}finalize(n){return new b.TokenizationResult(this._tokens,n)}}class s{constructor(n,t){this._modeService=n,this._theme=t,this._prependTokens=null,this._tokens=[],this._currentLanguageId=0,this._lastTokenMetadata=0}enterMode(n,t){this._currentLanguageId=this._modeService.getLanguageIdentifier(t).id}emit(n,t){let l=this._theme.match(this._currentLanguageId,t);this._lastTokenMetadata!==l&&(this._lastTokenMetadata=l,this._tokens.push(n),this._tokens.push(l))}static _merge(n,t,l){let h=n!==null?n.length:0,m=t.length,_=l!==null?l.length:0;if(h===0&&m===0&&_===0)return new Uint32Array(0);if(h===0&&m===0)return l;if(m===0&&_===0)return n;let f=new Uint32Array(h+m+_);n!==null&&f.set(n);for(let v=0;v{if(!m){let f=!1;for(let v=0,y=_.changedLanguages.length;v{})}}getInitialState(){let n=C.create(null,this._lexer.start);return p.create(n,null)}tokenize(n,t,l,h){let m=new o,_=this._tokenize(n,t,l,h,m);return m.finalize(_)}tokenize2(n,t,l,h){let m=new s(this._modeService,this._standaloneThemeService.getColorTheme().tokenTheme),_=this._tokenize(n,t,l,h,m);return m.finalize(_)}_tokenize(n,t,l,h,m){return l.embeddedModeData?this._nestedTokenize(n,t,l,h,m):this._myTokenize(n,t,l,h,m)}_findLeavingNestedModeOffset(n,t){let l=this._lexer.tokenizer[t.stack.state];if(!l&&(l=w.findRules(this._lexer,t.stack.state),!l))throw w.createError(this._lexer,"tokenizer state is not defined: "+t.stack.state);let h=-1,m=!1;for(const _ of l)if(!(!w.isIAction(_.action)||_.action.nextEmbedded!=="@pop")){m=!0;let f=_.regex,v=_.regex.source;if(v.substr(0,4)==="^(?:"&&v.substr(v.length-1,1)===")"){let L=(f.ignoreCase?"i":"")+(f.unicode?"u":"");f=new RegExp(v.substr(4,v.length-5),L)}let y=n.search(f);y===-1||y!==0&&_.matchOnlyAtLineStart||(h===-1||y0&&m.nestedModeTokenize(f,!1,l.embeddedModeData,h);let v=n.substring(_);return this._myTokenize(v,t,l,h+_,m)}_safeRuleName(n){return n?n.name:"(unknown)"}_myTokenize(n,t,l,h,m){m.enterMode(h,this._modeId);const _=n.length,f=t&&this._lexer.includeLF?n+` +`:n,v=f.length;let y=l.embeddedModeData,L=l.stack,I=0,k=null,E=!0;for(;E||I=v)break;E=!1;let ee=this._lexer.tokenizer[B];if(!ee&&(ee=w.findRules(this._lexer,B),!ee))throw w.createError(this._lexer,"tokenizer state is not defined: "+B);let se=f.substr(I);for(const ne of ee)if((I===0||!ne.matchOnlyAtLineStart)&&(F=se.match(ne.regex),F)){D=F[0],R=ne.action;break}}if(F||(F=[""],D=""),R||(I=this._lexer.maxStack)throw w.createError(this._lexer,"maximum tokenizer stack size reached: ["+L.state+","+L.parent.state+",...]");L=L.push(B)}else if(R.next==="@pop"){if(L.depth<=1)throw w.createError(this._lexer,"trying to pop an empty stack in rule: "+this._safeRuleName(W));L=L.pop()}else if(R.next==="@popall")L=L.popall();else{let ee=w.substituteMatches(this._lexer,R.next,D,F,B);if(ee[0]==="@"&&(ee=ee.substr(1)),w.findRules(this._lexer,ee))L=L.push(ee);else throw w.createError(this._lexer,"trying to set a next state '"+ee+"' that is undefined in rule: "+this._safeRuleName(W))}}R.log&&typeof R.log=="string"&&w.log(this._lexer,this._lexer.languageId+": "+w.substituteMatches(this._lexer,R.log,D,F,B))}if(K===null)throw w.createError(this._lexer,"lexer rule has no well-defined action in rule: "+this._safeRuleName(W));const Y=ee=>{let se=this._modeService.getModeIdForLanguageName(ee);se&&(ee=se);const ne=this._getNestedEmbeddedModeData(ee);if(I0)throw w.createError(this._lexer,"groups cannot be nested: "+this._safeRuleName(W));if(F.length!==K.length+1)throw w.createError(this._lexer,"matched number of groups does not match the number of actions in rule: "+this._safeRuleName(W));let ee=0;for(let se=1;seu});class c{static colorizeElement(r,i,n,t){t=t||{};let l=t.theme||"vs",h=t.mimeType||n.getAttribute("lang")||n.getAttribute("data-lang");if(!h)return console.error("Mode not detected"),Promise.resolve();r.setTheme(l);let m=n.firstChild?n.firstChild.nodeValue:"";n.className+=" "+l;let _=f=>{var v;const y=(v=p==null?void 0:p.createHTML(f))!==null&&v!==void 0?v:f;n.innerHTML=y};return this.colorize(i,m||"",h,t).then(_,f=>console.error(f))}static colorize(r,i,n,t){let l=4;t&&typeof t.tabSize=="number"&&(l=t.tabSize),N.startsWithUTF8BOM(i)&&(i=i.substr(1));let h=N.splitLines(i),m=r.getModeId(n);if(!m)return Promise.resolve(s(h,l));r.triggerMode(m);const _=w.TokenizationRegistry.get(m);if(_)return o(h,l,_);const f=w.TokenizationRegistry.getPromise(m);return f?new Promise((v,y)=>{f.then(L=>{o(h,l,L).then(v,y)},y)}):new Promise((v,y)=>{let L=null,I=null;const k=()=>{L&&(L.dispose(),L=null),I&&(I.dispose(),I=null);const E=w.TokenizationRegistry.get(m);if(E){o(h,l,E).then(v,y);return}v(s(h,l))};I=new b.TimeoutTimer,I.cancelAndSet(k,500),L=w.TokenizationRegistry.onDidChange(E=>{E.changedLanguages.indexOf(m)>=0&&k()})})}static colorizeLine(r,i,n,t,l=4){const h=C.ViewLineRenderingData.isBasicASCII(r,i),m=C.ViewLineRenderingData.containsRTL(r,h,n);return S.renderViewLine2(new S.RenderLineInput(!1,!0,r,!1,h,m,0,t,[],l,0,0,0,0,-1,"none",!1,!1,null)).html}static colorizeModelLine(r,i,n=4){let t=r.getLineContent(i);r.forceTokenization(i);let h=r.getLineTokens(i).inflate();return this.colorizeLine(t,r.mightContainNonBasicASCII(),r.mightContainRTL(),h,n)}}e.Colorizer=c;function o(u,r,i){return new Promise((n,t)=>{const l=()=>{const h=a(u,r,i);if(i instanceof d.MonarchTokenizer){const m=i.getLoadStatus();if(m.loaded===!1){m.promise.then(l,t);return}}n(h)};l()})}function s(u,r){let i=[];const n=(0<<11|1<<14|2<<23)>>>0,t=new Uint32Array(2);t[0]=0,t[1]=n;for(let l=0,h=u.length;l")}return i.join("")}function a(u,r,i){let n=[],t=i.getInitialState();for(let l=0,h=u.length;l"),t=_.endState}return n.join("")}}),define(Q[114],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IStandaloneThemeService=void 0,e.IStandaloneThemeService=b.createDecorator("themeService")}),define(Q[84],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IClipboardService=void 0,e.IClipboardService=b.createDecorator("clipboardService")}),define(Q[26],J([0,1,2,20,9,6,71,54]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CommandsRegistry=e.ICommandService=void 0,e.ICommandService=M.createDecorator("commandService"),e.CommandsRegistry=new class{constructor(){this._commands=new Map,this._onDidRegisterCommand=new w.Emitter,this.onDidRegisterCommand=this._onDidRegisterCommand.event}registerCommand(d,g){if(!d)throw new Error("invalid command");if(typeof d=="string"){if(!g)throw new Error("invalid command");return this.registerCommand({id:d,handler:g})}if(d.description){const a=[];for(let r of d.description.args)a.push(r.constraint);const u=d.handler;d.handler=function(r,...i){return N.validateConstraints(i,a),u(r,...i)}}const{id:p}=d;let c=this._commands.get(p);c||(c=new S.LinkedList,this._commands.set(p,c));let o=c.unshift(d),s=b.toDisposable(()=>{o();const a=this._commands.get(p);(a==null?void 0:a.isEmpty())&&this._commands.delete(p)});return this._onDidRegisterCommand.fire(p),s}registerCommandAlias(d,g){return e.CommandsRegistry.registerCommand(d,(p,...c)=>p.get(e.ICommandService).executeCommand(g,...c))}getCommand(d){const g=this._commands.get(d);if(!(!g||g.isEmpty()))return C.Iterable.first(g)}getCommands(){const d=new Map;for(const g of this._commands.keys()){const p=this.getCommand(g);p&&d.set(g,p)}return d}}}),define(Q[247],J([0,1,23,12,24,18,36,26,20,383,3]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getDocumentRangeSemanticTokensProvider=e.getDocumentSemanticTokens=e.isSemanticTokensEdits=e.isSemanticTokens=void 0;function c(r){return r&&!!r.data}e.isSemanticTokens=c;function o(r){return r&&Array.isArray(r.edits)}e.isSemanticTokensEdits=o;function s(r,i,n){const t=a(r);return t?{provider:t,request:Promise.resolve(t.provideDocumentSemanticTokens(r,i,n))}:null}e.getDocumentSemanticTokens=s;function a(r){const i=w.DocumentSemanticTokensProviderRegistry.ordered(r);return i.length>0?i[0]:null}function u(r){const i=w.DocumentRangeSemanticTokensProviderRegistry.ordered(r);return i.length>0?i[0]:null}e.getDocumentRangeSemanticTokensProvider=u,C.CommandsRegistry.registerCommand("_provideDocumentSemanticTokensLegend",(r,...i)=>Ie(void 0,void 0,void 0,function*(){const[n]=i;d.assertType(n instanceof M.URI);const t=r.get(S.IModelService).getModel(n);if(!!t){const l=a(t);return l?l.getLegend():r.get(C.ICommandService).executeCommand("_provideDocumentRangeSemanticTokensLegend",n)}})),C.CommandsRegistry.registerCommand("_provideDocumentSemanticTokens",(r,...i)=>Ie(void 0,void 0,void 0,function*(){const[n]=i;d.assertType(n instanceof M.URI);const t=r.get(S.IModelService).getModel(n);if(!!t){const l=s(t,null,b.CancellationToken.None);if(!l)return r.get(C.ICommandService).executeCommand("_provideDocumentRangeSemanticTokens",n,t.getFullModelRange());const{provider:h,request:m}=l;let _;try{_=yield m}catch(v){N.onUnexpectedExternalError(v);return}if(!(!_||!c(_))){const f=g.encodeSemanticTokensDto({id:0,type:"full",data:_.data});return _.resultId&&h.releaseDocumentSemanticTokens(_.resultId),f}}})),C.CommandsRegistry.registerCommand("_provideDocumentRangeSemanticTokensLegend",(r,...i)=>Ie(void 0,void 0,void 0,function*(){const[n]=i;d.assertType(n instanceof M.URI);const t=r.get(S.IModelService).getModel(n);if(!!t){const l=u(t);if(!!l)return l.getLegend()}})),C.CommandsRegistry.registerCommand("_provideDocumentRangeSemanticTokens",(r,...i)=>Ie(void 0,void 0,void 0,function*(){const[n,t]=i;d.assertType(n instanceof M.URI),d.assertType(p.Range.isIRange(t));const l=r.get(S.IModelService).getModel(n);if(!!l){const h=u(l);if(!!h){let m;try{m=yield h.provideDocumentRangeSemanticTokens(l,p.Range.lift(t),b.CancellationToken.None)}catch(_){N.onUnexpectedExternalError(_);return}if(!(!m||!c(m)))return g.encodeSemanticTokensDto({id:0,type:"full",data:m.data})}}}))}),define(Q[248],J([0,1,19,23,12,24,18,36,2,26,20]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getCodeLensModel=e.CodeLensModel=void 0;class c{constructor(){this.lenses=[],this._disposables=new d.DisposableStore}dispose(){this._disposables.dispose()}add(a,u){this._disposables.add(a);for(const r of a.lenses)this.lenses.push({symbol:r,provider:u})}}e.CodeLensModel=c;function o(s,a){return Ie(this,void 0,void 0,function*(){const u=S.CodeLensProviderRegistry.ordered(s),r=new Map,i=new c,n=u.map((t,l)=>Ie(this,void 0,void 0,function*(){r.set(t,l);try{const h=yield Promise.resolve(t.provideCodeLenses(s,a));h&&i.add(h,t)}catch(h){M.onUnexpectedExternalError(h)}}));return yield Promise.all(n),i.lenses=b.mergeSort(i.lenses,(t,l)=>t.symbol.range.startLineNumberl.symbol.range.startLineNumber?1:r.get(t.provider)r.get(l.provider)?1:t.symbol.range.startColumnl.symbol.range.startColumn?1:0),i})}e.getCodeLensModel=o,g.CommandsRegistry.registerCommand("_executeCodeLensProvider",function(s,...a){let[u,r]=a;p.assertType(w.URI.isUri(u)),p.assertType(typeof r=="number"||!r);const i=s.get(C.IModelService).getModel(u);if(!i)throw M.illegalArgument();const n=[],t=new d.DisposableStore;return o(i,N.CancellationToken.None).then(l=>{t.add(l);let h=[];for(const m of l.lenses)r==null||Boolean(m.symbol.command)?n.push(m.symbol):r-- >0&&m.provider.resolveCodeLens&&h.push(Promise.resolve(m.provider.resolveCodeLens(i,m.symbol,N.CancellationToken.None)).then(_=>n.push(_||m.symbol)));return Promise.all(h)}).then(()=>n).finally(()=>{setTimeout(()=>t.dispose(),100)})})}),define(Q[249],J([0,1,23,12,24,3,18,36,26]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getColorPresentations=e.getColors=void 0;function g(c,o){const s=[],u=S.ColorProviderRegistry.ordered(c).reverse().map(r=>Promise.resolve(r.provideDocumentColors(c,o)).then(i=>{if(Array.isArray(i))for(let n of i)s.push({colorInfo:n,provider:r})}));return Promise.all(u).then(()=>s)}e.getColors=g;function p(c,o,s,a){return Promise.resolve(s.provideColorPresentations(c,o,a))}e.getColorPresentations=p,d.CommandsRegistry.registerCommand("_executeDocumentColorProvider",function(c,...o){const[s]=o;if(!(s instanceof M.URI))throw N.illegalArgument();const a=c.get(C.IModelService).getModel(s);if(!a)throw N.illegalArgument();const u=[],i=S.ColorProviderRegistry.ordered(a).reverse().map(n=>Promise.resolve(n.provideDocumentColors(a,b.CancellationToken.None)).then(t=>{if(Array.isArray(t))for(let l of t)u.push({range:l.range,color:[l.color.red,l.color.green,l.color.blue,l.color.alpha]})}));return Promise.all(i).then(()=>u)}),d.CommandsRegistry.registerCommand("_executeColorPresentationProvider",function(c,...o){const[s,a]=o,{uri:u,range:r}=a;if(!(u instanceof M.URI)||!Array.isArray(s)||s.length!==4||!w.Range.isIRange(r))throw N.illegalArgument();const[i,n,t,l]=s,h=c.get(C.IModelService).getModel(u);if(!h)throw N.illegalArgument();const m={range:r,color:{red:i,green:n,blue:t,alpha:l}},_=[],v=S.ColorProviderRegistry.ordered(h).reverse().map(y=>Promise.resolve(y.provideColorPresentations(h,m,b.CancellationToken.None)).then(L=>{Array.isArray(L)&&_.push(...L)}));return Promise.all(v).then(()=>_)})}),define(Q[545],J([0,1,24,36,23,67,245,26,20]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getDocumentSymbols=void 0;function g(p,c,o){return Ie(this,void 0,void 0,function*(){const s=yield S.OutlineModel.create(p,o);return c?s.asListOfDocumentSymbols():s.getTopLevelSymbols()})}e.getDocumentSymbols=g,C.CommandsRegistry.registerCommand("_executeDocumentSymbolProvider",function(p,...c){return Ie(this,void 0,void 0,function*(){const[o]=c;d.assertType(b.URI.isUri(o));const s=p.get(N.IModelService).getModel(o);if(s)return g(s,!1,M.CancellationToken.None);const a=yield p.get(w.ITextModelService).createModelReference(o);try{return yield g(a.object.textEditorModel,!1,M.CancellationToken.None)}finally{a.dispose()}})})}),define(Q[546],J([0,1,23,12,24,3,18,36,26,2,19,20]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getLinks=e.LinksList=e.Link=void 0;class o{constructor(r,i){this._link=r,this._provider=i}toJSON(){return{range:this.range,url:this.url,tooltip:this.tooltip}}get range(){return this._link.range}get url(){return this._link.url}get tooltip(){return this._link.tooltip}resolve(r){return Ie(this,void 0,void 0,function*(){return this._link.url?this._link.url:typeof this._provider.resolveLink=="function"?Promise.resolve(this._provider.resolveLink(this._link,r)).then(i=>(this._link=i||this._link,this._link.url?this.resolve(r):Promise.reject(new Error("missing")))):Promise.reject(new Error("missing"))})}}e.Link=o;class s{constructor(r){this._disposables=new g.DisposableStore;let i=[];for(const[n,t]of r){const l=n.links.map(h=>new o(h,t));i=s._union(i,l),g.isDisposable(n)&&this._disposables.add(n)}this.links=i}dispose(){this._disposables.dispose(),this.links.length=0}static _union(r,i){let n=[],t,l,h,m;for(t=0,h=0,l=r.length,m=i.length;tPromise.resolve(t.provideLinks(u,r)).then(h=>{h&&(i[l]=[h,t])},N.onUnexpectedExternalError));return Promise.all(n).then(()=>{const t=new s(p.coalesce(i));return r.isCancellationRequested?(t.dispose(),new s([])):t})}e.getLinks=a,d.CommandsRegistry.registerCommand("_executeLinkProvider",(u,...r)=>Ie(void 0,void 0,void 0,function*(){let[i,n]=r;c.assertType(i instanceof M.URI),typeof n!="number"&&(n=0);const t=u.get(C.IModelService).getModel(i);if(!t)return[];const l=yield a(t,b.CancellationToken.None);if(!l)return[];for(let m=0;m=0),S.set("isFirefox",w.indexOf("Firefox")>=0),S.set("isChrome",w.indexOf("Chrome")>=0),S.set("isSafari",w.indexOf("Safari")>=0),S.set("isIPad",w.indexOf("iPad")>=0);const C=Object.prototype.hasOwnProperty;class d{static has(E){return o.create(E)}static equals(E,T){return s.create(E,T)}static regex(E,T){return m.create(E,T)}static not(E){return i.create(E)}static and(...E){return f.create(E)}static or(...E){return v.create(E)}static deserialize(E,T=!1){if(!!E)return this._deserializeOrExpression(E,T)}static _deserializeOrExpression(E,T){let O=E.split("||");return v.create(O.map(A=>this._deserializeAndExpression(A,T)))}static _deserializeAndExpression(E,T){let O=E.split("&&");return f.create(O.map(A=>this._deserializeOne(A,T)))}static _deserializeOne(E,T){if(E=E.trim(),E.indexOf("!=")>=0){let O=E.split("!=");return r.create(O[0].trim(),this._deserializeValue(O[1],T))}if(E.indexOf("==")>=0){let O=E.split("==");return s.create(O[0].trim(),this._deserializeValue(O[1],T))}if(E.indexOf("=~")>=0){let O=E.split("=~");return m.create(O[0].trim(),this._deserializeRegexValue(O[1],T))}if(E.indexOf(" in ")>=0){let O=E.split(" in ");return a.create(O[0].trim(),O[1].trim())}if(/^[^<=>]+>=[^<=>]+$/.test(E)){const O=E.split(">=");return t.create(O[0].trim(),O[1].trim())}if(/^[^<=>]+>[^<=>]+$/.test(E)){const O=E.split(">");return n.create(O[0].trim(),O[1].trim())}if(/^[^<=>]+<=[^<=>]+$/.test(E)){const O=E.split("<=");return h.create(O[0].trim(),O[1].trim())}if(/^[^<=>]+<[^<=>]+$/.test(E)){const O=E.split("<");return l.create(O[0].trim(),O[1].trim())}return/^\!\s*/.test(E)?i.create(E.substr(1).trim()):o.create(E)}static _deserializeValue(E,T){if(E=E.trim(),E==="true")return!0;if(E==="false")return!1;let O=/^'([^']*)'$/.exec(E);return O?O[1].trim():E}static _deserializeRegexValue(E,T){if(b.isFalsyOrWhitespace(E)){if(T)throw new Error("missing regexp-value for =~-expression");return console.warn("missing regexp-value for =~-expression"),null}let O=E.indexOf("/"),A=E.lastIndexOf("/");if(O===A||O<0){if(T)throw new Error(`bad regexp-value '${E}', missing /-enclosure`);return console.warn(`bad regexp-value '${E}', missing /-enclosure`),null}let B=E.slice(O+1,A),F=E[A+1]==="i"?"i":"";try{return new RegExp(B,F)}catch(D){if(T)throw new Error(`bad regexp-value '${E}', parse error: ${D}`);return console.warn(`bad regexp-value '${E}', parse error: ${D}`),null}}}e.ContextKeyExpr=d;function g(k,E){return k.cmp(E)}class p{constructor(){this.type=0}cmp(E){return this.type-E.type}equals(E){return E.type===this.type}evaluate(E){return!1}serialize(){return"false"}keys(){return[]}negate(){return c.INSTANCE}}e.ContextKeyFalseExpr=p,p.INSTANCE=new p;class c{constructor(){this.type=1}cmp(E){return this.type-E.type}equals(E){return E.type===this.type}evaluate(E){return!0}serialize(){return"true"}keys(){return[]}negate(){return p.INSTANCE}}e.ContextKeyTrueExpr=c,c.INSTANCE=new c;class o{constructor(E){this.key=E,this.type=2}static create(E){const T=S.get(E);return typeof T=="boolean"?T?c.INSTANCE:p.INSTANCE:new o(E)}cmp(E){return E.type!==this.type?this.type-E.type:L(this.key,E.key)}equals(E){return E.type===this.type?this.key===E.key:!1}evaluate(E){return!!E.getValue(this.key)}serialize(){return this.key}keys(){return[this.key]}negate(){return i.create(this.key)}}e.ContextKeyDefinedExpr=o;class s{constructor(E,T){this.key=E,this.value=T,this.type=4}static create(E,T){if(typeof T=="boolean")return T?o.create(E):i.create(E);const O=S.get(E);return typeof O=="boolean"?T===(O?"true":"false")?c.INSTANCE:p.INSTANCE:new s(E,T)}cmp(E){return E.type!==this.type?this.type-E.type:I(this.key,this.value,E.key,E.value)}equals(E){return E.type===this.type?this.key===E.key&&this.value===E.value:!1}evaluate(E){return E.getValue(this.key)==this.value}serialize(){return`${this.key} == '${this.value}'`}keys(){return[this.key]}negate(){return r.create(this.key,this.value)}}e.ContextKeyEqualsExpr=s;class a{constructor(E,T){this.key=E,this.valueKey=T,this.type=10}static create(E,T){return new a(E,T)}cmp(E){return E.type!==this.type?this.type-E.type:I(this.key,this.valueKey,E.key,E.valueKey)}equals(E){return E.type===this.type?this.key===E.key&&this.valueKey===E.valueKey:!1}evaluate(E){const T=E.getValue(this.valueKey),O=E.getValue(this.key);return Array.isArray(T)?T.indexOf(O)>=0:typeof O=="string"&&typeof T=="object"&&T!==null?C.call(T,O):!1}serialize(){return`${this.key} in '${this.valueKey}'`}keys(){return[this.key,this.valueKey]}negate(){return u.create(this)}}e.ContextKeyInExpr=a;class u{constructor(E){this._actual=E,this.type=11}static create(E){return new u(E)}cmp(E){return E.type!==this.type?this.type-E.type:this._actual.cmp(E._actual)}equals(E){return E.type===this.type?this._actual.equals(E._actual):!1}evaluate(E){return!this._actual.evaluate(E)}serialize(){throw new Error("Method not implemented.")}keys(){return this._actual.keys()}negate(){return this._actual}}e.ContextKeyNotInExpr=u;class r{constructor(E,T){this.key=E,this.value=T,this.type=5}static create(E,T){if(typeof T=="boolean")return T?i.create(E):o.create(E);const O=S.get(E);return typeof O=="boolean"?T===(O?"true":"false")?p.INSTANCE:c.INSTANCE:new r(E,T)}cmp(E){return E.type!==this.type?this.type-E.type:I(this.key,this.value,E.key,E.value)}equals(E){return E.type===this.type?this.key===E.key&&this.value===E.value:!1}evaluate(E){return E.getValue(this.key)!=this.value}serialize(){return`${this.key} != '${this.value}'`}keys(){return[this.key]}negate(){return s.create(this.key,this.value)}}e.ContextKeyNotEqualsExpr=r;class i{constructor(E){this.key=E,this.type=3}static create(E){const T=S.get(E);return typeof T=="boolean"?T?p.INSTANCE:c.INSTANCE:new i(E)}cmp(E){return E.type!==this.type?this.type-E.type:L(this.key,E.key)}equals(E){return E.type===this.type?this.key===E.key:!1}evaluate(E){return!E.getValue(this.key)}serialize(){return`!${this.key}`}keys(){return[this.key]}negate(){return o.create(this.key)}}e.ContextKeyNotExpr=i;class n{constructor(E,T){this.key=E,this.value=T,this.type=12}static create(E,T){return new n(E,T)}cmp(E){return E.type!==this.type?this.type-E.type:I(this.key,this.value,E.key,E.value)}equals(E){return E.type===this.type?this.key===E.key&&this.value===E.value:!1}evaluate(E){return parseFloat(E.getValue(this.key))>parseFloat(this.value)}serialize(){return`${this.key} > ${this.value}`}keys(){return[this.key]}negate(){return h.create(this.key,this.value)}}e.ContextKeyGreaterExpr=n;class t{constructor(E,T){this.key=E,this.value=T,this.type=13}static create(E,T){return new t(E,T)}cmp(E){return E.type!==this.type?this.type-E.type:I(this.key,this.value,E.key,E.value)}equals(E){return E.type===this.type?this.key===E.key&&this.value===E.value:!1}evaluate(E){return parseFloat(E.getValue(this.key))>=parseFloat(this.value)}serialize(){return`${this.key} >= ${this.value}`}keys(){return[this.key]}negate(){return l.create(this.key,this.value)}}e.ContextKeyGreaterEqualsExpr=t;class l{constructor(E,T){this.key=E,this.value=T,this.type=14}static create(E,T){return new l(E,T)}cmp(E){return E.type!==this.type?this.type-E.type:I(this.key,this.value,E.key,E.value)}equals(E){return E.type===this.type?this.key===E.key&&this.value===E.value:!1}evaluate(E){return parseFloat(E.getValue(this.key))E.key)return 1;const T=this.regexp?this.regexp.source:"",O=E.regexp?E.regexp.source:"";return TO?1:0}equals(E){if(E.type===this.type){const T=this.regexp?this.regexp.source:"",O=E.regexp?E.regexp.source:"";return this.key===E.key&&T===O}return!1}evaluate(E){let T=E.getValue(this.key);return this.regexp?this.regexp.test(T):!1}serialize(){const E=this.regexp?`/${this.regexp.source}/${this.regexp.ignoreCase?"i":""}`:"/invalid/";return`${this.key} =~ ${E}`}keys(){return[this.key]}negate(){return _.create(this)}}e.ContextKeyRegexExpr=m;class _{constructor(E){this._actual=E,this.type=8}static create(E){return new _(E)}cmp(E){return E.type!==this.type?this.type-E.type:this._actual.cmp(E._actual)}equals(E){return E.type===this.type?this._actual.equals(E._actual):!1}evaluate(E){return!this._actual.evaluate(E)}serialize(){throw new Error("Method not implemented.")}keys(){return this._actual.keys()}negate(){return this._actual}}e.ContextKeyNotRegexExpr=_;class f{constructor(E){this.expr=E,this.type=6}static create(E){return f._normalizeArr(E)}cmp(E){if(E.type!==this.type)return this.type-E.type;if(this.expr.lengthE.expr.length)return 1;for(let T=0,O=this.expr.length;T1;){const A=T[T.length-1];if(A.type!==9)break;T.pop();const B=T.pop(),F=v.create(A.expr.map(D=>f.create([D,B])));F&&(T.push(F),T.sort(g))}return T.length===1?T[0]:new f(T)}}serialize(){return this.expr.map(E=>E.serialize()).join(" && ")}keys(){const E=[];for(let T of this.expr)E.push(...T.keys());return E}negate(){let E=[];for(let T of this.expr)E.push(T.negate());return v.create(E)}}e.ContextKeyAndExpr=f;class v{constructor(E){this.expr=E,this.type=9}static create(E){const T=v._normalizeArr(E);if(T.length!==0)return T.length===1?T[0]:new v(T)}cmp(E){if(E.type!==this.type)return this.type-E.type;if(this.expr.lengthE.expr.length)return 1;for(let T=0,O=this.expr.length;TE.serialize()).join(" || ")}keys(){const E=[];for(let T of this.expr)E.push(...T.keys());return E}negate(){let E=[];for(let O of this.expr)E.push(O.negate());const T=O=>O.type===9?O.expr:[O];for(;E.length>1;){const O=E.shift(),A=E.shift(),B=[];for(const F of T(O))for(const D of T(A))B.push(d.and(F,D));E.unshift(d.or(...B))}return E[0]}}e.ContextKeyOrExpr=v;class y extends o{constructor(E,T,O){super(E);this.key=E,this._defaultValue=T,typeof O=="object"?y._info.push(Object.assign(Object.assign({},O),{key:E})):O!==!0&&y._info.push({key:E,description:O,type:T!=null?typeof T:void 0})}static all(){return y._info.values()}bindTo(E){return E.createKey(this.key,this._defaultValue)}getValue(E){return E.getContextKeyValue(this.key)}toNegated(){return d.not(this.key)}isEqualTo(E){return d.equals(this.key,E)}}e.RawContextKey=y,y._info=[],e.IContextKeyService=N.createDecorator("contextKeyService"),e.SET_CONTEXT_COMMAND_ID="setContext";function L(k,E){return kE?1:0}function I(k,E,T,O){return kT?1:EO?1:0}}),define(Q[25],J([0,1,456,16]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorContextKeys=void 0;var M;(function(w){w.editorSimpleInput=new N.RawContextKey("editorSimpleInput",!1,!0),w.editorTextFocus=new N.RawContextKey("editorTextFocus",!1,b.localize(0,null)),w.focus=new N.RawContextKey("editorFocus",!1,b.localize(1,null)),w.textInputFocus=new N.RawContextKey("textInputFocus",!1,b.localize(2,null)),w.readOnly=new N.RawContextKey("editorReadonly",!1,b.localize(3,null)),w.inDiffEditor=new N.RawContextKey("inDiffEditor",!1,b.localize(4,null)),w.columnSelection=new N.RawContextKey("editorColumnSelection",!1,b.localize(5,null)),w.writable=w.readOnly.toNegated(),w.hasNonEmptySelection=new N.RawContextKey("editorHasSelection",!1,b.localize(6,null)),w.hasOnlyEmptySelection=w.hasNonEmptySelection.toNegated(),w.hasMultipleSelections=new N.RawContextKey("editorHasMultipleSelections",!1,b.localize(7,null)),w.hasSingleSelection=w.hasMultipleSelections.toNegated(),w.tabMovesFocus=new N.RawContextKey("editorTabMovesFocus",!1,b.localize(8,null)),w.tabDoesNotMoveFocus=w.tabMovesFocus.toNegated(),w.isInWalkThroughSnippet=new N.RawContextKey("isInEmbeddedEditor",!1,!0),w.canUndo=new N.RawContextKey("canUndo",!1,!0),w.canRedo=new N.RawContextKey("canRedo",!1,!0),w.hoverVisible=new N.RawContextKey("editorHoverVisible",!1,b.localize(9,null)),w.inCompositeEditor=new N.RawContextKey("inCompositeEditor",void 0,b.localize(10,null)),w.notInCompositeEditor=w.inCompositeEditor.toNegated(),w.languageId=new N.RawContextKey("editorLangId","",b.localize(11,null)),w.hasCompletionItemProvider=new N.RawContextKey("editorHasCompletionItemProvider",!1,b.localize(12,null)),w.hasCodeActionsProvider=new N.RawContextKey("editorHasCodeActionsProvider",!1,b.localize(13,null)),w.hasCodeLensProvider=new N.RawContextKey("editorHasCodeLensProvider",!1,b.localize(14,null)),w.hasDefinitionProvider=new N.RawContextKey("editorHasDefinitionProvider",!1,b.localize(15,null)),w.hasDeclarationProvider=new N.RawContextKey("editorHasDeclarationProvider",!1,b.localize(16,null)),w.hasImplementationProvider=new N.RawContextKey("editorHasImplementationProvider",!1,b.localize(17,null)),w.hasTypeDefinitionProvider=new N.RawContextKey("editorHasTypeDefinitionProvider",!1,b.localize(18,null)),w.hasHoverProvider=new N.RawContextKey("editorHasHoverProvider",!1,b.localize(19,null)),w.hasDocumentHighlightProvider=new N.RawContextKey("editorHasDocumentHighlightProvider",!1,b.localize(20,null)),w.hasDocumentSymbolProvider=new N.RawContextKey("editorHasDocumentSymbolProvider",!1,b.localize(21,null)),w.hasReferenceProvider=new N.RawContextKey("editorHasReferenceProvider",!1,b.localize(22,null)),w.hasRenameProvider=new N.RawContextKey("editorHasRenameProvider",!1,b.localize(23,null)),w.hasSignatureHelpProvider=new N.RawContextKey("editorHasSignatureHelpProvider",!1,b.localize(24,null)),w.hasInlineHintsProvider=new N.RawContextKey("editorHasInlineHintsProvider",!1,b.localize(25,null)),w.hasDocumentFormattingProvider=new N.RawContextKey("editorHasDocumentFormattingProvider",!1,b.localize(26,null)),w.hasDocumentSelectionFormattingProvider=new N.RawContextKey("editorHasDocumentSelectionFormattingProvider",!1,b.localize(27,null)),w.hasMultipleDocumentFormattingProvider=new N.RawContextKey("editorHasMultipleDocumentFormattingProvider",!1,b.localize(28,null)),w.hasMultipleDocumentSelectionFormattingProvider=new N.RawContextKey("editorHasMultipleDocumentSelectionFormattingProvider",!1,b.localize(29,null))})(M=e.EditorContextKeys||(e.EditorContextKeys={}))}),define(Q[183],J([0,1,12,14,18,16,23,26,24,20,67]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.provideSignatureHelp=e.Context=void 0,e.Context={Visible:new w.RawContextKey("parameterHintsVisible",!1),MultipleSignatures:new w.RawContextKey("parameterHintsMultipleSignatures",!1)};function c(o,s,a,u){return Ie(this,void 0,void 0,function*(){const r=M.SignatureHelpProviderRegistry.ordered(o);for(const i of r)try{const n=yield i.provideSignatureHelp(o,s,u,a);if(n)return n}catch(n){b.onUnexpectedExternalError(n)}})}e.provideSignatureHelp=c,C.CommandsRegistry.registerCommand("_executeSignatureHelpProvider",(o,...s)=>Ie(void 0,void 0,void 0,function*(){const[a,u,r]=s;g.assertType(d.URI.isUri(a)),g.assertType(N.Position.isIPosition(u)),g.assertType(typeof r=="string"||!r);const i=yield o.get(p.ITextModelService).createModelReference(a);try{const n=yield c(i.object.textEditorModel,N.Position.lift(u),{triggerKind:M.SignatureHelpTriggerKind.Invoke,isRetrigger:!1,triggerCharacter:r},S.CancellationToken.None);return n?(setTimeout(()=>n.dispose(),0),n.value):void 0}finally{i.dispose()}}))}),define(Q[547],J([0,1,15,12,6,2,91,18,183]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ParameterHintsModel=void 0;var g;(function(o){o.Default={type:0};class s{constructor(r,i){this.request=r,this.previouslyActiveHints=i,this.type=2}}o.Pending=s;class a{constructor(r){this.hints=r,this.type=1}}o.Active=a})(g||(g={}));class p extends w.Disposable{constructor(s,a=p.DEFAULT_DELAY){super();this._onChangedHints=this._register(new M.Emitter),this.onChangedHints=this._onChangedHints.event,this.triggerOnType=!1,this._state=g.Default,this._pendingTriggers=[],this._lastSignatureHelpResult=this._register(new w.MutableDisposable),this.triggerChars=new S.CharacterSet,this.retriggerChars=new S.CharacterSet,this.triggerId=0,this.editor=s,this.throttledDelayer=new b.Delayer(a),this._register(this.editor.onDidChangeConfiguration(()=>this.onEditorConfigurationChange())),this._register(this.editor.onDidChangeModel(u=>this.onModelChanged())),this._register(this.editor.onDidChangeModelLanguage(u=>this.onModelChanged())),this._register(this.editor.onDidChangeCursorSelection(u=>this.onCursorChange(u))),this._register(this.editor.onDidChangeModelContent(u=>this.onModelContentChange())),this._register(C.SignatureHelpProviderRegistry.onDidChange(this.onModelChanged,this)),this._register(this.editor.onDidType(u=>this.onDidType(u))),this.onEditorConfigurationChange(),this.onModelChanged()}get state(){return this._state}set state(s){this._state.type===2&&this._state.request.cancel(),this._state=s}cancel(s=!1){this.state=g.Default,this.throttledDelayer.cancel(),s||this._onChangedHints.fire(void 0)}trigger(s,a){const u=this.editor.getModel();if(!(!u||!C.SignatureHelpProviderRegistry.has(u))){const r=++this.triggerId;this._pendingTriggers.push(s),this.throttledDelayer.trigger(()=>this.doTrigger(r),a).catch(N.onUnexpectedError)}}next(){if(this.state.type===1){const s=this.state.hints.signatures.length,a=this.state.hints.activeSignature,u=a%s==s-1,r=this.editor.getOption(70).cycle;if((s<2||u)&&!r){this.cancel();return}this.updateActiveSignature(u&&r?0:a+1)}}previous(){if(this.state.type===1){const s=this.state.hints.signatures.length,a=this.state.hints.activeSignature,u=a===0,r=this.editor.getOption(70).cycle;if((s<2||u)&&!r){this.cancel();return}this.updateActiveSignature(u&&r?s-1:a-1)}}updateActiveSignature(s){this.state.type===1&&(this.state=new g.Active(Object.assign(Object.assign({},this.state.hints),{activeSignature:s})),this._onChangedHints.fire(this.state.hints))}doTrigger(s){return Ie(this,void 0,void 0,function*(){const a=this.state.type===1||this.state.type===2,u=this.getLastActiveHints();if(this.cancel(!0),this._pendingTriggers.length===0)return!1;const r=this._pendingTriggers.reduce(c);this._pendingTriggers=[];const i={triggerKind:r.triggerKind,triggerCharacter:r.triggerCharacter,isRetrigger:a,activeSignatureHelp:u};if(!this.editor.hasModel())return!1;const n=this.editor.getModel(),t=this.editor.getPosition();this.state=new g.Pending(b.createCancelablePromise(l=>d.provideSignatureHelp(n,t,i,l)),u);try{const l=yield this.state.request;return s!==this.triggerId?(l==null||l.dispose(),!1):!l||!l.value.signatures||l.value.signatures.length===0?(l==null||l.dispose(),this._lastSignatureHelpResult.clear(),this.cancel(),!1):(this.state=new g.Active(l.value),this._lastSignatureHelpResult.value=l,this._onChangedHints.fire(this.state.hints),!0)}catch(l){return s===this.triggerId&&(this.state=g.Default),N.onUnexpectedError(l),!1}})}getLastActiveHints(){switch(this.state.type){case 1:return this.state.hints;case 2:return this.state.previouslyActiveHints;default:return}}get isTriggered(){return this.state.type===1||this.state.type===2||this.throttledDelayer.isTriggered()}onModelChanged(){this.cancel(),this.triggerChars=new S.CharacterSet,this.retriggerChars=new S.CharacterSet;const s=this.editor.getModel();if(!!s)for(const a of C.SignatureHelpProviderRegistry.ordered(s)){for(const u of a.signatureHelpTriggerCharacters||[])this.triggerChars.add(u.charCodeAt(0)),this.retriggerChars.add(u.charCodeAt(0));for(const u of a.signatureHelpRetriggerCharacters||[])this.retriggerChars.add(u.charCodeAt(0))}}onDidType(s){if(!!this.triggerOnType){const a=s.length-1,u=s.charCodeAt(a);(this.triggerChars.has(u)||this.isTriggered&&this.retriggerChars.has(u))&&this.trigger({triggerKind:C.SignatureHelpTriggerKind.TriggerCharacter,triggerCharacter:s.charAt(a)})}}onCursorChange(s){s.source==="mouse"?this.cancel():this.isTriggered&&this.trigger({triggerKind:C.SignatureHelpTriggerKind.ContentChange})}onModelContentChange(){this.isTriggered&&this.trigger({triggerKind:C.SignatureHelpTriggerKind.ContentChange})}onEditorConfigurationChange(){this.triggerOnType=this.editor.getOption(70).enabled,this.triggerOnType||this.cancel()}dispose(){this.cancel(!0),super.dispose()}}e.ParameterHintsModel=p,p.DEFAULT_DELAY=120;function c(o,s){switch(s.triggerKind){case C.SignatureHelpTriggerKind.Invoke:return s;case C.SignatureHelpTriggerKind.ContentChange:return o;case C.SignatureHelpTriggerKind.TriggerCharacter:default:return s}}});var _e=this&&this.__param||function(q,e){return function(b,N){e(b,N,q)}};define(Q[548],J([0,1,16]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestAlternatives=void 0;let N=class at{constructor(w,S){this._editor=w,this._index=0,this._ckOtherSuggestions=at.OtherSuggestions.bindTo(S)}dispose(){this.reset()}reset(){var w;this._ckOtherSuggestions.reset(),(w=this._listener)===null||w===void 0||w.dispose(),this._model=void 0,this._acceptNext=void 0,this._ignore=!1}set({model:w,index:S},C){if(w.items.length===0){this.reset();return}if(at._moveIndex(!0,w,S)===S){this.reset();return}this._acceptNext=C,this._model=w,this._index=S,this._listener=this._editor.onDidChangeCursorPosition(()=>{this._ignore||this.reset()}),this._ckOtherSuggestions.set(!0)}static _moveIndex(w,S,C){let d=C;for(;d=(d+S.items.length+(w?1:-1))%S.items.length,!(d===C||!S.items[d].completion.additionalTextEdits););return d}next(){this._move(!0)}prev(){this._move(!1)}_move(w){if(!!this._model)try{this._ignore=!0,this._index=at._moveIndex(w,this._model,this._index),this._acceptNext({index:this._index,item:this._model.items[this._index],model:this._model})}finally{this._ignore=!1}}};N.OtherSuggestions=new b.RawContextKey("hasOtherSuggestions",!1),N=Me([_e(1,b.IContextKeyService)],N),e.SuggestAlternatives=N}),define(Q[549],J([0,1,16]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WordContextKey=void 0;let N=class Mt{constructor(w,S){this._editor=w,this._enabled=!1,this._ckAtEnd=Mt.AtEnd.bindTo(S),this._configListener=this._editor.onDidChangeConfiguration(C=>C.hasChanged(106)&&this._update()),this._update()}dispose(){var w;this._configListener.dispose(),(w=this._selectionListener)===null||w===void 0||w.dispose(),this._ckAtEnd.reset()}_update(){const w=this._editor.getOption(106)==="on";if(this._enabled!==w)if(this._enabled=w,this._enabled){const S=()=>{if(!this._editor.hasModel()){this._ckAtEnd.set(!1);return}const C=this._editor.getModel(),d=this._editor.getSelection(),g=C.getWordAtPosition(d.getStartPosition());if(!g){this._ckAtEnd.set(!1);return}this._ckAtEnd.set(g.endColumn===d.getStartPosition().column)};this._selectionListener=this._editor.onDidChangeCursorSelection(S),S()}else this._selectionListener&&(this._ckAtEnd.reset(),this._selectionListener.dispose(),this._selectionListener=void 0)}};N.AtEnd=new b.RawContextKey("atEndOfWord",!1),N=Me([_e(1,b.IContextKeyService)],N),e.WordContextKey=N}),define(Q[65],J([0,1,9,16]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CONTEXT_ACCESSIBILITY_MODE_ENABLED=e.IAccessibilityService=void 0,e.IAccessibilityService=b.createDecorator("accessibilityService"),e.CONTEXT_ACCESSIBILITY_MODE_ENABLED=new N.RawContextKey("accessibilityModeEnabled",!1)}),define(Q[250],J([0,1,521,16,17]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InputFocusedContextKey=e.IsWindowsContext=void 0,e.IsWindowsContext=new N.RawContextKey("isWindows",M.isWindows,b.localize(0,null)),e.InputFocusedContextKey="inputFocus"}),define(Q[68],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IContextMenuService=e.IContextViewService=void 0,e.IContextViewService=b.createDecorator("contextViewService"),e.IContextMenuService=b.createDecorator("contextMenuService")}),define(Q[184],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IDialogService=void 0,e.IDialogService=b.createDecorator("dialogService")}),define(Q[138],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ServiceCollection=void 0;class b{constructor(...M){this._entries=new Map;for(let[w,S]of M)this.set(w,S)}set(M,w){const S=this._entries.get(M);return this._entries.set(M,w),S}has(M){return this._entries.has(M)}get(M){return this._entries.get(M)}}e.ServiceCollection=b}),define(Q[550],J([0,1,12,533,238,9,138,15]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InstantiationService=void 0;const d=!1;class g extends Error{constructor(s){super("cyclic dependency between services");this.message=s.toString()}}class p{constructor(s=new S.ServiceCollection,a=!1,u){this._activeInstantiations=new Set,this._services=s,this._strict=a,this._parent=u,this._services.set(w.IInstantiationService,this)}createChild(s){return new p(s,this._strict,this)}invokeFunction(s,...a){let u=c.traceInvocation(s),r=!1;try{return s({get:(n,t)=>{if(r)throw b.illegalState("service accessor is only valid during the invocation of its target method");const l=this._getOrCreateServiceInstance(n,u);if(!l&&t!==w.optional)throw new Error(`[invokeFunction] unknown service '${n}'`);return l}},...a)}finally{r=!0,u.stop()}}createInstance(s,...a){let u,r;return s instanceof M.SyncDescriptor?(u=c.traceCreation(s.ctor),r=this._createInstance(s.ctor,s.staticArguments.concat(a),u)):(u=c.traceCreation(s),r=this._createInstance(s,a,u)),u.stop(),r}_createInstance(s,a=[],u){let r=w._util.getServiceDependencies(s).sort((t,l)=>t.index-l.index),i=[];for(const t of r){let l=this._getOrCreateServiceInstance(t.id,u);if(!l&&this._strict&&!t.optional)throw new Error(`[createInstance] ${s.name} depends on UNKNOWN service ${t.id}.`);i.push(l)}let n=r.length>0?r[0].index:a.length;if(a.length!==n){console.warn(`[createInstance] First service dependency of ${s.name} at position ${n+1} conflicts with ${a.length} static arguments`);let t=n-a.length;t>0?a=a.concat(new Array(t)):a=a.slice(0,n)}return new s(...[...a,...i])}_setServiceInstance(s,a){if(this._services.get(s)instanceof M.SyncDescriptor)this._services.set(s,a);else if(this._parent)this._parent._setServiceInstance(s,a);else throw new Error("illegalState - setting UNKNOWN service instance")}_getServiceInstanceOrDescriptor(s){let a=this._services.get(s);return!a&&this._parent?this._parent._getServiceInstanceOrDescriptor(s):a}_getOrCreateServiceInstance(s,a){let u=this._getServiceInstanceOrDescriptor(s);return u instanceof M.SyncDescriptor?this._safeCreateAndCacheServiceInstance(s,u,a.branch(s,!0)):(a.branch(s,!1),u)}_safeCreateAndCacheServiceInstance(s,a,u){if(this._activeInstantiations.has(s))throw new Error(`illegal state - RECURSIVELY instantiating service '${s}'`);this._activeInstantiations.add(s);try{return this._createAndCacheServiceInstance(s,a,u)}finally{this._activeInstantiations.delete(s)}}_createAndCacheServiceInstance(s,a,u){const r=new N.Graph(t=>t.id.toString());let i=0;const n=[{id:s,desc:a,_trace:u}];for(;n.length;){const t=n.pop();if(r.lookupOrInsertNode(t),i++>1e3)throw new g(r);for(let l of w._util.getServiceDependencies(t.desc.ctor)){let h=this._getServiceInstanceOrDescriptor(l.id);if(!h&&!l.optional&&console.warn(`[createInstance] ${s} depends on ${l.id} which is NOT registered.`),h instanceof M.SyncDescriptor){const m={id:l.id,desc:h,_trace:t._trace.branch(l.id,!0)};r.insertEdge(t,m),n.push(m)}}}for(;;){const t=r.roots();if(t.length===0){if(!r.isEmpty())throw new g(r);break}for(const{data:l}of t){if(this._getServiceInstanceOrDescriptor(l.id)instanceof M.SyncDescriptor){const m=this._createServiceInstanceWithOwner(l.id,l.desc.ctor,l.desc.staticArguments,l.desc.supportsDelayedInstantiation,l._trace);this._setServiceInstance(l.id,m)}r.removeNode(l)}}return this._getServiceInstanceOrDescriptor(s)}_createServiceInstanceWithOwner(s,a,u=[],r,i){if(this._services.get(s)instanceof M.SyncDescriptor)return this._createServiceInstance(a,u,r,i);if(this._parent)return this._parent._createServiceInstanceWithOwner(s,a,u,r,i);throw new Error(`illegalState - creating UNKNOWN service instance ${a.name}`)}_createServiceInstance(s,a=[],u,r){if(u){const i=new C.IdleValue(()=>this._createInstance(s,a,r));return new Proxy(Object.create(null),{get(n,t){if(t in n)return n[t];let l=i.value,h=l[t];return typeof h!="function"||(h=h.bind(l),n[t]=h),h},set(n,t,l){return i.value[t]=l,!0}})}else return this._createInstance(s,a,r)}}e.InstantiationService=p;class c{constructor(s,a){this.type=s,this.name=a,this._start=Date.now(),this._dep=[]}static traceInvocation(s){return d?new c(1,s.name||s.toString().substring(0,42).replace(/\n/g,"")):c._None}static traceCreation(s){return d?new c(0,s.name):c._None}branch(s,a){let u=new c(2,s.toString());return this._dep.push([s,a,u]),u}stop(){let s=Date.now()-this._start;c._totals+=s;let a=!1;function u(i,n){let t=[],l=new Array(i+1).join(" ");for(const[h,m,_]of n._dep)if(m&&_){a=!0,t.push(`${l}CREATES -> ${h}`);let f=u(i+1,_);f&&t.push(f)}else t.push(`${l}uses -> ${h}`);return t.join(` +`)}let r=[`${this.type===0?"CREATE":"CALL"} ${this.name}`,`${u(1,this)}`,`DONE, took ${s.toFixed(2)}ms (grand total ${c._totals.toFixed(2)}ms)`];(s>2||a)&&console.log(r.join(` +`))}}c._None=new class extends c{constructor(){super(-1,null)}stop(){}branch(){return this}},c._totals=0}),define(Q[551],J([0,1,522,15,6,2]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractKeybindingService=void 0;class S extends w.Disposable{constructor(d,g,p,c,o){super();this._contextKeyService=d,this._commandService=g,this._telemetryService=p,this._notificationService=c,this._logService=o,this._onDidUpdateKeybindings=this._register(new M.Emitter),this._currentChord=null,this._currentChordChecker=new N.IntervalTimer,this._currentChordStatusMessage=null,this._currentSingleModifier=null,this._currentSingleModifierClearTimeout=new N.TimeoutTimer,this._logging=!1}get onDidUpdateKeybindings(){return this._onDidUpdateKeybindings?this._onDidUpdateKeybindings.event:M.Event.None}dispose(){super.dispose()}_log(d){this._logging&&this._logService.info(`[KeybindingService]: ${d}`)}getKeybindings(){return this._getResolver().getKeybindings()}lookupKeybinding(d){const g=this._getResolver().lookupPrimaryKeybinding(d);if(!!g)return g.resolvedKeybinding}dispatchEvent(d,g){return this._dispatch(d,g)}softDispatch(d,g){const p=this.resolveKeyboardEvent(d);if(p.isChord())return console.warn("Unexpected keyboard event mapped to a chord"),null;const[c]=p.getDispatchParts();if(c===null)return null;const o=this._contextKeyService.getContext(g),s=this._currentChord?this._currentChord.keypress:null;return this._getResolver().resolve(o,s,c)}_enterChordMode(d,g){this._currentChord={keypress:d,label:g},this._currentChordStatusMessage=this._notificationService.status(b.localize(0,null,g));const p=Date.now();this._currentChordChecker.cancelAndSet(()=>{if(!this._documentHasFocus()){this._leaveChordMode();return}Date.now()-p>5e3&&this._leaveChordMode()},500)}_leaveChordMode(){this._currentChordStatusMessage&&(this._currentChordStatusMessage.dispose(),this._currentChordStatusMessage=null),this._currentChordChecker.cancel(),this._currentChord=null}_dispatch(d,g){return this._doDispatch(this.resolveKeyboardEvent(d),g,!1)}_singleModifierDispatch(d,g){const p=this.resolveKeyboardEvent(d),[c]=p.getSingleModifierDispatchParts();return c!==null&&this._currentSingleModifier===null?(this._log(`+ Storing single modifier for possible chord ${c}.`),this._currentSingleModifier=c,this._currentSingleModifierClearTimeout.cancelAndSet(()=>{this._log("+ Clearing single modifier due to 300ms elapsed."),this._currentSingleModifier=null},300),!1):c!==null&&c===this._currentSingleModifier?(this._log(`/ Dispatching single modifier chord ${c} ${c}`),this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,this._doDispatch(p,g,!0)):(this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,!1)}_doDispatch(d,g,p=!1){let c=!1;if(d.isChord())return console.warn("Unexpected keyboard event mapped to a chord"),!1;let o=null,s=null;if(p){const[i]=d.getSingleModifierDispatchParts();o=i,s=i}else[o]=d.getDispatchParts(),s=this._currentChord?this._currentChord.keypress:null;if(o===null)return this._log("\\ Keyboard event cannot be dispatched in keydown phase."),c;const a=this._contextKeyService.getContext(g),u=d.getLabel(),r=this._getResolver().resolve(a,s,o);return this._logService.trace("KeybindingService#dispatch",u,r==null?void 0:r.commandId),r&&r.enterChord?(c=!0,this._enterChordMode(o,u),c):(this._currentChord&&(!r||!r.commandId)&&(this._notificationService.status(b.localize(1,null,this._currentChord.label,u),{hideAfter:10*1e3}),c=!0),this._leaveChordMode(),r&&r.commandId&&(r.bubble||(c=!0),typeof r.commandArgs=="undefined"?this._commandService.executeCommand(r.commandId).then(void 0,i=>this._notificationService.warn(i)):this._commandService.executeCommand(r.commandId,r.commandArgs).then(void 0,i=>this._notificationService.warn(i)),this._telemetryService.publicLog2("workbenchActionExecuted",{id:r.commandId,from:"keybinding"})),c)}mightProducePrintableCharacter(d){return d.ctrlKey||d.metaKey?!1:d.keyCode>=31&&d.keyCode<=56||d.keyCode>=21&&d.keyCode<=30}}e.AbstractKeybindingService=S}),define(Q[552],J([0,1,12,235,39]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BaseResolvedKeybinding=void 0;class w extends M.ResolvedKeybinding{constructor(C,d){super();if(d.length===0)throw b.illegalArgument("parts");this._os=C,this._parts=d}getLabel(){return N.UILabelProvider.toLabel(this._os,this._parts,C=>this._getLabel(C))}getAriaLabel(){return N.AriaLabelProvider.toLabel(this._os,this._parts,C=>this._getAriaLabel(C))}isChord(){return this._parts.length>1}getParts(){return this._parts.map(C=>this._getPart(C))}_getPart(C){return new M.ResolvedKeybindingPart(C.ctrlKey,C.shiftKey,C.altKey,C.metaKey,this._getLabel(C),this._getAriaLabel(C))}getDispatchParts(){return this._parts.map(C=>this._getDispatchPart(C))}getSingleModifierDispatchParts(){return this._parts.map(C=>this._getSingleModifierDispatchPart(C))}}e.BaseResolvedKeybinding=w}),define(Q[37],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IKeybindingService=void 0,e.IKeybindingService=b.createDecorator("keybindingService")}),define(Q[251],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.KeybindingResolver=void 0;class b{constructor(S,C,d){this._log=d,this._defaultKeybindings=S,this._defaultBoundCommands=new Map;for(let g=0,p=S.length;g=0;a--)this._isTargetedForRemoval(S[a],c,o,p,s)&&S.splice(a,1)}return S.concat(d)}_addKeyPress(S,C){const d=this._map.get(S);if(typeof d=="undefined"){this._map.set(S,[C]),this._addToLookupMap(C);return}for(let g=d.length-1;g>=0;g--){let p=d[g];if(p.command!==C.command){const c=p.keypressParts.length>1,o=C.keypressParts.length>1;c&&o&&p.keypressParts[1]!==C.keypressParts[1]||b.whenIsEntirelyIncluded(p.when,C.when)&&this._removeFromLookupMap(p)}}d.push(C),this._addToLookupMap(C)}_addToLookupMap(S){if(!!S.command){let C=this._lookupMap.get(S.command);typeof C=="undefined"?(C=[S],this._lookupMap.set(S.command,C)):C.push(S)}}_removeFromLookupMap(S){if(!!S.command){let C=this._lookupMap.get(S.command);if(typeof C!="undefined"){for(let d=0,g=C.length;dc.type===9?c.expr:[c];let p=g(d).concat(g(C));for(let c=0;c1&&p.keypressParts[1]!==null?(this._log(`\\ From ${g.length} keybinding entries, matched chord, when: ${N(p.when)}, source: ${M(p)}.`),{enterChord:!0,leaveChord:!1,commandId:null,commandArgs:null,bubble:!1}):(this._log(`\\ From ${g.length} keybinding entries, matched ${p.command}, when: ${N(p.when)}, source: ${M(p)}.`),{enterChord:!1,leaveChord:p.keypressParts.length>1,commandId:p.command,commandArgs:p.commandArgs,bubble:p.bubble}):(this._log(`\\ From ${g.length} keybinding entries, no when clauses matched the context.`),null)}_findCommand(S,C){for(let d=C.length-1;d>=0;d--){let g=C[d];if(!!b.contextMatchesRules(S,g.when))return g}return null}static contextMatchesRules(S,C){return C?C.evaluate(S):!0}}e.KeybindingResolver=b;function N(w){return w?`${w.serialize()}`:"no when condition"}function M(w){return w.extensionId?w.isBuiltinExtension?`built-in extension ${w.extensionId}`:`user extension ${w.extensionId}`:w.isDefault?"built-in":"user"}}),define(Q[553],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.removeElementsAfterNulls=e.ResolvedKeybindingItem=void 0;class b{constructor(w,S,C,d,g,p,c){this.resolvedKeybinding=w,this.keypressParts=w?N(w.getDispatchParts()):[],w&&this.keypressParts.length===0&&(this.keypressParts=N(w.getSingleModifierDispatchParts())),this.bubble=S?S.charCodeAt(0)===94:!1,this.command=this.bubble?S.substr(1):S,this.commandArgs=C,this.when=d,this.isDefault=g,this.extensionId=p,this.isBuiltinExtension=c}}e.ResolvedKeybindingItem=b;function N(M){let w=[];for(let S=0,C=M.length;Sthis.layout()))}setContainer(C,d){this.contextView.setContainer(C,d||1)}showContextView(C,d,g){d?d!==this.container&&(this.container=d,this.setContainer(d,g?3:2)):this.container!==this.layoutService.container&&(this.container=this.layoutService.container,this.setContainer(this.container,1)),this.contextView.show(C);const p=N.toDisposable(()=>{this.currentViewDisposable===p&&this.hideContextView()});return this.currentViewDisposable=p,p}getContextViewElement(){return this.contextView.getViewElement()}layout(){this.contextView.layout()}hideContextView(C){this.contextView.hide(C)}};w=Me([_e(0,M.ILayoutService)],w),e.ContextViewService=w}),define(Q[77],J([0,1,9,2,6]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LogService=e.ConsoleLogger=e.AbstractLogger=e.DEFAULT_LOG_LEVEL=e.LogLevel=e.ILogService=void 0,e.ILogService=b.createDecorator("logService");var w;(function(g){g[g.Trace=0]="Trace",g[g.Debug=1]="Debug",g[g.Info=2]="Info",g[g.Warning=3]="Warning",g[g.Error=4]="Error",g[g.Critical=5]="Critical",g[g.Off=6]="Off"})(w=e.LogLevel||(e.LogLevel={})),e.DEFAULT_LOG_LEVEL=w.Info;class S extends N.Disposable{constructor(){super(...arguments);this.level=e.DEFAULT_LOG_LEVEL,this._onDidChangeLogLevel=this._register(new M.Emitter)}setLevel(p){this.level!==p&&(this.level=p,this._onDidChangeLogLevel.fire(this.level))}getLevel(){return this.level}}e.AbstractLogger=S;class C extends S{constructor(p=e.DEFAULT_LOG_LEVEL){super();this.setLevel(p)}trace(p,...c){this.getLevel()<=w.Trace&&console.log("%cTRACE","color: #888",p,...c)}debug(p,...c){this.getLevel()<=w.Debug&&console.log("%cDEBUG","background: #eee; color: #888",p,...c)}info(p,...c){this.getLevel()<=w.Info&&console.log("%c INFO","color: #33f",p,...c)}error(p,...c){this.getLevel()<=w.Error&&console.log("%c ERR","color: #f33",p,...c)}dispose(){}}e.ConsoleLogger=C;class d extends N.Disposable{constructor(p){super();this.logger=p,this._register(p)}getLevel(){return this.logger.getLevel()}trace(p,...c){this.logger.trace(p,...c)}debug(p,...c){this.logger.debug(p,...c)}info(p,...c){this.logger.info(p,...c)}error(p,...c){this.logger.error(p,...c)}}e.LogService=d}),define(Q[252],J([0,1,15,2,201,294,3,18,41,389,36,137,8,19,77,81,12]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorWorkerClient=e.EditorWorkerHost=e.EditorWorkerServiceImpl=void 0;const i=60*1e3,n=5*60*1e3;function t(L,I){let k=L.getModel(I);return!(!k||k.isTooLargeForSyncing())}let l=class extends N.Disposable{constructor(I,k,E){super();this._modelService=I,this._workerManager=this._register(new m(this._modelService)),this._logService=E,this._register(C.LinkProviderRegistry.register("*",{provideLinks:(T,O)=>t(this._modelService,T.uri)?this._workerManager.withWorker().then(A=>A.computeLinks(T.uri)).then(A=>A&&{links:A}):Promise.resolve({links:[]})})),this._register(C.CompletionProviderRegistry.register("*",new h(this._workerManager,k,this._modelService)))}dispose(){super.dispose()}canComputeDiff(I,k){return t(this._modelService,I)&&t(this._modelService,k)}computeDiff(I,k,E,T){return this._workerManager.withWorker().then(O=>O.computeDiff(I,k,E,T))}computeMoreMinimalEdits(I,k){if(s.isNonEmptyArray(k)){if(!t(this._modelService,I))return Promise.resolve(k);const E=u.StopWatch.create(!0),T=this._workerManager.withWorker().then(O=>O.computeMoreMinimalEdits(I,k));return T.finally(()=>this._logService.trace("FORMAT#computeMoreMinimalEdits",I.toString(!0),E.elapsed())),Promise.race([T,b.timeout(1e3).then(()=>k)])}else return Promise.resolve(void 0)}canNavigateValueSet(I){return t(this._modelService,I)}navigateValueSet(I,k,E){return this._workerManager.withWorker().then(T=>T.navigateValueSet(I,k,E))}canComputeWordRanges(I){return t(this._modelService,I)}computeWordRanges(I,k){return this._workerManager.withWorker().then(E=>E.computeWordRanges(I,k))}};l=Me([_e(0,p.IModelService),_e(1,c.ITextResourceConfigurationService),_e(2,a.ILogService)],l),e.EditorWorkerServiceImpl=l;class h{constructor(I,k,E){this._debugDisplayName="wordbasedCompletions",this._workerManager=I,this._configurationService=k,this._modelService=E}provideCompletionItems(I,k){return Ie(this,void 0,void 0,function*(){const E=this._configurationService.getValue(I.uri,k,"editor");if(!!E.wordBasedSuggestions){const T=[];if(E.wordBasedSuggestionsMode==="currentDocument")t(this._modelService,I.uri)&&T.push(I.uri);else for(const W of this._modelService.getModels())!t(this._modelService,W.uri)||(W===I?T.unshift(W.uri):(E.wordBasedSuggestionsMode==="allDocuments"||W.getLanguageIdentifier().id===I.getLanguageIdentifier().id)&&T.push(W.uri));if(T.length!==0){const O=d.LanguageConfigurationRegistry.getWordDefinition(I.getLanguageIdentifier().id),A=I.getWordAtPosition(k),B=A?new S.Range(k.lineNumber,A.startColumn,k.lineNumber,A.endColumn):S.Range.fromPositions(k),F=B.setEndPosition(k.lineNumber,k.column),R=yield(yield this._workerManager.withWorker()).textualSuggest(T,A==null?void 0:A.word,O);if(!!R)return{duration:R.duration,suggestions:R.words.map(W=>({kind:18,label:W,insertText:W,range:{insert:F,replace:B}}))}}}})}}class m extends N.Disposable{constructor(I){super();this._modelService=I,this._editorWorkerClient=null,this._lastWorkerUsedTime=new Date().getTime(),this._register(new b.IntervalTimer).cancelAndSet(()=>this._checkStopIdleWorker(),Math.round(n/2)),this._register(this._modelService.onModelRemoved(E=>this._checkStopEmptyWorker()))}dispose(){this._editorWorkerClient&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null),super.dispose()}_checkStopEmptyWorker(){!this._editorWorkerClient||this._modelService.getModels().length===0&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null)}_checkStopIdleWorker(){!this._editorWorkerClient||new Date().getTime()-this._lastWorkerUsedTime>n&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null)}withWorker(){return this._lastWorkerUsedTime=new Date().getTime(),this._editorWorkerClient||(this._editorWorkerClient=new y(this._modelService,!1,"editorWorkerService")),Promise.resolve(this._editorWorkerClient)}}class _ extends N.Disposable{constructor(I,k,E){super();if(this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),this._proxy=I,this._modelService=k,!E){let T=new b.IntervalTimer;T.cancelAndSet(()=>this._checkStopModelSync(),Math.round(i/2)),this._register(T)}}dispose(){for(let I in this._syncedModels)N.dispose(this._syncedModels[I]);this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),super.dispose()}ensureSyncedResources(I){for(const k of I){let E=k.toString();this._syncedModels[E]||this._beginModelSync(k),this._syncedModels[E]&&(this._syncedModelsLastUsedTime[E]=new Date().getTime())}}_checkStopModelSync(){let I=new Date().getTime(),k=[];for(let E in this._syncedModelsLastUsedTime)I-this._syncedModelsLastUsedTime[E]>i&&k.push(E);for(const E of k)this._stopModelSync(E)}_beginModelSync(I){let k=this._modelService.getModel(I);if(!!k&&!k.isTooLargeForSyncing()){let E=I.toString();this._proxy.acceptNewModel({url:k.uri.toString(),lines:k.getLinesContent(),EOL:k.getEOL(),versionId:k.getVersionId()});const T=new N.DisposableStore;T.add(k.onDidChangeContent(O=>{this._proxy.acceptModelChanged(E.toString(),O)})),T.add(k.onWillDispose(()=>{this._stopModelSync(E)})),T.add(N.toDisposable(()=>{this._proxy.acceptRemovedModel(E)})),this._syncedModels[E]=T}}_stopModelSync(I){let k=this._syncedModels[I];delete this._syncedModels[I],delete this._syncedModelsLastUsedTime[I],N.dispose(k)}}class f{constructor(I){this._instance=I,this._proxyObj=Promise.resolve(this._instance)}dispose(){this._instance.dispose()}getProxyObject(){return this._proxyObj}}class v{constructor(I){this._workerClient=I}fhr(I,k){return this._workerClient.fhr(I,k)}}e.EditorWorkerHost=v;class y extends N.Disposable{constructor(I,k,E){super();this._disposed=!1,this._modelService=I,this._keepIdleModels=k,this._workerFactory=new w.DefaultWorkerFactory(E),this._worker=null,this._modelManager=null}fhr(I,k){throw new Error("Not implemented!")}_getOrCreateWorker(){if(!this._worker)try{this._worker=this._register(new M.SimpleWorkerClient(this._workerFactory,"vs/editor/common/services/editorSimpleWorker",new v(this)))}catch(I){M.logOnceWebWorkerWarning(I),this._worker=new f(new g.EditorSimpleWorker(new v(this),null))}return this._worker}_getProxy(){return this._getOrCreateWorker().getProxyObject().then(void 0,I=>(M.logOnceWebWorkerWarning(I),this._worker=new f(new g.EditorSimpleWorker(new v(this),null)),this._getOrCreateWorker().getProxyObject()))}_getOrCreateModelManager(I){return this._modelManager||(this._modelManager=this._register(new _(I,this._modelService,this._keepIdleModels))),this._modelManager}_withSyncedResources(I){return this._disposed?Promise.reject(r.canceled()):this._getProxy().then(k=>(this._getOrCreateModelManager(k).ensureSyncedResources(I),k))}computeDiff(I,k,E,T){return this._withSyncedResources([I,k]).then(O=>O.computeDiff(I.toString(),k.toString(),E,T))}computeMoreMinimalEdits(I,k){return this._withSyncedResources([I]).then(E=>E.computeMoreMinimalEdits(I.toString(),k))}computeLinks(I){return this._withSyncedResources([I]).then(k=>k.computeLinks(I.toString()))}textualSuggest(I,k,E){return Ie(this,void 0,void 0,function*(){const T=yield this._withSyncedResources(I),O=E.source,A=o.regExpFlags(E);return T.textualSuggest(I.map(B=>B.toString()),k,O,A)})}computeWordRanges(I,k){return this._withSyncedResources([I]).then(E=>{let T=this._modelService.getModel(I);if(!T)return Promise.resolve(null);let O=d.LanguageConfigurationRegistry.getWordDefinition(T.getLanguageIdentifier().id),A=O.source,B=o.regExpFlags(O);return E.computeWordRanges(I.toString(),k,A,B)})}navigateValueSet(I,k,E){return this._withSyncedResources([I]).then(T=>{let O=this._modelService.getModel(I);if(!O)return null;let A=d.LanguageConfigurationRegistry.getWordDefinition(O.getLanguageIdentifier().id),B=A.source,F=o.regExpFlags(A);return T.navigateValueSet(I.toString(),k,E,B,F)})}dispose(){super.dispose(),this._disposed=!0}}e.EditorWorkerClient=y}),define(Q[253],J([0,1,18,77,135]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toMultilineTokens2=e.SemanticTokensProviderStyling=void 0;class w{constructor(p,c,o){this._legend=p,this._themeService=c,this._logService=o,this._hashTable=new d,this._hasWarnedOverlappingTokens=!1}getMetadata(p,c,o){const s=this._hashTable.get(p,c,o.id);let a;if(s)a=s.metadata,this._logService.getLevel()===N.LogLevel.Trace&&this._logService.trace(`SemanticTokensProviderStyling [CACHED] ${p} / ${c}: foreground ${b.TokenMetadata.getForeground(a)}, fontStyle ${b.TokenMetadata.getFontStyle(a).toString(2)}`);else{let u=this._legend.tokenTypes[p];const r=[];if(u){let i=c;for(let t=0;i>0&&t>1;i>0&&this._logService.getLevel()===N.LogLevel.Trace&&(this._logService.trace(`SemanticTokensProviderStyling: unknown token modifier index: ${c.toString(2)} for legend: ${JSON.stringify(this._legend.tokenModifiers)}`),r.push("not-in-legend"));const n=this._themeService.getColorTheme().getTokenStyleMetadata(u,r,o.language);typeof n=="undefined"?a=2147483647:(a=0,typeof n.italic!="undefined"&&(a|=(n.italic?1:0)<<11|1),typeof n.bold!="undefined"&&(a|=(n.bold?2:0)<<11|2),typeof n.underline!="undefined"&&(a|=(n.underline?4:0)<<11|4),n.foreground&&(a|=n.foreground<<14|8),a===0&&(a=2147483647))}else this._logService.getLevel()===N.LogLevel.Trace&&this._logService.trace(`SemanticTokensProviderStyling: unknown token type index: ${p} for legend: ${JSON.stringify(this._legend.tokenTypes)}`),a=2147483647,u="not-in-legend";this._hashTable.add(p,c,o.id,a),this._logService.getLevel()===N.LogLevel.Trace&&this._logService.trace(`SemanticTokensProviderStyling ${p} (${u}) / ${c} (${r.join(" ")}): foreground ${b.TokenMetadata.getForeground(a)}, fontStyle ${b.TokenMetadata.getFontStyle(a).toString(2)}`)}return a}warnOverlappingSemanticTokens(p,c){this._hasWarnedOverlappingTokens||(this._hasWarnedOverlappingTokens=!0,console.warn(`Overlapping semantic tokens detected at lineNumber ${p}, column ${c}`))}}e.SemanticTokensProviderStyling=w;function S(g,p,c){const o=g.data,s=g.data.length/5|0,a=Math.max(Math.ceil(s/1024),400),u=[];let r=0,i=1,n=0;for(;rt&&o[5*I]===0;)I--;if(I-1===t){let k=l;for(;k+1O&&(p.warnOverlappingSemanticTokens(T,O+1),v=this._growCount){const a=this._elements;this._currentLengthIndex++,this._currentLength=d._SIZES[this._currentLengthIndex],this._growCount=Math.round(this._currentLengthIndex+1{const d=this._foreignModuleHost?N.getAllMethodNames(this._foreignModuleHost):[];return C.loadForeignModule(this._foreignModuleId,this._foreignModuleCreateData,d).then(g=>{this._foreignModuleCreateData=null;const p=(s,a)=>C.fmr(s,a),c=(s,a)=>function(){const u=Array.prototype.slice.call(arguments,0);return a(s,u)};let o={};for(const s of g)o[s]=c(s,p);return o})})),this._foreignProxy}getProxy(){return this._getForeignProxy()}withSyncedResources(C){return this._withSyncedResources(C).then(d=>this.getProxy())}}}),define(Q[85],J([0,1,9,524,82]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IMarkerService=e.IMarkerData=e.MarkerSeverity=void 0;var w;(function(C){C[C.Hint=1]="Hint",C[C.Info=2]="Info",C[C.Warning=4]="Warning",C[C.Error=8]="Error"})(w=e.MarkerSeverity||(e.MarkerSeverity={})),function(C){function d(s,a){return a-s}C.compare=d;const g=Object.create(null);g[C.Error]=N.localize(0,null),g[C.Warning]=N.localize(1,null),g[C.Info]=N.localize(2,null);function p(s){return g[s]||""}C.toString=p;function c(s){switch(s){case M.default.Error:return C.Error;case M.default.Warning:return C.Warning;case M.default.Info:return C.Info;case M.default.Ignore:return C.Hint}}C.fromSeverity=c;function o(s){switch(s){case C.Error:return M.default.Error;case C.Warning:return M.default.Warning;case C.Info:return M.default.Info;case C.Hint:return M.default.Ignore}}C.toSeverity=o}(w=e.MarkerSeverity||(e.MarkerSeverity={}));var S;(function(C){const d="";function g(c){return p(c,!0)}C.makeKey=g;function p(c,o){let s=[d];return c.source?s.push(c.source.replace("\xA6","\\\xA6")):s.push(d),c.code?typeof c.code=="string"?s.push(c.code.replace("\xA6","\\\xA6")):s.push(c.code.value.replace("\xA6","\\\xA6")):s.push(d),c.severity!==void 0&&c.severity!==null?s.push(w.toString(c.severity)):s.push(d),c.message&&o?s.push(c.message.replace("\xA6","\\\xA6")):s.push(d),c.startLineNumber!==void 0&&c.startLineNumber!==null?s.push(c.startLineNumber.toString()):s.push(d),c.startColumn!==void 0&&c.startColumn!==null?s.push(c.startColumn.toString()):s.push(d),c.endLineNumber!==void 0&&c.endLineNumber!==null?s.push(c.endLineNumber.toString()):s.push(d),c.endColumn!==void 0&&c.endColumn!==null?s.push(c.endColumn.toString()):s.push(d),s.push(d),s.join("\xA6")}C.makeKeyOptionalMessage=p})(S=e.IMarkerData||(e.IMarkerData={})),e.IMarkerService=b.createDecorator("markerService")}),define(Q[557],J([0,1,85,24,6,2,3,8,19,9,74,71]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IMarkerNavigationService=e.MarkerList=e.MarkerCoordinate=void 0;class o{constructor(r,i,n){this.marker=r,this.index=i,this.total=n}}e.MarkerCoordinate=o;let s=class Tt{constructor(r,i){this._markerService=i,this._onDidChange=new M.Emitter,this.onDidChange=this._onDidChange.event,this._dispoables=new w.DisposableStore,this._markers=[],this._nextIdx=-1,N.URI.isUri(r)?this._resourceFilter=t=>t.toString()===r.toString():r&&(this._resourceFilter=r);const n=()=>{this._markers=this._markerService.read({resource:N.URI.isUri(r)?r:void 0,severities:b.MarkerSeverity.Error|b.MarkerSeverity.Warning|b.MarkerSeverity.Info}),typeof r=="function"&&(this._markers=this._markers.filter(t=>this._resourceFilter(t.resource))),this._markers.sort(Tt._compareMarker)};n(),this._dispoables.add(i.onMarkerChanged(t=>{(!this._resourceFilter||t.some(l=>this._resourceFilter(l)))&&(n(),this._nextIdx=-1,this._onDidChange.fire())}))}dispose(){this._dispoables.dispose(),this._onDidChange.dispose()}matches(r){return!this._resourceFilter&&!r?!0:!this._resourceFilter||!r?!1:this._resourceFilter(r)}get selected(){const r=this._markers[this._nextIdx];return r&&new o(r,this._nextIdx+1,this._markers.length)}_initIdx(r,i,n){let t=!1,l=this._markers.findIndex(h=>h.resource.toString()===r.uri.toString());l<0&&(l=d.binarySearch(this._markers,{resource:r.uri},(h,m)=>C.compare(h.resource.toString(),m.resource.toString())),l<0&&(l=~l));for(let h=l;ht.resource.toString()===r.toString());if(!(n<0)){for(;nn[1])}}class p{constructor(s){this.errors=0,this.infos=0,this.warnings=0,this.unknowns=0,this._data=new C.ResourceMap,this._service=s,this._subscription=s.onMarkerChanged(this._update,this)}dispose(){this._subscription.dispose()}_update(s){for(const a of s){const u=this._data.get(a);u&&this._substract(u);const r=this._resourceStats(a);this._add(r),this._data.set(a,r)}}_resourceStats(s){const a={errors:0,warnings:0,infos:0,unknowns:0};if(s.scheme===N.Schemas.inMemory||s.scheme===N.Schemas.walkThrough||s.scheme===N.Schemas.walkThroughSnippet)return a;for(const{severity:u}of this._service.read({resource:s}))u===S.MarkerSeverity.Error?a.errors+=1:u===S.MarkerSeverity.Warning?a.warnings+=1:u===S.MarkerSeverity.Info?a.infos+=1:a.unknowns+=1;return a}_substract(s){this.errors-=s.errors,this.warnings-=s.warnings,this.infos-=s.infos,this.unknowns-=s.unknowns}_add(s){this.errors+=s.errors,this.warnings+=s.warnings,this.infos+=s.infos,this.unknowns+=s.unknowns}}class c{constructor(){this._onMarkerChanged=new w.Emitter,this.onMarkerChanged=w.Event.debounce(this._onMarkerChanged.event,c._debouncer,0),this._data=new g,this._stats=new p(this)}dispose(){this._stats.dispose(),this._onMarkerChanged.dispose()}remove(s,a){for(const u of a||[])this.changeOne(s,u,[])}changeOne(s,a,u){if(b.isFalsyOrEmpty(u))this._data.delete(a,s)&&this._onMarkerChanged.fire([a]);else{const r=[];for(const i of u){const n=c._toMarker(s,a,i);n&&r.push(n)}this._data.set(a,s,r),this._onMarkerChanged.fire([a])}}static _toMarker(s,a,u){let{code:r,severity:i,message:n,source:t,startLineNumber:l,startColumn:h,endLineNumber:m,endColumn:_,relatedInformation:f,tags:v}=u;if(!!n)return l=l>0?l:1,h=h>0?h:1,m=m>=l?m:l,_=_>0?_:h,{resource:a,owner:s,code:r,severity:i,message:n,source:t,startLineNumber:l,startColumn:h,endLineNumber:m,endColumn:_,relatedInformation:f,tags:v}}read(s=Object.create(null)){let{owner:a,resource:u,severities:r,take:i}=s;if((!i||i<0)&&(i=-1),a&&u){const n=this._data.get(u,a);if(n){const t=[];for(const l of n)if(c._accept(l,r)){const h=t.push(l);if(i>0&&h===i)break}return t}else return[]}else if(!a&&!u){const n=[];for(let t of this._data.values())for(let l of t)if(c._accept(l,r)){const h=n.push(l);if(i>0&&h===i)return n}return n}else{const n=this._data.values(u!=null?u:a),t=[];for(const l of n)for(const h of l)if(c._accept(h,r)){const m=t.push(h);if(i>0&&m===i)return t}return t}}static _accept(s,a){return a===void 0||(a&s.severity)===s.severity}static _debouncer(s,a){s||(c._dedupeMap=new C.ResourceMap,s=[]);for(const u of a)c._dedupeMap.has(u)||(c._dedupeMap.set(u,!0),s.push(u));return s}}e.MarkerService=c}),define(Q[32],J([0,1,82,9]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.NoOpNotification=e.INotificationService=e.Severity=void 0,e.Severity=b.default,e.INotificationService=N.createDecorator("notificationService");class M{}e.NoOpNotification=M}),define(Q[58],J([0,1,2,8,24,9]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.matchesScheme=e.NullOpenerService=e.IOpenerService=void 0,e.IOpenerService=w.createDecorator("openerService"),e.NullOpenerService=Object.freeze({_serviceBrand:void 0,registerOpener(){return b.Disposable.None},registerValidator(){return b.Disposable.None},registerExternalUriResolver(){return b.Disposable.None},setDefaultExternalOpener(){},registerExternalOpener(){return b.Disposable.None},open(){return Ie(this,void 0,void 0,function*(){return!1})},resolveExternalUri(C){return Ie(this,void 0,void 0,function*(){return{resolved:C,dispose(){}}})}});function S(C,d){return M.URI.isUri(C)?N.equalsIgnoreCase(C.scheme,d):N.startsWithIgnoreCase(C,d+":")}e.matchesScheme=S}),define(Q[140],J([0,1,290,58,57,12,243,6,2,18]),function(q,e,b,N,M,w,S,C,d,g){"use strict";var p;Object.defineProperty(e,"__esModule",{value:!0}),e.MarkdownRenderer=void 0;let c=class Rt{constructor(s,a,u){this._options=s,this._modeService=a,this._openerService=u,this._onDidRenderAsync=new C.Emitter,this.onDidRenderAsync=this._onDidRenderAsync.event}dispose(){this._onDidRenderAsync.dispose()}render(s,a,u){const r=new d.DisposableStore;let i;return s?i=b.renderMarkdown(s,Object.assign(Object.assign({},this._getRenderOptions(r)),a),u):i=document.createElement("span"),{element:i,dispose:()=>r.dispose()}}_getRenderOptions(s){return{baseUrl:this._options.baseUrl,codeBlockRenderer:(a,u)=>Ie(this,void 0,void 0,function*(){var r,i,n,t;let l;a?l=this._modeService.getModeIdForLanguageName(a):this._options.editor&&(l=(r=this._options.editor.getModel())===null||r===void 0?void 0:r.getLanguageIdentifier().language),l||(l="plaintext"),this._modeService.triggerMode(l);const h=(i=yield g.TokenizationRegistry.getPromise(l))!==null&&i!==void 0?i:void 0,m=document.createElement("span");m.innerHTML=(t=(n=Rt._ttpTokenizer)===null||n===void 0?void 0:n.createHTML(u,h))!==null&&t!==void 0?t:S.tokenizeToString(u,h);let _=this._options.codeBlockFontFamily;return this._options.editor&&(_=this._options.editor.getOption(38).fontFamily),_&&(m.style.fontFamily=_),m}),asyncRenderCallback:()=>this._onDidRenderAsync.fire(),actionHandler:{callback:a=>this._openerService.open(a,{fromUserGesture:!0,allowContributedOpeners:!0}).catch(w.onUnexpectedError),disposeables:s}}}};c._ttpTokenizer=(p=window.trustedTypes)===null||p===void 0?void 0:p.createPolicy("tokenizeToString",{createHTML(o,s){return S.tokenizeToString(o,s)}}),c=Me([_e(1,M.IModeService),_e(2,N.IOpenerService)],c),e.MarkdownRenderer=c}),define(Q[559],J([0,1,7,23,71,51,199,43,44,24,28,26,531,58]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.OpenerService=void 0;let a=class{constructor(n){this._commandService=n}open(n){return Ie(this,void 0,void 0,function*(){if(!s.matchesScheme(n,C.Schemas.command))return!1;typeof n=="string"&&(n=g.URI.parse(n));let t=[];try{t=S.parse(decodeURIComponent(n.query))}catch(l){try{t=S.parse(n.query)}catch(h){}}return Array.isArray(t)||(t=[t]),yield this._commandService.executeCommand(n.path,...t),!0})}};a=Me([_e(0,c.ICommandService)],a);let u=class{constructor(n){this._editorService=n}open(n,t){return Ie(this,void 0,void 0,function*(){typeof n=="string"&&(n=g.URI.parse(n));let l;const h=/^L?(\d+)(?:,(\d+))?/.exec(n.fragment);return h&&(l={startLineNumber:parseInt(h[1]),startColumn:h[2]?parseInt(h[2]):1},n=n.with({fragment:""})),n.scheme===C.Schemas.file&&(n=d.normalizePath(n)),yield this._editorService.openCodeEditor({resource:n,options:Object.assign({selection:l,context:(t==null?void 0:t.fromUserGesture)?o.EditorOpenContext.USER:o.EditorOpenContext.API},t==null?void 0:t.editorOptions)},this._editorService.getFocusedCodeEditor(),t==null?void 0:t.openToSide),!0})}};u=Me([_e(0,p.ICodeEditorService)],u);let r=class{constructor(n,t){this._openers=new M.LinkedList,this._validators=new M.LinkedList,this._resolvers=new M.LinkedList,this._resolvedUriTargets=new w.ResourceMap(l=>l.with({path:null,fragment:null,query:null}).toString()),this._externalOpeners=new M.LinkedList,this._defaultExternalOpener={openExternal:l=>Ie(this,void 0,void 0,function*(){return s.matchesScheme(l,C.Schemas.http)||s.matchesScheme(l,C.Schemas.https)?b.windowOpenNoOpener(l):window.location.href=l,!0})},this._openers.push({open:(l,h)=>Ie(this,void 0,void 0,function*(){return(h==null?void 0:h.openExternal)||s.matchesScheme(l,C.Schemas.mailto)||s.matchesScheme(l,C.Schemas.http)||s.matchesScheme(l,C.Schemas.https)?(yield this._doOpenExternal(l,h),!0):!1})}),this._openers.push(new a(t)),this._openers.push(new u(n))}registerOpener(n){return{dispose:this._openers.unshift(n)}}registerValidator(n){return{dispose:this._validators.push(n)}}registerExternalUriResolver(n){return{dispose:this._resolvers.push(n)}}setDefaultExternalOpener(n){this._defaultExternalOpener=n}registerExternalOpener(n){return{dispose:this._externalOpeners.push(n)}}open(n,t){var l;return Ie(this,void 0,void 0,function*(){const h=typeof n=="string"?g.URI.parse(n):n,m=(l=this._resolvedUriTargets.get(h))!==null&&l!==void 0?l:h;for(const _ of this._validators)if(!(yield _.shouldOpen(m)))return!1;for(const _ of this._openers)if(yield _.open(n,t))return!0;return!1})}resolveExternalUri(n,t){return Ie(this,void 0,void 0,function*(){for(const l of this._resolvers){const h=yield l.resolveExternalUri(n,t);if(h)return this._resolvedUriTargets.has(h.resolved)||this._resolvedUriTargets.set(h.resolved,n),h}return{resolved:n,dispose:()=>{}}})}_doOpenExternal(n,t){return Ie(this,void 0,void 0,function*(){const l=typeof n=="string"?g.URI.parse(n):n,{resolved:h}=yield this.resolveExternalUri(l,t);let m;if(typeof n=="string"&&l.toString()===h.toString()?m=n:m=encodeURI(h.toString(!0)),t==null?void 0:t.allowContributedOpeners){const _=typeof(t==null?void 0:t.allowContributedOpeners)=="string"?t==null?void 0:t.allowContributedOpeners:void 0;for(const f of this._externalOpeners)if(yield f.openExternal(m,{sourceUri:l,preferredOpenerId:_},N.CancellationToken.None))return!0}return this._defaultExternalOpener.openExternal(m,{sourceUri:l},N.CancellationToken.None)})}dispose(){this._validators.clear()}};r=Me([_e(0,p.ICodeEditorService),_e(1,c.ICommandService)],r),e.OpenerService=r}),define(Q[560],J([0,1,7,73,2,228,408,140,58,19]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ModesGlyphHoverWidget=void 0;class p{constructor(s){this._editor=s,this._lineNumber=-1,this._result=[]}setLineNumber(s){this._lineNumber=s,this._result=[]}clearResult(){this._result=[]}computeSync(){const s=r=>({value:r}),a=this._editor.getLineDecorations(this._lineNumber),u=[];if(!a)return u;for(const r of a)if(!!r.options.glyphMarginClassName){const i=r.options.glyphMarginHoverMessage;!i||N.isEmptyMarkdownString(i)||u.push(...g.asArray(i).map(s))}return u}onResult(s,a){this._result=this._result.concat(s)}getResult(){return this._result}getResultWithLoadingMessage(){return this.getResult()}}class c extends S.GlyphHoverWidget{constructor(s,a,u=d.NullOpenerService){super(c.ID,s);this._renderDisposeables=this._register(new M.DisposableStore),this._messages=[],this._lastLineNumber=-1,this._markdownRenderer=this._register(new C.MarkdownRenderer({editor:this._editor},a,u)),this._computer=new p(this._editor),this._hoverOperation=new w.HoverOperation(this._computer,r=>this._withResult(r),void 0,r=>this._withResult(r),300)}dispose(){this._hoverOperation.cancel(),super.dispose()}onModelDecorationsChanged(){this.isVisible&&(this._hoverOperation.cancel(),this._computer.clearResult(),this._hoverOperation.start(0))}startShowingAt(s){this._lastLineNumber!==s&&(this._hoverOperation.cancel(),this.hide(),this._lastLineNumber=s,this._computer.setLineNumber(s),this._hoverOperation.start(0))}hide(){this._lastLineNumber=-1,this._hoverOperation.cancel(),super.hide()}_withResult(s){this._messages=s,this._messages.length>0?this._renderMessages(this._lastLineNumber,this._messages):this.hide()}_renderMessages(s,a){this._renderDisposeables.clear();const u=document.createDocumentFragment();for(const r of a){const i=this._markdownRenderer.render(r.value);this._renderDisposeables.add(i),u.appendChild(b.$("div.hover-row",void 0,i.element))}this.updateContents(u),this.showAt(s)}}e.ModesGlyphHoverWidget=c,c.ID="editor.contrib.modesGlyphHoverWidget"}),define(Q[254],J([0,1,509,2,7,61,140,73,27,6,231,9]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestDetailsOverlay=e.SuggestDetailsWidget=e.canExpandCompletionItem=void 0;function o(u){return!!u&&Boolean(u.completion.documentation||u.completion.detail&&u.completion.detail!==u.completion.label)}e.canExpandCompletionItem=o;let s=class{constructor(r,i){this._editor=r,this._onDidClose=new g.Emitter,this.onDidClose=this._onDidClose.event,this._onDidChangeContents=new g.Emitter,this.onDidChangeContents=this._onDidChangeContents.event,this._disposables=new N.DisposableStore,this._renderDisposeable=new N.DisposableStore,this._borderWidth=1,this._size=new M.Dimension(330,0),this.domNode=M.$(".suggest-details"),this.domNode.classList.add("no-docs"),this._markdownRenderer=i.createInstance(S.MarkdownRenderer,{editor:r}),this._body=M.$(".body"),this._scrollbar=new w.DomScrollableElement(this._body,{}),M.append(this.domNode,this._scrollbar.getDomNode()),this._disposables.add(this._scrollbar),this._header=M.append(this._body,M.$(".header")),this._close=M.append(this._header,M.$("span"+d.Codicon.close.cssSelector)),this._close.title=b.localize(0,null),this._type=M.append(this._header,M.$("p.type")),this._docs=M.append(this._body,M.$("p.docs")),this._configureFont(),this._disposables.add(this._editor.onDidChangeConfiguration(n=>{n.hasChanged(38)&&this._configureFont()}))}dispose(){this._disposables.dispose(),this._renderDisposeable.dispose()}_configureFont(){const r=this._editor.getOptions(),i=r.get(38),n=i.fontFamily,t=r.get(102)||i.fontSize,l=r.get(103)||i.lineHeight,h=i.fontWeight,m=`${t}px`,_=`${l}px`;this.domNode.style.fontSize=m,this.domNode.style.lineHeight=_,this.domNode.style.fontWeight=h,this.domNode.style.fontFeatureSettings=i.fontFeatureSettings,this._type.style.fontFamily=n,this._close.style.height=_,this._close.style.width=_}getLayoutInfo(){const r=this._editor.getOption(103)||this._editor.getOption(38).lineHeight,i=this._borderWidth,n=i*2;return{lineHeight:r,borderWidth:i,borderHeight:n,verticalPadding:22,horizontalPadding:14}}renderLoading(){this._type.textContent=b.localize(1,null),this._docs.textContent="",this.domNode.classList.remove("no-docs","no-type"),this.layout(this.size.width,this.getLayoutInfo().lineHeight*2),this._onDidChangeContents.fire(this)}renderItem(r,i){var n;this._renderDisposeable.clear();let{detail:t,documentation:l}=r.completion;if(i){let h="";h+=`score: ${r.score[0]}${r.word?`, compared '${r.completion.filterText&&r.completion.filterText+" (filterText)"||typeof r.completion.label=="string"?r.completion.label:r.completion.label.name}' with '${r.word}'`:" (no prefix)"} +`,h+=`distance: ${r.distance}, see localityBonus-setting +`,h+=`index: ${r.idx}, based on ${r.completion.sortText&&`sortText: "${r.completion.sortText}"`||"label"} +`,h+=`commit characters: ${(n=r.completion.commitCharacters)===null||n===void 0?void 0:n.join("")} +`,l=new C.MarkdownString().appendCodeblock("empty",h),t=`Provider: ${r.provider._debugDisplayName}`}if(!i&&!o(r)){this.clearContents();return}if(this.domNode.classList.remove("no-docs","no-type"),t){const h=t.length>1e5?`${t.substr(0,1e5)}\u2026`:t;this._type.textContent=h,this._type.title=h,M.show(this._type),this._type.classList.toggle("auto-wrap",!/\r?\n^\s+/gmi.test(h))}else M.clearNode(this._type),this._type.title="",M.hide(this._type),this.domNode.classList.add("no-type");if(M.clearNode(this._docs),typeof l=="string")this._docs.classList.remove("markdown-docs"),this._docs.textContent=l;else if(l){this._docs.classList.add("markdown-docs"),M.clearNode(this._docs);const h=this._markdownRenderer.render(l);this._docs.appendChild(h.element),this._renderDisposeable.add(h),this._renderDisposeable.add(this._markdownRenderer.onDidRenderAsync(()=>{this.layout(this._size.width,this._type.clientHeight+this._docs.clientHeight),this._onDidChangeContents.fire(this)}))}this.domNode.style.userSelect="text",this.domNode.tabIndex=-1,this._close.onmousedown=h=>{h.preventDefault(),h.stopPropagation()},this._close.onclick=h=>{h.preventDefault(),h.stopPropagation(),this._onDidClose.fire()},this._body.scrollTop=0,this.layout(this._size.width,this._type.clientHeight+this._docs.clientHeight),this._onDidChangeContents.fire(this)}clearContents(){this.domNode.classList.add("no-docs"),this._type.textContent="",this._docs.textContent=""}get size(){return this._size}layout(r,i){const n=new M.Dimension(r,i);M.Dimension.equals(n,this._size)||(this._size=n,M.size(this.domNode,r,i)),this._scrollbar.scanDomNode()}scrollDown(r=8){this._body.scrollTop+=r}scrollUp(r=8){this._body.scrollTop-=r}scrollTop(){this._body.scrollTop=0}scrollBottom(){this._body.scrollTop=this._body.scrollHeight}pageDown(){this.scrollDown(80)}pageUp(){this.scrollUp(80)}set borderWidth(r){this._borderWidth=r}get borderWidth(){return this._borderWidth}};s=Me([_e(1,c.IInstantiationService)],s),e.SuggestDetailsWidget=s;class a{constructor(r,i){this.widget=r,this._editor=i,this._disposables=new N.DisposableStore,this._added=!1,this._resizable=new p.ResizableHTMLElement,this._resizable.domNode.classList.add("suggest-details-container"),this._resizable.domNode.appendChild(r.domNode),this._resizable.enableSashes(!1,!0,!0,!1);let n,t,l=0,h=0;this._disposables.add(this._resizable.onDidWillResize(()=>{n=this._topLeft,t=this._resizable.size})),this._disposables.add(this._resizable.onDidResize(m=>{if(n&&t){this.widget.layout(m.dimension.width,m.dimension.height);let _=!1;m.west&&(h=t.width-m.dimension.width,_=!0),m.north&&(l=t.height-m.dimension.height,_=!0),_&&this._applyTopLeft({top:n.top+l,left:n.left+h})}m.done&&(n=void 0,t=void 0,l=0,h=0,this._userSize=m.dimension)})),this._disposables.add(this.widget.onDidChangeContents(()=>{var m;this._anchorBox&&this._placeAtAnchor(this._anchorBox,(m=this._userSize)!==null&&m!==void 0?m:this.widget.size)}))}dispose(){this._disposables.dispose(),this.hide()}getId(){return"suggest.details"}getDomNode(){return this._resizable.domNode}getPosition(){return null}show(){this._added||(this._editor.addOverlayWidget(this),this.getDomNode().style.position="fixed",this._added=!0)}hide(r=!1){this._added&&(this._editor.removeOverlayWidget(this),this._added=!1,this._anchorBox=void 0,this._topLeft=void 0),r&&(this._userSize=void 0,this.widget.clearContents())}placeAtAnchor(r){var i;const n=M.getDomNodePagePosition(r);this._anchorBox=n,this._placeAtAnchor(this._anchorBox,(i=this._userSize)!==null&&i!==void 0?i:this.widget.size)}_placeAtAnchor(r,i){const n=M.getClientArea(document.body),t=this.widget.getLayoutInfo();let l,h,m=new M.Dimension(220,2*t.lineHeight),_=0,f=r.top,v=r.top+r.height-t.borderHeight,y,L,I=n.width-(r.left+r.width+t.borderWidth+t.horizontalPadding);_=-t.borderWidth+r.left+r.width,L=!0,l=new M.Dimension(I,n.height-r.top-t.borderHeight-t.verticalPadding),h=l.with(void 0,r.top+r.height-t.borderHeight-t.verticalPadding),i.width>I&&(r.left>I&&(I=r.left-t.borderWidth-t.horizontalPadding,L=!1,_=Math.max(t.horizontalPadding,r.left-i.width-t.borderWidth),l=l.with(I),h=l.with(void 0,h.height)),r.width>I*1.3&&n.height-(r.top+r.height)>r.height&&(I=r.width,_=r.left,f=-t.borderWidth+r.top+r.height,l=new M.Dimension(r.width-t.borderHeight,n.height-r.top-r.height-t.verticalPadding),h=l.with(void 0,r.top-t.verticalPadding),m=m.with(l.width)));let k=i.height,E=Math.max(l.height,h.height);k>E&&(k=E);let T;k<=l.height?(y=!0,T=l):(y=!1,T=h),this._applyTopLeft({left:_,top:y?f:v-k}),this.getDomNode().style.position="fixed",this._resizable.enableSashes(!y,L,y,!L),this._resizable.minSize=m,this._resizable.maxSize=T,this._resizable.layout(k,Math.min(T.width,i.width)),this.widget.layout(this._resizable.size.width,this._resizable.size.height)}_applyTopLeft(r){this._topLeft=r,this.getDomNode().style.left=`${this._topLeft.left}px`,this.getDomNode().style.top=`${this._topLeft.top}px`}}e.SuggestDetailsOverlay=a}),define(Q[59],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IEditorProgressService=e.Progress=void 0;class N{constructor(w){this.callback=w}report(w){this._value=w,this.callback(this._value)}}e.Progress=N,N.None=Object.freeze({report(){}}),e.IEditorProgressService=b.createDecorator("editorProgressService")}),define(Q[561],J([0,1,23,2,15]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PickerQuickAccessProvider=e.TriggerAction=void 0;var w;(function(g){g[g.NO_ACTION=0]="NO_ACTION",g[g.CLOSE_PICKER=1]="CLOSE_PICKER",g[g.REFRESH_PICKER=2]="REFRESH_PICKER",g[g.REMOVE_ITEM=3]="REMOVE_ITEM"})(w=e.TriggerAction||(e.TriggerAction={}));function S(g){const p=g;return Array.isArray(p.items)}function C(g){const p=g;return!!p.picks&&p.additionalPicks instanceof Promise}class d extends N.Disposable{constructor(p,c){super();this.prefix=p,this.options=c}provide(p,c){var o;const s=new N.DisposableStore;p.canAcceptInBackground=!!((o=this.options)===null||o===void 0?void 0:o.canAcceptInBackground),p.matchOnLabel=p.matchOnDescription=p.matchOnDetail=p.sortByLabel=!1;let a;const u=s.add(new N.MutableDisposable),r=()=>Ie(this,void 0,void 0,function*(){const i=u.value=new N.DisposableStore;a==null||a.dispose(!0),p.busy=!1,a=new b.CancellationTokenSource(c);const n=a.token,t=p.value.substr(this.prefix.length).trim(),l=this.getPicks(t,i,n),h=(m,_)=>{var f;let v,y;if(S(m)?(v=m.items,y=m.active):v=m,v.length===0){if(_)return!1;t.length>0&&((f=this.options)===null||f===void 0?void 0:f.noResultsPick)&&(v=[this.options.noResultsPick])}return p.items=v,y&&(p.activeItems=[y]),!0};if(l!==null)if(C(l)){let m=!1,_=!1;yield Promise.all([(()=>Ie(this,void 0,void 0,function*(){yield M.timeout(d.FAST_PICKS_RACE_DELAY),!n.isCancellationRequested&&(_||(m=h(l.picks,!0)))}))(),(()=>Ie(this,void 0,void 0,function*(){p.busy=!0;try{const f=yield l.additionalPicks;if(n.isCancellationRequested)return;let v,y;S(l.picks)?(v=l.picks.items,y=l.picks.active):v=l.picks;let L,I;if(S(f)?(L=f.items,I=f.active):L=f,L.length>0||!m){let k;if(!y&&!I){const E=p.activeItems[0];E&&v.indexOf(E)!==-1&&(k=E)}h({items:[...v,...L],active:y||I||k})}}finally{n.isCancellationRequested||(p.busy=!1),_=!0}}))()])}else if(!(l instanceof Promise))h(l);else{p.busy=!0;try{const m=yield l;if(n.isCancellationRequested)return;h(m)}finally{n.isCancellationRequested||(p.busy=!1)}}});return s.add(p.onDidChangeValue(()=>r())),r(),s.add(p.onDidAccept(i=>{const[n]=p.selectedItems;typeof(n==null?void 0:n.accept)=="function"&&(i.inBackground||p.hide(),n.accept(p.keyMods,i))})),s.add(p.onDidTriggerItemButton(({button:i,item:n})=>Ie(this,void 0,void 0,function*(){var t,l;if(typeof n.trigger=="function"){const h=(l=(t=n.buttons)===null||t===void 0?void 0:t.indexOf(i))!==null&&l!==void 0?l:-1;if(h>=0){const m=n.trigger(h,p.keyMods),_=typeof m=="number"?m:yield m;if(c.isCancellationRequested)return;switch(_){case w.NO_ACTION:break;case w.CLOSE_PICKER:p.hide();break;case w.REFRESH_PICKER:r();break;case w.REMOVE_ITEM:const f=p.items.indexOf(n);if(f!==-1){const v=p.items.slice();v.splice(f,1),p.items=v}break}}}}))),s}}e.PickerQuickAccessProvider=d,d.FAST_PICKS_RACE_DELAY=200});var mt=this&&this.__createBinding||(Object.create?function(q,e,b,N){N===void 0&&(N=b),Object.defineProperty(q,N,{enumerable:!0,get:function(){return e[b]}})}:function(q,e,b,N){N===void 0&&(N=b),q[N]=e[b]}),pt=this&&this.__exportStar||function(q,e){for(var b in q)b!=="default"&&!Object.prototype.hasOwnProperty.call(e,b)&&mt(e,q,b)};define(Q[78],J([0,1,9,202]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IQuickInputService=void 0,pt(N,e),e.IQuickInputService=b.createDecorator("quickInputService")}),define(Q[33],J([0,1,20,195]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Registry=void 0;class M{constructor(){this.data=new Map}add(S,C){N.ok(b.isString(S)),N.ok(b.isObject(C)),N.ok(!this.data.has(S),"There is already an extension with this id"),this.data.set(S,C)}as(S){return this.data.get(S)||null}}e.Registry=new M}),define(Q[141],J([0,1,458,6,18,41,33]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PLAINTEXT_LANGUAGE_IDENTIFIER=e.PLAINTEXT_EXTENSION=e.PLAINTEXT_MODE_ID=e.ModesRegistry=e.EditorModesRegistry=e.Extensions=void 0,e.Extensions={ModesRegistry:"editor.modesRegistry"};class C{constructor(){this._onDidChangeLanguages=new N.Emitter,this.onDidChangeLanguages=this._onDidChangeLanguages.event,this._languages=[],this._dynamicLanguages=[]}registerLanguage(g){return this._languages.push(g),this._onDidChangeLanguages.fire(void 0),{dispose:()=>{for(let p=0,c=this._languages.length;p"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],folding:{offSide:!0}},0)}),define(Q[562],J([0,1,43,44,141,237]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.cssEscape=e.detectModeId=e.getIconClasses=void 0;function S(g,p,c,o){const s=o===w.FileKind.ROOT_FOLDER?["rootfolder-icon"]:o===w.FileKind.FOLDER?["folder-icon"]:["file-icon"];if(c){let a;if(c.scheme===b.Schemas.data?a=N.DataUri.parseMetaData(c).get(N.DataUri.META_DATA_LABEL):a=d(N.basenameOrAuthority(c).toLowerCase()),o===w.FileKind.FOLDER)s.push(`${a}-name-folder-icon`);else{if(a){if(s.push(`${a}-name-file-icon`),a.length<=255){const r=a.split(".");for(let i=1;i0&&C.charAt(C.length-1)==="#"?C.substring(0,C.length-1):C}class w{constructor(){this._onDidChangeSchema=new N.Emitter,this.schemasById={}}registerSchema(d,g){this.schemasById[M(d)]=g,this._onDidChangeSchema.fire(d)}notifySchemaChanged(d){this._onDidChangeSchema.fire(d)}}const S=new w;b.Registry.add(e.Extensions.JSONContribution,S)}),define(Q[95],J([0,1,519,6,33,20,185]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.validateProperty=e.getDefaultValue=e.overrideIdentifierFromKey=e.OVERRIDE_PROPERTY_PATTERN=e.resourceLanguageSettingsSchemaId=e.resourceSettings=e.windowSettings=e.machineOverridableSettings=e.machineSettings=e.applicationSettings=e.allSettings=e.Extensions=void 0,e.Extensions={Configuration:"base.contributions.configuration"},e.allSettings={properties:{},patternProperties:{}},e.applicationSettings={properties:{},patternProperties:{}},e.machineSettings={properties:{},patternProperties:{}},e.machineOverridableSettings={properties:{},patternProperties:{}},e.windowSettings={properties:{},patternProperties:{}},e.resourceSettings={properties:{},patternProperties:{}},e.resourceLanguageSettingsSchemaId="vscode://schemas/settings/resourceLanguage";const C=M.Registry.as(S.Extensions.JSONContribution);class d{constructor(){this.overrideIdentifiers=new Set,this._onDidSchemaChange=new N.Emitter,this._onDidUpdateConfiguration=new N.Emitter,this.defaultValues={},this.defaultLanguageConfigurationOverridesNode={id:"defaultOverrides",title:b.localize(0,null),properties:{}},this.configurationContributors=[this.defaultLanguageConfigurationOverridesNode],this.resourceLanguageSettingsSchema={properties:{},patternProperties:{},additionalProperties:!1,errorMessage:"Unknown editor configuration setting",allowTrailingCommas:!0,allowComments:!0},this.configurationProperties={},this.excludedConfigurationProperties={},C.registerSchema(e.resourceLanguageSettingsSchemaId,this.resourceLanguageSettingsSchema)}registerConfiguration(u,r=!0){this.registerConfigurations([u],r)}registerConfigurations(u,r=!0){const i=[];u.forEach(n=>{i.push(...this.validateAndRegisterProperties(n,r)),this.configurationContributors.push(n),this.registerJSONConfiguration(n)}),C.registerSchema(e.resourceLanguageSettingsSchemaId,this.resourceLanguageSettingsSchema),this._onDidSchemaChange.fire(),this._onDidUpdateConfiguration.fire(i)}registerOverrideIdentifiers(u){for(const r of u)this.overrideIdentifiers.add(r);this.updateOverridePropertyPatternKey()}validateAndRegisterProperties(u,r=!0,i=3){i=w.isUndefinedOrNull(u.scope)?i:u.scope;let n=[],t=u.properties;if(t)for(let h in t){if(r&&s(h)){delete t[h];continue}const m=t[h];if(this.updatePropertyDefaultValue(h,m),e.OVERRIDE_PROPERTY_PATTERN.test(h)?m.scope=void 0:m.scope=w.isUndefinedOrNull(m.scope)?i:m.scope,t[h].hasOwnProperty("included")&&!t[h].included){this.excludedConfigurationProperties[h]=t[h],delete t[h];continue}else this.configurationProperties[h]=t[h];!t[h].deprecationMessage&&t[h].markdownDeprecationMessage&&(t[h].deprecationMessage=t[h].markdownDeprecationMessage),n.push(h)}let l=u.allOf;if(l)for(let h of l)n.push(...this.validateAndRegisterProperties(h,r,i));return n}getConfigurationProperties(){return this.configurationProperties}registerJSONConfiguration(u){const r=i=>{let n=i.properties;if(n)for(const l in n)this.updateSchema(l,n[l]);let t=i.allOf;t&&t.forEach(r)};r(u)}updateSchema(u,r){switch(e.allSettings.properties[u]=r,r.scope){case 1:e.applicationSettings.properties[u]=r;break;case 2:e.machineSettings.properties[u]=r;break;case 6:e.machineOverridableSettings.properties[u]=r;break;case 3:e.windowSettings.properties[u]=r;break;case 4:e.resourceSettings.properties[u]=r;break;case 5:e.resourceSettings.properties[u]=r,this.resourceLanguageSettingsSchema.properties[u]=r;break}}updateOverridePropertyPatternKey(){for(const u of this.overrideIdentifiers.values()){const r=`[${u}]`,i={type:"object",description:b.localize(1,null),errorMessage:b.localize(2,null),$ref:e.resourceLanguageSettingsSchemaId};this.updatePropertyDefaultValue(r,i),e.allSettings.properties[r]=i,e.applicationSettings.properties[r]=i,e.machineSettings.properties[r]=i,e.machineOverridableSettings.properties[r]=i,e.windowSettings.properties[r]=i,e.resourceSettings.properties[r]=i}this._onDidSchemaChange.fire()}updatePropertyDefaultValue(u,r){let i=this.defaultValues[u];w.isUndefined(i)&&(i=r.default),w.isUndefined(i)&&(i=c(r.type)),r.default=i}}const g="\\[.*\\]$";e.OVERRIDE_PROPERTY_PATTERN=new RegExp(g);function p(a){return a.substring(1,a.length-1)}e.overrideIdentifierFromKey=p;function c(a){switch(Array.isArray(a)?a[0]:a){case"boolean":return!1;case"integer":case"number":return 0;case"string":return"";case"array":return[];case"object":return{};default:return null}}e.getDefaultValue=c;const o=new d;M.Registry.add(e.Extensions.Configuration,o);function s(a){return a.trim()?e.OVERRIDE_PROPERTY_PATTERN.test(a)?b.localize(4,null,a):o.getConfigurationProperties()[a]!==void 0?b.localize(5,null,a):null:b.localize(3,null)}e.validateProperty=s}),define(Q[186],J([0,1,453,6,2,40,19,38,126,163,95,33,196]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isDiffEditorConfigurationKey=e.isEditorConfigurationKey=e.editorConfigurationBaseNode=e.CommonEditorConfiguration=e.ComputedEditorOptions=e.TabFocus=void 0,e.TabFocus=new class{constructor(){this._tabFocus=!1,this._onDidChangeTabFocus=new N.Emitter,this.onDidChangeTabFocus=this._onDidChangeTabFocus.event}getTabFocusMode(){return this._tabFocus}setTabFocusMode(L){this._tabFocus!==L&&(this._tabFocus=L,this._onDidChangeTabFocus.fire(this._tabFocus))}};const s=Object.hasOwnProperty;class a{constructor(){this._values=[]}_read(I){return this._values[I]}get(I){return this._values[I]}_write(I,k){this._values[I]=k}}e.ComputedEditorOptions=a;class u{constructor(){this._values=[]}_read(I){return this._values[I]}_write(I,k){this._values[I]=k}}class r{static readOptions(I){const k=I,E=new u;for(const T of C.editorOptionsRegistry){const O=T.name==="_never_"?void 0:k[T.name];E._write(T.id,O)}return E}static validateOptions(I){const k=new C.ValidatedEditorOptions;for(const E of C.editorOptionsRegistry)k._write(E.id,E.validate(I._read(E.id)));return k}static computeOptions(I,k){const E=new a;for(const T of C.editorOptionsRegistry)E._write(T.id,T.compute(k,E,I._read(T.id)));return E}static _deepEquals(I,k){if(typeof I!="object"||typeof k!="object")return I===k;if(Array.isArray(I)||Array.isArray(k))return Array.isArray(I)&&Array.isArray(k)?S.equals(I,k):!1;for(let E in I)if(!r._deepEquals(I[E],k[E]))return!1;return!0}static checkEquals(I,k){const E=[];let T=!1;for(const O of C.editorOptionsRegistry){const A=!r._deepEquals(I._read(O.id),k._read(O.id));E[O.id]=A,A&&(T=!0)}return T?new C.ConfigurationChangedEvent(E):null}}function i(L){const I=L.wordWrap;I===!0?L.wordWrap="on":I===!1&&(L.wordWrap="off");const k=L.lineNumbers;k===!0?L.lineNumbers="on":k===!1&&(L.lineNumbers="off"),L.autoClosingBrackets===!1&&(L.autoClosingBrackets="never",L.autoClosingQuotes="never",L.autoSurround="never"),L.cursorBlinking==="visible"&&(L.cursorBlinking="solid");const O=L.renderWhitespace;O===!0?L.renderWhitespace="boundary":O===!1&&(L.renderWhitespace="none");const A=L.renderLineHighlight;A===!0?L.renderLineHighlight="line":A===!1&&(L.renderLineHighlight="none");const B=L.acceptSuggestionOnEnter;B===!0?L.acceptSuggestionOnEnter="on":B===!1&&(L.acceptSuggestionOnEnter="off");const F=L.tabCompletion;F===!1?L.tabCompletion="off":F===!0&&(L.tabCompletion="onlySnippets");const D=L.suggest;if(D&&typeof D.filteredTypes=="object"&&D.filteredTypes){const Y={};Y.method="showMethods",Y.function="showFunctions",Y.constructor="showConstructors",Y.field="showFields",Y.variable="showVariables",Y.class="showClasses",Y.struct="showStructs",Y.interface="showInterfaces",Y.module="showModules",Y.property="showProperties",Y.event="showEvents",Y.operator="showOperators",Y.unit="showUnits",Y.value="showValues",Y.constant="showConstants",Y.enum="showEnums",Y.enumMember="showEnumMembers",Y.keyword="showKeywords",Y.text="showWords",Y.color="showColors",Y.file="showFiles",Y.reference="showReferences",Y.folder="showFolders",Y.typeParameter="showTypeParameters",Y.snippet="showSnippets",o.forEach(Y,ee=>{const se=D.filteredTypes[ee.key];se===!1&&(D[ee.value]=se)})}const R=L.hover;R===!0?L.hover={enabled:!0}:R===!1&&(L.hover={enabled:!1});const W=L.parameterHints;W===!0?L.parameterHints={enabled:!0}:W===!1&&(L.parameterHints={enabled:!1});const x=L.autoIndent;x===!0?L.autoIndent="full":x===!1&&(L.autoIndent="advanced");const K=L.matchBrackets;K===!0?L.matchBrackets="always":K===!1&&(L.matchBrackets="never")}function n(L){const I=w.deepClone(L);return i(I),I}class t extends M.Disposable{constructor(I,k){super();this._onDidChange=this._register(new N.Emitter),this.onDidChange=this._onDidChange.event,this._onDidChangeFast=this._register(new N.Emitter),this.onDidChangeFast=this._onDidChangeFast.event,this.isSimpleWidget=I,this._isDominatedByLongLines=!1,this._computeOptionsMemory=new C.ComputeOptionsMemory,this._viewLineCount=1,this._lineNumbersDigitCount=1,this._rawOptions=n(k),this._readOptions=r.readOptions(this._rawOptions),this._validatedOptions=r.validateOptions(this._readOptions),this._register(d.EditorZoom.onDidChangeZoomLevel(E=>this._recomputeOptions())),this._register(e.TabFocus.onDidChangeTabFocus(E=>this._recomputeOptions()))}observeReferenceElement(I){}updatePixelRatio(){}_recomputeOptions(){const I=this.options,k=this._computeInternalOptions();if(!I)this.options=k;else{const E=r.checkEquals(I,k);if(E===null)return;this.options=k,this._onDidChangeFast.fire(E),this._onDidChange.fire(E)}}getRawOptions(){return this._rawOptions}_computeInternalOptions(){const I=this._getEnvConfiguration(),k=g.BareFontInfo.createFromValidatedSettings(this._validatedOptions,I.zoomLevel,I.pixelRatio,this.isSimpleWidget),E={memory:this._computeOptionsMemory,outerWidth:I.outerWidth,outerHeight:I.outerHeight,fontInfo:this.readConfiguration(k),extraEditorClassName:I.extraEditorClassName,isDominatedByLongLines:this._isDominatedByLongLines,viewLineCount:this._viewLineCount,lineNumbersDigitCount:this._lineNumbersDigitCount,emptySelectionClipboard:I.emptySelectionClipboard,pixelRatio:I.pixelRatio,tabFocusMode:e.TabFocus.getTabFocusMode(),accessibilitySupport:I.accessibilitySupport};return r.computeOptions(this._validatedOptions,E)}static _subsetEquals(I,k){for(const E in k)if(s.call(k,E)){const T=k[E],O=I[E];if(O===T)continue;if(Array.isArray(O)&&Array.isArray(T)){if(!S.equals(O,T))return!1;continue}if(O&&typeof O=="object"&&T&&typeof T=="object"){if(!this._subsetEquals(O,T))return!1;continue}return!1}return!0}updateOptions(I){if(typeof I!="undefined"){const k=n(I);t._subsetEquals(this._rawOptions,k)||(this._rawOptions=w.mixin(this._rawOptions,k||{}),this._readOptions=r.readOptions(this._rawOptions),this._validatedOptions=r.validateOptions(this._readOptions),this._recomputeOptions())}}setIsDominatedByLongLines(I){this._isDominatedByLongLines=I,this._recomputeOptions()}setMaxLineNumber(I){const k=t._digitCount(I);this._lineNumbersDigitCount!==k&&(this._lineNumbersDigitCount=k,this._recomputeOptions())}setViewLineCount(I){this._viewLineCount!==I&&(this._viewLineCount=I,this._recomputeOptions())}static _digitCount(I){let k=0;for(;I;)I=Math.floor(I/10),k++;return k||1}}e.CommonEditorConfiguration=t,e.editorConfigurationBaseNode=Object.freeze({id:"editor",order:5,type:"object",title:b.localize(0,null),scope:5});const l=c.Registry.as(p.Extensions.Configuration),h=Object.assign(Object.assign({},e.editorConfigurationBaseNode),{properties:{"editor.tabSize":{type:"number",default:C.EDITOR_MODEL_DEFAULTS.tabSize,minimum:1,markdownDescription:b.localize(1,null)},"editor.insertSpaces":{type:"boolean",default:C.EDITOR_MODEL_DEFAULTS.insertSpaces,markdownDescription:b.localize(2,null)},"editor.detectIndentation":{type:"boolean",default:C.EDITOR_MODEL_DEFAULTS.detectIndentation,markdownDescription:b.localize(3,null)},"editor.trimAutoWhitespace":{type:"boolean",default:C.EDITOR_MODEL_DEFAULTS.trimAutoWhitespace,description:b.localize(4,null)},"editor.largeFileOptimizations":{type:"boolean",default:C.EDITOR_MODEL_DEFAULTS.largeFileOptimizations,description:b.localize(5,null)},"editor.wordBasedSuggestions":{type:"boolean",default:!0,description:b.localize(6,null)},"editor.wordBasedSuggestionsMode":{enum:["currentDocument","matchingDocuments","allDocuments"],default:"matchingDocuments",enumDescriptions:[b.localize(7,null),b.localize(8,null),b.localize(9,null)],description:b.localize(10,null)},"editor.semanticHighlighting.enabled":{enum:[!0,!1,"configuredByTheme"],enumDescriptions:[b.localize(11,null),b.localize(12,null),b.localize(13,null)],default:"configuredByTheme",description:b.localize(14,null)},"editor.stablePeek":{type:"boolean",default:!1,markdownDescription:b.localize(15,null)},"editor.maxTokenizationLineLength":{type:"integer",default:2e4,description:b.localize(16,null)},"diffEditor.maxComputationTime":{type:"number",default:5e3,description:b.localize(17,null)},"diffEditor.renderSideBySide":{type:"boolean",default:!0,description:b.localize(18,null)},"diffEditor.ignoreTrimWhitespace":{type:"boolean",default:!0,description:b.localize(19,null)},"diffEditor.renderIndicators":{type:"boolean",default:!0,description:b.localize(20,null)},"diffEditor.codeLens":{type:"boolean",default:!1,description:b.localize(21,null)},"diffEditor.wordWrap":{type:"string",enum:["off","on","inherit"],default:"inherit",markdownEnumDescriptions:[b.localize(22,null),b.localize(23,null),b.localize(24,null)]}}});function m(L){return typeof L.type!="undefined"||typeof L.anyOf!="undefined"}for(const L of C.editorOptionsRegistry){const I=L.schema;if(typeof I!="undefined")if(m(I))h.properties[`editor.${L.name}`]=I;else for(let k in I)s.call(I,k)&&(h.properties[k]=I[k])}let _=null;function f(){return _===null&&(_=Object.create(null),Object.keys(h.properties).forEach(L=>{_[L]=!0})),_}function v(L){return f()[`editor.${L}`]||!1}e.isEditorConfigurationKey=v;function y(L){return f()[`diffEditor.${L}`]||!1}e.isDiffEditorConfigurationKey=y,l.registerConfiguration(h)}),define(Q[69],J([0,1,35,6,2,17,361,212,186,38,163]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Configuration=e.clearAllFontInfos=void 0;class c{constructor(){this._keys=Object.create(null),this._values=Object.create(null)}has(r){const i=r.getId();return!!this._values[i]}get(r){const i=r.getId();return this._values[i]}put(r,i){const n=r.getId();this._keys[n]=r,this._values[n]=i}remove(r){const i=r.getId();delete this._keys[i],delete this._values[i]}getValues(){return Object.keys(this._keys).map(r=>this._values[r])}}function o(){s.INSTANCE.clearCache()}e.clearAllFontInfos=o;class s extends M.Disposable{constructor(){super();this._onDidChange=this._register(new N.Emitter),this.onDidChange=this._onDidChange.event,this._cache=new c,this._evictUntrustedReadingsTimeout=-1}dispose(){this._evictUntrustedReadingsTimeout!==-1&&(clearTimeout(this._evictUntrustedReadingsTimeout),this._evictUntrustedReadingsTimeout=-1),super.dispose()}clearCache(){this._cache=new c,this._onDidChange.fire()}_writeToCache(r,i){this._cache.put(r,i),!i.isTrusted&&this._evictUntrustedReadingsTimeout===-1&&(this._evictUntrustedReadingsTimeout=setTimeout(()=>{this._evictUntrustedReadingsTimeout=-1,this._evictUntrustedReadings()},5e3))}_evictUntrustedReadings(){const r=this._cache.getValues();let i=!1;for(const n of r)n.isTrusted||(i=!0,this._cache.remove(n));i&&this._onDidChange.fire()}readConfiguration(r){if(!this._cache.has(r)){let i=s._actualReadConfiguration(r);(i.typicalHalfwidthCharacterWidth<=2||i.typicalFullwidthCharacterWidth<=2||i.spaceWidth<=2||i.maxDigitWidth<=2)&&(i=new p.FontInfo({zoomLevel:b.getZoomLevel(),pixelRatio:b.getPixelRatio(),fontFamily:i.fontFamily,fontWeight:i.fontWeight,fontSize:i.fontSize,fontFeatureSettings:i.fontFeatureSettings,lineHeight:i.lineHeight,letterSpacing:i.letterSpacing,isMonospace:i.isMonospace,typicalHalfwidthCharacterWidth:Math.max(i.typicalHalfwidthCharacterWidth,5),typicalFullwidthCharacterWidth:Math.max(i.typicalFullwidthCharacterWidth,5),canUseHalfwidthRightwardsArrow:i.canUseHalfwidthRightwardsArrow,spaceWidth:Math.max(i.spaceWidth,5),middotWidth:Math.max(i.middotWidth,5),wsmiddotWidth:Math.max(i.wsmiddotWidth,5),maxDigitWidth:Math.max(i.maxDigitWidth,5)},!1)),this._writeToCache(r,i)}return this._cache.get(r)}static createRequest(r,i,n,t){const l=new S.CharWidthRequest(r,i);return n.push(l),t&&t.push(l),l}static _actualReadConfiguration(r){const i=[],n=[],t=this.createRequest("n",0,i,n),l=this.createRequest("\uFF4D",0,i,null),h=this.createRequest(" ",0,i,n),m=this.createRequest("0",0,i,n),_=this.createRequest("1",0,i,n),f=this.createRequest("2",0,i,n),v=this.createRequest("3",0,i,n),y=this.createRequest("4",0,i,n),L=this.createRequest("5",0,i,n),I=this.createRequest("6",0,i,n),k=this.createRequest("7",0,i,n),E=this.createRequest("8",0,i,n),T=this.createRequest("9",0,i,n),O=this.createRequest("\u2192",0,i,n),A=this.createRequest("\uFFEB",0,i,null),B=this.createRequest("\xB7",0,i,n),F=this.createRequest(String.fromCharCode(11825),0,i,null);this.createRequest("|",0,i,n),this.createRequest("/",0,i,n),this.createRequest("-",0,i,n),this.createRequest("_",0,i,n),this.createRequest("i",0,i,n),this.createRequest("l",0,i,n),this.createRequest("m",0,i,n),this.createRequest("|",1,i,n),this.createRequest("_",1,i,n),this.createRequest("i",1,i,n),this.createRequest("l",1,i,n),this.createRequest("m",1,i,n),this.createRequest("n",1,i,n),this.createRequest("|",2,i,n),this.createRequest("_",2,i,n),this.createRequest("i",2,i,n),this.createRequest("l",2,i,n),this.createRequest("m",2,i,n),this.createRequest("n",2,i,n),S.readCharWidths(r,i);const D=Math.max(m.width,_.width,f.width,v.width,y.width,L.width,I.width,k.width,E.width,T.width);let R=r.fontFeatureSettings===g.EditorFontLigatures.OFF;const W=n[0].width;for(let Y=1,ee=n.length;R&&Y.001){R=!1;break}}let x=!0;R&&A.width!==W&&(x=!1),A.width>O.width&&(x=!1);const K=b.getTimeSinceLastZoomLevelChanged()>2e3;return new p.FontInfo({zoomLevel:b.getZoomLevel(),pixelRatio:b.getPixelRatio(),fontFamily:r.fontFamily,fontWeight:r.fontWeight,fontSize:r.fontSize,fontFeatureSettings:r.fontFeatureSettings,lineHeight:r.lineHeight,letterSpacing:r.letterSpacing,isMonospace:R,typicalHalfwidthCharacterWidth:t.width,typicalFullwidthCharacterWidth:l.width,canUseHalfwidthRightwardsArrow:x,spaceWidth:h.width,middotWidth:B.width,wsmiddotWidth:F.width,maxDigitWidth:D},K)}}s.INSTANCE=new s;class a extends d.CommonEditorConfiguration{constructor(r,i,n=null,t){super(r,i);this.accessibilityService=t,this._elementSizeObserver=this._register(new C.ElementSizeObserver(n,i.dimension,()=>this._recomputeOptions())),this._register(s.INSTANCE.onDidChange(()=>this._recomputeOptions())),this._validatedOptions.get(9)&&this._elementSizeObserver.startObserving(),this._register(b.onDidChangeZoomLevel(l=>this._recomputeOptions())),this._register(this.accessibilityService.onDidChangeScreenReaderOptimized(()=>this._recomputeOptions())),this._recomputeOptions()}static applyFontInfoSlow(r,i){r.style.fontFamily=i.getMassagedFontFamily(),r.style.fontWeight=i.fontWeight,r.style.fontSize=i.fontSize+"px",r.style.fontFeatureSettings=i.fontFeatureSettings,r.style.lineHeight=i.lineHeight+"px",r.style.letterSpacing=i.letterSpacing+"px"}static applyFontInfo(r,i){r.setFontFamily(i.getMassagedFontFamily()),r.setFontWeight(i.fontWeight),r.setFontSize(i.fontSize),r.setFontFeatureSettings(i.fontFeatureSettings),r.setLineHeight(i.lineHeight),r.setLetterSpacing(i.letterSpacing)}observeReferenceElement(r){this._elementSizeObserver.observe(r)}updatePixelRatio(){this._recomputeOptions()}static _getExtraEditorClassName(){let r="";return!b.isSafari&&!b.isWebkitWebView&&(r+="no-user-select "),b.isSafari&&(r+="no-minimap-shadow "),w.isMacintosh&&(r+="mac "),r}_getEnvConfiguration(){return{extraEditorClassName:a._getExtraEditorClassName(),outerWidth:this._elementSizeObserver.getWidth(),outerHeight:this._elementSizeObserver.getHeight(),emptySelectionClipboard:b.isWebKit||b.isFirefox,pixelRatio:b.getPixelRatio(),zoomLevel:b.getZoomLevel(),accessibilitySupport:this.accessibilityService.isScreenReaderOptimized()?2:this.accessibilityService.getAccessibilitySupport()}}readConfiguration(r){return s.INSTANCE.readConfiguration(r)}}e.Configuration=a}),define(Q[563],J([0,1,93,8,69,63]),function(q,e,b,N,M,w){"use strict";var S;Object.defineProperty(e,"__esModule",{value:!0}),e.DOMLineBreaksComputerFactory=void 0;const C=(S=window.trustedTypes)===null||S===void 0?void 0:S.createPolicy("domLineBreaksComputer",{createHTML:a=>a});class d{static create(){return new d}constructor(){}createLineBreaksComputer(u,r,i,n){r=r|0,i=+i;let t=[];return{addRequest:(l,h)=>{t.push(l)},finalize:()=>g(t,u,r,i,n)}}}e.DOMLineBreaksComputerFactory=d;function g(a,u,r,i,n){var t;if(i===-1){const A=[];for(let B=0,F=a.length;Bl?(F=0,D=0):R=l-K}const W=B.substr(F),x=p(W,D,r,R,m);_[A]=F,f[A]=D,v[A]=W,y[A]=x[0],L[A]=x[1]}const I=m.build(),k=(t=C==null?void 0:C.createHTML(I))!==null&&t!==void 0?t:I;h.innerHTML=k,h.style.position="absolute",h.style.top="10000",h.style.wordWrap="break-word",document.body.appendChild(h);let E=document.createRange();const T=Array.prototype.slice.call(h.children,0);let O=[];for(let A=0;A');const t=a.length;let l=u,h=0,m=[],_=[],f=0");for(let v=0;v"),m[v]=h,_[v]=l;const y=f;f=v+1"),m[a.length]=h,_[a.length]=l,n.appendASCIIString(""),[m,_]}function c(a,u,r,i){if(r.length<=1)return null;const n=Array.prototype.slice.call(u.children,0),t=[];try{o(a,n,i,0,null,r.length-1,null,t)}catch(l){return console.log(l),null}return t.length===0?null:(t.push(r.length),t)}function o(a,u,r,i,n,t,l,h){if(i!==t&&(n=n||s(a,u,r[i],r[i+1]),l=l||s(a,u,r[t],r[t+1]),!(Math.abs(n[0].top-l[0].top)<=.1))){if(i+1===t){h.push(t);return}const m=i+(t-i)/2|0,_=s(a,u,r[m],r[m+1]);o(a,u,r,i,n,m,_,h),o(a,u,r,m,_,t,l,h)}}function s(a,u,r,i){return a.setStart(u[r/16384|0].firstChild,r%16384),a.setEnd(u[i/16384|0].firstChild,i%16384),a.getClientRects()}}),define(Q[564],J([0,1,30,69,165,45]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarginViewOverlays=e.ContentViewOverlays=e.ViewOverlayLine=e.ViewOverlays=void 0;class S extends w.ViewPart{constructor(c){super(c);this._visibleLines=new M.VisibleLinesCollection(this),this.domNode=this._visibleLines.domNode,this._dynamicOverlays=[],this._isFocused=!1,this.domNode.setClassName("view-overlays")}shouldRender(){if(super.shouldRender())return!0;for(let c=0,o=this._dynamicOverlays.length;cs.shouldRender());for(let s=0,a=o.length;s'),a.appendASCIIString(u),a.appendASCIIString(""),!0)}layoutLine(c,o){this._domNode&&(this._domNode.setTop(o),this._domNode.setHeight(this._lineHeight))}}e.ViewOverlayLine=C;class d extends S{constructor(c){super(c);const s=this._context.configuration.options.get(124);this._contentWidth=s.contentWidth,this.domNode.setHeight(0)}onConfigurationChanged(c){const s=this._context.configuration.options.get(124);return this._contentWidth=s.contentWidth,super.onConfigurationChanged(c)||!0}onScrollChanged(c){return super.onScrollChanged(c)||c.scrollWidthChanged}_viewOverlaysRender(c){super._viewOverlaysRender(c),this.domNode.setWidth(Math.max(c.scrollWidth,this._contentWidth))}}e.ContentViewOverlays=d;class g extends S{constructor(c){super(c);const o=this._context.configuration.options,s=o.get(124);this._contentLeft=s.contentLeft,this.domNode.setClassName("margin-view-overlays"),this.domNode.setWidth(1),N.Configuration.applyFontInfo(this.domNode,o.get(38))}onConfigurationChanged(c){const o=this._context.configuration.options;N.Configuration.applyFontInfo(this.domNode,o.get(38));const s=o.get(124);return this._contentLeft=s.contentLeft,super.onConfigurationChanged(c)||!0}onScrollChanged(c){return super.onScrollChanged(c)||c.scrollHeightChanged}_viewOverlaysRender(c){super._viewOverlaysRender(c);const o=Math.min(c.scrollHeight,1e6);this.domNode.setHeight(o),this.domNode.setWidth(this._contentLeft)}}e.MarginViewOverlays=g}),define(Q[565],J([0,1,7,30,8,69,38,14,3,124]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewCursor=void 0;class p{constructor(s,a,u,r,i,n){this.top=s,this.left=a,this.width=u,this.height=r,this.textContent=i,this.textContentClassName=n}}class c{constructor(s){this._context=s;const a=this._context.configuration.options,u=a.get(38);this._cursorStyle=a.get(21),this._lineHeight=a.get(53),this._typicalHalfwidthCharacterWidth=u.typicalHalfwidthCharacterWidth,this._lineCursorWidth=Math.min(a.get(24),this._typicalHalfwidthCharacterWidth),this._isVisible=!0,this._domNode=N.createFastDomNode(document.createElement("div")),this._domNode.setClassName(`cursor ${g.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),this._domNode.setHeight(this._lineHeight),this._domNode.setTop(0),this._domNode.setLeft(0),w.Configuration.applyFontInfo(this._domNode,u),this._domNode.setDisplay("none"),this._position=new C.Position(1,1),this._lastRenderedContent="",this._renderData=null}getDomNode(){return this._domNode}getPosition(){return this._position}show(){this._isVisible||(this._domNode.setVisibility("inherit"),this._isVisible=!0)}hide(){this._isVisible&&(this._domNode.setVisibility("hidden"),this._isVisible=!1)}onConfigurationChanged(s){const a=this._context.configuration.options,u=a.get(38);return this._cursorStyle=a.get(21),this._lineHeight=a.get(53),this._typicalHalfwidthCharacterWidth=u.typicalHalfwidthCharacterWidth,this._lineCursorWidth=Math.min(a.get(24),this._typicalHalfwidthCharacterWidth),w.Configuration.applyFontInfo(this._domNode,u),!0}onCursorPositionChanged(s){return this._position=s,!0}_prepareRender(s){let a="";if(this._cursorStyle===S.TextEditorCursorStyle.Line||this._cursorStyle===S.TextEditorCursorStyle.LineThin){const f=s.visibleRangeForPosition(this._position);if(!f||f.outsideRenderedLine)return null;let v;if(this._cursorStyle===S.TextEditorCursorStyle.Line){if(v=b.computeScreenAwareSize(this._lineCursorWidth>0?this._lineCursorWidth:2),v>2){const I=this._context.model.getLineContent(this._position.lineNumber),k=M.nextCharLength(I,this._position.column-1);a=I.substr(this._position.column-1,k)}}else v=b.computeScreenAwareSize(1);let y=f.left;v>=2&&y>=1&&(y-=1);const L=s.getVerticalOffsetForLineNumber(this._position.lineNumber)-s.bigNumbersDelta;return new p(L,y,v,this._lineHeight,a,"")}const u=this._context.model.getLineContent(this._position.lineNumber),r=M.nextCharLength(u,this._position.column-1),i=s.linesVisibleRangesForRange(new d.Range(this._position.lineNumber,this._position.column,this._position.lineNumber,this._position.column+r),!1);if(!i||i.length===0)return null;const n=i[0];if(n.outsideRenderedLine||n.ranges.length===0)return null;const t=n.ranges[0],l=t.width<1?this._typicalHalfwidthCharacterWidth:t.width;let h="";if(this._cursorStyle===S.TextEditorCursorStyle.Block){const f=this._context.model.getViewLineData(this._position.lineNumber);a=u.substr(this._position.column-1,r);const v=f.tokens.findTokenIndexAtOffset(this._position.column-1);h=f.tokens.getClassName(v)}let m=s.getVerticalOffsetForLineNumber(this._position.lineNumber)-s.bigNumbersDelta,_=this._lineHeight;return(this._cursorStyle===S.TextEditorCursorStyle.Underline||this._cursorStyle===S.TextEditorCursorStyle.UnderlineThin)&&(m+=this._lineHeight-2,_=2),new p(m,t.left,l,_,a,h)}prepareRender(s){this._renderData=this._prepareRender(s)}render(s){return this._renderData?(this._lastRenderedContent!==this._renderData.textContent&&(this._lastRenderedContent=this._renderData.textContent,this._domNode.domNode.textContent=this._lastRenderedContent),this._domNode.setClassName(`cursor ${g.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ${this._renderData.textContentClassName}`),this._domNode.setDisplay("block"),this._domNode.setTop(this._renderData.top),this._domNode.setLeft(this._renderData.left),this._domNode.setWidth(this._renderData.width),this._domNode.setLineHeight(this._renderData.height),this._domNode.setHeight(this._renderData.height),{domNode:this._domNode.domNode,position:this._position,contentLeft:this._renderData.left,height:this._renderData.height,width:2}):(this._domNode.setDisplay("none"),null)}}e.ViewCursor=c}),define(Q[566],J([0,1,12,6,2,291,8,18,141,76,95,33]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LanguagesRegistry=void 0;const o=Object.prototype.hasOwnProperty;class s extends M.Disposable{constructor(u=!0,r=!1){super();this._onDidChange=this._register(new N.Emitter),this.onDidChange=this._onDidChange.event,this._warnOnOverwrite=r,this._nextLanguageId2=1,this._languageIdToLanguage=[],this._languageToLanguageId=Object.create(null),this._languages={},this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},u&&(this._initializeFromRegistry(),this._register(d.ModesRegistry.onDidChangeLanguages(i=>this._initializeFromRegistry())))}_initializeFromRegistry(){this._languages={},this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={};const u=d.ModesRegistry.getLanguages();this._registerLanguages(u)}_registerLanguages(u){for(const r of u)this._registerLanguage(r);this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},Object.keys(this._languages).forEach(r=>{let i=this._languages[r];i.name&&(this._nameMap[i.name]=i.identifier),i.aliases.forEach(n=>{this._lowercaseNameMap[n.toLowerCase()]=i.identifier}),i.mimetypes.forEach(n=>{this._mimeTypesMap[n]=i.identifier})}),c.Registry.as(p.Extensions.Configuration).registerOverrideIdentifiers(d.ModesRegistry.getLanguages().map(r=>r.id)),this._onDidChange.fire()}_getLanguageId(u){if(this._languageToLanguageId[u])return this._languageToLanguageId[u];const r=this._nextLanguageId2++;return this._languageIdToLanguage[r]=u,this._languageToLanguageId[u]=r,r}_registerLanguage(u){const r=u.id;let i;if(o.call(this._languages,r))i=this._languages[r];else{const n=this._getLanguageId(r);i={identifier:new C.LanguageIdentifier(r,n),name:null,mimetypes:[],aliases:[],extensions:[],filenames:[],configurationFiles:[]},this._languages[r]=i}this._mergeLanguage(i,u)}_mergeLanguage(u,r){const i=r.id;let n=null;if(Array.isArray(r.mimetypes)&&r.mimetypes.length>0&&(u.mimetypes.push(...r.mimetypes),n=r.mimetypes[0]),n||(n=`text/x-${i}`,u.mimetypes.push(n)),Array.isArray(r.extensions)){r.configuration?u.extensions=r.extensions.concat(u.extensions):u.extensions=u.extensions.concat(r.extensions);for(let h of r.extensions)w.registerTextMime({id:i,mime:n,extension:h},this._warnOnOverwrite)}if(Array.isArray(r.filenames))for(let h of r.filenames)w.registerTextMime({id:i,mime:n,filename:h},this._warnOnOverwrite),u.filenames.push(h);if(Array.isArray(r.filenamePatterns))for(let h of r.filenamePatterns)w.registerTextMime({id:i,mime:n,filepattern:h},this._warnOnOverwrite);if(typeof r.firstLine=="string"&&r.firstLine.length>0){let h=r.firstLine;h.charAt(0)!=="^"&&(h="^"+h);try{let m=new RegExp(h);S.regExpLeadsToEndlessLoop(m)||w.registerTextMime({id:i,mime:n,firstline:m},this._warnOnOverwrite)}catch(m){b.onUnexpectedError(m)}}u.aliases.push(i);let t=null;if(typeof r.aliases!="undefined"&&Array.isArray(r.aliases)&&(r.aliases.length===0?t=[null]:t=r.aliases),t!==null)for(const h of t)!h||h.length===0||u.aliases.push(h);let l=t!==null&&t.length>0;if(!(l&&t[0]===null)){let h=(l?t[0]:null)||i;(l||!u.name)&&(u.name=h)}r.configuration&&u.configurationFiles.push(r.configuration)}isRegisteredMode(u){return o.call(this._mimeTypesMap,u)?!0:o.call(this._languages,u)}getModeIdForLanguageNameLowercase(u){return o.call(this._lowercaseNameMap,u)?this._lowercaseNameMap[u].language:null}extractModeIds(u){return u?u.split(",").map(r=>r.trim()).map(r=>o.call(this._mimeTypesMap,r)?this._mimeTypesMap[r].language:r).filter(r=>o.call(this._languages,r)):[]}getLanguageIdentifier(u){if(u===g.NULL_MODE_ID||u===0)return g.NULL_LANGUAGE_IDENTIFIER;let r;if(typeof u=="string")r=u;else if(r=this._languageIdToLanguage[u],!r)return null;return o.call(this._languages,r)?this._languages[r].identifier:null}getModeIdsFromFilepathOrFirstLine(u,r){if(!u&&!r)return[];let i=w.guessMimeTypes(u,r);return this.extractModeIds(i.join(","))}}e.LanguagesRegistry=s}),define(Q[567],J([0,1,6,2,373,76,566,19]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ModeServiceImpl=void 0;class d extends N.Disposable{constructor(c,o){super();this._onDidChange=this._register(new b.Emitter),this.onDidChange=this._onDidChange.event,this._selector=o,this.languageIdentifier=this._selector(),this._register(c(()=>this._evaluate()))}_evaluate(){let c=this._selector();c.id!==this.languageIdentifier.id&&(this.languageIdentifier=c,this._onDidChange.fire(this.languageIdentifier))}}class g extends N.Disposable{constructor(c=!1){super();this._onDidCreateMode=this._register(new b.Emitter),this.onDidCreateMode=this._onDidCreateMode.event,this._onLanguagesMaybeChanged=this._register(new b.Emitter),this.onLanguagesMaybeChanged=this._onLanguagesMaybeChanged.event,this._instantiatedModes={},this._registry=this._register(new S.LanguagesRegistry(!0,c)),this._register(this._registry.onDidChange(()=>this._onLanguagesMaybeChanged.fire()))}isRegisteredMode(c){return this._registry.isRegisteredMode(c)}getModeIdForLanguageName(c){return this._registry.getModeIdForLanguageNameLowercase(c)}getModeIdByFilepathOrFirstLine(c,o){const s=this._registry.getModeIdsFromFilepathOrFirstLine(c,o);return C.firstOrDefault(s,null)}getModeId(c){const o=this._registry.extractModeIds(c);return C.firstOrDefault(o,null)}getLanguageIdentifier(c){return this._registry.getLanguageIdentifier(c)}create(c){return new d(this.onLanguagesMaybeChanged,()=>{const o=this.getModeId(c);return this._createModeAndGetLanguageIdentifier(o)})}createByFilepathOrFirstLine(c,o){return new d(this.onLanguagesMaybeChanged,()=>{const s=this.getModeIdByFilepathOrFirstLine(c,o);return this._createModeAndGetLanguageIdentifier(s)})}_createModeAndGetLanguageIdentifier(c){const o=this.getLanguageIdentifier(c||"plaintext")||w.NULL_LANGUAGE_IDENTIFIER;return this._getOrCreateMode(o.language),o}triggerMode(c){const o=this.getModeId(c);this._getOrCreateMode(o||"plaintext")}_getOrCreateMode(c){if(!this._instantiatedModes.hasOwnProperty(c)){let o=this.getLanguageIdentifier(c)||w.NULL_LANGUAGE_IDENTIFIER;this._instantiatedModes[c]=new M.FrankensteinMode(o),this._onDidCreateMode.fire(this._instantiatedModes[c])}return this._instantiatedModes[c]}}e.ModeServiceImpl=g}),define(Q[46],J([0,1,33,9,95]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getDefaultValues=e.getConfigurationKeys=e.getConfigurationValue=e.removeFromValueTree=e.addToValueTree=e.toValuesTree=e.IConfigurationService=void 0,e.IConfigurationService=N.createDecorator("configurationService");function w(o,s){const a=Object.create(null);for(let u in o)S(a,u,o[u],s);return a}e.toValuesTree=w;function S(o,s,a,u){const r=s.split("."),i=r.pop();let n=o;for(let t=0;tconsole.error(`Conflict in default settings: ${r}`))}return o}e.getDefaultValues=c}),define(Q[568],J([0,1,2,65,6,16,46]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibilityService=void 0;let C=class extends b.Disposable{constructor(g,p){super();this._contextKeyService=g,this._configurationService=p,this._accessibilitySupport=0,this._onDidChangeScreenReaderOptimized=new M.Emitter,this._accessibilityModeEnabledContext=N.CONTEXT_ACCESSIBILITY_MODE_ENABLED.bindTo(this._contextKeyService);const c=()=>this._accessibilityModeEnabledContext.set(this.isScreenReaderOptimized());this._register(this._configurationService.onDidChangeConfiguration(o=>{o.affectsConfiguration("editor.accessibilitySupport")&&(c(),this._onDidChangeScreenReaderOptimized.fire())})),c(),this.onDidChangeScreenReaderOptimized(()=>c())}get onDidChangeScreenReaderOptimized(){return this._onDidChangeScreenReaderOptimized.event}isScreenReaderOptimized(){const g=this._configurationService.getValue("editor.accessibilitySupport");return g==="on"||g==="auto"&&this._accessibilitySupport===2}getAccessibilitySupport(){return this._accessibilitySupport}};C=Me([_e(0,w.IContextKeyService),_e(1,S.IConfigurationService)],C),e.AccessibilityService=C}),define(Q[569],J([0,1,51,19,20,40,24,95,46]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ConfigurationChangeEvent=e.Configuration=e.DefaultConfigurationModel=e.ConfigurationModel=void 0;class g{constructor(a={},u=[],r=[]){this._contents=a,this._keys=u,this._overrides=r,this.isFrozen=!1}get contents(){return this.checkAndFreeze(this._contents)}get overrides(){return this.checkAndFreeze(this._overrides)}get keys(){return this.checkAndFreeze(this._keys)}isEmpty(){return this._keys.length===0&&Object.keys(this._contents).length===0&&this._overrides.length===0}getValue(a){return a?d.getConfigurationValue(this.contents,a):this.contents}override(a){const u=this.getContentsForOverrideIdentifer(a);if(!u||typeof u!="object"||!Object.keys(u).length)return this;let r={};for(const i of N.distinct([...Object.keys(this.contents),...Object.keys(u)])){let n=this.contents[i],t=u[i];t&&(typeof n=="object"&&typeof t=="object"?(n=w.deepClone(n),this.mergeContents(n,t)):n=t),r[i]=n}return new g(r,this.keys,this.overrides)}merge(...a){const u=w.deepClone(this.contents),r=w.deepClone(this.overrides),i=[...this.keys];for(const n of a){this.mergeContents(u,n.contents);for(const t of n.overrides){const[l]=r.filter(h=>N.equals(h.identifiers,t.identifiers));l?this.mergeContents(l.contents,t.contents):r.push(w.deepClone(t))}for(const t of n.keys)i.indexOf(t)===-1&&i.push(t)}return new g(u,i,r)}freeze(){return this.isFrozen=!0,this}mergeContents(a,u){for(const r of Object.keys(u)){if(r in a&&M.isObject(a[r])&&M.isObject(u[r])){this.mergeContents(a[r],u[r]);continue}a[r]=w.deepClone(u[r])}}checkAndFreeze(a){return this.isFrozen&&!Object.isFrozen(a)?w.deepFreeze(a):a}getContentsForOverrideIdentifer(a){for(const u of this.overrides)if(u.identifiers.indexOf(a)!==-1)return u.contents;return null}toJSON(){return{contents:this.contents,overrides:this.overrides,keys:this.keys}}setValue(a,u){this.addKey(a),d.addToValueTree(this.contents,a,u,r=>{throw new Error(r)})}removeValue(a){this.removeKey(a)&&d.removeFromValueTree(this.contents,a)}addKey(a){let u=this.keys.length;for(let r=0;rconsole.error(`Conflict in default settings file: ${n}`))});super(a,u,r)}}e.DefaultConfigurationModel=p;class c{constructor(a,u,r=new g,i=new g,n=new b.ResourceMap,t=new g,l=new b.ResourceMap,h=!0){this._defaultConfiguration=a,this._localUserConfiguration=u,this._remoteUserConfiguration=r,this._workspaceConfiguration=i,this._folderConfigurations=n,this._memoryConfiguration=t,this._memoryConfigurationByResource=l,this._freeze=h,this._workspaceConsolidatedConfiguration=null,this._foldersConsolidatedConfigurations=new b.ResourceMap,this._userConfiguration=null}getValue(a,u,r){return this.getConsolidateConfigurationModel(u,r).getValue(a)}updateValue(a,u,r={}){let i;r.resource?(i=this._memoryConfigurationByResource.get(r.resource),i||(i=new g,this._memoryConfigurationByResource.set(r.resource,i))):i=this._memoryConfiguration,u===void 0?i.removeValue(a):i.setValue(a,u),r.resource||(this._workspaceConsolidatedConfiguration=null)}get userConfiguration(){return this._userConfiguration||(this._userConfiguration=this._remoteUserConfiguration.isEmpty()?this._localUserConfiguration:this._localUserConfiguration.merge(this._remoteUserConfiguration),this._freeze&&this._userConfiguration.freeze()),this._userConfiguration}getConsolidateConfigurationModel(a,u){let r=this.getConsolidatedConfigurationModelForResource(a,u);return a.overrideIdentifier?r.override(a.overrideIdentifier):r}getConsolidatedConfigurationModelForResource({resource:a},u){let r=this.getWorkspaceConsolidatedConfiguration();if(u&&a){const i=u.getFolder(a);i&&(r=this.getFolderConsolidatedConfiguration(i.uri)||r);const n=this._memoryConfigurationByResource.get(a);n&&(r=r.merge(n))}return r}getWorkspaceConsolidatedConfiguration(){return this._workspaceConsolidatedConfiguration||(this._workspaceConsolidatedConfiguration=this._defaultConfiguration.merge(this.userConfiguration,this._workspaceConfiguration,this._memoryConfiguration),this._freeze&&(this._workspaceConfiguration=this._workspaceConfiguration.freeze())),this._workspaceConsolidatedConfiguration}getFolderConsolidatedConfiguration(a){let u=this._foldersConsolidatedConfigurations.get(a);if(!u){const r=this.getWorkspaceConsolidatedConfiguration(),i=this._folderConfigurations.get(a);i?(u=r.merge(i),this._freeze&&(u=u.freeze()),this._foldersConsolidatedConfigurations.set(a,u)):u=r}return u}toData(){return{defaults:{contents:this._defaultConfiguration.contents,overrides:this._defaultConfiguration.overrides,keys:this._defaultConfiguration.keys},user:{contents:this.userConfiguration.contents,overrides:this.userConfiguration.overrides,keys:this.userConfiguration.keys},workspace:{contents:this._workspaceConfiguration.contents,overrides:this._workspaceConfiguration.overrides,keys:this._workspaceConfiguration.keys},folders:[...this._folderConfigurations.keys()].reduce((a,u)=>{const{contents:r,overrides:i,keys:n}=this._folderConfigurations.get(u);return a.push([u,{contents:r,overrides:i,keys:n}]),a},[])}}static parse(a){const u=this.parseConfigurationModel(a.defaults),r=this.parseConfigurationModel(a.user),i=this.parseConfigurationModel(a.workspace),n=a.folders.reduce((t,l)=>(t.set(S.URI.revive(l[0]),this.parseConfigurationModel(l[1])),t),new b.ResourceMap);return new c(u,r,new g,i,n,new g,new b.ResourceMap,!1)}static parseConfigurationModel(a){return new g(a.contents,a.keys,a.overrides).freeze()}}e.Configuration=c;class o{constructor(a,u,r,i){this.change=a,this.previous=u,this.currentConfiguraiton=r,this.currentWorkspace=i,this._previousConfiguration=void 0;const n=new Set;a.keys.forEach(l=>n.add(l)),a.overrides.forEach(([,l])=>l.forEach(h=>n.add(h))),this.affectedKeys=[...n.values()];const t=new g;this.affectedKeys.forEach(l=>t.setValue(l,{})),this.affectedKeysTree=t.contents}get previousConfiguration(){return!this._previousConfiguration&&this.previous&&(this._previousConfiguration=c.parse(this.previous.data)),this._previousConfiguration}affectsConfiguration(a,u){var r;if(this.doesAffectedKeysTreeContains(this.affectedKeysTree,a)){if(u){const i=this.previousConfiguration?this.previousConfiguration.getValue(a,u,(r=this.previous)===null||r===void 0?void 0:r.workspace):void 0,n=this.currentConfiguraiton.getValue(a,u,this.currentWorkspace);return!w.equals(i,n)}return!0}return!1}doesAffectedKeysTreeContains(a,u){let r=d.toValuesTree({[u]:!0},()=>{}),i;for(;typeof r=="object"&&(i=Object.keys(r)[0]);){if(a=a[i],!a)return!1;r=r[i]}return!0}}e.ConfigurationChangeEvent=o}),define(Q[570],J([0,1,6,54,2,51,520,26,46,16,251]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextKeyService=e.AbstractContextKeyService=e.Context=void 0;const c="data-keybinding-context";class o{constructor(f,v){this._id=f,this._parent=v,this._value=Object.create(null),this._value._contextId=f}setValue(f,v){return this._value[f]!==v?(this._value[f]=v,!0):!1}removeValue(f){return f in this._value?(delete this._value[f],!0):!1}getValue(f){const v=this._value[f];return typeof v=="undefined"&&this._parent?this._parent.getValue(f):v}}e.Context=o;class s extends o{constructor(){super(-1,null)}setValue(f,v){return!1}removeValue(f){return!1}getValue(f){}}s.INSTANCE=new s;class a extends o{constructor(f,v,y){super(f,null);this._configurationService=v,this._values=w.TernarySearchTree.forConfigKeys(),this._listener=this._configurationService.onDidChangeConfiguration(L=>{if(L.source===6){const I=Array.from(N.Iterable.map(this._values,([k])=>k));this._values.clear(),y.fire(new i(I))}else{const I=[];for(const k of L.affectedKeys){const E=`config.${k}`,T=this._values.findSuperstr(E);T!==void 0&&(I.push(...N.Iterable.map(T,([O])=>O)),this._values.deleteSuperstr(E)),this._values.has(E)&&(I.push(E),this._values.delete(E))}y.fire(new i(I))}})}dispose(){this._listener.dispose()}getValue(f){if(f.indexOf(a._keyPrefix)!==0)return super.getValue(f);if(this._values.has(f))return this._values.get(f);const v=f.substr(a._keyPrefix.length),y=this._configurationService.getValue(v);let L;switch(typeof y){case"number":case"boolean":case"string":L=y;break;default:Array.isArray(y)?L=JSON.stringify(y):L=y}return this._values.set(f,L),L}setValue(f,v){return super.setValue(f,v)}removeValue(f){return super.removeValue(f)}}a._keyPrefix="config.";class u{constructor(f,v,y){this._service=f,this._key=v,this._defaultValue=y,this.reset()}set(f){this._service.setContext(this._key,f)}reset(){typeof this._defaultValue=="undefined"?this._service.removeContext(this._key):this._service.setContext(this._key,this._defaultValue)}get(){return this._service.getContextKeyValue(this._key)}}class r{constructor(f){this.key=f}affectsSome(f){return f.has(this.key)}}class i{constructor(f){this.keys=f}affectsSome(f){for(const v of this.keys)if(f.has(v))return!0;return!1}}class n{constructor(f){this.events=f}affectsSome(f){for(const v of this.events)if(v.affectsSome(f))return!0;return!1}}class t{constructor(f){this._onDidChangeContext=new b.PauseableEmitter({merge:v=>new n(v)}),this.onDidChangeContext=this._onDidChangeContext.event,this._isDisposed=!1,this._myContextId=f}createKey(f,v){if(this._isDisposed)throw new Error("AbstractContextKeyService has been disposed");return new u(this,f,v)}bufferChangeEvents(f){this._onDidChangeContext.pause();try{f()}finally{this._onDidChangeContext.resume()}}createScoped(f){if(this._isDisposed)throw new Error("AbstractContextKeyService has been disposed");return new h(this,f)}contextMatchesRules(f){if(this._isDisposed)throw new Error("AbstractContextKeyService has been disposed");const v=this.getContextValuesContainer(this._myContextId);return p.KeybindingResolver.contextMatchesRules(v,f)}getContextKeyValue(f){if(!this._isDisposed)return this.getContextValuesContainer(this._myContextId).getValue(f)}setContext(f,v){if(!this._isDisposed){const y=this.getContextValuesContainer(this._myContextId);!y||y.setValue(f,v)&&this._onDidChangeContext.fire(new r(f))}}removeContext(f){this._isDisposed||this.getContextValuesContainer(this._myContextId).removeValue(f)&&this._onDidChangeContext.fire(new r(f))}getContext(f){return this._isDisposed?s.INSTANCE:this.getContextValuesContainer(m(f))}}e.AbstractContextKeyService=t;let l=class extends t{constructor(f){super(0);this._contexts=new Map,this._toDispose=new M.DisposableStore,this._lastContextId=0;const v=new a(this._myContextId,f,this._onDidChangeContext);this._contexts.set(this._myContextId,v),this._toDispose.add(v)}dispose(){this._onDidChangeContext.dispose(),this._isDisposed=!0,this._toDispose.dispose()}getContextValuesContainer(f){return this._isDisposed?s.INSTANCE:this._contexts.get(f)||s.INSTANCE}createChildContext(f=this._myContextId){if(this._isDisposed)throw new Error("ContextKeyService has been disposed");let v=++this._lastContextId;return this._contexts.set(v,new o(v,this.getContextValuesContainer(f))),v}disposeContext(f){this._isDisposed||this._contexts.delete(f)}};l=Me([_e(0,d.IConfigurationService)],l),e.ContextKeyService=l;class h extends t{constructor(f,v){super(f.createChildContext());if(this._parentChangeListener=new M.MutableDisposable,this._parent=f,this._updateParentChangeListener(),this._domNode=v,this._domNode.hasAttribute(c)){let y="";this._domNode.classList&&(y=Array.from(this._domNode.classList.values()).join(", ")),console.error(`Element already has context attribute${y?": "+y:""}`)}this._domNode.setAttribute(c,String(this._myContextId))}_updateParentChangeListener(){this._parentChangeListener.value=this._parent.onDidChangeContext(this._onDidChangeContext.fire,this._onDidChangeContext)}dispose(){this._isDisposed||(this._onDidChangeContext.dispose(),this._parent.disposeContext(this._myContextId),this._parentChangeListener.dispose(),this._domNode.removeAttribute(c),this._isDisposed=!0)}getContextValuesContainer(f){return this._isDisposed?s.INSTANCE:this._parent.getContextValuesContainer(f)}createChildContext(f=this._myContextId){if(this._isDisposed)throw new Error("ScopedContextKeyService has been disposed");return this._parent.createChildContext(f)}disposeContext(f){this._isDisposed||this._parent.disposeContext(f)}}function m(_){for(;_;){if(_.hasAttribute(c)){const f=_.getAttribute(c);return f?parseInt(f,10):NaN}_=_.parentElement}return 0}C.CommandsRegistry.registerCommand(g.SET_CONTEXT_COMMAND_ID,function(_,f,v){_.get(g.IContextKeyService).createKey(String(f),v)}),C.CommandsRegistry.registerCommand({id:"getContextKeyInfo",handler(){return[...g.RawContextKey.all()].sort((_,f)=>_.key.localeCompare(f.key))},description:{description:S.localize(0,null),args:[]}}),C.CommandsRegistry.registerCommand("_generateContextKeyInfo",function(){const _=[],f=new Set;for(let v of g.RawContextKey.all())f.has(v.key)||(f.add(v.key),_.push(v));_.sort((v,y)=>v.key.localeCompare(y.key)),console.log(JSON.stringify(_,void 0,2))})}),define(Q[86],J([0,1,39,17,26,33]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Extensions=e.KeybindingsRegistry=void 0;class S{constructor(){this._coreKeybindings=[],this._extensionKeybindings=[],this._cachedMergedKeybindings=null}static bindToCurrentPlatform(g){if(N.OS===1){if(g&&g.win)return g.win}else if(N.OS===2){if(g&&g.mac)return g.mac}else if(g&&g.linux)return g.linux;return g}registerKeybindingRule(g){const p=S.bindToCurrentPlatform(g);if(p&&p.primary){const c=b.createKeybinding(p.primary,N.OS);c&&this._registerDefaultKeybinding(c,g.id,g.args,g.weight,0,g.when)}if(p&&Array.isArray(p.secondary))for(let c=0,o=p.secondary.length;c=21&&g<=30||g>=31&&g<=56?!0:g===80||g===81||g===82||g===83||g===84||g===85||g===86||g===110||g===111||g===87||g===88||g===89||g===90||g===91||g===92}_assertNoCtrlAlt(g,p){g.ctrlKey&&g.altKey&&!g.metaKey&&S._mightProduceChar(g.keyCode)&&console.warn("Ctrl+Alt+ keybindings should not be used by default under Windows. Offender: ",g," for ",p)}_registerDefaultKeybinding(g,p,c,o,s,a){N.OS===1&&this._assertNoCtrlAlt(g.parts[0],p),this._coreKeybindings.push({keybinding:g,command:p,commandArgs:c,when:a,weight1:o,weight2:s,extensionId:null,isBuiltinExtension:!1}),this._cachedMergedKeybindings=null}getDefaultKeybindings(){return this._cachedMergedKeybindings||(this._cachedMergedKeybindings=[].concat(this._coreKeybindings).concat(this._extensionKeybindings),this._cachedMergedKeybindings.sort(C)),this._cachedMergedKeybindings.slice(0)}}e.KeybindingsRegistry=new S,e.Extensions={EditorModes:"platform.keybindingsRegistry"},w.Registry.add(e.Extensions.EditorModes,e.KeybindingsRegistry);function C(d,g){return d.weight1!==g.weight1?d.weight1-g.weight1:d.commandg.command?1:d.weight2-g.weight2}}),define(Q[571],J([0,1,16,432,86,433]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextScopedReplaceInput=e.ContextScopedFindInput=e.createAndBindHistoryNavigationWidgetScopedContextKeyService=e.HistoryNavigationEnablementContext=e.HistoryNavigationWidgetContext=void 0,e.HistoryNavigationWidgetContext="historyNavigationWidget",e.HistoryNavigationEnablementContext="historyNavigationEnabled";function S(o,s,a){new b.RawContextKey(a,s).bindTo(o)}function C(o,s){return o.createScoped(s.target)}function d(o,s){return o.getContext(document.activeElement).getValue(s)}function g(o,s){const a=C(o,s);S(a,s,e.HistoryNavigationWidgetContext);const u=new b.RawContextKey(e.HistoryNavigationEnablementContext,!0).bindTo(a);return{scopedContextKeyService:a,historyNavigationEnablement:u}}e.createAndBindHistoryNavigationWidgetScopedContextKeyService=g;let p=class extends N.FindInput{constructor(s,a,u,r,i=!1){super(s,a,i,u);this._register(g(r,{target:this.inputBox.element,historyNavigator:this.inputBox}).scopedContextKeyService)}};p=Me([_e(3,b.IContextKeyService)],p),e.ContextScopedFindInput=p;let c=class extends w.ReplaceInput{constructor(s,a,u,r,i=!1){super(s,a,i,u);this._register(g(r,{target:this.inputBox.element,historyNavigator:this.inputBox}).scopedContextKeyService)}};c=Me([_e(3,b.IContextKeyService)],c),e.ContextScopedReplaceInput=c,M.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"history.showPrevious",weight:200,when:b.ContextKeyExpr.and(b.ContextKeyExpr.has(e.HistoryNavigationWidgetContext),b.ContextKeyExpr.equals(e.HistoryNavigationEnablementContext,!0)),primary:16,secondary:[512|16],handler:(o,s)=>{const a=d(o.get(b.IContextKeyService),e.HistoryNavigationWidgetContext);a&&a.historyNavigator.showPreviousValue()}}),M.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"history.showNext",weight:200,when:b.ContextKeyExpr.and(b.ContextKeyExpr.has(e.HistoryNavigationWidgetContext),b.ContextKeyExpr.equals(e.HistoryNavigationEnablementContext,!0)),primary:18,secondary:[512|18],handler:(o,s)=>{const a=d(o.get(b.IContextKeyService),e.HistoryNavigationWidgetContext);a&&a.historyNavigator.showNextValue()}})}),define(Q[96],J([0,1,33,19,2]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickAccessRegistry=e.Extensions=e.DefaultQuickAccessFilterValue=void 0;var w;(function(C){C[C.PRESERVE=0]="PRESERVE",C[C.LAST=1]="LAST"})(w=e.DefaultQuickAccessFilterValue||(e.DefaultQuickAccessFilterValue={})),e.Extensions={Quickaccess:"workbench.contributions.quickaccess"};class S{constructor(){this.providers=[],this.defaultProvider=void 0}registerQuickAccessProvider(d){return d.prefix.length===0?this.defaultProvider=d:this.providers.push(d),this.providers.sort((g,p)=>p.prefix.length-g.prefix.length),M.toDisposable(()=>{this.providers.splice(this.providers.indexOf(d),1),this.defaultProvider===d&&(this.defaultProvider=void 0)})}getQuickAccessProviders(){return N.coalesce([this.defaultProvider,...this.providers])}getQuickAccessProvider(d){return d&&this.providers.find(p=>d.startsWith(p.prefix))||void 0||this.defaultProvider}}e.QuickAccessRegistry=S,b.Registry.add(e.Extensions.Quickaccess,new S)}),define(Q[572],J([0,1,78,96,33,526,2]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.HelpQuickAccessProvider=void 0;let C=class lt{constructor(g){this.quickInputService=g,this.registry=M.Registry.as(N.Extensions.Quickaccess)}provide(g){const p=new S.DisposableStore;p.add(g.onDidAccept(()=>{const[s]=g.selectedItems;s&&this.quickInputService.quickAccess.show(s.prefix,{preserveValue:!0})})),p.add(g.onDidChangeValue(s=>{const a=this.registry.getQuickAccessProvider(s.substr(lt.PREFIX.length));a&&a.prefix&&a.prefix!==lt.PREFIX&&this.quickInputService.quickAccess.show(a.prefix,{preserveValue:!0})}));const{editorProviders:c,globalProviders:o}=this.getQuickAccessProviders();return g.items=c.length===0||o.length===0?[...c.length===0?o:c]:[{label:w.localize(0,null),type:"separator"},...o,{label:w.localize(1,null),type:"separator"},...c],p}getQuickAccessProviders(){const g=[],p=[];for(const c of this.registry.getQuickAccessProviders().sort((o,s)=>o.prefix.localeCompare(s.prefix)))if(c.prefix!==lt.PREFIX)for(const o of c.helpEntries){const s=o.prefix||c.prefix,a=s||"\u2026";(o.needsEditor?p:g).push({prefix:s,label:a,ariaLabel:w.localize(2,null,a,o.description),description:o.description})}return{editorProviders:p,globalProviders:g}}};C.PREFIX="?",C=Me([_e(0,b.IQuickInputService)],C),e.HelpQuickAccessProvider=C}),define(Q[573],J([0,1,33,96,64,572]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),b.Registry.as(N.Extensions.Quickaccess).registerQuickAccessProvider({ctor:w.HelpQuickAccessProvider,prefix:"",helpEntries:[{description:M.QuickHelpNLS.helpQuickAccessActionLabel,needsEditor:!0}]})}),define(Q[574],J([0,1,78,2,96,33,23,9,88]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickAccessController=void 0;let g=class extends N.Disposable{constructor(c,o){super();this.quickInputService=c,this.instantiationService=o,this.registry=w.Registry.as(M.Extensions.Quickaccess),this.mapProviderToDescriptor=new Map,this.lastAcceptedPickerValues=new Map,this.visibleQuickAccess=void 0}show(c="",o){var s;const[a,u]=this.getOrInstantiateProvider(c),r=this.visibleQuickAccess,i=r==null?void 0:r.descriptor;if(r&&u&&i===u){c!==u.prefix&&!(o==null?void 0:o.preserveValue)&&(r.picker.value=c),this.adjustValueSelection(r.picker,u,o);return}if(u&&!(o==null?void 0:o.preserveValue)){let h;if(r&&i&&i!==u){const m=r.value.substr(i.prefix.length);m&&(h=`${u.prefix}${m}`)}if(!h){const m=a==null?void 0:a.defaultFilterValue;m===M.DefaultQuickAccessFilterValue.LAST?h=this.lastAcceptedPickerValues.get(u):typeof m=="string"&&(h=`${u.prefix}${m}`)}typeof h=="string"&&(c=h)}const n=new N.DisposableStore,t=n.add(this.quickInputService.createQuickPick());t.value=c,this.adjustValueSelection(t,u,o),t.placeholder=u==null?void 0:u.placeholder,t.quickNavigate=o==null?void 0:o.quickNavigateConfiguration,t.hideInput=!!t.quickNavigate&&!r,(typeof(o==null?void 0:o.itemActivation)=="number"||(o==null?void 0:o.quickNavigateConfiguration))&&(t.itemActivation=(s=o==null?void 0:o.itemActivation)!==null&&s!==void 0?s:b.ItemActivation.SECOND),t.contextKey=u==null?void 0:u.contextKey,t.filterValue=h=>h.substring(u?u.prefix.length:0),(u==null?void 0:u.placeholder)&&(t.ariaLabel=u==null?void 0:u.placeholder);const l=this.registerPickerListeners(t,a,u,c,n);a&&n.add(a.provide(t,l)),t.show()}adjustValueSelection(c,o,s){var a;let u;(s==null?void 0:s.preserveValue)?u=[c.value.length,c.value.length]:u=[(a=o==null?void 0:o.prefix.length)!==null&&a!==void 0?a:0,c.value.length],c.valueSelection=u}registerPickerListeners(c,o,s,a,u){const r=this.visibleQuickAccess={picker:c,descriptor:s,value:a};u.add(N.toDisposable(()=>{r===this.visibleQuickAccess&&(this.visibleQuickAccess=void 0)})),u.add(c.onDidChangeValue(n=>{const[t]=this.getOrInstantiateProvider(n);t!==o?this.show(n,{preserveValue:!0}):r.value=n})),s&&u.add(c.onDidAccept(()=>{this.lastAcceptedPickerValues.set(s,c.value)}));const i=u.add(new S.CancellationTokenSource);return d.once(c.onDidHide)(()=>{c.selectedItems.length===0&&i.cancel(),u.dispose()}),i.token}getOrInstantiateProvider(c){const o=this.registry.getQuickAccessProvider(c);if(!o)return[void 0,void 0];let s=this.mapProviderToDescriptor.get(o);return s||(s=this.instantiationService.createInstance(o.ctor),this.mapProviderToDescriptor.set(o,s)),[s,o]}};g=Me([_e(0,b.IQuickInputService),_e(1,C.IInstantiationService)],g),e.QuickAccessController=g}),define(Q[79],J([0,1,9,6,2,20,293]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.InMemoryStorageService=e.AbstractStorageService=e.WillSaveStateReason=e.IStorageService=void 0;const C="__$__targetStorageMarker";e.IStorageService=b.createDecorator("storageService");var d;(function(c){c[c.NONE=0]="NONE",c[c.SHUTDOWN=1]="SHUTDOWN"})(d=e.WillSaveStateReason||(e.WillSaveStateReason={}));class g extends M.Disposable{constructor(o={flushInterval:g.DEFAULT_FLUSH_INTERVAL}){super();this.options=o,this._onDidChangeValue=this._register(new N.PauseableEmitter),this._onDidChangeTarget=this._register(new N.PauseableEmitter),this._onWillSaveState=this._register(new N.Emitter),this.onWillSaveState=this._onWillSaveState.event,this._workspaceKeyTargets=void 0,this._globalKeyTargets=void 0}emitDidChangeValue(o,s){s===C?(o===0?this._globalKeyTargets=void 0:o===1&&(this._workspaceKeyTargets=void 0),this._onDidChangeTarget.fire({scope:o})):this._onDidChangeValue.fire({scope:o,key:s,target:this.getKeyTargets(o)[s]})}get(o,s,a){var u;return(u=this.getStorage(s))===null||u===void 0?void 0:u.get(o,a)}getBoolean(o,s,a){var u;return(u=this.getStorage(s))===null||u===void 0?void 0:u.getBoolean(o,a)}getNumber(o,s,a){var u;return(u=this.getStorage(s))===null||u===void 0?void 0:u.getNumber(o,a)}store(o,s,a,u){if(w.isUndefinedOrNull(s)){this.remove(o,a);return}this.withPausedEmitters(()=>{var r;this.updateKeyTarget(o,a,u),(r=this.getStorage(a))===null||r===void 0||r.set(o,s)})}remove(o,s){this.withPausedEmitters(()=>{var a;this.updateKeyTarget(o,s,void 0),(a=this.getStorage(s))===null||a===void 0||a.delete(o)})}withPausedEmitters(o){this._onDidChangeValue.pause(),this._onDidChangeTarget.pause();try{o()}finally{this._onDidChangeValue.resume(),this._onDidChangeTarget.resume()}}updateKeyTarget(o,s,a){var u,r;const i=this.getKeyTargets(s);typeof a=="number"?i[o]!==a&&(i[o]=a,(u=this.getStorage(s))===null||u===void 0||u.set(C,JSON.stringify(i))):typeof i[o]=="number"&&(delete i[o],(r=this.getStorage(s))===null||r===void 0||r.set(C,JSON.stringify(i)))}get workspaceKeyTargets(){return this._workspaceKeyTargets||(this._workspaceKeyTargets=this.loadKeyTargets(1)),this._workspaceKeyTargets}get globalKeyTargets(){return this._globalKeyTargets||(this._globalKeyTargets=this.loadKeyTargets(0)),this._globalKeyTargets}getKeyTargets(o){return o===0?this.globalKeyTargets:this.workspaceKeyTargets}loadKeyTargets(o){const s=this.get(C,o);if(s)try{return JSON.parse(s)}catch(a){}return Object.create(null)}}e.AbstractStorageService=g,g.DEFAULT_FLUSH_INTERVAL=60*1e3;class p extends g{constructor(){super();this.globalStorage=new S.Storage(new S.InMemoryStorageDatabase),this.workspaceStorage=new S.Storage(new S.InMemoryStorageDatabase),this._register(this.workspaceStorage.onDidChangeStorage(o=>this.emitDidChangeValue(1,o))),this._register(this.globalStorage.onDidChangeStorage(o=>this.emitDidChangeValue(0,o)))}getStorage(o){return o===0?this.globalStorage:this.workspaceStorage}}e.InMemoryStorageService=p}),define(Q[575],J([0,1,9,74,248,51,79,3,15,88]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeLensCache=e.ICodeLensCache=void 0,e.ICodeLensCache=b.createDecorator("ICodeLensCache");class p{constructor(s,a){this.lineCount=s,this.data=a}}let c=class{constructor(s){this._fakeProvider=new class{provideCodeLenses(){throw new Error("not supported")}},this._cache=new w.LRUCache(20,.75);const a="codelens/cache";d.runWhenIdle(()=>s.remove(a,1));const u="codelens/cache2",r=s.get(u,1,"{}");this._deserialize(r),g.once(s.onWillSaveState)(i=>{i.reason===S.WillSaveStateReason.SHUTDOWN&&s.store(u,this._serialize(),1,1)})}put(s,a){const u=a.lenses.map(n=>{var t;return{range:n.symbol.range,command:n.symbol.command&&{id:"",title:(t=n.symbol.command)===null||t===void 0?void 0:t.title}}}),r=new M.CodeLensModel;r.add({lenses:u,dispose:()=>{}},this._fakeProvider);const i=new p(s.getLineCount(),r);this._cache.set(s.uri.toString(),i)}get(s){const a=this._cache.get(s.uri.toString());return a&&a.lineCount===s.getLineCount()?a.data:void 0}delete(s){this._cache.delete(s.uri.toString())}_serialize(){const s=Object.create(null);for(const[a,u]of this._cache){const r=new Set;for(const i of u.data.lenses)r.add(i.symbol.range.startLineNumber);s[a]={lineCount:u.lineCount,lines:[...r.values()]}}return JSON.stringify(s)}_deserialize(s){try{const a=JSON.parse(s);for(const u in a){const r=a[u],i=[];for(const t of r.lines)i.push({range:new C.Range(t,1,t,11)});const n=new M.CodeLensModel;n.add({lenses:i,dispose(){}},this._fakeProvider),this._cache.set(u,new p(r.lineCount,n))}}catch(a){}}};c=Me([_e(0,S.IStorageService)],c),e.CodeLensCache=c,N.registerSingleton(e.ICodeLensCache,c)}),define(Q[576],J([0,1,51,79,18,2,15,9,46,74,57]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ISuggestMemoryService=e.SuggestMemoryService=e.PrefixMemory=e.LRUMemory=e.NoMemory=e.Memory=void 0;class c{constructor(i){this.name=i}select(i,n,t){if(t.length===0)return 0;let l=t[0].score[0];for(let h=0;hf&&L.type===t[v].completion.kind&&L.insertText===t[v].completion.insertText&&(f=L.touch,_=v),t[v].completion.preselect&&m===-1)return m=v}return _!==-1?_:m!==-1?m:0}toJSON(){return this._cache.toJSON()}fromJSON(i){this._cache.clear();let n=0;for(const[t,l]of i)l.touch=n,l.type=typeof l.type=="number"?l.type:M.completionKindFromString(l.type),this._cache.set(t,l);this._seq=this._cache.size}}e.LRUMemory=s;class a extends c{constructor(){super("recentlyUsedByPrefix");this._trie=b.TernarySearchTree.forStrings(),this._seq=0}memorize(i,n,t){const{word:l}=i.getWordUntilPosition(n),h=`${i.getLanguageIdentifier().language}/${l}`;this._trie.set(h,{type:t.completion.kind,insertText:t.completion.insertText,touch:this._seq++})}select(i,n,t){let{word:l}=i.getWordUntilPosition(n);if(!l)return super.select(i,n,t);let h=`${i.getLanguageIdentifier().language}/${l}`,m=this._trie.get(h);if(m||(m=this._trie.findSubstr(h)),m)for(let _=0;_i.push([t,n])),i.sort((n,t)=>-(n[1].touch-t[1].touch)).forEach((n,t)=>n[1].touch=t),i.slice(0,200)}fromJSON(i){if(this._trie.clear(),i.length>0){this._seq=i[0][1].touch+1;for(const[n,t]of i)t.type=typeof t.type=="number"?t.type:M.completionKindFromString(t.type),this._trie.set(n,t)}}}e.PrefixMemory=a;let u=class dt{constructor(i,n,t){this._storageService=i,this._modeService=n,this._configService=t,this._disposables=new w.DisposableStore,this._persistSoon=new S.RunOnceScheduler(()=>this._saveState(),500),this._disposables.add(i.onWillSaveState(l=>{l.reason===N.WillSaveStateReason.SHUTDOWN&&this._saveState()}))}dispose(){this._disposables.dispose(),this._persistSoon.dispose()}memorize(i,n,t){this._withStrategy(i,n).memorize(i,n,t),this._persistSoon.schedule()}select(i,n,t){return this._withStrategy(i,n).select(i,n,t)}_withStrategy(i,n){var t,l;const h=this._configService.getValue("editor.suggestSelection",{overrideIdentifier:(t=this._modeService.getLanguageIdentifier(i.getLanguageIdAtPosition(n.lineNumber,n.column)))===null||t===void 0?void 0:t.language,resource:i.uri});if(((l=this._strategy)===null||l===void 0?void 0:l.name)!==h){this._saveState();const m=dt._strategyCtors.get(h)||o;this._strategy=new m;try{const f=this._configService.getValue("editor.suggest.shareSuggestSelections")?0:1,v=this._storageService.get(`${dt._storagePrefix}/${h}`,f);v&&this._strategy.fromJSON(JSON.parse(v))}catch(_){}}return this._strategy}_saveState(){if(this._strategy){const n=this._configService.getValue("editor.suggest.shareSuggestSelections")?0:1,t=JSON.stringify(this._strategy);this._storageService.store(`${dt._storagePrefix}/${this._strategy.name}`,t,n,1)}}};u._strategyCtors=new Map([["recentlyUsedByPrefix",a],["recentlyUsed",s],["first",o]]),u._storagePrefix="suggest/memories",u=Me([_e(0,N.IStorageService),_e(1,p.IModeService),_e(2,d.IConfigurationService)],u),e.SuggestMemoryService=u,e.ISuggestMemoryService=C.createDecorator("ISuggestMemories"),g.registerSingleton(e.ISuggestMemoryService,u,!0)}),define(Q[87],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ITelemetryService=void 0,e.ITelemetryService=b.createDecorator("telemetryService")}),define(Q[577],J([0,1,525,561,2,66,20,51,79,46,9,37,26,87,12,32,437]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CommandsHistory=e.AbstractCommandsQuickAccessProvider=void 0;let i=class ut extends N.PickerQuickAccessProvider{constructor(l,h,m,_,f,v){super(ut.PREFIX,l);this.options=l,this.instantiationService=h,this.keybindingService=m,this.commandService=_,this.telemetryService=f,this.notificationService=v,this.commandsHistory=this._register(this.instantiationService.createInstance(n))}getPicks(l,h,m){return Ie(this,void 0,void 0,function*(){const _=yield this.getCommandPicks(h,m);if(m.isCancellationRequested)return[];const f=[];for(const I of _){const k=S.withNullAsUndefined(ut.WORD_FILTER(l,I.label)),E=I.commandAlias?S.withNullAsUndefined(ut.WORD_FILTER(l,I.commandAlias)):void 0;k||E?(I.highlights={label:k,detail:this.options.showAlias?E:void 0},f.push(I)):l===I.commandId&&f.push(I)}const v=new Map;for(const I of f){const k=v.get(I.label);k?(I.description=I.commandId,k.description=k.commandId):v.set(I.label,I)}f.sort((I,k)=>{const E=this.commandsHistory.peek(I.commandId),T=this.commandsHistory.peek(k.commandId);return E&&T?E>T?-1:1:E?-1:T?1:I.label.localeCompare(k.label)});const y=[];let L=!1;for(let I=0;IIe(this,void 0,void 0,function*(){this.commandsHistory.push(k.commandId),this.telemetryService.publicLog2("workbenchActionExecuted",{id:k.commandId,from:"quick open"});try{yield this.commandService.executeCommand(k.commandId)}catch(O){a.isPromiseCanceledError(O)||this.notificationService.error(b.localize(3,null,k.label,r.toErrorMessage(O)))}})}))}return y})}};i.PREFIX=">",i.WORD_FILTER=w.or(w.matchesPrefix,w.matchesWords,w.matchesContiguousSubString),i=Me([_e(1,p.IInstantiationService),_e(2,c.IKeybindingService),_e(3,o.ICommandService),_e(4,s.ITelemetryService),_e(5,u.INotificationService)],i),e.AbstractCommandsQuickAccessProvider=i;let n=class qe extends M.Disposable{constructor(l,h){super();this.storageService=l,this.configurationService=h,this.configuredCommandsHistoryLength=0,this.updateConfiguration(),this.load(),this.registerListeners()}registerListeners(){this._register(this.configurationService.onDidChangeConfiguration(()=>this.updateConfiguration()))}updateConfiguration(){this.configuredCommandsHistoryLength=qe.getConfiguredCommandHistoryLength(this.configurationService),qe.cache&&qe.cache.limit!==this.configuredCommandsHistoryLength&&(qe.cache.limit=this.configuredCommandsHistoryLength,qe.saveState(this.storageService))}load(){const l=this.storageService.get(qe.PREF_KEY_CACHE,0);let h;if(l)try{h=JSON.parse(l)}catch(_){}const m=qe.cache=new C.LRUCache(this.configuredCommandsHistoryLength,1);if(h){let _;h.usesLRU?_=h.entries:_=h.entries.sort((f,v)=>f.value-v.value),_.forEach(f=>m.set(f.key,f.value))}qe.counter=this.storageService.getNumber(qe.PREF_KEY_COUNTER,0,qe.counter)}push(l){!qe.cache||(qe.cache.set(l,qe.counter++),qe.saveState(this.storageService))}peek(l){var h;return(h=qe.cache)===null||h===void 0?void 0:h.peek(l)}static saveState(l){if(!!qe.cache){const h={usesLRU:!0,entries:[]};qe.cache.forEach((m,_)=>h.entries.push({key:_,value:m})),l.store(qe.PREF_KEY_CACHE,JSON.stringify(h),0,0),l.store(qe.PREF_KEY_COUNTER,qe.counter,0,0)}}static getConfiguredCommandHistoryLength(l){var h,m;const f=(m=(h=l.getValue().workbench)===null||h===void 0?void 0:h.commandPalette)===null||m===void 0?void 0:m.history;return typeof f=="number"?f:qe.DEFAULT_COMMANDS_HISTORY_LENGTH}};n.DEFAULT_COMMANDS_HISTORY_LENGTH=50,n.PREF_KEY_CACHE="commandPalette.mru.cache",n.PREF_KEY_COUNTER="commandPalette.mru.counter",n.counter=1,n=Me([_e(0,d.IStorageService),_e(1,g.IConfigurationService)],n),e.CommandsHistory=n}),define(Q[578],J([0,1,577,102]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEditorCommandsQuickAccessProvider=void 0;class M extends b.AbstractCommandsQuickAccessProvider{constructor(S,C,d,g,p,c){super(S,C,d,g,p,c)}getCodeEditorCommandPicks(){const S=this.activeTextEditorControl;if(!S)return[];const C=[];for(const d of S.getSupportedActions())C.push({commandId:d.id,commandAlias:d.alias,label:N.stripIcons(d.label)||d.id});return C}}e.AbstractEditorCommandsQuickAccessProvider=M}),define(Q[22],J([0,1,33,29,6,527,185,15]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.workbenchColorsSchemaId=e.resolveColorValue=e.oneOf=e.transparent=e.lighten=e.darken=e.problemsInfoIconForeground=e.problemsWarningIconForeground=e.problemsErrorIconForeground=e.minimapSliderActiveBackground=e.minimapSliderHoverBackground=e.minimapSliderBackground=e.minimapBackground=e.minimapWarning=e.minimapError=e.minimapSelection=e.minimapFindMatch=e.overviewRulerSelectionHighlightForeground=e.overviewRulerFindMatchForeground=e.snippetFinalTabstopHighlightBorder=e.snippetFinalTabstopHighlightBackground=e.snippetTabstopHighlightBorder=e.snippetTabstopHighlightBackground=e.menuSeparatorBackground=e.menuSelectionBorder=e.menuSelectionBackground=e.menuSelectionForeground=e.menuBackground=e.menuForeground=e.menuBorder=e.tableColumnsBorder=e.treeIndentGuidesStroke=e.listFilterWidgetNoMatchesOutline=e.listFilterWidgetOutline=e.listFilterWidgetBackground=e.listHighlightForeground=e.listDropBackground=e.listHoverForeground=e.listHoverBackground=e.listInactiveFocusOutline=e.listInactiveFocusBackground=e.listInactiveSelectionForeground=e.listInactiveSelectionBackground=e.listActiveSelectionForeground=e.listActiveSelectionBackground=e.listFocusOutline=e.listFocusForeground=e.listFocusBackground=e.diffDiagonalFill=e.diffBorder=e.diffRemovedOutline=e.diffInsertedOutline=e.diffRemoved=e.diffInserted=e.defaultRemoveColor=e.defaultInsertColor=e.editorLightBulbAutoFixForeground=e.editorLightBulbForeground=e.editorInlineHintBackground=e.editorInlineHintForeground=e.editorActiveLinkForeground=e.editorHoverStatusBarBackground=e.editorHoverBorder=e.editorHoverForeground=e.editorHoverBackground=e.editorHoverHighlight=e.editorFindRangeHighlightBorder=e.editorFindMatchHighlightBorder=e.editorFindMatchBorder=e.editorFindRangeHighlight=e.editorFindMatchHighlight=e.editorFindMatch=e.editorSelectionHighlightBorder=e.editorSelectionHighlight=e.editorInactiveSelection=e.editorSelectionForeground=e.editorSelectionBackground=e.pickerGroupBorder=e.pickerGroupForeground=e.quickInputListFocusBackground=e.quickInputTitleBackground=e.quickInputForeground=e.quickInputBackground=e.editorWidgetResizeBorder=e.editorWidgetBorder=e.editorWidgetForeground=e.editorWidgetBackground=e.editorForeground=e.editorBackground=e.editorHintBorder=e.editorHintForeground=e.editorInfoBorder=e.editorInfoForeground=e.editorInfoBackground=e.editorWarningBorder=e.editorWarningForeground=e.editorWarningBackground=e.editorErrorBorder=e.editorErrorForeground=e.editorErrorBackground=e.progressBarBackground=e.scrollbarSliderActiveBackground=e.scrollbarSliderHoverBackground=e.scrollbarSliderBackground=e.scrollbarShadow=e.badgeForeground=e.badgeBackground=e.buttonHoverBackground=e.buttonBackground=e.buttonForeground=e.selectForeground=e.selectBackground=e.inputValidationErrorBorder=e.inputValidationErrorForeground=e.inputValidationErrorBackground=e.inputValidationWarningBorder=e.inputValidationWarningForeground=e.inputValidationWarningBackground=e.inputValidationInfoBorder=e.inputValidationInfoForeground=e.inputValidationInfoBackground=e.inputActiveOptionForeground=e.inputActiveOptionBackground=e.inputActiveOptionBorder=e.inputBorder=e.inputForeground=e.inputBackground=e.widgetShadow=e.textCodeBlockBackground=e.textLinkForeground=e.activeContrastBorder=e.contrastBorder=e.focusBorder=e.iconForeground=e.errorForeground=e.foreground=e.registerColor=e.Extensions=void 0,e.Extensions={ColorContribution:"base.contributions.colors"};class d{constructor(){this._onDidChangeSchema=new M.Emitter,this.onDidChangeSchema=this._onDidChangeSchema.event,this.colorSchema={type:"object",properties:{}},this.colorReferenceSchema={type:"string",enum:[],enumDescriptions:[]},this.colorsById={}}registerColor(l,h,m,_=!1,f){let v={id:l,description:m,defaults:h,needsTransparency:_,deprecationMessage:f};this.colorsById[l]=v;let y={type:"string",description:m,format:"color-hex",defaultSnippets:[{body:"${1:#ff0000}"}]};return f&&(y.deprecationMessage=f),this.colorSchema.properties[l]=y,this.colorReferenceSchema.enum.push(l),this.colorReferenceSchema.enumDescriptions.push(m),this._onDidChangeSchema.fire(),l}resolveDefaultColor(l,h){const m=this.colorsById[l];if(m&&m.defaults){const _=m.defaults[h.type];return r(_,h)}}getColorSchema(){return this.colorSchema}toString(){let l=(h,m)=>{let _=h.indexOf(".")===-1?0:1,f=m.indexOf(".")===-1?0:1;return _!==f?_-f:h.localeCompare(m)};return Object.keys(this.colorsById).sort(l).map(h=>`- \`${h}\`: ${this.colorsById[h].description}`).join(` +`)}}const g=new d;b.Registry.add(e.Extensions.ColorContribution,g);function p(t,l,h,m,_){return g.registerColor(t,l,h,m,_)}e.registerColor=p,e.foreground=p("foreground",{dark:"#CCCCCC",light:"#616161",hc:"#FFFFFF"},w.localize(0,null)),e.errorForeground=p("errorForeground",{dark:"#F48771",light:"#A1260D",hc:"#F48771"},w.localize(1,null)),e.iconForeground=p("icon.foreground",{dark:"#C5C5C5",light:"#424242",hc:"#FFFFFF"},w.localize(2,null)),e.focusBorder=p("focusBorder",{dark:"#007FD4",light:"#0090F1",hc:"#F38518"},w.localize(3,null)),e.contrastBorder=p("contrastBorder",{light:null,dark:null,hc:"#6FC3DF"},w.localize(4,null)),e.activeContrastBorder=p("contrastActiveBorder",{light:null,dark:null,hc:e.focusBorder},w.localize(5,null)),e.textLinkForeground=p("textLink.foreground",{light:"#006AB1",dark:"#3794FF",hc:"#3794FF"},w.localize(6,null)),e.textCodeBlockBackground=p("textCodeBlock.background",{light:"#dcdcdc66",dark:"#0a0a0a66",hc:N.Color.black},w.localize(7,null)),e.widgetShadow=p("widget.shadow",{dark:s(N.Color.black,.36),light:s(N.Color.black,.16),hc:null},w.localize(8,null)),e.inputBackground=p("input.background",{dark:"#3C3C3C",light:N.Color.white,hc:N.Color.black},w.localize(9,null)),e.inputForeground=p("input.foreground",{dark:e.foreground,light:e.foreground,hc:e.foreground},w.localize(10,null)),e.inputBorder=p("input.border",{dark:null,light:null,hc:e.contrastBorder},w.localize(11,null)),e.inputActiveOptionBorder=p("inputOption.activeBorder",{dark:"#007ACC00",light:"#007ACC00",hc:e.contrastBorder},w.localize(12,null)),e.inputActiveOptionBackground=p("inputOption.activeBackground",{dark:s(e.focusBorder,.4),light:s(e.focusBorder,.2),hc:N.Color.transparent},w.localize(13,null)),e.inputActiveOptionForeground=p("inputOption.activeForeground",{dark:N.Color.white,light:N.Color.black,hc:null},w.localize(14,null)),e.inputValidationInfoBackground=p("inputValidation.infoBackground",{dark:"#063B49",light:"#D6ECF2",hc:N.Color.black},w.localize(15,null)),e.inputValidationInfoForeground=p("inputValidation.infoForeground",{dark:null,light:null,hc:null},w.localize(16,null)),e.inputValidationInfoBorder=p("inputValidation.infoBorder",{dark:"#007acc",light:"#007acc",hc:e.contrastBorder},w.localize(17,null)),e.inputValidationWarningBackground=p("inputValidation.warningBackground",{dark:"#352A05",light:"#F6F5D2",hc:N.Color.black},w.localize(18,null)),e.inputValidationWarningForeground=p("inputValidation.warningForeground",{dark:null,light:null,hc:null},w.localize(19,null)),e.inputValidationWarningBorder=p("inputValidation.warningBorder",{dark:"#B89500",light:"#B89500",hc:e.contrastBorder},w.localize(20,null)),e.inputValidationErrorBackground=p("inputValidation.errorBackground",{dark:"#5A1D1D",light:"#F2DEDE",hc:N.Color.black},w.localize(21,null)),e.inputValidationErrorForeground=p("inputValidation.errorForeground",{dark:null,light:null,hc:null},w.localize(22,null)),e.inputValidationErrorBorder=p("inputValidation.errorBorder",{dark:"#BE1100",light:"#BE1100",hc:e.contrastBorder},w.localize(23,null)),e.selectBackground=p("dropdown.background",{dark:"#3C3C3C",light:N.Color.white,hc:N.Color.black},w.localize(24,null)),e.selectForeground=p("dropdown.foreground",{dark:"#F0F0F0",light:null,hc:N.Color.white},w.localize(25,null)),e.buttonForeground=p("button.foreground",{dark:N.Color.white,light:N.Color.white,hc:N.Color.white},w.localize(26,null)),e.buttonBackground=p("button.background",{dark:"#0E639C",light:"#007ACC",hc:null},w.localize(27,null)),e.buttonHoverBackground=p("button.hoverBackground",{dark:o(e.buttonBackground,.2),light:c(e.buttonBackground,.2),hc:null},w.localize(28,null)),e.badgeBackground=p("badge.background",{dark:"#4D4D4D",light:"#C4C4C4",hc:N.Color.black},w.localize(29,null)),e.badgeForeground=p("badge.foreground",{dark:N.Color.white,light:"#333",hc:N.Color.white},w.localize(30,null)),e.scrollbarShadow=p("scrollbar.shadow",{dark:"#000000",light:"#DDDDDD",hc:null},w.localize(31,null)),e.scrollbarSliderBackground=p("scrollbarSlider.background",{dark:N.Color.fromHex("#797979").transparent(.4),light:N.Color.fromHex("#646464").transparent(.4),hc:s(e.contrastBorder,.6)},w.localize(32,null)),e.scrollbarSliderHoverBackground=p("scrollbarSlider.hoverBackground",{dark:N.Color.fromHex("#646464").transparent(.7),light:N.Color.fromHex("#646464").transparent(.7),hc:s(e.contrastBorder,.8)},w.localize(33,null)),e.scrollbarSliderActiveBackground=p("scrollbarSlider.activeBackground",{dark:N.Color.fromHex("#BFBFBF").transparent(.4),light:N.Color.fromHex("#000000").transparent(.6),hc:e.contrastBorder},w.localize(34,null)),e.progressBarBackground=p("progressBar.background",{dark:N.Color.fromHex("#0E70C0"),light:N.Color.fromHex("#0E70C0"),hc:e.contrastBorder},w.localize(35,null)),e.editorErrorBackground=p("editorError.background",{dark:null,light:null,hc:null},w.localize(36,null),!0),e.editorErrorForeground=p("editorError.foreground",{dark:"#F48771",light:"#E51400",hc:null},w.localize(37,null)),e.editorErrorBorder=p("editorError.border",{dark:null,light:null,hc:N.Color.fromHex("#E47777").transparent(.8)},w.localize(38,null)),e.editorWarningBackground=p("editorWarning.background",{dark:null,light:null,hc:null},w.localize(39,null),!0),e.editorWarningForeground=p("editorWarning.foreground",{dark:"#CCA700",light:"#BF8803",hc:null},w.localize(40,null)),e.editorWarningBorder=p("editorWarning.border",{dark:null,light:null,hc:N.Color.fromHex("#FFCC00").transparent(.8)},w.localize(41,null)),e.editorInfoBackground=p("editorInfo.background",{dark:null,light:null,hc:null},w.localize(42,null),!0),e.editorInfoForeground=p("editorInfo.foreground",{dark:"#75BEFF",light:"#75BEFF",hc:null},w.localize(43,null)),e.editorInfoBorder=p("editorInfo.border",{dark:null,light:null,hc:N.Color.fromHex("#75BEFF").transparent(.8)},w.localize(44,null)),e.editorHintForeground=p("editorHint.foreground",{dark:N.Color.fromHex("#eeeeee").transparent(.7),light:"#6c6c6c",hc:null},w.localize(45,null)),e.editorHintBorder=p("editorHint.border",{dark:null,light:null,hc:N.Color.fromHex("#eeeeee").transparent(.8)},w.localize(46,null)),e.editorBackground=p("editor.background",{light:"#fffffe",dark:"#1E1E1E",hc:N.Color.black},w.localize(47,null)),e.editorForeground=p("editor.foreground",{light:"#333333",dark:"#BBBBBB",hc:N.Color.white},w.localize(48,null)),e.editorWidgetBackground=p("editorWidget.background",{dark:"#252526",light:"#F3F3F3",hc:"#0C141F"},w.localize(49,null)),e.editorWidgetForeground=p("editorWidget.foreground",{dark:e.foreground,light:e.foreground,hc:e.foreground},w.localize(50,null)),e.editorWidgetBorder=p("editorWidget.border",{dark:"#454545",light:"#C8C8C8",hc:e.contrastBorder},w.localize(51,null)),e.editorWidgetResizeBorder=p("editorWidget.resizeBorder",{light:null,dark:null,hc:null},w.localize(52,null)),e.quickInputBackground=p("quickInput.background",{dark:e.editorWidgetBackground,light:e.editorWidgetBackground,hc:e.editorWidgetBackground},w.localize(53,null)),e.quickInputForeground=p("quickInput.foreground",{dark:e.editorWidgetForeground,light:e.editorWidgetForeground,hc:e.editorWidgetForeground},w.localize(54,null)),e.quickInputTitleBackground=p("quickInputTitle.background",{dark:new N.Color(new N.RGBA(255,255,255,.105)),light:new N.Color(new N.RGBA(0,0,0,.06)),hc:"#000000"},w.localize(55,null)),e.quickInputListFocusBackground=p("quickInput.list.focusBackground",{dark:"#062F4A",light:"#D6EBFF",hc:null},w.localize(56,null)),e.pickerGroupForeground=p("pickerGroup.foreground",{dark:"#3794FF",light:"#0066BF",hc:N.Color.white},w.localize(57,null)),e.pickerGroupBorder=p("pickerGroup.border",{dark:"#3F3F46",light:"#CCCEDB",hc:N.Color.white},w.localize(58,null)),e.editorSelectionBackground=p("editor.selectionBackground",{light:"#ADD6FF",dark:"#264F78",hc:"#f3f518"},w.localize(59,null)),e.editorSelectionForeground=p("editor.selectionForeground",{light:null,dark:null,hc:"#000000"},w.localize(60,null)),e.editorInactiveSelection=p("editor.inactiveSelectionBackground",{light:s(e.editorSelectionBackground,.5),dark:s(e.editorSelectionBackground,.5),hc:s(e.editorSelectionBackground,.5)},w.localize(61,null),!0),e.editorSelectionHighlight=p("editor.selectionHighlightBackground",{light:u(e.editorSelectionBackground,e.editorBackground,.3,.6),dark:u(e.editorSelectionBackground,e.editorBackground,.3,.6),hc:null},w.localize(62,null),!0),e.editorSelectionHighlightBorder=p("editor.selectionHighlightBorder",{light:null,dark:null,hc:e.activeContrastBorder},w.localize(63,null)),e.editorFindMatch=p("editor.findMatchBackground",{light:"#A8AC94",dark:"#515C6A",hc:null},w.localize(64,null)),e.editorFindMatchHighlight=p("editor.findMatchHighlightBackground",{light:"#EA5C0055",dark:"#EA5C0055",hc:null},w.localize(65,null),!0),e.editorFindRangeHighlight=p("editor.findRangeHighlightBackground",{dark:"#3a3d4166",light:"#b4b4b44d",hc:null},w.localize(66,null),!0),e.editorFindMatchBorder=p("editor.findMatchBorder",{light:null,dark:null,hc:e.activeContrastBorder},w.localize(67,null)),e.editorFindMatchHighlightBorder=p("editor.findMatchHighlightBorder",{light:null,dark:null,hc:e.activeContrastBorder},w.localize(68,null)),e.editorFindRangeHighlightBorder=p("editor.findRangeHighlightBorder",{dark:null,light:null,hc:s(e.activeContrastBorder,.4)},w.localize(69,null),!0),e.editorHoverHighlight=p("editor.hoverHighlightBackground",{light:"#ADD6FF26",dark:"#264f7840",hc:"#ADD6FF26"},w.localize(70,null),!0),e.editorHoverBackground=p("editorHoverWidget.background",{light:e.editorWidgetBackground,dark:e.editorWidgetBackground,hc:e.editorWidgetBackground},w.localize(71,null)),e.editorHoverForeground=p("editorHoverWidget.foreground",{light:e.editorWidgetForeground,dark:e.editorWidgetForeground,hc:e.editorWidgetForeground},w.localize(72,null)),e.editorHoverBorder=p("editorHoverWidget.border",{light:e.editorWidgetBorder,dark:e.editorWidgetBorder,hc:e.editorWidgetBorder},w.localize(73,null)),e.editorHoverStatusBarBackground=p("editorHoverWidget.statusBarBackground",{dark:o(e.editorHoverBackground,.2),light:c(e.editorHoverBackground,.05),hc:e.editorWidgetBackground},w.localize(74,null)),e.editorActiveLinkForeground=p("editorLink.activeForeground",{dark:"#4E94CE",light:N.Color.blue,hc:N.Color.cyan},w.localize(75,null)),e.editorInlineHintForeground=p("editorInlineHint.foreground",{dark:e.editorWidgetBackground,light:e.editorWidgetForeground,hc:e.editorWidgetBackground},w.localize(76,null)),e.editorInlineHintBackground=p("editorInlineHint.background",{dark:e.editorWidgetForeground,light:e.editorWidgetBackground,hc:e.editorWidgetForeground},w.localize(77,null)),e.editorLightBulbForeground=p("editorLightBulb.foreground",{dark:"#FFCC00",light:"#DDB100",hc:"#FFCC00"},w.localize(78,null)),e.editorLightBulbAutoFixForeground=p("editorLightBulbAutoFix.foreground",{dark:"#75BEFF",light:"#007ACC",hc:"#75BEFF"},w.localize(79,null)),e.defaultInsertColor=new N.Color(new N.RGBA(155,185,85,.2)),e.defaultRemoveColor=new N.Color(new N.RGBA(255,0,0,.2)),e.diffInserted=p("diffEditor.insertedTextBackground",{dark:e.defaultInsertColor,light:e.defaultInsertColor,hc:null},w.localize(80,null),!0),e.diffRemoved=p("diffEditor.removedTextBackground",{dark:e.defaultRemoveColor,light:e.defaultRemoveColor,hc:null},w.localize(81,null),!0),e.diffInsertedOutline=p("diffEditor.insertedTextBorder",{dark:null,light:null,hc:"#33ff2eff"},w.localize(82,null)),e.diffRemovedOutline=p("diffEditor.removedTextBorder",{dark:null,light:null,hc:"#FF008F"},w.localize(83,null)),e.diffBorder=p("diffEditor.border",{dark:null,light:null,hc:e.contrastBorder},w.localize(84,null)),e.diffDiagonalFill=p("diffEditor.diagonalFill",{dark:"#cccccc33",light:"#22222233",hc:null},w.localize(85,null)),e.listFocusBackground=p("list.focusBackground",{dark:null,light:null,hc:null},w.localize(86,null)),e.listFocusForeground=p("list.focusForeground",{dark:null,light:null,hc:null},w.localize(87,null)),e.listFocusOutline=p("list.focusOutline",{dark:e.focusBorder,light:e.focusBorder,hc:e.activeContrastBorder},w.localize(88,null)),e.listActiveSelectionBackground=p("list.activeSelectionBackground",{dark:"#094771",light:"#0060C0",hc:null},w.localize(89,null)),e.listActiveSelectionForeground=p("list.activeSelectionForeground",{dark:N.Color.white,light:N.Color.white,hc:null},w.localize(90,null)),e.listInactiveSelectionBackground=p("list.inactiveSelectionBackground",{dark:"#37373D",light:"#E4E6F1",hc:null},w.localize(91,null)),e.listInactiveSelectionForeground=p("list.inactiveSelectionForeground",{dark:null,light:null,hc:null},w.localize(92,null)),e.listInactiveFocusBackground=p("list.inactiveFocusBackground",{dark:null,light:null,hc:null},w.localize(93,null)),e.listInactiveFocusOutline=p("list.inactiveFocusOutline",{dark:null,light:null,hc:null},w.localize(94,null)),e.listHoverBackground=p("list.hoverBackground",{dark:"#2A2D2E",light:"#F0F0F0",hc:null},w.localize(95,null)),e.listHoverForeground=p("list.hoverForeground",{dark:null,light:null,hc:null},w.localize(96,null)),e.listDropBackground=p("list.dropBackground",{dark:e.listFocusBackground,light:e.listFocusBackground,hc:null},w.localize(97,null)),e.listHighlightForeground=p("list.highlightForeground",{dark:"#0097fb",light:"#0066BF",hc:e.focusBorder},w.localize(98,null)),e.listFilterWidgetBackground=p("listFilterWidget.background",{light:"#efc1ad",dark:"#653723",hc:N.Color.black},w.localize(99,null)),e.listFilterWidgetOutline=p("listFilterWidget.outline",{dark:N.Color.transparent,light:N.Color.transparent,hc:"#f38518"},w.localize(100,null)),e.listFilterWidgetNoMatchesOutline=p("listFilterWidget.noMatchesOutline",{dark:"#BE1100",light:"#BE1100",hc:e.contrastBorder},w.localize(101,null)),e.treeIndentGuidesStroke=p("tree.indentGuidesStroke",{dark:"#585858",light:"#a9a9a9",hc:"#a9a9a9"},w.localize(102,null)),e.tableColumnsBorder=p("tree.tableColumnsBorder",{dark:"#CCCCCC20",light:"#61616120",hc:null},w.localize(103,null)),e.menuBorder=p("menu.border",{dark:null,light:null,hc:e.contrastBorder},w.localize(104,null)),e.menuForeground=p("menu.foreground",{dark:e.selectForeground,light:e.foreground,hc:e.selectForeground},w.localize(105,null)),e.menuBackground=p("menu.background",{dark:e.selectBackground,light:e.selectBackground,hc:e.selectBackground},w.localize(106,null)),e.menuSelectionForeground=p("menu.selectionForeground",{dark:e.listActiveSelectionForeground,light:e.listActiveSelectionForeground,hc:e.listActiveSelectionForeground},w.localize(107,null)),e.menuSelectionBackground=p("menu.selectionBackground",{dark:e.listActiveSelectionBackground,light:e.listActiveSelectionBackground,hc:e.listActiveSelectionBackground},w.localize(108,null)),e.menuSelectionBorder=p("menu.selectionBorder",{dark:null,light:null,hc:e.activeContrastBorder},w.localize(109,null)),e.menuSeparatorBackground=p("menu.separatorBackground",{dark:"#BBBBBB",light:"#888888",hc:e.contrastBorder},w.localize(110,null)),e.snippetTabstopHighlightBackground=p("editor.snippetTabstopHighlightBackground",{dark:new N.Color(new N.RGBA(124,124,124,.3)),light:new N.Color(new N.RGBA(10,50,100,.2)),hc:new N.Color(new N.RGBA(124,124,124,.3))},w.localize(111,null)),e.snippetTabstopHighlightBorder=p("editor.snippetTabstopHighlightBorder",{dark:null,light:null,hc:null},w.localize(112,null)),e.snippetFinalTabstopHighlightBackground=p("editor.snippetFinalTabstopHighlightBackground",{dark:null,light:null,hc:null},w.localize(113,null)),e.snippetFinalTabstopHighlightBorder=p("editor.snippetFinalTabstopHighlightBorder",{dark:"#525252",light:new N.Color(new N.RGBA(10,50,100,.5)),hc:"#525252"},w.localize(114,null)),e.overviewRulerFindMatchForeground=p("editorOverviewRuler.findMatchForeground",{dark:"#d186167e",light:"#d186167e",hc:"#AB5A00"},w.localize(115,null),!0),e.overviewRulerSelectionHighlightForeground=p("editorOverviewRuler.selectionHighlightForeground",{dark:"#A0A0A0CC",light:"#A0A0A0CC",hc:"#A0A0A0CC"},w.localize(116,null),!0),e.minimapFindMatch=p("minimap.findMatchHighlight",{light:"#d18616",dark:"#d18616",hc:"#AB5A00"},w.localize(117,null),!0),e.minimapSelection=p("minimap.selectionHighlight",{light:"#ADD6FF",dark:"#264F78",hc:"#ffffff"},w.localize(118,null),!0),e.minimapError=p("minimap.errorHighlight",{dark:new N.Color(new N.RGBA(255,18,18,.7)),light:new N.Color(new N.RGBA(255,18,18,.7)),hc:new N.Color(new N.RGBA(255,50,50,1))},w.localize(119,null)),e.minimapWarning=p("minimap.warningHighlight",{dark:e.editorWarningForeground,light:e.editorWarningForeground,hc:e.editorWarningBorder},w.localize(120,null)),e.minimapBackground=p("minimap.background",{dark:null,light:null,hc:null},w.localize(121,null)),e.minimapSliderBackground=p("minimapSlider.background",{light:s(e.scrollbarSliderBackground,.5),dark:s(e.scrollbarSliderBackground,.5),hc:s(e.scrollbarSliderBackground,.5)},w.localize(122,null)),e.minimapSliderHoverBackground=p("minimapSlider.hoverBackground",{light:s(e.scrollbarSliderHoverBackground,.5),dark:s(e.scrollbarSliderHoverBackground,.5),hc:s(e.scrollbarSliderHoverBackground,.5)},w.localize(123,null)),e.minimapSliderActiveBackground=p("minimapSlider.activeBackground",{light:s(e.scrollbarSliderActiveBackground,.5),dark:s(e.scrollbarSliderActiveBackground,.5),hc:s(e.scrollbarSliderActiveBackground,.5)},w.localize(124,null)),e.problemsErrorIconForeground=p("problemsErrorIcon.foreground",{dark:e.editorErrorForeground,light:e.editorErrorForeground,hc:e.editorErrorForeground},w.localize(125,null)),e.problemsWarningIconForeground=p("problemsWarningIcon.foreground",{dark:e.editorWarningForeground,light:e.editorWarningForeground,hc:e.editorWarningForeground},w.localize(126,null)),e.problemsInfoIconForeground=p("problemsInfoIcon.foreground",{dark:e.editorInfoForeground,light:e.editorInfoForeground,hc:e.editorInfoForeground},w.localize(127,null));function c(t,l){return h=>{let m=r(t,h);if(m)return m.darken(l)}}e.darken=c;function o(t,l){return h=>{let m=r(t,h);if(m)return m.lighten(l)}}e.lighten=o;function s(t,l){return h=>{let m=r(t,h);if(m)return m.transparent(l)}}e.transparent=s;function a(...t){return l=>{for(let h of t){let m=r(h,l);if(m)return m}}}e.oneOf=a;function u(t,l,h,m){return _=>{let f=r(t,_);if(f){let v=r(l,_);return v?f.isDarkerThan(v)?N.Color.getLighterColor(f,v,h).transparent(m):N.Color.getDarkerColor(f,v,h).transparent(m):f.transparent(h*m)}}}function r(t,l){if(t!==null){if(typeof t=="string")return t[0]==="#"?N.Color.fromHex(t):l.getColor(t);if(t instanceof N.Color)return t;if(typeof t=="function")return t(l)}}e.resolveColorValue=r,e.workbenchColorsSchemaId="vscode://schemas/workbench-colors";let i=b.Registry.as(S.Extensions.JSONContribution);i.registerSchema(e.workbenchColorsSchemaId,g.getColorSchema());const n=new C.RunOnceScheduler(()=>i.notifySchemaChanged(e.workbenchColorsSchemaId),200);g.onDidChangeSchema(()=>{n.isScheduled()||n.schedule()})}),define(Q[116],J([0,1,22]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.attachMenuStyler=e.defaultMenuStyles=e.defaultListStyles=e.attachListStyler=e.attachBadgeStyler=e.attachStyler=e.computeStyles=void 0;function N(d,g){const p=Object.create(null);for(let c in g){const o=g[c];o&&(p[c]=b.resolveColorValue(o,d))}return p}e.computeStyles=N;function M(d,g,p){function c(o){const s=N(d.getColorTheme(),g);typeof p=="function"?p(s):p.style(s)}return c(d.getColorTheme()),d.onDidColorThemeChange(c)}e.attachStyler=M;function w(d,g,p){return M(g,{badgeBackground:p&&p.badgeBackground||b.badgeBackground,badgeForeground:p&&p.badgeForeground||b.badgeForeground,badgeBorder:b.contrastBorder},d)}e.attachBadgeStyler=w;function S(d,g,p){return M(g,Object.assign(Object.assign({},e.defaultListStyles),p||{}),d)}e.attachListStyler=S,e.defaultListStyles={listFocusBackground:b.listFocusBackground,listFocusForeground:b.listFocusForeground,listFocusOutline:b.listFocusOutline,listActiveSelectionBackground:b.listActiveSelectionBackground,listActiveSelectionForeground:b.listActiveSelectionForeground,listFocusAndSelectionBackground:b.listActiveSelectionBackground,listFocusAndSelectionForeground:b.listActiveSelectionForeground,listInactiveSelectionBackground:b.listInactiveSelectionBackground,listInactiveSelectionForeground:b.listInactiveSelectionForeground,listInactiveFocusBackground:b.listInactiveFocusBackground,listInactiveFocusOutline:b.listInactiveFocusOutline,listHoverBackground:b.listHoverBackground,listHoverForeground:b.listHoverForeground,listDropBackground:b.listDropBackground,listSelectionOutline:b.activeContrastBorder,listHoverOutline:b.activeContrastBorder,listFilterWidgetBackground:b.listFilterWidgetBackground,listFilterWidgetOutline:b.listFilterWidgetOutline,listFilterWidgetNoMatchesOutline:b.listFilterWidgetNoMatchesOutline,listMatchesShadow:b.widgetShadow,treeIndentGuidesStroke:b.treeIndentGuidesStroke,tableColumnsBorder:b.tableColumnsBorder},e.defaultMenuStyles={shadowColor:b.widgetShadow,borderColor:b.menuBorder,foregroundColor:b.menuForeground,backgroundColor:b.menuBackground,selectionForegroundColor:b.menuSelectionForeground,selectionBackgroundColor:b.menuSelectionBackground,selectionBorderColor:b.menuSelectionBorder,separatorColor:b.menuSeparatorBackground};function C(d,g,p){return M(g,Object.assign(Object.assign({},e.defaultMenuStyles),p),d)}e.attachMenuStyler=C}),define(Q[579],J([0,1,48,2,434,7,116,55,50,360]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenuHandler=void 0;class g{constructor(c,o,s,a,u){this.contextViewService=c,this.telemetryService=o,this.notificationService=s,this.keybindingService=a,this.themeService=u,this.focusToReturn=null,this.block=null,this.options={blockMouse:!0}}configure(c){this.options=c}showContextMenu(c){const o=c.getActions();if(!!o.length){this.focusToReturn=document.activeElement;let s,a=w.isHTMLElement(c.domForShadowRoot)?c.domForShadowRoot:void 0;this.contextViewService.showContextView({getAnchor:()=>c.getAnchor(),canRelayout:!1,anchorAlignment:c.anchorAlignment,anchorAxisAlignment:c.anchorAxisAlignment,render:u=>{let r=c.getMenuClassName?c.getMenuClassName():"";r&&(u.className+=" "+r),this.options.blockMouse&&(this.block=u.appendChild(w.$(".context-view-block")),this.block.style.position="fixed",this.block.style.cursor="initial",this.block.style.left="0",this.block.style.top="0",this.block.style.width="100%",this.block.style.height="100%",this.block.style.zIndex="-1",C.domEvent(this.block,w.EventType.MOUSE_DOWN)(t=>t.stopPropagation()));const i=new N.DisposableStore,n=c.actionRunner||new b.ActionRunner;return n.onBeforeRun(this.onActionRun,this,i),n.onDidRun(this.onDidActionRun,this,i),s=new M.Menu(u,o,{actionViewItemProvider:c.getActionViewItem,context:c.getActionsContext?c.getActionsContext():null,actionRunner:n,getKeyBinding:c.getKeyBinding?c.getKeyBinding:t=>this.keybindingService.lookupKeybinding(t.id)}),i.add(S.attachMenuStyler(s,this.themeService)),s.onDidCancel(()=>this.contextViewService.hideContextView(!0),null,i),s.onDidBlur(()=>this.contextViewService.hideContextView(!0),null,i),C.domEvent(window,w.EventType.BLUR)(()=>{this.contextViewService.hideContextView(!0)},null,i),C.domEvent(window,w.EventType.MOUSE_DOWN)(t=>{if(!t.defaultPrevented){let l=new d.StandardMouseEvent(t),h=l.target;if(!l.rightButton){for(;h;){if(h===u)return;h=h.parentElement}this.contextViewService.hideContextView(!0)}}},null,i),N.combinedDisposable(i,s)},focus:()=>{s&&s.focus(!!c.autoSelectFirstItem)},onHide:u=>{c.onHide&&c.onHide(!!u),this.block&&(this.block.remove(),this.block=null),this.focusToReturn&&this.focusToReturn.focus()}},a,!!a)}}onActionRun(c){this.telemetryService&&this.telemetryService.publicLog2("workbenchActionExecuted",{id:c.action.id,from:"contextMenu"}),this.contextViewService.hideContextView(!1),this.focusToReturn&&this.focusToReturn.focus()}onDidActionRun(c){c.error&&this.notificationService.error(c.error)}}e.ContextMenuHandler=g}),define(Q[97],J([0,1]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorScheme=void 0;var b;(function(N){N.DARK="dark",N.LIGHT="light",N.HIGH_CONTRAST="hc"})(b=e.ColorScheme||(e.ColorScheme={}))}),define(Q[255],J([0,1,35,30,17,384,110,171,129,97,38]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewLine=e.ViewLineOptions=e.DomReadingContext=void 0;const c=function(){return M.isNative?!0:!(M.isLinux||b.isFirefox||b.isSafari)}();let o=!0;class s{constructor(_,f){this._domNode=_,this._clientRectDeltaLeft=0,this._clientRectDeltaLeftRead=!1,this.endNode=f}get clientRectDeltaLeft(){return this._clientRectDeltaLeftRead||(this._clientRectDeltaLeftRead=!0,this._clientRectDeltaLeft=this._domNode.getBoundingClientRect().left),this._clientRectDeltaLeft}}e.DomReadingContext=s;class a{constructor(_,f){this.themeType=f;const v=_.options,y=v.get(38);this.renderWhitespace=v.get(83),this.renderControlCharacters=v.get(77),this.spaceWidth=y.spaceWidth,this.middotWidth=y.middotWidth,this.wsmiddotWidth=y.wsmiddotWidth,this.useMonospaceOptimizations=y.isMonospace&&!v.get(26),this.canUseHalfwidthRightwardsArrow=y.canUseHalfwidthRightwardsArrow,this.lineHeight=v.get(53),this.stopRenderingLineAfter=v.get(100),this.fontLigatures=v.get(39)}equals(_){return this.themeType===_.themeType&&this.renderWhitespace===_.renderWhitespace&&this.renderControlCharacters===_.renderControlCharacters&&this.spaceWidth===_.spaceWidth&&this.middotWidth===_.middotWidth&&this.wsmiddotWidth===_.wsmiddotWidth&&this.useMonospaceOptimizations===_.useMonospaceOptimizations&&this.canUseHalfwidthRightwardsArrow===_.canUseHalfwidthRightwardsArrow&&this.lineHeight===_.lineHeight&&this.stopRenderingLineAfter===_.stopRenderingLineAfter&&this.fontLigatures===_.fontLigatures}}e.ViewLineOptions=a;class u{constructor(_){this._options=_,this._isMaybeInvalid=!0,this._renderedViewLine=null}getDomNode(){return this._renderedViewLine&&this._renderedViewLine.domNode?this._renderedViewLine.domNode.domNode:null}setDomNode(_){if(this._renderedViewLine)this._renderedViewLine.domNode=N.createFastDomNode(_);else throw new Error("I have no rendered view line to set the dom node to...")}onContentChanged(){this._isMaybeInvalid=!0}onTokensChanged(){this._isMaybeInvalid=!0}onDecorationsChanged(){this._isMaybeInvalid=!0}onOptionsChanged(_){this._isMaybeInvalid=!0,this._options=_}onSelectionChanged(){return this._options.themeType===g.ColorScheme.HIGH_CONTRAST||this._options.renderWhitespace==="selection"?(this._isMaybeInvalid=!0,!0):!1}renderLine(_,f,v,y){if(this._isMaybeInvalid===!1)return!1;this._isMaybeInvalid=!1;const L=v.getViewLineRenderingData(_),I=this._options,k=C.LineDecoration.filter(L.inlineDecorations,_,L.minColumn,L.maxColumn);let E=null;if(I.themeType===g.ColorScheme.HIGH_CONTRAST||this._options.renderWhitespace==="selection"){const B=v.selections;for(const F of B)if(!(F.endLineNumber<_||F.startLineNumber>_)){const D=F.startLineNumber===_?F.startColumn:L.minColumn,R=F.endLineNumber===_?F.endColumn:L.maxColumn;D');const O=d.renderViewLine(T,y);y.appendASCIIString("");let A=null;return o&&c&&L.isBasicASCII&&I.useMonospaceOptimizations&&O.containsForeignElements===0&&L.content.length<300&&T.lineTokens.getCount()<100&&(A=new r(this._renderedViewLine?this._renderedViewLine.domNode:null,T,O.characterMapping)),A||(A=t(this._renderedViewLine?this._renderedViewLine.domNode:null,T,O.characterMapping,O.containsRTL,O.containsForeignElements)),this._renderedViewLine=A,!0}layoutLine(_,f){this._renderedViewLine&&this._renderedViewLine.domNode&&(this._renderedViewLine.domNode.setTop(f),this._renderedViewLine.domNode.setHeight(this._options.lineHeight))}getWidth(){return this._renderedViewLine?this._renderedViewLine.getWidth():0}getWidthIsFast(){return this._renderedViewLine?this._renderedViewLine.getWidthIsFast():!0}needsMonospaceFontCheck(){return this._renderedViewLine?this._renderedViewLine instanceof r:!1}monospaceAssumptionsAreValid(){return this._renderedViewLine&&this._renderedViewLine instanceof r?this._renderedViewLine.monospaceAssumptionsAreValid():o}onMonospaceAssumptionsInvalidated(){this._renderedViewLine&&this._renderedViewLine instanceof r&&(this._renderedViewLine=this._renderedViewLine.toSlowRenderedLine())}getVisibleRangesForRange(_,f,v){if(!this._renderedViewLine)return null;_=_|0,f=f|0,_=Math.min(this._renderedViewLine.input.lineContent.length+1,Math.max(1,_)),f=Math.min(this._renderedViewLine.input.lineContent.length+1,Math.max(1,f));const y=this._renderedViewLine.input.stopRenderingLineAfter|0;let L=!1;y!==-1&&_>y+1&&f>y+1&&(L=!0),y!==-1&&_>y+1&&(_=y+1),y!==-1&&f>y+1&&(f=y+1);const I=this._renderedViewLine.getVisibleRangesForRange(_,f,v);return I&&I.length>0?new S.VisibleRanges(L,I):null}getColumnOfNodeOffset(_,f,v){return this._renderedViewLine?this._renderedViewLine.getColumnOfNodeOffset(_,f,v):1}}e.ViewLine=u,u.CLASS_NAME="view-line";class r{constructor(_,f,v){this.domNode=_,this.input=f,this._characterMapping=v,this._charWidth=f.spaceWidth}getWidth(){return this._getCharPosition(this._characterMapping.length)}getWidthIsFast(){return!0}monospaceAssumptionsAreValid(){if(!this.domNode)return o;const _=this.getWidth(),f=this.domNode.domNode.firstChild.offsetWidth;return Math.abs(_-f)>=2&&(console.warn("monospace assumptions have been violated, therefore disabling monospace optimizations!"),o=!1),o}toSlowRenderedLine(){return t(this.domNode,this.input,this._characterMapping,!1,0)}getVisibleRangesForRange(_,f,v){const y=this._getCharPosition(_),L=this._getCharPosition(f);return[new S.HorizontalRange(y,L-y)]}_getCharPosition(_){const f=this._characterMapping.getAbsoluteOffsets();return f.length===0?0:Math.round(this._charWidth*f[_-1])}getColumnOfNodeOffset(_,f,v){const y=f.textContent.length;let L=-1;for(;f;)f=f.previousSibling,L++;return this._characterMapping.partDataToCharOffset(L,y,v)+1}}class i{constructor(_,f,v,y,L){if(this.domNode=_,this.input=f,this._characterMapping=v,this._isWhitespaceOnly=/^\s*$/.test(f.lineContent),this._containsForeignElements=L,this._cachedWidth=-1,this._pixelOffsetCache=null,!y||this._characterMapping.length===0){this._pixelOffsetCache=new Int32Array(Math.max(2,this._characterMapping.length+1));for(let I=0,k=this._characterMapping.length;I<=k;I++)this._pixelOffsetCache[I]=-1}}_getReadingTarget(_){return _.domNode.firstChild}getWidth(){return this.domNode?(this._cachedWidth===-1&&(this._cachedWidth=this._getReadingTarget(this.domNode).offsetWidth),this._cachedWidth):0}getWidthIsFast(){return this._cachedWidth!==-1}getVisibleRangesForRange(_,f,v){if(!this.domNode)return null;if(this._pixelOffsetCache!==null){const y=this._readPixelOffset(this.domNode,_,v);if(y===-1)return null;const L=this._readPixelOffset(this.domNode,f,v);return L===-1?null:[new S.HorizontalRange(y,L-y)]}return this._readVisibleRangesForRange(this.domNode,_,f,v)}_readVisibleRangesForRange(_,f,v,y){if(f===v){const L=this._readPixelOffset(_,f,y);return L===-1?null:[new S.HorizontalRange(L,0)]}else return this._readRawVisibleRangesForRange(_,f,v,y)}_readPixelOffset(_,f,v){if(this._characterMapping.length===0){if(this._containsForeignElements===0||this._containsForeignElements===2)return 0;if(this._containsForeignElements===1)return this.getWidth();const y=this._getReadingTarget(_);return y.firstChild?y.firstChild.offsetWidth:0}if(this._pixelOffsetCache!==null){const y=this._pixelOffsetCache[f];if(y!==-1)return y;const L=this._actualReadPixelOffset(_,f,v);return this._pixelOffsetCache[f]=L,L}return this._actualReadPixelOffset(_,f,v)}_actualReadPixelOffset(_,f,v){if(this._characterMapping.length===0){const T=w.RangeUtil.readHorizontalRanges(this._getReadingTarget(_),0,0,0,0,v.clientRectDeltaLeft,v.endNode);return!T||T.length===0?-1:T[0].left}if(f===this._characterMapping.length&&this._isWhitespaceOnly&&this._containsForeignElements===0)return this.getWidth();const y=this._characterMapping.charOffsetToPartData(f-1),L=d.CharacterMapping.getPartIndex(y),I=d.CharacterMapping.getCharIndex(y),k=w.RangeUtil.readHorizontalRanges(this._getReadingTarget(_),L,I,L,I,v.clientRectDeltaLeft,v.endNode);if(!k||k.length===0)return-1;const E=k[0].left;if(this.input.isBasicASCII){const T=this._characterMapping.getAbsoluteOffsets(),O=Math.round(this.input.spaceWidth*T[f-1]);if(Math.abs(O-E)<=1)return O}return E}_readRawVisibleRangesForRange(_,f,v,y){if(f===1&&v===this._characterMapping.length)return[new S.HorizontalRange(0,this.getWidth())];const L=this._characterMapping.charOffsetToPartData(f-1),I=d.CharacterMapping.getPartIndex(L),k=d.CharacterMapping.getCharIndex(L),E=this._characterMapping.charOffsetToPartData(v-1),T=d.CharacterMapping.getPartIndex(E),O=d.CharacterMapping.getCharIndex(E);return w.RangeUtil.readHorizontalRanges(this._getReadingTarget(_),I,k,T,O,y.clientRectDeltaLeft,y.endNode)}getColumnOfNodeOffset(_,f,v){const y=f.textContent.length;let L=-1;for(;f;)f=f.previousSibling,L++;return this._characterMapping.partDataToCharOffset(L,y,v)+1}}class n extends i{_readVisibleRangesForRange(_,f,v,y){const L=super._readVisibleRangesForRange(_,f,v,y);if(!L||L.length===0||f===v||f===1&&v===this._characterMapping.length)return L;if(!this.input.containsRTL){const I=this._readPixelOffset(_,v,y);if(I!==-1){const k=L[L.length-1];k.left=4&&m[0]===3&&m[3]===7}static isStrictChildOfViewLines(m){return m.length>4&&m[0]===3&&m[3]===7}static isChildOfScrollableElement(m){return m.length>=2&&m[0]===3&&m[1]===5}static isChildOfMinimap(m){return m.length>=2&&m[0]===3&&m[1]===8}static isChildOfContentWidgets(m){return m.length>=4&&m[0]===3&&m[3]===1}static isChildOfOverflowingContentWidgets(m){return m.length>=1&&m[0]===2}static isChildOfOverlayWidgets(m){return m.length>=2&&m[0]===3&&m[1]===4}}class s{constructor(m,_,f){this.model=m.model;const v=m.configuration.options;this.layoutInfo=v.get(124),this.viewDomNode=_.viewDomNode,this.lineHeight=v.get(53),this.stickyTabStops=v.get(99),this.typicalHalfwidthCharacterWidth=v.get(38).typicalHalfwidthCharacterWidth,this.lastRenderData=f,this._context=m,this._viewHelper=_}getZoneAtCoord(m){return s.getZoneAtCoord(this._context,m)}static getZoneAtCoord(m,_){const f=m.viewLayout.getWhitespaceAtVerticalOffset(_);if(f){const v=f.verticalOffset+f.height/2,y=m.model.getLineCount();let L=null,I,k=null;return f.afterLineNumber!==y&&(k=new w.Position(f.afterLineNumber+1,1)),f.afterLineNumber>0&&(L=new w.Position(f.afterLineNumber,m.model.getLineMaxColumn(f.afterLineNumber))),k===null?I=L:L===null?I=k:_=m.layoutInfo.glyphMarginLeft,this.isInContentArea=!this.isInMarginArea,this.mouseColumn=Math.max(0,n._getMouseColumn(this.mouseContentHorizontalOffset,m.typicalHalfwidthCharacterWidth))}}class u extends a{constructor(m,_,f,v){super(m,_,f);this._ctx=m,v?(this.target=v,this.targetPath=N.PartFingerprints.collect(v,m.viewDomNode)):(this.target=null,this.targetPath=new Uint8Array(0))}toString(){return`pos(${this.pos.x},${this.pos.y}), editorPos(${this.editorPos.x},${this.editorPos.y}), mouseVerticalOffset: ${this.mouseVerticalOffset}, mouseContentHorizontalOffset: ${this.mouseContentHorizontalOffset} + target: ${this.target?this.target.outerHTML:null}`}fulfill(m,_=null,f=null,v=null){let y=this.mouseColumn;return _&&_.columnL.contentLeft+L.width)){const I=m.getVerticalOffsetForLineNumber(L.position.lineNumber);if(I<=y&&y<=I+L.height)return _.fulfill(6,L.position)}}return null}static _hitTestViewZone(m,_){const f=m.getZoneAtCoord(_.mouseVerticalOffset);if(f){const v=_.isInContentArea?8:5;return _.fulfill(v,f.position,null,f)}return null}static _hitTestTextArea(m,_){return o.isTextArea(_.targetPath)?m.lastRenderData.lastTextareaPosition?_.fulfill(6,m.lastRenderData.lastTextareaPosition):_.fulfill(1,m.lastRenderData.lastTextareaPosition):null}static _hitTestMargin(m,_){if(_.isInMarginArea){const f=m.getFullLineRangeAtCoord(_.mouseVerticalOffset),v=f.range.getStartPosition();let y=Math.abs(_.pos.x-_.editorPos.x);const L={isAfterLines:f.isAfterLines,glyphMarginLeft:m.layoutInfo.glyphMarginLeft,glyphMarginWidth:m.layoutInfo.glyphMarginWidth,lineNumbersWidth:m.layoutInfo.lineNumbersWidth,offsetX:y};return y-=m.layoutInfo.glyphMarginLeft,y<=m.layoutInfo.glyphMarginWidth?_.fulfill(2,v,f.range,L):(y-=m.layoutInfo.glyphMarginWidth,y<=m.layoutInfo.lineNumbersWidth?_.fulfill(3,v,f.range,L):(y-=m.layoutInfo.lineNumbersWidth,_.fulfill(4,v,f.range,L)))}return null}static _hitTestViewLines(m,_,f){if(!o.isChildOfViewLines(_.targetPath))return null;if(m.isInTopPadding(_.mouseVerticalOffset))return _.fulfill(7,new w.Position(1,1),void 0,r);if(m.isAfterLines(_.mouseVerticalOffset)||m.isInBottomPadding(_.mouseVerticalOffset)){const y=m.model.getLineCount(),L=m.model.getLineMaxColumn(y);return _.fulfill(7,new w.Position(y,L),void 0,r)}if(f){if(o.isStrictChildOfViewLines(_.targetPath)){const y=m.getLineNumberAtVerticalOffset(_.mouseVerticalOffset);if(m.model.getLineLength(y)===0){const I=m.getLineWidth(y),k=i(_.mouseContentHorizontalOffset-I);return _.fulfill(7,new w.Position(y,1),void 0,k)}const L=m.getLineWidth(y);if(_.mouseContentHorizontalOffset>=L){const I=i(_.mouseContentHorizontalOffset-L),k=new w.Position(y,m.model.getLineMaxColumn(y));return _.fulfill(7,k,void 0,I)}}return _.fulfill(0)}const v=n._doHitTest(m,_);return v.position?n.createMouseTargetFromHitTestPosition(m,_,v.position.lineNumber,v.position.column):this._createMouseTarget(m,_.withTarget(v.hitTarget),!0)}static _hitTestMinimap(m,_){if(o.isChildOfMinimap(_.targetPath)){const f=m.getLineNumberAtVerticalOffset(_.mouseVerticalOffset),v=m.model.getLineMaxColumn(f);return _.fulfill(11,new w.Position(f,v))}return null}static _hitTestScrollbarSlider(m,_){if(o.isChildOfScrollableElement(_.targetPath)&&_.target&&_.target.nodeType===1){const f=_.target.className;if(f&&/\b(slider|scrollbar)\b/.test(f)){const v=m.getLineNumberAtVerticalOffset(_.mouseVerticalOffset),y=m.model.getLineMaxColumn(v);return _.fulfill(11,new w.Position(v,y))}}return null}static _hitTestScrollbar(m,_){if(o.isChildOfScrollableElement(_.targetPath)){const f=m.getLineNumberAtVerticalOffset(_.mouseVerticalOffset),v=m.model.getLineMaxColumn(f);return _.fulfill(11,new w.Position(f,v))}return null}getMouseColumn(m,_){const f=this._context.configuration.options,v=f.get(124),y=this._context.viewLayout.getCurrentScrollLeft()+_.x-m.x-v.contentLeft;return n._getMouseColumn(y,f.get(38).typicalHalfwidthCharacterWidth)}static _getMouseColumn(m,_){return m<0?1:Math.round(m/_)+1}static createMouseTargetFromHitTestPosition(m,_,f,v){const y=new w.Position(f,v),L=m.getLineWidth(f);if(_.mouseContentHorizontalOffset>L){const O=i(_.mouseContentHorizontalOffset-L);return _.fulfill(7,y,void 0,O)}const I=m.visibleRangeForPosition(f,v);if(!I)return _.fulfill(0,y);const k=I.left;if(_.mouseContentHorizontalOffset===k)return _.fulfill(6,y);const E=[];if(E.push({offset:I.left,column:v}),v>1){const O=m.visibleRangeForPosition(f,v-1);O&&E.push({offset:O.left,column:v-1})}const T=m.model.getLineMaxColumn(f);if(vO.offset-A.offset);for(let O=1;O=_.editorPos.y+m.layoutInfo.height&&(L=_.editorPos.y+m.layoutInfo.height-1);const I=new b.PageCoordinates(_.pos.x,L),k=this._actualDoHitTestWithCaretRangeFromPoint(m,I.toClientCoordinates());return k.position?k:this._actualDoHitTestWithCaretRangeFromPoint(m,_.pos.toClientCoordinates())}static _actualDoHitTestWithCaretRangeFromPoint(m,_){const f=d.getShadowRoot(m.viewDomNode);let v;if(f?typeof f.caretRangeFromPoint=="undefined"?v=t(f,_.clientX,_.clientY):v=f.caretRangeFromPoint(_.clientX,_.clientY):v=document.caretRangeFromPoint(_.clientX,_.clientY),!v||!v.startContainer)return{position:null,hitTarget:null};const y=v.startContainer;let L=null;if(y.nodeType===y.TEXT_NODE){const I=y.parentNode,k=I?I.parentNode:null,E=k?k.parentNode:null;if((E&&E.nodeType===E.ELEMENT_NODE?E.className:null)===M.ViewLine.CLASS_NAME)return{position:m.getPositionFromDOMInfo(I,v.startOffset),hitTarget:null};L=y.parentNode}else if(y.nodeType===y.ELEMENT_NODE){const I=y.parentNode,k=I?I.parentNode:null;if((k&&k.nodeType===k.ELEMENT_NODE?k.className:null)===M.ViewLine.CLASS_NAME)return{position:m.getPositionFromDOMInfo(y,y.textContent.length),hitTarget:null};L=y}return{position:null,hitTarget:L}}static _doHitTestWithCaretPositionFromPoint(m,_){const f=document.caretPositionFromPoint(_.clientX,_.clientY);if(f.offsetNode.nodeType===f.offsetNode.TEXT_NODE){const v=f.offsetNode.parentNode,y=v?v.parentNode:null,L=y?y.parentNode:null;return(L&&L.nodeType===L.ELEMENT_NODE?L.className:null)===M.ViewLine.CLASS_NAME?{position:m.getPositionFromDOMInfo(f.offsetNode.parentNode,f.offset),hitTarget:null}:{position:null,hitTarget:f.offsetNode.parentNode}}if(f.offsetNode.nodeType===f.offsetNode.ELEMENT_NODE){const v=f.offsetNode.parentNode,y=v&&v.nodeType===v.ELEMENT_NODE?v.className:null,L=v?v.parentNode:null,I=L&&L.nodeType===L.ELEMENT_NODE?L.className:null;if(y===M.ViewLine.CLASS_NAME){const k=f.offsetNode.childNodes[Math.min(f.offset,f.offsetNode.childNodes.length-1)];if(k)return{position:m.getPositionFromDOMInfo(k,0),hitTarget:null}}else if(I===M.ViewLine.CLASS_NAME)return{position:m.getPositionFromDOMInfo(f.offsetNode,0),hitTarget:null}}return{position:null,hitTarget:f.offsetNode}}static _snapToSoftTabBoundary(m,_){const f=_.getLineContent(m.lineNumber),{tabSize:v}=_.getTextModelOptions(),y=g.AtomicTabMoveOperations.atomicPosition(f,m.column-1,v,2);return y!==-1?new w.Position(m.lineNumber,y+1):m}static _doHitTest(m,_){let f;return typeof document.caretRangeFromPoint=="function"?f=this._doHitTestWithCaretRangeFromPoint(m,_):document.caretPositionFromPoint?f=this._doHitTestWithCaretPositionFromPoint(m,_.pos.toClientCoordinates()):f={position:null,hitTarget:null},f.position&&m.stickyTabStops&&(f.position=this._snapToSoftTabBoundary(f.position,m.model)),f}}e.MouseTargetFactory=n;function t(h,m,_){const f=document.createRange();let v=h.elementFromPoint(m,_);if(v!==null){for(;v&&v.firstChild&&v.firstChild.nodeType!==v.firstChild.TEXT_NODE&&v.lastChild&&v.lastChild.firstChild;)v=v.lastChild;const y=v.getBoundingClientRect(),L=window.getComputedStyle(v,null).getPropertyValue("font"),I=v.innerText;let k=y.left,E=0,T;if(m>y.left+y.width)E=I.length;else{const O=l.getInstance();for(let A=0;Athis._createMouseTarget(_,f),_=>this._getMouseColumn(_))),this.lastMouseLeaveTime=-1,this._height=this._context.configuration.options.get(124).height;const h=new d.EditorMouseEventFactory(this.viewHelper.viewDomNode);this._register(h.onContextMenu(this.viewHelper.viewDomNode,_=>this._onContextMenu(_,!0))),this._register(h.onMouseMoveThrottled(this.viewHelper.viewDomNode,_=>this._onMouseMove(_),s(this.mouseTargetFactory),a.MOUSE_MOVE_MINIMUM_TIME)),this._register(h.onMouseUp(this.viewHelper.viewDomNode,_=>this._onMouseUp(_))),this._register(h.onMouseLeave(this.viewHelper.viewDomNode,_=>this._onMouseLeave(_))),this._register(h.onMouseDown(this.viewHelper.viewDomNode,_=>this._onMouseDown(_)));const m=_=>{if(this.viewController.emitMouseWheel(_),!!this._context.configuration.options.get(62)){const f=new N.StandardWheelEvent(_);if(S.isMacintosh?(_.metaKey||_.ctrlKey)&&!_.shiftKey&&!_.altKey:_.ctrlKey&&!_.metaKey&&!_.shiftKey&&!_.altKey){const y=g.EditorZoom.getZoomLevel(),L=f.deltaY>0?1:-1;g.EditorZoom.setZoomLevel(y+L),f.preventDefault(),f.stopPropagation()}}};this._register(b.addDisposableListener(this.viewHelper.viewDomNode,b.EventType.MOUSE_WHEEL,m,{capture:!0,passive:!1})),this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}onConfigurationChanged(n){if(n.hasChanged(124)){const t=this._context.configuration.options.get(124).height;this._height!==t&&(this._height=t,this._mouseDownOperation.onHeightChanged())}return!1}onCursorStateChanged(n){return this._mouseDownOperation.onCursorStateChanged(n),!1}onFocusChanged(n){return!1}onScrollChanged(n){return this._mouseDownOperation.onScrollChanged(),!1}getTargetAtClientPoint(n,t){const h=new d.ClientCoordinates(n,t).toPageCoordinates(),m=d.createEditorPagePosition(this.viewHelper.viewDomNode);return h.ym.y+m.height||h.xm.x+m.width?null:this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(),m,h,null)}_createMouseTarget(n,t){return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(),n.editorPos,n.pos,t?n.target:null)}_getMouseColumn(n){return this.mouseTargetFactory.getMouseColumn(n.editorPos,n.pos)}_onContextMenu(n,t){this.viewController.emitContextMenu({event:n,target:this._createMouseTarget(n,t)})}_onMouseMove(n){this._mouseDownOperation.isActive()||n.timestamp{n.preventDefault(),this.viewHelper.focusTextArea()};if(y&&(l||m&&_))L(),this._mouseDownOperation.start(t.type,n);else if(h)n.preventDefault();else if(f){const I=t.detail;this.viewHelper.shouldSuppressMouseDownOnViewZone(I.viewZoneId)&&(L(),this._mouseDownOperation.start(t.type,n),n.preventDefault())}else v&&this.viewHelper.shouldSuppressMouseDownOnWidget(t.detail)&&(L(),n.preventDefault());this.viewController.emitMouseDown({event:n,target:t})}}e.MouseHandler=a,a.MOUSE_MOVE_MINIMUM_TIME=100;class u extends w.Disposable{constructor(n,t,l,h,m){super();this._context=n,this._viewController=t,this._viewHelper=l,this._createMouseTarget=h,this._getMouseColumn=m,this._mouseMoveMonitor=this._register(new d.GlobalEditorMouseMoveMonitor(this._viewHelper.viewDomNode)),this._onScrollTimeout=this._register(new M.TimeoutTimer),this._mouseState=new r,this._currentSelection=new c.Selection(1,1,1,1),this._isActive=!1,this._lastMouseEvent=null}dispose(){super.dispose()}isActive(){return this._isActive}_onMouseDownThenMove(n){this._lastMouseEvent=n,this._mouseState.setModifiers(n);const t=this._findMousePosition(n,!0);!t||(this._mouseState.isDragAndDrop?this._viewController.emitMouseDrag({event:n,target:t}):this._dispatchMouse(t,!0))}start(n,t){this._lastMouseEvent=t,this._mouseState.setStartedOnLineNumbers(n===3),this._mouseState.setStartButtons(t),this._mouseState.setModifiers(t);const l=this._findMousePosition(t,!0);if(!(!l||!l.position)){this._mouseState.trySetCount(t.detail,l.position),t.detail=this._mouseState.count;const h=this._context.configuration.options;if(!h.get(75)&&h.get(27)&&!h.get(15)&&!this._mouseState.altKey&&t.detail<2&&!this._isActive&&!this._currentSelection.isEmpty()&&l.type===6&&l.position&&this._currentSelection.containsPosition(l.position)){this._mouseState.isDragAndDrop=!0,this._isActive=!0,this._mouseMoveMonitor.startMonitoring(t.target,t.buttons,s(null),m=>this._onMouseDownThenMove(m),m=>{const _=this._findMousePosition(this._lastMouseEvent,!0);m&&m instanceof KeyboardEvent?this._viewController.emitMouseDropCanceled():this._viewController.emitMouseDrop({event:this._lastMouseEvent,target:_?this._createMouseTarget(this._lastMouseEvent,!0):null}),this._stop()});return}this._mouseState.isDragAndDrop=!1,this._dispatchMouse(l,t.shiftKey),this._isActive||(this._isActive=!0,this._mouseMoveMonitor.startMonitoring(t.target,t.buttons,s(null),m=>this._onMouseDownThenMove(m),()=>this._stop()))}}_stop(){this._isActive=!1,this._onScrollTimeout.cancel()}onHeightChanged(){this._mouseMoveMonitor.stopMonitoring()}onScrollChanged(){!this._isActive||this._onScrollTimeout.setIfNotSet(()=>{if(!!this._lastMouseEvent){const n=this._findMousePosition(this._lastMouseEvent,!1);!n||this._mouseState.isDragAndDrop||this._dispatchMouse(n,!0)}},10)}onCursorStateChanged(n){this._currentSelection=n.selections[0]}_getPositionOutsideEditor(n){const t=n.editorPos,l=this._context.model,h=this._context.viewLayout,m=this._getMouseColumn(n);if(n.posyt.y+t.height){const f=h.getCurrentScrollTop()+(n.posy-t.y),v=C.HitTestContext.getZoneAtCoord(this._context,f);if(v){const L=this._helpPositionJumpOverViewZone(v);if(L)return new C.MouseTarget(null,13,m,L)}const y=h.getLineNumberAtVerticalOffset(f);return new C.MouseTarget(null,13,m,new p.Position(y,l.getLineMaxColumn(y)))}const _=h.getLineNumberAtVerticalOffset(h.getCurrentScrollTop()+(n.posy-t.y));return n.posxt.x+t.width?new C.MouseTarget(null,13,m,new p.Position(_,l.getLineMaxColumn(_))):null}_findMousePosition(n,t){const l=this._getPositionOutsideEditor(n);if(l)return l;const h=this._createMouseTarget(n,t);if(!h.position)return null;if(h.type===8||h.type===5){const _=this._helpPositionJumpOverViewZone(h.detail);if(_)return new C.MouseTarget(h.element,h.type,h.mouseColumn,_,null,h.detail)}return h}_helpPositionJumpOverViewZone(n){const t=new p.Position(this._currentSelection.selectionStartLineNumber,this._currentSelection.selectionStartColumn),l=n.positionBefore,h=n.positionAfter;return l&&h?l.isBefore(t)?l:h:null}_dispatchMouse(n,t){!n.position||this._viewController.dispatchMouse({position:n.position,mouseColumn:n.mouseColumn,startedOnLineNumbers:this._mouseState.startedOnLineNumbers,inSelectionMode:t,mouseDownCount:this._mouseState.count,altKey:this._mouseState.altKey,ctrlKey:this._mouseState.ctrlKey,metaKey:this._mouseState.metaKey,shiftKey:this._mouseState.shiftKey,leftButton:this._mouseState.leftButton,middleButton:this._mouseState.middleButton})}}class r{constructor(){this._altKey=!1,this._ctrlKey=!1,this._metaKey=!1,this._shiftKey=!1,this._leftButton=!1,this._middleButton=!1,this._startedOnLineNumbers=!1,this._lastMouseDownPosition=null,this._lastMouseDownPositionEqualCount=0,this._lastMouseDownCount=0,this._lastSetMouseDownCountTime=0,this.isDragAndDrop=!1}get altKey(){return this._altKey}get ctrlKey(){return this._ctrlKey}get metaKey(){return this._metaKey}get shiftKey(){return this._shiftKey}get leftButton(){return this._leftButton}get middleButton(){return this._middleButton}get startedOnLineNumbers(){return this._startedOnLineNumbers}get count(){return this._lastMouseDownCount}setModifiers(n){this._altKey=n.altKey,this._ctrlKey=n.ctrlKey,this._metaKey=n.metaKey,this._shiftKey=n.shiftKey}setStartButtons(n){this._leftButton=n.leftButton,this._middleButton=n.middleButton}setStartedOnLineNumbers(n){this._startedOnLineNumbers=n}trySetCount(n,t){const l=new Date().getTime();l-this._lastSetMouseDownCountTime>r.CLEAR_MOUSE_DOWN_COUNT_TIME&&(n=1),this._lastSetMouseDownCountTime=l,n>this._lastMouseDownCount+1&&(n=this._lastMouseDownCount+1),this._lastMouseDownPosition&&this._lastMouseDownPosition.equals(t)?this._lastMouseDownPositionEqualCount++:this._lastMouseDownPositionEqualCount=1,this._lastMouseDownPosition=t,this._lastMouseDownCount=Math.min(n,this._lastMouseDownPositionEqualCount)}}r.CLEAR_MOUSE_DOWN_COUNT_TIME=400}),define(Q[581],J([0,1,7,17,60,2,580,162,151,164]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PointerHandler=e.PointerEventHandler=void 0;class p extends S.MouseHandler{constructor(a,u,r){super(a,u,r);this._register(M.Gesture.addTarget(this.viewHelper.linesContentDomNode)),this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,M.EventType.Tap,n=>this.onTap(n))),this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,M.EventType.Change,n=>this.onChange(n))),this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,M.EventType.Contextmenu,n=>this._onContextMenu(new C.EditorMouseEvent(n,this.viewHelper.viewDomNode),!1))),this._lastPointerType="mouse",this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,"pointerdown",n=>{const t=n.pointerType;if(t==="mouse"){this._lastPointerType="mouse";return}else t==="touch"?this._lastPointerType="touch":this._lastPointerType="pen"}));const i=new C.EditorPointerEventFactory(this.viewHelper.viewDomNode);this._register(i.onPointerMoveThrottled(this.viewHelper.viewDomNode,n=>this._onMouseMove(n),S.createMouseMoveEventMerger(this.mouseTargetFactory),S.MouseHandler.MOUSE_MOVE_MINIMUM_TIME)),this._register(i.onPointerUp(this.viewHelper.viewDomNode,n=>this._onMouseUp(n))),this._register(i.onPointerLeave(this.viewHelper.viewDomNode,n=>this._onMouseLeave(n))),this._register(i.onPointerDown(this.viewHelper.viewDomNode,n=>this._onMouseDown(n)))}onTap(a){if(!(!a.initialTarget||!this.viewHelper.linesContentDomNode.contains(a.initialTarget))){a.preventDefault(),this.viewHelper.focusTextArea();const u=this._createMouseTarget(new C.EditorMouseEvent(a,this.viewHelper.viewDomNode),!1);u.position&&this.viewController.dispatchMouse({position:u.position,mouseColumn:u.position.column,startedOnLineNumbers:!1,mouseDownCount:a.tapCount,inSelectionMode:!1,altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1,leftButton:!1,middleButton:!1})}}onChange(a){this._lastPointerType==="touch"&&this._context.model.deltaScrollNow(-a.translationX,-a.translationY)}_onMouseDown(a){a.browserEvent.pointerType!=="touch"&&super._onMouseDown(a)}}e.PointerEventHandler=p;class c extends S.MouseHandler{constructor(a,u,r){super(a,u,r);this._register(M.Gesture.addTarget(this.viewHelper.linesContentDomNode)),this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,M.EventType.Tap,i=>this.onTap(i))),this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,M.EventType.Change,i=>this.onChange(i))),this._register(b.addDisposableListener(this.viewHelper.linesContentDomNode,M.EventType.Contextmenu,i=>this._onContextMenu(new C.EditorMouseEvent(i,this.viewHelper.viewDomNode),!1)))}onTap(a){a.preventDefault(),this.viewHelper.focusTextArea();const u=this._createMouseTarget(new C.EditorMouseEvent(a,this.viewHelper.viewDomNode),!1);if(u.position){const r=document.createEvent("CustomEvent");r.initEvent(g.TextAreaSyntethicEvents.Tap,!1,!0),this.viewHelper.dispatchTextAreaEvent(r),this.viewController.moveTo(u.position)}}onChange(a){this._context.model.deltaScrollNow(-a.translationX,-a.translationY)}}class o extends w.Disposable{constructor(a,u,r){super();N.isIOS&&d.BrowserFeatures.pointerEvents?this.handler=this._register(new p(a,u,r)):window.TouchEvent?this.handler=this._register(new c(a,u,r)):this.handler=this._register(new S.MouseHandler(a,u,r))}getTargetAtClientPoint(a,u){return this.handler.getTargetAtClientPoint(a,u)}}e.PointerHandler=o}),define(Q[256],J([0,1,187]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewUserInputEvents=void 0;class N{constructor(S){this.onKeyDown=null,this.onKeyUp=null,this.onContextMenu=null,this.onMouseMove=null,this.onMouseLeave=null,this.onMouseDown=null,this.onMouseUp=null,this.onMouseDrag=null,this.onMouseDrop=null,this.onMouseDropCanceled=null,this.onMouseWheel=null,this._coordinatesConverter=S}emitKeyDown(S){this.onKeyDown&&this.onKeyDown(S)}emitKeyUp(S){this.onKeyUp&&this.onKeyUp(S)}emitContextMenu(S){this.onContextMenu&&this.onContextMenu(this._convertViewToModelMouseEvent(S))}emitMouseMove(S){this.onMouseMove&&this.onMouseMove(this._convertViewToModelMouseEvent(S))}emitMouseLeave(S){this.onMouseLeave&&this.onMouseLeave(this._convertViewToModelMouseEvent(S))}emitMouseDown(S){this.onMouseDown&&this.onMouseDown(this._convertViewToModelMouseEvent(S))}emitMouseUp(S){this.onMouseUp&&this.onMouseUp(this._convertViewToModelMouseEvent(S))}emitMouseDrag(S){this.onMouseDrag&&this.onMouseDrag(this._convertViewToModelMouseEvent(S))}emitMouseDrop(S){this.onMouseDrop&&this.onMouseDrop(this._convertViewToModelMouseEvent(S))}emitMouseDropCanceled(){this.onMouseDropCanceled&&this.onMouseDropCanceled()}emitMouseWheel(S){this.onMouseWheel&&this.onMouseWheel(S)}_convertViewToModelMouseEvent(S){return S.target?{event:S.event,target:this._convertViewToModelMouseTarget(S.target)}:S}_convertViewToModelMouseTarget(S){return N.convertViewToModelMouseTarget(S,this._coordinatesConverter)}static convertViewToModelMouseTarget(S,C){return new M(S.element,S.type,S.mouseColumn,S.position?C.convertViewPositionToModelPosition(S.position):null,S.range?C.convertViewRangeToModelRange(S.range):null,S.detail)}}e.ViewUserInputEvents=N;class M{constructor(S,C,d,g,p,c){this.element=S,this.type=C,this.mouseColumn=d,this.position=g,this.range=p,this.detail=c}toString(){return b.MouseTarget.toString(this)}}}),define(Q[582],J([0,1,17,15,69,165,45,255,14,3,110,124,323]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewLines=void 0;class o{constructor(){this._currentVisibleRange=new g.Range(1,1,1,1)}getCurrentVisibleRange(){return this._currentVisibleRange}setCurrentVisibleRange(i){this._currentVisibleRange=i}}class s{constructor(i,n,t,l,h,m){this.lineNumber=i,this.startColumn=n,this.endColumn=t,this.startScrollTop=l,this.stopScrollTop=h,this.scrollType=m,this.type="range",this.minLineNumber=i,this.maxLineNumber=i}}class a{constructor(i,n,t,l){this.selections=i,this.startScrollTop=n,this.stopScrollTop=t,this.scrollType=l,this.type="selections";let h=i[0].startLineNumber,m=i[0].endLineNumber;for(let _=1,f=i.length;_{this._updateLineWidthsSlow()},200),this._asyncCheckMonospaceFontAssumptions=new N.RunOnceScheduler(()=>{this._checkMonospaceFontAssumptions()},2e3),this._lastRenderedData=new o,this._horizontalRevealRequest=null}dispose(){this._asyncUpdateLineWidths.dispose(),this._asyncCheckMonospaceFontAssumptions.dispose(),super.dispose()}getDomNode(){return this.domNode}createVisibleLine(){return new C.ViewLine(this._viewLineOptions)}onConfigurationChanged(i){this._visibleLines.onConfigurationChanged(i),i.hasChanged(125)&&(this._maxLineWidth=0);const n=this._context.configuration.options,t=n.get(38),l=n.get(125);return this._lineHeight=n.get(53),this._typicalHalfwidthCharacterWidth=t.typicalHalfwidthCharacterWidth,this._isViewportWrapping=l.isViewportWrapping,this._revealHorizontalRightPadding=n.get(84),this._cursorSurroundingLines=n.get(22),this._cursorSurroundingLinesStyle=n.get(23),this._canUseLayerHinting=!n.get(25),M.Configuration.applyFontInfo(this.domNode,t),this._onOptionsMaybeChanged(),i.hasChanged(124)&&(this._maxLineWidth=0),!0}_onOptionsMaybeChanged(){const i=this._context.configuration,n=new C.ViewLineOptions(i,this._context.theme.type);if(!this._viewLineOptions.equals(n)){this._viewLineOptions=n;const t=this._visibleLines.getStartLineNumber(),l=this._visibleLines.getEndLineNumber();for(let h=t;h<=l;h++)this._visibleLines.getVisibleLine(h).onOptionsChanged(this._viewLineOptions);return!0}return!1}onCursorStateChanged(i){const n=this._visibleLines.getStartLineNumber(),t=this._visibleLines.getEndLineNumber();let l=!1;for(let h=n;h<=t;h++)l=this._visibleLines.getVisibleLine(h).onSelectionChanged()||l;return l}onDecorationsChanged(i){{const n=this._visibleLines.getStartLineNumber(),t=this._visibleLines.getEndLineNumber();for(let l=n;l<=t;l++)this._visibleLines.getVisibleLine(l).onDecorationsChanged()}return!0}onFlushed(i){const n=this._visibleLines.onFlushed(i);return this._maxLineWidth=0,n}onLinesChanged(i){return this._visibleLines.onLinesChanged(i)}onLinesDeleted(i){return this._visibleLines.onLinesDeleted(i)}onLinesInserted(i){return this._visibleLines.onLinesInserted(i)}onRevealRangeRequest(i){const n=this._computeScrollTopToRevealRange(this._context.viewLayout.getFutureViewport(),i.source,i.range,i.selections,i.verticalType);if(n===-1)return!1;let t=this._context.viewLayout.validateScrollPosition({scrollTop:n});i.revealHorizontal?i.range&&i.range.startLineNumber!==i.range.endLineNumber?t={scrollTop:t.scrollTop,scrollLeft:0}:i.range?this._horizontalRevealRequest=new s(i.range.startLineNumber,i.range.startColumn,i.range.endColumn,this._context.viewLayout.getCurrentScrollTop(),t.scrollTop,i.scrollType):i.selections&&i.selections.length>0&&(this._horizontalRevealRequest=new a(i.selections,this._context.viewLayout.getCurrentScrollTop(),t.scrollTop,i.scrollType)):this._horizontalRevealRequest=null;const h=Math.abs(this._context.viewLayout.getCurrentScrollTop()-t.scrollTop)<=this._lineHeight?1:i.scrollType;return this._context.model.setScrollPosition(t,h),!0}onScrollChanged(i){if(this._horizontalRevealRequest&&i.scrollLeftChanged&&(this._horizontalRevealRequest=null),this._horizontalRevealRequest&&i.scrollTopChanged){const n=Math.min(this._horizontalRevealRequest.startScrollTop,this._horizontalRevealRequest.stopScrollTop),t=Math.max(this._horizontalRevealRequest.startScrollTop,this._horizontalRevealRequest.stopScrollTop);(i.scrollTopt)&&(this._horizontalRevealRequest=null)}return this.domNode.setWidth(i.scrollWidth),this._visibleLines.onScrollChanged(i)||!0}onTokensChanged(i){return this._visibleLines.onTokensChanged(i)}onZonesChanged(i){return this._context.model.setMaxLineWidth(this._maxLineWidth),this._visibleLines.onZonesChanged(i)}onThemeChanged(i){return this._onOptionsMaybeChanged()}getPositionFromDOMInfo(i,n){const t=this._getViewLineDomNode(i);if(t===null)return null;const l=this._getLineNumberFor(t);if(l===-1||l<1||l>this._context.model.getLineCount())return null;if(this._context.model.getLineMaxColumn(l)===1)return new d.Position(l,1);const h=this._visibleLines.getStartLineNumber(),m=this._visibleLines.getEndLineNumber();if(lm)return null;let _=this._visibleLines.getVisibleLine(l).getColumnOfNodeOffset(l,i,n);const f=this._context.model.getLineMinColumn(l);return _t?-1:this._visibleLines.getVisibleLine(i).getWidth()}linesVisibleRangesForRange(i,n){if(this.shouldRender())return null;const t=i.endLineNumber,l=g.Range.intersectRanges(i,this._lastRenderedData.getCurrentVisibleRange());if(!l)return null;let h=[],m=0;const _=new C.DomReadingContext(this.domNode.domNode,this._textRangeRestingSpot);let f=0;n&&(f=this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new d.Position(l.startLineNumber,1)).lineNumber);const v=this._visibleLines.getStartLineNumber(),y=this._visibleLines.getEndLineNumber();for(let L=l.startLineNumber;L<=l.endLineNumber;L++)if(!(Ly)){const I=L===l.startLineNumber?l.startColumn:1,k=L===l.endLineNumber?l.endColumn:this._context.model.getLineMaxColumn(L),E=this._visibleLines.getVisibleLine(L).getVisibleRangesForRange(I,k,_);if(!!E){if(n&&Lthis._visibleLines.getEndLineNumber()?null:this._visibleLines.getVisibleLine(i).getVisibleRangesForRange(n,t,new C.DomReadingContext(this.domNode.domNode,this._textRangeRestingSpot))}visibleRangeForPosition(i){const n=this._visibleRangesForLineRange(i.lineNumber,i.column,i.column);return n?new p.HorizontalPosition(n.outsideRenderedLine,n.ranges[0].left):null}updateLineWidths(){this._updateLineWidths(!1)}_updateLineWidthsFast(){return this._updateLineWidths(!0)}_updateLineWidthsSlow(){this._updateLineWidths(!1)}_updateLineWidths(i){const n=this._visibleLines.getStartLineNumber(),t=this._visibleLines.getEndLineNumber();let l=1,h=!0;for(let m=n;m<=t;m++){const _=this._visibleLines.getVisibleLine(m);if(i&&!_.getWidthIsFast()){h=!1;continue}l=Math.max(l,_.getWidth())}return h&&n===1&&t===this._context.model.getLineCount()&&(this._maxLineWidth=0),this._ensureMaxLineWidth(l),h}_checkMonospaceFontAssumptions(){let i=-1,n=-1;const t=this._visibleLines.getStartLineNumber(),l=this._visibleLines.getEndLineNumber();for(let h=t;h<=l;h++){const m=this._visibleLines.getVisibleLine(h);if(m.needsMonospaceFontCheck()){const _=m.getWidth();_>n&&(n=_,i=h)}}if(i!==-1&&!this._visibleLines.getVisibleLine(i).monospaceAssumptionsAreValid())for(let h=t;h<=l;h++)this._visibleLines.getVisibleLine(h).onMonospaceAssumptionsInvalidated()}prepareRender(){throw new Error("Not supported")}render(){throw new Error("Not supported")}renderText(i){if(this._visibleLines.renderLines(i),this._lastRenderedData.setCurrentVisibleRange(i.visibleRange),this.domNode.setWidth(this._context.viewLayout.getScrollWidth()),this.domNode.setHeight(Math.min(this._context.viewLayout.getScrollHeight(),1e6)),this._horizontalRevealRequest){const t=this._horizontalRevealRequest;if(i.startLineNumber<=t.minLineNumber&&t.maxLineNumber<=i.endLineNumber){this._horizontalRevealRequest=null,this.onDidRender();const l=this._computeScrollLeftToReveal(t);l&&(this._isViewportWrapping||this._ensureMaxLineWidth(l.maxHorizontalOffset),this._context.model.setScrollPosition({scrollLeft:l.scrollLeft},t.scrollType))}}if(this._updateLineWidthsFast()||this._asyncUpdateLineWidths.schedule(),b.isLinux&&!this._asyncCheckMonospaceFontAssumptions.isScheduled()){const t=this._visibleLines.getStartLineNumber(),l=this._visibleLines.getEndLineNumber();for(let h=t;h<=l;h++)if(this._visibleLines.getVisibleLine(h).needsMonospaceFontCheck()){this._asyncCheckMonospaceFontAssumptions.schedule();break}}this._linesContent.setLayerHinting(this._canUseLayerHinting),this._linesContent.setContain("strict");const n=this._context.viewLayout.getCurrentScrollTop()-i.bigNumbersDelta;this._linesContent.setTop(-n),this._linesContent.setLeft(-this._context.viewLayout.getCurrentScrollLeft())}_ensureMaxLineWidth(i){const n=Math.ceil(i);this._maxLineWidth0){let E=l[0].startLineNumber,T=l[0].endLineNumber;for(let O=1,A=l.length;O_){if(!v)return-1;k=y}else if(h===5||h===6)if(h===6&&m<=y&&L<=f)k=m;else{const E=Math.max(5*this._lineHeight,_*.2),T=y-E,O=L-_;k=Math.max(O,T)}else if(h===1||h===2)if(h===2&&m<=y&&L<=f)k=m;else{const E=(y+L)/2;k=Math.max(0,E-_/2)}else k=this._computeMinimumScrolling(m,f,y,L,h===3,h===4);return k}_computeScrollLeftToReveal(i){const n=this._context.viewLayout.getCurrentViewport(),t=n.left,l=t+n.width;let h=1073741824,m=0;if(i.type==="range"){const f=this._visibleRangesForLineRange(i.lineNumber,i.startColumn,i.endColumn);if(!f)return null;for(const v of f.ranges)h=Math.min(h,v.left),m=Math.max(m,v.left+v.width)}else for(const f of i.selections){if(f.startLineNumber!==f.endLineNumber)return null;const v=this._visibleRangesForLineRange(f.startLineNumber,f.startColumn,f.endColumn);if(!v)return null;for(const y of v.ranges)h=Math.min(h,y.left),m=Math.max(m,y.left+y.width)}return h=Math.max(0,h-u.HORIZONTAL_EXTRA_PX),m+=this._revealHorizontalRightPadding,i.type==="selections"&&m-h>n.width?null:{scrollLeft:this._computeMinimumScrolling(t,l,h,m),maxHorizontalOffset:m}}_computeMinimumScrolling(i,n,t,l,h,m){i=i|0,n=n|0,t=t|0,l=l|0,h=!!h,m=!!m;const _=n-i;if(l-t<_){if(h)return t;if(m)return Math.max(0,l-_);if(tn)return Math.max(0,l-_)}else return t;return i}}e.ViewLines=u,u.HORIZONTAL_EXTRA_PX=30}),define(Q[11],J([0,1,9,2,33,6,97,27]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Themable=e.registerThemingParticipant=e.Extensions=e.getThemeTypeSelector=e.ThemeIcon=e.themeColorFromId=e.ThemeColor=e.IThemeService=void 0,e.IThemeService=b.createDecorator("themeService");var d;(function(r){function i(n){return n&&typeof n=="object"&&typeof n.id=="string"}r.isThemeColor=i})(d=e.ThemeColor||(e.ThemeColor={}));function g(r){return{id:r}}e.themeColorFromId=g;var p;(function(r){function i(m){return m&&typeof m=="object"&&typeof m.id=="string"&&(typeof m.color=="undefined"||d.isThemeColor(m.color))}r.isThemeIcon=i;const n=new RegExp(`^\\$\\((${C.CSSIcon.iconNameExpression}(?:${C.CSSIcon.iconModifierExpression})?)\\)$`);function t(m){const _=n.exec(m);if(!!_){let[,f]=_;return{id:f}}}r.fromString=t;function l(m,_){let f=m.id;const v=f.lastIndexOf("~");return v!==-1&&(f=f.substring(0,v)),_&&(f=`${f}~${_}`),{id:f}}r.modify=l;function h(m,_){var f,v;return m.id===_.id&&((f=m.color)===null||f===void 0?void 0:f.id)===((v=_.color)===null||v===void 0?void 0:v.id)}r.isEqual=h,r.asClassNameArray=C.CSSIcon.asClassNameArray,r.asClassName=C.CSSIcon.asClassName,r.asCSSSelector=C.CSSIcon.asCSSSelector})(p=e.ThemeIcon||(e.ThemeIcon={}));function c(r){switch(r){case S.ColorScheme.DARK:return"vs-dark";case S.ColorScheme.HIGH_CONTRAST:return"hc-black";default:return"vs"}}e.getThemeTypeSelector=c,e.Extensions={ThemingContribution:"base.contributions.theming"};class o{constructor(){this.themingParticipants=[],this.themingParticipants=[],this.onThemingParticipantAddedEmitter=new w.Emitter}onColorThemeChange(i){return this.themingParticipants.push(i),this.onThemingParticipantAddedEmitter.fire(i),N.toDisposable(()=>{const n=this.themingParticipants.indexOf(i);this.themingParticipants.splice(n,1)})}getThemingParticipants(){return this.themingParticipants}}let s=new o;M.Registry.add(e.Extensions.ThemingContribution,s);function a(r){return s.onColorThemeChange(r)}e.registerThemingParticipant=a;class u extends N.Disposable{constructor(i){super();this.themeService=i,this.theme=i.getColorTheme(),this._register(this.themeService.onDidColorThemeChange(n=>this.onThemeChange(n)))}onThemeChange(i){this.theme=i,this.updateStyles()}updateStyles(){}}e.Themable=u}),define(Q[583],J([0,1,7,2,8,24,362,107,53,11]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DecorationTypeOptionsProvider=e.DecorationSubTypeOptionsProvider=e.CodeEditorServiceImpl=e.GlobalStyleSheet=e.RefCountedStyleSheet=void 0;class p{constructor(t,l,h){this._parent=t,this._editorId=l,this._styleSheet=h,this._refCount=0}ref(){this._refCount++}unref(){var t;this._refCount--,this._refCount===0&&((t=this._styleSheet.parentNode)===null||t===void 0||t.removeChild(this._styleSheet),this._parent._removeEditorStyleSheets(this._editorId))}insertRule(t,l){this._styleSheet.sheet.insertRule(t,l)}removeRulesContainingSelector(t){b.removeCSSRulesContainingSelector(t,this._styleSheet)}}e.RefCountedStyleSheet=p;class c{constructor(t){this._styleSheet=t}ref(){}unref(){}insertRule(t,l){this._styleSheet.sheet.insertRule(t,l)}removeRulesContainingSelector(t){b.removeCSSRulesContainingSelector(t,this._styleSheet)}}e.GlobalStyleSheet=c;let o=class extends S.AbstractCodeEditorService{constructor(t,l){super();this._decorationOptionProviders=new Map,this._editorStyleSheets=new Map,this._globalStyleSheet=t||null,this._themeService=l}_getOrCreateGlobalStyleSheet(){return this._globalStyleSheet||(this._globalStyleSheet=new c(b.createStyleSheet())),this._globalStyleSheet}_getOrCreateStyleSheet(t){if(!t)return this._getOrCreateGlobalStyleSheet();const l=t.getContainerDomNode();if(!b.isInShadowDOM(l))return this._getOrCreateGlobalStyleSheet();const h=t.getId();if(!this._editorStyleSheets.has(h)){const m=new p(this,h,b.createStyleSheet(l));this._editorStyleSheets.set(h,m)}return this._editorStyleSheets.get(h)}_removeEditorStyleSheets(t){this._editorStyleSheets.delete(t)}registerDecorationType(t,l,h,m){let _=this._decorationOptionProviders.get(t);if(!_){const f=this._getOrCreateStyleSheet(m),v={styleSheet:f,key:t,parentTypeKey:h,options:l||Object.create(null)};h?_=new s(this._themeService,f,v):_=new a(this._themeService,f,v),this._decorationOptionProviders.set(t,_),this._onDecorationTypeRegistered.fire(t)}_.refCount++}removeDecorationType(t){const l=this._decorationOptionProviders.get(t);l&&(l.refCount--,l.refCount<=0&&(this._decorationOptionProviders.delete(t),l.dispose(),this.listCodeEditors().forEach(h=>h.removeDecorations(t))))}resolveDecorationOptions(t,l){const h=this._decorationOptionProviders.get(t);if(!h)throw new Error("Unknown decoration type key: "+t);return h.getOptions(this,l)}};o=Me([_e(1,g.IThemeService)],o),e.CodeEditorServiceImpl=o;class s{constructor(t,l,h){this._styleSheet=l,this._styleSheet.ref(),this._parentTypeKey=h.parentTypeKey,this.refCount=0,this._beforeContentRules=new r(3,h,t),this._afterContentRules=new r(4,h,t)}getOptions(t,l){const h=t.resolveDecorationOptions(this._parentTypeKey,!0);return this._beforeContentRules&&(h.beforeContentClassName=this._beforeContentRules.className),this._afterContentRules&&(h.afterContentClassName=this._afterContentRules.className),h}dispose(){this._beforeContentRules&&(this._beforeContentRules.dispose(),this._beforeContentRules=null),this._afterContentRules&&(this._afterContentRules.dispose(),this._afterContentRules=null),this._styleSheet.unref()}}e.DecorationSubTypeOptionsProvider=s;class a{constructor(t,l,h){this._disposables=new N.DisposableStore,this._styleSheet=l,this._styleSheet.ref(),this.refCount=0;const m=I=>{const k=new r(I,h,t);if(this._disposables.add(k),k.hasContent)return k.className},_=I=>{const k=new r(I,h,t);return this._disposables.add(k),k.hasContent?{className:k.className,hasLetterSpacing:k.hasLetterSpacing}:null};this.className=m(0);const f=_(1);f&&(this.inlineClassName=f.className,this.inlineClassNameAffectsLetterSpacing=f.hasLetterSpacing),this.beforeContentClassName=m(3),this.afterContentClassName=m(4),this.glyphMarginClassName=m(2);const v=h.options;this.isWholeLine=Boolean(v.isWholeLine),this.stickiness=v.rangeBehavior;const y=v.light&&v.light.overviewRulerColor||v.overviewRulerColor,L=v.dark&&v.dark.overviewRulerColor||v.overviewRulerColor;(typeof y!="undefined"||typeof L!="undefined")&&(this.overviewRuler={color:y||L,darkColor:L||y,position:v.overviewRulerLane||d.OverviewRulerLane.Center})}getOptions(t,l){return l?{inlineClassName:this.inlineClassName,beforeContentClassName:this.beforeContentClassName,afterContentClassName:this.afterContentClassName,className:this.className,glyphMarginClassName:this.glyphMarginClassName,isWholeLine:this.isWholeLine,overviewRuler:this.overviewRuler,stickiness:this.stickiness}:this}dispose(){this._disposables.dispose(),this._styleSheet.unref()}}e.DecorationTypeOptionsProvider=a;const u={color:"color:{0} !important;",opacity:"opacity:{0};",backgroundColor:"background-color:{0};",outline:"outline:{0};",outlineColor:"outline-color:{0};",outlineStyle:"outline-style:{0};",outlineWidth:"outline-width:{0};",border:"border:{0};",borderColor:"border-color:{0};",borderRadius:"border-radius:{0};",borderSpacing:"border-spacing:{0};",borderStyle:"border-style:{0};",borderWidth:"border-width:{0};",fontStyle:"font-style:{0};",fontWeight:"font-weight:{0};",fontSize:"font-size:{0};",fontFamily:"font-family:{0};",textDecoration:"text-decoration:{0};",cursor:"cursor:{0};",letterSpacing:"letter-spacing:{0};",gutterIconPath:"background:{0} center center no-repeat;",gutterIconSize:"background-size:{0};",contentText:"content:'{0}';",contentIconPath:"content:{0};",margin:"margin:{0};",padding:"padding:{0};",width:"width:{0};",height:"height:{0};"};class r{constructor(t,l,h){this._theme=h.getColorTheme(),this._ruleType=t,this._providerArgs=l,this._usesThemeColors=!1,this._hasContent=!1,this._hasLetterSpacing=!1;let m=i.getClassName(this._providerArgs.key,t);this._providerArgs.parentTypeKey&&(m=m+" "+i.getClassName(this._providerArgs.parentTypeKey,t)),this._className=m,this._unThemedSelector=i.getSelector(this._providerArgs.key,this._providerArgs.parentTypeKey,t),this._buildCSS(),this._usesThemeColors?this._themeListener=h.onDidColorThemeChange(_=>{this._theme=h.getColorTheme(),this._removeCSS(),this._buildCSS()}):this._themeListener=null}dispose(){this._hasContent&&(this._removeCSS(),this._hasContent=!1),this._themeListener&&(this._themeListener.dispose(),this._themeListener=null)}get hasContent(){return this._hasContent}get hasLetterSpacing(){return this._hasLetterSpacing}get className(){return this._className}_buildCSS(){const t=this._providerArgs.options;let l,h,m;switch(this._ruleType){case 0:l=this.getCSSTextForModelDecorationClassName(t),h=this.getCSSTextForModelDecorationClassName(t.light),m=this.getCSSTextForModelDecorationClassName(t.dark);break;case 1:l=this.getCSSTextForModelDecorationInlineClassName(t),h=this.getCSSTextForModelDecorationInlineClassName(t.light),m=this.getCSSTextForModelDecorationInlineClassName(t.dark);break;case 2:l=this.getCSSTextForModelDecorationGlyphMarginClassName(t),h=this.getCSSTextForModelDecorationGlyphMarginClassName(t.light),m=this.getCSSTextForModelDecorationGlyphMarginClassName(t.dark);break;case 3:l=this.getCSSTextForModelDecorationContentClassName(t.before),h=this.getCSSTextForModelDecorationContentClassName(t.light&&t.light.before),m=this.getCSSTextForModelDecorationContentClassName(t.dark&&t.dark.before);break;case 4:l=this.getCSSTextForModelDecorationContentClassName(t.after),h=this.getCSSTextForModelDecorationContentClassName(t.light&&t.light.after),m=this.getCSSTextForModelDecorationContentClassName(t.dark&&t.dark.after);break;default:throw new Error("Unknown rule type: "+this._ruleType)}const _=this._providerArgs.styleSheet;let f=!1;l.length>0&&(_.insertRule(`${this._unThemedSelector} {${l}}`,0),f=!0),h.length>0&&(_.insertRule(`.vs${this._unThemedSelector} {${h}}`,0),f=!0),m.length>0&&(_.insertRule(`.vs-dark${this._unThemedSelector}, .hc-black${this._unThemedSelector} {${m}}`,0),f=!0),this._hasContent=f}_removeCSS(){this._providerArgs.styleSheet.removeRulesContainingSelector(this._unThemedSelector)}getCSSTextForModelDecorationClassName(t){if(!t)return"";const l=[];return this.collectCSSText(t,["backgroundColor"],l),this.collectCSSText(t,["outline","outlineColor","outlineStyle","outlineWidth"],l),this.collectBorderSettingsCSSText(t,l),l.join("")}getCSSTextForModelDecorationInlineClassName(t){if(!t)return"";const l=[];return this.collectCSSText(t,["fontStyle","fontWeight","textDecoration","cursor","color","opacity","letterSpacing"],l),t.letterSpacing&&(this._hasLetterSpacing=!0),l.join("")}getCSSTextForModelDecorationContentClassName(t){if(!t)return"";const l=[];if(typeof t!="undefined"){if(this.collectBorderSettingsCSSText(t,l),typeof t.contentIconPath!="undefined"&&l.push(M.format(u.contentIconPath,b.asCSSUrl(w.URI.revive(t.contentIconPath)))),typeof t.contentText=="string"){const m=t.contentText.match(/^.*$/m)[0].replace(/['\\]/g,"\\$&");l.push(M.format(u.contentText,m))}this.collectCSSText(t,["fontStyle","fontWeight","fontSize","fontFamily","textDecoration","color","opacity","backgroundColor","margin","padding"],l),this.collectCSSText(t,["width","height"],l)&&l.push("display:inline-block;")}return l.join("")}getCSSTextForModelDecorationGlyphMarginClassName(t){if(!t)return"";const l=[];return typeof t.gutterIconPath!="undefined"&&(l.push(M.format(u.gutterIconPath,b.asCSSUrl(w.URI.revive(t.gutterIconPath)))),typeof t.gutterIconSize!="undefined"&&l.push(M.format(u.gutterIconSize,t.gutterIconSize))),l.join("")}collectBorderSettingsCSSText(t,l){return this.collectCSSText(t,["border","borderColor","borderRadius","borderSpacing","borderStyle","borderWidth"],l)?(l.push(M.format("box-sizing: border-box;")),!0):!1}collectCSSText(t,l,h){const m=h.length;for(let _ of l){const f=this.resolveValue(t[_]);typeof f=="string"&&h.push(M.format(u[_],f))}return h.length!==m}resolveValue(t){if(C.isThemeColor(t)){this._usesThemeColors=!0;const l=this._theme.getColor(t.id);return l?l.toString():"transparent"}return t}}class i{static getClassName(t,l){return"ced-"+t+"-"+l}static getSelector(t,l,h){let m=".monaco-editor ."+this.getClassName(t,h);return l&&(m=m+"."+this.getClassName(l,h)),h===3?m+="::before":h===4&&(m+="::after"),m}}}),define(Q[584],J([0,1,7,30,61,45,11]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorScrollbar=void 0;class C extends w.ViewPart{constructor(g,p,c,o){super(g);const s=this._context.configuration.options,a=s.get(87),u=s.get(61),r=s.get(30),i=s.get(90),n={listenOnDomNode:c.domNode,className:"editor-scrollable "+S.getThemeTypeSelector(g.theme.type),useShadows:!1,lazyRender:!0,vertical:a.vertical,horizontal:a.horizontal,verticalHasArrows:a.verticalHasArrows,horizontalHasArrows:a.horizontalHasArrows,verticalScrollbarSize:a.verticalScrollbarSize,verticalSliderSize:a.verticalSliderSize,horizontalScrollbarSize:a.horizontalScrollbarSize,horizontalSliderSize:a.horizontalSliderSize,handleMouseWheel:a.handleMouseWheel,alwaysConsumeMouseWheel:a.alwaysConsumeMouseWheel,arrowSize:a.arrowSize,mouseWheelScrollSensitivity:u,fastScrollSensitivity:r,scrollPredominantAxis:i,scrollByPage:a.scrollByPage};this.scrollbar=this._register(new M.SmoothScrollableElement(p.domNode,n,this._context.viewLayout.getScrollable())),w.PartFingerprints.write(this.scrollbar.getDomNode(),5),this.scrollbarDomNode=N.createFastDomNode(this.scrollbar.getDomNode()),this.scrollbarDomNode.setPosition("absolute"),this._setLayout();const t=(l,h,m)=>{const _={};if(h){const f=l.scrollTop;f&&(_.scrollTop=this._context.viewLayout.getCurrentScrollTop()+f,l.scrollTop=0)}if(m){const f=l.scrollLeft;f&&(_.scrollLeft=this._context.viewLayout.getCurrentScrollLeft()+f,l.scrollLeft=0)}this._context.model.setScrollPosition(_,1)};this._register(b.addDisposableListener(c.domNode,"scroll",l=>t(c.domNode,!0,!0))),this._register(b.addDisposableListener(p.domNode,"scroll",l=>t(p.domNode,!0,!1))),this._register(b.addDisposableListener(o.domNode,"scroll",l=>t(o.domNode,!0,!1))),this._register(b.addDisposableListener(this.scrollbarDomNode.domNode,"scroll",l=>t(this.scrollbarDomNode.domNode,!0,!1)))}dispose(){super.dispose()}_setLayout(){const g=this._context.configuration.options,p=g.get(124);this.scrollbarDomNode.setLeft(p.contentLeft),g.get(59).side==="right"?this.scrollbarDomNode.setWidth(p.contentWidth+p.minimap.minimapWidth):this.scrollbarDomNode.setWidth(p.contentWidth),this.scrollbarDomNode.setHeight(p.height)}getOverviewRulerLayoutInfo(){return this.scrollbar.getOverviewRulerLayoutInfo()}getDomNode(){return this.scrollbarDomNode}delegateVerticalScrollbarMouseDown(g){this.scrollbar.delegateVerticalScrollbarMouseDown(g)}onConfigurationChanged(g){if(g.hasChanged(87)||g.hasChanged(61)||g.hasChanged(30)){const p=this._context.configuration.options,c=p.get(87),o=p.get(61),s=p.get(30),a=p.get(90),u={handleMouseWheel:c.handleMouseWheel,mouseWheelScrollSensitivity:o,fastScrollSensitivity:s,scrollPredominantAxis:a};this.scrollbar.updateOptions(u)}return g.hasChanged(124)&&this._setLayout(),!0}onScrollChanged(g){return!0}onThemeChanged(g){return this.scrollbar.updateClassName("editor-scrollable "+S.getThemeTypeSelector(this._context.theme.type)),!0}prepareRender(g){}render(g){this.scrollbar.renderNow()}}e.EditorScrollbar=C}),define(Q[585],J([0,1,7,30,90,2,17,8,165,45,38,3,216,244,63,22,11,21,60,365,53,88,326]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Minimap=void 0;const m=140,_=2;class f{constructor(A,B,F){const D=A.options,R=D.get(122),W=D.get(124),x=W.minimap,K=D.get(38),Y=D.get(59);this.renderMinimap=x.renderMinimap,this.size=Y.size,this.minimapHeightIsEditorHeight=x.minimapHeightIsEditorHeight,this.scrollBeyondLastLine=D.get(89),this.showSlider=Y.showSlider,this.pixelRatio=R,this.typicalHalfwidthCharacterWidth=K.typicalHalfwidthCharacterWidth,this.lineHeight=D.get(53),this.minimapLeft=x.minimapLeft,this.minimapWidth=x.minimapWidth,this.minimapHeight=W.height,this.canvasInnerWidth=x.minimapCanvasInnerWidth,this.canvasInnerHeight=x.minimapCanvasInnerHeight,this.canvasOuterWidth=x.minimapCanvasOuterWidth,this.canvasOuterHeight=x.minimapCanvasOuterHeight,this.isSampling=x.minimapIsSampling,this.editorHeight=W.height,this.fontScale=x.minimapScale,this.minimapLineHeight=x.minimapLineHeight,this.minimapCharWidth=1*this.fontScale,this.charRenderer=h.once(()=>t.MinimapCharRendererFactory.create(this.fontScale,K.fontFamily)),this.backgroundColor=f._getMinimapBackground(B,F)}static _getMinimapBackground(A,B){const F=A.getColor(u.minimapBackground);return F?new o.RGBA8(F.rgba.r,F.rgba.g,F.rgba.b,F.rgba.a):B.getColor(2)}equals(A){return this.renderMinimap===A.renderMinimap&&this.size===A.size&&this.minimapHeightIsEditorHeight===A.minimapHeightIsEditorHeight&&this.scrollBeyondLastLine===A.scrollBeyondLastLine&&this.showSlider===A.showSlider&&this.pixelRatio===A.pixelRatio&&this.typicalHalfwidthCharacterWidth===A.typicalHalfwidthCharacterWidth&&this.lineHeight===A.lineHeight&&this.minimapLeft===A.minimapLeft&&this.minimapWidth===A.minimapWidth&&this.minimapHeight===A.minimapHeight&&this.canvasInnerWidth===A.canvasInnerWidth&&this.canvasInnerHeight===A.canvasInnerHeight&&this.canvasOuterWidth===A.canvasOuterWidth&&this.canvasOuterHeight===A.canvasOuterHeight&&this.isSampling===A.isSampling&&this.editorHeight===A.editorHeight&&this.fontScale===A.fontScale&&this.minimapLineHeight===A.minimapLineHeight&&this.minimapCharWidth===A.minimapCharWidth&&this.backgroundColor&&this.backgroundColor.equals(A.backgroundColor)}}class v{constructor(A,B,F,D,R,W,x,K){this.scrollTop=A,this.scrollHeight=B,this.sliderNeeded=F,this._computedSliderRatio=D,this.sliderTop=R,this.sliderHeight=W,this.startLineNumber=x,this.endLineNumber=K}getDesiredScrollTopFromDelta(A){return Math.round(this.scrollTop+A/this._computedSliderRatio)}getDesiredScrollTopFromTouchLocation(A){return Math.round((A-this.sliderHeight/2)/this._computedSliderRatio)}static create(A,B,F,D,R,W,x,K,Y,ee,se){const ne=A.pixelRatio,le=A.minimapLineHeight,X=Math.floor(A.canvasInnerHeight/le),z=A.lineHeight;if(A.minimapHeightIsEditorHeight){const ie=K*A.lineHeight+(A.scrollBeyondLastLine?R-A.lineHeight:0),oe=Math.max(1,Math.floor(R*R/ie)),ae=Math.max(0,A.minimapHeight-oe),G=ae/(ee-R),j=Y*G,te=ae>0,Z=Math.floor(A.canvasInnerHeight/A.minimapLineHeight);return new v(Y,ee,te,G,j,oe,1,Math.min(x,Z))}let P;if(W&&F!==x){const ie=F-B+1;P=Math.floor(ie*le/ne)}else{const ie=R/z;P=Math.floor(ie*le/ne)}let V;A.scrollBeyondLastLine?V=(x-1)*le/ne:V=Math.max(0,x*le/ne-P),V=Math.min(A.minimapHeight-P,V);const U=V/(ee-R),H=Y*U;let $=0;if(A.scrollBeyondLastLine&&($=R/z-1),X>=x+$){const ie=1,oe=x,ae=V>0;return new v(Y,ee,ae,U,H,P,ie,oe)}else{let ie=Math.max(1,Math.floor(B-H*ne/le));se&&se.scrollHeight===ee&&(se.scrollTop>Y&&(ie=Math.min(ie,se.startLineNumber)),se.scrollTopy.INVALID),this._renderedLines._set(A.startLineNumber,F)}linesEquals(A){if(!this.scrollEquals(A))return!1;const F=this._renderedLines._get().lines;for(let D=0,R=F.length;D1){for(let $=0,ie=x-1;$0&&this.minimapLines[F-1]>=A;)F--;let D=this.modelLineToMinimapLine(B)-1;for(;D+1B)return null}return[F+1,D+1]}decorationLineRangeToMinimapLineRange(A,B){let F=this.modelLineToMinimapLine(A),D=this.modelLineToMinimapLine(B);return A!==B&&D===F&&(D===this.minimapLines.length?F>1&&F--:D++),[F,D]}onLinesDeleted(A){const B=A.toLineNumber-A.fromLineNumber+1;let F=this.minimapLines.length,D=0;for(let R=this.minimapLines.length-1;R>=0&&!(this.minimapLines[R]=0&&!(this.minimapLines[F]0,scrollWidth:A.scrollWidth,scrollHeight:A.scrollHeight,viewportStartLineNumber:B,viewportEndLineNumber:F,viewportStartLineNumberVerticalOffset:A.getVerticalOffsetForLineNumber(B),scrollTop:A.scrollTop,scrollLeft:A.scrollLeft,viewportWidth:A.viewportWidth,viewportHeight:A.viewportHeight};this._actual.render(D)}_recreateLineSampling(){this._minimapSelections=null;const A=Boolean(this._samplingState),[B,F]=k.compute(this.options,this._context.model.getLineCount(),this._samplingState);if(this._samplingState=B,A&&this._samplingState)for(const D of F)switch(D.type){case"deleted":this._actual.onLinesDeleted(D.deleteFromLineNumber,D.deleteToLineNumber);break;case"inserted":this._actual.onLinesInserted(D.insertFromLineNumber,D.insertToLineNumber);break;case"flush":this._actual.onFlushed();break}}getLineCount(){return this._samplingState?this._samplingState.minimapLines.length:this._context.model.getLineCount()}getRealLineCount(){return this._context.model.getLineCount()}getLineContent(A){return this._samplingState?this._context.model.getLineContent(this._samplingState.minimapLines[A-1]):this._context.model.getLineContent(A)}getMinimapLinesRenderingData(A,B,F){if(this._samplingState){let D=[];for(let R=0,W=B-A+1;R{if(F.preventDefault(),this._model.options.renderMinimap!==0&&!!this._lastRenderData){if(this._model.options.size!=="proportional"){if(F.leftButton&&this._lastRenderData){const Y=b.getDomNodePagePosition(this._slider.domNode),ee=Y.top+Y.height/2;this._startSliderDragging(F.buttons,F.posx,ee,F.posy,this._lastRenderData.renderedLayout)}return}const R=this._model.options.minimapLineHeight,W=this._model.options.canvasInnerHeight/this._model.options.canvasOuterHeight*F.browserEvent.offsetY;let K=Math.floor(W/R)+this._lastRenderData.renderedLayout.startLineNumber;K=Math.min(K,this._model.getLineCount()),this._model.revealLineNumber(K)}}),this._sliderMouseMoveMonitor=new M.GlobalMouseMoveMonitor,this._sliderMouseDownListener=b.addStandardDisposableListener(this._slider.domNode,"mousedown",F=>{F.preventDefault(),F.stopPropagation(),F.leftButton&&this._lastRenderData&&this._startSliderDragging(F.buttons,F.posx,F.posy,F.posy,this._lastRenderData.renderedLayout)}),this._gestureDisposable=n.Gesture.addTarget(this._domNode.domNode),this._sliderTouchStartListener=b.addDisposableListener(this._domNode.domNode,n.EventType.Start,F=>{F.preventDefault(),F.stopPropagation(),this._lastRenderData&&(this._slider.toggleClassName("active",!0),this._gestureInProgress=!0,this.scrollDueToTouchEvent(F))},{passive:!1}),this._sliderTouchMoveListener=b.addDisposableListener(this._domNode.domNode,n.EventType.Change,F=>{F.preventDefault(),F.stopPropagation(),this._lastRenderData&&this._gestureInProgress&&this.scrollDueToTouchEvent(F)},{passive:!1}),this._sliderTouchEndListener=b.addStandardDisposableListener(this._domNode.domNode,n.EventType.End,F=>{F.preventDefault(),F.stopPropagation(),this._gestureInProgress=!1,this._slider.toggleClassName("active",!1)})}_startSliderDragging(A,B,F,D,R){this._slider.toggleClassName("active",!0);const W=(x,K)=>{const Y=Math.abs(K-B);if(S.isWindows&&Y>m){this._model.setScrollTop(R.scrollTop);return}const ee=x-F;this._model.setScrollTop(R.getDesiredScrollTopFromDelta(ee))};D!==F&&W(D,B),this._sliderMouseMoveMonitor.startMonitoring(this._slider.domNode,A,M.standardMouseMoveMerger,x=>W(x.posy,x.posx),()=>{this._slider.toggleClassName("active",!1)})}scrollDueToTouchEvent(A){const B=this._domNode.domNode.getBoundingClientRect().top,F=this._lastRenderData.renderedLayout.getDesiredScrollTopFromTouchLocation(A.pageY-B);this._model.setScrollTop(F)}dispose(){this._mouseDownListener.dispose(),this._sliderMouseMoveMonitor.dispose(),this._sliderMouseDownListener.dispose(),this._gestureDisposable.dispose(),this._sliderTouchStartListener.dispose(),this._sliderTouchMoveListener.dispose(),this._sliderTouchEndListener.dispose(),super.dispose()}_getMinimapDomNodeClassName(){return this._model.options.showSlider==="always"?"minimap slider-always":"minimap slider-mouseover"}getDomNode(){return this._domNode}_applyLayout(){this._domNode.setLeft(this._model.options.minimapLeft),this._domNode.setWidth(this._model.options.minimapWidth),this._domNode.setHeight(this._model.options.minimapHeight),this._shadow.setHeight(this._model.options.minimapHeight),this._canvas.setWidth(this._model.options.canvasOuterWidth),this._canvas.setHeight(this._model.options.canvasOuterHeight),this._canvas.domNode.width=this._model.options.canvasInnerWidth,this._canvas.domNode.height=this._model.options.canvasInnerHeight,this._decorationsCanvas.setWidth(this._model.options.canvasOuterWidth),this._decorationsCanvas.setHeight(this._model.options.canvasOuterHeight),this._decorationsCanvas.domNode.width=this._model.options.canvasInnerWidth,this._decorationsCanvas.domNode.height=this._model.options.canvasInnerHeight,this._slider.setWidth(this._model.options.minimapWidth)}_getBuffer(){return this._buffers||this._model.options.canvasInnerWidth>0&&this._model.options.canvasInnerHeight>0&&(this._buffers=new I(this._canvas.domNode.getContext("2d"),this._model.options.canvasInnerWidth,this._model.options.canvasInnerHeight,this._model.options.backgroundColor)),this._buffers?this._buffers.getBuffer():null}onDidChangeOptions(){this._lastRenderData=null,this._buffers=null,this._applyLayout(),this._domNode.setClassName(this._getMinimapDomNodeClassName())}onSelectionChanged(){return this._renderDecorations=!0,!0}onDecorationsChanged(){return this._renderDecorations=!0,!0}onFlushed(){return this._lastRenderData=null,!0}onLinesChanged(A,B){return this._lastRenderData?this._lastRenderData.onLinesChanged(A,B):!1}onLinesDeleted(A,B){return this._lastRenderData&&this._lastRenderData.onLinesDeleted(A,B),!0}onLinesInserted(A,B){return this._lastRenderData&&this._lastRenderData.onLinesInserted(A,B),!0}onScrollChanged(){return this._renderDecorations=!0,!0}onThemeChanged(){return this._selectionColor=this._theme.getColor(u.minimapSelection),this._renderDecorations=!0,!0}onTokensChanged(A){return this._lastRenderData?this._lastRenderData.onTokensChanged(A):!1}onTokensColorsChanged(){return this._lastRenderData=null,this._buffers=null,!0}onZonesChanged(){return this._lastRenderData=null,!0}render(A){if(this._model.options.renderMinimap===0){this._shadow.setClassName("minimap-shadow-hidden"),this._sliderHorizontal.setWidth(0),this._sliderHorizontal.setHeight(0);return}A.scrollLeft+A.viewportWidth>=A.scrollWidth?this._shadow.setClassName("minimap-shadow-hidden"):this._shadow.setClassName("minimap-shadow-visible");const F=v.create(this._model.options,A.viewportStartLineNumber,A.viewportEndLineNumber,A.viewportStartLineNumberVerticalOffset,A.viewportHeight,A.viewportContainsWhitespaceGaps,this._model.getLineCount(),this._model.getRealLineCount(),A.scrollTop,A.scrollHeight,this._lastRenderData?this._lastRenderData.renderedLayout:null);this._slider.setDisplay(F.sliderNeeded?"block":"none"),this._slider.setTop(F.sliderTop),this._slider.setHeight(F.sliderHeight);const D=A.scrollLeft/this._model.options.typicalHalfwidthCharacterWidth,R=Math.min(this._model.options.minimapWidth,Math.round(D*this._model.options.minimapCharWidth/this._model.options.pixelRatio));this._sliderHorizontal.setLeft(R),this._sliderHorizontal.setWidth(this._model.options.minimapWidth-R),this._sliderHorizontal.setTop(0),this._sliderHorizontal.setHeight(F.sliderHeight),this.renderDecorations(F),this._lastRenderData=this.renderLines(F)}renderDecorations(A){if(this._renderDecorations){this._renderDecorations=!1;const B=this._model.getSelections(),F=this._model.getMinimapDecorationsInViewport(A.startLineNumber,A.endLineNumber),{canvasInnerWidth:D,canvasInnerHeight:R}=this._model.options,W=this._model.options.minimapLineHeight,x=this._model.options.minimapCharWidth,K=this._model.getOptions().tabSize,Y=this._decorationsCanvas.domNode.getContext("2d");Y.clearRect(0,0,D,R);const ee=new Map;for(let se=0;sethis._model.options.canvasInnerHeight)){let ne=B.get(W);const le=!ne;if(!ne){const $=this._model.getLineContent(W);ne=[p.MINIMAP_GUTTER_WIDTH];for(let ie=1;ie<$.length+1;ie++){const oe=$.charCodeAt(ie-1),ae=oe===9?Y*ee:C.isFullWidthCharacter(oe)?2*ee:ee;ne[ie]=ne[ie-1]+ae}B.set(W,ne)}const{startColumn:X,endColumn:z,startLineNumber:P,endLineNumber:V}=F,U=P===W?ne[X-1]:p.MINIMAP_GUTTER_WIDTH,H=V>W?ne.length-1:z-1;if(H>0){const $=ne[H]-U||2;this.renderDecoration(A,D,U,se,$,x)}le&&this.renderLineHighlight(A,D,se,x)}}renderLineHighlight(A,B,F,D){A.fillStyle=B&&B.transparent(.5).toString()||"",A.fillRect(p.MINIMAP_GUTTER_WIDTH,F,A.canvas.width,D)}renderDecoration(A,B,F,D,R,W){A.fillStyle=B&&B.toString()||"",A.fillRect(F,D,R,W)}renderLines(A){const B=A.startLineNumber,F=A.endLineNumber,D=this._model.options.minimapLineHeight;if(this._lastRenderData&&this._lastRenderData.linesEquals(A)){const Z=this._lastRenderData._get();return new L(A,Z.imageData,Z.lines)}const R=this._getBuffer();if(!R)return null;let[W,x,K]=T._renderUntouchedLines(R,B,F,D,this._lastRenderData);const Y=this._model.getMinimapLinesRenderingData(B,F,K),ee=this._model.getOptions().tabSize,se=this._model.options.backgroundColor,ne=this._model.tokensColorTracker,le=ne.backgroundIsLight(),X=this._model.options.renderMinimap,z=this._model.options.charRenderer(),P=this._model.options.fontScale,V=this._model.options.minimapCharWidth,H=(X===1?2:2+1)*P,$=D>H?Math.floor((D-H)/2):0;let ie=0;const oe=[];for(let Z=0,ue=F-B+1;Z=0&&teP)return;const te=X.charCodeAt(H);if(te===9){const Z=ee-(H+$)%ee;$+=Z-1,U+=Z*R}else if(te===32)U+=R;else{const Z=C.isFullWidthCharacter(te)?2:1;for(let ue=0;ueP)return}}}}}r.registerThemingParticipant((O,A)=>{const B=O.getColor(u.minimapBackground);B&&A.addRule(`.monaco-editor .minimap > canvas { opacity: ${B.rgba.a}; will-change: opacity; }`);const F=O.getColor(u.minimapSliderBackground);F&&A.addRule(`.monaco-editor .minimap-slider .minimap-slider-horizontal { background: ${F}; }`);const D=O.getColor(u.minimapSliderHoverBackground);D&&A.addRule(`.monaco-editor .minimap-slider:hover .minimap-slider-horizontal { background: ${D}; }`);const R=O.getColor(u.minimapSliderActiveBackground);R&&A.addRule(`.monaco-editor .minimap-slider.active .minimap-slider-horizontal { background: ${R}; }`);const W=O.getColor(u.scrollbarShadow);W&&A.addRule(`.monaco-editor .minimap-shadow-visible { box-shadow: ${W} -6px 0 6px -6px inset; }`)})}),define(Q[586],J([0,1,30,45,22,11,329]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ScrollDecorationViewPart=void 0;class S extends N.ViewPart{constructor(d){super(d);this._scrollTop=0,this._width=0,this._updateWidth(),this._shouldShow=!1;const p=this._context.configuration.options.get(87);this._useShadows=p.useShadows,this._domNode=b.createFastDomNode(document.createElement("div")),this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true")}dispose(){super.dispose()}_updateShouldShow(){const d=this._useShadows&&this._scrollTop>0;return this._shouldShow!==d?(this._shouldShow=d,!0):!1}getDomNode(){return this._domNode}_updateWidth(){const g=this._context.configuration.options.get(124);g.minimap.renderMinimap===0||g.minimap.minimapWidth>0&&g.minimap.minimapLeft===0?this._width=g.width:this._width=g.width-g.minimap.minimapWidth-g.verticalScrollbarWidth}onConfigurationChanged(d){const p=this._context.configuration.options.get(87);return this._useShadows=p.useShadows,this._updateWidth(),this._updateShouldShow(),!0}onScrollChanged(d){return this._scrollTop=d.scrollTop,this._updateShouldShow()}prepareRender(d){}render(d){this._domNode.setWidth(this._width),this._domNode.setClassName(this._shouldShow?"scroll-decoration":"")}}e.ScrollDecorationViewPart=S,w.registerThemingParticipant((C,d)=>{const g=C.getColor(M.scrollbarShadow);g&&d.addRule(`.monaco-editor .scroll-decoration { box-shadow: ${g} 0 6px 6px -6px inset; }`)})}),define(Q[587],J([0,1,94,22,11,330]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectionsOverlay=void 0;class w{constructor(o){this.left=o.left,this.width=o.width,this.startStyle=null,this.endStyle=null}}class S{constructor(o,s){this.lineNumber=o,this.ranges=s}}function C(c){return new w(c)}function d(c){return new S(c.lineNumber,c.ranges.map(C))}class g extends b.DynamicViewOverlay{constructor(o){super();this._previousFrameVisibleRangesWithStyle=[],this._context=o;const s=this._context.configuration.options;this._lineHeight=s.get(53),this._roundedSelection=s.get(85),this._typicalHalfwidthCharacterWidth=s.get(38).typicalHalfwidthCharacterWidth,this._selections=[],this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(o){const s=this._context.configuration.options;return this._lineHeight=s.get(53),this._roundedSelection=s.get(85),this._typicalHalfwidthCharacterWidth=s.get(38).typicalHalfwidthCharacterWidth,!0}onCursorStateChanged(o){return this._selections=o.selections.slice(0),!0}onDecorationsChanged(o){return!0}onFlushed(o){return!0}onLinesChanged(o){return!0}onLinesDeleted(o){return!0}onLinesInserted(o){return!0}onScrollChanged(o){return o.scrollTopChanged}onZonesChanged(o){return!0}_visibleRangesHaveGaps(o){for(let s=0,a=o.length;s1)return!0;return!1}_enrichVisibleRangesWithStyle(o,s,a){const u=this._typicalHalfwidthCharacterWidth/4;let r=null,i=null;if(a&&a.length>0&&s.length>0){const n=s[0].lineNumber;if(n===o.startLineNumber)for(let l=0;!r&&l=0;l--)a[l].lineNumber===t&&(i=a[l].ranges[0]);r&&!r.startStyle&&(r=null),i&&!i.startStyle&&(i=null)}for(let n=0,t=s.length;n0){const v=s[n-1].ranges[0].left,y=s[n-1].ranges[0].left+s[n-1].ranges[0].width;p(h-v)v&&(_.top=1),p(m-y)'}_actualRenderOneSelection(o,s,a,u){if(u.length!==0){const r=!!u[0].ranges[0].startStyle,i=this._lineHeight.toString(),n=(this._lineHeight-1).toString(),t=u[0].lineNumber,l=u[u.length-1].lineNumber;for(let h=0,m=u.length;h1,l)}this._previousFrameVisibleRangesWithStyle=r,this._renderResult=s.map(([i,n])=>i+n)}render(o,s){if(!this._renderResult)return"";const a=s-o;return a<0||a>=this._renderResult.length?"":this._renderResult[a]}}e.SelectionsOverlay=g,g.SELECTION_CLASS_NAME="selected-text",g.SELECTION_TOP_LEFT="top-left-radius",g.SELECTION_BOTTOM_LEFT="bottom-left-radius",g.SELECTION_TOP_RIGHT="top-right-radius",g.SELECTION_BOTTOM_RIGHT="bottom-right-radius",g.EDITOR_BACKGROUND_CLASS_NAME="monaco-editor-background",g.ROUNDED_PIECE_WIDTH=10,M.registerThemingParticipant((c,o)=>{const s=c.getColor(N.editorSelectionBackground);s&&o.addRule(`.monaco-editor .focused .selected-text { background-color: ${s}; }`);const a=c.getColor(N.editorInactiveSelection);a&&o.addRule(`.monaco-editor .selected-text { background-color: ${a}; }`);const u=c.getColor(N.editorSelectionForeground);u&&!u.isTransparent()&&o.addRule(`.monaco-editor .view-line span.inline-selected-text { color: ${u}; }`)});function p(c){return c<0?-c:c}}),define(Q[49],J([0,1,460,29,22,11]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.overviewRulerInfo=e.overviewRulerWarning=e.overviewRulerError=e.overviewRulerRangeHighlight=e.editorUnnecessaryCodeOpacity=e.editorUnnecessaryCodeBorder=e.editorGutter=e.editorOverviewRulerBackground=e.editorOverviewRulerBorder=e.editorBracketMatchBorder=e.editorBracketMatchBackground=e.editorCodeLensForeground=e.editorRuler=e.editorActiveLineNumber=e.editorLineNumbers=e.editorActiveIndentGuides=e.editorIndentGuides=e.editorWhitespaces=e.editorCursorBackground=e.editorCursorForeground=e.editorSymbolHighlightBorder=e.editorSymbolHighlight=e.editorRangeHighlightBorder=e.editorRangeHighlight=e.editorLineHighlightBorder=e.editorLineHighlight=void 0,e.editorLineHighlight=M.registerColor("editor.lineHighlightBackground",{dark:null,light:null,hc:null},b.localize(0,null)),e.editorLineHighlightBorder=M.registerColor("editor.lineHighlightBorder",{dark:"#282828",light:"#eeeeee",hc:"#f38518"},b.localize(1,null)),e.editorRangeHighlight=M.registerColor("editor.rangeHighlightBackground",{dark:"#ffffff0b",light:"#fdff0033",hc:null},b.localize(2,null),!0),e.editorRangeHighlightBorder=M.registerColor("editor.rangeHighlightBorder",{dark:null,light:null,hc:M.activeContrastBorder},b.localize(3,null),!0),e.editorSymbolHighlight=M.registerColor("editor.symbolHighlightBackground",{dark:M.editorFindMatchHighlight,light:M.editorFindMatchHighlight,hc:null},b.localize(4,null),!0),e.editorSymbolHighlightBorder=M.registerColor("editor.symbolHighlightBorder",{dark:null,light:null,hc:M.activeContrastBorder},b.localize(5,null),!0),e.editorCursorForeground=M.registerColor("editorCursor.foreground",{dark:"#AEAFAD",light:N.Color.black,hc:N.Color.white},b.localize(6,null)),e.editorCursorBackground=M.registerColor("editorCursor.background",null,b.localize(7,null)),e.editorWhitespaces=M.registerColor("editorWhitespace.foreground",{dark:"#e3e4e229",light:"#33333333",hc:"#e3e4e229"},b.localize(8,null)),e.editorIndentGuides=M.registerColor("editorIndentGuide.background",{dark:e.editorWhitespaces,light:e.editorWhitespaces,hc:e.editorWhitespaces},b.localize(9,null)),e.editorActiveIndentGuides=M.registerColor("editorIndentGuide.activeBackground",{dark:e.editorWhitespaces,light:e.editorWhitespaces,hc:e.editorWhitespaces},b.localize(10,null)),e.editorLineNumbers=M.registerColor("editorLineNumber.foreground",{dark:"#858585",light:"#237893",hc:N.Color.white},b.localize(11,null));const S=M.registerColor("editorActiveLineNumber.foreground",{dark:"#c6c6c6",light:"#0B216F",hc:M.activeContrastBorder},b.localize(12,null),!1,b.localize(13,null));e.editorActiveLineNumber=M.registerColor("editorLineNumber.activeForeground",{dark:S,light:S,hc:S},b.localize(14,null)),e.editorRuler=M.registerColor("editorRuler.foreground",{dark:"#5A5A5A",light:N.Color.lightgrey,hc:N.Color.white},b.localize(15,null)),e.editorCodeLensForeground=M.registerColor("editorCodeLens.foreground",{dark:"#999999",light:"#999999",hc:"#999999"},b.localize(16,null)),e.editorBracketMatchBackground=M.registerColor("editorBracketMatch.background",{dark:"#0064001a",light:"#0064001a",hc:"#0064001a"},b.localize(17,null)),e.editorBracketMatchBorder=M.registerColor("editorBracketMatch.border",{dark:"#888",light:"#B9B9B9",hc:M.contrastBorder},b.localize(18,null)),e.editorOverviewRulerBorder=M.registerColor("editorOverviewRuler.border",{dark:"#7f7f7f4d",light:"#7f7f7f4d",hc:"#7f7f7f4d"},b.localize(19,null)),e.editorOverviewRulerBackground=M.registerColor("editorOverviewRuler.background",null,b.localize(20,null)),e.editorGutter=M.registerColor("editorGutter.background",{dark:M.editorBackground,light:M.editorBackground,hc:M.editorBackground},b.localize(21,null)),e.editorUnnecessaryCodeBorder=M.registerColor("editorUnnecessaryCode.border",{dark:null,light:null,hc:N.Color.fromHex("#fff").transparent(.8)},b.localize(22,null)),e.editorUnnecessaryCodeOpacity=M.registerColor("editorUnnecessaryCode.opacity",{dark:N.Color.fromHex("#000a"),light:N.Color.fromHex("#0007"),hc:null},b.localize(23,null));const C=new N.Color(new N.RGBA(0,122,204,.6));e.overviewRulerRangeHighlight=M.registerColor("editorOverviewRuler.rangeHighlightForeground",{dark:C,light:C,hc:C},b.localize(24,null),!0),e.overviewRulerError=M.registerColor("editorOverviewRuler.errorForeground",{dark:new N.Color(new N.RGBA(255,18,18,.7)),light:new N.Color(new N.RGBA(255,18,18,.7)),hc:new N.Color(new N.RGBA(255,50,50,1))},b.localize(25,null)),e.overviewRulerWarning=M.registerColor("editorOverviewRuler.warningForeground",{dark:M.editorWarningForeground,light:M.editorWarningForeground,hc:M.editorWarningBorder},b.localize(26,null)),e.overviewRulerInfo=M.registerColor("editorOverviewRuler.infoForeground",{dark:M.editorInfoForeground,light:M.editorInfoForeground,hc:M.editorInfoBorder},b.localize(27,null)),w.registerThemingParticipant((d,g)=>{const p=d.getColor(M.editorBackground);p&&g.addRule(`.monaco-editor, .monaco-editor-background, .monaco-editor .inputarea.ime-input { background-color: ${p}; }`);const c=d.getColor(M.editorForeground);c&&g.addRule(`.monaco-editor, .monaco-editor .inputarea.ime-input { color: ${c}; }`);const o=d.getColor(e.editorGutter);o&&g.addRule(`.monaco-editor .margin { background-color: ${o}; }`);const s=d.getColor(e.editorRangeHighlight);s&&g.addRule(`.monaco-editor .rangeHighlight { background-color: ${s}; }`);const a=d.getColor(e.editorRangeHighlightBorder);a&&g.addRule(`.monaco-editor .rangeHighlight { border: 1px ${d.type==="hc"?"dotted":"solid"} ${a}; }`);const u=d.getColor(e.editorSymbolHighlight);u&&g.addRule(`.monaco-editor .symbolHighlight { background-color: ${u}; }`);const r=d.getColor(e.editorSymbolHighlightBorder);r&&g.addRule(`.monaco-editor .symbolHighlight { border: 1px ${d.type==="hc"?"dotted":"solid"} ${r}; }`);const i=d.getColor(e.editorWhitespaces);i&&(g.addRule(`.monaco-editor .mtkw { color: ${i} !important; }`),g.addRule(`.monaco-editor .mtkz { color: ${i} !important; }`))})}),define(Q[588],J([0,1,94,49,19,11,21,318]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CurrentLineMarginHighlightOverlay=e.CurrentLineHighlightOverlay=e.AbstractLineHighlightOverlay=void 0;let C=!0;class d extends b.DynamicViewOverlay{constructor(o){super();this._context=o;const s=this._context.configuration.options,a=s.get(124);this._lineHeight=s.get(53),this._renderLineHighlight=s.get(80),this._renderLineHighlightOnlyWhenFocus=s.get(81),this._contentLeft=a.contentLeft,this._contentWidth=a.contentWidth,this._selectionIsEmpty=!0,this._focused=!1,this._cursorLineNumbers=[1],this._selections=[new S.Selection(1,1,1,1)],this._renderData=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}_readFromSelections(){let o=!1;const s=C?this._selections.slice(0,1):this._selections,a=s.map(r=>r.positionLineNumber);a.sort((r,i)=>r-i),M.equals(this._cursorLineNumbers,a)||(this._cursorLineNumbers=a,o=!0);const u=s.every(r=>r.isEmpty());return this._selectionIsEmpty!==u&&(this._selectionIsEmpty=u,o=!0),o}onThemeChanged(o){return this._readFromSelections()}onConfigurationChanged(o){const s=this._context.configuration.options,a=s.get(124);return this._lineHeight=s.get(53),this._renderLineHighlight=s.get(80),this._renderLineHighlightOnlyWhenFocus=s.get(81),this._contentLeft=a.contentLeft,this._contentWidth=a.contentWidth,!0}onCursorStateChanged(o){return this._selections=o.selections,this._readFromSelections()}onFlushed(o){return!0}onLinesDeleted(o){return!0}onLinesInserted(o){return!0}onScrollChanged(o){return o.scrollWidthChanged||o.scrollTopChanged}onZonesChanged(o){return!0}onFocusChanged(o){return this._renderLineHighlightOnlyWhenFocus?(this._focused=o.isFocused,!0):!1}prepareRender(o){if(!this._shouldRenderThis()){this._renderData=null;return}const s=this._renderOne(o),a=o.visibleRange.startLineNumber,u=o.visibleRange.endLineNumber,r=this._cursorLineNumbers.length;let i=0;const n=[];for(let t=a;t<=u;t++){const l=t-a;for(;i=this._renderData.length?"":this._renderData[a]}}e.AbstractLineHighlightOverlay=d;class g extends d{_renderOne(o){return`
    `}_shouldRenderThis(){return(this._renderLineHighlight==="line"||this._renderLineHighlight==="all")&&this._selectionIsEmpty&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}_shouldRenderOther(){return(this._renderLineHighlight==="gutter"||this._renderLineHighlight==="all")&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}}e.CurrentLineHighlightOverlay=g;class p extends d{_renderOne(o){return`
    `}_shouldRenderMargin(){return(this._renderLineHighlight==="gutter"||this._renderLineHighlight==="all")&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}_shouldRenderThis(){return!0}_shouldRenderOther(){return(this._renderLineHighlight==="line"||this._renderLineHighlight==="all")&&this._selectionIsEmpty&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}}e.CurrentLineMarginHighlightOverlay=p,w.registerThemingParticipant((c,o)=>{C=!1;const s=c.getColor(N.editorLineHighlight);if(s&&(o.addRule(`.monaco-editor .view-overlays .current-line { background-color: ${s}; }`),o.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { background-color: ${s}; border: none; }`)),!s||s.isTransparent()||c.defines(N.editorLineHighlightBorder)){const a=c.getColor(N.editorLineHighlightBorder);a&&(C=!0,o.addRule(`.monaco-editor .view-overlays .current-line { border: 2px solid ${a}; }`),o.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { border: 2px solid ${a}; }`),c.type==="hc"&&(o.addRule(".monaco-editor .view-overlays .current-line { border-width: 1px; }"),o.addRule(".monaco-editor .margin-view-overlays .current-line-margin { border-width: 1px; }")))}})}),define(Q[589],J([0,1,94,14,49,11,321]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentGuidesOverlay=void 0;class S extends b.DynamicViewOverlay{constructor(d){super();this._context=d,this._primaryLineNumber=0;const g=this._context.configuration.options,p=g.get(125),c=g.get(38);this._lineHeight=g.get(53),this._spaceWidth=c.spaceWidth,this._enabled=g.get(78),this._activeIndentEnabled=g.get(47),this._maxIndentLeft=p.wrappingColumn===-1?-1:p.wrappingColumn*c.typicalHalfwidthCharacterWidth,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(d){const g=this._context.configuration.options,p=g.get(125),c=g.get(38);return this._lineHeight=g.get(53),this._spaceWidth=c.spaceWidth,this._enabled=g.get(78),this._activeIndentEnabled=g.get(47),this._maxIndentLeft=p.wrappingColumn===-1?-1:p.wrappingColumn*c.typicalHalfwidthCharacterWidth,!0}onCursorStateChanged(d){const g=d.selections[0],p=g.isEmpty()?g.positionLineNumber:0;return this._primaryLineNumber!==p?(this._primaryLineNumber=p,!0):!1}onDecorationsChanged(d){return!0}onFlushed(d){return!0}onLinesChanged(d){return!0}onLinesDeleted(d){return!0}onLinesInserted(d){return!0}onScrollChanged(d){return d.scrollTopChanged}onZonesChanged(d){return!0}onLanguageConfigurationChanged(d){return!0}prepareRender(d){if(!this._enabled){this._renderResult=null;return}const g=d.visibleRange.startLineNumber,p=d.visibleRange.endLineNumber,{indentSize:c}=this._context.model.getTextModelOptions(),o=c*this._spaceWidth,s=d.scrollWidth,a=this._lineHeight,u=this._context.model.getLinesIndentGuides(g,p);let r=0,i=0,n=0;if(this._activeIndentEnabled&&this._primaryLineNumber){const l=this._context.model.getActiveIndentGuide(this._primaryLineNumber,g,p);r=l.startLineNumber,i=l.endLineNumber,n=l.indent}const t=[];for(let l=g;l<=p;l++){const h=r<=l&&l<=i,m=l-g,_=u[m];let f="";if(_>=1){const v=d.visibleRangeForPosition(new N.Position(l,1));let y=v?v.left:0;for(let L=1;L<=_&&(f+=`
    `,y+=o,!(y>s||this._maxIndentLeft>0&&y>this._maxIndentLeft));L++);}t[m]=f}this._renderResult=t}render(d,g){if(!this._renderResult)return"";const p=g-d;return p<0||p>=this._renderResult.length?"":this._renderResult[p]}}e.IndentGuidesOverlay=S,w.registerThemingParticipant((C,d)=>{const g=C.getColor(M.editorIndentGuides);g&&d.addRule(`.monaco-editor .lines-content .cigr { box-shadow: 1px 0 0 0 ${g} inset; }`);const p=C.getColor(M.editorActiveIndentGuides)||g;p&&d.addRule(`.monaco-editor .lines-content .cigra { box-shadow: 1px 0 0 0 ${p} inset; }`)})}),define(Q[257],J([0,1,17,94,14,49,11,322]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LineNumbersOverlay=void 0;class C extends N.DynamicViewOverlay{constructor(g){super();this._context=g,this._readConfig(),this._lastCursorModelPosition=new M.Position(1,1),this._renderResult=null,this._activeLineNumber=1,this._context.addEventHandler(this)}_readConfig(){const g=this._context.configuration.options;this._lineHeight=g.get(53);const p=g.get(54);this._renderLineNumbers=p.renderType,this._renderCustomLineNumbers=p.renderFn,this._renderFinalNewline=g.get(79);const c=g.get(124);this._lineNumbersLeft=c.lineNumbersLeft,this._lineNumbersWidth=c.lineNumbersWidth}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(g){return this._readConfig(),!0}onCursorStateChanged(g){const p=g.selections[0].getPosition();this._lastCursorModelPosition=this._context.model.coordinatesConverter.convertViewPositionToModelPosition(p);let c=!1;return this._activeLineNumber!==p.lineNumber&&(this._activeLineNumber=p.lineNumber,c=!0),(this._renderLineNumbers===2||this._renderLineNumbers===3)&&(c=!0),c}onFlushed(g){return!0}onLinesChanged(g){return!0}onLinesDeleted(g){return!0}onLinesInserted(g){return!0}onScrollChanged(g){return g.scrollTopChanged}onZonesChanged(g){return!0}_getLineRenderLineNumber(g){const p=this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new M.Position(g,1));if(p.column!==1)return"";const c=p.lineNumber;if(this._renderCustomLineNumbers)return this._renderCustomLineNumbers(c);if(this._renderLineNumbers===2){const o=Math.abs(this._lastCursorModelPosition.lineNumber-c);return o===0?''+c+"":String(o)}return this._renderLineNumbers===3?this._lastCursorModelPosition.lineNumber===c||c%10==0?String(c):"":String(c)}prepareRender(g){if(this._renderLineNumbers===0){this._renderResult=null;return}const p=b.isLinux?this._lineHeight%2==0?" lh-even":" lh-odd":"",c=g.visibleRange.startLineNumber,o=g.visibleRange.endLineNumber,s='
    ',a=this._context.model.getLineCount(),u=[];for(let r=c;r<=o;r++){const i=r-c;if(!this._renderFinalNewline&&r===a&&this._context.model.getLineLength(r)===0){u[i]="";continue}const n=this._getLineRenderLineNumber(r);n?r===this._activeLineNumber?u[i]='
    '+n+"
    ":u[i]=s+n+"
    ":u[i]=""}this._renderResult=u}render(g,p){if(!this._renderResult)return"";const c=p-g;return c<0||c>=this._renderResult.length?"":this._renderResult[c]}}e.LineNumbersOverlay=C,C.CLASS_NAME="line-numbers",S.registerThemingParticipant((d,g)=>{const p=d.getColor(w.editorLineNumbers);p&&g.addRule(`.monaco-editor .line-numbers { color: ${p}; }`);const c=d.getColor(w.editorActiveLineNumber);c&&g.addRule(`.monaco-editor .line-numbers.active-line-number { color: ${c}; }`)})}),define(Q[590],J([0,1,445,35,30,17,8,69,164,214,45,257,223,38,106,14,3,21,124,317]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TextAreaHandler=void 0;class t{constructor(y,L,I){this.top=y,this.left=L,this.width=I}setWidth(y){return new t(this.top,this.left,y)}}const l=N.isFirefox;class h extends p.ViewPart{constructor(y,L,I){super(y);this._primaryCursorPosition=new u.Position(1,1),this._primaryCursorVisibleRange=null,this._viewController=L,this._viewHelper=I,this._scrollLeft=0,this._scrollTop=0;const k=this._context.configuration.options,E=k.get(124);this._setAccessibilityOptions(k),this._contentLeft=E.contentLeft,this._contentWidth=E.contentWidth,this._contentHeight=E.height,this._fontInfo=k.get(38),this._lineHeight=k.get(53),this._emptySelectionClipboard=k.get(28),this._copyWithSyntaxHighlighting=k.get(18),this._visibleTextArea=null,this._selections=[new i.Selection(1,1,1,1)],this._modelSelections=[new i.Selection(1,1,1,1)],this._lastRenderPosition=null,this.textArea=M.createFastDomNode(document.createElement("textarea")),p.PartFingerprints.write(this.textArea,6),this.textArea.setClassName(`inputarea ${n.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),this.textArea.setAttribute("wrap","off"),this.textArea.setAttribute("autocorrect","off"),this.textArea.setAttribute("autocapitalize","off"),this.textArea.setAttribute("autocomplete","off"),this.textArea.setAttribute("spellcheck","false"),this.textArea.setAttribute("aria-label",this._getAriaLabel(k)),this.textArea.setAttribute("tabindex",String(k.get(107))),this.textArea.setAttribute("role","textbox"),this.textArea.setAttribute("aria-roledescription",b.localize(0,null)),this.textArea.setAttribute("aria-multiline","true"),this.textArea.setAttribute("aria-haspopup","false"),this.textArea.setAttribute("aria-autocomplete","both"),w.isWeb&&k.get(75)&&this.textArea.setAttribute("readonly","true"),this.textAreaCover=M.createFastDomNode(document.createElement("div")),this.textAreaCover.setPosition("absolute");const T={getLineCount:()=>this._context.model.getLineCount(),getLineMaxColumn:A=>this._context.model.getLineMaxColumn(A),getValueInRange:(A,B)=>this._context.model.getValueInRange(A,B)},O={getDataToCopy:A=>{const B=this._context.model.getPlainTextToCopy(this._modelSelections,this._emptySelectionClipboard,w.isWindows),F=this._context.model.getEOL(),D=this._emptySelectionClipboard&&this._modelSelections.length===1&&this._modelSelections[0].isEmpty(),R=Array.isArray(B)?B:null,W=Array.isArray(B)?B.join(F):B;let x,K=null;if(A&&(d.CopyOptions.forceCopyWithSyntaxHighlighting||this._copyWithSyntaxHighlighting&&W.length<65536)){const Y=this._context.model.getRichTextToCopy(this._modelSelections,this._emptySelectionClipboard);Y&&(x=Y.html,K=Y.mode)}return{isFromEmptySelection:D,multicursorText:R,text:W,html:x,mode:K}},getScreenReaderContent:A=>{if(this._accessibilitySupport===1){if(w.isMacintosh){const B=this._selections[0];if(B.isEmpty()){const F=B.getStartPosition();let D=this._getWordBeforePosition(F);if(D.length===0&&(D=this._getCharacterBeforePosition(F)),D.length>0)return new g.TextAreaState(D,D.length,D.length,F,F)}}return g.TextAreaState.EMPTY}if(N.isAndroid){const B=this._selections[0];if(B.isEmpty()){const F=B.getStartPosition(),[D,R]=this._getAndroidWordAtPosition(F);if(D.length>0)return new g.TextAreaState(D,R,R,F,F)}return g.TextAreaState.EMPTY}return g.PagedScreenReaderStrategy.fromEditorSelection(A,T,this._selections[0],this._accessibilityPageSize,this._accessibilitySupport===0)},deduceModelPosition:(A,B,F)=>this._context.model.deduceModelPositionRelativeToViewPosition(A,B,F)};this._textAreaInput=this._register(new d.TextAreaInput(O,this.textArea)),this._register(this._textAreaInput.onKeyDown(A=>{this._viewController.emitKeyDown(A)})),this._register(this._textAreaInput.onKeyUp(A=>{this._viewController.emitKeyUp(A)})),this._register(this._textAreaInput.onPaste(A=>{let B=!1,F=null,D=null;A.metadata&&(B=this._emptySelectionClipboard&&!!A.metadata.isFromEmptySelection,F=typeof A.metadata.multicursorText!="undefined"?A.metadata.multicursorText:null,D=A.metadata.mode),this._viewController.paste(A.text,B,F,D)})),this._register(this._textAreaInput.onCut(()=>{this._viewController.cut()})),this._register(this._textAreaInput.onType(A=>{A.replacePrevCharCnt||A.replaceNextCharCnt||A.positionDelta?(g._debugComposition&&console.log(` => compositionType: <<${A.text}>>, ${A.replacePrevCharCnt}, ${A.replaceNextCharCnt}, ${A.positionDelta}`),this._viewController.compositionType(A.text,A.replacePrevCharCnt,A.replaceNextCharCnt,A.positionDelta)):(g._debugComposition&&console.log(` => type: <<${A.text}>>`),this._viewController.type(A.text))})),this._register(this._textAreaInput.onSelectionChangeRequest(A=>{this._viewController.setSelection(A)})),this._register(this._textAreaInput.onCompositionStart(A=>{const B=this._selections[0].startLineNumber,F=this._selections[0].startColumn+A.revealDeltaColumns;this._context.model.revealRange("keyboard",!0,new r.Range(B,F,B,F),0,1);const D=this._viewHelper.visibleRangeForPositionRelativeToEditor(B,F);D&&(this._visibleTextArea=new t(this._context.viewLayout.getVerticalOffsetForLineNumber(B),D.left,l?0:1),this._render()),this.textArea.setClassName(`inputarea ${n.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME} ime-input`),this._viewController.compositionStart(),this._context.model.onCompositionStart()})),this._register(this._textAreaInput.onCompositionUpdate(A=>{!this._visibleTextArea||(this._visibleTextArea=this._visibleTextArea.setWidth(m(A.data,this._fontInfo)),this._render())})),this._register(this._textAreaInput.onCompositionEnd(()=>{this._visibleTextArea=null,this._render(),this.textArea.setClassName(`inputarea ${n.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`),this._viewController.compositionEnd(),this._context.model.onCompositionEnd()})),this._register(this._textAreaInput.onFocus(()=>{this._context.model.setHasFocus(!0)})),this._register(this._textAreaInput.onBlur(()=>{this._context.model.setHasFocus(!1)}))}dispose(){super.dispose()}_getAndroidWordAtPosition(y){const L='`~!@#$%^&*()-=+[{]}\\|;:",.<>/?',I=this._context.model.getLineContent(y.lineNumber),k=a.getMapForWordSeparators(L);let E=!0,T=y.column,O=!0,A=y.column,B=0;for(;B<50&&(E||O);){if(E&&T<=1&&(E=!1),E){const F=I.charCodeAt(T-2);k.get(F)!==0?E=!1:T--}if(O&&A>I.length&&(O=!1),O){const F=I.charCodeAt(A-1);k.get(F)!==0?O=!1:A++}B++}return[I.substring(T-1,A-1),y.column-T]}_getWordBeforePosition(y){const L=this._context.model.getLineContent(y.lineNumber),I=a.getMapForWordSeparators(this._context.configuration.options.get(110));let k=y.column,E=0;for(;k>1;){const T=L.charCodeAt(k-2);if(I.get(T)!==0||E>50)return L.substring(k-1,y.column-1);E++,k--}return L.substring(0,y.column-1)}_getCharacterBeforePosition(y){if(y.column>1){const I=this._context.model.getLineContent(y.lineNumber).charAt(y.column-2);if(!S.isHighSurrogate(I.charCodeAt(0)))return I}return""}_getAriaLabel(y){return y.get(2)===1?b.localize(1,null,w.isLinux?"Shift+Alt+F1":"Alt+F1"):y.get(4)}_setAccessibilityOptions(y){this._accessibilitySupport=y.get(2);const L=y.get(3);this._accessibilitySupport===2&&L===s.EditorOptions.accessibilityPageSize.defaultValue?this._accessibilityPageSize=100:this._accessibilityPageSize=L}onConfigurationChanged(y){const L=this._context.configuration.options,I=L.get(124);return this._setAccessibilityOptions(L),this._contentLeft=I.contentLeft,this._contentWidth=I.contentWidth,this._contentHeight=I.height,this._fontInfo=L.get(38),this._lineHeight=L.get(53),this._emptySelectionClipboard=L.get(28),this._copyWithSyntaxHighlighting=L.get(18),this.textArea.setAttribute("aria-label",this._getAriaLabel(L)),this.textArea.setAttribute("tabindex",String(L.get(107))),w.isWeb&&y.hasChanged(75)&&(L.get(75)?this.textArea.setAttribute("readonly","true"):this.textArea.removeAttribute("readonly")),y.hasChanged(2)&&this._textAreaInput.writeScreenReaderContent("strategy changed"),!0}onCursorStateChanged(y){return this._selections=y.selections.slice(0),this._modelSelections=y.modelSelections.slice(0),this._textAreaInput.writeScreenReaderContent("selection changed"),!0}onDecorationsChanged(y){return!0}onFlushed(y){return!0}onLinesChanged(y){return!0}onLinesDeleted(y){return!0}onLinesInserted(y){return!0}onScrollChanged(y){return this._scrollLeft=y.scrollLeft,this._scrollTop=y.scrollTop,!0}onZonesChanged(y){return!0}isFocused(){return this._textAreaInput.isFocused()}focusTextArea(){this._textAreaInput.focusTextArea()}getLastRenderData(){return this._lastRenderPosition}setAriaOptions(y){y.activeDescendant?(this.textArea.setAttribute("aria-haspopup","true"),this.textArea.setAttribute("aria-autocomplete","list"),this.textArea.setAttribute("aria-activedescendant",y.activeDescendant)):(this.textArea.setAttribute("aria-haspopup","false"),this.textArea.setAttribute("aria-autocomplete","both"),this.textArea.removeAttribute("aria-activedescendant")),y.role&&this.textArea.setAttribute("role",y.role)}prepareRender(y){this._primaryCursorPosition=new u.Position(this._selections[0].positionLineNumber,this._selections[0].positionColumn),this._primaryCursorVisibleRange=y.visibleRangeForPosition(this._primaryCursorPosition)}render(y){this._textAreaInput.writeScreenReaderContent("render"),this._render()}_render(){if(this._visibleTextArea){this._renderInsideEditor(null,this._visibleTextArea.top-this._scrollTop,this._contentLeft+this._visibleTextArea.left-this._scrollLeft,this._visibleTextArea.width,this._lineHeight);return}if(!this._primaryCursorVisibleRange){this._renderAtTopLeft();return}const y=this._contentLeft+this._primaryCursorVisibleRange.left-this._scrollLeft;if(ythis._contentLeft+this._contentWidth){this._renderAtTopLeft();return}const L=this._context.viewLayout.getVerticalOffsetForLineNumber(this._selections[0].positionLineNumber)-this._scrollTop;if(L<0||L>this._contentHeight){this._renderAtTopLeft();return}if(w.isMacintosh){this._renderInsideEditor(this._primaryCursorPosition,L,y,l?0:1,this._lineHeight);return}this._renderInsideEditor(this._primaryCursorPosition,L,y,l?0:1,l?0:1)}_renderInsideEditor(y,L,I,k,E){this._lastRenderPosition=y;const T=this.textArea,O=this.textAreaCover;C.Configuration.applyFontInfo(T,this._fontInfo),T.setTop(L),T.setLeft(I),T.setWidth(k),T.setHeight(E),O.setTop(0),O.setLeft(0),O.setWidth(0),O.setHeight(0)}_renderAtTopLeft(){this._lastRenderPosition=null;const y=this.textArea,L=this.textAreaCover;if(C.Configuration.applyFontInfo(y,this._fontInfo),y.setTop(0),y.setLeft(0),L.setTop(0),L.setLeft(0),l){y.setWidth(0),y.setHeight(0),L.setWidth(0),L.setHeight(0);return}y.setWidth(1),y.setHeight(1),L.setWidth(1),L.setHeight(1);const I=this._context.configuration.options;I.get(44)?L.setClassName("monaco-editor-background textAreaCover "+o.Margin.OUTER_CLASS_NAME):I.get(54).renderType!==0?L.setClassName("monaco-editor-background textAreaCover "+c.LineNumbersOverlay.CLASS_NAME):L.setClassName("monaco-editor-background textAreaCover")}}e.TextAreaHandler=h;function m(v,y){const I=document.createElement("canvas").getContext("2d");I.font=_(y);const k=I.measureText(v);return N.isFirefox?k.width+2:k.width}function _(v){return f("normal",v.fontWeight,v.fontSize,v.lineHeight,v.fontFamily)}function f(v,y,L,I,k){return`${v} normal ${y} ${L}px / ${I}px ${k}`}}),define(Q[591],J([0,1,30,29,45,14,18,49]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DecorationsOverviewRuler=void 0;class d{constructor(c,o){const s=c.options;this.lineHeight=s.get(53),this.pixelRatio=s.get(122),this.overviewRulerLanes=s.get(68),this.renderBorder=s.get(67);const a=o.getColor(C.editorOverviewRulerBorder);this.borderColor=a?a.toString():null,this.hideCursor=s.get(46);const u=o.getColor(C.editorCursorForeground);this.cursorColor=u?u.transparent(.7).toString():null,this.themeType=o.type;const r=s.get(59),i=r.enabled,n=r.side,t=i?o.getColor(C.editorOverviewRulerBackground)||S.TokenizationRegistry.getDefaultBackground():null;t===null||n==="left"?this.backgroundColor=null:this.backgroundColor=N.Color.Format.CSS.formatHex(t);const h=s.get(124).overviewRuler;this.top=h.top,this.right=h.right,this.domWidth=h.width,this.domHeight=h.height,this.overviewRulerLanes===0?(this.canvasWidth=0,this.canvasHeight=0):(this.canvasWidth=this.domWidth*this.pixelRatio|0,this.canvasHeight=this.domHeight*this.pixelRatio|0);const[m,_]=this._initLanes(1,this.canvasWidth,this.overviewRulerLanes);this.x=m,this.w=_}_initLanes(c,o,s){const a=o-c;if(s>=3){const u=Math.floor(a/3),r=Math.floor(a/3),i=a-u-r,n=c,t=n+u,l=n+u+i;return[[0,n,t,n,l,n,t,n],[0,u,i,u+i,r,u+i+r,i+r,u+i+r]]}else if(s===2){const u=Math.floor(a/2),r=a-u,i=c,n=i+u;return[[0,i,i,i,n,i,i,i],[0,u,u,u,r,u+r,u+r,u+r]]}else{const u=c,r=a;return[[0,u,u,u,u,u,u,u],[0,r,r,r,r,r,r,r]]}}equals(c){return this.lineHeight===c.lineHeight&&this.pixelRatio===c.pixelRatio&&this.overviewRulerLanes===c.overviewRulerLanes&&this.renderBorder===c.renderBorder&&this.borderColor===c.borderColor&&this.hideCursor===c.hideCursor&&this.cursorColor===c.cursorColor&&this.themeType===c.themeType&&this.backgroundColor===c.backgroundColor&&this.top===c.top&&this.right===c.right&&this.domWidth===c.domWidth&&this.domHeight===c.domHeight&&this.canvasWidth===c.canvasWidth&&this.canvasHeight===c.canvasHeight}}class g extends M.ViewPart{constructor(c){super(c);this._domNode=b.createFastDomNode(document.createElement("canvas")),this._domNode.setClassName("decorationsOverviewRuler"),this._domNode.setPosition("absolute"),this._domNode.setLayerHinting(!0),this._domNode.setContain("strict"),this._domNode.setAttribute("aria-hidden","true"),this._updateSettings(!1),this._tokensColorTrackerListener=S.TokenizationRegistry.onDidChange(o=>{o.changedColorMap&&this._updateSettings(!0)}),this._cursorPositions=[]}dispose(){super.dispose(),this._tokensColorTrackerListener.dispose()}_updateSettings(c){const o=new d(this._context.configuration,this._context.theme);return this._settings&&this._settings.equals(o)?!1:(this._settings=o,this._domNode.setTop(this._settings.top),this._domNode.setRight(this._settings.right),this._domNode.setWidth(this._settings.domWidth),this._domNode.setHeight(this._settings.domHeight),this._domNode.domNode.width=this._settings.canvasWidth,this._domNode.domNode.height=this._settings.canvasHeight,c&&this._render(),!0)}onConfigurationChanged(c){return this._updateSettings(!1)}onCursorStateChanged(c){this._cursorPositions=[];for(let o=0,s=c.selections.length;oo&&(x=o-t),D=x-t,R=x+t}D>E+1||A!==I?(T!==0&&l.fillRect(h[I],k,m[I],E-k),I=A,k=D,E=R):R>E&&(E=R)}l.fillRect(h[I],k,m[I],E-k)}if(!this._settings.hideCursor&&this._settings.cursorColor){const f=2*this._settings.pixelRatio|0,v=f/2|0,y=this._settings.x[7],L=this._settings.w[7];l.fillStyle=this._settings.cursorColor;let I=-100,k=-100;for(let E=0,T=this._cursorPositions.length;Eo&&(A=o-v);const B=A-v,F=B+f;B>k+1?(E!==0&&l.fillRect(y,I,L,k-I),I=B,k=F):F>k&&(k=F)}l.fillRect(y,I,L,k-I)}this._settings.renderBorder&&this._settings.borderColor&&this._settings.overviewRulerLanes>0&&(l.beginPath(),l.lineWidth=1,l.strokeStyle=this._settings.borderColor,l.moveTo(0,0),l.lineTo(0,o),l.stroke(),l.moveTo(0,0),l.lineTo(c,0),l.stroke())}}e.DecorationsOverviewRuler=g}),define(Q[592],J([0,1,30,45,49,11,328]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Rulers=void 0;class S extends N.ViewPart{constructor(d){super(d);this.domNode=b.createFastDomNode(document.createElement("div")),this.domNode.setAttribute("role","presentation"),this.domNode.setAttribute("aria-hidden","true"),this.domNode.setClassName("view-rulers"),this._renderedRulers=[];const g=this._context.configuration.options;this._rulers=g.get(86),this._typicalHalfwidthCharacterWidth=g.get(38).typicalHalfwidthCharacterWidth}dispose(){super.dispose()}onConfigurationChanged(d){const g=this._context.configuration.options;return this._rulers=g.get(86),this._typicalHalfwidthCharacterWidth=g.get(38).typicalHalfwidthCharacterWidth,!0}onScrollChanged(d){return d.scrollHeightChanged}prepareRender(d){}_ensureRulersCount(){const d=this._renderedRulers.length,g=this._rulers.length;if(d!==g){if(d0;){const a=b.createFastDomNode(document.createElement("div"));a.setClassName("view-ruler"),a.setWidth(o),this.domNode.appendChild(a),this._renderedRulers.push(a),s--}return}let p=d-g;for(;p>0;){const c=this._renderedRulers.pop();this.domNode.removeChild(c),p--}}}render(d){this._ensureRulersCount();for(let g=0,p=this._rulers.length;g{const g=C.getColor(M.editorRuler);g&&d.addRule(`.monaco-editor .view-ruler { box-shadow: 1px 0 0 0 ${g} inset; }`)})}),define(Q[593],J([0,1,30,15,45,565,38,49,11,331]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewCursors=void 0;class g extends M.ViewPart{constructor(c){super(c);const o=this._context.configuration.options;this._readOnly=o.get(75),this._cursorBlinking=o.get(19),this._cursorStyle=o.get(21),this._cursorSmoothCaretAnimation=o.get(20),this._selectionIsEmpty=!0,this._isComposingInput=!1,this._isVisible=!1,this._primaryCursor=new w.ViewCursor(this._context),this._secondaryCursors=[],this._renderData=[],this._domNode=b.createFastDomNode(document.createElement("div")),this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true"),this._updateDomClassName(),this._domNode.appendChild(this._primaryCursor.getDomNode()),this._startCursorBlinkAnimation=new N.TimeoutTimer,this._cursorFlatBlinkInterval=new N.IntervalTimer,this._blinkingEnabled=!1,this._editorHasFocus=!1,this._updateBlinking()}dispose(){super.dispose(),this._startCursorBlinkAnimation.dispose(),this._cursorFlatBlinkInterval.dispose()}getDomNode(){return this._domNode}onCompositionStart(c){return this._isComposingInput=!0,this._updateBlinking(),!0}onCompositionEnd(c){return this._isComposingInput=!1,this._updateBlinking(),!0}onConfigurationChanged(c){const o=this._context.configuration.options;this._readOnly=o.get(75),this._cursorBlinking=o.get(19),this._cursorStyle=o.get(21),this._cursorSmoothCaretAnimation=o.get(20),this._updateBlinking(),this._updateDomClassName(),this._primaryCursor.onConfigurationChanged(c);for(let s=0,a=this._secondaryCursors.length;so.length){const s=this._secondaryCursors.length-o.length;for(let a=0;a{for(let a=0,u=c.ranges.length;a{this._isVisible?this._hide():this._show()},g.BLINK_INTERVAL):this._startCursorBlinkAnimation.setIfNotSet(()=>{this._blinkingEnabled=!0,this._updateDomClassName()},g.BLINK_INTERVAL))}_updateDomClassName(){this._domNode.setClassName(this._getClassName())}_getClassName(){let c="cursors-layer";switch(this._selectionIsEmpty||(c+=" has-selection"),this._cursorStyle){case S.TextEditorCursorStyle.Line:c+=" cursor-line-style";break;case S.TextEditorCursorStyle.Block:c+=" cursor-block-style";break;case S.TextEditorCursorStyle.Underline:c+=" cursor-underline-style";break;case S.TextEditorCursorStyle.LineThin:c+=" cursor-line-thin-style";break;case S.TextEditorCursorStyle.BlockOutline:c+=" cursor-block-outline-style";break;case S.TextEditorCursorStyle.UnderlineThin:c+=" cursor-underline-thin-style";break;default:c+=" cursor-line-style"}if(this._blinkingEnabled)switch(this._getCursorBlinking()){case 1:c+=" cursor-blink";break;case 2:c+=" cursor-smooth";break;case 3:c+=" cursor-phase";break;case 4:c+=" cursor-expand";break;case 5:c+=" cursor-solid";break;default:c+=" cursor-solid"}else c+=" cursor-solid";return this._cursorSmoothCaretAnimation&&(c+=" cursor-smooth-caret-animation"),c}_show(){this._primaryCursor.show();for(let c=0,o=this._secondaryCursors.length;c{const o=p.getColor(C.editorCursorForeground);if(o){let s=p.getColor(C.editorCursorBackground);s||(s=o.opposite()),c.addRule(`.monaco-editor .cursors-layer .cursor { background-color: ${o}; border-color: ${o}; color: ${s}; }`),p.type==="hc"&&c.addRule(`.monaco-editor .cursors-layer.has-selection .cursor { border-left: 1px solid ${s}; border-right: 1px solid ${s}; }`)}})}),define(Q[594],J([0,1,85,2,53,11,49,36,3,43,6,22]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerDecorationsService=void 0;function o(u){return u.toString()}class s extends N.Disposable{constructor(r){super();this.model=r,this._markersData=new Map,this._register(N.toDisposable(()=>{this.model.deltaDecorations([...this._markersData.keys()],[]),this._markersData.clear()}))}update(r,i){const n=[...this._markersData.keys()];this._markersData.clear();const t=this.model.deltaDecorations(n,i);for(let l=0;lthis._onModelAdded(n)),this._register(r.onModelAdded(this._onModelAdded,this)),this._register(r.onModelRemoved(this._onModelRemoved,this)),this._register(this._markerService.onMarkerChanged(this._handleMarkerChange,this))}dispose(){super.dispose(),this._markerDecorations.forEach(r=>r.dispose()),this._markerDecorations.clear()}getMarker(r,i){const n=this._markerDecorations.get(o(r));return n&&n.getMarker(i)||null}_handleMarkerChange(r){r.forEach(i=>{const n=this._markerDecorations.get(o(i));n&&this._updateDecorations(n)})}_onModelAdded(r){const i=new s(r);this._markerDecorations.set(o(r.uri),i),this._updateDecorations(i)}_onModelRemoved(r){const i=this._markerDecorations.get(o(r.uri));i&&(i.dispose(),this._markerDecorations.delete(o(r.uri))),(r.uri.scheme===g.Schemas.inMemory||r.uri.scheme===g.Schemas.internal||r.uri.scheme===g.Schemas.vscode)&&this._markerService&&this._markerService.read({resource:r.uri}).map(n=>n.owner).forEach(n=>this._markerService.remove(n,[r.uri]))}_updateDecorations(r){const i=this._markerService.read({resource:r.model.uri,take:500});let n=i.map(t=>({range:this._createDecorationRange(r.model,t),options:this._createDecorationOption(t)}));r.update(i,n)&&this._onDidChangeMarker.fire(r.model)}_createDecorationRange(r,i){let n=d.Range.lift(i);if(i.severity===b.MarkerSeverity.Hint&&!this._hasMarkerTag(i,1)&&!this._hasMarkerTag(i,2)&&(n=n.setEndPosition(n.startLineNumber,n.startColumn+2)),n=r.validateRange(n),n.isEmpty()){let t=r.getWordAtPosition(n.getStartPosition());if(t)n=new d.Range(n.startLineNumber,t.startColumn,n.endLineNumber,t.endColumn);else{let l=r.getLineLastNonWhitespaceColumn(n.startLineNumber)||r.getLineMaxColumn(n.startLineNumber);l===1||(n.endColumn>=l?n=new d.Range(n.startLineNumber,l-1,n.endLineNumber,l):n=new d.Range(n.startLineNumber,n.startColumn,n.endLineNumber,n.endColumn+1))}}else if(i.endColumn===Number.MAX_VALUE&&i.startColumn===1&&n.startLineNumber===n.endLineNumber){let t=r.getLineFirstNonWhitespaceColumn(i.startLineNumber);t=0:!1}};a=Me([_e(0,C.IModelService),_e(1,b.IMarkerService)],a),e.MarkerDecorationsService=a}),define(Q[595],J([0,1,7,90,6,2,31,467,37,11,22,60,27,337]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LightBulbWidget=void 0;var s;(function(u){u.Hidden={type:0};class r{constructor(n,t,l,h){this.actions=n,this.trigger=t,this.editorPosition=l,this.widgetPosition=h,this.type=1}}u.Showing=r})(s||(s={}));let a=class At extends w.Disposable{constructor(r,i,n,t){super();this._editor=r,this._quickFixActionId=i,this._preferredFixActionId=n,this._keybindingService=t,this._onClick=this._register(new M.Emitter),this.onClick=this._onClick.event,this._state=s.Hidden,this._domNode=document.createElement("div"),this._domNode.className=o.Codicon.lightBulb.classNames,this._editor.addContentWidget(this),this._register(this._editor.onDidChangeModelContent(l=>{const h=this._editor.getModel();(this.state.type!==1||!h||this.state.editorPosition.lineNumber>=h.getLineCount())&&this.hide()})),c.Gesture.ignoreTarget(this._domNode),this._register(b.addStandardDisposableGenericMouseDownListner(this._domNode,l=>{if(this.state.type===1){this._editor.focus(),l.preventDefault();const{top:h,height:m}=b.getDomNodePagePosition(this._domNode),_=this._editor.getOption(53);let f=Math.floor(_/3);this.state.widgetPosition.position!==null&&this.state.widgetPosition.position.lineNumber{if((l.buttons&1)==1){this.hide();const h=new N.GlobalMouseMoveMonitor;h.startMonitoring(l.target,l.buttons,N.standardMouseMoveMerger,()=>{},()=>{h.dispose()})}})),this._register(this._editor.onDidChangeConfiguration(l=>{l.hasChanged(51)&&!this._editor.getOption(51).enabled&&this.hide()})),this._updateLightBulbTitleAndIcon(),this._register(this._keybindingService.onDidUpdateKeybindings(this._updateLightBulbTitleAndIcon,this))}dispose(){super.dispose(),this._editor.removeContentWidget(this)}getId(){return"LightBulbWidget"}getDomNode(){return this._domNode}getPosition(){return this._state.type===1?this._state.widgetPosition:null}update(r,i,n){if(r.validActions.length<=0)return this.hide();const t=this._editor.getOptions();if(!t.get(51).enabled)return this.hide();const l=this._editor.getModel();if(!l)return this.hide();const{lineNumber:h,column:m}=l.validatePosition(n),_=l.getOptions().tabSize,f=t.get(38),v=l.getLineContent(h),y=S.TextModel.computeIndentLevel(v,_),L=f.spaceWidth*y>22,I=E=>E>2&&this._editor.getTopForLineNumber(E)===this._editor.getTopForLineNumber(E-1);let k=h;if(!L){if(h>1&&!I(h-1))k-=1;else if(!I(h+1))k+=1;else if(m*f.spaceWidth<22)return this.hide()}this.state=new s.Showing(r,i,n,{position:{lineNumber:k,column:1},preference:At._posPref}),this._editor.layoutContentWidget(this)}hide(){this.state=s.Hidden,this._editor.layoutContentWidget(this)}get state(){return this._state}set state(r){this._state=r,this._updateLightBulbTitleAndIcon()}_updateLightBulbTitleAndIcon(){if(this.state.type===1&&this.state.actions.hasAutoFix){this._domNode.classList.remove(...o.Codicon.lightBulb.classNamesArray),this._domNode.classList.add(...o.Codicon.lightbulbAutofix.classNamesArray);const i=this._keybindingService.lookupKeybinding(this._preferredFixActionId);if(i){this.title=C.localize(0,null,i.getLabel());return}}this._domNode.classList.remove(...o.Codicon.lightbulbAutofix.classNamesArray),this._domNode.classList.add(...o.Codicon.lightBulb.classNamesArray);const r=this._keybindingService.lookupKeybinding(this._quickFixActionId);r?this.title=C.localize(1,null,r.getLabel()):this.title=C.localize(2,null)}set title(r){this._domNode.title=r}};a._posPref=[0],a=Me([_e(3,d.IKeybindingService)],a),e.LightBulbWidget=a,g.registerThemingParticipant((u,r)=>{var i;const n=(i=u.getColor(p.editorBackground))===null||i===void 0?void 0:i.transparent(.7),t=u.getColor(p.editorLightBulbForeground);t&&r.addRule(` + .monaco-editor .contentWidgets ${o.Codicon.lightBulb.cssSelector} { + color: ${t}; + background-color: ${n}; + }`);const l=u.getColor(p.editorLightBulbAutoFixForeground);l&&r.addRule(` + .monaco-editor .contentWidgets ${o.Codicon.lightbulbAutofix.cssSelector} { + color: ${l}; + background-color: ${n}; + }`)})}),define(Q[596],J([0,1,7,3,31,49,22,11,103,338]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeLensWidget=e.CodeLensHelper=void 0;class g{constructor(a,u,r){this.afterLineNumber=a,this.heightInPx=u,this._onHeight=r,this.suppressMouseDown=!0,this.domNode=document.createElement("div")}onComputedHeight(a){this._lastHeight===void 0?this._lastHeight=a:this._lastHeight!==a&&(this._lastHeight=a,this._onHeight())}}class p{constructor(a,u,r){this.allowEditorOverflow=!1,this.suppressMouseDown=!0,this._commands=new Map,this._isEmpty=!0,this._editor=a,this._id=`codelens.widget-${p._idPool++}`,this.updatePosition(r),this._domNode=document.createElement("span"),this._domNode.className=`codelens-decoration ${u}`}withCommands(a,u){this._commands.clear();let r=[],i=!1;for(let n=0;n{_.symbol.command&&m.push(_.symbol),i.addDecoration({range:_.symbol.range,options:M.ModelDecorationOptions.EMPTY},v=>this._decorationIds[f]=v),h?h=N.Range.plusRange(h,_.symbol.range):h=N.Range.lift(_.symbol.range)}),this._viewZone=new g(h.startLineNumber-1,t,l),this._viewZoneId=n.addZone(this._viewZone),m.length>0&&(this._createContentWidgetIfNecessary(),this._contentWidget.withCommands(m,!1))}_createContentWidgetIfNecessary(){this._contentWidget?this._editor.layoutContentWidget(this._contentWidget):(this._contentWidget=new p(this._editor,this._className,this._viewZone.afterLineNumber+1),this._editor.addContentWidget(this._contentWidget))}dispose(a,u){this._decorationIds.forEach(a.removeDecoration,a),this._decorationIds=[],u&&u.removeZone(this._viewZoneId),this._contentWidget&&(this._editor.removeContentWidget(this._contentWidget),this._contentWidget=void 0),this._isDisposed=!0}isDisposed(){return this._isDisposed}isValid(){return this._decorationIds.some((a,u)=>{const r=this._editor.getModel().getDecorationRange(a),i=this._data[u].symbol;return!!(r&&N.Range.isEmpty(i.range)===r.isEmpty())})}updateCodeLensSymbols(a,u){this._decorationIds.forEach(u.removeDecoration,u),this._decorationIds=[],this._data=a,this._data.forEach((r,i)=>{u.addDecoration({range:r.symbol.range,options:M.ModelDecorationOptions.EMPTY},n=>this._decorationIds[i]=n)})}updateHeight(a,u){this._viewZone.heightInPx=a,u.layoutZone(this._viewZoneId),this._contentWidget&&this._editor.layoutContentWidget(this._contentWidget)}computeIfNecessary(a){if(!this._viewZone.domNode.hasAttribute("monaco-visible-view-zone"))return null;for(let u=0;u{const u=s.getColor(w.editorCodeLensForeground);u&&(a.addRule(`.monaco-editor .codelens-decoration { color: ${u}; }`),a.addRule(`.monaco-editor .codelens-decoration .codicon { color: ${u}; }`));const r=s.getColor(S.editorActiveLinkForeground);r&&(a.addRule(`.monaco-editor .codelens-decoration > a:hover { color: ${r} !important; }`),a.addRule(`.monaco-editor .codelens-decoration > a:hover .codicon { color: ${r} !important; }`))})}),define(Q[597],J([0,1,35,7,90,52,29,6,2,22,11,339]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorPickerWidget=e.ColorPickerBody=e.ColorPickerHeader=void 0;const c=N.$;class o extends d.Disposable{constructor(l,h,m){super();this.model=h,this.domNode=c(".colorpicker-header"),N.append(l,this.domNode),this.pickedColorNode=N.append(this.domNode,c(".picked-color"));const _=N.append(this.domNode,c(".original-color"));_.style.backgroundColor=S.Color.Format.CSS.format(this.model.originalColor)||"",this.backgroundColor=m.getColorTheme().getColor(g.editorHoverBackground)||S.Color.white,this._register(p.registerThemingParticipant((f,v)=>{this.backgroundColor=f.getColor(g.editorHoverBackground)||S.Color.white})),this._register(N.addDisposableListener(this.pickedColorNode,N.EventType.CLICK,()=>this.model.selectNextColorPresentation())),this._register(N.addDisposableListener(_,N.EventType.CLICK,()=>{this.model.color=this.model.originalColor,this.model.flushColor()})),this._register(h.onDidChangeColor(this.onDidChangeColor,this)),this._register(h.onDidChangePresentation(this.onDidChangePresentation,this)),this.pickedColorNode.style.backgroundColor=S.Color.Format.CSS.format(h.color)||"",this.pickedColorNode.classList.toggle("light",h.color.rgba.a<.5?this.backgroundColor.isLighter():h.color.isLighter())}onDidChangeColor(l){this.pickedColorNode.style.backgroundColor=S.Color.Format.CSS.format(l)||"",this.pickedColorNode.classList.toggle("light",l.rgba.a<.5?this.backgroundColor.isLighter():l.isLighter()),this.onDidChangePresentation()}onDidChangePresentation(){this.pickedColorNode.textContent=this.model.presentation?this.model.presentation.label:""}}e.ColorPickerHeader=o;class s extends d.Disposable{constructor(l,h,m){super();this.model=h,this.pixelRatio=m,this.domNode=c(".colorpicker-body"),N.append(l,this.domNode),this.saturationBox=new a(this.domNode,this.model,this.pixelRatio),this._register(this.saturationBox),this._register(this.saturationBox.onDidChange(this.onDidSaturationValueChange,this)),this._register(this.saturationBox.onColorFlushed(this.flushColor,this)),this.opacityStrip=new r(this.domNode,this.model),this._register(this.opacityStrip),this._register(this.opacityStrip.onDidChange(this.onDidOpacityChange,this)),this._register(this.opacityStrip.onColorFlushed(this.flushColor,this)),this.hueStrip=new i(this.domNode,this.model),this._register(this.hueStrip),this._register(this.hueStrip.onDidChange(this.onDidHueChange,this)),this._register(this.hueStrip.onColorFlushed(this.flushColor,this))}flushColor(){this.model.flushColor()}onDidSaturationValueChange({s:l,v:h}){const m=this.model.color.hsva;this.model.color=new S.Color(new S.HSVA(m.h,l,h,m.a))}onDidOpacityChange(l){const h=this.model.color.hsva;this.model.color=new S.Color(new S.HSVA(h.h,h.s,h.v,l))}onDidHueChange(l){const h=this.model.color.hsva,m=(1-l)*360;this.model.color=new S.Color(new S.HSVA(m===360?0:m,h.s,h.v,h.a))}layout(){this.saturationBox.layout(),this.opacityStrip.layout(),this.hueStrip.layout()}}e.ColorPickerBody=s;class a extends d.Disposable{constructor(l,h,m){super();this.model=h,this.pixelRatio=m,this._onDidChange=new C.Emitter,this.onDidChange=this._onDidChange.event,this._onColorFlushed=new C.Emitter,this.onColorFlushed=this._onColorFlushed.event,this.domNode=c(".saturation-wrap"),N.append(l,this.domNode),this.canvas=document.createElement("canvas"),this.canvas.className="saturation-box",N.append(this.domNode,this.canvas),this.selection=c(".saturation-selection"),N.append(this.domNode,this.selection),this.layout(),this._register(N.addDisposableGenericMouseDownListner(this.domNode,_=>this.onMouseDown(_))),this._register(this.model.onDidChangeColor(this.onDidChangeColor,this)),this.monitor=null}onMouseDown(l){this.monitor=this._register(new M.GlobalMouseMoveMonitor);const h=N.getDomNodePagePosition(this.domNode);l.target!==this.selection&&this.onDidChangePosition(l.offsetX,l.offsetY),this.monitor.startMonitoring(l.target,l.buttons,M.standardMouseMoveMerger,_=>this.onDidChangePosition(_.posx-h.left,_.posy-h.top),()=>null);const m=N.addDisposableGenericMouseUpListner(document,()=>{this._onColorFlushed.fire(),m.dispose(),this.monitor&&(this.monitor.stopMonitoring(!0),this.monitor=null)},!0)}onDidChangePosition(l,h){const m=Math.max(0,Math.min(1,l/this.width)),_=Math.max(0,Math.min(1,1-h/this.height));this.paintSelection(m,_),this._onDidChange.fire({s:m,v:_})}layout(){this.width=this.domNode.offsetWidth,this.height=this.domNode.offsetHeight,this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio,this.paint();const l=this.model.color.hsva;this.paintSelection(l.s,l.v)}paint(){const l=this.model.color.hsva,h=new S.Color(new S.HSVA(l.h,1,1,1)),m=this.canvas.getContext("2d"),_=m.createLinearGradient(0,0,this.canvas.width,0);_.addColorStop(0,"rgba(255, 255, 255, 1)"),_.addColorStop(.5,"rgba(255, 255, 255, 0.5)"),_.addColorStop(1,"rgba(255, 255, 255, 0)");const f=m.createLinearGradient(0,0,0,this.canvas.height);f.addColorStop(0,"rgba(0, 0, 0, 0)"),f.addColorStop(1,"rgba(0, 0, 0, 1)"),m.rect(0,0,this.canvas.width,this.canvas.height),m.fillStyle=S.Color.Format.CSS.format(h),m.fill(),m.fillStyle=_,m.fill(),m.fillStyle=f,m.fill()}paintSelection(l,h){this.selection.style.left=`${l*this.width}px`,this.selection.style.top=`${this.height-h*this.height}px`}onDidChangeColor(){this.monitor&&this.monitor.isMonitoring()||this.paint()}}class u extends d.Disposable{constructor(l,h){super();this.model=h,this._onDidChange=new C.Emitter,this.onDidChange=this._onDidChange.event,this._onColorFlushed=new C.Emitter,this.onColorFlushed=this._onColorFlushed.event,this.domNode=N.append(l,c(".strip")),this.overlay=N.append(this.domNode,c(".overlay")),this.slider=N.append(this.domNode,c(".slider")),this.slider.style.top="0px",this._register(N.addDisposableGenericMouseDownListner(this.domNode,m=>this.onMouseDown(m))),this.layout()}layout(){this.height=this.domNode.offsetHeight-this.slider.offsetHeight;const l=this.getValue(this.model.color);this.updateSliderPosition(l)}onMouseDown(l){const h=this._register(new M.GlobalMouseMoveMonitor),m=N.getDomNodePagePosition(this.domNode);this.domNode.classList.add("grabbing"),l.target!==this.slider&&this.onDidChangeTop(l.offsetY),h.startMonitoring(l.target,l.buttons,M.standardMouseMoveMerger,f=>this.onDidChangeTop(f.posy-m.top),()=>null);const _=N.addDisposableGenericMouseUpListner(document,()=>{this._onColorFlushed.fire(),_.dispose(),h.stopMonitoring(!0),this.domNode.classList.remove("grabbing")},!0)}onDidChangeTop(l){const h=Math.max(0,Math.min(1,1-l/this.height));this.updateSliderPosition(h),this._onDidChange.fire(h)}updateSliderPosition(l){this.slider.style.top=`${(1-l)*this.height}px`}}class r extends u{constructor(l,h){super(l,h);this.domNode.classList.add("opacity-strip"),this._register(h.onDidChangeColor(this.onDidChangeColor,this)),this.onDidChangeColor(this.model.color)}onDidChangeColor(l){const{r:h,g:m,b:_}=l.rgba,f=new S.Color(new S.RGBA(h,m,_,1)),v=new S.Color(new S.RGBA(h,m,_,0));this.overlay.style.background=`linear-gradient(to bottom, ${f} 0%, ${v} 100%)`}getValue(l){return l.hsva.a}}class i extends u{constructor(l,h){super(l,h);this.domNode.classList.add("hue-strip")}getValue(l){return 1-l.hsva.h/360}}class n extends w.Widget{constructor(l,h,m,_){super();this.model=h,this.pixelRatio=m,this._register(b.onDidChangeZoomLevel(()=>this.layout()));const f=c(".colorpicker-widget");l.appendChild(f);const v=new o(f,this.model,_);this.body=new s(f,this.model,this.pixelRatio),this._register(v),this._register(this.body)}layout(){this.body.layout()}}e.ColorPickerWidget=n}),define(Q[598],J([0,1,3,53,31,22,11]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindDecorations=void 0;class C{constructor(g){this._editor=g,this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null,this._startPosition=this._editor.getPosition()}dispose(){this._editor.deltaDecorations(this._allDecorations(),[]),this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null}reset(){this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null}getCount(){return this._decorations.length}getFindScope(){return this._findScopeDecorationIds[0]?this._editor.getModel().getDecorationRange(this._findScopeDecorationIds[0]):null}getFindScopes(){if(this._findScopeDecorationIds.length){const g=this._findScopeDecorationIds.map(p=>this._editor.getModel().getDecorationRange(p)).filter(p=>!!p);if(g.length)return g}return null}getStartPosition(){return this._startPosition}setStartPosition(g){this._startPosition=g,this.setCurrentFindMatch(null)}_getDecorationIndex(g){const p=this._decorations.indexOf(g);return p>=0?p+1:1}getCurrentMatchesPosition(g){let p=this._editor.getModel().getDecorationsInRange(g);for(const c of p){const o=c.options;if(o===C._FIND_MATCH_DECORATION||o===C._CURRENT_FIND_MATCH_DECORATION)return this._getDecorationIndex(c.id)}return 0}setCurrentFindMatch(g){let p=null,c=0;if(g)for(let o=0,s=this._decorations.length;o{if(this._highlightedDecorationId!==null&&(o.changeDecorationOptions(this._highlightedDecorationId,C._FIND_MATCH_DECORATION),this._highlightedDecorationId=null),p!==null&&(this._highlightedDecorationId=p,o.changeDecorationOptions(this._highlightedDecorationId,C._CURRENT_FIND_MATCH_DECORATION)),this._rangeHighlightDecorationId!==null&&(o.removeDecoration(this._rangeHighlightDecorationId),this._rangeHighlightDecorationId=null),p!==null){let s=this._editor.getModel().getDecorationRange(p);if(s.startLineNumber!==s.endLineNumber&&s.endColumn===1){let a=s.endLineNumber-1,u=this._editor.getModel().getLineMaxColumn(a);s=new b.Range(s.startLineNumber,s.startColumn,a,u)}this._rangeHighlightDecorationId=o.addDecoration(s,C._RANGE_HIGHLIGHT_DECORATION)}}),c}set(g,p){this._editor.changeDecorations(c=>{let o=C._FIND_MATCH_DECORATION,s=[];if(g.length>1e3){o=C._FIND_MATCH_NO_OVERVIEW_DECORATION;const u=this._editor.getModel().getLineCount(),i=this._editor.getLayoutInfo().height/u,n=Math.max(2,Math.ceil(3/i));let t=g[0].range.startLineNumber,l=g[0].range.endLineNumber;for(let h=1,m=g.length;h=_.startLineNumber?_.endLineNumber>l&&(l=_.endLineNumber):(s.push({range:new b.Range(t,1,l,1),options:C._FIND_MATCH_ONLY_OVERVIEW_DECORATION}),t=_.startLineNumber,l=_.endLineNumber)}s.push({range:new b.Range(t,1,l,1),options:C._FIND_MATCH_ONLY_OVERVIEW_DECORATION})}let a=new Array(g.length);for(let u=0,r=g.length;uc.removeDecoration(u)),this._findScopeDecorationIds=[]),(p==null?void 0:p.length)&&(this._findScopeDecorationIds=p.map(u=>c.addDecoration(u,C._FIND_SCOPE_DECORATION)))})}matchBeforePosition(g){if(this._decorations.length===0)return null;for(let p=this._decorations.length-1;p>=0;p--){let c=this._decorations[p],o=this._editor.getModel().getDecorationRange(c);if(!(!o||o.endLineNumber>g.lineNumber)){if(o.endLineNumberg.column))return o}}return this._editor.getModel().getDecorationRange(this._decorations[this._decorations.length-1])}matchAfterPosition(g){if(this._decorations.length===0)return null;for(let p=0,c=this._decorations.length;pg.lineNumber)return s;if(!(s.startColumnthis.research(!1),100),this._toDispose.add(this._updateDecorationsScheduler),this._toDispose.add(this._editor.onDidChangeCursorPosition(t=>{(t.reason===3||t.reason===5||t.reason===6)&&this._decorations.setStartPosition(this._editor.getPosition())})),this._ignoreModelContentChanged=!1,this._toDispose.add(this._editor.onDidChangeModelContent(t=>{this._ignoreModelContentChanged||(t.isFlush&&this._decorations.reset(),this._decorations.setStartPosition(this._editor.getPosition()),this._updateDecorationsScheduler.schedule())})),this._toDispose.add(this._state.onFindReplaceStateChange(t=>this._onStateChanged(t))),this.research(!1,this._state.searchScope)}dispose(){this._isDisposed=!0,N.dispose(this._startSearchingTimer),this._toDispose.dispose()}_onStateChanged(i){this._isDisposed||!this._editor.hasModel()||(i.searchString||i.isReplaceRevealed||i.isRegex||i.wholeWord||i.matchCase||i.searchScope)&&(this._editor.getModel().isTooLargeForSyncing()?(this._startSearchingTimer.cancel(),this._startSearchingTimer.setIfNotSet(()=>{i.searchScope?this.research(i.moveCursor,this._state.searchScope):this.research(i.moveCursor)},a)):i.searchScope?this.research(i.moveCursor,this._state.searchScope):this.research(i.moveCursor))}static _getSearchRange(i,n){return n||i.getFullModelRange()}research(i,n){let t=null;typeof n!="undefined"?n!==null&&(Array.isArray(n)?t=n:t=[n]):t=this._decorations.getFindScopes(),t!==null&&(t=t.map(_=>{if(_.startLineNumber!==_.endLineNumber){let f=_.endLineNumber;return _.endColumn===1&&(f=f-1),new S.Range(_.startLineNumber,1,f,this._editor.getModel().getLineMaxColumn(f))}return _}));let l=this._findMatches(t,!1,e.MATCHES_LIMIT);this._decorations.set(l,t);const h=this._editor.getSelection();let m=this._decorations.getCurrentMatchesPosition(h);if(m===0&&l.length>0){const _=s.findFirstInSorted(l.map(f=>f.range),f=>S.Range.compareRangesUsingStarts(f,h)>=0);m=_>0?_-1+1:m}this._state.changeMatchInfo(m,this._decorations.getCount(),void 0),i&&this._editor.getOption(31).cursorMoveOnType&&this._moveToNextMatch(this._decorations.getStartPosition())}_hasMatches(){return this._state.matchesCount>0}_cannotFind(){if(!this._hasMatches()){let i=this._decorations.getFindScope();return i&&this._editor.revealRangeInCenterIfOutsideViewport(i,0),!0}return!1}_setCurrentFindMatch(i){let n=this._decorations.setCurrentFindMatch(i);this._state.changeMatchInfo(n,this._decorations.getCount(),i),this._editor.setSelection(i),this._editor.revealRangeInCenterIfOutsideViewport(i,0)}_prevSearchPosition(i){let n=this._state.isRegex&&(this._state.searchString.indexOf("^")>=0||this._state.searchString.indexOf("$")>=0),{lineNumber:t,column:l}=i,h=this._editor.getModel();return n||l===1?(t===1?t=h.getLineCount():t--,l=h.getLineMaxColumn(t)):l--,new w.Position(t,l)}_moveToPrevMatch(i,n=!1){if(!this._state.canNavigateBack()){const y=this._decorations.matchAfterPosition(i);y&&this._setCurrentFindMatch(y);return}if(this._decorations.getCount()=0||this._state.searchString.indexOf("$")>=0),{lineNumber:t,column:l}=i,h=this._editor.getModel();return n||l===h.getLineMaxColumn(t)?(t===h.getLineCount()?t=1:t++,l=1):l++,new w.Position(t,l)}_moveToNextMatch(i){if(!this._state.canNavigateForward()){const t=this._decorations.matchBeforePosition(i);t&&this._setCurrentFindMatch(t);return}if(this._decorations.getCount()u._getSearchRange(this._editor.getModel(),h));return this._editor.getModel().findMatches(this._state.searchString,l,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(110):null,n,t)}replaceAll(){if(!!this._hasMatches()){const i=this._decorations.getFindScopes();i===null&&this._state.matchesCount>=e.MATCHES_LIMIT?this._largeReplaceAll():this._regularReplaceAll(i),this.research(!1)}}_largeReplaceAll(){const n=new d.SearchParams(this._state.searchString,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(110):null).parseSearchRequest();if(!!n){let t=n.regex;if(!t.multiline){let L="mu";t.ignoreCase&&(L+="i"),t.global&&(L+="g"),t=new RegExp(t.source,L)}const l=this._editor.getModel(),h=l.getValue(1),m=l.getFullModelRange(),_=this._getReplacePattern();let f;const v=this._state.preserveCase;_.hasReplacementPatterns||v?f=h.replace(t,function(){return _.buildReplaceString(arguments,v)}):f=h.replace(t,_.buildReplaceString(null,v));let y=new M.ReplaceCommandThatPreservesSelection(m,f,this._editor.getSelection());this._executeEditorCommand("replaceAll",y)}}_regularReplaceAll(i){const n=this._getReplacePattern();let t=this._findMatches(i,n.hasReplacementPatterns||this._state.preserveCase,1073741824),l=[];for(let m=0,_=t.length;m<_;m++)l[m]=n.buildReplaceString(t[m].matches,this._state.preserveCase);let h=new p.ReplaceAllCommand(this._editor.getSelection(),t.map(m=>m.range),l);this._executeEditorCommand("replaceAll",h)}selectAllMatches(){if(!!this._hasMatches()){let i=this._decorations.getFindScopes(),t=this._findMatches(i,!1,1073741824).map(h=>new C.Selection(h.range.startLineNumber,h.range.startColumn,h.range.endLineNumber,h.range.endColumn)),l=this._editor.getSelection();for(let h=0,m=t.length;hthis._hide(),2e3)),this._isVisible=!1,this._editor=c,this._state=o,this._keybindingService=s,this._domNode=document.createElement("div"),this._domNode.className="findOptionsWidget",this._domNode.style.display="none",this._domNode.style.top="10px",this._domNode.setAttribute("role","presentation"),this._domNode.setAttribute("aria-hidden","true");const u=a.getColorTheme().getColor(C.inputActiveOptionBorder),r=a.getColorTheme().getColor(C.inputActiveOptionForeground),i=a.getColorTheme().getColor(C.inputActiveOptionBackground);this.caseSensitive=this._register(new N.CaseSensitiveCheckbox({appendTitle:this._keybindingLabelFor(S.FIND_IDS.ToggleCaseSensitiveCommand),isChecked:this._state.matchCase,inputActiveOptionBorder:u,inputActiveOptionForeground:r,inputActiveOptionBackground:i})),this._domNode.appendChild(this.caseSensitive.domNode),this._register(this.caseSensitive.onChange(()=>{this._state.change({matchCase:this.caseSensitive.checked},!1)})),this.wholeWords=this._register(new N.WholeWordsCheckbox({appendTitle:this._keybindingLabelFor(S.FIND_IDS.ToggleWholeWordCommand),isChecked:this._state.wholeWord,inputActiveOptionBorder:u,inputActiveOptionForeground:r,inputActiveOptionBackground:i})),this._domNode.appendChild(this.wholeWords.domNode),this._register(this.wholeWords.onChange(()=>{this._state.change({wholeWord:this.wholeWords.checked},!1)})),this.regex=this._register(new N.RegexCheckbox({appendTitle:this._keybindingLabelFor(S.FIND_IDS.ToggleRegexCommand),isChecked:this._state.isRegex,inputActiveOptionBorder:u,inputActiveOptionForeground:r,inputActiveOptionBackground:i})),this._domNode.appendChild(this.regex.domNode),this._register(this.regex.onChange(()=>{this._state.change({isRegex:this.regex.checked},!1)})),this._editor.addOverlayWidget(this),this._register(this._state.onFindReplaceStateChange(n=>{let t=!1;n.isRegex&&(this.regex.checked=this._state.isRegex,t=!0),n.wholeWord&&(this.wholeWords.checked=this._state.wholeWord,t=!0),n.matchCase&&(this.caseSensitive.checked=this._state.matchCase,t=!0),!this._state.isRevealed&&t&&this._revealTemporarily()})),this._register(b.addDisposableNonBubblingMouseOutListener(this._domNode,n=>this._onMouseOut())),this._register(b.addDisposableListener(this._domNode,"mouseover",n=>this._onMouseOver())),this._applyTheme(a.getColorTheme()),this._register(a.onDidColorThemeChange(this._applyTheme.bind(this)))}_keybindingLabelFor(c){let o=this._keybindingService.lookupKeybinding(c);return o?` (${o.getLabel()})`:""}dispose(){this._editor.removeOverlayWidget(this),super.dispose()}getId(){return g.ID}getDomNode(){return this._domNode}getPosition(){return{preference:0}}highlightFindOptions(){this._revealTemporarily()}_revealTemporarily(){this._show(),this._hideSoon.schedule()}_onMouseOut(){this._hideSoon.schedule()}_onMouseOver(){this._hideSoon.cancel()}_show(){this._isVisible||(this._isVisible=!0,this._domNode.style.display="block")}_hide(){!this._isVisible||(this._isVisible=!1,this._domNode.style.display="none")}_applyTheme(c){let o={inputActiveOptionBorder:c.getColor(C.inputActiveOptionBorder),inputActiveOptionForeground:c.getColor(C.inputActiveOptionForeground),inputActiveOptionBackground:c.getColor(C.inputActiveOptionBackground)};this.caseSensitive.style(o),this.wholeWords.style(o),this.regex.style(o)}}e.FindOptionsWidget=g,g.ID="editor.contrib.findOptionsWidget",d.registerThemingParticipant((p,c)=>{const o=p.getColor(C.editorWidgetBackground);o&&c.addRule(`.monaco-editor .findOptionsWidget { background-color: ${o}; }`);const s=p.getColor(C.editorWidgetForeground);s&&c.addRule(`.monaco-editor .findOptionsWidget { color: ${s}; }`);const a=p.getColor(C.widgetShadow);a&&c.addRule(`.monaco-editor .findOptionsWidget { box-shadow: 0 0 8px 2px ${a}; }`);const u=p.getColor(C.contrastBorder);u&&c.addRule(`.monaco-editor .findOptionsWidget { border: 2px solid ${u}; }`)})}),define(Q[600],J([0,1,6,2,3,142]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FindReplaceState=void 0;function S(d,g){return d===1?!0:d===2?!1:g}class C extends N.Disposable{constructor(){super();this._onFindReplaceStateChange=this._register(new b.Emitter),this.onFindReplaceStateChange=this._onFindReplaceStateChange.event,this._searchString="",this._replaceString="",this._isRevealed=!1,this._isReplaceRevealed=!1,this._isRegex=!1,this._isRegexOverride=0,this._wholeWord=!1,this._wholeWordOverride=0,this._matchCase=!1,this._matchCaseOverride=0,this._preserveCase=!1,this._preserveCaseOverride=0,this._searchScope=null,this._matchesPosition=0,this._matchesCount=0,this._currentMatch=null,this._loop=!0}get searchString(){return this._searchString}get replaceString(){return this._replaceString}get isRevealed(){return this._isRevealed}get isReplaceRevealed(){return this._isReplaceRevealed}get isRegex(){return S(this._isRegexOverride,this._isRegex)}get wholeWord(){return S(this._wholeWordOverride,this._wholeWord)}get matchCase(){return S(this._matchCaseOverride,this._matchCase)}get preserveCase(){return S(this._preserveCaseOverride,this._preserveCase)}get actualIsRegex(){return this._isRegex}get actualWholeWord(){return this._wholeWord}get actualMatchCase(){return this._matchCase}get actualPreserveCase(){return this._preserveCase}get searchScope(){return this._searchScope}get matchesPosition(){return this._matchesPosition}get matchesCount(){return this._matchesCount}get currentMatch(){return this._currentMatch}changeMatchInfo(g,p,c){let o={moveCursor:!1,updateHistory:!1,searchString:!1,replaceString:!1,isRevealed:!1,isReplaceRevealed:!1,isRegex:!1,wholeWord:!1,matchCase:!1,preserveCase:!1,searchScope:!1,matchesPosition:!1,matchesCount:!1,currentMatch:!1,loop:!1},s=!1;p===0&&(g=0),g>p&&(g=p),this._matchesPosition!==g&&(this._matchesPosition=g,o.matchesPosition=!0,s=!0),this._matchesCount!==p&&(this._matchesCount=p,o.matchesCount=!0,s=!0),typeof c!="undefined"&&(M.Range.equalsRange(this._currentMatch,c)||(this._currentMatch=c,o.currentMatch=!0,s=!0)),s&&this._onFindReplaceStateChange.fire(o)}change(g,p,c=!0){var o;let s={moveCursor:p,updateHistory:c,searchString:!1,replaceString:!1,isRevealed:!1,isReplaceRevealed:!1,isRegex:!1,wholeWord:!1,matchCase:!1,preserveCase:!1,searchScope:!1,matchesPosition:!1,matchesCount:!1,currentMatch:!1,loop:!1},a=!1;const u=this.isRegex,r=this.wholeWord,i=this.matchCase,n=this.preserveCase;typeof g.searchString!="undefined"&&this._searchString!==g.searchString&&(this._searchString=g.searchString,s.searchString=!0,a=!0),typeof g.replaceString!="undefined"&&this._replaceString!==g.replaceString&&(this._replaceString=g.replaceString,s.replaceString=!0,a=!0),typeof g.isRevealed!="undefined"&&this._isRevealed!==g.isRevealed&&(this._isRevealed=g.isRevealed,s.isRevealed=!0,a=!0),typeof g.isReplaceRevealed!="undefined"&&this._isReplaceRevealed!==g.isReplaceRevealed&&(this._isReplaceRevealed=g.isReplaceRevealed,s.isReplaceRevealed=!0,a=!0),typeof g.isRegex!="undefined"&&(this._isRegex=g.isRegex),typeof g.wholeWord!="undefined"&&(this._wholeWord=g.wholeWord),typeof g.matchCase!="undefined"&&(this._matchCase=g.matchCase),typeof g.preserveCase!="undefined"&&(this._preserveCase=g.preserveCase),typeof g.searchScope!="undefined"&&(((o=g.searchScope)===null||o===void 0?void 0:o.every(t=>{var l;return(l=this._searchScope)===null||l===void 0?void 0:l.some(h=>!M.Range.equalsRange(h,t))}))||(this._searchScope=g.searchScope,s.searchScope=!0,a=!0)),typeof g.loop!="undefined"&&this._loop!==g.loop&&(this._loop=g.loop,s.loop=!0,a=!0),this._isRegexOverride=typeof g.isRegexOverride!="undefined"?g.isRegexOverride:0,this._wholeWordOverride=typeof g.wholeWordOverride!="undefined"?g.wholeWordOverride:0,this._matchCaseOverride=typeof g.matchCaseOverride!="undefined"?g.matchCaseOverride:0,this._preserveCaseOverride=typeof g.preserveCaseOverride!="undefined"?g.preserveCaseOverride:0,u!==this.isRegex&&(a=!0,s.isRegex=!0),r!==this.wholeWord&&(a=!0,s.wholeWord=!0),i!==this.matchCase&&(a=!0,s.matchCase=!0),n!==this.preserveCase&&(a=!0,s.preserveCase=!0),a&&this._onFindReplaceStateChange.fire(s)}canNavigateBack(){return this.canNavigateInLoop()||this.matchesPosition!==1}canNavigateForward(){return this.canNavigateInLoop()||this.matchesPosition=w.MATCHES_LIMIT}}e.FindReplaceState=C}),define(Q[601],J([0,1,132,67,175,205,115,11,116,7,484,159,44,2,9,37,66,157]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AccessibilityProvider=e.OneReferenceRenderer=e.FileReferencesRenderer=e.IdentityProvider=e.StringRepresentationProvider=e.Delegate=e.DataSource=void 0;let n=class{constructor(I){this._resolverService=I}hasChildren(I){return I instanceof b.ReferencesModel||I instanceof b.FileReferences}getChildren(I){if(I instanceof b.ReferencesModel)return I.groups;if(I instanceof b.FileReferences)return I.resolve(this._resolverService).then(k=>k.children);throw new Error("bad tree")}};n=Me([_e(0,N.ITextModelService)],n),e.DataSource=n;class t{getHeight(){return 23}getTemplateId(I){return I instanceof b.FileReferences?_.id:v.id}}e.Delegate=t;let l=class{constructor(I){this._keybindingService=I}getKeyboardNavigationLabel(I){var k;if(I instanceof b.OneReference){const E=(k=I.parent.getPreview(I))===null||k===void 0?void 0:k.preview(I.range);if(E)return E.value}return o.basename(I.uri)}};l=Me([_e(0,u.IKeybindingService)],l),e.StringRepresentationProvider=l;class h{getId(I){return I instanceof b.OneReference?I.id:I.uri}}e.IdentityProvider=h;let m=class extends s.Disposable{constructor(I,k,E){super();this._uriLabel=k;const T=document.createElement("div");T.classList.add("reference-file"),this.file=this._register(new M.IconLabel(T,{supportHighlights:!0})),this.badge=new w.CountBadge(g.append(T,g.$(".count"))),this._register(d.attachBadgeStyler(this.badge,E)),I.appendChild(T)}set(I,k){let E=o.dirname(I.uri);this.file.setLabel(c.getBaseLabel(I.uri),this._uriLabel.getUriLabel(E,{relative:!0}),{title:this._uriLabel.getUriLabel(I.uri),matches:k});const T=I.children.length;this.badge.setCount(T),T>1?this.badge.setTitleFormat(p.localize(0,null,T)):this.badge.setTitleFormat(p.localize(1,null,T))}};m=Me([_e(1,S.ILabelService),_e(2,C.IThemeService)],m);let _=class Ot{constructor(I){this._instantiationService=I,this.templateId=Ot.id}renderTemplate(I){return this._instantiationService.createInstance(m,I)}renderElement(I,k,E){E.set(I.element,r.createMatches(I.filterData))}disposeTemplate(I){I.dispose()}};_.id="FileReferencesRenderer",_=Me([_e(0,a.IInstantiationService)],_),e.FileReferencesRenderer=_;class f{constructor(I){this.label=new i.HighlightedLabel(I,!1)}set(I,k){var E;const T=(E=I.parent.getPreview(I))===null||E===void 0?void 0:E.preview(I.range);if(!T||!T.value)this.label.set(`${o.basename(I.uri)}:${I.range.startLineNumber+1}:${I.range.startColumn+1}`);else{const{value:O,highlight:A}=T;k&&!r.FuzzyScore.isDefault(k)?(this.label.element.classList.toggle("referenceMatch",!1),this.label.set(O,r.createMatches(k))):(this.label.element.classList.toggle("referenceMatch",!0),this.label.set(O,[A]))}}}class v{constructor(){this.templateId=v.id}renderTemplate(I){return new f(I)}renderElement(I,k,E){E.set(I.element,I.filterData)}disposeTemplate(){}}e.OneReferenceRenderer=v,v.id="OneReferenceRenderer";class y{getWidgetAriaLabel(){return p.localize(2,null)}getAriaLabel(I){return I.ariaMessage}}e.AccessibilityProvider=y}),define(Q[258],J([0,1,53,11,49,2,108,20,88]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEditorNavigationQuickAccessProvider=void 0;class g{constructor(c){this.options=c,this.rangeHighlightDecorationId=void 0}provide(c,o){var s;const a=new w.DisposableStore;c.canAcceptInBackground=!!((s=this.options)===null||s===void 0?void 0:s.canAcceptInBackground),c.matchOnLabel=c.matchOnDescription=c.matchOnDetail=c.sortByLabel=!1;const u=a.add(new w.MutableDisposable);return u.value=this.doProvide(c,o),a.add(this.onDidActiveTextEditorControlChange(()=>{u.value=void 0,u.value=this.doProvide(c,o)})),a}doProvide(c,o){const s=new w.DisposableStore,a=this.activeTextEditorControl;if(a&&this.canProvideWithTextEditor(a)){const u={editor:a},r=S.getCodeEditor(a);if(r){let i=C.withNullAsUndefined(a.saveViewState());s.add(r.onDidChangeCursorPosition(()=>{i=C.withNullAsUndefined(a.saveViewState())})),u.restoreViewState=()=>{i&&a===this.activeTextEditorControl&&a.restoreViewState(i)},s.add(d.once(o.onCancellationRequested)(()=>{var n;return(n=u.restoreViewState)===null||n===void 0?void 0:n.call(u)}))}s.add(w.toDisposable(()=>this.clearDecorations(a))),s.add(this.provideWithTextEditor(u,c,o))}else s.add(this.provideWithoutTextEditor(c,o));return s}canProvideWithTextEditor(c){return!0}gotoLocation({editor:c},o){c.setSelection(o.range),c.revealRangeInCenter(o.range,0),o.preserveFocus||c.focus()}getModel(c){var o;return S.isDiffEditor(c)?(o=c.getModel())===null||o===void 0?void 0:o.modified:c.getModel()}addDecorations(c,o){c.changeDecorations(s=>{const a=[];this.rangeHighlightDecorationId&&(a.push(this.rangeHighlightDecorationId.overviewRulerDecorationId),a.push(this.rangeHighlightDecorationId.rangeHighlightId),this.rangeHighlightDecorationId=void 0);const u=[{range:o,options:{className:"rangeHighlight",isWholeLine:!0}},{range:o,options:{overviewRuler:{color:N.themeColorFromId(M.overviewRulerRangeHighlight),position:b.OverviewRulerLane.Full}}}],[r,i]=s.deltaDecorations(a,u);this.rangeHighlightDecorationId={rangeHighlightId:r,overviewRulerDecorationId:i}})}clearDecorations(c){const o=this.rangeHighlightDecorationId;o&&(c.changeDecorations(s=>{s.deltaDecorations([o.overviewRulerDecorationId,o.rangeHighlightId],[])}),this.rangeHighlightDecorationId=void 0)}}e.AbstractEditorNavigationQuickAccessProvider=g}),define(Q[602],J([0,1,501,2,258,108]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractGotoLineQuickAccessProvider=void 0;class S extends M.AbstractEditorNavigationQuickAccessProvider{constructor(){super({canAcceptInBackground:!0})}provideWithoutTextEditor(d){const g=b.localize(0,null);return d.items=[{label:g}],d.ariaLabel=g,N.Disposable.None}provideWithTextEditor(d,g,p){const c=d.editor,o=new N.DisposableStore;o.add(g.onDidAccept(u=>{const[r]=g.selectedItems;if(r){if(!this.isValidLineNumber(c,r.lineNumber))return;this.gotoLocation(d,{range:this.toRange(r.lineNumber,r.column),keyMods:g.keyMods,preserveFocus:u.inBackground}),u.inBackground||g.hide()}}));const s=()=>{const u=this.parsePosition(c,g.value.trim().substr(S.PREFIX.length)),r=this.getPickLabel(c,u.lineNumber,u.column);if(g.items=[{lineNumber:u.lineNumber,column:u.column,label:r}],g.ariaLabel=r,!this.isValidLineNumber(c,u.lineNumber)){this.clearDecorations(c);return}const i=this.toRange(u.lineNumber,u.column);c.revealRangeInCenter(i,0),this.addDecorations(c,i)};s(),o.add(g.onDidChangeValue(()=>s()));const a=w.getCodeEditor(c);return a&&a.getOptions().get(54).renderType===2&&(a.updateOptions({lineNumbers:"on"}),o.add(N.toDisposable(()=>a.updateOptions({lineNumbers:"relative"})))),o}toRange(d=1,g=1){return{startLineNumber:d,startColumn:g,endLineNumber:d,endColumn:g}}parsePosition(d,g){const p=g.split(/,|:|#/).map(o=>parseInt(o,10)).filter(o=>!isNaN(o)),c=this.lineCount(d)+1;return{lineNumber:p[0]>0?p[0]:c+p[0],column:p[1]}}getPickLabel(d,g,p){if(this.isValidLineNumber(d,g))return this.isValidColumn(d,g,p)?b.localize(1,null,g,p):b.localize(2,null,g);const c=d.getPosition()||{lineNumber:1,column:1},o=this.lineCount(d);return o>1?b.localize(3,null,c.lineNumber,c.column,o):b.localize(4,null,c.lineNumber,c.column)}isValidLineNumber(d,g){return!g||typeof g!="number"?!1:g>0&&g<=this.lineCount(d)}isValidColumn(d,g,p){if(!p||typeof p!="number")return!1;const c=this.getModel(d);if(!c)return!1;const o={lineNumber:g,column:p};return c.validatePosition(o).equals(o)}lineCount(d){var g,p;return(p=(g=this.getModel(d))===null||g===void 0?void 0:g.getLineCount())!==null&&p!==void 0?p:0}}e.AbstractGotoLineQuickAccessProvider=S,S.PREFIX=":"}),define(Q[603],J([0,1,502,23,2,3,258,18,245,8,286,27]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractGotoSymbolQuickAccessProvider=void 0;class o extends S.AbstractEditorNavigationQuickAccessProvider{constructor(r=Object.create(null)){super(r);this.options=r,r.canAcceptInBackground=!0}provideWithoutTextEditor(r){return this.provideLabelPick(r,b.localize(0,null)),M.Disposable.None}provideWithTextEditor(r,i,n){const t=r.editor,l=this.getModel(t);return l?C.DocumentSymbolProviderRegistry.has(l)?this.doProvideWithEditorSymbols(r,l,i,n):this.doProvideWithoutEditorSymbols(r,l,i,n):M.Disposable.None}doProvideWithoutEditorSymbols(r,i,n,t){const l=new M.DisposableStore;return this.provideLabelPick(n,b.localize(1,null)),(()=>Ie(this,void 0,void 0,function*(){!(yield this.waitForLanguageSymbolRegistry(i,l))||t.isCancellationRequested||l.add(this.doProvideWithEditorSymbols(r,i,n,t))}))(),l}provideLabelPick(r,i){r.items=[{label:i,index:0,kind:14}],r.ariaLabel=i}waitForLanguageSymbolRegistry(r,i){return Ie(this,void 0,void 0,function*(){if(C.DocumentSymbolProviderRegistry.has(r))return!0;let n;const t=new Promise(h=>n=h),l=i.add(C.DocumentSymbolProviderRegistry.onDidChange(()=>{C.DocumentSymbolProviderRegistry.has(r)&&(l.dispose(),n(!0))}));return i.add(M.toDisposable(()=>n(!1))),t})}doProvideWithEditorSymbols(r,i,n,t){const l=r.editor,h=new M.DisposableStore;h.add(n.onDidAccept(y=>{const[L]=n.selectedItems;L&&L.range&&(this.gotoLocation(r,{range:L.range.selection,keyMods:n.keyMods,preserveFocus:y.inBackground}),y.inBackground||n.hide())})),h.add(n.onDidTriggerItemButton(({item:y})=>{y&&y.range&&(this.gotoLocation(r,{range:y.range.selection,keyMods:n.keyMods,forceSideBySide:!0}),n.hide())}));const m=this.getDocumentSymbols(i,t);let _;const f=()=>Ie(this,void 0,void 0,function*(){_==null||_.dispose(!0),n.busy=!1,_=new N.CancellationTokenSource(t),n.busy=!0;try{const y=p.prepareQuery(n.value.substr(o.PREFIX.length).trim()),L=yield this.doGetSymbolPicks(m,y,void 0,_.token);if(t.isCancellationRequested)return;L.length>0?n.items=L:y.original.length>0?this.provideLabelPick(n,b.localize(2,null)):this.provideLabelPick(n,b.localize(3,null))}finally{t.isCancellationRequested||(n.busy=!1)}});h.add(n.onDidChangeValue(()=>f())),f();let v=!0;return h.add(n.onDidChangeActive(()=>{const[y]=n.activeItems;if(y&&y.range){if(v){v=!1;return}l.revealRangeInCenter(y.range.selection,0),this.addDecorations(l,y.range.decoration)}})),h}doGetSymbolPicks(r,i,n,t){return Ie(this,void 0,void 0,function*(){const l=yield r;if(t.isCancellationRequested)return[];const h=i.original.indexOf(o.SCOPE_PREFIX)===0,m=h?1:0;let _,f;i.values&&i.values.length>1?(_=p.pieceToQuery(i.values[0]),f=p.pieceToQuery(i.values.slice(1))):_=i;const v=[];for(let k=0;km){let K=!1;if(_!==i&&([F,D]=p.scoreFuzzy2(O,Object.assign(Object.assign({},i),{values:void 0}),m,A),typeof F=="number"&&(K=!0)),typeof F!="number"&&([F,D]=p.scoreFuzzy2(O,_,m,A),typeof F!="number"))continue;if(!K&&f){if(B&&f.original.length>0&&([R,W]=p.scoreFuzzy2(B,f)),typeof R!="number")continue;typeof F=="number"&&(F+=R)}}const x=E.tags&&E.tags.indexOf(1)>=0;v.push({index:k,kind:E.kind,score:F,label:O,ariaLabel:T,description:B,highlights:x?void 0:{label:D,description:W},range:{selection:w.Range.collapseToStart(E.selectionRange),decoration:E.range},strikethrough:x,buttons:(()=>{var K,Y;const ee=((K=this.options)===null||K===void 0?void 0:K.openSideBySideDirection)?(Y=this.options)===null||Y===void 0?void 0:Y.openSideBySideDirection():void 0;if(!!ee)return[{iconClass:ee==="right"?c.Codicon.splitHorizontal.classNames:c.Codicon.splitVertical.classNames,tooltip:ee==="right"?b.localize(4,null):b.localize(5,null)}]})()})}const y=v.sort((k,E)=>h?this.compareByKindAndScore(k,E):this.compareByScore(k,E));let L=[];if(h){let k,E,T=0;function I(){E&&typeof k=="number"&&T>0&&(E.label=g.format(a[k]||s,T))}for(const O of y)k!==O.kind?(I(),k=O.kind,T=1,E={type:"separator"},L.push(E)):T++,L.push(O);I()}else y.length>0&&(L=[{label:b.localize(6,null,v.length),type:"separator"},...y]);return L})}compareByScore(r,i){if(typeof r.score!="number"&&typeof i.score=="number")return 1;if(typeof r.score=="number"&&typeof i.score!="number")return-1;if(typeof r.score=="number"&&typeof i.score=="number"){if(r.score>i.score)return-1;if(r.scorei.index?1:0}compareByKindAndScore(r,i){const n=a[r.kind]||s,t=a[i.kind]||s,l=n.localeCompare(t);return l===0?this.compareByScore(r,i):l}getDocumentSymbols(r,i){return Ie(this,void 0,void 0,function*(){const n=yield d.OutlineModel.create(r,i);return i.isCancellationRequested?[]:n.asListOfDocumentSymbols()})}}e.AbstractGotoSymbolQuickAccessProvider=o,o.PREFIX="@",o.SCOPE_PREFIX=":",o.PREFIX_BY_CATEGORY=`${o.PREFIX}${o.SCOPE_PREFIX}`;const s=b.localize(7,null),a={[5]:b.localize(8,null),[11]:b.localize(9,null),[8]:b.localize(10,null),[12]:b.localize(11,null),[4]:b.localize(12,null),[22]:b.localize(13,null),[23]:b.localize(14,null),[24]:b.localize(15,null),[10]:b.localize(16,null),[2]:b.localize(17,null),[3]:b.localize(18,null),[25]:b.localize(19,null),[1]:b.localize(20,null),[6]:b.localize(21,null),[9]:b.localize(22,null),[21]:b.localize(23,null),[14]:b.localize(24,null),[0]:b.localize(25,null),[17]:b.localize(26,null),[15]:b.localize(27,null),[16]:b.localize(28,null),[18]:b.localize(29,null),[19]:b.localize(30,null),[7]:b.localize(31,null),[13]:b.localize(32,null)}}),define(Q[604],J([0,1,2,14,504,16,22,11,37,350]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RenameInputField=e.CONTEXT_RENAME_INPUT_VISIBLE=void 0,e.CONTEXT_RENAME_INPUT_VISIBLE=new w.RawContextKey("renameInputVisible",!1);let g=class{constructor(c,o,s,a,u){this._editor=c,this._acceptKeybindings=o,this._themeService=s,this._keybindingService=a,this._disposables=new b.DisposableStore,this.allowEditorOverflow=!0,this._visibleContextKey=e.CONTEXT_RENAME_INPUT_VISIBLE.bindTo(u),this._editor.addContentWidget(this),this._disposables.add(this._editor.onDidChangeConfiguration(r=>{r.hasChanged(38)&&this._updateFont()})),this._disposables.add(s.onDidColorThemeChange(this._updateStyles,this))}dispose(){this._disposables.dispose(),this._editor.removeContentWidget(this)}getId(){return"__renameInputWidget"}getDomNode(){if(!this._domNode){this._domNode=document.createElement("div"),this._domNode.className="monaco-editor rename-box",this._input=document.createElement("input"),this._input.className="rename-input",this._input.type="text",this._input.setAttribute("aria-label",M.localize(0,null)),this._domNode.appendChild(this._input),this._label=document.createElement("div"),this._label.className="rename-label",this._domNode.appendChild(this._label);const c=()=>{var o,s;const[a,u]=this._acceptKeybindings;this._keybindingService.lookupKeybinding(a),this._label.innerText=M.localize(1,null,(o=this._keybindingService.lookupKeybinding(a))===null||o===void 0?void 0:o.getLabel(),(s=this._keybindingService.lookupKeybinding(u))===null||s===void 0?void 0:s.getLabel())};c(),this._disposables.add(this._keybindingService.onDidUpdateKeybindings(c)),this._updateFont(),this._updateStyles(this._themeService.getColorTheme())}return this._domNode}_updateStyles(c){var o,s,a,u;if(!(!this._input||!this._domNode)){const r=c.getColor(S.widgetShadow);this._domNode.style.backgroundColor=String((o=c.getColor(S.editorWidgetBackground))!==null&&o!==void 0?o:""),this._domNode.style.boxShadow=r?` 0 0 8px 2px ${r}`:"",this._domNode.style.color=String((s=c.getColor(S.inputForeground))!==null&&s!==void 0?s:""),this._input.style.backgroundColor=String((a=c.getColor(S.inputBackground))!==null&&a!==void 0?a:"");const i=c.getColor(S.inputBorder);this._input.style.borderWidth=i?"1px":"0px",this._input.style.borderStyle=i?"solid":"none",this._input.style.borderColor=(u=i==null?void 0:i.toString())!==null&&u!==void 0?u:"none"}}_updateFont(){if(!(!this._input||!this._label)){const c=this._editor.getOption(38);this._input.style.fontFamily=c.fontFamily,this._input.style.fontWeight=c.fontWeight,this._input.style.fontSize=`${c.fontSize}px`,this._label.style.fontSize=`${c.fontSize*.8}px`}}getPosition(){return this._visible?{position:this._position,preference:[2,1]}:null}afterRender(c){c||this.cancelInput(!0)}acceptInput(c){this._currentAcceptInput&&this._currentAcceptInput(c)}cancelInput(c){this._currentCancelInput&&this._currentCancelInput(c)}getInput(c,o,s,a,u,r){this._domNode.classList.toggle("preview",u),this._position=new N.Position(c.startLineNumber,c.startColumn),this._input.value=o,this._input.setAttribute("selectionStart",s.toString()),this._input.setAttribute("selectionEnd",a.toString()),this._input.size=Math.max((c.endColumn-c.startColumn)*1.1,20);const i=new b.DisposableStore;return new Promise(n=>{this._currentCancelInput=t=>(this._currentAcceptInput=void 0,this._currentCancelInput=void 0,n(t),!0),this._currentAcceptInput=t=>{if(this._input.value.trim().length===0||this._input.value===o){this.cancelInput(!0);return}this._currentAcceptInput=void 0,this._currentCancelInput=void 0,n({newName:this._input.value,wantsPreview:u&&t})},r.onCancellationRequested(()=>this.cancelInput(!0)),i.add(this._editor.onDidBlurEditorWidget(()=>this.cancelInput(!1))),this._show()}).finally(()=>{i.dispose(),this._hide()})}_show(){this._editor.revealLineInCenterIfOutsideViewport(this._position.lineNumber,0),this._visible=!0,this._visibleContextKey.set(!0),this._editor.layoutContentWidget(this),setTimeout(()=>{this._input.focus(),this._input.setSelectionRange(parseInt(this._input.getAttribute("selectionStart")),parseInt(this._input.getAttribute("selectionEnd")))},100)}_hide(){this._visible=!1,this._visibleContextKey.reset(),this._editor.layoutContentWidget(this)}};g=Me([_e(2,C.IThemeService),_e(3,d.IKeybindingService),_e(4,w.IContextKeyService)],g),e.RenameInputField=g}),define(Q[259],J([0,1,512,11,22,27]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SYMBOL_ICON_VARIABLE_FOREGROUND=e.SYMBOL_ICON_UNIT_FOREGROUND=e.SYMBOL_ICON_TYPEPARAMETER_FOREGROUND=e.SYMBOL_ICON_TEXT_FOREGROUND=e.SYMBOL_ICON_STRUCT_FOREGROUND=e.SYMBOL_ICON_STRING_FOREGROUND=e.SYMBOL_ICON_SNIPPET_FOREGROUND=e.SYMBOL_ICON_REFERENCE_FOREGROUND=e.SYMBOL_ICON_PROPERTY_FOREGROUND=e.SYMBOL_ICON_PACKAGE_FOREGROUND=e.SYMBOL_ICON_OPERATOR_FOREGROUND=e.SYMBOL_ICON_OBJECT_FOREGROUND=e.SYMBOL_ICON_NUMBER_FOREGROUND=e.SYMBOL_ICON_NULL_FOREGROUND=e.SYMBOL_ICON_NAMESPACE_FOREGROUND=e.SYMBOL_ICON_MODULE_FOREGROUND=e.SYMBOL_ICON_METHOD_FOREGROUND=e.SYMBOL_ICON_KEYWORD_FOREGROUND=e.SYMBOL_ICON_KEY_FOREGROUND=e.SYMBOL_ICON_INTERFACE_FOREGROUND=e.SYMBOL_ICON_FUNCTION_FOREGROUND=e.SYMBOL_ICON_FOLDER_FOREGROUND=e.SYMBOL_ICON_FILE_FOREGROUND=e.SYMBOL_ICON_FIELD_FOREGROUND=e.SYMBOL_ICON_EVENT_FOREGROUND=e.SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND=e.SYMBOL_ICON_ENUMERATOR_FOREGROUND=e.SYMBOL_ICON_CONSTRUCTOR_FOREGROUND=e.SYMBOL_ICON_CONSTANT_FOREGROUND=e.SYMBOL_ICON_COLOR_FOREGROUND=e.SYMBOL_ICON_CLASS_FOREGROUND=e.SYMBOL_ICON_BOOLEAN_FOREGROUND=e.SYMBOL_ICON_ARRAY_FOREGROUND=void 0,e.SYMBOL_ICON_ARRAY_FOREGROUND=M.registerColor("symbolIcon.arrayForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(0,null)),e.SYMBOL_ICON_BOOLEAN_FOREGROUND=M.registerColor("symbolIcon.booleanForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(1,null)),e.SYMBOL_ICON_CLASS_FOREGROUND=M.registerColor("symbolIcon.classForeground",{dark:"#EE9D28",light:"#D67E00",hc:"#EE9D28"},b.localize(2,null)),e.SYMBOL_ICON_COLOR_FOREGROUND=M.registerColor("symbolIcon.colorForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(3,null)),e.SYMBOL_ICON_CONSTANT_FOREGROUND=M.registerColor("symbolIcon.constantForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(4,null)),e.SYMBOL_ICON_CONSTRUCTOR_FOREGROUND=M.registerColor("symbolIcon.constructorForeground",{dark:"#B180D7",light:"#652D90",hc:"#B180D7"},b.localize(5,null)),e.SYMBOL_ICON_ENUMERATOR_FOREGROUND=M.registerColor("symbolIcon.enumeratorForeground",{dark:"#EE9D28",light:"#D67E00",hc:"#EE9D28"},b.localize(6,null)),e.SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND=M.registerColor("symbolIcon.enumeratorMemberForeground",{dark:"#75BEFF",light:"#007ACC",hc:"#75BEFF"},b.localize(7,null)),e.SYMBOL_ICON_EVENT_FOREGROUND=M.registerColor("symbolIcon.eventForeground",{dark:"#EE9D28",light:"#D67E00",hc:"#EE9D28"},b.localize(8,null)),e.SYMBOL_ICON_FIELD_FOREGROUND=M.registerColor("symbolIcon.fieldForeground",{dark:"#75BEFF",light:"#007ACC",hc:"#75BEFF"},b.localize(9,null)),e.SYMBOL_ICON_FILE_FOREGROUND=M.registerColor("symbolIcon.fileForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(10,null)),e.SYMBOL_ICON_FOLDER_FOREGROUND=M.registerColor("symbolIcon.folderForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(11,null)),e.SYMBOL_ICON_FUNCTION_FOREGROUND=M.registerColor("symbolIcon.functionForeground",{dark:"#B180D7",light:"#652D90",hc:"#B180D7"},b.localize(12,null)),e.SYMBOL_ICON_INTERFACE_FOREGROUND=M.registerColor("symbolIcon.interfaceForeground",{dark:"#75BEFF",light:"#007ACC",hc:"#75BEFF"},b.localize(13,null)),e.SYMBOL_ICON_KEY_FOREGROUND=M.registerColor("symbolIcon.keyForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(14,null)),e.SYMBOL_ICON_KEYWORD_FOREGROUND=M.registerColor("symbolIcon.keywordForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(15,null)),e.SYMBOL_ICON_METHOD_FOREGROUND=M.registerColor("symbolIcon.methodForeground",{dark:"#B180D7",light:"#652D90",hc:"#B180D7"},b.localize(16,null)),e.SYMBOL_ICON_MODULE_FOREGROUND=M.registerColor("symbolIcon.moduleForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(17,null)),e.SYMBOL_ICON_NAMESPACE_FOREGROUND=M.registerColor("symbolIcon.namespaceForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(18,null)),e.SYMBOL_ICON_NULL_FOREGROUND=M.registerColor("symbolIcon.nullForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(19,null)),e.SYMBOL_ICON_NUMBER_FOREGROUND=M.registerColor("symbolIcon.numberForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(20,null)),e.SYMBOL_ICON_OBJECT_FOREGROUND=M.registerColor("symbolIcon.objectForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(21,null)),e.SYMBOL_ICON_OPERATOR_FOREGROUND=M.registerColor("symbolIcon.operatorForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(22,null)),e.SYMBOL_ICON_PACKAGE_FOREGROUND=M.registerColor("symbolIcon.packageForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(23,null)),e.SYMBOL_ICON_PROPERTY_FOREGROUND=M.registerColor("symbolIcon.propertyForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(24,null)),e.SYMBOL_ICON_REFERENCE_FOREGROUND=M.registerColor("symbolIcon.referenceForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(25,null)),e.SYMBOL_ICON_SNIPPET_FOREGROUND=M.registerColor("symbolIcon.snippetForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(26,null)),e.SYMBOL_ICON_STRING_FOREGROUND=M.registerColor("symbolIcon.stringForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(27,null)),e.SYMBOL_ICON_STRUCT_FOREGROUND=M.registerColor("symbolIcon.structForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(28,null)),e.SYMBOL_ICON_TEXT_FOREGROUND=M.registerColor("symbolIcon.textForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(29,null)),e.SYMBOL_ICON_TYPEPARAMETER_FOREGROUND=M.registerColor("symbolIcon.typeParameterForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(30,null)),e.SYMBOL_ICON_UNIT_FOREGROUND=M.registerColor("symbolIcon.unitForeground",{dark:M.foreground,light:M.foreground,hc:M.foreground},b.localize(31,null)),e.SYMBOL_ICON_VARIABLE_FOREGROUND=M.registerColor("symbolIcon.variableForeground",{dark:"#75BEFF",light:"#007ACC",hc:"#75BEFF"},b.localize(32,null)),N.registerThemingParticipant((S,C)=>{const d=S.getColor(e.SYMBOL_ICON_ARRAY_FOREGROUND);d&&C.addRule(`${w.Codicon.symbolArray.cssSelector} { color: ${d}; }`);const g=S.getColor(e.SYMBOL_ICON_BOOLEAN_FOREGROUND);g&&C.addRule(`${w.Codicon.symbolBoolean.cssSelector} { color: ${g}; }`);const p=S.getColor(e.SYMBOL_ICON_CLASS_FOREGROUND);p&&C.addRule(`${w.Codicon.symbolClass.cssSelector} { color: ${p}; }`);const c=S.getColor(e.SYMBOL_ICON_METHOD_FOREGROUND);c&&C.addRule(`${w.Codicon.symbolMethod.cssSelector} { color: ${c}; }`);const o=S.getColor(e.SYMBOL_ICON_COLOR_FOREGROUND);o&&C.addRule(`${w.Codicon.symbolColor.cssSelector} { color: ${o}; }`);const s=S.getColor(e.SYMBOL_ICON_CONSTANT_FOREGROUND);s&&C.addRule(`${w.Codicon.symbolConstant.cssSelector} { color: ${s}; }`);const a=S.getColor(e.SYMBOL_ICON_CONSTRUCTOR_FOREGROUND);a&&C.addRule(`${w.Codicon.symbolConstructor.cssSelector} { color: ${a}; }`);const u=S.getColor(e.SYMBOL_ICON_ENUMERATOR_FOREGROUND);u&&C.addRule(` + ${w.Codicon.symbolValue.cssSelector},${w.Codicon.symbolEnum.cssSelector} { color: ${u}; }`);const r=S.getColor(e.SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND);r&&C.addRule(`${w.Codicon.symbolEnumMember.cssSelector} { color: ${r}; }`);const i=S.getColor(e.SYMBOL_ICON_EVENT_FOREGROUND);i&&C.addRule(`${w.Codicon.symbolEvent.cssSelector} { color: ${i}; }`);const n=S.getColor(e.SYMBOL_ICON_FIELD_FOREGROUND);n&&C.addRule(`${w.Codicon.symbolField.cssSelector} { color: ${n}; }`);const t=S.getColor(e.SYMBOL_ICON_FILE_FOREGROUND);t&&C.addRule(`${w.Codicon.symbolFile.cssSelector} { color: ${t}; }`);const l=S.getColor(e.SYMBOL_ICON_FOLDER_FOREGROUND);l&&C.addRule(`${w.Codicon.symbolFolder.cssSelector} { color: ${l}; }`);const h=S.getColor(e.SYMBOL_ICON_FUNCTION_FOREGROUND);h&&C.addRule(`${w.Codicon.symbolFunction.cssSelector} { color: ${h}; }`);const m=S.getColor(e.SYMBOL_ICON_INTERFACE_FOREGROUND);m&&C.addRule(`${w.Codicon.symbolInterface.cssSelector} { color: ${m}; }`);const _=S.getColor(e.SYMBOL_ICON_KEY_FOREGROUND);_&&C.addRule(`${w.Codicon.symbolKey.cssSelector} { color: ${_}; }`);const f=S.getColor(e.SYMBOL_ICON_KEYWORD_FOREGROUND);f&&C.addRule(`${w.Codicon.symbolKeyword.cssSelector} { color: ${f}; }`);const v=S.getColor(e.SYMBOL_ICON_MODULE_FOREGROUND);v&&C.addRule(`${w.Codicon.symbolModule.cssSelector} { color: ${v}; }`);const y=S.getColor(e.SYMBOL_ICON_NAMESPACE_FOREGROUND);y&&C.addRule(`${w.Codicon.symbolNamespace.cssSelector} { color: ${y}; }`);const L=S.getColor(e.SYMBOL_ICON_NULL_FOREGROUND);L&&C.addRule(`${w.Codicon.symbolNull.cssSelector} { color: ${L}; }`);const I=S.getColor(e.SYMBOL_ICON_NUMBER_FOREGROUND);I&&C.addRule(`${w.Codicon.symbolNumber.cssSelector} { color: ${I}; }`);const k=S.getColor(e.SYMBOL_ICON_OBJECT_FOREGROUND);k&&C.addRule(`${w.Codicon.symbolObject.cssSelector} { color: ${k}; }`);const E=S.getColor(e.SYMBOL_ICON_OPERATOR_FOREGROUND);E&&C.addRule(`${w.Codicon.symbolOperator.cssSelector} { color: ${E}; }`);const T=S.getColor(e.SYMBOL_ICON_PACKAGE_FOREGROUND);T&&C.addRule(`${w.Codicon.symbolPackage.cssSelector} { color: ${T}; }`);const O=S.getColor(e.SYMBOL_ICON_PROPERTY_FOREGROUND);O&&C.addRule(`${w.Codicon.symbolProperty.cssSelector} { color: ${O}; }`);const A=S.getColor(e.SYMBOL_ICON_REFERENCE_FOREGROUND);A&&C.addRule(`${w.Codicon.symbolReference.cssSelector} { color: ${A}; }`);const B=S.getColor(e.SYMBOL_ICON_SNIPPET_FOREGROUND);B&&C.addRule(`${w.Codicon.symbolSnippet.cssSelector} { color: ${B}; }`);const F=S.getColor(e.SYMBOL_ICON_STRING_FOREGROUND);F&&C.addRule(`${w.Codicon.symbolString.cssSelector} { color: ${F}; }`);const D=S.getColor(e.SYMBOL_ICON_STRUCT_FOREGROUND);D&&C.addRule(`${w.Codicon.symbolStruct.cssSelector} { color: ${D}; }`);const R=S.getColor(e.SYMBOL_ICON_TEXT_FOREGROUND);R&&C.addRule(`${w.Codicon.symbolText.cssSelector} { color: ${R}; }`);const W=S.getColor(e.SYMBOL_ICON_TYPEPARAMETER_FOREGROUND);W&&C.addRule(`${w.Codicon.symbolTypeParameter.cssSelector} { color: ${W}; }`);const x=S.getColor(e.SYMBOL_ICON_UNIT_FOREGROUND);x&&C.addRule(`${w.Codicon.symbolUnit.cssSelector} { color: ${x}; }`);const K=S.getColor(e.SYMBOL_ICON_VARIABLE_FOREGROUND);K&&C.addRule(`${w.Codicon.symbolVariable.cssSelector} { color: ${K}; }`)})}),define(Q[605],J([0,1,7,43,583,16,11]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneCodeEditorServiceImpl=void 0;let C=class extends M.CodeEditorServiceImpl{constructor(g,p,c){super(g,c);this.onCodeEditorAdd(()=>this._checkContextKey()),this.onCodeEditorRemove(()=>this._checkContextKey()),this._editorIsOpen=p.createKey("editorIsOpen",!1)}_checkContextKey(){let g=!1;for(const p of this.listCodeEditors())if(!p.isSimpleWidget){g=!0;break}this._editorIsOpen.set(g)}getActiveCodeEditor(){return null}openCodeEditor(g,p,c){return p?Promise.resolve(this.doOpenEditor(p,g)):Promise.resolve(null)}doOpenEditor(g,p){if(!this.findModel(g,p.resource)){if(p.resource){const s=p.resource.scheme;if(s===N.Schemas.http||s===N.Schemas.https)return b.windowOpenNoOpener(p.resource.toString()),g}return null}const o=p.options?p.options.selection:null;if(o)if(typeof o.endLineNumber=="number"&&typeof o.endColumn=="number")g.setSelection(o),g.revealRangeInCenter(o,1);else{const s={lineNumber:o.startLineNumber,column:o.startColumn};g.setPosition(s),g.revealPositionInCenter(s,1)}return g}findModel(g,p){const c=g.getModel();return c&&c.uri.toString()!==p.toString()?null:c}};C=Me([_e(1,w.IContextKeyService),_e(2,S.IThemeService)],C),e.StandaloneCodeEditorServiceImpl=C}),define(Q[606],J([0,1,49,22]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.hc_black=e.vs_dark=e.vs=void 0,e.vs={base:"vs",inherit:!1,rules:[{token:"",foreground:"000000",background:"fffffe"},{token:"invalid",foreground:"cd3131"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"001188"},{token:"variable.predefined",foreground:"4864AA"},{token:"constant",foreground:"dd0000"},{token:"comment",foreground:"008000"},{token:"number",foreground:"098658"},{token:"number.hex",foreground:"3030c0"},{token:"regexp",foreground:"800000"},{token:"annotation",foreground:"808080"},{token:"type",foreground:"008080"},{token:"delimiter",foreground:"000000"},{token:"delimiter.html",foreground:"383838"},{token:"delimiter.xml",foreground:"0000FF"},{token:"tag",foreground:"800000"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta.scss",foreground:"800000"},{token:"metatag",foreground:"e00000"},{token:"metatag.content.html",foreground:"FF0000"},{token:"metatag.html",foreground:"808080"},{token:"metatag.xml",foreground:"808080"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"863B00"},{token:"string.key.json",foreground:"A31515"},{token:"string.value.json",foreground:"0451A5"},{token:"attribute.name",foreground:"FF0000"},{token:"attribute.value",foreground:"0451A5"},{token:"attribute.value.number",foreground:"098658"},{token:"attribute.value.unit",foreground:"098658"},{token:"attribute.value.html",foreground:"0000FF"},{token:"attribute.value.xml",foreground:"0000FF"},{token:"string",foreground:"A31515"},{token:"string.html",foreground:"0000FF"},{token:"string.sql",foreground:"FF0000"},{token:"string.yaml",foreground:"0451A5"},{token:"keyword",foreground:"0000FF"},{token:"keyword.json",foreground:"0451A5"},{token:"keyword.flow",foreground:"AF00DB"},{token:"keyword.flow.scss",foreground:"0000FF"},{token:"operator.scss",foreground:"666666"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"666666"},{token:"predefined.sql",foreground:"C700C7"}],colors:{[N.editorBackground]:"#FFFFFE",[N.editorForeground]:"#000000",[N.editorInactiveSelection]:"#E5EBF1",[b.editorIndentGuides]:"#D3D3D3",[b.editorActiveIndentGuides]:"#939393",[N.editorSelectionHighlight]:"#ADD6FF4D"}},e.vs_dark={base:"vs-dark",inherit:!1,rules:[{token:"",foreground:"D4D4D4",background:"1E1E1E"},{token:"invalid",foreground:"f44747"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"74B0DF"},{token:"variable.predefined",foreground:"4864AA"},{token:"variable.parameter",foreground:"9CDCFE"},{token:"constant",foreground:"569CD6"},{token:"comment",foreground:"608B4E"},{token:"number",foreground:"B5CEA8"},{token:"number.hex",foreground:"5BB498"},{token:"regexp",foreground:"B46695"},{token:"annotation",foreground:"cc6666"},{token:"type",foreground:"3DC9B0"},{token:"delimiter",foreground:"DCDCDC"},{token:"delimiter.html",foreground:"808080"},{token:"delimiter.xml",foreground:"808080"},{token:"tag",foreground:"569CD6"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta.scss",foreground:"A79873"},{token:"meta.tag",foreground:"CE9178"},{token:"metatag",foreground:"DD6A6F"},{token:"metatag.content.html",foreground:"9CDCFE"},{token:"metatag.html",foreground:"569CD6"},{token:"metatag.xml",foreground:"569CD6"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"9CDCFE"},{token:"string.key.json",foreground:"9CDCFE"},{token:"string.value.json",foreground:"CE9178"},{token:"attribute.name",foreground:"9CDCFE"},{token:"attribute.value",foreground:"CE9178"},{token:"attribute.value.number.css",foreground:"B5CEA8"},{token:"attribute.value.unit.css",foreground:"B5CEA8"},{token:"attribute.value.hex.css",foreground:"D4D4D4"},{token:"string",foreground:"CE9178"},{token:"string.sql",foreground:"FF0000"},{token:"keyword",foreground:"569CD6"},{token:"keyword.flow",foreground:"C586C0"},{token:"keyword.json",foreground:"CE9178"},{token:"keyword.flow.scss",foreground:"569CD6"},{token:"operator.scss",foreground:"909090"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"909090"},{token:"predefined.sql",foreground:"FF00FF"}],colors:{[N.editorBackground]:"#1E1E1E",[N.editorForeground]:"#D4D4D4",[N.editorInactiveSelection]:"#3A3D41",[b.editorIndentGuides]:"#404040",[b.editorActiveIndentGuides]:"#707070",[N.editorSelectionHighlight]:"#ADD6FF26"}},e.hc_black={base:"hc-black",inherit:!1,rules:[{token:"",foreground:"FFFFFF",background:"000000"},{token:"invalid",foreground:"f44747"},{token:"emphasis",fontStyle:"italic"},{token:"strong",fontStyle:"bold"},{token:"variable",foreground:"1AEBFF"},{token:"variable.parameter",foreground:"9CDCFE"},{token:"constant",foreground:"569CD6"},{token:"comment",foreground:"608B4E"},{token:"number",foreground:"FFFFFF"},{token:"regexp",foreground:"C0C0C0"},{token:"annotation",foreground:"569CD6"},{token:"type",foreground:"3DC9B0"},{token:"delimiter",foreground:"FFFF00"},{token:"delimiter.html",foreground:"FFFF00"},{token:"tag",foreground:"569CD6"},{token:"tag.id.pug",foreground:"4F76AC"},{token:"tag.class.pug",foreground:"4F76AC"},{token:"meta",foreground:"D4D4D4"},{token:"meta.tag",foreground:"CE9178"},{token:"metatag",foreground:"569CD6"},{token:"metatag.content.html",foreground:"1AEBFF"},{token:"metatag.html",foreground:"569CD6"},{token:"metatag.xml",foreground:"569CD6"},{token:"metatag.php",fontStyle:"bold"},{token:"key",foreground:"9CDCFE"},{token:"string.key",foreground:"9CDCFE"},{token:"string.value",foreground:"CE9178"},{token:"attribute.name",foreground:"569CD6"},{token:"attribute.value",foreground:"3FF23F"},{token:"string",foreground:"CE9178"},{token:"string.sql",foreground:"FF0000"},{token:"keyword",foreground:"569CD6"},{token:"keyword.flow",foreground:"C586C0"},{token:"operator.sql",foreground:"778899"},{token:"operator.swift",foreground:"909090"},{token:"predefined.sql",foreground:"FF00FF"}],colors:{[N.editorBackground]:"#000000",[N.editorForeground]:"#FFFFFF",[b.editorIndentGuides]:"#FFFFFF",[b.editorActiveIndentGuides]:"#FFFFFF"}}}),define(Q[34],J([0,1,48,9,16,26,2,6,11,54,71,27]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MenuItemAction=e.SubmenuItemAction=e.MenuRegistry=e.IMenuService=e.MenuId=e.isIMenuItem=void 0;function o(r){return r.command!==void 0}e.isIMenuItem=o;class s{constructor(i){this.id=s._idPool++,this._debugName=i}}e.MenuId=s,s._idPool=0,s.CommandPalette=new s("CommandPalette"),s.EditorContext=new s("EditorContext"),s.EditorContextPeek=new s("EditorContextPeek"),s.MenubarEditMenu=new s("MenubarEditMenu"),s.MenubarGoMenu=new s("MenubarGoMenu"),s.MenubarSelectionMenu=new s("MenubarSelectionMenu"),e.IMenuService=N.createDecorator("menuService"),e.MenuRegistry=new class{constructor(){this._commands=new Map,this._menuItems=new Map,this._onDidChangeMenu=new C.Emitter,this.onDidChangeMenu=this._onDidChangeMenu.event,this._commandPaletteChangeEvent={has:r=>r===s.CommandPalette}}addCommand(r){return this.addCommands(g.Iterable.single(r))}addCommands(r){for(const i of r)this._commands.set(i.id,i);return this._onDidChangeMenu.fire(this._commandPaletteChangeEvent),S.toDisposable(()=>{let i=!1;for(const n of r)i=this._commands.delete(n.id)||i;i&&this._onDidChangeMenu.fire(this._commandPaletteChangeEvent)})}getCommand(r){return this._commands.get(r)}getCommands(){const r=new Map;return this._commands.forEach((i,n)=>r.set(n,i)),r}appendMenuItem(r,i){return this.appendMenuItems(g.Iterable.single({id:r,item:i}))}appendMenuItems(r){const i=new Set,n=new p.LinkedList;for(const{id:t,item:l}of r){let h=this._menuItems.get(t);h||(h=new p.LinkedList,this._menuItems.set(t,h)),n.push(h.push(l)),i.add(t)}return this._onDidChangeMenu.fire(i),S.toDisposable(()=>{if(n.size>0){for(let t of n)t();this._onDidChangeMenu.fire(i),n.clear()}})}getMenuItems(r){let i;return this._menuItems.has(r)?i=[...this._menuItems.get(r)]:i=[],r===s.CommandPalette&&this._appendImplicitItems(i),i}_appendImplicitItems(r){const i=new Set;for(const n of r)o(n)&&(i.add(n.command.id),n.alt&&i.add(n.alt.id));this._commands.forEach((n,t)=>{i.has(t)||r.push({command:n})})}};class a extends b.SubmenuAction{constructor(i,n,t,l){super(`submenuitem.${i.submenu.id}`,typeof i.title=="string"?i.title:i.title.value,[],"submenu");this.item=i,this._menuService=n,this._contextKeyService=t,this._options=l}get actions(){const i=[],n=this._menuService.createMenu(this.item.submenu,this._contextKeyService),t=n.getActions(this._options);n.dispose();for(const[,l]of t)l.length>0&&(i.push(...l),i.push(new b.Separator));return i.length&&i.pop(),i}}e.SubmenuItemAction=a;let u=class Pt{constructor(i,n,t,l,h){var m;if(this._commandService=h,this.id=i.id,this.label=typeof i.title=="string"?i.title:i.title.value,this.tooltip=(m=i.tooltip)!==null&&m!==void 0?m:"",this.enabled=!i.precondition||l.contextMatchesRules(i.precondition),this.checked=!1,i.toggled){const _=i.toggled.condition?i.toggled:{condition:i.toggled};this.checked=l.contextMatchesRules(_.condition),this.checked&&_.tooltip&&(this.tooltip=typeof _.tooltip=="string"?_.tooltip:_.tooltip.value)}this.item=i,this.alt=n?new Pt(n,void 0,t,l,h):void 0,this._options=t,d.ThemeIcon.isThemeIcon(i.icon)&&(this.class=c.CSSIcon.asClassName(i.icon))}dispose(){}run(...i){var n,t;let l=[];return((n=this._options)===null||n===void 0?void 0:n.arg)&&(l=[...l,this._options.arg]),((t=this._options)===null||t===void 0?void 0:t.shouldForwardArgs)&&(l=[...l,...i]),this._commandService.executeCommand(this.id,...l)}};u=Me([_e(3,M.IContextKeyService),_e(4,w.ICommandService)],u),e.MenuItemAction=u}),define(Q[13],J([0,1,447,24,28,14,36,67,34,26,16,86,33,87,20]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectAllCommand=e.RedoCommand=e.UndoCommand=e.EditorExtensionsRegistry=e.registerEditorContribution=e.registerInstantiatedEditorAction=e.registerMultiEditorAction=e.registerEditorAction=e.registerEditorCommand=e.registerModelCommand=e.registerModelAndPositionCommand=e.MultiEditorAction=e.EditorAction=e.EditorCommand=e.ProxyCommand=e.MultiCommand=e.Command=void 0;class u{constructor(A){this.id=A.id,this.precondition=A.precondition,this._kbOpts=A.kbOpts,this._menuOpts=A.menuOpts,this._description=A.description}register(){if(Array.isArray(this._menuOpts)?this._menuOpts.forEach(this._registerMenuItem,this):this._menuOpts&&this._registerMenuItem(this._menuOpts),this._kbOpts){let A=this._kbOpts.kbExpr;this.precondition&&(A?A=p.ContextKeyExpr.and(A,this.precondition):A=this.precondition),c.KeybindingsRegistry.registerCommandAndKeybindingRule({id:this.id,handler:(B,F)=>this.runCommand(B,F),weight:this._kbOpts.weight,args:this._kbOpts.args,when:A,primary:this._kbOpts.primary,secondary:this._kbOpts.secondary,win:this._kbOpts.win,linux:this._kbOpts.linux,mac:this._kbOpts.mac,description:this._description})}else g.CommandsRegistry.registerCommand({id:this.id,handler:(A,B)=>this.runCommand(A,B),description:this._description})}_registerMenuItem(A){d.MenuRegistry.appendMenuItem(A.menuId,{group:A.group,command:{id:this.id,title:A.title,icon:A.icon,precondition:this.precondition},when:A.when,order:A.order})}}e.Command=u;class r extends u{constructor(){super(...arguments);this._implementations=[]}addImplementation(A,B){return this._implementations.push([A,B]),this._implementations.sort((F,D)=>D[0]-F[0]),{dispose:()=>{for(let F=0;F{if(!!R.get(p.IContextKeyService).contextMatchesRules(a.withNullAsUndefined(this.precondition)))return this.runEditorCommand(R,D,B)})}}e.EditorCommand=n;class t extends n{constructor(A){super(t.convertOptions(A));this.label=A.label,this.alias=A.alias}static convertOptions(A){let B;Array.isArray(A.menuOpts)?B=A.menuOpts:A.menuOpts?B=[A.menuOpts]:B=[];function F(D){return D.menuId||(D.menuId=d.MenuId.EditorContext),D.title||(D.title=A.label),D.when=p.ContextKeyExpr.and(A.precondition,D.when),D}return Array.isArray(A.contextMenuOpts)?B.push(...A.contextMenuOpts.map(F)):A.contextMenuOpts&&B.push(F(A.contextMenuOpts)),A.menuOpts=B,A}runEditorCommand(A,B,F){return this.reportTelemetry(A,B),this.run(A,B,F||{})}reportTelemetry(A,B){A.get(s.ITelemetryService).publicLog2("editorActionInvoked",{name:this.label,id:this.id})}}e.EditorAction=t;class l extends t{constructor(){super(...arguments);this._implementations=[]}addImplementation(A,B){return this._implementations.push([A,B]),this._implementations.sort((F,D)=>D[0]-F[0]),{dispose:()=>{for(let F=0;Fnew Promise((K,Y)=>{try{const ee=A(x.object.textEditorModel,w.Position.lift(R),F.slice(2));K(ee)}catch(ee){Y(ee)}}).finally(()=>{x.dispose()}))})}e.registerModelAndPositionCommand=h;function m(O,A){g.CommandsRegistry.registerCommand(O,function(B,...F){const[D]=F;a.assertType(N.URI.isUri(D));const R=B.get(S.IModelService).getModel(D);return R?A(R,...F.slice(1)):B.get(C.ITextModelService).createModelReference(D).then(W=>new Promise((x,K)=>{try{const Y=A(W.object.textEditorModel,F.slice(1));x(Y)}catch(Y){K(Y)}}).finally(()=>{W.dispose()}))})}e.registerModelCommand=m;function _(O){return E.INSTANCE.registerEditorCommand(O),O}e.registerEditorCommand=_;function f(O){const A=new O;return E.INSTANCE.registerEditorAction(A),A}e.registerEditorAction=f;function v(O){return E.INSTANCE.registerEditorAction(O),O}e.registerMultiEditorAction=v;function y(O){E.INSTANCE.registerEditorAction(O)}e.registerInstantiatedEditorAction=y;function L(O,A){E.INSTANCE.registerEditorContribution(O,A)}e.registerEditorContribution=L;var I;(function(O){function A(W){return E.INSTANCE.getEditorCommand(W)}O.getEditorCommand=A;function B(){return E.INSTANCE.getEditorActions()}O.getEditorActions=B;function F(){return E.INSTANCE.getEditorContributions()}O.getEditorContributions=F;function D(W){return E.INSTANCE.getEditorContributions().filter(x=>W.indexOf(x.id)>=0)}O.getSomeEditorContributions=D;function R(){return E.INSTANCE.getDiffEditorContributions()}O.getDiffEditorContributions=R})(I=e.EditorExtensionsRegistry||(e.EditorExtensionsRegistry={}));const k={EditorCommonContributions:"editor.contributions"};class E{constructor(){this.editorContributions=[],this.diffEditorContributions=[],this.editorActions=[],this.editorCommands=Object.create(null)}registerEditorContribution(A,B){this.editorContributions.push({id:A,ctor:B})}getEditorContributions(){return this.editorContributions.slice(0)}getDiffEditorContributions(){return this.diffEditorContributions.slice(0)}registerEditorAction(A){A.register(),this.editorActions.push(A)}getEditorActions(){return this.editorActions.slice(0)}registerEditorCommand(A){A.register(),this.editorCommands[A.id]=A}getEditorCommand(A){return this.editorCommands[A]||null}}E.INSTANCE=new E,o.Registry.add(k.EditorCommonContributions,E.INSTANCE);function T(O){return O.register(),O}e.UndoCommand=T(new r({id:"undo",precondition:void 0,kbOpts:{weight:0,primary:2048|56},menuOpts:[{menuId:d.MenuId.MenubarEditMenu,group:"1_do",title:b.localize(0,null),order:1},{menuId:d.MenuId.CommandPalette,group:"",title:b.localize(1,null),order:1}]})),T(new i(e.UndoCommand,{id:"default:undo",precondition:void 0})),e.RedoCommand=T(new r({id:"redo",precondition:void 0,kbOpts:{weight:0,primary:2048|55,secondary:[2048|1024|56],mac:{primary:2048|1024|56}},menuOpts:[{menuId:d.MenuId.MenubarEditMenu,group:"1_do",title:b.localize(2,null),order:2},{menuId:d.MenuId.CommandPalette,group:"",title:b.localize(3,null),order:1}]})),T(new i(e.RedoCommand,{id:"default:redo",precondition:void 0})),e.SelectAllCommand=T(new r({id:"editor.action.selectAll",precondition:void 0,kbOpts:{weight:0,kbExpr:null,primary:2048|31},menuOpts:[{menuId:d.MenuId.MenubarSelectionMenu,group:"1_basic",title:b.localize(4,null),order:1},{menuId:d.MenuId.CommandPalette,group:"",title:b.localize(5,null),order:1}]}))}),define(Q[188],J([0,1,444,35,20,13,28,536,42,181,241,182,14,3,25,16,86]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CoreEditingCommands=e.CoreNavigationCommands=e.RevealLine_=e.EditorScroll_=e.CoreEditorCommand=void 0;const i=0;class n extends w.EditorCommand{runEditorCommand(E,T,O){const A=T._getViewModel();!A||this.runCoreEditorCommand(A,O||{})}}e.CoreEditorCommand=n;var t;(function(k){const E=function(O){if(!M.isObject(O))return!1;const A=O;return!(!M.isString(A.to)||!M.isUndefined(A.by)&&!M.isString(A.by)||!M.isUndefined(A.value)&&!M.isNumber(A.value)||!M.isUndefined(A.revealCursor)&&!M.isBoolean(A.revealCursor))};k.description={description:"Scroll editor in the given direction",args:[{name:"Editor scroll argument object",description:"Property-value pairs that can be passed through this argument:\n * 'to': A mandatory direction value.\n ```\n 'up', 'down'\n ```\n * 'by': Unit to move. Default is computed based on 'to' value.\n ```\n 'line', 'wrappedLine', 'page', 'halfPage'\n ```\n * 'value': Number of units to move. Default is '1'.\n * 'revealCursor': If 'true' reveals the cursor if it is outside view port.\n ",constraint:E,schema:{type:"object",required:["to"],properties:{to:{type:"string",enum:["up","down"]},by:{type:"string",enum:["line","wrappedLine","page","halfPage"]},value:{type:"number",default:1},revealCursor:{type:"boolean"}}}}]},k.RawDirection={Up:"up",Down:"down"},k.RawUnit={Line:"line",WrappedLine:"wrappedLine",Page:"page",HalfPage:"halfPage"};function T(O){let A;switch(O.to){case k.RawDirection.Up:A=1;break;case k.RawDirection.Down:A=2;break;default:return null}let B;switch(O.by){case k.RawUnit.Line:B=1;break;case k.RawUnit.WrappedLine:B=2;break;case k.RawUnit.Page:B=3;break;case k.RawUnit.HalfPage:B=4;break;default:B=2}const F=Math.floor(O.value||1),D=!!O.revealCursor;return{direction:A,unit:B,value:F,revealCursor:D,select:!!O.select}}k.parse=T})(t=e.EditorScroll_||(e.EditorScroll_={}));var l;(function(k){const E=function(T){if(!M.isObject(T))return!1;const O=T;return!(!M.isNumber(O.lineNumber)&&!M.isString(O.lineNumber)||!M.isUndefined(O.at)&&!M.isString(O.at))};k.description={description:"Reveal the given line at the given logical position",args:[{name:"Reveal line argument object",description:"Property-value pairs that can be passed through this argument:\n * 'lineNumber': A mandatory line number value.\n * 'at': Logical position at which line has to be revealed.\n ```\n 'top', 'center', 'bottom'\n ```\n ",constraint:E,schema:{type:"object",required:["lineNumber"],properties:{lineNumber:{type:["number","string"]},at:{type:"string",enum:["top","center","bottom"]}}}}]},k.RawAtArgument={Top:"top",Center:"center",Bottom:"bottom"}})(l=e.RevealLine_||(e.RevealLine_={}));class h{constructor(E){E.addImplementation(1e4,(T,O)=>{const A=T.get(S.ICodeEditorService).getFocusedCodeEditor();return A&&A.hasTextFocus()?this._runEditorCommand(T,A,O):!1}),E.addImplementation(1e3,(T,O)=>{const A=document.activeElement;return A&&["input","textarea"].indexOf(A.tagName.toLowerCase())>=0?(this.runDOMCommand(),!0):!1}),E.addImplementation(0,(T,O)=>{const A=T.get(S.ICodeEditorService).getActiveCodeEditor();return A?(A.focus(),this._runEditorCommand(T,A,O)):!1})}_runEditorCommand(E,T,O){const A=this.runEditorCommand(E,T,O);return A||!0}}var m;(function(k){class E extends n{constructor(z){super(z);this._inSelectionMode=z.inSelectionMode}runCoreEditorCommand(z,P){z.model.pushStackElement(),z.setCursorStates(P.source,3,[p.CursorMoveCommands.moveTo(z,z.getPrimaryCursorState(),this._inSelectionMode,P.position,P.viewPosition)]),z.revealPrimaryCursor(P.source,!0)}}k.MoveTo=w.registerEditorCommand(new E({id:"_moveTo",inSelectionMode:!1,precondition:void 0})),k.MoveToSelect=w.registerEditorCommand(new E({id:"_moveToSelect",inSelectionMode:!0,precondition:void 0}));class T extends n{runCoreEditorCommand(z,P){z.model.pushStackElement();const V=this._getColumnSelectResult(z,z.getPrimaryCursorState(),z.getCursorColumnSelectData(),P);z.setCursorStates(P.source,3,V.viewStates.map(U=>d.CursorState.fromViewState(U))),z.setCursorColumnSelectData({isReal:!0,fromViewLineNumber:V.fromLineNumber,fromViewVisualColumn:V.fromVisualColumn,toViewLineNumber:V.toLineNumber,toViewVisualColumn:V.toVisualColumn}),V.reversed?z.revealTopMostCursor(P.source):z.revealBottomMostCursor(P.source)}}k.ColumnSelect=w.registerEditorCommand(new class extends T{constructor(){super({id:"columnSelect",precondition:void 0})}_getColumnSelectResult(X,z,P,V){const U=X.model.validatePosition(V.position),H=X.coordinatesConverter.validateViewPosition(new o.Position(V.viewPosition.lineNumber,V.viewPosition.column),U);let $=V.doColumnSelect?P.fromViewLineNumber:H.lineNumber,ie=V.doColumnSelect?P.fromViewVisualColumn:V.mouseColumn-1;return C.ColumnSelection.columnSelect(X.cursorConfig,X,$,ie,H.lineNumber,V.mouseColumn-1)}}),k.CursorColumnSelectLeft=w.registerEditorCommand(new class extends T{constructor(){super({id:"cursorColumnSelectLeft",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:2048|1024|512|15,linux:{primary:0}}})}_getColumnSelectResult(X,z,P,V){return C.ColumnSelection.columnSelectLeft(X.cursorConfig,X,P)}}),k.CursorColumnSelectRight=w.registerEditorCommand(new class extends T{constructor(){super({id:"cursorColumnSelectRight",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:2048|1024|512|17,linux:{primary:0}}})}_getColumnSelectResult(X,z,P,V){return C.ColumnSelection.columnSelectRight(X.cursorConfig,X,P)}});class O extends T{constructor(z){super(z);this._isPaged=z.isPaged}_getColumnSelectResult(z,P,V,U){return C.ColumnSelection.columnSelectUp(z.cursorConfig,z,V,this._isPaged)}}k.CursorColumnSelectUp=w.registerEditorCommand(new O({isPaged:!1,id:"cursorColumnSelectUp",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:2048|1024|512|16,linux:{primary:0}}})),k.CursorColumnSelectPageUp=w.registerEditorCommand(new O({isPaged:!0,id:"cursorColumnSelectPageUp",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:2048|1024|512|11,linux:{primary:0}}}));class A extends T{constructor(z){super(z);this._isPaged=z.isPaged}_getColumnSelectResult(z,P,V,U){return C.ColumnSelection.columnSelectDown(z.cursorConfig,z,V,this._isPaged)}}k.CursorColumnSelectDown=w.registerEditorCommand(new A({isPaged:!1,id:"cursorColumnSelectDown",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:2048|1024|512|18,linux:{primary:0}}})),k.CursorColumnSelectPageDown=w.registerEditorCommand(new A({isPaged:!0,id:"cursorColumnSelectPageDown",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:2048|1024|512|12,linux:{primary:0}}}));class B extends n{constructor(){super({id:"cursorMove",precondition:void 0,description:p.CursorMove.description})}runCoreEditorCommand(z,P){const V=p.CursorMove.parse(P);!V||this._runCursorMove(z,P.source,V)}_runCursorMove(z,P,V){z.model.pushStackElement(),z.setCursorStates(P,3,B._move(z,z.getCursorStates(),V)),z.revealPrimaryCursor(P,!0)}static _move(z,P,V){const U=V.select,H=V.value;switch(V.direction){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:return p.CursorMoveCommands.simpleMove(z,P,V.direction,U,H,V.unit);case 11:case 13:case 12:case 14:return p.CursorMoveCommands.viewportMove(z,P,V.direction,U,H);default:return null}}}k.CursorMoveImpl=B,k.CursorMove=w.registerEditorCommand(new B);class F extends n{constructor(z){super(z);this._staticArgs=z.args}runCoreEditorCommand(z,P){let V=this._staticArgs;this._staticArgs.value===-1&&(V={direction:this._staticArgs.direction,unit:this._staticArgs.unit,select:this._staticArgs.select,value:z.cursorConfig.pageSize}),z.model.pushStackElement(),z.setCursorStates(P.source,3,p.CursorMoveCommands.simpleMove(z,z.getCursorStates(),V.direction,V.select,V.value,V.unit)),z.revealPrimaryCursor(P.source,!0)}}k.CursorLeft=w.registerEditorCommand(new F({args:{direction:0,unit:0,select:!1,value:1},id:"cursorLeft",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:15,mac:{primary:15,secondary:[256|32]}}})),k.CursorLeftSelect=w.registerEditorCommand(new F({args:{direction:0,unit:0,select:!0,value:1},id:"cursorLeftSelect",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1024|15}})),k.CursorRight=w.registerEditorCommand(new F({args:{direction:1,unit:0,select:!1,value:1},id:"cursorRight",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:17,mac:{primary:17,secondary:[256|36]}}})),k.CursorRightSelect=w.registerEditorCommand(new F({args:{direction:1,unit:0,select:!0,value:1},id:"cursorRightSelect",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1024|17}})),k.CursorUp=w.registerEditorCommand(new F({args:{direction:2,unit:2,select:!1,value:1},id:"cursorUp",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:16,mac:{primary:16,secondary:[256|46]}}})),k.CursorUpSelect=w.registerEditorCommand(new F({args:{direction:2,unit:2,select:!0,value:1},id:"cursorUpSelect",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1024|16,secondary:[2048|1024|16],mac:{primary:1024|16},linux:{primary:1024|16}}})),k.CursorPageUp=w.registerEditorCommand(new F({args:{direction:2,unit:2,select:!1,value:-1},id:"cursorPageUp",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:11}})),k.CursorPageUpSelect=w.registerEditorCommand(new F({args:{direction:2,unit:2,select:!0,value:-1},id:"cursorPageUpSelect",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1024|11}})),k.CursorDown=w.registerEditorCommand(new F({args:{direction:3,unit:2,select:!1,value:1},id:"cursorDown",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:18,mac:{primary:18,secondary:[256|44]}}})),k.CursorDownSelect=w.registerEditorCommand(new F({args:{direction:3,unit:2,select:!0,value:1},id:"cursorDownSelect",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1024|18,secondary:[2048|1024|18],mac:{primary:1024|18},linux:{primary:1024|18}}})),k.CursorPageDown=w.registerEditorCommand(new F({args:{direction:3,unit:2,select:!1,value:-1},id:"cursorPageDown",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:12}})),k.CursorPageDownSelect=w.registerEditorCommand(new F({args:{direction:3,unit:2,select:!0,value:-1},id:"cursorPageDownSelect",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1024|12}})),k.CreateCursor=w.registerEditorCommand(new class extends n{constructor(){super({id:"createCursor",precondition:void 0})}runCoreEditorCommand(X,z){let P;z.wholeLine?P=p.CursorMoveCommands.line(X,X.getPrimaryCursorState(),!1,z.position,z.viewPosition):P=p.CursorMoveCommands.moveTo(X,X.getPrimaryCursorState(),!1,z.position,z.viewPosition);const V=X.getCursorStates();if(V.length>1){const U=P.modelState?P.modelState.position:null,H=P.viewState?P.viewState.position:null;for(let $=0,ie=V.length;$H&&(U=H);const $=new s.Range(U,1,U,X.model.getLineMaxColumn(U));let ie=0;if(P.at)switch(P.at){case l.RawAtArgument.Top:ie=3;break;case l.RawAtArgument.Center:ie=1;break;case l.RawAtArgument.Bottom:ie=4;break;default:break}const oe=X.coordinatesConverter.convertModelRangeToViewRange($);X.revealRange(z.source,!1,oe,ie,0)}}),k.SelectAll=new class extends h{constructor(){super(w.SelectAllCommand)}runDOMCommand(){N.isFirefox&&(document.activeElement.focus(),document.activeElement.select()),document.execCommand("selectAll")}runEditorCommand(X,z,P){const V=z._getViewModel();!V||this.runCoreEditorCommand(V,P)}runCoreEditorCommand(X,z){X.model.pushStackElement(),X.setCursorStates("keyboard",3,[p.CursorMoveCommands.selectAll(X,X.getPrimaryCursorState())])}},k.SetSelection=w.registerEditorCommand(new class extends n{constructor(){super({id:"setSelection",precondition:void 0})}runCoreEditorCommand(X,z){X.model.pushStackElement(),X.setCursorStates(z.source,3,[d.CursorState.fromModelSelection(z.selection)])}})})(m=e.CoreNavigationCommands||(e.CoreNavigationCommands={}));const _=u.ContextKeyExpr.and(a.EditorContextKeys.textInputFocus,a.EditorContextKeys.columnSelection);function f(k,E){r.KeybindingsRegistry.registerKeybindingRule({id:k,primary:E,when:_,weight:i+1})}f(m.CursorColumnSelectLeft.id,1024|15),f(m.CursorColumnSelectRight.id,1024|17),f(m.CursorColumnSelectUp.id,1024|16),f(m.CursorColumnSelectPageUp.id,1024|11),f(m.CursorColumnSelectDown.id,1024|18),f(m.CursorColumnSelectPageDown.id,1024|12);function v(k){return k.register(),k}var y;(function(k){class E extends w.EditorCommand{runEditorCommand(O,A,B){const F=A._getViewModel();!F||this.runCoreEditingCommand(A,F,B||{})}}k.CoreEditingCommand=E,k.LineBreakInsert=w.registerEditorCommand(new class extends E{constructor(){super({id:"lineBreakInsert",precondition:a.EditorContextKeys.writable,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|45}}})}runCoreEditingCommand(T,O,A){T.pushUndoStop(),T.executeCommands(this.id,c.TypeOperations.lineBreakInsert(O.cursorConfig,O.model,O.getCursorStates().map(B=>B.modelState.selection)))}}),k.Outdent=w.registerEditorCommand(new class extends E{constructor(){super({id:"outdent",precondition:a.EditorContextKeys.writable,kbOpts:{weight:i,kbExpr:u.ContextKeyExpr.and(a.EditorContextKeys.editorTextFocus,a.EditorContextKeys.tabDoesNotMoveFocus),primary:1024|2}})}runCoreEditingCommand(T,O,A){T.pushUndoStop(),T.executeCommands(this.id,c.TypeOperations.outdent(O.cursorConfig,O.model,O.getCursorStates().map(B=>B.modelState.selection))),T.pushUndoStop()}}),k.Tab=w.registerEditorCommand(new class extends E{constructor(){super({id:"tab",precondition:a.EditorContextKeys.writable,kbOpts:{weight:i,kbExpr:u.ContextKeyExpr.and(a.EditorContextKeys.editorTextFocus,a.EditorContextKeys.tabDoesNotMoveFocus),primary:2}})}runCoreEditingCommand(T,O,A){T.pushUndoStop(),T.executeCommands(this.id,c.TypeOperations.tab(O.cursorConfig,O.model,O.getCursorStates().map(B=>B.modelState.selection))),T.pushUndoStop()}}),k.DeleteLeft=w.registerEditorCommand(new class extends E{constructor(){super({id:"deleteLeft",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:1,secondary:[1024|1],mac:{primary:1,secondary:[1024|1,256|38,256|1]}}})}runCoreEditingCommand(T,O,A){const[B,F]=g.DeleteOperations.deleteLeft(O.getPrevEditOperationType(),O.cursorConfig,O.model,O.getCursorStates().map(D=>D.modelState.selection));B&&T.pushUndoStop(),T.executeCommands(this.id,F),O.setPrevEditOperationType(2)}}),k.DeleteRight=w.registerEditorCommand(new class extends E{constructor(){super({id:"deleteRight",precondition:void 0,kbOpts:{weight:i,kbExpr:a.EditorContextKeys.textInputFocus,primary:20,mac:{primary:20,secondary:[256|34,256|20]}}})}runCoreEditingCommand(T,O,A){const[B,F]=g.DeleteOperations.deleteRight(O.getPrevEditOperationType(),O.cursorConfig,O.model,O.getCursorStates().map(D=>D.modelState.selection));B&&T.pushUndoStop(),T.executeCommands(this.id,F),O.setPrevEditOperationType(3)}}),k.Undo=new class extends h{constructor(){super(w.UndoCommand)}runDOMCommand(){document.execCommand("undo")}runEditorCommand(T,O,A){if(!(!O.hasModel()||O.getOption(75)===!0))return O.getModel().undo()}},k.Redo=new class extends h{constructor(){super(w.RedoCommand)}runDOMCommand(){document.execCommand("redo")}runEditorCommand(T,O,A){if(!(!O.hasModel()||O.getOption(75)===!0))return O.getModel().redo()}}})(y=e.CoreEditingCommands||(e.CoreEditingCommands={}));class L extends w.Command{constructor(E,T,O){super({id:E,precondition:void 0,description:O});this._handlerId=T}runCommand(E,T){const O=E.get(S.ICodeEditorService).getFocusedCodeEditor();!O||O.trigger("keyboard",this._handlerId,T)}}function I(k,E){v(new L("default:"+k,k)),v(new L(k,k,E))}I("type",{description:"Type",args:[{name:"args",schema:{type:"object",required:["text"],properties:{text:{type:"string"}}}}]}),I("replacePreviousChar"),I("compositionType"),I("compositionStart"),I("compositionEnd"),I("paste"),I("cut")}),define(Q[607],J([0,1,13,16,23,71,9,74,446]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorKeybindingCancellationTokenSource=void 0;const g=S.createDecorator("IEditorCancelService"),p=new N.RawContextKey("cancellableOperation",!1,d.localize(0,null));C.registerSingleton(g,class{constructor(){this._tokens=new WeakMap}add(o,s){let a=this._tokens.get(o);a||(a=o.invokeWithinContext(r=>{const i=p.bindTo(r.get(N.IContextKeyService)),n=new w.LinkedList;return{key:i,tokens:n}}),this._tokens.set(o,a));let u;return a.key.set(!0),u=a.tokens.push(s),()=>{u&&(u(),a.key.set(!a.tokens.isEmpty()),u=void 0)}}cancel(o){const s=this._tokens.get(o);if(!!s){const a=s.tokens.pop();a&&(a.cancel(),s.key.set(!s.tokens.isEmpty()))}}},!0);class c extends M.CancellationTokenSource{constructor(s,a){super(a);this.editor=s,this._unregister=s.invokeWithinContext(u=>u.get(g).add(s,this))}dispose(){this._unregister(),super.dispose()}}e.EditorKeybindingCancellationTokenSource=c,b.registerEditorCommand(new class extends b.EditorCommand{constructor(){super({id:"editor.cancelOperation",kbOpts:{weight:100,primary:9},precondition:p})}runEditorCommand(o,s){o.get(g).cancel(s)}})}),define(Q[70],J([0,1,8,3,23,2,607]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StableEditorScrollState=e.TextModelCancellationTokenSource=e.EditorStateCancellationTokenSource=e.EditorState=void 0;class C{constructor(o,s){if(this.flags=s,(this.flags&1)!=0){const a=o.getModel();this.modelVersionId=a?b.format("{0}#{1}",a.uri.toString(),a.getVersionId()):null}else this.modelVersionId=null;(this.flags&4)!=0?this.position=o.getPosition():this.position=null,(this.flags&2)!=0?this.selection=o.getSelection():this.selection=null,(this.flags&8)!=0?(this.scrollLeft=o.getScrollLeft(),this.scrollTop=o.getScrollTop()):(this.scrollLeft=-1,this.scrollTop=-1)}_equals(o){if(!(o instanceof C))return!1;const s=o;return!(this.modelVersionId!==s.modelVersionId||this.scrollLeft!==s.scrollLeft||this.scrollTop!==s.scrollTop||!this.position&&s.position||this.position&&!s.position||this.position&&s.position&&!this.position.equals(s.position)||!this.selection&&s.selection||this.selection&&!s.selection||this.selection&&s.selection&&!this.selection.equalsRange(s.selection))}validate(o){return this._equals(new C(o,this.flags))}}e.EditorState=C;class d extends S.EditorKeybindingCancellationTokenSource{constructor(o,s,a,u){super(o,u);this.editor=o,this._listener=new w.DisposableStore,s&4&&this._listener.add(o.onDidChangeCursorPosition(r=>{(!a||!N.Range.containsPosition(a,r.position))&&this.cancel()})),s&2&&this._listener.add(o.onDidChangeCursorSelection(r=>{(!a||!N.Range.containsRange(a,r.selection))&&this.cancel()})),s&8&&this._listener.add(o.onDidScrollChange(r=>this.cancel())),s&1&&(this._listener.add(o.onDidChangeModel(r=>this.cancel())),this._listener.add(o.onDidChangeModelContent(r=>this.cancel())))}dispose(){this._listener.dispose(),super.dispose()}}e.EditorStateCancellationTokenSource=d;class g extends M.CancellationTokenSource{constructor(o,s){super(s);this._listener=o.onDidChangeContent(()=>this.cancel())}dispose(){this._listener.dispose(),super.dispose()}}e.TextModelCancellationTokenSource=g;class p{constructor(o,s,a){this._visiblePosition=o,this._visiblePositionScrollDelta=s,this._cursorPosition=a}static capture(o){let s=null,a=0;if(o.getScrollTop()!==0){const u=o.getVisibleRanges();if(u.length>0){s=u[0].getStartPosition();const r=o.getTopForPosition(s.lineNumber,s.column);a=o.getScrollTop()-r}}return new p(s,a,o.getPosition())}restore(o){if(this._visiblePosition){const s=o.getTopForPosition(this._visiblePosition.lineNumber,this._visiblePosition.column);o.setScrollTop(s+this._visiblePositionScrollDelta)}}restoreRelativeVerticalPositionOfCursor(o){const s=o.getPosition();if(!(!this._cursorPosition||!s)){const a=o.getTopForLineNumber(s.lineNumber)-o.getTopForLineNumber(this._cursorPosition.lineNumber);o.setScrollTop(o.getScrollTop()+a)}}}e.StableEditorScrollState=p}),define(Q[608],J([0,1,178,13]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerDecorationsContribution=void 0;let M=class{constructor(S,C){}dispose(){}};M.ID="editor.contrib.markerDecorations",M=Me([_e(1,b.IMarkerDecorationsService)],M),e.MarkerDecorationsContribution=M,N.registerEditorContribution(M.ID,M)}),define(Q[609],J([0,1,188,14,17]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ViewController=void 0;class w{constructor(C,d,g,p){this.configuration=C,this.viewModel=d,this.userInputEvents=g,this.commandDelegate=p}paste(C,d,g,p){this.commandDelegate.paste(C,d,g,p)}type(C){this.commandDelegate.type(C)}compositionType(C,d,g,p){this.commandDelegate.compositionType(C,d,g,p)}compositionStart(){this.commandDelegate.startComposition()}compositionEnd(){this.commandDelegate.endComposition()}cut(){this.commandDelegate.cut()}setSelection(C){b.CoreNavigationCommands.SetSelection.runCoreEditorCommand(this.viewModel,{source:"keyboard",selection:C})}_validateViewColumn(C){const d=this.viewModel.getLineMinColumn(C.lineNumber);return C.column=4?this._selectAll():C.mouseDownCount===3?this._hasMulticursorModifier(C)?C.inSelectionMode?this._lastCursorLineSelectDrag(C.position):this._lastCursorLineSelect(C.position):C.inSelectionMode?this._lineSelectDrag(C.position):this._lineSelect(C.position):C.mouseDownCount===2?this._hasMulticursorModifier(C)?this._lastCursorWordSelect(C.position):C.inSelectionMode?this._wordSelectDrag(C.position):this._wordSelect(C.position):this._hasMulticursorModifier(C)?this._hasNonMulticursorModifier(C)||(C.shiftKey?this._columnSelect(C.position,C.mouseColumn,!0):C.inSelectionMode?this._lastCursorMoveToSelect(C.position):this._createCursor(C.position,!1)):C.inSelectionMode?C.altKey?this._columnSelect(C.position,C.mouseColumn,!0):p?this._columnSelect(C.position,C.mouseColumn,!0):this._moveToSelect(C.position):this.moveTo(C.position)}_usualArgs(C){return C=this._validateViewColumn(C),{source:"mouse",position:this._convertViewToModelPosition(C),viewPosition:C}}moveTo(C){b.CoreNavigationCommands.MoveTo.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_moveToSelect(C){b.CoreNavigationCommands.MoveToSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_columnSelect(C,d,g){C=this._validateViewColumn(C),b.CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(this.viewModel,{source:"mouse",position:this._convertViewToModelPosition(C),viewPosition:C,mouseColumn:d,doColumnSelect:g})}_createCursor(C,d){C=this._validateViewColumn(C),b.CoreNavigationCommands.CreateCursor.runCoreEditorCommand(this.viewModel,{source:"mouse",position:this._convertViewToModelPosition(C),viewPosition:C,wholeLine:d})}_lastCursorMoveToSelect(C){b.CoreNavigationCommands.LastCursorMoveToSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_wordSelect(C){b.CoreNavigationCommands.WordSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_wordSelectDrag(C){b.CoreNavigationCommands.WordSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_lastCursorWordSelect(C){b.CoreNavigationCommands.LastCursorWordSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_lineSelect(C){b.CoreNavigationCommands.LineSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_lineSelectDrag(C){b.CoreNavigationCommands.LineSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_lastCursorLineSelect(C){b.CoreNavigationCommands.LastCursorLineSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_lastCursorLineSelectDrag(C){b.CoreNavigationCommands.LastCursorLineSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(C))}_selectAll(){b.CoreNavigationCommands.SelectAll.runCoreEditorCommand(this.viewModel,{source:"mouse"})}_convertViewToModelPosition(C){return this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(C)}emitKeyDown(C){this.userInputEvents.emitKeyDown(C)}emitKeyUp(C){this.userInputEvents.emitKeyUp(C)}emitContextMenu(C){this.userInputEvents.emitContextMenu(C)}emitMouseMove(C){this.userInputEvents.emitMouseMove(C)}emitMouseLeave(C){this.userInputEvents.emitMouseLeave(C)}emitMouseUp(C){this.userInputEvents.emitMouseUp(C)}emitMouseDown(C){this.userInputEvents.emitMouseDown(C)}emitMouseDrag(C){this.userInputEvents.emitMouseDrag(C)}emitMouseDrop(C){this.userInputEvents.emitMouseDrop(C)}emitMouseDropCanceled(){this.userInputEvents.emitMouseDropCanceled()}emitMouseWheel(C){this.userInputEvents.emitMouseWheel(C)}}e.ViewController=w}),define(Q[610],J([0,1,7,35,21,30,12,581,590,609,256,564,45,390,588,391,584,172,589,257,582,392,223,393,585,394,591,395,592,586,587,593,396,14,3,110,385,387,111,11,187]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I,k,E,T,O,A,B,F,D,R,W,x,K){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.View=void 0;class Y extends W.ViewEventHandler{constructor(ne,le,X,z,P,V){super();this._selections=[new M.Selection(1,1,1,1)],this._renderAnimationFrame=null;const U=new g.ViewController(le,z,P,ne);this._context=new D.ViewContext(le,X.getColorTheme(),z),this._configPixelRatio=this._configPixelRatio=this._context.configuration.options.get(122),this._context.addEventHandler(this),this._register(X.onDidColorThemeChange(te=>{this._context.theme.update(te),this._context.model.onDidColorThemeChange(),this.render(!0,!1)})),this._viewParts=[],this._textAreaHandler=new d.TextAreaHandler(this._context,U,this._createTextAreaHandlerHelper()),this._viewParts.push(this._textAreaHandler),this._linesContent=w.createFastDomNode(document.createElement("div")),this._linesContent.setClassName("lines-content monaco-editor-background"),this._linesContent.setPosition("absolute"),this.domNode=w.createFastDomNode(document.createElement("div")),this.domNode.setClassName(this._getEditorClassName()),this.domNode.setAttribute("role","code"),this._overflowGuardContainer=w.createFastDomNode(document.createElement("div")),o.PartFingerprints.write(this._overflowGuardContainer,3),this._overflowGuardContainer.setClassName("overflow-guard"),this._scrollbar=new r.EditorScrollbar(this._context,this._linesContent,this.domNode,this._overflowGuardContainer),this._viewParts.push(this._scrollbar),this._viewLines=new l.ViewLines(this._context,this._linesContent),this._viewZones=new O.ViewZones(this._context),this._viewParts.push(this._viewZones);const H=new y.DecorationsOverviewRuler(this._context);this._viewParts.push(H);const $=new k.ScrollDecorationViewPart(this._context);this._viewParts.push($);const ie=new c.ContentViewOverlays(this._context);this._viewParts.push(ie),ie.addDynamicOverlay(new a.CurrentLineHighlightOverlay(this._context)),ie.addDynamicOverlay(new E.SelectionsOverlay(this._context)),ie.addDynamicOverlay(new n.IndentGuidesOverlay(this._context)),ie.addDynamicOverlay(new u.DecorationsOverlay(this._context));const oe=new c.MarginViewOverlays(this._context);this._viewParts.push(oe),oe.addDynamicOverlay(new a.CurrentLineMarginHighlightOverlay(this._context)),oe.addDynamicOverlay(new i.GlyphMarginOverlay(this._context)),oe.addDynamicOverlay(new _.MarginViewLineDecorationsOverlay(this._context)),oe.addDynamicOverlay(new h.LinesDecorationsOverlay(this._context)),oe.addDynamicOverlay(new t.LineNumbersOverlay(this._context));const ae=new m.Margin(this._context);ae.getDomNode().appendChild(this._viewZones.marginDomNode),ae.getDomNode().appendChild(oe.getDomNode()),this._viewParts.push(ae),this._contentWidgets=new s.ViewContentWidgets(this._context,this.domNode),this._viewParts.push(this._contentWidgets),this._viewCursors=new T.ViewCursors(this._context),this._viewParts.push(this._viewCursors),this._overlayWidgets=new v.ViewOverlayWidgets(this._context),this._viewParts.push(this._overlayWidgets);const G=new I.Rulers(this._context);this._viewParts.push(G);const j=new f.Minimap(this._context);if(this._viewParts.push(j),H){const te=this._scrollbar.getOverviewRulerLayoutInfo();te.parent.insertBefore(H.getDomNode(),te.insertBefore)}this._linesContent.appendChild(ie.getDomNode()),this._linesContent.appendChild(G.domNode),this._linesContent.appendChild(this._viewZones.domNode),this._linesContent.appendChild(this._viewLines.getDomNode()),this._linesContent.appendChild(this._contentWidgets.domNode),this._linesContent.appendChild(this._viewCursors.getDomNode()),this._overflowGuardContainer.appendChild(ae.getDomNode()),this._overflowGuardContainer.appendChild(this._scrollbar.getDomNode()),this._overflowGuardContainer.appendChild($.getDomNode()),this._overflowGuardContainer.appendChild(this._textAreaHandler.textArea),this._overflowGuardContainer.appendChild(this._textAreaHandler.textAreaCover),this._overflowGuardContainer.appendChild(this._overlayWidgets.getDomNode()),this._overflowGuardContainer.appendChild(j.getDomNode()),this.domNode.appendChild(this._overflowGuardContainer),V?V.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode.domNode):this.domNode.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode),this._applyLayout(),this._pointerHandler=this._register(new C.PointerHandler(this._context,U,this._createPointerHandlerHelper()))}_flushAccumulatedAndRenderNow(){this._renderNow()}_createPointerHandlerHelper(){return{viewDomNode:this.domNode.domNode,linesContentDomNode:this._linesContent.domNode,focusTextArea:()=>{this.focus()},dispatchTextAreaEvent:ne=>{this._textAreaHandler.textArea.domNode.dispatchEvent(ne)},getLastRenderData:()=>{const ne=this._viewCursors.getLastRenderData()||[],le=this._textAreaHandler.getLastRenderData();return new K.PointerHandlerLastRenderData(ne,le)},shouldSuppressMouseDownOnViewZone:ne=>this._viewZones.shouldSuppressMouseDownOnViewZone(ne),shouldSuppressMouseDownOnWidget:ne=>this._contentWidgets.shouldSuppressMouseDownOnWidget(ne),getPositionFromDOMInfo:(ne,le)=>(this._flushAccumulatedAndRenderNow(),this._viewLines.getPositionFromDOMInfo(ne,le)),visibleRangeForPosition:(ne,le)=>(this._flushAccumulatedAndRenderNow(),this._viewLines.visibleRangeForPosition(new A.Position(ne,le))),getLineWidth:ne=>(this._flushAccumulatedAndRenderNow(),this._viewLines.getLineWidth(ne))}}_createTextAreaHandlerHelper(){return{visibleRangeForPositionRelativeToEditor:(ne,le)=>(this._flushAccumulatedAndRenderNow(),this._viewLines.visibleRangeForPosition(new A.Position(ne,le)))}}_applyLayout(){const le=this._context.configuration.options.get(124);this.domNode.setWidth(le.width),this.domNode.setHeight(le.height),this._overflowGuardContainer.setWidth(le.width),this._overflowGuardContainer.setHeight(le.height),this._linesContent.setWidth(1e6),this._linesContent.setHeight(1e6)}_getEditorClassName(){const ne=this._textAreaHandler.isFocused()?" focused":"";return this._context.configuration.options.get(121)+" "+x.getThemeTypeSelector(this._context.theme.type)+ne}handleEvents(ne){super.handleEvents(ne),this._scheduleRender()}onConfigurationChanged(ne){return this._configPixelRatio=this._context.configuration.options.get(122),this.domNode.setClassName(this._getEditorClassName()),this._applyLayout(),!1}onCursorStateChanged(ne){return this._selections=ne.selections,!1}onFocusChanged(ne){return this.domNode.setClassName(this._getEditorClassName()),!1}onThemeChanged(ne){return this.domNode.setClassName(this._getEditorClassName()),!1}dispose(){this._renderAnimationFrame!==null&&(this._renderAnimationFrame.dispose(),this._renderAnimationFrame=null),this._contentWidgets.overflowingContentWidgetsDomNode.domNode.remove(),this._context.removeEventHandler(this),this._viewLines.dispose();for(const ne of this._viewParts)ne.dispose();super.dispose()}_scheduleRender(){this._renderAnimationFrame===null&&(this._renderAnimationFrame=b.runAtThisOrScheduleAtNextAnimationFrame(this._onRenderScheduled.bind(this),100))}_onRenderScheduled(){this._renderAnimationFrame=null,this._flushAccumulatedAndRenderNow()}_renderNow(){ee(()=>this._actualRender())}_getViewPartsToRender(){let ne=[],le=0;for(const X of this._viewParts)X.shouldRender()&&(ne[le++]=X);return ne}_actualRender(){if(!!b.isInDOM(this.domNode.domNode)){let ne=this._getViewPartsToRender();if(!(!this._viewLines.shouldRender()&&ne.length===0)){const le=this._context.viewLayout.getLinesViewportData();this._context.model.setViewport(le.startLineNumber,le.endLineNumber,le.centeredLineNumber);const X=new R.ViewportData(this._selections,le,this._context.viewLayout.getWhitespaceViewportData(),this._context.model);this._contentWidgets.shouldRender()&&this._contentWidgets.onBeforeRender(X),this._viewLines.shouldRender()&&(this._viewLines.renderText(X),this._viewLines.onDidRender(),ne=this._getViewPartsToRender());const z=new F.RenderingContext(this._context.viewLayout,X,this._viewLines);for(const P of ne)P.prepareRender(z);for(const P of ne)P.render(z),P.onDidRender();Math.abs(N.getPixelRatio()-this._configPixelRatio)>.001&&this._context.configuration.updatePixelRatio()}}}delegateVerticalScrollbarMouseDown(ne){this._scrollbar.delegateVerticalScrollbarMouseDown(ne)}restoreState(ne){this._context.model.setScrollPosition({scrollTop:ne.scrollTop},1),this._context.model.tokenizeViewport(),this._renderNow(),this._viewLines.updateLineWidths(),this._context.model.setScrollPosition({scrollLeft:ne.scrollLeft},1)}getOffsetForColumn(ne,le){const X=this._context.model.validateModelPosition({lineNumber:ne,column:le}),z=this._context.model.coordinatesConverter.convertModelPositionToViewPosition(X);this._flushAccumulatedAndRenderNow();const P=this._viewLines.visibleRangeForPosition(new A.Position(z.lineNumber,z.column));return P?P.left:-1}getTargetAtClientPoint(ne,le){const X=this._pointerHandler.getTargetAtClientPoint(ne,le);return X?p.ViewUserInputEvents.convertViewToModelMouseTarget(X,this._context.model.coordinatesConverter):null}createOverviewRuler(ne){return new L.OverviewRuler(this._context,ne)}change(ne){this._viewZones.changeViewZones(ne),this._scheduleRender()}render(ne,le){if(le){this._viewLines.forceShouldRender();for(const X of this._viewParts)X.forceShouldRender()}ne?this._flushAccumulatedAndRenderNow():this._scheduleRender()}focus(){this._textAreaHandler.focusTextArea()}isFocused(){return this._textAreaHandler.isFocused()}setAriaOptions(ne){this._textAreaHandler.setAriaOptions(ne)}addContentWidget(ne){this._contentWidgets.addWidget(ne.widget),this.layoutContentWidget(ne),this._scheduleRender()}layoutContentWidget(ne){let le=ne.position&&ne.position.range||null;if(le===null){const z=ne.position?ne.position.position:null;z!==null&&(le=new B.Range(z.lineNumber,z.column,z.lineNumber,z.column))}const X=ne.position?ne.position.preference:null;this._contentWidgets.setWidgetPosition(ne.widget,le,X),this._scheduleRender()}removeContentWidget(ne){this._contentWidgets.removeWidget(ne.widget),this._scheduleRender()}addOverlayWidget(ne){this._overlayWidgets.addWidget(ne.widget),this.layoutOverlayWidget(ne),this._scheduleRender()}layoutOverlayWidget(ne){const le=ne.position?ne.position.preference:null;this._overlayWidgets.setWidgetPosition(ne.widget,le)&&this._scheduleRender()}removeOverlayWidget(ne){this._overlayWidgets.removeWidget(ne.widget),this._scheduleRender()}}e.View=Y;function ee(se){try{return se()}catch(ne){S.onUnexpectedError(ne)}}}),define(Q[143],J([0,1,448,7,12,6,2,43,69,13,28,610,256,38,242,42,14,3,21,217,107,25,18,49,22,540,26,16,9,138,32,11,65,20,397,563,136,608,334]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I,k,E,T,O,A,B,F,D){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EditorModeContext=e.BooleanEventEmitter=e.CodeEditorWidget=void 0;let R=0;class W{constructor(H,$,ie,oe,ae){this.model=H,this.viewModel=$,this.view=ie,this.hasRealView=oe,this.listenersToRemove=ae}dispose(){S.dispose(this.listenersToRemove),this.model.onBeforeDetached(),this.hasRealView&&this.view.dispose(),this.viewModel.dispose()}}let x=class ct extends S.Disposable{constructor(H,$,ie,oe,ae,G,j,te,Z,ue){super();this._onDidDispose=this._register(new w.Emitter),this.onDidDispose=this._onDidDispose.event,this._onDidChangeModelContent=this._register(new w.Emitter),this.onDidChangeModelContent=this._onDidChangeModelContent.event,this._onDidChangeModelLanguage=this._register(new w.Emitter),this.onDidChangeModelLanguage=this._onDidChangeModelLanguage.event,this._onDidChangeModelLanguageConfiguration=this._register(new w.Emitter),this.onDidChangeModelLanguageConfiguration=this._onDidChangeModelLanguageConfiguration.event,this._onDidChangeModelOptions=this._register(new w.Emitter),this.onDidChangeModelOptions=this._onDidChangeModelOptions.event,this._onDidChangeModelDecorations=this._register(new w.Emitter),this.onDidChangeModelDecorations=this._onDidChangeModelDecorations.event,this._onDidChangeConfiguration=this._register(new w.Emitter),this.onDidChangeConfiguration=this._onDidChangeConfiguration.event,this._onDidChangeModel=this._register(new w.Emitter),this.onDidChangeModel=this._onDidChangeModel.event,this._onDidChangeCursorPosition=this._register(new w.Emitter),this.onDidChangeCursorPosition=this._onDidChangeCursorPosition.event,this._onDidChangeCursorSelection=this._register(new w.Emitter),this.onDidChangeCursorSelection=this._onDidChangeCursorSelection.event,this._onDidAttemptReadOnlyEdit=this._register(new w.Emitter),this.onDidAttemptReadOnlyEdit=this._onDidAttemptReadOnlyEdit.event,this._onDidLayoutChange=this._register(new w.Emitter),this.onDidLayoutChange=this._onDidLayoutChange.event,this._editorTextFocus=this._register(new K),this.onDidFocusEditorText=this._editorTextFocus.onDidChangeToTrue,this.onDidBlurEditorText=this._editorTextFocus.onDidChangeToFalse,this._editorWidgetFocus=this._register(new K),this.onDidFocusEditorWidget=this._editorWidgetFocus.onDidChangeToTrue,this.onDidBlurEditorWidget=this._editorWidgetFocus.onDidChangeToFalse,this._onWillType=this._register(new w.Emitter),this.onWillType=this._onWillType.event,this._onDidType=this._register(new w.Emitter),this.onDidType=this._onDidType.event,this._onDidCompositionStart=this._register(new w.Emitter),this.onDidCompositionStart=this._onDidCompositionStart.event,this._onDidCompositionEnd=this._register(new w.Emitter),this.onDidCompositionEnd=this._onDidCompositionEnd.event,this._onDidPaste=this._register(new w.Emitter),this.onDidPaste=this._onDidPaste.event,this._onMouseUp=this._register(new w.Emitter),this.onMouseUp=this._onMouseUp.event,this._onMouseDown=this._register(new w.Emitter),this.onMouseDown=this._onMouseDown.event,this._onMouseDrag=this._register(new w.Emitter),this.onMouseDrag=this._onMouseDrag.event,this._onMouseDrop=this._register(new w.Emitter),this.onMouseDrop=this._onMouseDrop.event,this._onMouseDropCanceled=this._register(new w.Emitter),this.onMouseDropCanceled=this._onMouseDropCanceled.event,this._onContextMenu=this._register(new w.Emitter),this.onContextMenu=this._onContextMenu.event,this._onMouseMove=this._register(new w.Emitter),this.onMouseMove=this._onMouseMove.event,this._onMouseLeave=this._register(new w.Emitter),this.onMouseLeave=this._onMouseLeave.event,this._onMouseWheel=this._register(new w.Emitter),this.onMouseWheel=this._onMouseWheel.event,this._onKeyUp=this._register(new w.Emitter),this.onKeyUp=this._onKeyUp.event,this._onKeyDown=this._register(new w.Emitter),this.onKeyDown=this._onKeyDown.event,this._onDidContentSizeChange=this._register(new w.Emitter),this.onDidContentSizeChange=this._onDidContentSizeChange.event,this._onDidScrollChange=this._register(new w.Emitter),this.onDidScrollChange=this._onDidScrollChange.event,this._onDidChangeViewZones=this._register(new w.Emitter),this.onDidChangeViewZones=this._onDidChangeViewZones.event;const he=Object.assign({},$);this._domElement=H,this._overflowWidgetsDomNode=he.overflowWidgetsDomNode,delete he.overflowWidgetsDomNode,this._id=++R,this._decorationTypeKeysToIds={},this._decorationTypeSubtypes={},this.isSimpleWidget=ie.isSimpleWidget||!1,this._telemetryData=ie.telemetryData,this._configuration=this._register(this._createConfiguration(he,ue)),this._register(this._configuration.onDidChange(ce=>{this._onDidChangeConfiguration.fire(ce);const me=this._configuration.options;if(ce.hasChanged(124)){const Ce=me.get(124);this._onDidLayoutChange.fire(Ce)}})),this._contextKeyService=this._register(j.createScoped(this._domElement)),this._notificationService=Z,this._codeEditorService=ae,this._commandService=G,this._themeService=te,this._register(new Y(this,this._contextKeyService)),this._register(new ee(this,this._contextKeyService)),this._instantiationService=oe.createChild(new k.ServiceCollection([L.IContextKeyService,this._contextKeyService])),this._modelData=null,this._contributions={},this._actions={},this._focusTracker=new se(H),this._focusTracker.onChange(()=>{this._editorWidgetFocus.setValue(this._focusTracker.hasFocus())}),this._contentWidgets={},this._overlayWidgets={};let re;Array.isArray(ie.contributions)?re=ie.contributions:re=g.EditorExtensionsRegistry.getEditorContributions();for(const ce of re)try{const me=this._instantiationService.createInstance(ce.ctor,this);this._contributions[ce.id]=me}catch(me){M.onUnexpectedError(me)}g.EditorExtensionsRegistry.getEditorActions().forEach(ce=>{const me=new t.InternalEditorAction(ce.id,ce.label,ce.alias,A.withNullAsUndefined(ce.precondition),()=>this._instantiationService.invokeFunction(Ce=>Promise.resolve(ce.runEditorCommand(Ce,this,null))),this._contextKeyService);this._actions[me.id]=me}),this._codeEditorService.addCodeEditor(this)}_createConfiguration(H,$){return new d.Configuration(this.isSimpleWidget,H,this._domElement,$)}getId(){return this.getEditorType()+":"+this._id}getEditorType(){return l.EditorType.ICodeEditor}dispose(){this._codeEditorService.removeCodeEditor(this),this._focusTracker.dispose();const H=Object.keys(this._contributions);for(let $=0,ie=H.length;$i.Range.lift($)))}getVisibleColumnFromPosition(H){if(!this._modelData)return H.column;const $=this._modelData.model.validatePosition(H),ie=this._modelData.model.getOptions().tabSize;return u.CursorColumns.visibleColumnFromColumn(this._modelData.model.getLineContent($.lineNumber),$.column,ie)+1}getPosition(){return this._modelData?this._modelData.viewModel.getPosition():null}setPosition(H){if(!!this._modelData){if(!r.Position.isIPosition(H))throw new Error("Invalid arguments");this._modelData.viewModel.setSelections("api",[{selectionStartLineNumber:H.lineNumber,selectionStartColumn:H.column,positionLineNumber:H.lineNumber,positionColumn:H.column}])}}_sendRevealRange(H,$,ie,oe){if(!!this._modelData){if(!i.Range.isIRange(H))throw new Error("Invalid arguments");const ae=this._modelData.model.validateRange(H),G=this._modelData.viewModel.coordinatesConverter.convertModelRangeToViewRange(ae);this._modelData.viewModel.revealRange("api",ie,G,$,oe)}}revealLine(H,$=0){this._revealLine(H,0,$)}revealLineInCenter(H,$=0){this._revealLine(H,1,$)}revealLineInCenterIfOutsideViewport(H,$=0){this._revealLine(H,2,$)}revealLineNearTop(H,$=0){this._revealLine(H,5,$)}_revealLine(H,$,ie){if(typeof H!="number")throw new Error("Invalid arguments");this._sendRevealRange(new i.Range(H,1,H,1),$,!1,ie)}revealPosition(H,$=0){this._revealPosition(H,0,!0,$)}revealPositionInCenter(H,$=0){this._revealPosition(H,1,!0,$)}revealPositionInCenterIfOutsideViewport(H,$=0){this._revealPosition(H,2,!0,$)}revealPositionNearTop(H,$=0){this._revealPosition(H,5,!0,$)}_revealPosition(H,$,ie,oe){if(!r.Position.isIPosition(H))throw new Error("Invalid arguments");this._sendRevealRange(new i.Range(H.lineNumber,H.column,H.lineNumber,H.column),$,ie,oe)}getSelection(){return this._modelData?this._modelData.viewModel.getSelection():null}getSelections(){return this._modelData?this._modelData.viewModel.getSelections():null}setSelection(H){const $=n.Selection.isISelection(H),ie=i.Range.isIRange(H);if(!$&&!ie)throw new Error("Invalid arguments");if($)this._setSelectionImpl(H);else if(ie){const oe={selectionStartLineNumber:H.startLineNumber,selectionStartColumn:H.startColumn,positionLineNumber:H.endLineNumber,positionColumn:H.endColumn};this._setSelectionImpl(oe)}}_setSelectionImpl(H){if(!!this._modelData){const $=new n.Selection(H.selectionStartLineNumber,H.selectionStartColumn,H.positionLineNumber,H.positionColumn);this._modelData.viewModel.setSelections("api",[$])}}revealLines(H,$,ie=0){this._revealLines(H,$,0,ie)}revealLinesInCenter(H,$,ie=0){this._revealLines(H,$,1,ie)}revealLinesInCenterIfOutsideViewport(H,$,ie=0){this._revealLines(H,$,2,ie)}revealLinesNearTop(H,$,ie=0){this._revealLines(H,$,5,ie)}_revealLines(H,$,ie,oe){if(typeof H!="number"||typeof $!="number")throw new Error("Invalid arguments");this._sendRevealRange(new i.Range(H,1,$,1),ie,!1,oe)}revealRange(H,$=0,ie=!1,oe=!0){this._revealRange(H,ie?1:0,oe,$)}revealRangeInCenter(H,$=0){this._revealRange(H,1,!0,$)}revealRangeInCenterIfOutsideViewport(H,$=0){this._revealRange(H,2,!0,$)}revealRangeNearTop(H,$=0){this._revealRange(H,5,!0,$)}revealRangeNearTopIfOutsideViewport(H,$=0){this._revealRange(H,6,!0,$)}revealRangeAtTop(H,$=0){this._revealRange(H,3,!0,$)}_revealRange(H,$,ie,oe){if(!i.Range.isIRange(H))throw new Error("Invalid arguments");this._sendRevealRange(i.Range.lift(H),$,ie,oe)}setSelections(H,$="api",ie=0){if(!!this._modelData){if(!H||H.length===0)throw new Error("Invalid arguments");for(let oe=0,ae=H.length;oe$.isSupported()),H}getAction(H){return this._actions[H]||null}trigger(H,$,ie){switch(ie=ie||{},$){case"compositionStart":this._startComposition();return;case"compositionEnd":this._endComposition(H);return;case"type":{const ae=ie;this._type(H,ae.text||"");return}case"replacePreviousChar":{const ae=ie;this._compositionType(H,ae.text||"",ae.replaceCharCnt||0,0,0);return}case"compositionType":{const ae=ie;this._compositionType(H,ae.text||"",ae.replacePrevCharCnt||0,ae.replaceNextCharCnt||0,ae.positionDelta||0);return}case"paste":{const ae=ie;this._paste(H,ae.text||"",ae.pasteOnNewLine||!1,ae.multicursorText||null,ae.mode||null);return}case"cut":this._cut(H);return}const oe=this.getAction($);if(oe){Promise.resolve(oe.run()).then(void 0,M.onUnexpectedError);return}!this._modelData||this._triggerEditorCommand(H,$,ie)||this._commandService.executeCommand($,ie)}_startComposition(){!this._modelData||(this._modelData.viewModel.startComposition(),this._onDidCompositionStart.fire())}_endComposition(H){!this._modelData||(this._modelData.viewModel.endComposition(H),this._onDidCompositionEnd.fire())}_type(H,$){!this._modelData||$.length===0||(H==="keyboard"&&this._onWillType.fire($),this._modelData.viewModel.type($,H),H==="keyboard"&&this._onDidType.fire($))}_compositionType(H,$,ie,oe,ae){!this._modelData||this._modelData.viewModel.compositionType($,ie,oe,ae,H)}_paste(H,$,ie,oe,ae){if(!(!this._modelData||$.length===0)){const G=this._modelData.viewModel.getSelection().getStartPosition();this._modelData.viewModel.paste($,ie,oe,H);const j=this._modelData.viewModel.getSelection().getStartPosition();H==="keyboard"&&this._onDidPaste.fire({range:new i.Range(G.lineNumber,G.column,j.lineNumber,j.column),mode:ae})}}_cut(H){!this._modelData||this._modelData.viewModel.cut(H)}_triggerEditorCommand(H,$,ie){const oe=g.EditorExtensionsRegistry.getEditorCommand($);return oe?(ie=ie||{},ie.source=H,this._instantiationService.invokeFunction(ae=>{Promise.resolve(oe.runEditorCommand(ae,this,ie)).then(void 0,M.onUnexpectedError)}),!0):!1}_getViewModel(){return this._modelData?this._modelData.viewModel:null}pushUndoStop(){return!this._modelData||this._configuration.options.get(75)?!1:(this._modelData.model.pushStackElement(),!0)}popUndoStop(){return!this._modelData||this._configuration.options.get(75)?!1:(this._modelData.model.popStackElement(),!0)}executeEdits(H,$,ie){if(!this._modelData||this._configuration.options.get(75))return!1;let oe;return ie?Array.isArray(ie)?oe=()=>ie:oe=ie:oe=()=>null,this._modelData.viewModel.executeEdits(H,$,oe),!0}executeCommand(H,$){!this._modelData||this._modelData.viewModel.executeCommand($,H)}executeCommands(H,$){!this._modelData||this._modelData.viewModel.executeCommands($,H)}changeDecorations(H){return this._modelData?this._modelData.model.changeDecorations(H,this._id):null}getLineDecorations(H){return this._modelData?this._modelData.model.getLineDecorations(H,this._id,s.filterValidationDecorations(this._configuration.options)):null}deltaDecorations(H,$){return this._modelData?H.length===0&&$.length===0?H:this._modelData.model.deltaDecorations(H,$,this._id):[]}removeDecorations(H){const $=this._decorationTypeKeysToIds[H];$&&this.deltaDecorations($,[]),this._decorationTypeKeysToIds.hasOwnProperty(H)&&delete this._decorationTypeKeysToIds[H],this._decorationTypeSubtypes.hasOwnProperty(H)&&delete this._decorationTypeSubtypes[H]}getLayoutInfo(){return this._configuration.options.get(124)}createOverviewRuler(H){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.createOverviewRuler(H)}getContainerDomNode(){return this._domElement}getDomNode(){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.domNode.domNode}delegateVerticalScrollbarMouseDown(H){!this._modelData||!this._modelData.hasRealView||this._modelData.view.delegateVerticalScrollbarMouseDown(H)}layout(H){this._configuration.observeReferenceElement(H),this.render()}focus(){!this._modelData||!this._modelData.hasRealView||this._modelData.view.focus()}hasTextFocus(){return!this._modelData||!this._modelData.hasRealView?!1:this._modelData.view.isFocused()}hasWidgetFocus(){return this._focusTracker&&this._focusTracker.hasFocus()}addContentWidget(H){const $={widget:H,position:H.getPosition()};this._contentWidgets.hasOwnProperty(H.getId())&&console.warn("Overwriting a content widget with the same id."),this._contentWidgets[H.getId()]=$,this._modelData&&this._modelData.hasRealView&&this._modelData.view.addContentWidget($)}layoutContentWidget(H){const $=H.getId();if(this._contentWidgets.hasOwnProperty($)){const ie=this._contentWidgets[$];ie.position=H.getPosition(),this._modelData&&this._modelData.hasRealView&&this._modelData.view.layoutContentWidget(ie)}}removeContentWidget(H){const $=H.getId();if(this._contentWidgets.hasOwnProperty($)){const ie=this._contentWidgets[$];delete this._contentWidgets[$],this._modelData&&this._modelData.hasRealView&&this._modelData.view.removeContentWidget(ie)}}addOverlayWidget(H){const $={widget:H,position:H.getPosition()};this._overlayWidgets.hasOwnProperty(H.getId())&&console.warn("Overwriting an overlay widget with the same id."),this._overlayWidgets[H.getId()]=$,this._modelData&&this._modelData.hasRealView&&this._modelData.view.addOverlayWidget($)}layoutOverlayWidget(H){const $=H.getId();if(this._overlayWidgets.hasOwnProperty($)){const ie=this._overlayWidgets[$];ie.position=H.getPosition(),this._modelData&&this._modelData.hasRealView&&this._modelData.view.layoutOverlayWidget(ie)}}removeOverlayWidget(H){const $=H.getId();if(this._overlayWidgets.hasOwnProperty($)){const ie=this._overlayWidgets[$];delete this._overlayWidgets[$],this._modelData&&this._modelData.hasRealView&&this._modelData.view.removeOverlayWidget(ie)}}changeViewZones(H){!this._modelData||!this._modelData.hasRealView||this._modelData.view.change(H)}getTargetAtClientPoint(H,$){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.getTargetAtClientPoint(H,$)}getScrolledVisiblePosition(H){if(!this._modelData||!this._modelData.hasRealView)return null;const $=this._modelData.model.validatePosition(H),ie=this._configuration.options,oe=ie.get(124),ae=ct._getVerticalOffsetForPosition(this._modelData,$.lineNumber,$.column)-this.getScrollTop(),G=this._modelData.view.getOffsetForColumn($.lineNumber,$.column)+oe.glyphMarginWidth+oe.lineNumbersWidth+oe.decorationsWidth-this.getScrollLeft();return{top:ae,left:G,height:ie.get(53)}}getOffsetForColumn(H,$){return!this._modelData||!this._modelData.hasRealView?-1:this._modelData.view.getOffsetForColumn(H,$)}render(H=!1){!this._modelData||!this._modelData.hasRealView||this._modelData.view.render(!0,H)}setAriaOptions(H){!this._modelData||!this._modelData.hasRealView||this._modelData.view.setAriaOptions(H)}applyFontInfo(H){d.Configuration.applyFontInfoSlow(H,this._configuration.options.get(38))}_attachModel(H){if(!H){this._modelData=null;return}const $=[];this._domElement.setAttribute("data-mode-id",H.getLanguageIdentifier().language),this._configuration.setIsDominatedByLongLines(H.isDominatedByLongLines()),this._configuration.setMaxLineNumber(H.getLineCount()),H.onBeforeAttached();const ie=new v.ViewModel(this._id,this._configuration,H,F.DOMLineBreaksComputerFactory.create(),B.MonospaceLineBreaksComputerFactory.create(this._configuration.options),G=>N.scheduleAtNextAnimationFrame(G));$.push(H.onDidChangeDecorations(G=>this._onDidChangeModelDecorations.fire(G))),$.push(H.onDidChangeLanguage(G=>{this._domElement.setAttribute("data-mode-id",H.getLanguageIdentifier().language),this._onDidChangeModelLanguage.fire(G)})),$.push(H.onDidChangeLanguageConfiguration(G=>this._onDidChangeModelLanguageConfiguration.fire(G))),$.push(H.onDidChangeContent(G=>this._onDidChangeModelContent.fire(G))),$.push(H.onDidChangeOptions(G=>this._onDidChangeModelOptions.fire(G))),$.push(H.onWillDispose(()=>this.setModel(null))),$.push(ie.onEvent(G=>{switch(G.kind){case 0:this._onDidContentSizeChange.fire(G);break;case 1:this._editorTextFocus.setValue(G.hasFocus);break;case 2:this._onDidScrollChange.fire(G);break;case 3:this._onDidChangeViewZones.fire();break;case 4:this._onDidAttemptReadOnlyEdit.fire();break;case 5:{G.reachedMaxCursorCount&&this._notificationService.warn(b.localize(0,null,a.Cursor.MAX_CURSOR_COUNT));const j=[];for(let ue=0,he=G.selections.length;ue{this._paste("keyboard",ae,G,j,te)},type:ae=>{this._type("keyboard",ae)},compositionType:(ae,G,j,te)=>{this._compositionType("keyboard",ae,G,j,te)},startComposition:()=>{this._startComposition()},endComposition:()=>{this._endComposition("keyboard")},cut:()=>{this._cut("keyboard")}}:$={paste:(ae,G,j,te)=>{const Z={text:ae,pasteOnNewLine:G,multicursorText:j,mode:te};this._commandService.executeCommand("paste",Z)},type:ae=>{const G={text:ae};this._commandService.executeCommand("type",G)},compositionType:(ae,G,j,te)=>{if(j||te){const Z={text:ae,replacePrevCharCnt:G,replaceNextCharCnt:j,positionDelta:te};this._commandService.executeCommand("compositionType",Z)}else{const Z={text:ae,replaceCharCnt:G};this._commandService.executeCommand("replacePreviousChar",Z)}},startComposition:()=>{this._commandService.executeCommand("compositionStart",{})},endComposition:()=>{this._commandService.executeCommand("compositionEnd",{})},cut:()=>{this._commandService.executeCommand("cut",{})}};const ie=new o.ViewUserInputEvents(H.coordinatesConverter);return ie.onKeyDown=ae=>this._onKeyDown.fire(ae),ie.onKeyUp=ae=>this._onKeyUp.fire(ae),ie.onContextMenu=ae=>this._onContextMenu.fire(ae),ie.onMouseMove=ae=>this._onMouseMove.fire(ae),ie.onMouseLeave=ae=>this._onMouseLeave.fire(ae),ie.onMouseDown=ae=>this._onMouseDown.fire(ae),ie.onMouseUp=ae=>this._onMouseUp.fire(ae),ie.onMouseDrag=ae=>this._onMouseDrag.fire(ae),ie.onMouseDrop=ae=>this._onMouseDrop.fire(ae),ie.onMouseDropCanceled=ae=>this._onMouseDropCanceled.fire(ae),ie.onMouseWheel=ae=>this._onMouseWheel.fire(ae),[new c.View($,this._configuration,this._themeService,H,ie,this._overflowWidgetsDomNode),!0]}_postDetachModelCleanup(H){H&&H.removeAllDecorationsWithOwnerId(this._id)}_detachModel(){if(!this._modelData)return null;const H=this._modelData.model,$=this._modelData.hasRealView?this._modelData.view.domNode.domNode:null;return this._modelData.dispose(),this._modelData=null,this._domElement.removeAttribute("data-mode-id"),$&&this._domElement.contains($)&&this._domElement.removeChild($),H}_removeDecorationType(H){this._codeEditorService.removeDecorationType(H)}hasModel(){return this._modelData!==null}};x=Me([_e(3,I.IInstantiationService),_e(4,p.ICodeEditorService),_e(5,y.ICommandService),_e(6,L.IContextKeyService),_e(7,T.IThemeService),_e(8,E.INotificationService),_e(9,O.IAccessibilityService)],x),e.CodeEditorWidget=x;class K extends S.Disposable{constructor(){super();this._onDidChangeToTrue=this._register(new w.Emitter),this.onDidChangeToTrue=this._onDidChangeToTrue.event,this._onDidChangeToFalse=this._register(new w.Emitter),this.onDidChangeToFalse=this._onDidChangeToFalse.event,this._value=0}setValue(H){const $=H?2:1;this._value!==$&&(this._value=$,this._value===2?this._onDidChangeToTrue.fire():this._value===1&&this._onDidChangeToFalse.fire())}}e.BooleanEventEmitter=K;class Y extends S.Disposable{constructor(H,$){super();this._editor=H,$.createKey("editorId",H.getId()),this._editorSimpleInput=h.EditorContextKeys.editorSimpleInput.bindTo($),this._editorFocus=h.EditorContextKeys.focus.bindTo($),this._textInputFocus=h.EditorContextKeys.textInputFocus.bindTo($),this._editorTextFocus=h.EditorContextKeys.editorTextFocus.bindTo($),this._editorTabMovesFocus=h.EditorContextKeys.tabMovesFocus.bindTo($),this._editorReadonly=h.EditorContextKeys.readOnly.bindTo($),this._inDiffEditor=h.EditorContextKeys.inDiffEditor.bindTo($),this._editorColumnSelection=h.EditorContextKeys.columnSelection.bindTo($),this._hasMultipleSelections=h.EditorContextKeys.hasMultipleSelections.bindTo($),this._hasNonEmptySelection=h.EditorContextKeys.hasNonEmptySelection.bindTo($),this._canUndo=h.EditorContextKeys.canUndo.bindTo($),this._canRedo=h.EditorContextKeys.canRedo.bindTo($),this._register(this._editor.onDidChangeConfiguration(()=>this._updateFromConfig())),this._register(this._editor.onDidChangeCursorSelection(()=>this._updateFromSelection())),this._register(this._editor.onDidFocusEditorWidget(()=>this._updateFromFocus())),this._register(this._editor.onDidBlurEditorWidget(()=>this._updateFromFocus())),this._register(this._editor.onDidFocusEditorText(()=>this._updateFromFocus())),this._register(this._editor.onDidBlurEditorText(()=>this._updateFromFocus())),this._register(this._editor.onDidChangeModel(()=>this._updateFromModel())),this._register(this._editor.onDidChangeConfiguration(()=>this._updateFromModel())),this._updateFromConfig(),this._updateFromSelection(),this._updateFromFocus(),this._updateFromModel(),this._editorSimpleInput.set(this._editor.isSimpleWidget)}_updateFromConfig(){const H=this._editor.getOptions();this._editorTabMovesFocus.set(H.get(123)),this._editorReadonly.set(H.get(75)),this._inDiffEditor.set(H.get(49)),this._editorColumnSelection.set(H.get(15))}_updateFromSelection(){const H=this._editor.getSelections();H?(this._hasMultipleSelections.set(H.length>1),this._hasNonEmptySelection.set(H.some($=>!$.isEmpty()))):(this._hasMultipleSelections.reset(),this._hasNonEmptySelection.reset())}_updateFromFocus(){this._editorFocus.set(this._editor.hasWidgetFocus()&&!this._editor.isSimpleWidget),this._editorTextFocus.set(this._editor.hasTextFocus()&&!this._editor.isSimpleWidget),this._textInputFocus.set(this._editor.hasTextFocus())}_updateFromModel(){const H=this._editor.getModel();this._canUndo.set(Boolean(H&&H.canUndo())),this._canRedo.set(Boolean(H&&H.canRedo()))}}class ee extends S.Disposable{constructor(H,$){super();this._editor=H,this._contextKeyService=$,this._langId=h.EditorContextKeys.languageId.bindTo($),this._hasCompletionItemProvider=h.EditorContextKeys.hasCompletionItemProvider.bindTo($),this._hasCodeActionsProvider=h.EditorContextKeys.hasCodeActionsProvider.bindTo($),this._hasCodeLensProvider=h.EditorContextKeys.hasCodeLensProvider.bindTo($),this._hasDefinitionProvider=h.EditorContextKeys.hasDefinitionProvider.bindTo($),this._hasDeclarationProvider=h.EditorContextKeys.hasDeclarationProvider.bindTo($),this._hasImplementationProvider=h.EditorContextKeys.hasImplementationProvider.bindTo($),this._hasTypeDefinitionProvider=h.EditorContextKeys.hasTypeDefinitionProvider.bindTo($),this._hasHoverProvider=h.EditorContextKeys.hasHoverProvider.bindTo($),this._hasDocumentHighlightProvider=h.EditorContextKeys.hasDocumentHighlightProvider.bindTo($),this._hasDocumentSymbolProvider=h.EditorContextKeys.hasDocumentSymbolProvider.bindTo($),this._hasReferenceProvider=h.EditorContextKeys.hasReferenceProvider.bindTo($),this._hasRenameProvider=h.EditorContextKeys.hasRenameProvider.bindTo($),this._hasSignatureHelpProvider=h.EditorContextKeys.hasSignatureHelpProvider.bindTo($),this._hasInlineHintsProvider=h.EditorContextKeys.hasInlineHintsProvider.bindTo($),this._hasDocumentFormattingProvider=h.EditorContextKeys.hasDocumentFormattingProvider.bindTo($),this._hasDocumentSelectionFormattingProvider=h.EditorContextKeys.hasDocumentSelectionFormattingProvider.bindTo($),this._hasMultipleDocumentFormattingProvider=h.EditorContextKeys.hasMultipleDocumentFormattingProvider.bindTo($),this._hasMultipleDocumentSelectionFormattingProvider=h.EditorContextKeys.hasMultipleDocumentSelectionFormattingProvider.bindTo($),this._isInWalkThrough=h.EditorContextKeys.isInWalkThroughSnippet.bindTo($);const ie=()=>this._update();this._register(H.onDidChangeModel(ie)),this._register(H.onDidChangeModelLanguage(ie)),this._register(m.CompletionProviderRegistry.onDidChange(ie)),this._register(m.CodeActionProviderRegistry.onDidChange(ie)),this._register(m.CodeLensProviderRegistry.onDidChange(ie)),this._register(m.DefinitionProviderRegistry.onDidChange(ie)),this._register(m.DeclarationProviderRegistry.onDidChange(ie)),this._register(m.ImplementationProviderRegistry.onDidChange(ie)),this._register(m.TypeDefinitionProviderRegistry.onDidChange(ie)),this._register(m.HoverProviderRegistry.onDidChange(ie)),this._register(m.DocumentHighlightProviderRegistry.onDidChange(ie)),this._register(m.DocumentSymbolProviderRegistry.onDidChange(ie)),this._register(m.ReferenceProviderRegistry.onDidChange(ie)),this._register(m.RenameProviderRegistry.onDidChange(ie)),this._register(m.DocumentFormattingEditProviderRegistry.onDidChange(ie)),this._register(m.DocumentRangeFormattingEditProviderRegistry.onDidChange(ie)),this._register(m.SignatureHelpProviderRegistry.onDidChange(ie)),this._register(m.InlineHintsProviderRegistry.onDidChange(ie)),ie()}dispose(){super.dispose()}reset(){this._contextKeyService.bufferChangeEvents(()=>{this._langId.reset(),this._hasCompletionItemProvider.reset(),this._hasCodeActionsProvider.reset(),this._hasCodeLensProvider.reset(),this._hasDefinitionProvider.reset(),this._hasDeclarationProvider.reset(),this._hasImplementationProvider.reset(),this._hasTypeDefinitionProvider.reset(),this._hasHoverProvider.reset(),this._hasDocumentHighlightProvider.reset(),this._hasDocumentSymbolProvider.reset(),this._hasReferenceProvider.reset(),this._hasRenameProvider.reset(),this._hasDocumentFormattingProvider.reset(),this._hasDocumentSelectionFormattingProvider.reset(),this._hasSignatureHelpProvider.reset(),this._isInWalkThrough.reset()})}_update(){const H=this._editor.getModel();if(!H){this.reset();return}this._contextKeyService.bufferChangeEvents(()=>{this._langId.set(H.getLanguageIdentifier().language),this._hasCompletionItemProvider.set(m.CompletionProviderRegistry.has(H)),this._hasCodeActionsProvider.set(m.CodeActionProviderRegistry.has(H)),this._hasCodeLensProvider.set(m.CodeLensProviderRegistry.has(H)),this._hasDefinitionProvider.set(m.DefinitionProviderRegistry.has(H)),this._hasDeclarationProvider.set(m.DeclarationProviderRegistry.has(H)),this._hasImplementationProvider.set(m.ImplementationProviderRegistry.has(H)),this._hasTypeDefinitionProvider.set(m.TypeDefinitionProviderRegistry.has(H)),this._hasHoverProvider.set(m.HoverProviderRegistry.has(H)),this._hasDocumentHighlightProvider.set(m.DocumentHighlightProviderRegistry.has(H)),this._hasDocumentSymbolProvider.set(m.DocumentSymbolProviderRegistry.has(H)),this._hasReferenceProvider.set(m.ReferenceProviderRegistry.has(H)),this._hasRenameProvider.set(m.RenameProviderRegistry.has(H)),this._hasSignatureHelpProvider.set(m.SignatureHelpProviderRegistry.has(H)),this._hasInlineHintsProvider.set(m.InlineHintsProviderRegistry.has(H)),this._hasDocumentFormattingProvider.set(m.DocumentFormattingEditProviderRegistry.has(H)||m.DocumentRangeFormattingEditProviderRegistry.has(H)),this._hasDocumentSelectionFormattingProvider.set(m.DocumentRangeFormattingEditProviderRegistry.has(H)),this._hasMultipleDocumentFormattingProvider.set(m.DocumentFormattingEditProviderRegistry.all(H).length+m.DocumentRangeFormattingEditProviderRegistry.all(H).length>1),this._hasMultipleDocumentSelectionFormattingProvider.set(m.DocumentRangeFormattingEditProviderRegistry.all(H).length>1),this._isInWalkThrough.set(H.uri.scheme===C.Schemas.walkThroughSnippet)})}}e.EditorModeContext=ee;class se extends S.Disposable{constructor(H){super();this._onChange=this._register(new w.Emitter),this.onChange=this._onChange.event,this._hasFocus=!1,this._domFocusTracker=this._register(N.trackFocus(H)),this._register(this._domFocusTracker.onDidFocus(()=>{this._hasFocus=!0,this._onChange.fire(void 0)})),this._register(this._domFocusTracker.onDidBlur(()=>{this._hasFocus=!1,this._onChange.fire(void 0)}))}hasFocus(){return this._hasFocus}}const ne=encodeURIComponent("");function X(U){return ne+encodeURIComponent(U.toString())+le}const z=encodeURIComponent('');function V(U){return z+encodeURIComponent(U.toString())+P}T.registerThemingParticipant((U,H)=>{const $=U.getColor(f.editorErrorBorder);$&&H.addRule(`.monaco-editor .squiggly-error { border-bottom: 4px double ${$}; }`);const ie=U.getColor(f.editorErrorForeground);ie&&H.addRule(`.monaco-editor .squiggly-error { background: url("data:image/svg+xml,${X(ie)}") repeat-x bottom left; }`);const oe=U.getColor(f.editorErrorBackground);oe&&H.addRule(`.monaco-editor .squiggly-error::before { display: block; content: ''; width: 100%; height: 100%; background: ${oe}; }`);const ae=U.getColor(f.editorWarningBorder);ae&&H.addRule(`.monaco-editor .squiggly-warning { border-bottom: 4px double ${ae}; }`);const G=U.getColor(f.editorWarningForeground);G&&H.addRule(`.monaco-editor .squiggly-warning { background: url("data:image/svg+xml,${X(G)}") repeat-x bottom left; }`);const j=U.getColor(f.editorWarningBackground);j&&H.addRule(`.monaco-editor .squiggly-warning::before { display: block; content: ''; width: 100%; height: 100%; background: ${j}; }`);const te=U.getColor(f.editorInfoBorder);te&&H.addRule(`.monaco-editor .squiggly-info { border-bottom: 4px double ${te}; }`);const Z=U.getColor(f.editorInfoForeground);Z&&H.addRule(`.monaco-editor .squiggly-info { background: url("data:image/svg+xml,${X(Z)}") repeat-x bottom left; }`);const ue=U.getColor(f.editorInfoBackground);ue&&H.addRule(`.monaco-editor .squiggly-info::before { display: block; content: ''; width: 100%; height: 100%; background: ${ue}; }`);const he=U.getColor(f.editorHintBorder);he&&H.addRule(`.monaco-editor .squiggly-hint { border-bottom: 2px dotted ${he}; }`);const re=U.getColor(f.editorHintForeground);re&&H.addRule(`.monaco-editor .squiggly-hint { background: url("data:image/svg+xml,${V(re)}") no-repeat bottom left; }`);const ce=U.getColor(_.editorUnnecessaryCodeOpacity);ce&&H.addRule(`.monaco-editor.showUnused .squiggly-inline-unnecessary { opacity: ${ce.rgba.a}; }`);const me=U.getColor(_.editorUnnecessaryCodeBorder);me&&H.addRule(`.monaco-editor.showUnused .squiggly-unnecessary { border-bottom: 2px dashed ${me}; }`);const Ce=U.getColor(f.editorForeground)||"inherit";H.addRule(`.monaco-editor.showDeprecated .squiggly-inline-deprecated { text-decoration: line-through; text-decoration-color: ${Ce}}`)})}),define(Q[144],J([0,1,40,28,143,26,16,9,32,11,65]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.EmbeddedCodeEditorWidget=void 0;let c=class extends M.CodeEditorWidget{constructor(s,a,u,r,i,n,t,l,h,m){super(s,Object.assign(Object.assign({},u.getRawOptions()),{overflowWidgetsDomNode:u.getOverflowWidgetsDomNode()}),{},r,i,n,t,l,h,m);this._parentEditor=u,this._overwriteOptions=a,super.updateOptions(this._overwriteOptions),this._register(u.onDidChangeConfiguration(_=>this._onParentConfigurationChanged(_)))}getParentEditor(){return this._parentEditor}_onParentConfigurationChanged(s){super.updateOptions(this._parentEditor.getRawOptions()),super.updateOptions(this._overwriteOptions)}updateOptions(s){b.mixin(this._overwriteOptions,s,!0),super.updateOptions(this._overwriteOptions)}};c=Me([_e(3,C.IInstantiationService),_e(4,N.ICodeEditorService),_e(5,w.ICommandService),_e(6,S.IContextKeyService),_e(7,g.IThemeService),_e(8,d.INotificationService),_e(9,p.IAccessibilityService)],c),e.EmbeddedCodeEditorWidget=c}),define(Q[611],J([0,1,13,461,25,21,39,16,73,47,335]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectionAnchorSet=void 0,e.SelectionAnchorSet=new C.RawContextKey("selectionAnchorSet",!1);let p=class Ft{constructor(r,i){this.editor=r,this.selectionAnchorSetContextKey=e.SelectionAnchorSet.bindTo(i),this.modelChangeListener=r.onDidChangeModel(()=>this.selectionAnchorSetContextKey.reset())}static get(r){return r.getContribution(Ft.ID)}setSelectionAnchor(){if(this.editor.hasModel()){const r=this.editor.getPosition(),i=this.decorationId?[this.decorationId]:[],n=this.editor.deltaDecorations(i,[{range:w.Selection.fromPositions(r,r),options:{stickiness:1,hoverMessage:new d.MarkdownString().appendText(N.localize(0,null)),className:"selection-anchor"}}]);this.decorationId=n[0],this.selectionAnchorSetContextKey.set(!!this.decorationId),g.alert(N.localize(1,null,r.lineNumber,r.column))}}goToSelectionAnchor(){if(this.editor.hasModel()&&this.decorationId){const r=this.editor.getModel().getDecorationRange(this.decorationId);r&&this.editor.setPosition(r.getStartPosition())}}selectFromAnchorToCursor(){if(this.editor.hasModel()&&this.decorationId){const r=this.editor.getModel().getDecorationRange(this.decorationId);if(r){const i=this.editor.getPosition();this.editor.setSelection(w.Selection.fromPositions(r.getStartPosition(),i)),this.cancelSelectionAnchor()}}}cancelSelectionAnchor(){this.decorationId&&(this.editor.deltaDecorations([this.decorationId],[]),this.decorationId=void 0,this.selectionAnchorSetContextKey.set(!1))}dispose(){this.cancelSelectionAnchor(),this.modelChangeListener.dispose()}};p.ID="editor.contrib.selectionAnchorController",p=Me([_e(1,C.IContextKeyService)],p);class c extends b.EditorAction{constructor(){super({id:"editor.action.setSelectionAnchor",label:N.localize(2,null),alias:"Set Selection Anchor",precondition:void 0,kbOpts:{kbExpr:M.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|32),weight:100}})}run(r,i){return Ie(this,void 0,void 0,function*(){p.get(i).setSelectionAnchor()})}}class o extends b.EditorAction{constructor(){super({id:"editor.action.goToSelectionAnchor",label:N.localize(3,null),alias:"Go to Selection Anchor",precondition:e.SelectionAnchorSet})}run(r,i){return Ie(this,void 0,void 0,function*(){p.get(i).goToSelectionAnchor()})}}class s extends b.EditorAction{constructor(){super({id:"editor.action.selectFromAnchorToCursor",label:N.localize(4,null),alias:"Select from Anchor to Cursor",precondition:e.SelectionAnchorSet,kbOpts:{kbExpr:M.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|41),weight:100}})}run(r,i){return Ie(this,void 0,void 0,function*(){p.get(i).selectFromAnchorToCursor()})}}class a extends b.EditorAction{constructor(){super({id:"editor.action.cancelSelectionAnchor",label:N.localize(5,null),alias:"Cancel Selection Anchor",precondition:e.SelectionAnchorSet,kbOpts:{kbExpr:M.EditorContextKeys.editorTextFocus,primary:9,weight:100}})}run(r,i){return Ie(this,void 0,void 0,function*(){p.get(i).cancelSelectionAnchor()})}}b.registerEditorContribution(p.ID,p),b.registerEditorAction(c),b.registerEditorAction(o),b.registerEditorAction(s),b.registerEditorAction(a)}),define(Q[612],J([0,1,462,15,2,13,14,3,21,25,53,31,49,22,11,34,336]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BracketMatchingController=void 0;const r=s.registerColor("editorOverviewRuler.bracketMatchForeground",{dark:"#A0A0A0",light:"#A0A0A0",hc:"#A0A0A0"},b.localize(0,null));class i extends w.EditorAction{constructor(){super({id:"editor.action.jumpToBracket",label:b.localize(1,null),alias:"Go to Bracket",precondition:void 0,kbOpts:{kbExpr:g.EditorContextKeys.editorTextFocus,primary:2048|1024|88,weight:100}})}run(m,_){let f=l.get(_);!f||f.jumpToBracket()}}class n extends w.EditorAction{constructor(){super({id:"editor.action.selectToBracket",label:b.localize(2,null),alias:"Select to Bracket",precondition:void 0,description:{description:"Select to Bracket",args:[{name:"args",schema:{type:"object",properties:{selectBrackets:{type:"boolean",default:!0}}}}]}})}run(m,_,f){const v=l.get(_);if(!!v){let y=!0;f&&f.selectBrackets===!1&&(y=!1),v.selectToBracket(y)}}}class t{constructor(m,_,f){this.position=m,this.brackets=_,this.options=f}}class l extends M.Disposable{constructor(m){super();this._editor=m,this._lastBracketsData=[],this._lastVersionId=0,this._decorations=[],this._updateBracketsSoon=this._register(new N.RunOnceScheduler(()=>this._updateBrackets(),50)),this._matchBrackets=this._editor.getOption(58),this._updateBracketsSoon.schedule(),this._register(m.onDidChangeCursorPosition(_=>{this._matchBrackets!=="never"&&this._updateBracketsSoon.schedule()})),this._register(m.onDidChangeModelContent(_=>{this._updateBracketsSoon.schedule()})),this._register(m.onDidChangeModel(_=>{this._lastBracketsData=[],this._decorations=[],this._updateBracketsSoon.schedule()})),this._register(m.onDidChangeModelLanguageConfiguration(_=>{this._lastBracketsData=[],this._updateBracketsSoon.schedule()})),this._register(m.onDidChangeConfiguration(_=>{_.hasChanged(58)&&(this._matchBrackets=this._editor.getOption(58),this._decorations=this._editor.deltaDecorations(this._decorations,[]),this._lastBracketsData=[],this._lastVersionId=0,this._updateBracketsSoon.schedule())}))}static get(m){return m.getContribution(l.ID)}jumpToBracket(){if(!!this._editor.hasModel()){const m=this._editor.getModel(),_=this._editor.getSelections().map(f=>{const v=f.getStartPosition(),y=m.matchBracket(v);let L=null;if(y)y[0].containsPosition(v)?L=y[1].getStartPosition():y[1].containsPosition(v)&&(L=y[0].getStartPosition());else{const I=m.findEnclosingBrackets(v);if(I)L=I[0].getStartPosition();else{const k=m.findNextBracket(v);k&&k.range&&(L=k.range.getStartPosition())}}return L?new d.Selection(L.lineNumber,L.column,L.lineNumber,L.column):new d.Selection(v.lineNumber,v.column,v.lineNumber,v.column)});this._editor.setSelections(_),this._editor.revealRange(_[0])}}selectToBracket(m){if(!!this._editor.hasModel()){const _=this._editor.getModel(),f=[];this._editor.getSelections().forEach(v=>{const y=v.getStartPosition();let L=_.matchBracket(y);if(!L&&(L=_.findEnclosingBrackets(y),!L)){const E=_.findNextBracket(y);E&&E.range&&(L=_.matchBracket(E.range.getStartPosition()))}let I=null,k=null;if(L){L.sort(C.Range.compareRangesUsingStarts);const[E,T]=L;I=m?E.getStartPosition():E.getEndPosition(),k=m?T.getEndPosition():T.getStartPosition()}I&&k&&f.push(new d.Selection(I.lineNumber,I.column,k.lineNumber,k.column))}),f.length>0&&(this._editor.setSelections(f),this._editor.revealRange(f[0]))}}_updateBrackets(){if(this._matchBrackets!=="never"){this._recomputeBrackets();let m=[],_=0;for(const f of this._lastBracketsData){let v=f.brackets;v&&(m[_++]={range:v[0],options:f.options},m[_++]={range:v[1],options:f.options})}this._decorations=this._editor.deltaDecorations(this._decorations,m)}}_recomputeBrackets(){if(!this._editor.hasModel()){this._lastBracketsData=[],this._lastVersionId=0;return}const m=this._editor.getSelections();if(m.length>100){this._lastBracketsData=[],this._lastVersionId=0;return}const _=this._editor.getModel(),f=_.getVersionId();let v=[];this._lastVersionId===f&&(v=this._lastBracketsData);let y=[],L=0;for(let O=0,A=m.length;O1&&y.sort(S.Position.compare);let I=[],k=0,E=0,T=v.length;for(let O=0,A=y.length;O{const _=h.getColor(o.editorBracketMatchBackground);_&&m.addRule(`.monaco-editor .bracket-match { background-color: ${_}; }`);const f=h.getColor(o.editorBracketMatchBorder);f&&m.addRule(`.monaco-editor .bracket-match { border: 1px solid ${f}; }`)}),u.MenuRegistry.appendMenuItem(u.MenuId.MenubarGoMenu,{group:"5_infile_nav",command:{id:"editor.action.jumpToBracket",title:b.localize(3,null)},order:2})}),define(Q[613],J([0,1,463,13,25,399]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class S extends N.EditorAction{constructor(p,c){super(c);this.left=p}run(p,c){if(!!c.hasModel()){let o=[],s=c.getSelections();for(const a of s)o.push(new w.MoveCaretCommand(a,this.left));c.pushUndoStop(),c.executeCommands(this.id,o),c.pushUndoStop()}}}class C extends S{constructor(){super(!0,{id:"editor.action.moveCarretLeftAction",label:b.localize(0,null),alias:"Move Selected Text Left",precondition:M.EditorContextKeys.writable})}}class d extends S{constructor(){super(!1,{id:"editor.action.moveCarretRightAction",label:b.localize(1,null),alias:"Move Selected Text Right",precondition:M.EditorContextKeys.writable})}}N.registerEditorAction(C),N.registerEditorAction(d)}),define(Q[614],J([0,1,464,13,92,3,25,180]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class d extends N.EditorAction{constructor(){super({id:"editor.action.transposeLetters",label:b.localize(0,null),alias:"Transpose Letters",precondition:S.EditorContextKeys.writable,kbOpts:{kbExpr:S.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|50},weight:100}})}run(p,c){if(!!c.hasModel()){let o=c.getModel(),s=[],a=c.getSelections();for(let u of a)if(!!u.isEmpty()){let r=u.startLineNumber,i=u.startColumn,n=o.getLineMaxColumn(r);if(!(r===1&&(i===1||i===2&&n===2))){let t=i===n?u.getPosition():C.MoveOperations.rightPosition(o,u.getPosition().lineNumber,u.getPosition().column),l=C.MoveOperations.leftPosition(o,t.lineNumber,t.column),h=C.MoveOperations.leftPosition(o,l.lineNumber,l.column),m=o.getValueInRange(w.Range.fromPositions(h,l)),_=o.getValueInRange(w.Range.fromPositions(l,t)),f=w.Range.fromPositions(h,t);s.push(new M.ReplaceCommand(f,_+m))}}s.length>0&&(c.pushUndoStop(),c.executeCommands(this.id,s),c.pushUndoStop())}}}N.registerEditorAction(d)}),define(Q[615],J([0,1,465,35,17,164,13,28,25,34,84]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PasteAction=e.CopyAction=e.CutAction=void 0;const c="9_cutcopypaste",o=M.isNative||document.queryCommandSupported("cut"),s=M.isNative||document.queryCommandSupported("copy"),a=typeof navigator.clipboard=="undefined"||N.isFirefox?document.queryCommandSupported("paste"):!0;function u(n){return n.register(),n}e.CutAction=o?u(new S.MultiCommand({id:"editor.action.clipboardCutAction",precondition:void 0,kbOpts:M.isNative?{primary:2048|54,win:{primary:2048|54,secondary:[1024|20]},weight:100}:void 0,menuOpts:[{menuId:g.MenuId.MenubarEditMenu,group:"2_ccp",title:b.localize(0,null),order:1},{menuId:g.MenuId.EditorContext,group:c,title:b.localize(1,null),when:d.EditorContextKeys.writable,order:1},{menuId:g.MenuId.CommandPalette,group:"",title:b.localize(2,null),order:1}]})):void 0,e.CopyAction=s?u(new S.MultiCommand({id:"editor.action.clipboardCopyAction",precondition:void 0,kbOpts:M.isNative?{primary:2048|33,win:{primary:2048|33,secondary:[2048|19]},weight:100}:void 0,menuOpts:[{menuId:g.MenuId.MenubarEditMenu,group:"2_ccp",title:b.localize(3,null),order:2},{menuId:g.MenuId.EditorContext,group:c,title:b.localize(4,null),order:2},{menuId:g.MenuId.CommandPalette,group:"",title:b.localize(5,null),order:1}]})):void 0,e.PasteAction=a?u(new S.MultiCommand({id:"editor.action.clipboardPasteAction",precondition:void 0,kbOpts:M.isNative?{primary:2048|52,win:{primary:2048|52,secondary:[1024|19]},linux:{primary:2048|52,secondary:[1024|19]},weight:100}:void 0,menuOpts:[{menuId:g.MenuId.MenubarEditMenu,group:"2_ccp",title:b.localize(6,null),order:3},{menuId:g.MenuId.EditorContext,group:c,title:b.localize(7,null),when:d.EditorContextKeys.writable,order:3},{menuId:g.MenuId.CommandPalette,group:"",title:b.localize(8,null),order:1}]})):void 0;class r extends S.EditorAction{constructor(){super({id:"editor.action.clipboardCopyWithSyntaxHighlightingAction",label:b.localize(9,null),alias:"Copy With Syntax Highlighting",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.textInputFocus,primary:0,weight:100}})}run(t,l){!l.hasModel()||!l.getOption(28)&&l.getSelection().isEmpty()||(w.CopyOptions.forceCopyWithSyntaxHighlighting=!0,l.focus(),document.execCommand("copy"),w.CopyOptions.forceCopyWithSyntaxHighlighting=!1)}}function i(n,t){!n||(n.addImplementation(1e4,(l,h)=>{const m=l.get(C.ICodeEditorService).getFocusedCodeEditor();if(m&&m.hasTextFocus()){const _=m.getOption(28),f=m.getSelection();return f&&f.isEmpty()&&!_||document.execCommand(t),!0}return!1}),n.addImplementation(0,(l,h)=>(document.execCommand(t),!0)))}i(e.CutAction,"cut"),i(e.CopyAction,"copy"),e.PasteAction&&(e.PasteAction.addImplementation(1e4,(n,t)=>{const l=n.get(C.ICodeEditorService),h=n.get(p.IClipboardService),m=l.getFocusedCodeEditor();return m&&m.hasTextFocus()?(!document.execCommand("paste")&&M.isWeb&&(()=>Ie(void 0,void 0,void 0,function*(){const f=yield h.readText();if(f!==""){const v=w.InMemoryClipboardMetadataManager.INSTANCE.get(f);let y=!1,L=null,I=null;v&&(y=m.getOption(28)&&!!v.isFromEmptySelection,L=typeof v.multicursorText!="undefined"?v.multicursorText:null,I=v.mode),m.trigger("keyboard","paste",{text:f,pasteOnNewLine:y,multicursorText:L,mode:I})}}))(),!0):!1}),e.PasteAction.addImplementation(0,(n,t)=>(document.execCommand("paste"),!0))),s&&S.registerEditorAction(r)}),define(Q[145],J([0,1,19,23,12,2,24,70,3,21,18,36,130,59,26]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getCodeActions=e.CodeActionItem=e.fixAllCommandId=e.organizeImportsCommandId=e.sourceActionCommandId=e.refactorCommandId=e.codeActionCommandId=void 0,e.codeActionCommandId="editor.action.codeAction",e.refactorCommandId="editor.action.refactor",e.sourceActionCommandId="editor.action.sourceAction",e.organizeImportsCommandId="editor.action.organizeImports",e.fixAllCommandId="editor.action.fixAll";class u{constructor(m,_){this.action=m,this.provider=_}resolve(m){var _;return Ie(this,void 0,void 0,function*(){if(((_=this.provider)===null||_===void 0?void 0:_.resolveCodeAction)&&!this.action.edit){let f;try{f=yield this.provider.resolveCodeAction(this.action,m)}catch(v){M.onUnexpectedExternalError(v)}f&&(this.action.edit=f.edit)}return this})}}e.CodeActionItem=u;class r extends w.Disposable{constructor(m,_,f){super();this.documentation=_,this._register(f),this.allActions=b.mergeSort([...m],r.codeActionsComparator),this.validActions=this.allActions.filter(({action:v})=>!v.disabled)}static codeActionsComparator({action:m},{action:_}){return m.isPreferred&&!_.isPreferred?-1:!m.isPreferred&&_.isPreferred?1:b.isNonEmptyArray(m.diagnostics)?b.isNonEmptyArray(_.diagnostics)?m.diagnostics[0].message.localeCompare(_.diagnostics[0].message):-1:b.isNonEmptyArray(_.diagnostics)?1:0}get hasAutoFix(){return this.validActions.some(({action:m})=>!!m.kind&&o.CodeActionKind.QuickFix.contains(new o.CodeActionKind(m.kind))&&!!m.isPreferred)}}const i={actions:[],documentation:void 0};function n(h,m,_,f,v){var y;const L=_.filter||{},I={only:(y=L.include)===null||y===void 0?void 0:y.value,trigger:_.type},k=new C.TextModelCancellationTokenSource(h,v),E=t(h,L),T=new w.DisposableStore,O=E.map(B=>Ie(this,void 0,void 0,function*(){try{f.report(B);const F=yield B.provideCodeActions(h,m,I,k.token);if(F&&T.add(F),k.token.isCancellationRequested)return i;const D=((F==null?void 0:F.actions)||[]).filter(W=>W&&o.filtersAction(L,W)),R=l(B,D,L.include);return{actions:D.map(W=>new u(W,B)),documentation:R}}catch(F){if(M.isPromiseCanceledError(F))throw F;return M.onUnexpectedExternalError(F),i}})),A=p.CodeActionProviderRegistry.onDidChange(()=>{const B=p.CodeActionProviderRegistry.all(h);b.equals(B,E)||k.cancel()});return Promise.all(O).then(B=>{const F=b.flatten(B.map(R=>R.actions)),D=b.coalesce(B.map(R=>R.documentation));return new r(F,D,T)}).finally(()=>{A.dispose(),k.dispose()})}e.getCodeActions=n;function t(h,m){return p.CodeActionProviderRegistry.all(h).filter(_=>_.providedCodeActionKinds?_.providedCodeActionKinds.some(f=>o.mayIncludeActionsOfKind(m,new o.CodeActionKind(f))):!0)}function l(h,m,_){if(!!h.documentation){const f=h.documentation.map(v=>({kind:new o.CodeActionKind(v.kind),command:v.command}));if(_){let v;for(const y of f)y.kind.contains(_)&&(v?v.kind.contains(y.kind)&&(v=y):v=y);if(v)return v==null?void 0:v.command}for(const v of m)if(!!v.kind){for(const y of f)if(y.kind.contains(new o.CodeActionKind(v.kind)))return y.command}}}a.CommandsRegistry.registerCommand("_executeCodeActionProvider",function(h,m,_,f,v){return Ie(this,void 0,void 0,function*(){if(!(m instanceof S.URI))throw M.illegalArgument();const y=h.get(c.IModelService).getModel(m);if(!y)throw M.illegalArgument();const L=g.Selection.isISelection(_)?g.Selection.liftSelection(_):d.Range.isIRange(_)?y.validateRange(_):void 0;if(!L)throw M.illegalArgument();const I=typeof f=="string"?new o.CodeActionKind(f):void 0,k=yield n(y,L,{type:2,filter:{includeSourceActions:!0,include:I}},s.Progress.None,N.CancellationToken.None),E=[],T=Math.min(k.validActions.length,typeof v=="number"?v:0);for(let O=0;OO.action)}finally{setTimeout(()=>k.dispose(),100)}})})}),define(Q[616],J([0,1,7,48,12,150,2,14,18,145,130,68,37]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionKeybindingResolver=e.CodeActionMenu=void 0;class s extends N.Action{constructor(n,t){super(n.command?n.command.id:n.title,a(n.title),void 0,!n.disabled,t);this.action=n}}function a(i){return i.replace(/\r\n|\r|\n/g," ")}let u=class extends S.Disposable{constructor(n,t,l,h){super();this._editor=n,this._delegate=t,this._contextMenuService=l,this._visible=!1,this._showingActions=this._register(new S.MutableDisposable),this._keybindingResolver=new r({getKeybindings:()=>h.getKeybindings()})}get isVisible(){return this._visible}show(n,t,l,h){return Ie(this,void 0,void 0,function*(){const m=h.includeDisabledActions?t.allActions:t.validActions;if(!m.length){this._visible=!1;return}if(!this._editor.getDomNode())throw this._visible=!1,M.canceled();this._visible=!0,this._showingActions.value=t;const _=this.getMenuActions(n,m,t.documentation),f=C.Position.isIPosition(l)?this._toCoords(l):l||{x:0,y:0},v=this._keybindingResolver.getResolver();this._contextMenuService.showContextMenu({domForShadowRoot:this._editor.getDomNode(),getAnchor:()=>f,getActions:()=>_,onHide:()=>{this._visible=!1,this._editor.focus()},autoSelectFirstItem:!0,getKeyBinding:y=>y instanceof s?v(y.action):void 0})})}getMenuActions(n,t,l){var h,m;const _=L=>new s(L.action,()=>this._delegate.onSelectCodeAction(L)),f=t.map(_),v=[...l],y=this._editor.getModel();if(y&&f.length)for(const L of d.CodeActionProviderRegistry.all(y))L._getAdditionalMenuItems&&v.push(...L._getAdditionalMenuItems({trigger:n.type,only:(m=(h=n.filter)===null||h===void 0?void 0:h.include)===null||m===void 0?void 0:m.value},t.map(I=>I.action)));return v.length&&f.push(new N.Separator,...v.map(L=>_(new g.CodeActionItem({title:L.title,command:L},void 0)))),f}_toCoords(n){if(!this._editor.hasModel())return{x:0,y:0};this._editor.revealPosition(n,1),this._editor.render();const t=this._editor.getScrolledVisiblePosition(n),l=b.getDomNodePagePosition(this._editor.getDomNode()),h=l.left+t.left,m=l.top+t.top+t.height;return{x:h,y:m}}};u=Me([_e(2,c.IContextMenuService),_e(3,o.IKeybindingService)],u),e.CodeActionMenu=u;class r{constructor(n){this._keybindingProvider=n}getResolver(){const n=new w.Lazy(()=>this._keybindingProvider.getKeybindings().filter(t=>r.codeActionCommands.indexOf(t.command)>=0).filter(t=>t.resolvedKeybinding).map(t=>{let l=t.commandArgs;return t.command===g.organizeImportsCommandId?l={kind:p.CodeActionKind.SourceOrganizeImports.value}:t.command===g.fixAllCommandId&&(l={kind:p.CodeActionKind.SourceFixAll.value}),Object.assign({resolvedKeybinding:t.resolvedKeybinding},p.CodeActionCommandArgs.fromUser(l,{kind:p.CodeActionKind.None,apply:"never"}))}));return t=>{if(t.kind){const l=this.bestKeybindingForCodeAction(t,n.getValue());return l==null?void 0:l.resolvedKeybinding}}}bestKeybindingForCodeAction(n,t){if(!!n.kind){const l=new p.CodeActionKind(n.kind);return t.filter(h=>h.kind.contains(l)).filter(h=>h.preferred?n.isPreferred:!0).reduceRight((h,m)=>h?h.kind.contains(m.kind)?m:h:m,void 0)}}}e.CodeActionKeybindingResolver=r,r.codeActionCommands=[g.refactorCommandId,g.codeActionCommandId,g.sourceActionCommandId,g.organizeImportsCommandId,g.fixAllCommandId]});var tt=this&&this.__classPrivateFieldGet||function(q,e){if(!e.has(q))throw new TypeError("attempted to get private field on non-instance");return e.get(q)},_t=this&&this.__classPrivateFieldSet||function(q,e,b){if(!e.has(q))throw new TypeError("attempted to set private field on non-instance");return e.set(q,b),b};define(Q[617],J([0,1,15,12,6,2,44,3,18,16,59,145]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";var o;Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionModel=e.CodeActionsState=e.SUPPORTED_CODE_ACTIONS=void 0,e.SUPPORTED_CODE_ACTIONS=new g.RawContextKey("supportedCodeAction","");class s extends w.Disposable{constructor(n,t,l,h=250){super();this._editor=n,this._markerService=t,this._signalChange=l,this._delay=h,this._autoTriggerTimer=this._register(new b.TimeoutTimer),this._register(this._markerService.onMarkerChanged(m=>this._onMarkerChanges(m))),this._register(this._editor.onDidChangeCursorPosition(()=>this._onCursorChange()))}trigger(n){const t=this._getRangeOfSelectionUnlessWhitespaceEnclosed(n);return this._createEventAndSignalChange(n,t)}_onMarkerChanges(n){const t=this._editor.getModel();!t||n.some(l=>S.isEqual(l,t.uri))&&this._autoTriggerTimer.cancelAndSet(()=>{this.trigger({type:1})},this._delay)}_onCursorChange(){this._autoTriggerTimer.cancelAndSet(()=>{this.trigger({type:1})},this._delay)}_getRangeOfMarker(n){const t=this._editor.getModel();if(!!t)for(const l of this._markerService.read({resource:t.uri})){const h=t.validateRange(l);if(C.Range.intersectRanges(h,n))return C.Range.lift(h)}}_getRangeOfSelectionUnlessWhitespaceEnclosed(n){if(!!this._editor.hasModel()){const t=this._editor.getModel(),l=this._editor.getSelection();if(l.isEmpty()&&n.type===1){const{lineNumber:h,column:m}=l.getPosition(),_=t.getLineContent(h);if(_.length===0)return;if(m===1){if(/\s/.test(_[0]))return}else if(m===t.getLineMaxColumn(h)){if(/\s/.test(_[_.length-1]))return}else if(/\s/.test(_[m-2])&&/\s/.test(_[m-1]))return}return l}}_createEventAndSignalChange(n,t){const l=this._editor.getModel();if(!t||!l){this._signalChange(void 0);return}const h=this._getRangeOfMarker(t),m=h?h.getStartPosition():t.getStartPosition(),_={trigger:n,selection:t,position:m};return this._signalChange(_),_}}var a;(function(i){i.Empty={type:0};class n{constructor(l,h,m,_){this.trigger=l,this.rangeOrSelection=h,this.position=m,this._cancellablePromise=_,this.type=1,this.actions=_.catch(f=>{if(N.isPromiseCanceledError(f))return u;throw f})}cancel(){this._cancellablePromise.cancel()}}i.Triggered=n})(a=e.CodeActionsState||(e.CodeActionsState={}));const u={allActions:[],validActions:[],dispose:()=>{},documentation:[],hasAutoFix:!1};class r extends w.Disposable{constructor(n,t,l,h){super();this._editor=n,this._markerService=t,this._progressService=h,this._codeActionOracle=this._register(new w.MutableDisposable),this._state=a.Empty,this._onDidChangeState=this._register(new M.Emitter),this.onDidChangeState=this._onDidChangeState.event,o.set(this,!1),this._supportedCodeActions=e.SUPPORTED_CODE_ACTIONS.bindTo(l),this._register(this._editor.onDidChangeModel(()=>this._update())),this._register(this._editor.onDidChangeModelLanguage(()=>this._update())),this._register(d.CodeActionProviderRegistry.onDidChange(()=>this._update())),this._update()}dispose(){tt(this,o)||(_t(this,o,!0),super.dispose(),this.setState(a.Empty,!0))}_update(){if(!tt(this,o)){this._codeActionOracle.value=void 0,this.setState(a.Empty);const n=this._editor.getModel();if(n&&d.CodeActionProviderRegistry.has(n)&&!this._editor.getOption(75)){const t=[];for(const l of d.CodeActionProviderRegistry.all(n))Array.isArray(l.providedCodeActionKinds)&&t.push(...l.providedCodeActionKinds);this._supportedCodeActions.set(t.join(" ")),this._codeActionOracle.value=new s(this._editor,this._markerService,l=>{var h;if(!l){this.setState(a.Empty);return}const m=b.createCancelablePromise(_=>c.getCodeActions(n,l.selection,l.trigger,p.Progress.None,_));l.trigger.type===2&&((h=this._progressService)===null||h===void 0||h.showWhile(m,250)),this.setState(new a.Triggered(l.trigger,l.selection,l.position,m))},void 0),this._codeActionOracle.value.trigger({type:1})}else this._supportedCodeActions.reset()}}trigger(n){this._codeActionOracle.value&&this._codeActionOracle.value.trigger(n)}setState(n,t){n!==this._state&&(this._state.type===1&&this._state.cancel(),this._state=n,!t&&!tt(this,o)&&this._onDidChangeState.fire(n))}}e.CodeActionModel=r,o=new WeakMap}),define(Q[618],J([0,1,15,12,2,70,13,18,248,596,26,32,575,7,89,78,468,25,134]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CodeLensContribution=void 0;let t=class{constructor(h,m,_,f){this._editor=h,this._commandService=m,this._notificationService=_,this._codeLensCache=f,this._disposables=new M.DisposableStore,this._localToDispose=new M.DisposableStore,this._lenses=[],this._getCodeLensModelDelays=new n.LanguageFeatureRequestDelays(C.CodeLensProviderRegistry,250,2500),this._oldCodeLensModels=new M.DisposableStore,this._resolveCodeLensesDelays=new n.LanguageFeatureRequestDelays(C.CodeLensProviderRegistry,250,2500),this._resolveCodeLensesScheduler=new b.RunOnceScheduler(()=>this._resolveCodeLensesInViewport(),this._resolveCodeLensesDelays.min),this._disposables.add(this._editor.onDidChangeModel(()=>this._onModelChange())),this._disposables.add(this._editor.onDidChangeModelLanguage(()=>this._onModelChange())),this._disposables.add(this._editor.onDidChangeConfiguration(v=>{(v.hasChanged(38)||v.hasChanged(13)||v.hasChanged(12))&&this._updateLensStyle(),v.hasChanged(11)&&this._onModelChange()})),this._disposables.add(C.CodeLensProviderRegistry.onDidChange(this._onModelChange,this)),this._onModelChange(),this._styleClassName="_"+a.hash(this._editor.getId()).toString(16),this._styleElement=s.createStyleSheet(s.isInShadowDOM(this._editor.getContainerDomNode())?this._editor.getContainerDomNode():void 0),this._updateLensStyle()}dispose(){var h;this._localDispose(),this._disposables.dispose(),this._oldCodeLensModels.dispose(),(h=this._currentCodeLensModel)===null||h===void 0||h.dispose(),this._styleElement.remove()}_getLayoutInfo(){let h=this._editor.getOption(13),m;return!h||h<5?(h=this._editor.getOption(40)*.9|0,m=this._editor.getOption(53)):m=h*Math.max(1.3,this._editor.getOption(53)/this._editor.getOption(40))|0,{codeLensHeight:m,fontSize:h}}_updateLensStyle(){const{codeLensHeight:h,fontSize:m}=this._getLayoutInfo(),_=this._editor.getOption(12),f=this._editor.getOption(38),v=`--codelens-font-family${this._styleClassName}`;let y=` + .monaco-editor .codelens-decoration.${this._styleClassName} { line-height: ${h}px; font-size: ${m}px; padding-right: ${Math.round(m*.5)}px; font-feature-settings: ${f.fontFeatureSettings} } + .monaco-editor .codelens-decoration.${this._styleClassName} span.codicon { line-height: ${h}px; font-size: ${m}px; } + `;_&&(y+=`.monaco-editor .codelens-decoration.${this._styleClassName} { font-family: var(${v})}`),this._styleElement.textContent=y,this._editor.getContainerDomNode().style.setProperty(v,_!=null?_:"inherit"),this._editor.changeViewZones(L=>{for(let I of this._lenses)I.updateHeight(h,L)})}_localDispose(){var h,m,_;(h=this._getCodeLensModelPromise)===null||h===void 0||h.cancel(),this._getCodeLensModelPromise=void 0,(m=this._resolveCodeLensesPromise)===null||m===void 0||m.cancel(),this._resolveCodeLensesPromise=void 0,this._localToDispose.clear(),this._oldCodeLensModels.clear(),(_=this._currentCodeLensModel)===null||_===void 0||_.dispose()}_onModelChange(){this._localDispose();const h=this._editor.getModel();if(!!h&&!!this._editor.getOption(11)){const m=this._codeLensCache.get(h);if(m&&this._renderCodeLensSymbols(m),!C.CodeLensProviderRegistry.has(h)){m&&this._localToDispose.add(b.disposableTimeout(()=>{const f=this._codeLensCache.get(h);m===f&&(this._codeLensCache.delete(h),this._onModelChange())},30*1e3));return}for(const f of C.CodeLensProviderRegistry.all(h))if(typeof f.onDidChange=="function"){let v=f.onDidChange(()=>_.schedule());this._localToDispose.add(v)}const _=new b.RunOnceScheduler(()=>{var f;const v=Date.now();(f=this._getCodeLensModelPromise)===null||f===void 0||f.cancel(),this._getCodeLensModelPromise=b.createCancelablePromise(y=>d.getCodeLensModel(h,y)),this._getCodeLensModelPromise.then(y=>{this._currentCodeLensModel&&this._oldCodeLensModels.add(this._currentCodeLensModel),this._currentCodeLensModel=y,this._codeLensCache.put(h,y);const L=this._getCodeLensModelDelays.update(h,Date.now()-v);_.delay=L,this._renderCodeLensSymbols(y),this._resolveCodeLensesInViewport()},N.onUnexpectedError)},this._getCodeLensModelDelays.get(h));this._localToDispose.add(_),this._localToDispose.add(M.toDisposable(()=>this._resolveCodeLensesScheduler.cancel())),this._localToDispose.add(this._editor.onDidChangeModelContent(()=>{this._editor.changeDecorations(f=>{this._editor.changeViewZones(v=>{let y=[],L=-1;this._lenses.forEach(k=>{!k.isValid()||L===k.getLineNumber()?y.push(k):(k.update(v),L=k.getLineNumber())});let I=new g.CodeLensHelper;y.forEach(k=>{k.dispose(I,v),this._lenses.splice(this._lenses.indexOf(k),1)}),I.commit(f)})}),_.schedule()})),this._localToDispose.add(this._editor.onDidFocusEditorWidget(()=>{_.schedule()})),this._localToDispose.add(this._editor.onDidScrollChange(f=>{f.scrollTopChanged&&this._lenses.length>0&&this._resolveCodeLensesInViewportSoon()})),this._localToDispose.add(this._editor.onDidLayoutChange(()=>{this._resolveCodeLensesInViewportSoon()})),this._localToDispose.add(M.toDisposable(()=>{if(this._editor.getModel()){const f=w.StableEditorScrollState.capture(this._editor);this._editor.changeDecorations(v=>{this._editor.changeViewZones(y=>{this._disposeAllLenses(v,y)})}),f.restore(this._editor)}else this._disposeAllLenses(void 0,void 0)})),this._localToDispose.add(this._editor.onMouseDown(f=>{if(f.target.type===9){let v=f.target.element;if((v==null?void 0:v.tagName)==="SPAN"&&(v=v.parentElement),(v==null?void 0:v.tagName)==="A")for(const y of this._lenses){let L=y.getCommand(v);if(L){this._commandService.executeCommand(L.id,...L.arguments||[]).catch(I=>this._notificationService.error(I));break}}}})),_.schedule()}}_disposeAllLenses(h,m){const _=new g.CodeLensHelper;for(const f of this._lenses)f.dispose(_,m);h&&_.commit(h),this._lenses.length=0}_renderCodeLensSymbols(h){if(!!this._editor.hasModel()){let m=this._editor.getModel().getLineCount(),_=[],f;for(let L of h.lenses){let I=L.symbol.range.startLineNumber;I<1||I>m||(f&&f[f.length-1].symbol.range.startLineNumber===I?f.push(L):(f=[L],_.push(f)))}const v=w.StableEditorScrollState.capture(this._editor),y=this._getLayoutInfo();this._editor.changeDecorations(L=>{this._editor.changeViewZones(I=>{const k=new g.CodeLensHelper;let E=0,T=0;for(;T<_.length&&Ethis._resolveCodeLensesInViewportSoon())),E++,T++)}for(;Ethis._resolveCodeLensesInViewportSoon())),T++;k.commit(L)})}),v.restore(this._editor)}}_resolveCodeLensesInViewportSoon(){this._editor.getModel()&&this._resolveCodeLensesScheduler.schedule()}_resolveCodeLensesInViewport(){var h;(h=this._resolveCodeLensesPromise)===null||h===void 0||h.cancel(),this._resolveCodeLensesPromise=void 0;const m=this._editor.getModel();if(!!m){const _=[],f=[];if(this._lenses.forEach(L=>{const I=L.computeIfNecessary(m);I&&(_.push(I),f.push(L))}),_.length!==0){const v=Date.now(),y=b.createCancelablePromise(L=>{const I=_.map((k,E)=>{const T=new Array(k.length),O=k.map((A,B)=>!A.symbol.command&&typeof A.provider.resolveCodeLens=="function"?Promise.resolve(A.provider.resolveCodeLens(m,A.symbol,L)).then(F=>{T[B]=F},N.onUnexpectedExternalError):(T[B]=A.symbol,Promise.resolve(void 0)));return Promise.all(O).then(()=>{!L.isCancellationRequested&&!f[E].isDisposed()&&f[E].updateCommands(T)})});return Promise.all(I)});this._resolveCodeLensesPromise=y,this._resolveCodeLensesPromise.then(()=>{const L=this._resolveCodeLensesDelays.update(m,Date.now()-v);this._resolveCodeLensesScheduler.delay=L,this._currentCodeLensModel&&this._codeLensCache.put(m,this._currentCodeLensModel),this._oldCodeLensModels.clear(),y===this._resolveCodeLensesPromise&&(this._resolveCodeLensesPromise=void 0)},L=>{N.onUnexpectedError(L),y===this._resolveCodeLensesPromise&&(this._resolveCodeLensesPromise=void 0)})}}}getLenses(){return this._lenses}};t.ID="css.editor.codeLens",t=Me([_e(1,p.ICommandService),_e(2,c.INotificationService),_e(3,o.ICodeLensCache)],t),e.CodeLensContribution=t,S.registerEditorContribution(t.ID,t),S.registerEditorAction(class extends S.EditorAction{constructor(){super({id:"codelens.showLensesInCurrentLine",precondition:i.EditorContextKeys.hasCodeLensProvider,label:r.localize(0,null),alias:"Show CodeLens Commands For Current Line"})}run(h,m){return Ie(this,void 0,void 0,function*(){if(!!m.hasModel()){const _=h.get(u.IQuickInputService),f=h.get(p.ICommandService),v=h.get(c.INotificationService),y=m.getSelection().positionLineNumber,L=m.getContribution(t.ID),I=[];for(let E of L.getLenses())if(E.getLineNumber()===y)for(let T of E.getItems()){const{command:O}=T.symbol;O&&I.push({label:O.title,command:O})}if(I.length!==0){const k=yield _.pick(I,{canPickMany:!1});if(!!k)try{yield f.executeCommand(k.command.id,...k.command.arguments||[])}catch(E){v.error(E)}}}})}})}),define(Q[260],J([0,1,15,29,12,89,2,13,28,3,31,18,249,46]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorDetector=void 0;const a=500;let u=class Wt extends S.Disposable{constructor(i,n,t){super();this._editor=i,this._codeEditorService=n,this._configurationService=t,this._localToDispose=this._register(new S.DisposableStore),this._decorationsIds=[],this._colorDatas=new Map,this._colorDecoratorIds=[],this._decorationsTypes=new Set,this._register(i.onDidChangeModel(()=>{this._isEnabled=this.isEnabled(),this.onModelChanged()})),this._register(i.onDidChangeModelLanguage(()=>this.onModelChanged())),this._register(c.ColorProviderRegistry.onDidChange(()=>this.onModelChanged())),this._register(i.onDidChangeConfiguration(()=>{let l=this._isEnabled;this._isEnabled=this.isEnabled(),l!==this._isEnabled&&(this._isEnabled?this.onModelChanged():this.removeAllDecorations())})),this._timeoutTimer=null,this._computePromise=null,this._isEnabled=this.isEnabled(),this.onModelChanged()}isEnabled(){const i=this._editor.getModel();if(!i)return!1;const n=i.getLanguageIdentifier(),t=this._configurationService.getValue(n.language);if(t){const l=t.colorDecorators;if(l&&l.enable!==void 0&&!l.enable)return l.enable}return this._editor.getOption(14)}static get(i){return i.getContribution(this.ID)}dispose(){this.stop(),this.removeAllDecorations(),super.dispose()}onModelChanged(){if(this.stop(),!!this._isEnabled){const i=this._editor.getModel();!i||!c.ColorProviderRegistry.has(i)||(this._localToDispose.add(this._editor.onDidChangeModelContent(()=>{this._timeoutTimer||(this._timeoutTimer=new b.TimeoutTimer,this._timeoutTimer.cancelAndSet(()=>{this._timeoutTimer=null,this.beginCompute()},Wt.RECOMPUTE_TIME))})),this.beginCompute())}}beginCompute(){this._computePromise=b.createCancelablePromise(i=>{const n=this._editor.getModel();return n?o.getColors(n,i):Promise.resolve([])}),this._computePromise.then(i=>{this.updateDecorations(i),this.updateColorDecorators(i),this._computePromise=null},M.onUnexpectedError)}stop(){this._timeoutTimer&&(this._timeoutTimer.cancel(),this._timeoutTimer=null),this._computePromise&&(this._computePromise.cancel(),this._computePromise=null),this._localToDispose.clear()}updateDecorations(i){const n=i.map(t=>({range:{startLineNumber:t.colorInfo.range.startLineNumber,startColumn:t.colorInfo.range.startColumn,endLineNumber:t.colorInfo.range.endLineNumber,endColumn:t.colorInfo.range.endColumn},options:p.ModelDecorationOptions.EMPTY}));this._decorationsIds=this._editor.deltaDecorations(this._decorationsIds,n),this._colorDatas=new Map,this._decorationsIds.forEach((t,l)=>this._colorDatas.set(t,i[l]))}updateColorDecorators(i){let n=[],t={};for(let l=0;l{t[l]||this._codeEditorService.removeDecorationType(l)}),this._colorDecoratorIds=this._editor.deltaDecorations(this._colorDecoratorIds,n)}removeAllDecorations(){this._decorationsIds=this._editor.deltaDecorations(this._decorationsIds,[]),this._colorDecoratorIds=this._editor.deltaDecorations(this._colorDecoratorIds,[]),this._decorationsTypes.forEach(i=>{this._codeEditorService.removeDecorationType(i)})}getColorData(i){const n=this._editor.getModel();if(!n)return null;const t=n.getDecorationsInRange(g.Range.fromPositions(i,i)).filter(l=>this._colorDatas.has(l.id));return t.length===0?null:this._colorDatas.get(t[0].id)}};u.ID="editor.contrib.colorDetector",u.RECOMPUTE_TIME=1e3,u=Me([_e(1,d.ICodeEditorService),_e(2,s.IConfigurationService)],u),e.ColorDetector=u,C.registerEditorContribution(u.ID,u)}),define(Q[619],J([0,1,469,39,13,3,25,224,401,34]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class p extends M.EditorAction{constructor(r,i){super(i);this._type=r}run(r,i){if(!!i.hasModel()){const n=i.getModel(),t=[],l=n.getOptions(),h=i.getOption(16),m=i.getSelections().map((f,v)=>({selection:f,index:v,ignoreFirstLine:!1}));m.sort((f,v)=>w.Range.compareRangesUsingStarts(f.selection,v.selection));let _=m[0];for(let f=1;fthis._onContextMenu(m))),this._toDispose.add(this._editor.onMouseWheel(m=>{if(this._contextMenuIsBeingShownCount>0){const _=this._contextViewService.getContextViewElement(),f=m.srcElement;f.shadowRoot&&N.getShadowRoot(_)===f.shadowRoot||this._contextViewService.hideContextView()}})),this._toDispose.add(this._editor.onKeyDown(m=>{m.keyCode===58&&(m.preventDefault(),m.stopPropagation(),this.showContextMenu())}))}static get(r){return r.getContribution(Bt.ID)}_onContextMenu(r){if(!!this._editor.hasModel()){if(!this._editor.getOption(17)){this._editor.focus(),r.target.position&&!this._editor.getSelection().containsPosition(r.target.position)&&this._editor.setPosition(r.target.position);return}if(r.target.type!==12&&(r.event.preventDefault(),!(r.target.type!==6&&r.target.type!==7&&r.target.type!==1))){if(this._editor.focus(),r.target.position){let n=!1;for(const t of this._editor.getSelections())if(t.containsPosition(r.target.position)){n=!0;break}n||this._editor.setPosition(r.target.position)}let i=null;r.target.type!==1&&(i={x:r.event.posx-1,width:2,y:r.event.posy-1,height:2}),this.showContextMenu(i)}}}showContextMenu(r){if(!!this._editor.getOption(17)&&!!this._editor.hasModel()){if(!this._contextMenuService){this._editor.focus();return}const i=this._getMenuActions(this._editor.getModel(),d.MenuId.EditorContext);i.length>0&&this._doShowContextMenu(i,r)}}_getMenuActions(r,i){const n=[],t=this._menuService.createMenu(i,this._contextKeyService),l=t.getActions({arg:r.uri});t.dispose();for(let h of l){const[,m]=h;let _=0;for(const f of m)if(f instanceof d.SubmenuItemAction){const v=this._getMenuActions(r,f.item.submenu);v.length>0&&(n.push(new M.SubmenuAction(f.id,f.label,v)),_++)}else n.push(f),_++;_&&n.push(new M.Separator)}return n.length&&n.pop(),n}_doShowContextMenu(r,i=null){if(!!this._editor.hasModel()){const n=this._editor.getOption(48);if(this._editor.updateOptions({hover:{enabled:!1}}),!i){this._editor.revealPosition(this._editor.getPosition(),1),this._editor.render();const t=this._editor.getScrolledVisiblePosition(this._editor.getPosition()),l=N.getDomNodePagePosition(this._editor.getDomNode()),h=l.left+t.left,m=l.top+t.top+t.height;i={x:h,y:m}}this._contextMenuIsBeingShownCount++,this._contextMenuService.showContextMenu({domForShadowRoot:this._editor.getDomNode(),getAnchor:()=>i,getActions:()=>r,getActionViewItem:t=>{const l=this._keybindingFor(t);if(l)return new o.ActionViewItem(t,t,{label:!0,keybinding:l.getLabel(),isMenu:!0});const h=t;return typeof h.getActionViewItem=="function"?h.getActionViewItem():new o.ActionViewItem(t,t,{icon:!0,label:!0,isMenu:!0})},getKeyBinding:t=>this._keybindingFor(t),onHide:t=>{this._contextMenuIsBeingShownCount--,this._editor.focus(),this._editor.updateOptions({hover:n})}})}}_keybindingFor(r){return this._keybindingService.lookupKeybinding(r.id)}dispose(){this._contextMenuIsBeingShownCount>0&&this._contextViewService.hideContextView(),this._toDispose.dispose()}};s.ID="editor.contrib.contextmenu",s=Me([_e(1,p.IContextMenuService),_e(2,p.IContextViewService),_e(3,g.IContextKeyService),_e(4,c.IKeybindingService),_e(5,d.IMenuService)],s),e.ContextMenuController=s;class a extends S.EditorAction{constructor(){super({id:"editor.action.showContextMenu",label:b.localize(0,null),alias:"Show Editor Context Menu",precondition:void 0,kbOpts:{kbExpr:C.EditorContextKeys.textInputFocus,primary:1024|68,weight:100}})}run(r,i){s.get(i).showContextMenu()}}S.registerEditorContribution(s.ID,s),S.registerEditorAction(a)}),define(Q[621],J([0,1,471,2,13,25]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorRedo=e.CursorUndo=e.CursorUndoRedoController=void 0;class S{constructor(o){this.selections=o}equals(o){const s=this.selections.length,a=o.selections.length;if(s!==a)return!1;for(let u=0;u{this._undoStack=[],this._redoStack=[]})),this._register(o.onDidChangeModelContent(s=>{this._undoStack=[],this._redoStack=[]})),this._register(o.onDidChangeCursorSelection(s=>{if(!this._isCursorUndoRedo&&!!s.oldSelections&&s.oldModelVersionId===s.modelVersionId){const a=new S(s.oldSelections);this._undoStack.length>0&&this._undoStack[this._undoStack.length-1].cursorState.equals(a)||(this._undoStack.push(new C(a,o.getScrollTop(),o.getScrollLeft())),this._redoStack=[],this._undoStack.length>50&&this._undoStack.shift())}}))}static get(o){return o.getContribution(d.ID)}cursorUndo(){!this._editor.hasModel()||this._undoStack.length===0||(this._redoStack.push(new C(new S(this._editor.getSelections()),this._editor.getScrollTop(),this._editor.getScrollLeft())),this._applyState(this._undoStack.pop()))}cursorRedo(){!this._editor.hasModel()||this._redoStack.length===0||(this._undoStack.push(new C(new S(this._editor.getSelections()),this._editor.getScrollTop(),this._editor.getScrollLeft())),this._applyState(this._redoStack.pop()))}_applyState(o){this._isCursorUndoRedo=!0,this._editor.setSelections(o.cursorState.selections),this._editor.setScrollPosition({scrollTop:o.scrollTop,scrollLeft:o.scrollLeft}),this._isCursorUndoRedo=!1}}e.CursorUndoRedoController=d,d.ID="editor.contrib.cursorUndoRedoController";class g extends M.EditorAction{constructor(){super({id:"cursorUndo",label:b.localize(0,null),alias:"Cursor Undo",precondition:void 0,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:2048|51,weight:100}})}run(o,s,a){d.get(s).cursorUndo()}}e.CursorUndo=g;class p extends M.EditorAction{constructor(){super({id:"cursorRedo",label:b.localize(1,null),alias:"Cursor Redo",precondition:void 0})}run(o,s,a){d.get(s).cursorRedo()}}e.CursorRedo=p,M.registerEditorContribution(d.ID,d),M.registerEditorAction(g),M.registerEditorAction(p)}),define(Q[622],J([0,1,2,17,13,14,3,21,402,31,340]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DragAndDropController=void 0;function p(o){return N.isMacintosh?o.altKey:o.ctrlKey}class c extends b.Disposable{constructor(s){super();this._editor=s,this._register(this._editor.onMouseDown(a=>this._onEditorMouseDown(a))),this._register(this._editor.onMouseUp(a=>this._onEditorMouseUp(a))),this._register(this._editor.onMouseDrag(a=>this._onEditorMouseDrag(a))),this._register(this._editor.onMouseDrop(a=>this._onEditorMouseDrop(a))),this._register(this._editor.onMouseDropCanceled(()=>this._onEditorMouseDropCanceled())),this._register(this._editor.onKeyDown(a=>this.onEditorKeyDown(a))),this._register(this._editor.onKeyUp(a=>this.onEditorKeyUp(a))),this._register(this._editor.onDidBlurEditorWidget(()=>this.onEditorBlur())),this._register(this._editor.onDidBlurEditorText(()=>this.onEditorBlur())),this._dndDecorationIds=[],this._mouseDown=!1,this._modifierPressed=!1,this._dragSelection=null}onEditorBlur(){this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1,this._modifierPressed=!1}onEditorKeyDown(s){!this._editor.getOption(27)||this._editor.getOption(15)||(p(s)&&(this._modifierPressed=!0),this._mouseDown&&p(s)&&this._editor.updateOptions({mouseStyle:"copy"}))}onEditorKeyUp(s){!this._editor.getOption(27)||this._editor.getOption(15)||(p(s)&&(this._modifierPressed=!1),this._mouseDown&&s.keyCode===c.TRIGGER_KEY_VALUE&&this._editor.updateOptions({mouseStyle:"default"}))}_onEditorMouseDown(s){this._mouseDown=!0}_onEditorMouseUp(s){this._mouseDown=!1,this._editor.updateOptions({mouseStyle:"text"})}_onEditorMouseDrag(s){let a=s.target;if(this._dragSelection===null){let r=(this._editor.getSelections()||[]).filter(i=>a.position&&i.containsPosition(a.position));if(r.length===1)this._dragSelection=r[0];else return}p(s.event)?this._editor.updateOptions({mouseStyle:"copy"}):this._editor.updateOptions({mouseStyle:"default"}),a.position&&(this._dragSelection.containsPosition(a.position)?this._removeDecoration():this.showAt(a.position))}_onEditorMouseDropCanceled(){this._editor.updateOptions({mouseStyle:"text"}),this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1}_onEditorMouseDrop(s){if(s.target&&(this._hitContent(s.target)||this._hitMargin(s.target))&&s.target.position){let a=new w.Position(s.target.position.lineNumber,s.target.position.column);if(this._dragSelection===null){let u=null;if(s.event.shiftKey){let r=this._editor.getSelection();if(r){const{selectionStartLineNumber:i,selectionStartColumn:n}=r;u=[new C.Selection(i,n,a.lineNumber,a.column)]}}else u=(this._editor.getSelections()||[]).map(r=>r.containsPosition(a)?new C.Selection(a.lineNumber,a.column,a.lineNumber,a.column):r);this._editor.setSelections(u||[],"mouse",3)}else(!this._dragSelection.containsPosition(a)||(p(s.event)||this._modifierPressed)&&(this._dragSelection.getEndPosition().equals(a)||this._dragSelection.getStartPosition().equals(a)))&&(this._editor.pushUndoStop(),this._editor.executeCommand(c.ID,new d.DragAndDropCommand(this._dragSelection,a,p(s.event)||this._modifierPressed)),this._editor.pushUndoStop())}this._editor.updateOptions({mouseStyle:"text"}),this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1}showAt(s){let a=[{range:new S.Range(s.lineNumber,s.column,s.lineNumber,s.column),options:c._DECORATION_OPTIONS}];this._dndDecorationIds=this._editor.deltaDecorations(this._dndDecorationIds,a),this._editor.revealPosition(s,1)}_removeDecoration(){this._dndDecorationIds=this._editor.deltaDecorations(this._dndDecorationIds,[])}_hitContent(s){return s.type===6||s.type===7}_hitMargin(s){return s.type===2||s.type===3||s.type===4}dispose(){this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1,this._modifierPressed=!1,super.dispose()}}e.DragAndDropController=c,c.ID="editor.contrib.dragAndDrop",c.TRIGGER_KEY_VALUE=N.isMacintosh?6:5,c._DECORATION_OPTIONS=g.ModelDecorationOptions.register({className:"dnd-target"}),M.registerEditorContribution(c.ID,c)}),define(Q[623],J([0,1,476,13,126]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class w extends N.EditorAction{constructor(){super({id:"editor.action.fontZoomIn",label:b.localize(0,null),alias:"Editor Font Zoom In",precondition:void 0})}run(g,p){M.EditorZoom.setZoomLevel(M.EditorZoom.getZoomLevel()+1)}}class S extends N.EditorAction{constructor(){super({id:"editor.action.fontZoomOut",label:b.localize(1,null),alias:"Editor Font Zoom Out",precondition:void 0})}run(g,p){M.EditorZoom.setZoomLevel(M.EditorZoom.getZoomLevel()-1)}}class C extends N.EditorAction{constructor(){super({id:"editor.action.fontZoomReset",label:b.localize(2,null),alias:"Editor Font Zoom Reset",precondition:void 0})}run(g,p){M.EditorZoom.setZoomLevel(0)}}N.registerEditorAction(w),N.registerEditorAction(S),N.registerEditorAction(C)}),define(Q[261],J([0,1,47,19,23,12,24,70,108,14,3,21,18,75,36,226,477,532,9,71,26,20,54]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getOnTypeFormattingEdits=e.getDocumentFormattingEditsUntilResult=e.getDocumentRangeFormattingEditsUntilResult=e.formatDocumentWithProvider=e.formatDocumentWithSelectedProvider=e.formatDocumentRangesWithProvider=e.formatDocumentRangesWithSelectedProvider=e.FormattingConflicts=e.getRealAndSyntheticDocumentFormattersOrdered=e.alertFormattingEdits=void 0;function _(A){if(A=A.filter(R=>R.range),!!A.length){let{range:B}=A[0];for(let R=1;R0&&p.Range.areIntersectingOrTouching(Y[ee-1],ne)?Y[ee-1]=p.Range.fromPositions(Y[ee-1].getStartPosition(),ne.getEndPosition()):ee=Y.push(ne);const se=[];for(let ne of Y)try{const le=yield B.provideDocumentRangeFormattingEdits(x,ne,x.getFormattingOptions(),K.token),X=yield W.computeMoreMinimalEdits(x.uri,le);if(X&&se.push(...X),K.token.isCancellationRequested)return!0}finally{K.dispose()}if(se.length===0)return!1;if(d.isCodeEditor(F))u.FormattingEdit.execute(F,se,!0),_(se),F.revealPositionInCenterIfOutsideViewport(F.getPosition(),1);else{const[{range:ne}]=se,le=new c.Selection(ne.startLineNumber,ne.startColumn,ne.endLineNumber,ne.endColumn);x.pushEditOperations([le],se.map(X=>({text:X.text,range:p.Range.lift(X.range),forceMoveMarkers:!0})),X=>{for(const{range:z}of X)if(p.Range.areIntersectingOrTouching(z,le))return[new c.Selection(z.startLineNumber,z.startColumn,z.endLineNumber,z.endColumn)];return null})}return!0})}e.formatDocumentRangesWithProvider=L;function I(A,B,F,D,R){return Ie(this,void 0,void 0,function*(){const W=A.get(n.IInstantiationService),x=d.isCodeEditor(B)?B.getModel():B,K=f(x),Y=yield v.select(K,x,F);Y&&(D.report(Y),yield W.invokeFunction(k,Y,B,F,R))})}e.formatDocumentWithSelectedProvider=I;function k(A,B,F,D,R){return Ie(this,void 0,void 0,function*(){const W=A.get(s.IEditorWorkerService);let x,K;d.isCodeEditor(F)?(x=F.getModel(),K=new C.EditorStateCancellationTokenSource(F,1|4,void 0,R)):(x=F,K=new C.TextModelCancellationTokenSource(F,R));let Y;try{const ee=yield B.provideDocumentFormattingEdits(x,x.getFormattingOptions(),K.token);if(Y=yield W.computeMoreMinimalEdits(x.uri,ee),K.token.isCancellationRequested)return!0}finally{K.dispose()}if(!Y||Y.length===0)return!1;if(d.isCodeEditor(F))u.FormattingEdit.execute(F,Y,D!==2),D!==2&&(_(Y),F.revealPositionInCenterIfOutsideViewport(F.getPosition(),1));else{const[{range:ee}]=Y,se=new c.Selection(ee.startLineNumber,ee.startColumn,ee.endLineNumber,ee.endColumn);x.pushEditOperations([se],Y.map(ne=>({text:ne.text,range:p.Range.lift(ne.range),forceMoveMarkers:!0})),ne=>{for(const{range:le}of ne)if(p.Range.areIntersectingOrTouching(le,se))return[new c.Selection(le.startLineNumber,le.startColumn,le.endLineNumber,le.endColumn)];return null})}return!0})}e.formatDocumentWithProvider=k;function E(A,B,F,D,R){return Ie(this,void 0,void 0,function*(){const W=o.DocumentRangeFormattingEditProviderRegistry.ordered(B);for(const x of W){let K=yield Promise.resolve(x.provideDocumentRangeFormattingEdits(B,F,D,R)).catch(w.onUnexpectedExternalError);if(N.isNonEmptyArray(K))return yield A.computeMoreMinimalEdits(B.uri,K)}})}e.getDocumentRangeFormattingEditsUntilResult=E;function T(A,B,F,D){return Ie(this,void 0,void 0,function*(){const R=f(B);for(const W of R){let x=yield Promise.resolve(W.provideDocumentFormattingEdits(B,F,D)).catch(w.onUnexpectedExternalError);if(N.isNonEmptyArray(x))return yield A.computeMoreMinimalEdits(B.uri,x)}})}e.getDocumentFormattingEditsUntilResult=T;function O(A,B,F,D,R){const W=o.OnTypeFormattingEditProviderRegistry.ordered(B);return W.length===0||W[0].autoFormatTriggerCharacters.indexOf(D)<0?Promise.resolve(void 0):Promise.resolve(W[0].provideOnTypeFormattingEdits(B,F,D,R,M.CancellationToken.None)).catch(w.onUnexpectedExternalError).then(x=>A.computeMoreMinimalEdits(B.uri,x))}e.getOnTypeFormattingEdits=O,l.CommandsRegistry.registerCommand("_executeFormatRangeProvider",function(A,...B){const[F,D,R]=B;h.assertType(S.URI.isUri(F)),h.assertType(p.Range.isIRange(D));const W=A.get(a.IModelService).getModel(F);if(!W)throw w.illegalArgument("resource");return E(A.get(s.IEditorWorkerService),W,p.Range.lift(D),R,M.CancellationToken.None)}),l.CommandsRegistry.registerCommand("_executeFormatDocumentProvider",function(A,...B){const[F,D]=B;h.assertType(S.URI.isUri(F));const R=A.get(a.IModelService).getModel(F);if(!R)throw w.illegalArgument("resource");return T(A.get(s.IEditorWorkerService),R,D,M.CancellationToken.None)}),l.CommandsRegistry.registerCommand("_executeFormatOnTypeProvider",function(A,...B){const[F,D,R,W]=B;h.assertType(S.URI.isUri(F)),h.assertType(g.Position.isIPosition(D)),h.assertType(typeof R=="string");const x=A.get(a.IModelService).getModel(F);if(!x)throw w.illegalArgument("resource");return O(A.get(s.IEditorWorkerService),x,g.Position.lift(D),R,W)})}),define(Q[624],J([0,1,19,23,39,2,13,28,91,3,25,18,75,261,226,478,26,16,9,12,59]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0});let h=class{constructor(y,L){this._workerService=L,this._callOnDispose=new w.DisposableStore,this._callOnModel=new w.DisposableStore,this._editor=y,this._callOnDispose.add(y.onDidChangeConfiguration(()=>this._update())),this._callOnDispose.add(y.onDidChangeModel(()=>this._update())),this._callOnDispose.add(y.onDidChangeModelLanguage(()=>this._update())),this._callOnDispose.add(c.OnTypeFormattingEditProviderRegistry.onDidChange(this._update,this))}dispose(){this._callOnDispose.dispose(),this._callOnModel.dispose()}_update(){if(this._callOnModel.clear(),!!this._editor.getOption(43)&&!!this._editor.hasModel()){const y=this._editor.getModel(),[L]=c.OnTypeFormattingEditProviderRegistry.ordered(y);if(!(!L||!L.autoFormatTriggerCharacters)){let I=new d.CharacterSet;for(let k of L.autoFormatTriggerCharacters)I.add(k.charCodeAt(0));this._callOnModel.add(this._editor.onDidType(k=>{let E=k.charCodeAt(k.length-1);I.has(E)&&this._trigger(String.fromCharCode(E))}))}}}_trigger(y){if(!!this._editor.hasModel()&&!(this._editor.getSelections().length>1)){const L=this._editor.getModel(),I=this._editor.getPosition();let k=!1;const E=this._editor.onDidChangeModelContent(T=>{if(T.isFlush){k=!0,E.dispose();return}for(let O=0,A=T.changes.length;O{E.dispose(),!k&&b.isNonEmptyArray(T)&&(a.FormattingEdit.execute(this._editor,T,!0),s.alertFormattingEdits(T))},T=>{throw E.dispose(),T})}}};h.ID="editor.contrib.autoFormat",h=Me([_e(1,o.IEditorWorkerService)],h);let m=class{constructor(y,L){this.editor=y,this._instantiationService=L,this._callOnDispose=new w.DisposableStore,this._callOnModel=new w.DisposableStore,this._callOnDispose.add(y.onDidChangeConfiguration(()=>this._update())),this._callOnDispose.add(y.onDidChangeModel(()=>this._update())),this._callOnDispose.add(y.onDidChangeModelLanguage(()=>this._update())),this._callOnDispose.add(c.DocumentRangeFormattingEditProviderRegistry.onDidChange(this._update,this))}dispose(){this._callOnDispose.dispose(),this._callOnModel.dispose()}_update(){this._callOnModel.clear(),!!this.editor.getOption(42)&&(!this.editor.hasModel()||!c.DocumentRangeFormattingEditProviderRegistry.has(this.editor.getModel())||this._callOnModel.add(this.editor.onDidPaste(({range:y})=>this._trigger(y))))}_trigger(y){!this.editor.hasModel()||this.editor.getSelections().length>1||this._instantiationService.invokeFunction(s.formatDocumentRangesWithSelectedProvider,this.editor,y,2,l.Progress.None,N.CancellationToken.None).catch(t.onUnexpectedError)}};m.ID="editor.contrib.formatOnPaste",m=Me([_e(1,n.IInstantiationService)],m);class _ extends S.EditorAction{constructor(){super({id:"editor.action.formatDocument",label:u.localize(0,null),alias:"Format Document",precondition:i.ContextKeyExpr.and(p.EditorContextKeys.notInCompositeEditor,p.EditorContextKeys.writable,p.EditorContextKeys.hasDocumentFormattingProvider),kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:1024|512|36,linux:{primary:2048|1024|39},weight:100},contextMenuOpts:{group:"1_modification",order:1.3}})}run(y,L){return Ie(this,void 0,void 0,function*(){if(L.hasModel()){const I=y.get(n.IInstantiationService);yield y.get(l.IEditorProgressService).showWhile(I.invokeFunction(s.formatDocumentWithSelectedProvider,L,1,l.Progress.None,N.CancellationToken.None),250)}})}}class f extends S.EditorAction{constructor(){super({id:"editor.action.formatSelection",label:u.localize(1,null),alias:"Format Selection",precondition:i.ContextKeyExpr.and(p.EditorContextKeys.writable,p.EditorContextKeys.hasDocumentSelectionFormattingProvider),kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:M.KeyChord(2048|41,2048|36),weight:100},contextMenuOpts:{when:p.EditorContextKeys.hasNonEmptySelection,group:"1_modification",order:1.31}})}run(y,L){return Ie(this,void 0,void 0,function*(){if(!!L.hasModel()){const I=y.get(n.IInstantiationService),k=L.getModel(),E=L.getSelections().map(O=>O.isEmpty()?new g.Range(O.startLineNumber,1,O.startLineNumber,k.getLineMaxColumn(O.startLineNumber)):O);yield y.get(l.IEditorProgressService).showWhile(I.invokeFunction(s.formatDocumentRangesWithSelectedProvider,L,E,1,l.Progress.None,N.CancellationToken.None),250)}})}}S.registerEditorContribution(h.ID,h),S.registerEditorContribution(m.ID,m),S.registerEditorAction(_),S.registerEditorAction(f),r.CommandsRegistry.registerCommand("editor.action.format",v=>Ie(void 0,void 0,void 0,function*(){const y=v.get(C.ICodeEditorService).getFocusedCodeEditor();if(!(!y||!y.hasModel())){const L=v.get(r.ICommandService);y.getSelection().isEmpty()?yield L.executeCommand("editor.action.formatDocument"):yield L.executeCommand("editor.action.formatSelection")}}))}),define(Q[262],J([0,1,23,12,13,18]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getReferencesAtPosition=e.getTypeDefinitionsAtPosition=e.getImplementationsAtPosition=e.getDeclarationsAtPosition=e.getDefinitionsAtPosition=void 0;function S(o,s,a,u){const i=a.ordered(o).map(n=>Promise.resolve(u(n,o,s)).then(void 0,t=>{N.onUnexpectedExternalError(t)}));return Promise.all(i).then(n=>{const t=[];for(let l of n)Array.isArray(l)?t.push(...l):l&&t.push(l);return t})}function C(o,s,a){return S(o,s,w.DefinitionProviderRegistry,(u,r,i)=>u.provideDefinition(r,i,a))}e.getDefinitionsAtPosition=C;function d(o,s,a){return S(o,s,w.DeclarationProviderRegistry,(u,r,i)=>u.provideDeclaration(r,i,a))}e.getDeclarationsAtPosition=d;function g(o,s,a){return S(o,s,w.ImplementationProviderRegistry,(u,r,i)=>u.provideImplementation(r,i,a))}e.getImplementationsAtPosition=g;function p(o,s,a){return S(o,s,w.TypeDefinitionProviderRegistry,(u,r,i)=>u.provideTypeDefinition(r,i,a))}e.getTypeDefinitionsAtPosition=p;function c(o,s,a,u){return S(o,s,w.ReferenceProviderRegistry,(r,i,n)=>Ie(this,void 0,void 0,function*(){const t=yield r.provideReferences(i,n,{includeDeclaration:!0},u);if(!a||!t||t.length!==2)return t;const l=yield r.provideReferences(i,n,{includeDeclaration:!1},u);return l&&l.length===1?l:t}))}e.getReferencesAtPosition=c,M.registerModelAndPositionCommand("_executeDefinitionProvider",(o,s)=>C(o,s,b.CancellationToken.None)),M.registerModelAndPositionCommand("_executeDeclarationProvider",(o,s)=>d(o,s,b.CancellationToken.None)),M.registerModelAndPositionCommand("_executeImplementationProvider",(o,s)=>g(o,s,b.CancellationToken.None)),M.registerModelAndPositionCommand("_executeTypeDefinitionProvider",(o,s)=>p(o,s,b.CancellationToken.None)),M.registerModelAndPositionCommand("_executeReferenceProvider",(o,s)=>c(o,s,!1,b.CancellationToken.None))}),define(Q[625],J([0,1,16,9,74,86,13,28,3,2,6,487,37,32,44]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ISymbolNavigationService=e.ctxHasSymbols=void 0,e.ctxHasSymbols=new b.RawContextKey("hasSymbols",!1),e.ISymbolNavigationService=N.createDecorator("ISymbolNavigationService");let u=class{constructor(n,t,l,h){this._editorService=t,this._notificationService=l,this._keybindingService=h,this._currentModel=void 0,this._currentIdx=-1,this._ignoreEditorChange=!1,this._ctxHasSymbols=e.ctxHasSymbols.bindTo(n)}reset(){var n,t;this._ctxHasSymbols.reset(),(n=this._currentState)===null||n===void 0||n.dispose(),(t=this._currentMessage)===null||t===void 0||t.dispose(),this._currentModel=void 0,this._currentIdx=-1}put(n){const t=n.parent.parent;if(t.references.length<=1){this.reset();return}this._currentModel=t,this._currentIdx=t.references.indexOf(n),this._ctxHasSymbols.set(!0),this._showMessage();const l=new r(this._editorService),h=l.onDidChange(m=>{if(!this._ignoreEditorChange){const _=this._editorService.getActiveCodeEditor();if(!!_){const f=_.getModel(),v=_.getPosition();if(!(!f||!v)){let y=!1,L=!1;for(const I of t.references)if(a.isEqual(I.uri,f.uri))y=!0,L=L||d.Range.containsPosition(I.range,v);else if(y)break;(!y||!L)&&this.reset()}}}});this._currentState=g.combinedDisposable(l,h)}revealNext(n){if(!this._currentModel)return Promise.resolve();this._currentIdx+=1,this._currentIdx%=this._currentModel.references.length;const t=this._currentModel.references[this._currentIdx];return this._showMessage(),this._ignoreEditorChange=!0,this._editorService.openCodeEditor({resource:t.uri,options:{selection:d.Range.collapseToStart(t.range),selectionRevealType:3}},n).finally(()=>{this._ignoreEditorChange=!1})}_showMessage(){var n;(n=this._currentMessage)===null||n===void 0||n.dispose();const t=this._keybindingService.lookupKeybinding("editor.gotoNextSymbolFromResult"),l=t?c.localize(0,null,this._currentIdx+1,this._currentModel.references.length,t.getLabel()):c.localize(1,null,this._currentIdx+1,this._currentModel.references.length);this._currentMessage=this._notificationService.status(l)}};u=Me([_e(0,b.IContextKeyService),_e(1,C.ICodeEditorService),_e(2,s.INotificationService),_e(3,o.IKeybindingService)],u),M.registerSingleton(e.ISymbolNavigationService,u,!0),S.registerEditorCommand(new class extends S.EditorCommand{constructor(){super({id:"editor.gotoNextSymbolFromResult",precondition:e.ctxHasSymbols,kbOpts:{weight:100,primary:70}})}runEditorCommand(i,n){return i.get(e.ISymbolNavigationService).revealNext(n)}}),w.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"editor.gotoNextSymbolFromResult.cancel",weight:100,when:e.ctxHasSymbols,primary:9,handler(i){i.get(e.ISymbolNavigationService).reset()}});let r=class{constructor(n){this._listener=new Map,this._disposables=new g.DisposableStore,this._onDidChange=new p.Emitter,this.onDidChange=this._onDidChange.event,this._disposables.add(n.onCodeEditorRemove(this._onDidRemoveEditor,this)),this._disposables.add(n.onCodeEditorAdd(this._onDidAddEditor,this)),n.listCodeEditors().forEach(this._onDidAddEditor,this)}dispose(){this._disposables.dispose(),this._onDidChange.dispose(),g.dispose(this._listener.values())}_onDidAddEditor(n){this._listener.set(n,g.combinedDisposable(n.onDidChangeCursorPosition(t=>this._onDidChange.fire({editor:n})),n.onDidChangeModelContent(t=>this._onDidChange.fire({editor:n}))))}_onDidRemoveEditor(n){var t;(t=this._listener.get(n))===null||t===void 0||t.dispose(),this._listener.delete(n)}};r=Me([_e(0,C.ICodeEditorService)],r)}),define(Q[626],J([0,1,19,23,12,13,18]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getHover=void 0;function C(g,p,c){const s=S.HoverProviderRegistry.ordered(g).map(a=>Promise.resolve(a.provideHover(g,p,c)).then(u=>u&&d(u)?u:void 0,u=>{M.onUnexpectedExternalError(u)}));return Promise.all(s).then(b.coalesce)}e.getHover=C,w.registerModelAndPositionCommand("_executeHoverProvider",(g,p)=>C(g,p,N.CancellationToken.None));function d(g){const p=typeof g.range!="undefined",c=typeof g.contents!="undefined"&&g.contents&&g.contents.length>0;return p&&c}}),define(Q[627],J([0,1,489,7,73,2,3,140,19,58,57,18,626,14]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkdownHoverParticipant=e.MarkdownHover=void 0;const a=N.$;class u{constructor(n,t){this.range=n,this.contents=t}equals(n){return n instanceof u?M.markedStringsEquals(this.contents,n.contents):!1}}e.MarkdownHover=u;let r=class{constructor(n,t,l,h){this._editor=n,this._hover=t,this._modeService=l,this._openerService=h}createLoadingMessage(n){return new u(n,[new M.MarkdownString().appendText(b.localize(0,null))])}computeSync(n,t){if(!this._editor.hasModel())return[];const l=this._editor.getModel(),h=n.startLineNumber,m=l.getLineMaxColumn(h),_=[];for(const f of t){const v=f.range.startLineNumber===h?f.range.startColumn:1,y=f.range.endLineNumber===h?f.range.endColumn:m,L=f.options.hoverMessage;if(!(!L||M.isEmptyMarkdownString(L))){const I=new S.Range(n.startLineNumber,v,n.startLineNumber,y);_.push(new u(I,d.asArray(L)))}}return _}computeAsync(n,t){return Ie(this,void 0,void 0,function*(){if(!this._editor.hasModel()||!n)return Promise.resolve([]);const l=this._editor.getModel();if(!c.HoverProviderRegistry.has(l))return Promise.resolve([]);const h=yield o.getHover(l,new s.Position(n.startLineNumber,n.startColumn),t),m=[];for(const _ of h)if(!M.isEmptyMarkdownString(_.contents)){const f=_.range?S.Range.lift(_.range):n;m.push(new u(f,_.contents))}return m})}renderHoverParts(n,t){const l=new w.DisposableStore;for(const h of n)for(const m of h.contents)if(!M.isEmptyMarkdownString(m)){const _=a("div.hover-row.markdown-hover"),f=N.append(_,a("div.hover-contents")),v=l.add(new C.MarkdownRenderer({editor:this._editor},this._modeService,this._openerService));l.add(v.onDidRenderAsync(()=>{f.className="hover-contents code-hover-contents",this._hover.onContentsChanged()}));const y=l.add(v.render(m));f.appendChild(y.element),t.appendChild(_)}return l}};r=Me([_e(2,p.IModeService),_e(3,g.IOpenerService)],r),e.MarkdownHoverParticipant=r}),define(Q[628],J([0,1,491,3,21,25,13,75,409,70,11,49,31,15,12]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0});let u=class Ct{constructor(t,l){this.decorationIds=[],this.editor=t,this.editorWorkerService=l}static get(t){return t.getContribution(Ct.ID)}dispose(){}run(t,l){this.currentRequest&&this.currentRequest.cancel();const h=this.editor.getSelection(),m=this.editor.getModel();if(!(!m||!h)){let _=h;if(_.startLineNumber===_.endLineNumber){const f=new g.EditorState(this.editor,1|4),v=m.uri;return this.editorWorkerService.canNavigateValueSet(v)?(this.currentRequest=s.createCancelablePromise(y=>this.editorWorkerService.navigateValueSet(v,_,l)),this.currentRequest.then(y=>{if(!(!y||!y.range||!y.value)&&!!f.validate(this.editor)){let L=N.Range.lift(y.range),I=y.range,k=y.value.length-(_.endColumn-_.startColumn);I={startLineNumber:I.startLineNumber,startColumn:I.startColumn,endLineNumber:I.endLineNumber,endColumn:I.startColumn+y.value.length},k>1&&(_=new M.Selection(_.startLineNumber,_.startColumn,_.endLineNumber,_.endColumn+k-1));const E=new d.InPlaceReplaceCommand(L,_,y.value);this.editor.pushUndoStop(),this.editor.executeCommand(t,E),this.editor.pushUndoStop(),this.decorationIds=this.editor.deltaDecorations(this.decorationIds,[{range:I,options:Ct.DECORATION}]),this.decorationRemover&&this.decorationRemover.cancel(),this.decorationRemover=s.timeout(350),this.decorationRemover.then(()=>this.decorationIds=this.editor.deltaDecorations(this.decorationIds,[])).catch(a.onUnexpectedError)}}).catch(a.onUnexpectedError)):Promise.resolve(void 0)}}}};u.ID="editor.contrib.inPlaceReplaceController",u.DECORATION=o.ModelDecorationOptions.register({className:"valueSetReplacement"}),u=Me([_e(1,C.IEditorWorkerService)],u);class r extends S.EditorAction{constructor(){super({id:"editor.action.inPlaceReplace.up",label:b.localize(0,null),alias:"Replace with Previous Value",precondition:w.EditorContextKeys.writable,kbOpts:{kbExpr:w.EditorContextKeys.editorTextFocus,primary:2048|1024|82,weight:100}})}run(t,l){const h=u.get(l);return h?h.run(this.id,!0):Promise.resolve(void 0)}}class i extends S.EditorAction{constructor(){super({id:"editor.action.inPlaceReplace.down",label:b.localize(1,null),alias:"Replace with Next Value",precondition:w.EditorContextKeys.writable,kbOpts:{kbExpr:w.EditorContextKeys.editorTextFocus,primary:2048|1024|84,weight:100}})}run(t,l){const h=u.get(l);return h?h.run(this.id,!1):Promise.resolve(void 0)}}S.registerEditorContribution(u.ID,u),S.registerEditorAction(r),S.registerEditorAction(i),p.registerThemingParticipant((n,t)=>{const l=n.getColor(c.editorBracketMatchBorder);l&&t.addRule(`.monaco-editor.vs .valueSetReplacement { outline: solid 2px ${l}; }`)})}),define(Q[629],J([0,1,492,2,8,13,179,62,3,21,25,31,41,36,229,78]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IndentationToTabsCommand=e.IndentationToSpacesCommand=e.AutoIndentOnPaste=e.AutoIndentOnPasteCommand=e.ReindentSelectedLinesAction=e.ReindentLinesAction=e.DetectIndentation=e.IndentUsingSpaces=e.IndentUsingTabs=e.ChangeIndentationSizeAction=e.IndentationToTabsAction=e.IndentationToSpacesAction=e.getReindentEditOperations=void 0;function r(E,T,O,A){if(E.getLineCount()===1&&E.getLineMaxColumn(1)===1)return[];let B=o.LanguageConfigurationRegistry.getIndentationRules(E.getLanguageIdentifier().id);if(!B)return[];for(O=Math.min(O,E.getLineCount());T<=O&&B.unIndentedLinePattern;){let le=E.getLineContent(T);if(!B.unIndentedLinePattern.test(le))break;T++}if(T>O-1)return[];const{tabSize:F,indentSize:D,insertSpaces:R}=E.getOptions(),W=(le,X)=>(X=X||1,S.ShiftCommand.shiftIndent(le,le.length+X,F,D,R)),x=(le,X)=>(X=X||1,S.ShiftCommand.unshiftIndent(le,le.length+X,F,D,R));let K=[],Y,ee=E.getLineContent(T),se=ee;if(A!=null){Y=A;let le=M.getLeadingWhitespace(ee);se=Y+ee.substring(le.length),B.decreaseIndentPattern&&B.decreaseIndentPattern.test(se)&&(Y=x(Y),se=Y+ee.substring(le.length)),ee!==se&&K.push(C.EditOperation.replaceMove(new g.Selection(T,1,T,le.length+1),c.TextModel.normalizeIndentation(Y,D,R)))}else Y=M.getLeadingWhitespace(ee);let ne=Y;B.increaseIndentPattern&&B.increaseIndentPattern.test(se)?(ne=W(ne),Y=W(Y)):B.indentNextLinePattern&&B.indentNextLinePattern.test(se)&&(ne=W(ne)),T++;for(let le=T;le<=O;le++){let X=E.getLineContent(le),z=M.getLeadingWhitespace(X),P=ne+X.substring(z.length);B.decreaseIndentPattern&&B.decreaseIndentPattern.test(P)&&(ne=x(ne),Y=x(Y)),z!==ne&&K.push(C.EditOperation.replaceMove(new g.Selection(le,1,le,z.length+1),c.TextModel.normalizeIndentation(ne,D,R))),!(B.unIndentedLinePattern&&B.unIndentedLinePattern.test(X))&&(B.increaseIndentPattern&&B.increaseIndentPattern.test(P)?(Y=W(Y),ne=Y):B.indentNextLinePattern&&B.indentNextLinePattern.test(P)?ne=W(ne):ne=Y)}return K}e.getReindentEditOperations=r;class i extends w.EditorAction{constructor(){super({id:i.ID,label:b.localize(0,null),alias:"Convert Indentation to Spaces",precondition:p.EditorContextKeys.writable})}run(T,O){let A=O.getModel();if(!!A){let B=A.getOptions(),F=O.getSelection();if(!!F){const D=new I(F,B.tabSize);O.pushUndoStop(),O.executeCommands(this.id,[D]),O.pushUndoStop(),A.updateOptions({insertSpaces:!0})}}}}e.IndentationToSpacesAction=i,i.ID="editor.action.indentationToSpaces";class n extends w.EditorAction{constructor(){super({id:n.ID,label:b.localize(1,null),alias:"Convert Indentation to Tabs",precondition:p.EditorContextKeys.writable})}run(T,O){let A=O.getModel();if(!!A){let B=A.getOptions(),F=O.getSelection();if(!!F){const D=new k(F,B.tabSize);O.pushUndoStop(),O.executeCommands(this.id,[D]),O.pushUndoStop(),A.updateOptions({insertSpaces:!1})}}}}e.IndentationToTabsAction=n,n.ID="editor.action.indentationToTabs";class t extends w.EditorAction{constructor(T,O){super(O);this.insertSpaces=T}run(T,O){const A=T.get(u.IQuickInputService),B=T.get(s.IModelService);let F=O.getModel();if(!!F){let D=B.getCreationOptions(F.getLanguageIdentifier().language,F.uri,F.isForSimpleWidget);const R=[1,2,3,4,5,6,7,8].map(x=>({id:x.toString(),label:x.toString(),description:x===D.tabSize?b.localize(2,null):void 0})),W=Math.min(F.getOptions().tabSize-1,7);setTimeout(()=>{A.pick(R,{placeHolder:b.localize(3,null),activeItem:R[W]}).then(x=>{x&&F&&!F.isDisposed()&&F.updateOptions({tabSize:parseInt(x.label,10),insertSpaces:this.insertSpaces})})},50)}}}e.ChangeIndentationSizeAction=t;class l extends t{constructor(){super(!1,{id:l.ID,label:b.localize(4,null),alias:"Indent Using Tabs",precondition:void 0})}}e.IndentUsingTabs=l,l.ID="editor.action.indentUsingTabs";class h extends t{constructor(){super(!0,{id:h.ID,label:b.localize(5,null),alias:"Indent Using Spaces",precondition:void 0})}}e.IndentUsingSpaces=h,h.ID="editor.action.indentUsingSpaces";class m extends w.EditorAction{constructor(){super({id:m.ID,label:b.localize(6,null),alias:"Detect Indentation from Content",precondition:void 0})}run(T,O){const A=T.get(s.IModelService);let B=O.getModel();if(!!B){let F=A.getCreationOptions(B.getLanguageIdentifier().language,B.uri,B.isForSimpleWidget);B.detectIndentation(F.insertSpaces,F.tabSize)}}}e.DetectIndentation=m,m.ID="editor.action.detectIndentation";class _ extends w.EditorAction{constructor(){super({id:"editor.action.reindentlines",label:b.localize(7,null),alias:"Reindent Lines",precondition:p.EditorContextKeys.writable})}run(T,O){let A=O.getModel();if(!!A){let B=r(A,1,A.getLineCount());B.length>0&&(O.pushUndoStop(),O.executeEdits(this.id,B),O.pushUndoStop())}}}e.ReindentLinesAction=_;class f extends w.EditorAction{constructor(){super({id:"editor.action.reindentselectedlines",label:b.localize(8,null),alias:"Reindent Selected Lines",precondition:p.EditorContextKeys.writable})}run(T,O){let A=O.getModel();if(!!A){let B=O.getSelections();if(B!==null){let F=[];for(let D of B){let R=D.startLineNumber,W=D.endLineNumber;if(R!==W&&D.endColumn===1&&W--,R===1){if(R===W)continue}else R--;let x=r(A,R,W);F.push(...x)}F.length>0&&(O.pushUndoStop(),O.executeEdits(this.id,F),O.pushUndoStop())}}}}e.ReindentSelectedLinesAction=f;class v{constructor(T,O){this._initialSelection=O,this._edits=[],this._selectionId=null;for(let A of T)A.range&&typeof A.text=="string"&&this._edits.push(A)}getEditOperations(T,O){for(let B of this._edits)O.addEditOperation(d.Range.lift(B.range),B.text);let A=!1;Array.isArray(this._edits)&&this._edits.length===1&&this._initialSelection.isEmpty()&&(this._edits[0].range.startColumn===this._initialSelection.endColumn&&this._edits[0].range.startLineNumber===this._initialSelection.endLineNumber?(A=!0,this._selectionId=O.trackSelection(this._initialSelection,!0)):this._edits[0].range.endColumn===this._initialSelection.startColumn&&this._edits[0].range.endLineNumber===this._initialSelection.startLineNumber&&(A=!0,this._selectionId=O.trackSelection(this._initialSelection,!1))),A||(this._selectionId=O.trackSelection(this._initialSelection))}computeCursorState(T,O){return O.getTrackedSelection(this._selectionId)}}e.AutoIndentOnPasteCommand=v;class y{constructor(T){this.callOnDispose=new N.DisposableStore,this.callOnModel=new N.DisposableStore,this.editor=T,this.callOnDispose.add(T.onDidChangeConfiguration(()=>this.update())),this.callOnDispose.add(T.onDidChangeModel(()=>this.update())),this.callOnDispose.add(T.onDidChangeModelLanguage(()=>this.update()))}update(){this.callOnModel.clear(),!(this.editor.getOption(8)<4||this.editor.getOption(42))&&(!this.editor.hasModel()||this.callOnModel.add(this.editor.onDidPaste(({range:T})=>{this.trigger(T)})))}trigger(T){let O=this.editor.getSelections();if(!(O===null||O.length>1)){const A=this.editor.getModel();if(!!A&&!!A.isCheapToTokenize(T.getStartPosition().lineNumber)){const B=this.editor.getOption(8),{tabSize:F,indentSize:D,insertSpaces:R}=A.getOptions();let W=[],x={shiftIndent:se=>S.ShiftCommand.shiftIndent(se,se.length+1,F,D,R),unshiftIndent:se=>S.ShiftCommand.unshiftIndent(se,se.length+1,F,D,R)},K=T.startLineNumber;for(;K<=T.endLineNumber;){if(this.shouldIgnoreLine(A,K)){K++;continue}break}if(!(K>T.endLineNumber)){let Y=A.getLineContent(K);if(!/\S/.test(Y.substring(0,T.startColumn-1))){let se=o.LanguageConfigurationRegistry.getGoodIndentForLine(B,A,A.getLanguageIdentifier().id,K,x);if(se!==null){let ne=M.getLeadingWhitespace(Y),le=a.getSpaceCnt(se,F),X=a.getSpaceCnt(ne,F);if(le!==X){let z=a.generateIndent(le,F,R);W.push({range:new d.Range(K,1,K,ne.length+1),text:z}),Y=z+Y.substr(ne.length)}else{let z=o.LanguageConfigurationRegistry.getIndentMetadata(A,K);if(z===0||z===8)return}}}const ee=K;for(;KA.getLineTokens(le),getLanguageIdentifier:()=>A.getLanguageIdentifier(),getLanguageIdAtPosition:(le,X)=>A.getLanguageIdAtPosition(le,X),getLineContent:le=>le===ee?Y:A.getLineContent(le)},ne=o.LanguageConfigurationRegistry.getGoodIndentForLine(B,se,A.getLanguageIdentifier().id,K+1,x);if(ne!==null){let le=a.getSpaceCnt(ne,F),X=a.getSpaceCnt(M.getLeadingWhitespace(A.getLineContent(K+1)),F);if(le!==X){let z=le-X;for(let P=K+1;P<=T.endLineNumber;P++){let V=A.getLineContent(P),U=M.getLeadingWhitespace(V),$=a.getSpaceCnt(U,F)+z,ie=a.generateIndent($,F,R);ie!==U&&W.push({range:new d.Range(P,1,P,U.length+1),text:ie})}}}}if(W.length>0){this.editor.pushUndoStop();let se=new v(W,this.editor.getSelection());this.editor.executeCommand("autoIndentOnPaste",se),this.editor.pushUndoStop()}}}}}shouldIgnoreLine(T,O){T.forceTokenization(O);let A=T.getLineFirstNonWhitespaceColumn(O);if(A===0)return!0;let B=T.getLineTokens(O);if(B.getCount()>0){let F=B.findTokenIndexAtOffset(A);if(F>=0&&B.getStandardTokenType(F)===1)return!0}return!1}dispose(){this.callOnDispose.dispose(),this.callOnModel.dispose()}}e.AutoIndentOnPaste=y,y.ID="editor.contrib.autoIndentOnPaste";function L(E,T,O,A){if(!(E.getLineCount()===1&&E.getLineMaxColumn(1)===1)){let B="";for(let D=0;Df.map(E=>Promise.resolve(k.provideInlineHints(_,E,v)).then(T=>{T&&y.push({list:T,provider:k})},T=>{N.onUnexpectedExternalError(T)}))));return yield Promise.all(I),y})}e.getInlineHints=h;let m=class{constructor(f,v,y){this._editor=f,this._codeEditorService=v,this._themeService=y,this._disposables=new w.DisposableStore,this._sessionDisposables=new w.DisposableStore,this._getInlineHintsDelays=new a.LanguageFeatureRequestDelays(d.InlineHintsProviderRegistry,250,2500),this._decorationsTypeIds=[],this._decorationIds=[],this._disposables.add(d.InlineHintsProviderRegistry.onDidChange(()=>this._update())),this._disposables.add(y.onDidColorThemeChange(()=>this._update())),this._disposables.add(f.onDidChangeModel(()=>this._update())),this._disposables.add(f.onDidChangeModelLanguage(()=>this._update())),this._disposables.add(f.onDidChangeConfiguration(L=>{L.hasChanged(120)&&this._update()})),this._update()}dispose(){this._sessionDisposables.dispose(),this._removeAllDecorations(),this._disposables.dispose()}_update(){if(this._sessionDisposables.clear(),!this._editor.getOption(120).enabled){this._removeAllDecorations();return}const f=this._editor.getModel();if(!f||!d.InlineHintsProviderRegistry.has(f)){this._removeAllDecorations();return}const v=new b.RunOnceScheduler(()=>Ie(this,void 0,void 0,function*(){const L=Date.now(),I=new c.CancellationTokenSource;this._sessionDisposables.add(w.toDisposable(()=>I.dispose(!0)));const k=this._editor.getVisibleRangesPlusViewportAboveBelow(),E=yield h(f,k,I.token),T=this._getInlineHintsDelays.update(f,Date.now()-L);v.delay=T,this._updateHintsDecorators(E)}),this._getInlineHintsDelays.get(f));this._sessionDisposables.add(v),this._sessionDisposables.add(this._editor.onDidChangeModelContent(()=>v.schedule())),this._disposables.add(this._editor.onDidScrollChange(()=>v.schedule())),v.schedule();const y=new w.DisposableStore;this._sessionDisposables.add(y);for(const L of d.InlineHintsProviderRegistry.all(f))typeof L.onDidChangeInlineHints=="function"&&y.add(L.onDidChangeInlineHints(()=>v.schedule()))}_updateHintsDecorators(f){const{fontSize:v,fontFamily:y}=this._getLayoutInfo(),L=this._themeService.getColorTheme().getColor(p.editorInlineHintBackground),I=this._themeService.getColorTheme().getColor(p.editorInlineHintForeground),k=[],E=[];for(const{list:T}of f)for(let O=0;Ov)&&(y=v*.9|0);const L=f.fontFamily;return{fontSize:y,fontFamily:L}}_removeAllDecorations(){this._decorationIds=this._editor.deltaDecorations(this._decorationIds,[]),this._decorationsTypeIds.forEach(this._codeEditorService.removeDecorationType,this._codeEditorService),this._decorationsTypeIds=[]}};m.ID="editor.contrib.InlineHints",m=Me([_e(1,C.ICodeEditorService),_e(2,o.IThemeService)],m),e.InlineHintsController=m,S.registerEditorContribution(m.ID,m),r.CommandsRegistry.registerCommand("_executeInlineHintProvider",(_,...f)=>Ie(void 0,void 0,void 0,function*(){const[v,y]=f;n.assertType(i.URI.isUri(v)),n.assertType(s.Range.isIRange(y));const L=yield _.get(t.ITextModelService).createModelReference(v);try{const I=yield h(L.object.textEditorModel,[s.Range.lift(y)],c.CancellationToken.None);return g.flatten(I.map(k=>k.list)).sort((k,E)=>s.Range.compareRangesUsingStarts(k.range,E.range))}finally{L.dispose()}}))}),define(Q[631],J([0,1,493,39,188,13,92,366,182,62,14,3,21,25,410,542,411,34]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SnakeCaseAction=e.TitleCaseAction=e.LowerCaseAction=e.UpperCaseAction=e.AbstractCaseAction=e.TransposeAction=e.JoinLinesAction=e.DeleteAllRightAction=e.DeleteAllLeftAction=e.AbstractDeleteAllToBoundaryAction=e.InsertLineAfterAction=e.InsertLineBeforeAction=e.IndentLinesAction=e.DeleteLinesAction=e.TrimTrailingWhitespaceAction=e.SortLinesDescendingAction=e.SortLinesAscendingAction=e.AbstractSortLinesAction=e.DuplicateSelectionAction=void 0;class n extends w.EditorAction{constructor(le,X){super(X);this.down=le}run(le,X){if(!!X.hasModel()){const z=X.getSelections().map((U,H)=>({selection:U,index:H,ignore:!1}));z.sort((U,H)=>c.Range.compareRangesUsingStarts(U.selection,H.selection));let P=z[0];for(let U=1;Unew p.Position(H.positionLineNumber,H.positionColumn)));let V=X.getSelection();if(V!==null){let U=new C.TrimTrailingWhitespaceCommand(V,P);X.pushUndoStop(),X.executeCommands(this.id,[U]),X.pushUndoStop()}}}e.TrimTrailingWhitespaceAction=I,I.ID="editor.action.trimTrailingWhitespace";class k extends w.EditorAction{constructor(){super({id:"editor.action.deleteLines",label:b.localize(13,null),alias:"Delete Line",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.textInputFocus,primary:2048|1024|41,weight:100}})}run(le,X){if(!!X.hasModel()){let z=this._getLinesToRemove(X),P=X.getModel();if(!(P.getLineCount()===1&&P.getLineMaxColumn(1)===1)){let V=0,U=[],H=[];for(let $=0,ie=z.length;$1&&(ae-=1,j=P.getLineMaxColumn(ae)),U.push(g.EditOperation.replace(new o.Selection(ae,j,G,te),"")),H.push(new o.Selection(ae-V,oe.positionColumn,ae-V,oe.positionColumn)),V+=oe.endLineNumber-oe.startLineNumber+1}X.pushUndoStop(),X.executeEdits(this.id,U,H),X.pushUndoStop()}}}_getLinesToRemove(le){let X=le.getSelections().map(V=>{let U=V.endLineNumber;return V.startLineNumberV.startLineNumber===U.startLineNumber?V.endLineNumber-U.endLineNumber:V.startLineNumber-U.startLineNumber);let z=[],P=X[0];for(let V=1;V=X[V].startLineNumber?P.endLineNumber=X[V].endLineNumber:(z.push(P),P=X[V]);return z.push(P),z}}e.DeleteLinesAction=k;class E extends w.EditorAction{constructor(){super({id:"editor.action.indentLines",label:b.localize(14,null),alias:"Indent Line",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:2048|89,weight:100}})}run(le,X){const z=X._getViewModel();!z||(X.pushUndoStop(),X.executeCommands(this.id,d.TypeOperations.indent(z.cursorConfig,X.getModel(),X.getSelections())),X.pushUndoStop())}}e.IndentLinesAction=E;class T extends w.EditorAction{constructor(){super({id:"editor.action.outdentLines",label:b.localize(15,null),alias:"Outdent Line",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:2048|87,weight:100}})}run(le,X){M.CoreEditingCommands.Outdent.runEditorCommand(le,X,null)}}class O extends w.EditorAction{constructor(){super({id:"editor.action.insertLineBefore",label:b.localize(16,null),alias:"Insert Line Above",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:2048|1024|3,weight:100}})}run(le,X){const z=X._getViewModel();!z||(X.pushUndoStop(),X.executeCommands(this.id,d.TypeOperations.lineInsertBefore(z.cursorConfig,X.getModel(),X.getSelections())))}}e.InsertLineBeforeAction=O;class A extends w.EditorAction{constructor(){super({id:"editor.action.insertLineAfter",label:b.localize(17,null),alias:"Insert Line Below",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:2048|3,weight:100}})}run(le,X){const z=X._getViewModel();!z||(X.pushUndoStop(),X.executeCommands(this.id,d.TypeOperations.lineInsertAfter(z.cursorConfig,X.getModel(),X.getSelections())))}}e.InsertLineAfterAction=A;class B extends w.EditorAction{run(le,X){if(!!X.hasModel()){const z=X.getSelection();let P=this._getRangesToDelete(X),V=[];for(let $=0,ie=P.length-1;$g.EditOperation.replace($,""));X.pushUndoStop(),X.executeEdits(this.id,H,U),X.pushUndoStop()}}}e.AbstractDeleteAllToBoundaryAction=B;class F extends B{constructor(){super({id:"deleteAllLeft",label:b.localize(18,null),alias:"Delete All Left",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.textInputFocus,primary:0,mac:{primary:2048|1},weight:100}})}_getEndCursorState(le,X){let z=null,P=[],V=0;return X.forEach(U=>{let H;if(U.endColumn===1&&V>0){let $=U.startLineNumber-V;H=new o.Selection($,U.startColumn,$,U.startColumn)}else H=new o.Selection(U.startLineNumber,U.startColumn,U.startLineNumber,U.startColumn);V+=U.endLineNumber-U.startLineNumber,U.intersectRanges(le)?z=H:P.push(H)}),z&&P.unshift(z),P}_getRangesToDelete(le){let X=le.getSelections();if(X===null)return[];let z=X,P=le.getModel();return P===null?[]:(z.sort(c.Range.compareRangesUsingStarts),z=z.map(V=>{if(V.isEmpty())if(V.startColumn===1){let U=Math.max(1,V.startLineNumber-1),H=V.startLineNumber===1?1:P.getLineContent(U).length+1;return new c.Range(U,H,V.startLineNumber,1)}else return new c.Range(V.startLineNumber,1,V.startLineNumber,V.startColumn);else return new c.Range(V.startLineNumber,1,V.endLineNumber,V.endColumn)}),z)}}e.DeleteAllLeftAction=F;class D extends B{constructor(){super({id:"deleteAllRight",label:b.localize(19,null),alias:"Delete All Right",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|41,secondary:[2048|20]},weight:100}})}_getEndCursorState(le,X){let z=null,P=[];for(let V=0,U=X.length,H=0;V{if(V.isEmpty()){const U=X.getLineMaxColumn(V.startLineNumber);return V.startColumn===U?new c.Range(V.startLineNumber,V.startColumn,V.startLineNumber+1,1):new c.Range(V.startLineNumber,V.startColumn,V.startLineNumber,U)}return V});return P.sort(c.Range.compareRangesUsingStarts),P}}e.DeleteAllRightAction=D;class R extends w.EditorAction{constructor(){super({id:"editor.action.joinLines",label:b.localize(20,null),alias:"Join Lines",precondition:s.EditorContextKeys.writable,kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:0,mac:{primary:256|40},weight:100}})}run(le,X){let z=X.getSelections();if(z!==null){let P=X.getSelection();if(P!==null){z.sort(c.Range.compareRangesUsingStarts);let V=[],U=z.reduce((G,j)=>G.isEmpty()?G.endLineNumber===j.startLineNumber?(P.equalsSelection(G)&&(P=j),j):j.startLineNumber>G.endLineNumber+1?(V.push(G),j):new o.Selection(G.startLineNumber,G.startColumn,j.endLineNumber,j.endColumn):j.startLineNumber>G.endLineNumber?(V.push(G),j):new o.Selection(G.startLineNumber,G.startColumn,j.endLineNumber,j.endColumn));V.push(U);let H=X.getModel();if(H!==null){let $=[],ie=[],oe=P,ae=0;for(let G=0,j=V.length;G=1){let Ee=!0;Ce===""&&(Ee=!1),Ee&&(Ce.charAt(Ce.length-1)===" "||Ce.charAt(Ce.length-1)===" ")&&(Ee=!1,Ce=Ce.replace(/[\s\uFEFF\xA0]+$/g," "));let Ae=De.substr(Re-1);Ce+=(Ee?" ":"")+Ae,Ee?he=Ae.length+1:he=Ae.length}else he=0}let be=new c.Range(Z,ue,re,ce);if(!be.isEmpty()){let Le;te.isEmpty()?($.push(g.EditOperation.replace(be,Ce)),Le=new o.Selection(be.startLineNumber-ae,Ce.length-he+1,Z-ae,Ce.length-he+1)):te.startLineNumber===te.endLineNumber?($.push(g.EditOperation.replace(be,Ce)),Le=new o.Selection(te.startLineNumber-ae,te.startColumn,te.endLineNumber-ae,te.endColumn)):($.push(g.EditOperation.replace(be,Ce)),Le=new o.Selection(te.startLineNumber-ae,te.startColumn,te.startLineNumber-ae,Ce.length-me)),c.Range.intersectRanges(be,P)!==null?oe=Le:ie.push(Le)}ae+=be.endLineNumber-be.startLineNumber}ie.unshift(oe),X.pushUndoStop(),X.executeEdits(this.id,$,ie),X.pushUndoStop()}}}}}e.JoinLinesAction=R;class W extends w.EditorAction{constructor(){super({id:"editor.action.transpose",label:b.localize(21,null),alias:"Transpose characters around the cursor",precondition:s.EditorContextKeys.writable})}run(le,X){let z=X.getSelections();if(z!==null){let P=X.getModel();if(P!==null){let V=[];for(let U=0,H=z.length;U=oe){if(ie.lineNumber===P.getLineCount())continue;let ae=new c.Range(ie.lineNumber,Math.max(1,ie.column-1),ie.lineNumber+1,1),G=P.getValueInRange(ae).split("").reverse().join("");V.push(new S.ReplaceCommand(new o.Selection(ie.lineNumber,Math.max(1,ie.column-1),ie.lineNumber+1,1),G))}else{let ae=new c.Range(ie.lineNumber,Math.max(1,ie.column-1),ie.lineNumber,ie.column+1),G=P.getValueInRange(ae).split("").reverse().join("");V.push(new S.ReplaceCommandThatPreservesSelection(ae,G,new o.Selection(ie.lineNumber,ie.column+1,ie.lineNumber,ie.column+1)))}}}X.pushUndoStop(),X.executeCommands(this.id,V),X.pushUndoStop()}}}}e.TransposeAction=W;class x extends w.EditorAction{run(le,X){const z=X.getSelections();if(z!==null){const P=X.getModel();if(P!==null){const V=X.getOption(110),U=[];for(const H of z)if(H.isEmpty()){const $=H.getStartPosition(),ie=X.getConfiguredWordAtPosition($);if(!ie)continue;const oe=new c.Range($.lineNumber,ie.startColumn,$.lineNumber,ie.endColumn),ae=P.getValueInRange(oe);U.push(g.EditOperation.replace(oe,this._modifyText(ae,V)))}else{const $=P.getValueInRange(H);U.push(g.EditOperation.replace(H,this._modifyText($,V)))}X.pushUndoStop(),X.executeEdits(this.id,U),X.pushUndoStop()}}}}e.AbstractCaseAction=x;class K extends x{constructor(){super({id:"editor.action.transformToUppercase",label:b.localize(22,null),alias:"Transform to Uppercase",precondition:s.EditorContextKeys.writable})}_modifyText(le,X){return le.toLocaleUpperCase()}}e.UpperCaseAction=K;class Y extends x{constructor(){super({id:"editor.action.transformToLowercase",label:b.localize(23,null),alias:"Transform to Lowercase",precondition:s.EditorContextKeys.writable})}_modifyText(le,X){return le.toLocaleLowerCase()}}e.LowerCaseAction=Y;class ee extends x{constructor(){super({id:"editor.action.transformToTitlecase",label:b.localize(24,null),alias:"Transform to Title Case",precondition:s.EditorContextKeys.writable})}_modifyText(le,X){const P=(`\r + `+X).split("");let V="",U=!0;for(let H=0;H=0?(U=!0,V+=$):U?(U=!1,V+=$.toLocaleUpperCase()):V+=$.toLocaleLowerCase()}return V}}e.TitleCaseAction=ee;class se extends x{constructor(){super({id:"editor.action.transformToSnakecase",label:b.localize(25,null),alias:"Transform to Snake Case",precondition:s.EditorContextKeys.writable})}_modifyText(le,X){return le.replace(/(\p{Ll})(\p{Lu})/gmu,"$1_$2").replace(/([^\b_])(\p{Lu})(\p{Ll})/gmu,"$1_$2$3").toLocaleLowerCase()}}e.SnakeCaseAction=se,w.registerEditorAction(t),w.registerEditorAction(l),w.registerEditorAction(h),w.registerEditorAction(_),w.registerEditorAction(f),w.registerEditorAction(y),w.registerEditorAction(L),w.registerEditorAction(I),w.registerEditorAction(k),w.registerEditorAction(E),w.registerEditorAction(T),w.registerEditorAction(O),w.registerEditorAction(A),w.registerEditorAction(F),w.registerEditorAction(D),w.registerEditorAction(R),w.registerEditorAction(W),w.registerEditorAction(K),w.registerEditorAction(Y),w.registerEditorAction(ee),w.registerEditorAction(se)}),define(Q[632],J([0,1,494,13,19,2,14,23,3,18,15,31,16,25,24,28,12,8,22,11,29,41]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.editorLinkedEditingBackground=e.LinkedEditingAction=e.LinkedEditingContribution=e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE=void 0,e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE=new o.RawContextKey("LinkedEditingInputVisible",!1);const m="linked-editing-decoration";let _=class vt extends w.Disposable{constructor(I,k){super();this._debounceDuration=200,this._localToDispose=this._register(new w.DisposableStore),this._editor=I,this._enabled=!1,this._visibleContextKey=e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE.bindTo(k),this._currentDecorations=[],this._languageWordPattern=null,this._currentWordPattern=null,this._ignoreChangeEvent=!1,this._localToDispose=this._register(new w.DisposableStore),this._rangeUpdateTriggerPromise=null,this._rangeSyncTriggerPromise=null,this._currentRequest=null,this._currentRequestPosition=null,this._currentRequestModelVersion=null,this._register(this._editor.onDidChangeModel(()=>this.reinitialize())),this._register(this._editor.onDidChangeConfiguration(E=>{(E.hasChanged(56)||E.hasChanged(76))&&this.reinitialize()})),this._register(g.LinkedEditingRangeProviderRegistry.onDidChange(()=>this.reinitialize())),this._register(this._editor.onDidChangeModelLanguage(()=>this.reinitialize())),this.reinitialize()}static get(I){return I.getContribution(vt.ID)}reinitialize(){const I=this._editor.getModel(),k=I!==null&&(this._editor.getOption(56)||this._editor.getOption(76))&&g.LinkedEditingRangeProviderRegistry.has(I);if(k!==this._enabled&&(this._enabled=k,this.clearRanges(),this._localToDispose.clear(),!(!k||I===null))){this._languageWordPattern=h.LanguageConfigurationRegistry.getWordDefinition(I.getLanguageIdentifier().id),this._localToDispose.add(I.onDidChangeLanguageConfiguration(()=>{this._languageWordPattern=h.LanguageConfigurationRegistry.getWordDefinition(I.getLanguageIdentifier().id)}));const E=new p.Delayer(this._debounceDuration),T=()=>{this._rangeUpdateTriggerPromise=E.trigger(()=>this.updateRanges(),this._debounceDuration)},O=new p.Delayer(0),A=B=>{this._rangeSyncTriggerPromise=O.trigger(()=>this._syncRanges(B))};this._localToDispose.add(this._editor.onDidChangeCursorPosition(()=>{T()})),this._localToDispose.add(this._editor.onDidChangeModelContent(B=>{if(!this._ignoreChangeEvent&&this._currentDecorations.length>0){const F=I.getDecorationRange(this._currentDecorations[0]);if(F&&B.changes.every(D=>F.intersectRanges(D.range))){A(this._currentDecorations);return}}T()})),this._localToDispose.add({dispose:()=>{E.cancel(),O.cancel()}}),this.updateRanges()}}_syncRanges(I){if(!(!this._editor.hasModel()||I!==this._currentDecorations||I.length===0)){const k=this._editor.getModel(),E=k.getDecorationRange(I[0]);if(!E||E.startLineNumber!==E.endLineNumber)return this.clearRanges();const T=k.getValueInRange(E);if(this._currentWordPattern){const A=T.match(this._currentWordPattern);if((A?A[0].length:0)!==T.length)return this.clearRanges()}let O=[];for(let A=1,B=I.length;A1){this.clearRanges();return}const E=this._editor.getModel(),T=E.getVersionId();if(this._currentRequestPosition&&this._currentRequestModelVersion===T){if(k.equals(this._currentRequestPosition))return;if(this._currentDecorations&&this._currentDecorations.length>0){const A=E.getDecorationRange(this._currentDecorations[0]);if(A&&A.containsPosition(k))return}}this._currentRequestPosition=k,this._currentRequestModelVersion=T;const O=p.createCancelablePromise(A=>Ie(this,void 0,void 0,function*(){try{const B=yield y(E,k,A);if(O!==this._currentRequest||(this._currentRequest=null,T!==E.getVersionId()))return;let F=[];(B==null?void 0:B.ranges)&&(F=B.ranges),this._currentWordPattern=(B==null?void 0:B.wordPattern)||this._languageWordPattern;let D=!1;for(let W=0,x=F.length;W({range:W,options:vt.DECORATION}));this._visibleContextKey.set(!0),this._currentDecorations=this._editor.deltaDecorations(this._currentDecorations,R)}catch(B){r.isPromiseCanceledError(B)||r.onUnexpectedError(B),(this._currentRequest===O||!this._currentRequest)&&this.clearRanges()}}));return this._currentRequest=O,O})}};_.ID="editor.contrib.linkedEditing",_.DECORATION=c.ModelDecorationOptions.register({stickiness:0,className:m}),_=Me([_e(1,o.IContextKeyService)],_),e.LinkedEditingContribution=_;class f extends N.EditorAction{constructor(){super({id:"editor.action.linkedEditing",label:b.localize(0,null),alias:"Start Linked Editing",precondition:o.ContextKeyExpr.and(s.EditorContextKeys.writable,s.EditorContextKeys.hasRenameProvider),kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,primary:2048|1024|60,weight:100}})}runCommand(I,k){const E=I.get(u.ICodeEditorService),[T,O]=Array.isArray(k)&&k||[void 0,void 0];return a.URI.isUri(T)&&S.Position.isIPosition(O)?E.openCodeEditor({resource:T},E.getActiveCodeEditor()).then(A=>{!A||(A.setPosition(O),A.invokeWithinContext(B=>(this.reportTelemetry(B,A),this.run(B,A))))},r.onUnexpectedError):super.runCommand(I,k)}run(I,k){const E=_.get(k);return E?Promise.resolve(E.updateRanges(!0)):Promise.resolve()}}e.LinkedEditingAction=f;const v=N.EditorCommand.bindToContribution(_.get);N.registerEditorCommand(new v({id:"cancelLinkedEditingInput",precondition:e.CONTEXT_ONTYPE_RENAME_INPUT_VISIBLE,handler:L=>L.clearRanges(),kbOpts:{kbExpr:s.EditorContextKeys.editorTextFocus,weight:100+99,primary:9,secondary:[1024|9]}}));function y(L,I,k){const E=g.LinkedEditingRangeProviderRegistry.ordered(L);return p.first(E.map(T=>()=>Ie(this,void 0,void 0,function*(){try{return yield T.provideLinkedEditingRanges(L,I,k)}catch(O){r.onUnexpectedExternalError(O);return}})),T=>!!T&&M.isNonEmptyArray(T==null?void 0:T.ranges))}e.editorLinkedEditingBackground=n.registerColor("editor.linkedEditingBackground",{dark:l.Color.fromHex("#f00").transparent(.3),light:l.Color.fromHex("#f00").transparent(.3),hc:l.Color.fromHex("#f00").transparent(.3)},b.localize(1,null)),t.registerThemingParticipant((L,I)=>{const k=L.getColor(e.editorLinkedEditingBackground);k&&I.addRule(`.monaco-editor .${m} { background: ${k}; border-left-color: ${k}; }`)}),N.registerModelAndPositionCommand("_executeLinkedEditingProvider",(L,I)=>y(L,I,C.CancellationToken.None)),N.registerEditorContribution(_.ID,_),N.registerEditorAction(f)}),define(Q[633],J([0,1,495,15,23,12,73,2,17,13,31,18,227,546,32,58,22,11,24,43,44,346]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LinkDetector=void 0;function h(y,L){const I=y.url&&/^command:/i.test(y.url.toString()),k=y.tooltip?y.tooltip:I?b.localize(0,null):b.localize(1,null),E=L?d.isMacintosh?b.localize(2,null):b.localize(3,null):d.isMacintosh?b.localize(4,null):b.localize(5,null);if(y.url){let T="";if(/^command:/i.test(y.url.toString())){const A=y.url.toString().match(/^command:([^?#]+)/);if(A){const B=A[1];T=` "${b.localize(6,null,B)}"`}}return new S.MarkdownString("",!0).appendMarkdown(`[${k}](${y.url.toString(!0)}${T}) (${E})`)}else return new S.MarkdownString().appendText(`${k} (${E})`)}const m={general:p.ModelDecorationOptions.register({stickiness:1,collapseOnReplaceEdit:!0,inlineClassName:"detected-link"}),active:p.ModelDecorationOptions.register({stickiness:1,collapseOnReplaceEdit:!0,inlineClassName:"detected-link-active"})};class _{constructor(L,I){this.link=L,this.decorationId=I}static decoration(L,I){return{range:L.range,options:_._getOptions(L,I,!1)}}static _getOptions(L,I,k){const E=Object.assign({},k?m.active:m.general);return E.hoverMessage=h(L,I),E}activate(L,I){L.changeDecorationOptions(this.decorationId,_._getOptions(this.link,I,!0))}deactivate(L,I){L.changeDecorationOptions(this.decorationId,_._getOptions(this.link,I,!1))}}let f=class bt{constructor(L,I,k){this.listenersToRemove=new C.DisposableStore,this.editor=L,this.openerService=I,this.notificationService=k;let E=new o.ClickLinkGesture(L);this.listenersToRemove.add(E),this.listenersToRemove.add(E.onMouseMoveOrRelevantKeyDown(([T,O])=>{this._onEditorMouseMove(T,O)})),this.listenersToRemove.add(E.onExecute(T=>{this.onEditorMouseUp(T)})),this.listenersToRemove.add(E.onCancel(T=>{this.cleanUpActiveLinkDecoration()})),this.enabled=L.getOption(57),this.listenersToRemove.add(L.onDidChangeConfiguration(T=>{const O=L.getOption(57);this.enabled!==O&&(this.enabled=O,this.updateDecorations([]),this.stop(),this.beginCompute())})),this.listenersToRemove.add(L.onDidChangeModelContent(T=>this.onChange())),this.listenersToRemove.add(L.onDidChangeModel(T=>this.onModelChanged())),this.listenersToRemove.add(L.onDidChangeModelLanguage(T=>this.onModelModeChanged())),this.listenersToRemove.add(c.LinkProviderRegistry.onDidChange(T=>this.onModelModeChanged())),this.timeout=new N.TimeoutTimer,this.computePromise=null,this.activeLinksList=null,this.currentOccurrences={},this.activeLinkDecorationId=null,this.beginCompute()}static get(L){return L.getContribution(bt.ID)}onModelChanged(){this.currentOccurrences={},this.activeLinkDecorationId=null,this.stop(),this.beginCompute()}onModelModeChanged(){this.stop(),this.beginCompute()}onChange(){this.timeout.setIfNotSet(()=>this.beginCompute(),bt.RECOMPUTE_TIME)}beginCompute(){return Ie(this,void 0,void 0,function*(){if(!(!this.editor.hasModel()||!this.enabled)){const L=this.editor.getModel();if(!!c.LinkProviderRegistry.has(L)){this.activeLinksList&&(this.activeLinksList.dispose(),this.activeLinksList=null),this.computePromise=N.createCancelablePromise(I=>s.getLinks(L,I));try{this.activeLinksList=yield this.computePromise,this.updateDecorations(this.activeLinksList.links)}catch(I){w.onUnexpectedError(I)}finally{this.computePromise=null}}}})}updateDecorations(L){const I=this.editor.getOption(64)==="altKey";let k=[],E=Object.keys(this.currentOccurrences);for(let A=0,B=E.length;A{E.activate(T,k),this.activeLinkDecorationId=E.decorationId})}else this.cleanUpActiveLinkDecoration()}cleanUpActiveLinkDecoration(){const L=this.editor.getOption(64)==="altKey";if(this.activeLinkDecorationId){const I=this.currentOccurrences[this.activeLinkDecorationId];I&&this.editor.changeDecorations(k=>{I.deactivate(k,L)}),this.activeLinkDecorationId=null}}onEditorMouseUp(L){if(!!this.isEnabled(L)){const I=this.getLinkOccurrence(L.target.position);!I||this.openLinkOccurrence(I,L.hasSideBySideModifier,!0)}}openLinkOccurrence(L,I,k=!1){if(!!this.openerService){const{link:E}=L;E.resolve(M.CancellationToken.None).then(T=>{if(typeof T=="string"&&this.editor.hasModel()){const O=this.editor.getModel().uri;if(O.scheme===t.Schemas.file&&T.startsWith(`${t.Schemas.file}:`)){const A=n.URI.parse(T);if(A.scheme===t.Schemas.file){const B=l.originalFSPath(A);let F=null;B.startsWith("/./")?F=`.${B.substr(1)}`:B.startsWith("//./")&&(F=`.${B.substr(2)}`),F&&(T=l.joinPath(O,F))}}}return this.openerService.open(T,{openToSide:I,fromUserGesture:k,allowContributedOpeners:!0})},T=>{const O=T instanceof Error?T.message:T;O==="invalid"?this.notificationService.warn(b.localize(7,null,E.url.toString())):O==="missing"?this.notificationService.warn(b.localize(8,null)):w.onUnexpectedError(T)})}}getLinkOccurrence(L){if(!this.editor.hasModel()||!L)return null;const I=this.editor.getModel().getDecorationsInRange({startLineNumber:L.lineNumber,startColumn:L.column,endLineNumber:L.lineNumber,endColumn:L.column},0,!0);for(const k of I){const E=this.currentOccurrences[k.id];if(E)return E}return null}isEnabled(L,I){return Boolean(L.target.type===6&&(L.hasTriggerModifier||I&&I.keyCodeIsTriggerKey))}stop(){var L;this.timeout.cancel(),this.activeLinksList&&((L=this.activeLinksList)===null||L===void 0||L.dispose(),this.activeLinksList=null),this.computePromise&&(this.computePromise.cancel(),this.computePromise=null)}dispose(){this.listenersToRemove.dispose(),this.stop(),this.timeout.dispose()}};f.ID="editor.linkDetector",f.RECOMPUTE_TIME=1e3,f=Me([_e(1,u.IOpenerService),_e(2,a.INotificationService)],f),e.LinkDetector=f;class v extends g.EditorAction{constructor(){super({id:"editor.action.openLink",label:b.localize(9,null),alias:"Open Link",precondition:void 0})}run(L,I){let k=f.get(I);if(!!k&&!!I.hasModel()){let E=I.getSelections();for(let T of E){let O=k.getLinkOccurrence(T.getEndPosition());O&&k.openLinkOccurrence(O,!1)}}}}g.registerEditorContribution(f.ID,f),g.registerEditorAction(v),i.registerThemingParticipant((y,L)=>{const I=y.getColor(r.editorActiveLinkForeground);I&&L.addRule(`.monaco-editor .detected-link-active { color: ${I} !important; }`)})}),define(Q[146],J([0,1,496,15,2,47,3,13,16,11,22,97,347]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MessageController=void 0;let o=class St{constructor(r,i){this._messageWidget=new M.MutableDisposable,this._messageListeners=new M.DisposableStore,this._editor=r,this._visible=St.MESSAGE_VISIBLE.bindTo(i),this._editorListener=this._editor.onDidAttemptReadOnlyEdit(()=>this._onDidAttemptReadOnlyEdit())}static get(r){return r.getContribution(St.ID)}dispose(){this._editorListener.dispose(),this._messageListeners.dispose(),this._messageWidget.dispose(),this._visible.reset()}showMessage(r,i){w.alert(r),this._visible.set(!0),this._messageWidget.clear(),this._messageListeners.clear(),this._messageWidget.value=new a(this._editor,i,r),this._messageListeners.add(this._editor.onDidBlurEditorText(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidChangeCursorPosition(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidDispose(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidChangeModel(()=>this.closeMessage())),this._messageListeners.add(new N.TimeoutTimer(()=>this.closeMessage(),3e3));let n;this._messageListeners.add(this._editor.onMouseMove(t=>{!t.target.position||(n?n.containsPosition(t.target.position)||this.closeMessage():n=new S.Range(i.lineNumber-3,1,t.target.position.lineNumber+3,1))}))}closeMessage(){this._visible.reset(),this._messageListeners.clear(),this._messageWidget.value&&this._messageListeners.add(a.fadeOut(this._messageWidget.value))}_onDidAttemptReadOnlyEdit(){this._editor.hasModel()&&this.showMessage(b.localize(1,null),this._editor.getPosition())}};o.ID="editor.contrib.messageController",o.MESSAGE_VISIBLE=new d.RawContextKey("messageVisible",!1,b.localize(0,null)),o=Me([_e(1,d.IContextKeyService)],o),e.MessageController=o;const s=C.EditorCommand.bindToContribution(o.get);C.registerEditorCommand(new s({id:"leaveEditorMessage",precondition:o.MESSAGE_VISIBLE,handler:u=>u.closeMessage(),kbOpts:{weight:100+30,primary:9}}));class a{constructor(r,{lineNumber:i,column:n},t){this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._editor=r,this._editor.revealLinesInCenterIfOutsideViewport(i,i,0),this._position={lineNumber:i,column:n-1},this._domNode=document.createElement("div"),this._domNode.classList.add("monaco-editor-overlaymessage");const l=document.createElement("div");l.classList.add("anchor","top"),this._domNode.appendChild(l);const h=document.createElement("div");h.classList.add("message"),h.textContent=t,this._domNode.appendChild(h);const m=document.createElement("div");m.classList.add("anchor","below"),this._domNode.appendChild(m),this._editor.addContentWidget(this),this._domNode.classList.add("fadeIn")}static fadeOut(r){let i;const n=()=>{r.dispose(),clearTimeout(i),r.getDomNode().removeEventListener("animationend",n)};return i=setTimeout(n,110),r.getDomNode().addEventListener("animationend",n),r.getDomNode().classList.add("fadeOut"),{dispose:n}}dispose(){this._editor.removeContentWidget(this)}getId(){return"messageoverlay"}getDomNode(){return this._domNode}getPosition(){return{position:this._position,preference:[1,2]}}afterRender(r){this._domNode.classList.toggle("below",r===2)}}C.registerEditorContribution(o.ID,o),g.registerThemingParticipant((u,r)=>{const i=u.getColor(p.inputValidationInfoBorder);if(i){let l=u.type===c.ColorScheme.HIGH_CONTRAST?2:1;r.addRule(`.monaco-editor .monaco-editor-overlaymessage .anchor.below { border-top-color: ${i}; }`),r.addRule(`.monaco-editor .monaco-editor-overlaymessage .anchor.top { border-bottom-color: ${i}; }`),r.addRule(`.monaco-editor .monaco-editor-overlaymessage .message { border: ${l}px solid ${i}; }`)}const n=u.getColor(p.inputValidationInfoBackground);n&&r.addRule(`.monaco-editor .monaco-editor-overlaymessage .message { background-color: ${n}; }`);const t=u.getColor(p.inputValidationInfoForeground);t&&r.addRule(`.monaco-editor .monaco-editor-overlaymessage .message { color: ${t}; }`)})});var _t=this&&this.__classPrivateFieldSet||function(q,e,b){if(!e.has(q))throw new TypeError("attempted to set private field on non-instance");return e.set(q,b),b},tt=this&&this.__classPrivateFieldGet||function(q,e){if(!e.has(q))throw new TypeError("attempted to get private field on non-instance");return e.get(q)};define(Q[634],J([0,1,12,150,2,146,9,616,595]),function(q,e,b,N,M,w,S,C,d){"use strict";var g;Object.defineProperty(e,"__esModule",{value:!0}),e.CodeActionUi=void 0;let p=class extends M.Disposable{constructor(o,s,a,u,r){super();this._editor=o,this.delegate=u,this._activeCodeActions=this._register(new M.MutableDisposable),g.set(this,!1),this._codeActionWidget=new N.Lazy(()=>this._register(r.createInstance(C.CodeActionMenu,this._editor,{onSelectCodeAction:i=>Ie(this,void 0,void 0,function*(){this.delegate.applyCodeAction(i,!0)})}))),this._lightBulbWidget=new N.Lazy(()=>{const i=this._register(r.createInstance(d.LightBulbWidget,this._editor,s,a));return this._register(i.onClick(n=>this.showCodeActionList(n.trigger,n.actions,n,{includeDisabledActions:!1}))),i})}dispose(){_t(this,g,!0),super.dispose()}update(o){var s,a,u;return Ie(this,void 0,void 0,function*(){if(o.type!==1){(s=this._lightBulbWidget.rawValue)===null||s===void 0||s.hide();return}let r;try{r=yield o.actions}catch(i){b.onUnexpectedError(i);return}if(!tt(this,g))if(this._lightBulbWidget.getValue().update(r,o.trigger,o.position),o.trigger.type===2){if((a=o.trigger.filter)===null||a===void 0?void 0:a.include){const n=this.tryGetValidActionToApply(o.trigger,r);if(n){try{yield this.delegate.applyCodeAction(n,!1)}finally{r.dispose()}return}if(o.trigger.context){const t=this.getInvalidActionThatWouldHaveBeenApplied(o.trigger,r);if(t&&t.action.disabled){w.MessageController.get(this._editor).showMessage(t.action.disabled,o.trigger.context.position),r.dispose();return}}}const i=!!((u=o.trigger.filter)===null||u===void 0?void 0:u.include);if(o.trigger.context&&(!r.allActions.length||!i&&!r.validActions.length)){w.MessageController.get(this._editor).showMessage(o.trigger.context.notAvailableMessage,o.trigger.context.position),this._activeCodeActions.value=r,r.dispose();return}this._activeCodeActions.value=r,this._codeActionWidget.getValue().show(o.trigger,r,o.position,{includeDisabledActions:i})}else this._codeActionWidget.getValue().isVisible?r.dispose():this._activeCodeActions.value=r})}getInvalidActionThatWouldHaveBeenApplied(o,s){if(!!s.allActions.length&&(o.autoApply==="first"&&s.validActions.length===0||o.autoApply==="ifSingle"&&s.allActions.length===1))return s.allActions.find(({action:a})=>a.disabled)}tryGetValidActionToApply(o,s){if(!!s.validActions.length&&(o.autoApply==="first"&&s.validActions.length>0||o.autoApply==="ifSingle"&&s.validActions.length===1))return s.validActions[0]}showCodeActionList(o,s,a,u){return Ie(this,void 0,void 0,function*(){this._codeActionWidget.getValue().show(o,s,a,u)})}};g=new WeakMap,p=Me([_e(4,S.IInstantiationService)],p),e.CodeActionUi=p}),define(Q[263],J([0,1,23,150,2,8,13,133,25,145,634,146,466,26,16,9,85,32,59,87,617,130]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AutoFixAction=e.FixAllAction=e.OrganizeImportsAction=e.SourceAction=e.RefactorAction=e.CodeActionCommand=e.QuickFixAction=e.applyCodeAction=e.QuickFixController=void 0;function m(F){return a.ContextKeyExpr.regex(l.SUPPORTED_CODE_ACTIONS.keys()[0],new RegExp("(\\s|^)"+w.escapeRegExpCharacters(F.value)+"\\b"))}const _={type:"object",defaultSnippets:[{body:{kind:""}}],properties:{kind:{type:"string",description:o.localize(0,null)},apply:{type:"string",description:o.localize(1,null),default:"ifSingle",enum:["first","ifSingle","never"],enumDescriptions:[o.localize(2,null),o.localize(3,null),o.localize(4,null)]},preferred:{type:"boolean",default:!1,description:o.localize(5,null)}}};let f=class xt extends M.Disposable{constructor(D,R,W,x,K){super();this._instantiationService=K,this._editor=D,this._model=this._register(new l.CodeActionModel(this._editor,R,W,x)),this._register(this._model.onDidChangeState(Y=>this.update(Y))),this._ui=new N.Lazy(()=>this._register(new p.CodeActionUi(D,I.Id,B.Id,{applyCodeAction:(Y,ee)=>Ie(this,void 0,void 0,function*(){try{yield this._applyCodeAction(Y)}finally{ee&&this._trigger({type:1,filter:{}})}})},this._instantiationService)))}static get(D){return D.getContribution(xt.ID)}update(D){this._ui.getValue().update(D)}showCodeActions(D,R,W){return this._ui.getValue().showCodeActionList(D,R,W,{includeDisabledActions:!1})}manualTriggerAtCurrentPosition(D,R,W){if(!!this._editor.hasModel()){c.MessageController.get(this._editor).closeMessage();const x=this._editor.getPosition();this._trigger({type:2,filter:R,autoApply:W,context:{notAvailableMessage:D,position:x}})}}_trigger(D){return this._model.trigger(D)}_applyCodeAction(D){return this._instantiationService.invokeFunction(v,D,this._editor)}};f.ID="editor.contrib.quickFixController",f=Me([_e(1,r.IMarkerService),_e(2,a.IContextKeyService),_e(3,n.IEditorProgressService),_e(4,u.IInstantiationService)],f),e.QuickFixController=f;function v(F,D,R){return Ie(this,void 0,void 0,function*(){const W=F.get(C.IBulkEditService),x=F.get(s.ICommandService),K=F.get(t.ITelemetryService),Y=F.get(i.INotificationService);if(K.publicLog2("codeAction.applyCodeAction",{codeActionTitle:D.action.title,codeActionKind:D.action.kind,codeActionIsPreferred:!!D.action.isPreferred}),yield D.resolve(b.CancellationToken.None),D.action.edit&&(yield W.apply(C.ResourceEdit.convert(D.action.edit),{editor:R,label:D.action.title})),D.action.command)try{yield x.executeCommand(D.action.command.id,...D.action.command.arguments||[])}catch(ee){const se=y(ee);Y.error(typeof se=="string"?se:o.localize(6,null))}})}e.applyCodeAction=v;function y(F){return typeof F=="string"?F:F instanceof Error&&typeof F.message=="string"?F.message:void 0}function L(F,D,R,W){if(F.hasModel()){const x=f.get(F);x&&x.manualTriggerAtCurrentPosition(D,R,W)}}class I extends S.EditorAction{constructor(){super({id:I.Id,label:o.localize(7,null),alias:"Quick Fix...",precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,d.EditorContextKeys.hasCodeActionsProvider),kbOpts:{kbExpr:d.EditorContextKeys.editorTextFocus,primary:2048|84,weight:100}})}run(D,R){return L(R,o.localize(8,null),void 0,void 0)}}e.QuickFixAction=I,I.Id="editor.action.quickFix";class k extends S.EditorCommand{constructor(){super({id:g.codeActionCommandId,precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,d.EditorContextKeys.hasCodeActionsProvider),description:{description:"Trigger a code action",args:[{name:"args",schema:_}]}})}runEditorCommand(D,R,W){const x=h.CodeActionCommandArgs.fromUser(W,{kind:h.CodeActionKind.Empty,apply:"ifSingle"});return L(R,typeof(W==null?void 0:W.kind)=="string"?x.preferred?o.localize(9,null,W.kind):o.localize(10,null,W.kind):x.preferred?o.localize(11,null):o.localize(12,null),{include:x.kind,includeSourceActions:!0,onlyIncludePreferredActions:x.preferred},x.apply)}}e.CodeActionCommand=k;class E extends S.EditorAction{constructor(){super({id:g.refactorCommandId,label:o.localize(13,null),alias:"Refactor...",precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,d.EditorContextKeys.hasCodeActionsProvider),kbOpts:{kbExpr:d.EditorContextKeys.editorTextFocus,primary:2048|1024|48,mac:{primary:256|1024|48},weight:100},contextMenuOpts:{group:"1_modification",order:2,when:a.ContextKeyExpr.and(d.EditorContextKeys.writable,m(h.CodeActionKind.Refactor))},description:{description:"Refactor...",args:[{name:"args",schema:_}]}})}run(D,R,W){const x=h.CodeActionCommandArgs.fromUser(W,{kind:h.CodeActionKind.Refactor,apply:"never"});return L(R,typeof(W==null?void 0:W.kind)=="string"?x.preferred?o.localize(14,null,W.kind):o.localize(15,null,W.kind):x.preferred?o.localize(16,null):o.localize(17,null),{include:h.CodeActionKind.Refactor.contains(x.kind)?x.kind:h.CodeActionKind.None,onlyIncludePreferredActions:x.preferred},x.apply)}}e.RefactorAction=E;class T extends S.EditorAction{constructor(){super({id:g.sourceActionCommandId,label:o.localize(18,null),alias:"Source Action...",precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,d.EditorContextKeys.hasCodeActionsProvider),contextMenuOpts:{group:"1_modification",order:2.1,when:a.ContextKeyExpr.and(d.EditorContextKeys.writable,m(h.CodeActionKind.Source))},description:{description:"Source Action...",args:[{name:"args",schema:_}]}})}run(D,R,W){const x=h.CodeActionCommandArgs.fromUser(W,{kind:h.CodeActionKind.Source,apply:"never"});return L(R,typeof(W==null?void 0:W.kind)=="string"?x.preferred?o.localize(19,null,W.kind):o.localize(20,null,W.kind):x.preferred?o.localize(21,null):o.localize(22,null),{include:h.CodeActionKind.Source.contains(x.kind)?x.kind:h.CodeActionKind.None,includeSourceActions:!0,onlyIncludePreferredActions:x.preferred},x.apply)}}e.SourceAction=T;class O extends S.EditorAction{constructor(){super({id:g.organizeImportsCommandId,label:o.localize(23,null),alias:"Organize Imports",precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,m(h.CodeActionKind.SourceOrganizeImports)),kbOpts:{kbExpr:d.EditorContextKeys.editorTextFocus,primary:1024|512|45,weight:100}})}run(D,R){return L(R,o.localize(24,null),{include:h.CodeActionKind.SourceOrganizeImports,includeSourceActions:!0},"ifSingle")}}e.OrganizeImportsAction=O;class A extends S.EditorAction{constructor(){super({id:g.fixAllCommandId,label:o.localize(25,null),alias:"Fix All",precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,m(h.CodeActionKind.SourceFixAll))})}run(D,R){return L(R,o.localize(26,null),{include:h.CodeActionKind.SourceFixAll,includeSourceActions:!0},"ifSingle")}}e.FixAllAction=A;class B extends S.EditorAction{constructor(){super({id:B.Id,label:o.localize(27,null),alias:"Auto Fix...",precondition:a.ContextKeyExpr.and(d.EditorContextKeys.writable,m(h.CodeActionKind.QuickFix)),kbOpts:{kbExpr:d.EditorContextKeys.editorTextFocus,primary:512|1024|84,mac:{primary:2048|512|84},weight:100}})}run(D,R){return L(R,o.localize(28,null),{include:h.CodeActionKind.QuickFix,onlyIncludePreferredActions:!0},"ifSingle")}}e.AutoFixAction=B,B.Id="editor.action.autoFix"}),define(Q[635],J([0,1,13,263]),function(q,e,b,N){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),b.registerEditorContribution(N.QuickFixController.ID,N.QuickFixController),b.registerEditorAction(N.QuickFixAction),b.registerEditorAction(N.RefactorAction),b.registerEditorAction(N.SourceAction),b.registerEditorAction(N.OrganizeImportsAction),b.registerEditorAction(N.AutoFixAction),b.registerEditorAction(N.FixAllAction),b.registerEditorCommand(new N.CodeActionCommand)}),define(Q[636],J([0,1,503,12,16,59,13,25,604,18,14,47,3,146,70,32,133,24,28,23,2,15,77,9,33,95,137,20]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RenameAction=e.rename=void 0;class I{constructor(B,F){this.model=B,this.position=F,this._providerRenameIdx=0,this._providers=g.RenameProviderRegistry.ordered(B)}hasProvider(){return this._providers.length>0}resolveRenameLocation(B){return Ie(this,void 0,void 0,function*(){const F=[];for(this._providerRenameIdx=0;this._providerRenameIdx0?F.join(` +`):void 0}:{range:o.Range.fromPositions(this.position),text:"",rejectReason:F.length>0?F.join(` +`):void 0}})}provideRenameEdits(B,F){return Ie(this,void 0,void 0,function*(){return this._provideRenameEdits(B,this._providerRenameIdx,[],F)})}_provideRenameEdits(B,F,D,R){return Ie(this,void 0,void 0,function*(){const W=this._providers[F];if(!W)return{edits:[],rejectReason:D.join(` +`)};const x=yield W.provideRenameEdits(this.model,this.position,B,R);if(x){if(x.rejectReason)return this._provideRenameEdits(B,F+1,D.concat(x.rejectReason),R)}else return this._provideRenameEdits(B,F+1,D.concat(b.localize(0,null)),R);return x})}}function k(A,B,F){return Ie(this,void 0,void 0,function*(){const D=new I(A,B),R=yield D.resolveRenameLocation(t.CancellationToken.None);return(R==null?void 0:R.rejectReason)?{edits:[],rejectReason:R.rejectReason}:D.provideRenameEdits(F,t.CancellationToken.None)})}e.rename=k;let E=class Vt{constructor(B,F,D,R,W,x,K){this.editor=B,this._instaService=F,this._notificationService=D,this._bulkEditService=R,this._progressService=W,this._logService=x,this._configService=K,this._dispoableStore=new l.DisposableStore,this._cts=new t.CancellationTokenSource,this._renameInputField=this._dispoableStore.add(new h.IdleValue(()=>this._dispoableStore.add(this._instaService.createInstance(d.RenameInputField,this.editor,["acceptRenameInput","acceptRenameInputWithPreview"]))))}static get(B){return B.getContribution(Vt.ID)}dispose(){this._dispoableStore.dispose(),this._cts.dispose(!0)}run(){return Ie(this,void 0,void 0,function*(){if(this._cts.dispose(!0),!!this.editor.hasModel()){const B=this.editor.getPosition(),F=new I(this.editor.getModel(),B);if(!!F.hasProvider()){this._cts=new a.EditorStateCancellationTokenSource(this.editor,4|1);let D;try{const se=F.resolveRenameLocation(this._cts.token);this._progressService.showWhile(se,250),D=yield se}catch(se){s.MessageController.get(this.editor).showMessage(se||b.localize(1,null),B);return}if(!!D){if(D.rejectReason){s.MessageController.get(this.editor).showMessage(D.rejectReason,B);return}if(!this._cts.token.isCancellationRequested){this._cts.dispose(),this._cts=new a.EditorStateCancellationTokenSource(this.editor,4|1,D.range);let R=this.editor.getSelection(),W=0,x=D.text.length;!o.Range.isEmpty(R)&&!o.Range.spansMultipleLines(R)&&o.Range.containsRange(D.range,R)&&(W=Math.max(0,R.startColumn-D.range.startColumn),x=Math.min(D.range.endColumn,R.endColumn)-D.range.startColumn);const K=this._bulkEditService.hasPreviewHandler()&&this._configService.getValue(this.editor.getModel().uri,"editor.rename.enablePreview"),Y=yield this._renameInputField.value.getInput(D.range,D.text,W,x,K,this._cts.token);if(typeof Y=="boolean"){Y&&this.editor.focus();return}this.editor.focus();const ee=h.raceCancellation(F.provideRenameEdits(Y.newName,this._cts.token),this._cts.token).then(se=>Ie(this,void 0,void 0,function*(){if(!(!se||!this.editor.hasModel())){if(se.rejectReason){this._notificationService.info(se.rejectReason);return}this._bulkEditService.apply(r.ResourceEdit.convert(se),{editor:this.editor,showPreview:Y.wantsPreview,label:b.localize(2,null,D==null?void 0:D.text),quotableLabel:b.localize(3,null,D==null?void 0:D.text)}).then(ne=>{ne.ariaSummary&&c.alert(b.localize(4,null,D.text,Y.newName,ne.ariaSummary))}).catch(ne=>{this._notificationService.error(b.localize(5,null)),this._logService.error(ne)})}}),se=>{this._notificationService.error(b.localize(6,null)),this._logService.error(se)});return this._progressService.showWhile(ee,250),ee}}}}})}acceptRenameInput(B){this._renameInputField.value.acceptInput(B)}cancelRenameInput(){this._renameInputField.value.cancelInput(!0)}};E.ID="editor.contrib.renameController",E=Me([_e(1,_.IInstantiationService),_e(2,u.INotificationService),_e(3,r.IBulkEditService),_e(4,w.IEditorProgressService),_e(5,m.ILogService),_e(6,y.ITextResourceConfigurationService)],E);class T extends S.EditorAction{constructor(){super({id:"editor.action.rename",label:b.localize(7,null),alias:"Rename Symbol",precondition:M.ContextKeyExpr.and(C.EditorContextKeys.writable,C.EditorContextKeys.hasRenameProvider),kbOpts:{kbExpr:C.EditorContextKeys.editorTextFocus,primary:60,weight:100},contextMenuOpts:{group:"1_modification",order:1.1}})}runCommand(B,F){const D=B.get(n.ICodeEditorService),[R,W]=Array.isArray(F)&&F||[void 0,void 0];return i.URI.isUri(R)&&p.Position.isIPosition(W)?D.openCodeEditor({resource:R},D.getActiveCodeEditor()).then(x=>{!x||(x.setPosition(W),x.invokeWithinContext(K=>(this.reportTelemetry(K,x),this.run(K,x))))},N.onUnexpectedError):super.runCommand(B,F)}run(B,F){const D=E.get(F);return D?D.run():Promise.resolve()}}e.RenameAction=T,S.registerEditorContribution(E.ID,E),S.registerEditorAction(T);const O=S.EditorCommand.bindToContribution(E.get);S.registerEditorCommand(new O({id:"acceptRenameInput",precondition:d.CONTEXT_RENAME_INPUT_VISIBLE,handler:A=>A.acceptRenameInput(!1),kbOpts:{weight:100+99,kbExpr:C.EditorContextKeys.focus,primary:3}})),S.registerEditorCommand(new O({id:"acceptRenameInputWithPreview",precondition:M.ContextKeyExpr.and(d.CONTEXT_RENAME_INPUT_VISIBLE,M.ContextKeyExpr.has("config.editor.rename.enablePreview")),handler:A=>A.acceptRenameInput(!0),kbOpts:{weight:100+99,kbExpr:C.EditorContextKeys.focus,primary:1024+3}})),S.registerEditorCommand(new O({id:"cancelRenameInput",precondition:d.CONTEXT_RENAME_INPUT_VISIBLE,handler:A=>A.cancelRenameInput(),kbOpts:{weight:100+99,kbExpr:C.EditorContextKeys.focus,primary:9,secondary:[1024|9]}})),S.registerModelAndPositionCommand("_executeDocumentRenameProvider",function(A,B,...F){const[D]=F;return L.assertType(typeof D=="string"),k(A,B,D)}),f.Registry.as(v.Extensions.Configuration).registerConfiguration({id:"editor",properties:{"editor.rename.enablePreview":{scope:5,description:b.localize(8,null),default:!0,type:"boolean"}}})}),define(Q[637],J([0,1,19,23,13,14,3,21,25,18,505,34,412,230,26,12]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.provideSelectionRanges=void 0;class r{constructor(_,f){this.index=_,this.ranges=f}mov(_){let f=this.index+(_?1:-1);if(f<0||f>=this.ranges.length)return this;const v=new r(f,this.ranges);return v.ranges[f].equalsRange(this.ranges[this.index])?v.mov(_):v}}class i{constructor(_){this._editor=_,this._ignoreSelection=!1}static get(_){return _.getContribution(i.ID)}dispose(){var _;(_=this._selectionListener)===null||_===void 0||_.dispose()}run(_){return Ie(this,void 0,void 0,function*(){if(!!this._editor.hasModel()){const f=this._editor.getSelections(),v=this._editor.getModel();if(!!g.SelectionRangeRegistry.has(v)&&(this._state||(yield h(v,f.map(L=>L.getPosition()),this._editor.getOption(97),N.CancellationToken.None).then(L=>{var I;if(!(!b.isNonEmptyArray(L)||L.length!==f.length)&&!(!this._editor.hasModel()||!b.equals(this._editor.getSelections(),f,(k,E)=>k.equalsSelection(E)))){for(let k=0;kE.containsPosition(f[k].getStartPosition())&&E.containsPosition(f[k].getEndPosition())),L[k].unshift(f[k]);this._state=L.map(k=>new r(0,k)),(I=this._selectionListener)===null||I===void 0||I.dispose(),this._selectionListener=this._editor.onDidChangeCursorPosition(()=>{var k;this._ignoreSelection||((k=this._selectionListener)===null||k===void 0||k.dispose(),this._state=void 0)})}})),!!this._state)){this._state=this._state.map(L=>L.mov(_));const y=this._state.map(L=>C.Selection.fromPositions(L.ranges[L.index].getStartPosition(),L.ranges[L.index].getEndPosition()));this._ignoreSelection=!0;try{this._editor.setSelections(y)}finally{this._ignoreSelection=!1}}}})}}i.ID="editor.contrib.smartSelectController";class n extends M.EditorAction{constructor(_,f){super(f);this._forward=_}run(_,f){return Ie(this,void 0,void 0,function*(){let v=i.get(f);v&&(yield v.run(this._forward))})}}class t extends n{constructor(){super(!0,{id:"editor.action.smartSelect.expand",label:p.localize(0,null),alias:"Expand Selection",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.editorTextFocus,primary:1024|512|17,mac:{primary:2048|256|1024|17,secondary:[256|1024|17]},weight:100},menuOpts:{menuId:c.MenuId.MenubarSelectionMenu,group:"1_basic",title:p.localize(1,null),order:2}})}}a.CommandsRegistry.registerCommandAlias("editor.action.smartSelect.grow","editor.action.smartSelect.expand");class l extends n{constructor(){super(!1,{id:"editor.action.smartSelect.shrink",label:p.localize(2,null),alias:"Shrink Selection",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.editorTextFocus,primary:1024|512|15,mac:{primary:2048|256|1024|15,secondary:[256|1024|15]},weight:100},menuOpts:{menuId:c.MenuId.MenubarSelectionMenu,group:"1_basic",title:p.localize(3,null),order:3}})}}M.registerEditorContribution(i.ID,i),M.registerEditorAction(t),M.registerEditorAction(l),g.SelectionRangeRegistry.register("*",new o.WordSelectionRangeProvider);function h(m,_,f,v){return Ie(this,void 0,void 0,function*(){const y=g.SelectionRangeRegistry.all(m);y.length===1&&y.unshift(new s.BracketSelectionRangeProvider);let L=[],I=[];for(const k of y)L.push(Promise.resolve(k.provideSelectionRanges(m,_,v)).then(E=>{if(b.isNonEmptyArray(E)&&E.length===_.length)for(let T=0;T<_.length;T++){I[T]||(I[T]=[]);for(const O of E[T])S.Range.isIRange(O.range)&&S.Range.containsPosition(O.range,_[T])&&I[T].push(S.Range.lift(O.range))}},u.onUnexpectedExternalError));return yield Promise.all(L),I.map(k=>{if(k.length===0)return[];k.sort((A,B)=>w.Position.isBefore(A.getStartPosition(),B.getStartPosition())?1:w.Position.isBefore(B.getStartPosition(),A.getStartPosition())||w.Position.isBefore(A.getEndPosition(),B.getEndPosition())?-1:w.Position.isBefore(B.getEndPosition(),A.getEndPosition())?1:0);let E=[],T;for(const A of k)(!T||S.Range.containsRange(A,T)&&!S.Range.equalsRange(A,T))&&(E.push(A),T=A);if(!f.selectLeadingAndTrailingWhitespace)return E;let O=[E[0]];for(let A=1;A{this._resolveCache=void 0,this._isResolved=!1});this._resolveCache=Promise.resolve(this.provider.resolveCompletionItem(this.completion,T)).then(A=>{Object.assign(this.completion,A),this._isResolved=!0,O.dispose()},A=>{b.isPromiseCanceledError(A)&&(this._resolveCache=void 0,this._isResolved=!1)})}return this._resolveCache})}}e.CompletionItem=i;class n{constructor(T=2,O=new Set,A=new Set){this.snippetSortOrder=T,this.kindFilter=O,this.providerFilter=A}}e.CompletionOptions=n,n.default=new n;let t;function l(){return t}e.getSnippetSuggestSupport=l;class h{constructor(T,O,A,B){this.items=T,this.needsClipboard=O,this.durations=A,this.disposable=B}}e.CompletionItemModel=h;function m(E,T,O=n.default,A={triggerKind:0},B=S.CancellationToken.None){return Ie(this,void 0,void 0,function*(){const F=new o.StopWatch(!0);T=T.clone();const D=E.getWordAtPosition(T),R=D?new C.Range(T.lineNumber,D.startColumn,T.lineNumber,D.endColumn):C.Range.fromPositions(T),W={replace:R,insert:R.setEndPosition(T.lineNumber,T.column)},x=[],K=new g.DisposableStore,Y=[];let ee=!1;const se=(le,X,z)=>{var P,V;if(!!X){for(let U of X.suggestions)O.kindFilter.has(U.kind)||(U.range||(U.range=W),U.sortText||(U.sortText=typeof U.label=="string"?U.label:U.label.name),!ee&&U.insertTextRules&&U.insertTextRules&4&&(ee=c.SnippetParser.guessNeedsClipboard(U.insertText)),x.push(new i(T,U,X,le)));g.isDisposable(X)&&K.add(X),Y.push({providerName:(P=le._debugDisplayName)!==null&&P!==void 0?P:"unkown_provider",elapsedProvider:(V=X.duration)!==null&&V!==void 0?V:-1,elapsedOverall:z.elapsed()})}},ne=(()=>Ie(this,void 0,void 0,function*(){if(!(!t||O.kindFilter.has(27))&&!(O.providerFilter.size>0&&!O.providerFilter.has(t))){const le=new o.StopWatch(!0),X=yield t.provideCompletionItems(E,T,A,B);se(t,X,le)}}))();for(let le of N.CompletionProviderRegistry.orderedGroups(E)){let X=x.length;if(yield Promise.all(le.map(z=>Ie(this,void 0,void 0,function*(){if(!(O.providerFilter.size>0&&!O.providerFilter.has(z)))try{const P=new o.StopWatch(!0),V=yield z.provideCompletionItems(E,T,A,B);se(z,V,P)}catch(P){b.onUnexpectedExternalError(P)}}))),X!==x.length||B.isCancellationRequested)break}return yield ne,B.isCancellationRequested?(K.dispose(),Promise.reject(b.canceled())):new h(x.sort(L(O.snippetSortOrder)),ee,{entries:Y,elapsed:F.elapsed()},K)})}e.provideSuggestionItems=m;function _(E,T){if(E.sortTextLow&&T.sortTextLow){if(E.sortTextLowT.sortTextLow)return 1}return E.completion.labelT.completion.label?1:E.completion.kind-T.completion.kind}function f(E,T){if(E.completion.kind!==T.completion.kind){if(E.completion.kind===27)return-1;if(T.completion.kind===27)return 1}return _(E,T)}function v(E,T){if(E.completion.kind!==T.completion.kind){if(E.completion.kind===27)return 1;if(T.completion.kind===27)return-1}return _(E,T)}const y=new Map;y.set(0,f),y.set(2,v),y.set(1,_);function L(E){return y.get(E)}e.getSuggestionComparator=L,s.CommandsRegistry.registerCommand("_executeCompletionItemProvider",(E,...T)=>Ie(void 0,void 0,void 0,function*(){const[O,A,B,F]=T;a.assertType(u.URI.isUri(O)),a.assertType(M.Position.isIPosition(A)),a.assertType(typeof B=="string"||!B),a.assertType(typeof F=="number"||!F);const D=yield E.get(r.ITextModelService).createModelReference(O);try{const R={incomplete:!1,suggestions:[]},W=[],x=yield m(D.object.textEditorModel,M.Position.lift(A),void 0,{triggerCharacter:B,triggerKind:B?1:0});for(const K of x.items)W.length<(F!=null?F:0)&&W.push(K.resolve(S.CancellationToken.None)),R.incomplete=R.incomplete||K.container.incomplete,R.suggestions.push(K.completion);try{return yield Promise.all(W),R}finally{setTimeout(()=>x.disposable.dispose(),100)}}finally{D.dispose()}}));const I=new class{constructor(){this.onlyOnceSuggestions=[]}provideCompletionItems(){let T={suggestions:this.onlyOnceSuggestions.slice(0)};return this.onlyOnceSuggestions.length=0,T}};N.CompletionProviderRegistry.register("*",I);function k(E,T){setTimeout(()=>{I.onlyOnceSuggestions.push(...T),E.getContribution("editor.contrib.suggestController").triggerSuggest(new Set().add(I))},0)}e.showSimpleSuggestions=k}),define(Q[264],J([0,1,513,47,13,186]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ToggleTabFocusModeAction=void 0;class S extends M.EditorAction{constructor(){super({id:S.ID,label:b.localize(0,null),alias:"Toggle Tab Key Moves Focus",precondition:void 0,kbOpts:{kbExpr:null,primary:2048|43,mac:{primary:256|1024|43},weight:100}})}run(d,g){const c=!w.TabFocus.getTabFocusMode();w.TabFocus.setTabFocusMode(c),c?N.alert(b.localize(1,null)):N.alert(b.localize(2,null))}}e.ToggleTabFocusModeAction=S,S.ID="editor.action.toggleTabFocusMode",M.registerEditorAction(S)}),define(Q[638],J([0,1,514,13,81]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class w extends N.EditorAction{constructor(){super({id:"editor.action.forceRetokenize",label:b.localize(0,null),alias:"Developer: Force Retokenize",precondition:void 0})}run(C,d){if(!!d.hasModel()){const g=d.getModel();g.resetTokenization();const p=new M.StopWatch(!0);g.forceTokenization(g.getLineCount()),p.stop(),console.log(`tokenization took ${p.elapsed()}`)}}}N.registerEditorAction(w)}),define(Q[639],J([0,1,515,2,13,28,184]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0});const C="ignoreUnusualLineTerminators";function d(c,o,s){c.setModelProperty(o.uri,C,s)}function g(c,o){return c.getModelProperty(o.uri,C)}let p=class extends N.Disposable{constructor(o,s,a){super();this._editor=o,this._dialogService=s,this._codeEditorService=a,this._config=this._editor.getOption(108),this._register(this._editor.onDidChangeConfiguration(u=>{u.hasChanged(108)&&(this._config=this._editor.getOption(108),this._checkForUnusualLineTerminators())})),this._register(this._editor.onDidChangeModel(()=>{this._checkForUnusualLineTerminators()})),this._register(this._editor.onDidChangeModelContent(u=>{u.isUndoing||this._checkForUnusualLineTerminators()}))}_checkForUnusualLineTerminators(){return Ie(this,void 0,void 0,function*(){if(this._config!=="off"&&!!this._editor.hasModel()){const o=this._editor.getModel();if(!!o.mightContainUnusualLineTerminators()&&g(this._codeEditorService,o)!==!0&&!this._editor.getOption(75)){if(this._config==="auto"){o.removeUnusualLineTerminators(this._editor.getSelections());return}if(!(yield this._dialogService.confirm({title:b.localize(0,null),message:b.localize(1,null),detail:b.localize(2,null),primaryButton:b.localize(3,null),secondaryButton:b.localize(4,null)})).confirmed){d(this._codeEditorService,o,!0);return}o.removeUnusualLineTerminators(this._editor.getSelections())}}})}};p.ID="editor.contrib.unusualLineTerminatorsDetector",p=Me([_e(1,S.IDialogService),_e(2,w.ICodeEditorService)],p),M.registerEditorContribution(p.ID,p)}),define(Q[640],J([0,1,516,19,15,23,12,2,13,3,25,53,31,18,16,22,11,47]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getOccurrencesAtPosition=void 0;const n=u.registerColor("editor.wordHighlightBackground",{dark:"#575757B8",light:"#57575740",hc:null},b.localize(0,null),!0),t=u.registerColor("editor.wordHighlightStrongBackground",{dark:"#004972B8",light:"#0e639c40",hc:null},b.localize(1,null),!0),l=u.registerColor("editor.wordHighlightBorder",{light:null,dark:null,hc:u.activeContrastBorder},b.localize(2,null)),h=u.registerColor("editor.wordHighlightStrongBorder",{light:null,dark:null,hc:u.activeContrastBorder},b.localize(3,null)),m=u.registerColor("editorOverviewRuler.wordHighlightForeground",{dark:"#A0A0A0CC",light:"#A0A0A0CC",hc:"#A0A0A0CC"},b.localize(4,null),!0),_=u.registerColor("editorOverviewRuler.wordHighlightStrongForeground",{dark:"#C0A0C0CC",light:"#C0A0C0CC",hc:"#C0A0C0CC"},b.localize(5,null),!0),f=new a.RawContextKey("hasWordHighlights",!1);function v(D,R,W){const x=s.DocumentHighlightProviderRegistry.ordered(D);return M.first(x.map(K=>()=>Promise.resolve(K.provideDocumentHighlights(D,R,W)).then(void 0,S.onUnexpectedExternalError)),N.isNonEmptyArray)}e.getOccurrencesAtPosition=v;class y{constructor(R,W,x){this._wordRange=this._getCurrentWordRange(R,W),this.result=M.createCancelablePromise(K=>this._compute(R,W,x,K))}_getCurrentWordRange(R,W){const x=R.getWordAtPosition(W.getPosition());return x?new g.Range(W.startLineNumber,x.startColumn,W.startLineNumber,x.endColumn):null}isValid(R,W,x){const K=W.startLineNumber,Y=W.startColumn,ee=W.endColumn,se=this._getCurrentWordRange(R,W);let ne=Boolean(this._wordRange&&this._wordRange.equalsRange(se));for(let le=0,X=x.length;!ne&&le=ee&&(ne=!0)}return ne}cancel(){this.result.cancel()}}class L extends y{_compute(R,W,x,K){return v(R,W.getPosition(),K).then(Y=>Y||[])}}class I extends y{constructor(R,W,x){super(R,W,x);this._selectionIsEmpty=W.isEmpty()}_compute(R,W,x,K){return M.timeout(250,K).then(()=>{if(!W.isEmpty())return[];const Y=R.getWordAtPosition(W.getPosition());return!Y||Y.word.length>1e3?[]:R.findMatches(Y.word,!0,!1,!0,x,!1).map(se=>({range:se.range,kind:s.DocumentHighlightKind.Text}))})}isValid(R,W,x){const K=W.isEmpty();return this._selectionIsEmpty!==K?!1:super.isValid(R,W,x)}}function k(D,R,W){return s.DocumentHighlightProviderRegistry.has(D)?new L(D,R,W):new I(D,R,W)}d.registerModelAndPositionCommand("_executeDocumentHighlights",(D,R)=>v(D,R,w.CancellationToken.None));class E{constructor(R,W){this.toUnhook=new C.DisposableStore,this.workerRequestTokenId=0,this.workerRequestCompleted=!1,this.workerRequestValue=[],this.lastCursorPositionChangeTime=0,this.renderDecorationsTimer=-1,this.editor=R,this._hasWordHighlights=f.bindTo(W),this._ignorePositionChangeEvent=!1,this.occurrencesHighlight=this.editor.getOption(66),this.model=this.editor.getModel(),this.toUnhook.add(R.onDidChangeCursorPosition(x=>{this._ignorePositionChangeEvent||!this.occurrencesHighlight||this._onPositionChanged(x)})),this.toUnhook.add(R.onDidChangeModelContent(x=>{this._stopAll()})),this.toUnhook.add(R.onDidChangeConfiguration(x=>{let K=this.editor.getOption(66);this.occurrencesHighlight!==K&&(this.occurrencesHighlight=K,this._stopAll())})),this._decorationIds=[],this.workerRequestTokenId=0,this.workerRequest=null,this.workerRequestCompleted=!1,this.lastCursorPositionChangeTime=0,this.renderDecorationsTimer=-1}hasDecorations(){return this._decorationIds.length>0}restore(){!this.occurrencesHighlight||this._run()}_getSortedHighlights(){return N.coalesce(this._decorationIds.map(R=>this.model.getDecorationRange(R)).sort(g.Range.compareRangesUsingStarts))}moveNext(){let R=this._getSortedHighlights(),x=(R.findIndex(Y=>Y.containsPosition(this.editor.getPosition()))+1)%R.length,K=R[x];try{this._ignorePositionChangeEvent=!0,this.editor.setPosition(K.getStartPosition()),this.editor.revealRangeInCenterIfOutsideViewport(K);const Y=this._getWord();if(Y){const ee=this.editor.getModel().getLineContent(K.startLineNumber);i.alert(`${ee}, ${x+1} of ${R.length} for '${Y.word}'`)}}finally{this._ignorePositionChangeEvent=!1}}moveBack(){let R=this._getSortedHighlights(),x=(R.findIndex(Y=>Y.containsPosition(this.editor.getPosition()))-1+R.length)%R.length,K=R[x];try{this._ignorePositionChangeEvent=!0,this.editor.setPosition(K.getStartPosition()),this.editor.revealRangeInCenterIfOutsideViewport(K);const Y=this._getWord();if(Y){const ee=this.editor.getModel().getLineContent(K.startLineNumber);i.alert(`${ee}, ${x+1} of ${R.length} for '${Y.word}'`)}}finally{this._ignorePositionChangeEvent=!1}}_removeDecorations(){this._decorationIds.length>0&&(this._decorationIds=this.editor.deltaDecorations(this._decorationIds,[]),this._hasWordHighlights.set(!1))}_stopAll(){this._removeDecorations(),this.renderDecorationsTimer!==-1&&(clearTimeout(this.renderDecorationsTimer),this.renderDecorationsTimer=-1),this.workerRequest!==null&&(this.workerRequest.cancel(),this.workerRequest=null),this.workerRequestCompleted||(this.workerRequestTokenId++,this.workerRequestCompleted=!0)}_onPositionChanged(R){if(!this.occurrencesHighlight){this._stopAll();return}if(R.reason!==3){this._stopAll();return}this._run()}_getWord(){let R=this.editor.getSelection(),W=R.startLineNumber,x=R.startColumn;return this.model.getWordAtPosition({lineNumber:W,column:x})}_run(){let R=this.editor.getSelection();if(R.startLineNumber!==R.endLineNumber){this._stopAll();return}let W=R.startColumn,x=R.endColumn;const K=this._getWord();if(!K||K.startColumn>W||K.endColumn{ee===this.workerRequestTokenId&&(this.workerRequestCompleted=!0,this.workerRequestValue=se||[],this._beginRenderDecorations())},S.onUnexpectedError)}}_beginRenderDecorations(){let R=new Date().getTime(),W=this.lastCursorPositionChangeTime+250;R>=W?(this.renderDecorationsTimer=-1,this.renderDecorations()):this.renderDecorationsTimer=setTimeout(()=>{this.renderDecorations()},W-R)}renderDecorations(){this.renderDecorationsTimer=-1;let R=[];for(const W of this.workerRequestValue)W.range&&R.push({range:W.range,options:E._getDecorationOptions(W.kind)});this._decorationIds=this.editor.deltaDecorations(this._decorationIds,R),this._hasWordHighlights.set(this.hasDecorations())}static _getDecorationOptions(R){return R===s.DocumentHighlightKind.Write?this._WRITE_OPTIONS:R===s.DocumentHighlightKind.Text?this._TEXT_OPTIONS:this._REGULAR_OPTIONS}dispose(){this._stopAll(),this.toUnhook.dispose()}}E._WRITE_OPTIONS=o.ModelDecorationOptions.register({stickiness:1,className:"wordHighlightStrong",overviewRuler:{color:r.themeColorFromId(_),position:c.OverviewRulerLane.Center}}),E._TEXT_OPTIONS=o.ModelDecorationOptions.register({stickiness:1,className:"selectionHighlight",overviewRuler:{color:r.themeColorFromId(u.overviewRulerSelectionHighlightForeground),position:c.OverviewRulerLane.Center}}),E._REGULAR_OPTIONS=o.ModelDecorationOptions.register({stickiness:1,className:"wordHighlight",overviewRuler:{color:r.themeColorFromId(m),position:c.OverviewRulerLane.Center}});let T=class zt extends C.Disposable{constructor(R,W){super();this.wordHighlighter=null;const x=()=>{R.hasModel()&&(this.wordHighlighter=new E(R,W))};this._register(R.onDidChangeModel(K=>{this.wordHighlighter&&(this.wordHighlighter.dispose(),this.wordHighlighter=null),x()})),x()}static get(R){return R.getContribution(zt.ID)}saveViewState(){return!!(this.wordHighlighter&&this.wordHighlighter.hasDecorations())}moveNext(){this.wordHighlighter&&this.wordHighlighter.moveNext()}moveBack(){this.wordHighlighter&&this.wordHighlighter.moveBack()}restoreViewState(R){this.wordHighlighter&&R&&this.wordHighlighter.restore()}dispose(){this.wordHighlighter&&(this.wordHighlighter.dispose(),this.wordHighlighter=null),super.dispose()}};T.ID="editor.contrib.wordHighlighter",T=Me([_e(1,a.IContextKeyService)],T);class O extends d.EditorAction{constructor(R,W){super(W);this._isNext=R}run(R,W){const x=T.get(W);!x||(this._isNext?x.moveNext():x.moveBack())}}class A extends O{constructor(){super(!0,{id:"editor.action.wordHighlight.next",label:b.localize(6,null),alias:"Go to Next Symbol Highlight",precondition:f,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:65,weight:100}})}}class B extends O{constructor(){super(!1,{id:"editor.action.wordHighlight.prev",label:b.localize(7,null),alias:"Go to Previous Symbol Highlight",precondition:f,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:1024|65,weight:100}})}}class F extends d.EditorAction{constructor(){super({id:"editor.action.wordHighlight.trigger",label:b.localize(8,null),alias:"Trigger Symbol Highlight",precondition:f.toNegated(),kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:0,weight:100}})}run(R,W,x){const K=T.get(W);!K||K.restoreViewState(!0)}}d.registerEditorContribution(T.ID,T),d.registerEditorAction(A),d.registerEditorAction(B),d.registerEditorAction(F),r.registerThemingParticipant((D,R)=>{const W=D.getColor(u.editorSelectionHighlight);W&&(R.addRule(`.monaco-editor .focused .selectionHighlight { background-color: ${W}; }`),R.addRule(`.monaco-editor .selectionHighlight { background-color: ${W.transparent(.5)}; }`));const x=D.getColor(n);x&&R.addRule(`.monaco-editor .wordHighlight { background-color: ${x}; }`);const K=D.getColor(t);K&&R.addRule(`.monaco-editor .wordHighlightStrong { background-color: ${K}; }`);const Y=D.getColor(u.editorSelectionHighlightBorder);Y&&R.addRule(`.monaco-editor .selectionHighlight { border: 1px ${D.type==="hc"?"dotted":"solid"} ${Y}; box-sizing: border-box; }`);const ee=D.getColor(l);ee&&R.addRule(`.monaco-editor .wordHighlight { border: 1px ${D.type==="hc"?"dashed":"solid"} ${ee}; box-sizing: border-box; }`);const se=D.getColor(h);se&&R.addRule(`.monaco-editor .wordHighlightStrong { border: 1px ${D.type==="hc"?"dashed":"solid"} ${se}; box-sizing: border-box; }`)})}),define(Q[265],J([0,1,517,13,92,42,136,106,14,3,21,25,65,16,38,41,250]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DeleteInsideWord=e.DeleteWordRight=e.DeleteWordEndRight=e.DeleteWordStartRight=e.DeleteWordLeft=e.DeleteWordEndLeft=e.DeleteWordStartLeft=e.DeleteWordRightCommand=e.DeleteWordLeftCommand=e.DeleteWordCommand=e.CursorWordAccessibilityRightSelect=e.CursorWordAccessibilityRight=e.CursorWordRightSelect=e.CursorWordEndRightSelect=e.CursorWordStartRightSelect=e.CursorWordRight=e.CursorWordEndRight=e.CursorWordStartRight=e.CursorWordAccessibilityLeftSelect=e.CursorWordAccessibilityLeft=e.CursorWordLeftSelect=e.CursorWordEndLeftSelect=e.CursorWordStartLeftSelect=e.CursorWordLeft=e.CursorWordEndLeft=e.CursorWordStartLeft=e.WordRightCommand=e.WordLeftCommand=e.MoveWordCommand=void 0;class i extends N.EditorCommand{constructor(z){super(z);this._inSelectionMode=z.inSelectionMode,this._wordNavigationType=z.wordNavigationType}runEditorCommand(z,P,V){if(!!P.hasModel()){const U=C.getMapForWordSeparators(P.getOption(110)),H=P.getModel(),ie=P.getSelections().map(oe=>{const ae=new d.Position(oe.positionLineNumber,oe.positionColumn),G=this._move(U,H,ae,this._wordNavigationType);return this._moveTo(oe,G,this._inSelectionMode)});if(H.pushStackElement(),P._getViewModel().setCursorStates("moveWordCommand",3,ie.map(oe=>w.CursorState.fromModelSelection(oe))),ie.length===1){const oe=new d.Position(ie[0].positionLineNumber,ie[0].positionColumn);P.revealPosition(oe,0)}}}_moveTo(z,P,V){return V?new p.Selection(z.selectionStartLineNumber,z.selectionStartColumn,P.lineNumber,P.column):new p.Selection(P.lineNumber,P.column,P.lineNumber,P.column)}}e.MoveWordCommand=i;class n extends i{_move(z,P,V,U){return S.WordOperations.moveWordLeft(z,P,V,U)}}e.WordLeftCommand=n;class t extends i{_move(z,P,V,U){return S.WordOperations.moveWordRight(z,P,V,U)}}e.WordRightCommand=t;class l extends n{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:"cursorWordStartLeft",precondition:void 0})}}e.CursorWordStartLeft=l;class h extends n{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordEndLeft",precondition:void 0})}}e.CursorWordEndLeft=h;class m extends n{constructor(){var z;super({inSelectionMode:!1,wordNavigationType:1,id:"cursorWordLeft",precondition:void 0,kbOpts:{kbExpr:s.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,(z=s.ContextKeyExpr.and(o.CONTEXT_ACCESSIBILITY_MODE_ENABLED,r.IsWindowsContext))===null||z===void 0?void 0:z.negate()),primary:2048|15,mac:{primary:512|15},weight:100}})}}e.CursorWordLeft=m;class _ extends n{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:"cursorWordStartLeftSelect",precondition:void 0})}}e.CursorWordStartLeftSelect=_;class f extends n{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordEndLeftSelect",precondition:void 0})}}e.CursorWordEndLeftSelect=f;class v extends n{constructor(){var z;super({inSelectionMode:!0,wordNavigationType:1,id:"cursorWordLeftSelect",precondition:void 0,kbOpts:{kbExpr:s.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,(z=s.ContextKeyExpr.and(o.CONTEXT_ACCESSIBILITY_MODE_ENABLED,r.IsWindowsContext))===null||z===void 0?void 0:z.negate()),primary:2048|1024|15,mac:{primary:512|1024|15},weight:100}})}}e.CursorWordLeftSelect=v;class y extends n{constructor(){super({inSelectionMode:!1,wordNavigationType:3,id:"cursorWordAccessibilityLeft",precondition:void 0})}_move(z,P,V,U){return super._move(C.getMapForWordSeparators(a.EditorOptions.wordSeparators.defaultValue),P,V,U)}}e.CursorWordAccessibilityLeft=y;class L extends n{constructor(){super({inSelectionMode:!0,wordNavigationType:3,id:"cursorWordAccessibilityLeftSelect",precondition:void 0})}_move(z,P,V,U){return super._move(C.getMapForWordSeparators(a.EditorOptions.wordSeparators.defaultValue),P,V,U)}}e.CursorWordAccessibilityLeftSelect=L;class I extends t{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:"cursorWordStartRight",precondition:void 0})}}e.CursorWordStartRight=I;class k extends t{constructor(){var z;super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordEndRight",precondition:void 0,kbOpts:{kbExpr:s.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,(z=s.ContextKeyExpr.and(o.CONTEXT_ACCESSIBILITY_MODE_ENABLED,r.IsWindowsContext))===null||z===void 0?void 0:z.negate()),primary:2048|17,mac:{primary:512|17},weight:100}})}}e.CursorWordEndRight=k;class E extends t{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordRight",precondition:void 0})}}e.CursorWordRight=E;class T extends t{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:"cursorWordStartRightSelect",precondition:void 0})}}e.CursorWordStartRightSelect=T;class O extends t{constructor(){var z;super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordEndRightSelect",precondition:void 0,kbOpts:{kbExpr:s.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,(z=s.ContextKeyExpr.and(o.CONTEXT_ACCESSIBILITY_MODE_ENABLED,r.IsWindowsContext))===null||z===void 0?void 0:z.negate()),primary:2048|1024|17,mac:{primary:512|1024|17},weight:100}})}}e.CursorWordEndRightSelect=O;class A extends t{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordRightSelect",precondition:void 0})}}e.CursorWordRightSelect=A;class B extends t{constructor(){super({inSelectionMode:!1,wordNavigationType:3,id:"cursorWordAccessibilityRight",precondition:void 0})}_move(z,P,V,U){return super._move(C.getMapForWordSeparators(a.EditorOptions.wordSeparators.defaultValue),P,V,U)}}e.CursorWordAccessibilityRight=B;class F extends t{constructor(){super({inSelectionMode:!0,wordNavigationType:3,id:"cursorWordAccessibilityRightSelect",precondition:void 0})}_move(z,P,V,U){return super._move(C.getMapForWordSeparators(a.EditorOptions.wordSeparators.defaultValue),P,V,U)}}e.CursorWordAccessibilityRightSelect=F;class D extends N.EditorCommand{constructor(z){super(z);this._whitespaceHeuristics=z.whitespaceHeuristics,this._wordNavigationType=z.wordNavigationType}runEditorCommand(z,P,V){if(!!P.hasModel()){const U=C.getMapForWordSeparators(P.getOption(110)),H=P.getModel(),$=P.getSelections(),ie=P.getOption(5),oe=P.getOption(7),ae=u.LanguageConfigurationRegistry.getAutoClosingPairs(H.getLanguageIdentifier().id),G=$.map(j=>{const te=this._delete({wordSeparators:U,model:H,selection:j,whitespaceHeuristics:this._whitespaceHeuristics,autoClosingBrackets:ie,autoClosingQuotes:oe,autoClosingPairs:ae},this._wordNavigationType);return new M.ReplaceCommand(te,"")});P.pushUndoStop(),P.executeCommands(this.id,G),P.pushUndoStop()}}}e.DeleteWordCommand=D;class R extends D{_delete(z,P){let V=S.WordOperations.deleteWordLeft(z,P);return V||new g.Range(1,1,1,1)}}e.DeleteWordLeftCommand=R;class W extends D{_delete(z,P){let V=S.WordOperations.deleteWordRight(z,P);if(V)return V;const U=z.model.getLineCount(),H=z.model.getLineMaxColumn(U);return new g.Range(U,H,U,H)}}e.DeleteWordRightCommand=W;class x extends R{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:0,id:"deleteWordStartLeft",precondition:c.EditorContextKeys.writable})}}e.DeleteWordStartLeft=x;class K extends R{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:2,id:"deleteWordEndLeft",precondition:c.EditorContextKeys.writable})}}e.DeleteWordEndLeft=K;class Y extends R{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:0,id:"deleteWordLeft",precondition:c.EditorContextKeys.writable,kbOpts:{kbExpr:c.EditorContextKeys.textInputFocus,primary:2048|1,mac:{primary:512|1},weight:100}})}}e.DeleteWordLeft=Y;class ee extends W{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:0,id:"deleteWordStartRight",precondition:c.EditorContextKeys.writable})}}e.DeleteWordStartRight=ee;class se extends W{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:2,id:"deleteWordEndRight",precondition:c.EditorContextKeys.writable})}}e.DeleteWordEndRight=se;class ne extends W{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:2,id:"deleteWordRight",precondition:c.EditorContextKeys.writable,kbOpts:{kbExpr:c.EditorContextKeys.textInputFocus,primary:2048|20,mac:{primary:512|20},weight:100}})}}e.DeleteWordRight=ne;class le extends N.EditorAction{constructor(){super({id:"deleteInsideWord",precondition:c.EditorContextKeys.writable,label:b.localize(0,null),alias:"Delete Word"})}run(z,P,V){if(!!P.hasModel()){const U=C.getMapForWordSeparators(P.getOption(110)),H=P.getModel(),ie=P.getSelections().map(oe=>{const ae=S.WordOperations.deleteInsideWord(U,H,oe);return new M.ReplaceCommand(ae,"")});P.pushUndoStop(),P.executeCommands(this.id,ie),P.pushUndoStop()}}}e.DeleteInsideWord=le,N.registerEditorCommand(new l),N.registerEditorCommand(new h),N.registerEditorCommand(new m),N.registerEditorCommand(new _),N.registerEditorCommand(new f),N.registerEditorCommand(new v),N.registerEditorCommand(new I),N.registerEditorCommand(new k),N.registerEditorCommand(new E),N.registerEditorCommand(new T),N.registerEditorCommand(new O),N.registerEditorCommand(new A),N.registerEditorCommand(new y),N.registerEditorCommand(new L),N.registerEditorCommand(new B),N.registerEditorCommand(new F),N.registerEditorCommand(new x),N.registerEditorCommand(new K),N.registerEditorCommand(new Y),N.registerEditorCommand(new ee),N.registerEditorCommand(new se),N.registerEditorCommand(new ne),N.registerEditorAction(le)}),define(Q[641],J([0,1,13,136,3,25,265,26]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.CursorWordPartRightSelect=e.CursorWordPartRight=e.WordPartRightCommand=e.CursorWordPartLeftSelect=e.CursorWordPartLeft=e.WordPartLeftCommand=e.DeleteWordPartRight=e.DeleteWordPartLeft=void 0;class d extends S.DeleteWordCommand{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:0,id:"deleteWordPartLeft",precondition:w.EditorContextKeys.writable,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|512|1},weight:100}})}_delete(i,n){let t=N.WordPartOperations.deleteWordPartLeft(i);return t||new M.Range(1,1,1,1)}}e.DeleteWordPartLeft=d;class g extends S.DeleteWordCommand{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:2,id:"deleteWordPartRight",precondition:w.EditorContextKeys.writable,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|512|20},weight:100}})}_delete(i,n){let t=N.WordPartOperations.deleteWordPartRight(i);if(t)return t;const l=i.model.getLineCount(),h=i.model.getLineMaxColumn(l);return new M.Range(l,h,l,h)}}e.DeleteWordPartRight=g;class p extends S.MoveWordCommand{_move(i,n,t,l){return N.WordPartOperations.moveWordPartLeft(i,n,t)}}e.WordPartLeftCommand=p;class c extends p{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:"cursorWordPartLeft",precondition:void 0,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|512|15},weight:100}})}}e.CursorWordPartLeft=c,C.CommandsRegistry.registerCommandAlias("cursorWordPartStartLeft","cursorWordPartLeft");class o extends p{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:"cursorWordPartLeftSelect",precondition:void 0,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|512|1024|15},weight:100}})}}e.CursorWordPartLeftSelect=o,C.CommandsRegistry.registerCommandAlias("cursorWordPartStartLeftSelect","cursorWordPartLeftSelect");class s extends S.MoveWordCommand{_move(i,n,t,l){return N.WordPartOperations.moveWordPartRight(i,n,t)}}e.WordPartRightCommand=s;class a extends s{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:"cursorWordPartRight",precondition:void 0,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|512|17},weight:100}})}}e.CursorWordPartRight=a;class u extends s{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:"cursorWordPartRightSelect",precondition:void 0,kbOpts:{kbExpr:w.EditorContextKeys.textInputFocus,primary:0,mac:{primary:256|512|1024|17},weight:100}})}}e.CursorWordPartRightSelect=u,b.registerEditorCommand(new d),b.registerEditorCommand(new g),b.registerEditorCommand(new c),b.registerEditorCommand(new o),b.registerEditorCommand(new a),b.registerEditorCommand(new u)}),define(Q[642],J([0,1,7,30,156,47,52,2,17,8,24,13,25,264,16,9,37,58,22,11,64,354]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0});const h=new a.RawContextKey("accessibilityHelpWidgetVisible",!1);let m=class Ht extends C.Disposable{constructor(I,k){super();this._editor=I,this._widget=this._register(k.createInstance(f,this._editor))}static get(I){return I.getContribution(Ht.ID)}show(){this._widget.show()}hide(){this._widget.hide()}};m.ID="editor.contrib.accessibilityHelpController",m=Me([_e(1,u.IInstantiationService)],m);function _(L,I){return!L||L.length===0?l.AccessibilityHelpNLS.noSelection:L.length===1?I?g.format(l.AccessibilityHelpNLS.singleSelectionRange,L[0].positionLineNumber,L[0].positionColumn,I):g.format(l.AccessibilityHelpNLS.singleSelection,L[0].positionLineNumber,L[0].positionColumn):I?g.format(l.AccessibilityHelpNLS.multiSelectionRange,L.length,I):L.length>0?g.format(l.AccessibilityHelpNLS.multiSelection,L.length):""}let f=class ht extends S.Widget{constructor(I,k,E,T){super();this._contextKeyService=k,this._keybindingService=E,this._openerService=T,this._editor=I,this._isVisibleKey=h.bindTo(this._contextKeyService),this._domNode=N.createFastDomNode(document.createElement("div")),this._domNode.setClassName("accessibilityHelpWidget"),this._domNode.setDisplay("none"),this._domNode.setAttribute("role","dialog"),this._domNode.setAttribute("aria-hidden","true"),this._contentDomNode=N.createFastDomNode(document.createElement("div")),this._contentDomNode.setAttribute("role","document"),this._domNode.appendChild(this._contentDomNode),this._isVisible=!1,this._register(this._editor.onDidLayoutChange(()=>{this._isVisible&&this._layout()})),this._register(b.addStandardDisposableListener(this._contentDomNode.domNode,"keydown",O=>{if(!!this._isVisible&&(O.equals(2048|35)&&(w.alert(l.AccessibilityHelpNLS.emergencyConfOn),this._editor.updateOptions({accessibilitySupport:"on"}),b.clearNode(this._contentDomNode.domNode),this._buildContent(),this._contentDomNode.domNode.focus(),O.preventDefault(),O.stopPropagation()),O.equals(2048|38))){w.alert(l.AccessibilityHelpNLS.openingDocs);let A=this._editor.getRawOptions().accessibilityHelpUrl;typeof A=="undefined"&&(A="https://go.microsoft.com/fwlink/?linkid=852450"),this._openerService.open(p.URI.parse(A)),O.preventDefault(),O.stopPropagation()}})),this.onblur(this._contentDomNode.domNode,()=>{this.hide()}),this._editor.addOverlayWidget(this)}dispose(){this._editor.removeOverlayWidget(this),super.dispose()}getId(){return ht.ID}getDomNode(){return this._domNode.domNode}getPosition(){return{preference:null}}show(){this._isVisible||(this._isVisible=!0,this._isVisibleKey.set(!0),this._layout(),this._domNode.setDisplay("block"),this._domNode.setAttribute("aria-hidden","false"),this._contentDomNode.domNode.tabIndex=0,this._buildContent(),this._contentDomNode.domNode.focus())}_descriptionForCommand(I,k,E){let T=this._keybindingService.lookupKeybinding(I);return T?g.format(k,T.getAriaLabel()):g.format(E,I)}_buildContent(){const I=this._editor.getOptions(),k=this._editor.getSelections();let E=0;if(k){const B=this._editor.getModel();B&&k.forEach(F=>{E+=B.getValueLengthInRange(F)})}let T=_(k,E);I.get(49)?I.get(75)?T+=l.AccessibilityHelpNLS.readonlyDiffEditor:T+=l.AccessibilityHelpNLS.editableDiffEditor:I.get(75)?T+=l.AccessibilityHelpNLS.readonlyEditor:T+=l.AccessibilityHelpNLS.editableEditor;const O=d.isMacintosh?l.AccessibilityHelpNLS.changeConfigToOnMac:l.AccessibilityHelpNLS.changeConfigToOnWinLinux;switch(I.get(2)){case 0:T+=` + + - `+O;break;case 2:T+=` + + - `+l.AccessibilityHelpNLS.auto_on;break;case 1:T+=` + + - `+l.AccessibilityHelpNLS.auto_off,T+=" "+O;break}I.get(123)?T+=` + + - `+this._descriptionForCommand(s.ToggleTabFocusModeAction.ID,l.AccessibilityHelpNLS.tabFocusModeOnMsg,l.AccessibilityHelpNLS.tabFocusModeOnMsgNoKb):T+=` + + - `+this._descriptionForCommand(s.ToggleTabFocusModeAction.ID,l.AccessibilityHelpNLS.tabFocusModeOffMsg,l.AccessibilityHelpNLS.tabFocusModeOffMsgNoKb);const A=d.isMacintosh?l.AccessibilityHelpNLS.openDocMac:l.AccessibilityHelpNLS.openDocWinLinux;T+=` + + - `+A,T+=` + +`+l.AccessibilityHelpNLS.outroMsg,this._contentDomNode.domNode.appendChild(M.renderFormattedText(T)),this._contentDomNode.domNode.setAttribute("aria-label",T)}hide(){!this._isVisible||(this._isVisible=!1,this._isVisibleKey.reset(),this._domNode.setDisplay("none"),this._domNode.setAttribute("aria-hidden","true"),this._contentDomNode.domNode.tabIndex=-1,b.clearNode(this._contentDomNode.domNode),this._editor.focus())}_layout(){let I=this._editor.getLayoutInfo(),k=Math.max(5,Math.min(ht.WIDTH,I.width-40)),E=Math.max(5,Math.min(ht.HEIGHT,I.height-40));this._domNode.setWidth(k),this._domNode.setHeight(E);let T=Math.round((I.height-E)/2);this._domNode.setTop(T);let O=Math.round((I.width-k)/2);this._domNode.setLeft(O)}};f.ID="editor.contrib.accessibilityHelpWidget",f.WIDTH=500,f.HEIGHT=300,f=Me([_e(1,a.IContextKeyService),_e(2,r.IKeybindingService),_e(3,i.IOpenerService)],f);class v extends c.EditorAction{constructor(){super({id:"editor.action.showAccessibilityHelp",label:l.AccessibilityHelpNLS.showAccessibilityHelpAction,alias:"Show Accessibility Help",precondition:void 0,kbOpts:{primary:512|59,weight:100,linux:{primary:512|1024|59,secondary:[512|59]}}})}run(I,k){let E=m.get(k);E&&E.show()}}c.registerEditorContribution(m.ID,m),c.registerEditorAction(v);const y=c.EditorCommand.bindToContribution(m.get);c.registerEditorCommand(new y({id:"closeAccessibilityHelp",precondition:h,handler:L=>L.hide(),kbOpts:{weight:100+100,kbExpr:o.EditorContextKeys.focus,primary:9,secondary:[1024|9]}})),t.registerThemingParticipant((L,I)=>{const k=L.getColor(n.editorWidgetBackground);k&&I.addRule(`.monaco-editor .accessibilityHelpWidget { background-color: ${k}; }`);const E=L.getColor(n.editorWidgetForeground);E&&I.addRule(`.monaco-editor .accessibilityHelpWidget { color: ${E}; }`);const T=L.getColor(n.widgetShadow);T&&I.addRule(`.monaco-editor .accessibilityHelpWidget { box-shadow: 0 2px 8px ${T}; }`);const O=L.getColor(n.contrastBorder);O&&I.addRule(`.monaco-editor .accessibilityHelpWidget { border: 2px solid ${O}; }`)})}),define(Q[643],J([0,1,35,7,2,13,355]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.IPadShowKeyboard=void 0;class S extends M.Disposable{constructor(g){super();this.editor=g,this.widget=null,b.isIPad&&(this._register(g.onDidChangeConfiguration(()=>this.update())),this.update())}update(){const g=!this.editor.getOption(75);!this.widget&&g?this.widget=new C(this.editor):this.widget&&!g&&(this.widget.dispose(),this.widget=null)}dispose(){super.dispose(),this.widget&&(this.widget.dispose(),this.widget=null)}}e.IPadShowKeyboard=S,S.ID="editor.contrib.iPadShowKeyboard";class C extends M.Disposable{constructor(g){super();this.editor=g,this._domNode=document.createElement("textarea"),this._domNode.className="iPadShowKeyboard",this._register(N.addDisposableListener(this._domNode,"touchstart",p=>{this.editor.focus()})),this._register(N.addDisposableListener(this._domNode,"focus",p=>{this.editor.focus()})),this.editor.addOverlayWidget(this)}dispose(){this.editor.removeOverlayWidget(this),super.dispose()}getId(){return C.ID}getDomNode(){return this._domNode}getPosition(){return{preference:1}}}C.ID="editor.contrib.ShowKeyboardWidget",w.registerEditorContribution(S.ID,S)}),define(Q[644],J([0,1,7,29,2,13,18,76,57,114,22,11,64,97,356]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0});let a=class Ut extends M.Disposable{constructor(l,h,m){super();this._editor=l,this._modeService=m,this._widget=null,this._register(this._editor.onDidChangeModel(_=>this.stop())),this._register(this._editor.onDidChangeModelLanguage(_=>this.stop())),this._register(S.TokenizationRegistry.onDidChange(_=>this.stop())),this._register(this._editor.onKeyUp(_=>_.keyCode===9&&this.stop()))}static get(l){return l.getContribution(Ut.ID)}dispose(){this.stop(),super.dispose()}launch(){this._widget||!this._editor.hasModel()||(this._widget=new n(this._editor,this._modeService))}stop(){this._widget&&(this._widget.dispose(),this._widget=null)}};a.ID="editor.contrib.inspectTokens",a=Me([_e(1,g.IStandaloneThemeService),_e(2,d.IModeService)],a);class u extends w.EditorAction{constructor(){super({id:"editor.action.inspectTokens",label:o.InspectTokensNLS.inspectTokensAction,alias:"Developer: Inspect Tokens",precondition:void 0})}run(l,h){let m=a.get(h);m&&m.launch()}}function r(t){let l="";for(let h=0,m=t.length;hC.NULL_STATE,tokenize:(h,m,_,f)=>C.nullTokenize(t.language,h,_,f),tokenize2:(h,m,_,f)=>C.nullTokenize2(t.id,h,_,f)}}class n extends M.Disposable{constructor(l,h){super();this.allowEditorOverflow=!0,this._editor=l,this._modeService=h,this._model=this._editor.getModel(),this._domNode=document.createElement("div"),this._domNode.className="tokens-inspect-widget",this._tokenizationSupport=i(this._model.getLanguageIdentifier()),this._compute(this._editor.getPosition()),this._register(this._editor.onDidChangeCursorPosition(m=>this._compute(this._editor.getPosition()))),this._editor.addContentWidget(this)}dispose(){this._editor.removeContentWidget(this),super.dispose()}getId(){return n._ID}_compute(l){let h=this._getTokensAtLine(l.lineNumber),m=0;for(let L=h.tokens1.length-1;L>=0;L--){let I=h.tokens1[L];if(l.column-1>=I.offset){m=L;break}}let _=0;for(let L=h.tokens2.length>>>1;L>=0;L--)if(l.column-1>=h.tokens2[L<<1]){_=L;break}let f=this._model.getLineContent(l.lineNumber),v="";if(m{const h=t.getColor(p.editorHoverBorder);if(h){let f=t.type===s.ColorScheme.HIGH_CONTRAST?2:1;l.addRule(`.monaco-editor .tokens-inspect-widget { border: ${f}px solid ${h}; }`),l.addRule(`.monaco-editor .tokens-inspect-widget .tokens-inspect-separator { background-color: ${h}; }`)}const m=t.getColor(p.editorHoverBackground);m&&l.addRule(`.monaco-editor .tokens-inspect-widget { background-color: ${m}; }`);const _=t.getColor(p.editorHoverForeground);_&&l.addRule(`.monaco-editor .tokens-inspect-widget { color: ${_}; }`)})}),define(Q[645],J([0,1,33,96,64,28,578,20,9,37,26,87,32,13,25,78]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoLineAction=e.StandaloneCommandsQuickAccessProvider=void 0;let r=class extends S.AbstractEditorCommandsQuickAccessProvider{constructor(t,l,h,m,_,f){super({showAlias:!1},t,h,m,_,f);this.codeEditorService=l}get activeTextEditorControl(){return C.withNullAsUndefined(this.codeEditorService.getFocusedCodeEditor())}getCommandPicks(){return Ie(this,void 0,void 0,function*(){return this.getCodeEditorCommandPicks()})}};r=Me([_e(0,d.IInstantiationService),_e(1,w.ICodeEditorService),_e(2,g.IKeybindingService),_e(3,p.ICommandService),_e(4,c.ITelemetryService),_e(5,o.INotificationService)],r),e.StandaloneCommandsQuickAccessProvider=r,b.Registry.as(N.Extensions.Quickaccess).registerQuickAccessProvider({ctor:r,prefix:r.PREFIX,helpEntries:[{description:M.QuickCommandNLS.quickCommandHelp,needsEditor:!0}]});class i extends s.EditorAction{constructor(){super({id:"editor.action.quickCommand",label:M.QuickCommandNLS.quickCommandActionLabel,alias:"Command Palette",precondition:void 0,kbOpts:{kbExpr:a.EditorContextKeys.focus,primary:59,weight:100},contextMenuOpts:{group:"z_commands",order:1}})}run(t){t.get(u.IQuickInputService).quickAccess.show(r.PREFIX)}}e.GotoLineAction=i,s.registerEditorAction(i)}),define(Q[646],J([0,1,602,33,96,28,20,64,6,13,25,78]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoLineAction=e.StandaloneGotoLineQuickAccessProvider=void 0;let o=class extends b.AbstractGotoLineQuickAccessProvider{constructor(u){super();this.editorService=u,this.onDidActiveTextEditorControlChange=d.Event.None}get activeTextEditorControl(){return S.withNullAsUndefined(this.editorService.getFocusedCodeEditor())}};o=Me([_e(0,w.ICodeEditorService)],o),e.StandaloneGotoLineQuickAccessProvider=o,N.Registry.as(M.Extensions.Quickaccess).registerQuickAccessProvider({ctor:o,prefix:o.PREFIX,helpEntries:[{description:C.GoToLineNLS.gotoLineActionLabel,needsEditor:!0}]});class s extends g.EditorAction{constructor(){super({id:"editor.action.gotoLine",label:C.GoToLineNLS.gotoLineActionLabel,alias:"Go to Line/Column...",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:2048|37,mac:{primary:256|37},weight:100}})}run(u){u.get(c.IQuickInputService).quickAccess.show(o.PREFIX)}}e.GotoLineAction=s,g.registerEditorAction(s)}),define(Q[647],J([0,1,603,33,96,28,20,64,6,13,25,78,123,259]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoLineAction=e.StandaloneGotoSymbolQuickAccessProvider=void 0;let o=class extends b.AbstractGotoSymbolQuickAccessProvider{constructor(u){super();this.editorService=u,this.onDidActiveTextEditorControlChange=d.Event.None}get activeTextEditorControl(){return S.withNullAsUndefined(this.editorService.getFocusedCodeEditor())}};o=Me([_e(0,w.ICodeEditorService)],o),e.StandaloneGotoSymbolQuickAccessProvider=o,N.Registry.as(M.Extensions.Quickaccess).registerQuickAccessProvider({ctor:o,prefix:b.AbstractGotoSymbolQuickAccessProvider.PREFIX,helpEntries:[{description:C.QuickOutlineNLS.quickOutlineActionLabel,prefix:b.AbstractGotoSymbolQuickAccessProvider.PREFIX,needsEditor:!0},{description:C.QuickOutlineNLS.quickOutlineByCategoryActionLabel,prefix:b.AbstractGotoSymbolQuickAccessProvider.PREFIX_BY_CATEGORY,needsEditor:!0}]});class s extends g.EditorAction{constructor(){super({id:"editor.action.quickOutline",label:C.QuickOutlineNLS.quickOutlineActionLabel,alias:"Go to Symbol...",precondition:p.EditorContextKeys.hasDocumentSymbolProvider,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:2048|1024|45,weight:100},contextMenuOpts:{group:"navigation",order:3}})}run(u){u.get(c.IQuickInputService).quickAccess.show(b.AbstractGotoSymbolQuickAccessProvider.PREFIX)}}e.GotoLineAction=s,g.registerEditorAction(s)}),define(Q[648],J([0,1,13,114,64]),function(q,e,b,N,M){"use strict";Object.defineProperty(e,"__esModule",{value:!0});class w extends b.EditorAction{constructor(){super({id:"editor.action.toggleHighContrast",label:M.ToggleHighContrastNLS.toggleHighContrast,alias:"Toggle High Contrast Theme",precondition:void 0});this._originalThemeName=null}run(C,d){const g=C.get(N.IStandaloneThemeService);this._originalThemeName?(g.setTheme(this._originalThemeName),this._originalThemeName=null):(this._originalThemeName=g.getColorTheme().themeName,g.setTheme("hc-black"))}}b.registerEditorAction(w)}),define(Q[189],J([0,1,7,55,48,2,518,34,68,37,32,11,112,431,17,359]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createActionViewItem=e.SubmenuEntryActionViewItem=e.MenuEntryActionViewItem=e.createAndFillInActionBarActions=void 0;function u(h,m,_,f,v,y){const L=h.getActions(m);return i(L,_,!1,f,v,y),r(L)}e.createAndFillInActionBarActions=u;function r(h){const m=new w.DisposableStore;for(const[,_]of h)for(const f of _)m.add(f);return m}function i(h,m,_,f=L=>L==="navigation",v=Number.MAX_SAFE_INTEGER,y=()=>!1){let L,I;Array.isArray(m)?(L=m,I=m):(L=m.primary,I=m.secondary);const k=new Set;for(const[E,T]of h){let O;f(E)?O=L:(O=I,O.length>0&&O.push(new M.Separator));for(let A of T){_&&(A=A instanceof C.MenuItemAction&&A.alt?A.alt:A);const B=O.push(A);A instanceof M.SubmenuAction&&k.add({group:E,action:A,index:B-1})}}for(const{group:E,action:T,index:O}of k){const A=f(E)?L:I,B=T.actions;(B.length<=1||A.length+B.length-2<=v)&&y(T,E,A.length)&&A.splice(O,1,...B)}if(L!==I&&L.length>v){const E=L.splice(v,L.length-v);I.unshift(...E,new M.Separator)}}let n=class extends o.ActionViewItem{constructor(m,_,f){super(void 0,m,{icon:!!(m.class||m.item.icon),label:!m.class&&!m.item.icon});this._action=m,this._keybindingService=_,this._notificationService=f,this._wantsAltCommand=!1,this._itemClassDispose=this._register(new w.MutableDisposable),this._altKey=b.ModifierKeyEmitter.getInstance()}get _commandAction(){return this._wantsAltCommand&&this._action.alt||this._action}onClick(m){m.preventDefault(),m.stopPropagation(),this.actionRunner.run(this._commandAction,this._context).catch(_=>this._notificationService.error(_))}render(m){super.render(m),m.classList.add("menu-entry"),this._updateItemClass(this._action.item);let _=!1,f=this._altKey.keyStatus.altKey||(a.isWindows||a.isLinux)&&this._altKey.keyStatus.shiftKey;const v=()=>{const y=_&&f;y!==this._wantsAltCommand&&(this._wantsAltCommand=y,this.updateLabel(),this.updateTooltip(),this.updateClass())};this._action.alt&&this._register(this._altKey.event(y=>{f=y.altKey||(a.isWindows||a.isLinux)&&y.shiftKey,v()})),this._register(N.domEvent(m,"mouseleave")(y=>{_=!1,v()})),this._register(N.domEvent(m,"mouseenter")(y=>{_=!0,v()}))}updateLabel(){this.options.label&&this.label&&(this.label.textContent=this._commandAction.label)}updateTooltip(){if(this.label){const m=this._keybindingService.lookupKeybinding(this._commandAction.id),_=m&&m.getLabel(),f=this._commandAction.tooltip||this._commandAction.label;this.label.title=_?S.localize(0,null,f,_):f}}updateClass(){this.options.icon&&(this._commandAction!==this._action?this._action.alt&&this._updateItemClass(this._action.alt.item):this._action.alt&&this._updateItemClass(this._action.item))}_updateItemClass(m){var _;this._itemClassDispose.value=void 0;const{element:f,label:v}=this;if(!(!f||!v)){const y=this._commandAction.checked&&((_=m.toggled)===null||_===void 0?void 0:_.icon)?m.toggled.icon:m.icon;if(!!y)if(c.ThemeIcon.isThemeIcon(y)){const L=c.ThemeIcon.asClassName(y);v.classList.add(...L.split(" ")),this._itemClassDispose.value=w.toDisposable(()=>{v.classList.remove(...L.split(" "))})}else y.light&&v.style.setProperty("--menu-entry-icon-light",b.asCSSUrl(y.light)),y.dark&&v.style.setProperty("--menu-entry-icon-dark",b.asCSSUrl(y.dark)),v.classList.add("icon"),this._itemClassDispose.value=w.toDisposable(()=>{v.classList.remove("icon"),v.style.removeProperty("--menu-entry-icon-light"),v.style.removeProperty("--menu-entry-icon-dark")})}}};n=Me([_e(1,g.IKeybindingService),_e(2,p.INotificationService)],n),e.MenuEntryActionViewItem=n;let t=class extends s.DropdownMenuActionViewItem{constructor(m,_){super(m,{getActions:()=>m.actions},_,{menuAsChild:!0,classNames:c.ThemeIcon.isThemeIcon(m.item.icon)?c.ThemeIcon.asClassName(m.item.icon):void 0})}render(m){if(super.render(m),this.element){m.classList.add("menu-entry");const{icon:_}=this._action.item;_&&!c.ThemeIcon.isThemeIcon(_)&&(this.element.classList.add("icon"),_.light&&this.element.style.setProperty("--menu-entry-icon-light",b.asCSSUrl(_.light)),_.dark&&this.element.style.setProperty("--menu-entry-icon-dark",b.asCSSUrl(_.dark)))}}};t=Me([_e(1,d.IContextMenuService)],t),e.SubmenuEntryActionViewItem=t;function l(h,m){return m instanceof C.MenuItemAction?h.createInstance(n,m):m instanceof C.SubmenuItemAction?h.createInstance(t,m):void 0}e.createActionViewItem=l}),define(Q[118],J([0,1,7,83,48,29,6,40,28,144,543,500,16,9,74,13,22,27,189,349]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.peekViewEditorMatchHighlightBorder=e.peekViewEditorMatchHighlight=e.peekViewResultsMatchHighlight=e.peekViewEditorGutterBackground=e.peekViewEditorBackground=e.peekViewResultsSelectionForeground=e.peekViewResultsSelectionBackground=e.peekViewResultsFileForeground=e.peekViewResultsMatchForeground=e.peekViewResultsBackground=e.peekViewBorder=e.peekViewTitleInfoForeground=e.peekViewTitleForeground=e.peekViewTitleBackground=e.PeekViewWidget=e.getOuterEditor=e.PeekContext=e.IPeekViewService=void 0,e.IPeekViewService=s.createDecorator("IPeekViewService"),a.registerSingleton(e.IPeekViewService,class{constructor(){this._widgets=new Map}addExclusiveWidget(f,v){const y=this._widgets.get(f);y&&(y.listener.dispose(),y.widget.dispose());const L=()=>{const I=this._widgets.get(f);I&&I.widget===v&&(I.listener.dispose(),this._widgets.delete(f))};this._widgets.set(f,{widget:v,listener:v.onDidClose(L)})}});var t;(function(f){f.inPeekEditor=new o.RawContextKey("inReferenceSearchEditor",!0),f.notInPeekEditor=f.inPeekEditor.toNegated()})(t=e.PeekContext||(e.PeekContext={}));let l=class{constructor(v,y){v instanceof g.EmbeddedCodeEditorWidget&&t.inPeekEditor.bindTo(y)}dispose(){}};l.ID="editor.contrib.referenceController",l=Me([_e(1,o.IContextKeyService)],l),u.registerEditorContribution(l.ID,l);function h(f){let v=f.get(d.ICodeEditorService).getFocusedCodeEditor();return v instanceof g.EmbeddedCodeEditorWidget?v.getParentEditor():v}e.getOuterEditor=h;const m={headerBackgroundColor:w.Color.white,primaryHeadingColor:w.Color.fromHex("#333333"),secondaryHeadingColor:w.Color.fromHex("#6c6c6cb3")};let _=class extends p.ZoneWidget{constructor(v,y,L){super(v,y);this.instantiationService=L,this._onDidClose=new S.Emitter,this.onDidClose=this._onDidClose.event,C.mixin(this.options,m,!1)}dispose(){this.disposed||(this.disposed=!0,super.dispose(),this._onDidClose.fire(this))}style(v){let y=this.options;v.headerBackgroundColor&&(y.headerBackgroundColor=v.headerBackgroundColor),v.primaryHeadingColor&&(y.primaryHeadingColor=v.primaryHeadingColor),v.secondaryHeadingColor&&(y.secondaryHeadingColor=v.secondaryHeadingColor),super.style(v)}_applyStyles(){super._applyStyles();let v=this.options;this._headElement&&v.headerBackgroundColor&&(this._headElement.style.backgroundColor=v.headerBackgroundColor.toString()),this._primaryHeading&&v.primaryHeadingColor&&(this._primaryHeading.style.color=v.primaryHeadingColor.toString()),this._secondaryHeading&&v.secondaryHeadingColor&&(this._secondaryHeading.style.color=v.secondaryHeadingColor.toString()),this._bodyElement&&v.frameColor&&(this._bodyElement.style.borderColor=v.frameColor.toString())}_fillContainer(v){this.setCssClass("peekview-widget"),this._headElement=b.$(".head"),this._bodyElement=b.$(".body"),this._fillHead(this._headElement),this._fillBody(this._bodyElement),v.appendChild(this._headElement),v.appendChild(this._bodyElement)}_fillHead(v,y){const L=b.$(".peekview-title");b.append(this._headElement,L),b.addStandardDisposableListener(L,"click",E=>this._onTitleClick(E)),this._fillTitleIcon(L),this._primaryHeading=b.$("span.filename"),this._secondaryHeading=b.$("span.dirname"),this._metaHeading=b.$("span.meta"),b.append(L,this._primaryHeading,this._secondaryHeading,this._metaHeading);const I=b.$(".peekview-actions");b.append(this._headElement,I);const k=this._getActionBarOptions();this._actionbarWidget=new N.ActionBar(I,k),this._disposables.add(this._actionbarWidget),y||this._actionbarWidget.push(new M.Action("peekview.close",c.localize(0,null),i.Codicon.close.classNames,!0,()=>(this.dispose(),Promise.resolve())),{label:!1,icon:!0})}_fillTitleIcon(v){}_getActionBarOptions(){return{actionViewItemProvider:n.createActionViewItem.bind(void 0,this.instantiationService),orientation:0}}_onTitleClick(v){}setTitle(v,y){this._primaryHeading&&this._secondaryHeading&&(this._primaryHeading.innerText=v,this._primaryHeading.setAttribute("aria-label",v),y?this._secondaryHeading.innerText=y:b.clearNode(this._secondaryHeading))}setMetaTitle(v){this._metaHeading&&(v?(this._metaHeading.innerText=v,b.show(this._metaHeading)):b.hide(this._metaHeading))}_doLayout(v,y){if(!this._isShowing&&v<0){this.dispose();return}const L=Math.ceil(this.editor.getOption(53)*1.2),I=Math.round(v-(L+2));this._doLayoutHead(L,y),this._doLayoutBody(I,y)}_doLayoutHead(v,y){this._headElement&&(this._headElement.style.height=`${v}px`,this._headElement.style.lineHeight=this._headElement.style.height)}_doLayoutBody(v,y){this._bodyElement&&(this._bodyElement.style.height=`${v}px`)}};_=Me([_e(2,s.IInstantiationService)],_),e.PeekViewWidget=_,e.peekViewTitleBackground=r.registerColor("peekViewTitle.background",{dark:"#1E1E1E",light:"#FFFFFF",hc:"#0C141F"},c.localize(1,null)),e.peekViewTitleForeground=r.registerColor("peekViewTitleLabel.foreground",{dark:"#FFFFFF",light:"#333333",hc:"#FFFFFF"},c.localize(2,null)),e.peekViewTitleInfoForeground=r.registerColor("peekViewTitleDescription.foreground",{dark:"#ccccccb3",light:"#616161e6",hc:"#FFFFFF99"},c.localize(3,null)),e.peekViewBorder=r.registerColor("peekView.border",{dark:"#007acc",light:"#007acc",hc:r.contrastBorder},c.localize(4,null)),e.peekViewResultsBackground=r.registerColor("peekViewResult.background",{dark:"#252526",light:"#F3F3F3",hc:w.Color.black},c.localize(5,null)),e.peekViewResultsMatchForeground=r.registerColor("peekViewResult.lineForeground",{dark:"#bbbbbb",light:"#646465",hc:w.Color.white},c.localize(6,null)),e.peekViewResultsFileForeground=r.registerColor("peekViewResult.fileForeground",{dark:w.Color.white,light:"#1E1E1E",hc:w.Color.white},c.localize(7,null)),e.peekViewResultsSelectionBackground=r.registerColor("peekViewResult.selectionBackground",{dark:"#3399ff33",light:"#3399ff33",hc:null},c.localize(8,null)),e.peekViewResultsSelectionForeground=r.registerColor("peekViewResult.selectionForeground",{dark:w.Color.white,light:"#6C6C6C",hc:w.Color.white},c.localize(9,null)),e.peekViewEditorBackground=r.registerColor("peekViewEditor.background",{dark:"#001F33",light:"#F2F8FC",hc:w.Color.black},c.localize(10,null)),e.peekViewEditorGutterBackground=r.registerColor("peekViewEditorGutter.background",{dark:e.peekViewEditorBackground,light:e.peekViewEditorBackground,hc:e.peekViewEditorBackground},c.localize(11,null)),e.peekViewResultsMatchHighlight=r.registerColor("peekViewResult.matchHighlightBackground",{dark:"#ea5c004d",light:"#ea5c004d",hc:null},c.localize(12,null)),e.peekViewEditorMatchHighlight=r.registerColor("peekViewEditor.matchHighlightBackground",{dark:"#ff8f0099",light:"#f5d802de",hc:null},c.localize(13,null)),e.peekViewEditorMatchHighlightBorder=r.registerColor("peekViewEditor.matchHighlightBorder",{dark:null,light:null,hc:r.activeContrastBorder},c.localize(14,null))}),define(Q[649],J([0,1,7,83,2,117,511,189,34,16,9]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestWidgetStatus=void 0;class c extends C.MenuEntryActionViewItem{updateLabel(){const a=this._keybindingService.lookupKeybinding(this._action.id);if(!a)return super.updateLabel();this.label&&(this.label.textContent=S.localize(0,null,this._action.label,c.symbolPrintEnter(a)))}static symbolPrintEnter(a){var u;return(u=a.getLabel())===null||u===void 0?void 0:u.replace(/\benter\b/gi,"\u23CE")}}let o=class{constructor(a,u,r,i){this._menuService=r,this._contextKeyService=i,this._menuDisposables=new M.DisposableStore,this.element=b.append(a,b.$(".suggest-status-bar"));const n=t=>t instanceof d.MenuItemAction?u.createInstance(c,t):void 0;this._leftActions=new N.ActionBar(this.element,{actionViewItemProvider:n}),this._rightActions=new N.ActionBar(this.element,{actionViewItemProvider:n}),this._leftActions.domNode.classList.add("left"),this._rightActions.domNode.classList.add("right")}dispose(){this._menuDisposables.dispose(),this.element.remove()}show(){const a=this._menuService.createMenu(w.suggestWidgetStatusbarMenu,this._contextKeyService),u=()=>{const r=[],i=[];for(let[n,t]of a.getActions())n==="left"?r.push(...t):i.push(...t);this._leftActions.clear(),this._leftActions.push(r),this._rightActions.clear(),this._rightActions.push(i)};this._menuDisposables.add(a.onDidChange(()=>u())),this._menuDisposables.add(a)}hide(){this._menuDisposables.clear()}};o=Me([_e(1,p.IInstantiationService),_e(2,d.IMenuService),_e(3,g.IContextKeyService)],o),e.SuggestWidgetStatus=o}),define(Q[650],J([0,1,15,6,2,34,26,16]),function(q,e,b,N,M,w,S,C){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MenuService=void 0;let d=class{constructor(c){this._commandService=c}createMenu(c,o,s=!1){return new g(c,s,this._commandService,o,this)}};d=Me([_e(0,S.ICommandService)],d),e.MenuService=d;let g=class et{constructor(c,o,s,a,u){this._id=c,this._fireEventsForSubmenuChanges=o,this._commandService=s,this._contextKeyService=a,this._menuService=u,this._dispoables=new M.DisposableStore,this._onDidChange=new N.Emitter,this.onDidChange=this._onDidChange.event,this._menuGroups=[],this._contextKeys=new Set,this._build();const r=new b.RunOnceScheduler(()=>this._build(),50);this._dispoables.add(r),this._dispoables.add(w.MenuRegistry.onDidChangeMenu(n=>{n.has(c)&&r.schedule()}));const i=new b.RunOnceScheduler(()=>this._onDidChange.fire(this),50);this._dispoables.add(i),this._dispoables.add(a.onDidChangeContext(n=>{n.affectsSome(this._contextKeys)&&i.schedule()}))}dispose(){this._dispoables.dispose(),this._onDidChange.dispose()}_build(){this._menuGroups.length=0,this._contextKeys.clear();const c=w.MenuRegistry.getMenuItems(this._id);let o;c.sort(et._compareMenuItems);for(let s of c){const a=s.group||"";(!o||o[0]!==a)&&(o=[a,[]],this._menuGroups.push(o)),o[1].push(s),this._collectContextKeys(s)}this._onDidChange.fire(this)}_collectContextKeys(c){if(et._fillInKbExprKeys(c.when,this._contextKeys),w.isIMenuItem(c)){if(c.command.precondition&&et._fillInKbExprKeys(c.command.precondition,this._contextKeys),c.command.toggled){const o=c.command.toggled.condition||c.command.toggled;et._fillInKbExprKeys(o,this._contextKeys)}}else this._fireEventsForSubmenuChanges&&w.MenuRegistry.getMenuItems(c.submenu).forEach(this._collectContextKeys,this)}getActions(c){const o=[];for(let s of this._menuGroups){const[a,u]=s,r=[];for(const i of u)if(this._contextKeyService.contextMatchesRules(i.when)){const n=w.isIMenuItem(i)?new w.MenuItemAction(i.command,i.alt,c,this._contextKeyService,this._commandService):new w.SubmenuItemAction(i,this._menuService,this._contextKeyService,c);r.push(n)}r.length>0&&o.push([a,r])}return o}static _fillInKbExprKeys(c,o){if(c)for(let s of c.keys())o.add(s)}static _compareMenuItems(c,o){let s=c.group,a=o.group;if(s!==a){if(s){if(!a)return-1}else return 1;if(s==="navigation")return-1;if(a==="navigation")return 1;let i=s.localeCompare(a);if(i!==0)return i}let u=c.order||0,r=o.order||0;return ur?1:et._compareTitles(w.isIMenuItem(c)?c.command.title:c.title,w.isIMenuItem(o)?o.command.title:o.title)}static _compareTitles(c,o){const s=typeof c=="string"?c:c.original,a=typeof o=="string"?o:o.original;return s.localeCompare(a)}};g=Me([_e(2,S.ICommandService),_e(3,C.IContextKeyService),_e(4,w.IMenuService)],g)}),define(Q[651],J([0,1,579,68,87,32,11,37,2,7]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenuService=void 0;let p=class extends d.Disposable{constructor(o,s,a,u,r){super();this.contextMenuHandler=new b.ContextMenuHandler(a,o,s,u,r)}configure(o){this.contextMenuHandler.configure(o)}showContextMenu(o){this.contextMenuHandler.showContextMenu(o),g.ModifierKeyEmitter.getInstance().resetKeyStatus()}};p=Me([_e(0,M.ITelemetryService),_e(1,w.INotificationService),_e(2,N.IContextViewService),_e(3,C.IKeybindingService),_e(4,S.IThemeService)],p),e.ContextMenuService=p}),define(Q[147],J([0,1,7,312,105,6,2,523,46,95,16,9,37,33,116,11,250,234,428,427,65,315]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.WorkbenchCompressibleAsyncDataTree=e.WorkbenchAsyncDataTree=e.WorkbenchDataTree=e.WorkbenchCompressibleObjectTree=e.WorkbenchObjectTree=e.WorkbenchTable=e.WorkbenchPagedList=e.WorkbenchList=e.didBindWorkbenchListAutomaticKeyboardNavigation=e.WorkbenchListAutomaticKeyboardNavigation=e.WorkbenchListAutomaticKeyboardNavigationKey=e.WorkbenchListSupportsKeyboardNavigation=e.WorkbenchListMultiSelection=e.WorkbenchListDoubleSelection=e.WorkbenchListHasSelectionOrFocus=e.WorkbenchListFocusContextKey=e.WorkbenchListSupportsMultiSelectContextKey=e.ListService=e.IListService=void 0,e.IListService=c.createDecorator("listService");let m=class{constructor(oe){this._themeService=oe,this.disposables=new S.DisposableStore,this.lists=[],this._lastFocusedWidget=void 0,this._hasCreatedStyleController=!1}get lastFocusedList(){return this._lastFocusedWidget}register(oe,ae){if(!this._hasCreatedStyleController){this._hasCreatedStyleController=!0;const j=new M.DefaultStyleController(b.createStyleSheet(),"");this.disposables.add(a.attachListStyler(j,this._themeService))}if(this.lists.some(j=>j.widget===oe))throw new Error("Cannot register the same widget multiple times");const G={widget:oe,extraContextKeys:ae};return this.lists.push(G),oe.getHTMLElement()===document.activeElement&&(this._lastFocusedWidget=oe),S.combinedDisposable(oe.onDidFocus(()=>this._lastFocusedWidget=oe),S.toDisposable(()=>this.lists.splice(this.lists.indexOf(G),1)),oe.onDidDispose(()=>{this.lists=this.lists.filter(j=>j!==G),this._lastFocusedWidget===oe&&(this._lastFocusedWidget=void 0)}))}dispose(){this.disposables.dispose()}};m=Me([_e(0,u.IThemeService)],m),e.ListService=m;const _=new p.RawContextKey("listFocus",!0);e.WorkbenchListSupportsMultiSelectContextKey=new p.RawContextKey("listSupportsMultiselect",!0),e.WorkbenchListFocusContextKey=p.ContextKeyExpr.and(_,p.ContextKeyExpr.not(r.InputFocusedContextKey)),e.WorkbenchListHasSelectionOrFocus=new p.RawContextKey("listHasSelectionOrFocus",!1),e.WorkbenchListDoubleSelection=new p.RawContextKey("listDoubleSelection",!1),e.WorkbenchListMultiSelection=new p.RawContextKey("listMultiSelection",!1),e.WorkbenchListSupportsKeyboardNavigation=new p.RawContextKey("listSupportsKeyboardNavigation",!0),e.WorkbenchListAutomaticKeyboardNavigationKey="listAutomaticKeyboardNavigation",e.WorkbenchListAutomaticKeyboardNavigation=new p.RawContextKey(e.WorkbenchListAutomaticKeyboardNavigationKey,!0),e.didBindWorkbenchListAutomaticKeyboardNavigation=!1;function f(ie,oe){const ae=ie.createScoped(oe.getHTMLElement());return _.bindTo(ae),ae}const v="workbench.list.multiSelectModifier",y="workbench.list.openMode",L="workbench.list.horizontalScrolling",I="workbench.list.keyboardNavigation",k="workbench.list.automaticKeyboardNavigation",E="workbench.tree.indent",T="workbench.tree.renderIndentGuides",O="workbench.list.smoothScrolling",A="workbench.tree.expandMode";function B(ie){return ie.getValue(v)==="alt"}class F extends S.Disposable{constructor(oe){super();this.configurationService=oe,this.useAltAsMultipleSelectionModifier=B(oe),this.registerListeners()}registerListeners(){this._register(this.configurationService.onDidChangeConfiguration(oe=>{oe.affectsConfiguration(v)&&(this.useAltAsMultipleSelectionModifier=B(this.configurationService))}))}isSelectionSingleChangeEvent(oe){return this.useAltAsMultipleSelectionModifier?oe.browserEvent.altKey:M.isSelectionSingleChangeEvent(oe)}isSelectionRangeChangeEvent(oe){return M.isSelectionRangeChangeEvent(oe)}}function D(ie,oe,ae){const G=new S.DisposableStore,j=Object.assign({},ie);if(ie.multipleSelectionSupport!==!1&&!ie.multipleSelectionController){const te=new F(oe);j.multipleSelectionController=te,G.add(te)}return j.keyboardNavigationDelegate={mightProducePrintableCharacter(te){return ae.mightProducePrintableCharacter(te)}},j.smoothScrolling=oe.getValue(O),[j,G]}let R=class extends M.List{constructor(oe,ae,G,j,te,Z,ue,he,re,ce){const me=typeof te.horizontalScrolling!="undefined"?te.horizontalScrolling:re.getValue(L),[Ce,be]=D(te,re,ce);super(oe,ae,G,j,Object.assign(Object.assign(Object.assign({keyboardSupport:!1},a.computeStyles(he.getColorTheme(),a.defaultListStyles)),Ce),{horizontalScrolling:me}));this.disposables.add(be),this.contextKeyService=f(Z,this),this.themeService=he,e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService).set(te.multipleSelectionSupport!==!1),this.listHasSelectionOrFocus=e.WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService),this.listDoubleSelection=e.WorkbenchListDoubleSelection.bindTo(this.contextKeyService),this.listMultiSelection=e.WorkbenchListMultiSelection.bindTo(this.contextKeyService),this.horizontalScrolling=te.horizontalScrolling,this._useAltAsMultipleSelectionModifier=B(re),this.disposables.add(this.contextKeyService),this.disposables.add(ue.register(this)),te.overrideStyles&&this.updateStyles(te.overrideStyles),this.disposables.add(this.onDidChangeSelection(()=>{const De=this.getSelection(),Re=this.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.listHasSelectionOrFocus.set(De.length>0||Re.length>0),this.listMultiSelection.set(De.length>1),this.listDoubleSelection.set(De.length===2)})})),this.disposables.add(this.onDidChangeFocus(()=>{const De=this.getSelection(),Re=this.getFocus();this.listHasSelectionOrFocus.set(De.length>0||Re.length>0)})),this.disposables.add(re.onDidChangeConfiguration(De=>{De.affectsConfiguration(v)&&(this._useAltAsMultipleSelectionModifier=B(re));let Re={};if(De.affectsConfiguration(L)&&this.horizontalScrolling===void 0){const Ee=re.getValue(L);Re=Object.assign(Object.assign({},Re),{horizontalScrolling:Ee})}if(De.affectsConfiguration(O)){const Ee=re.getValue(O);Re=Object.assign(Object.assign({},Re),{smoothScrolling:Ee})}Object.keys(Re).length>0&&this.updateOptions(Re)})),this.navigator=new Y(this,Object.assign({configurationService:re},te)),this.disposables.add(this.navigator)}updateOptions(oe){super.updateOptions(oe),oe.overrideStyles&&this.updateStyles(oe.overrideStyles)}updateStyles(oe){var ae;(ae=this._styler)===null||ae===void 0||ae.dispose(),this._styler=a.attachListStyler(this,this.themeService,oe)}dispose(){var oe;(oe=this._styler)===null||oe===void 0||oe.dispose(),super.dispose()}};R=Me([_e(5,p.IContextKeyService),_e(6,e.IListService),_e(7,u.IThemeService),_e(8,d.IConfigurationService),_e(9,o.IKeybindingService)],R),e.WorkbenchList=R;let W=class extends N.PagedList{constructor(oe,ae,G,j,te,Z,ue,he,re,ce){const me=typeof te.horizontalScrolling!="undefined"?te.horizontalScrolling:re.getValue(L),[Ce,be]=D(te,re,ce);super(oe,ae,G,j,Object.assign(Object.assign(Object.assign({keyboardSupport:!1},a.computeStyles(he.getColorTheme(),a.defaultListStyles)),Ce),{horizontalScrolling:me}));this.disposables=new S.DisposableStore,this.disposables.add(be),this.contextKeyService=f(Z,this),this.themeService=he,this.horizontalScrolling=te.horizontalScrolling,e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService).set(te.multipleSelectionSupport!==!1),this._useAltAsMultipleSelectionModifier=B(re),this.disposables.add(this.contextKeyService),this.disposables.add(ue.register(this)),te.overrideStyles&&this.updateStyles(te.overrideStyles),te.overrideStyles&&this.disposables.add(a.attachListStyler(this,he,te.overrideStyles)),this.disposables.add(re.onDidChangeConfiguration(De=>{De.affectsConfiguration(v)&&(this._useAltAsMultipleSelectionModifier=B(re));let Re={};if(De.affectsConfiguration(L)&&this.horizontalScrolling===void 0){const Ee=re.getValue(L);Re=Object.assign(Object.assign({},Re),{horizontalScrolling:Ee})}if(De.affectsConfiguration(O)){const Ee=re.getValue(O);Re=Object.assign(Object.assign({},Re),{smoothScrolling:Ee})}Object.keys(Re).length>0&&this.updateOptions(Re)})),this.navigator=new Y(this,Object.assign({configurationService:re},te)),this.disposables.add(this.navigator)}updateOptions(oe){super.updateOptions(oe),oe.overrideStyles&&this.updateStyles(oe.overrideStyles)}updateStyles(oe){var ae;(ae=this._styler)===null||ae===void 0||ae.dispose(),this._styler=a.attachListStyler(this,this.themeService,oe)}dispose(){var oe;(oe=this._styler)===null||oe===void 0||oe.dispose(),this.disposables.dispose(),super.dispose()}};W=Me([_e(5,p.IContextKeyService),_e(6,e.IListService),_e(7,u.IThemeService),_e(8,d.IConfigurationService),_e(9,o.IKeybindingService)],W),e.WorkbenchPagedList=W;let x=class extends h.Table{constructor(oe,ae,G,j,te,Z,ue,he,re,ce,me){const Ce=typeof Z.horizontalScrolling!="undefined"?Z.horizontalScrolling:ce.getValue(L),[be,Le]=D(Z,ce,me);super(oe,ae,G,j,te,Object.assign(Object.assign(Object.assign({keyboardSupport:!1},a.computeStyles(re.getColorTheme(),a.defaultListStyles)),be),{horizontalScrolling:Ce}));this.disposables=new S.DisposableStore,this.disposables.add(Le),this.contextKeyService=f(ue,this),this.themeService=re,e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService).set(Z.multipleSelectionSupport!==!1),this.listHasSelectionOrFocus=e.WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService),this.listDoubleSelection=e.WorkbenchListDoubleSelection.bindTo(this.contextKeyService),this.listMultiSelection=e.WorkbenchListMultiSelection.bindTo(this.contextKeyService),this.horizontalScrolling=Z.horizontalScrolling,this._useAltAsMultipleSelectionModifier=B(ce),this.disposables.add(this.contextKeyService),this.disposables.add(he.register(this)),Z.overrideStyles&&this.updateStyles(Z.overrideStyles),this.disposables.add(this.onDidChangeSelection(()=>{const Re=this.getSelection(),Ee=this.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.listHasSelectionOrFocus.set(Re.length>0||Ee.length>0),this.listMultiSelection.set(Re.length>1),this.listDoubleSelection.set(Re.length===2)})})),this.disposables.add(this.onDidChangeFocus(()=>{const Re=this.getSelection(),Ee=this.getFocus();this.listHasSelectionOrFocus.set(Re.length>0||Ee.length>0)})),this.disposables.add(ce.onDidChangeConfiguration(Re=>{Re.affectsConfiguration(v)&&(this._useAltAsMultipleSelectionModifier=B(ce));let Ee={};if(Re.affectsConfiguration(L)&&this.horizontalScrolling===void 0){const Ae=ce.getValue(L);Ee=Object.assign(Object.assign({},Ee),{horizontalScrolling:Ae})}if(Re.affectsConfiguration(O)){const Ae=ce.getValue(O);Ee=Object.assign(Object.assign({},Ee),{smoothScrolling:Ae})}Object.keys(Ee).length>0&&this.updateOptions(Ee)})),this.navigator=new ee(this,Object.assign({configurationService:ce},Z)),this.disposables.add(this.navigator)}updateOptions(oe){super.updateOptions(oe),oe.overrideStyles&&this.updateStyles(oe.overrideStyles)}updateStyles(oe){var ae;(ae=this._styler)===null||ae===void 0||ae.dispose(),this._styler=a.attachListStyler(this,this.themeService,oe)}dispose(){var oe;(oe=this._styler)===null||oe===void 0||oe.dispose(),this.disposables.dispose(),super.dispose()}};x=Me([_e(6,p.IContextKeyService),_e(7,e.IListService),_e(8,u.IThemeService),_e(9,d.IConfigurationService),_e(10,o.IKeybindingService)],x),e.WorkbenchTable=x;class K extends S.Disposable{constructor(oe,ae){var G,j;super();this.widget=oe,this._onDidOpen=this._register(new w.Emitter),this.onDidOpen=this._onDidOpen.event,this.openOnFocus=(G=ae==null?void 0:ae.openOnFocus)!==null&&G!==void 0?G:!1,this._register(w.Event.filter(this.widget.onDidChangeSelection,te=>te.browserEvent instanceof KeyboardEvent)(te=>this.onSelectionFromKeyboard(te))),this._register(this.widget.onPointer(te=>this.onPointer(te.element,te.browserEvent))),this._register(this.widget.onMouseDblClick(te=>this.onMouseDblClick(te.element,te.browserEvent))),this.openOnFocus&&this._register(w.Event.filter(this.widget.onDidChangeFocus,te=>te.browserEvent instanceof KeyboardEvent)(te=>this.onFocusFromKeyboard(te))),typeof(ae==null?void 0:ae.openOnSingleClick)!="boolean"&&(ae==null?void 0:ae.configurationService)?(this.openOnSingleClick=(ae==null?void 0:ae.configurationService.getValue(y))!=="doubleClick",this._register(ae==null?void 0:ae.configurationService.onDidChangeConfiguration(()=>{this.openOnSingleClick=(ae==null?void 0:ae.configurationService.getValue(y))!=="doubleClick"}))):this.openOnSingleClick=(j=ae==null?void 0:ae.openOnSingleClick)!==null&&j!==void 0?j:!0}onFocusFromKeyboard(oe){const ae=this.widget.getFocus();this.widget.setSelection(ae,oe.browserEvent);const G=oe.browserEvent,j=typeof G.preserveFocus=="boolean"?G.preserveFocus:!0,te=typeof G.pinned=="boolean"?G.pinned:!j,Z=!1;this._open(this.getSelectedElement(),j,te,Z,oe.browserEvent)}onSelectionFromKeyboard(oe){if(oe.elements.length===1){const ae=oe.browserEvent,G=typeof ae.preserveFocus=="boolean"?ae.preserveFocus:!0,j=typeof ae.pinned=="boolean"?ae.pinned:!G,te=!1;this._open(this.getSelectedElement(),G,j,te,oe.browserEvent)}}onPointer(oe,ae){if(!!this.openOnSingleClick&&ae.detail!==2){const j=ae.button===1,te=!0,Z=j,ue=ae.ctrlKey||ae.metaKey||ae.altKey;this._open(oe,te,Z,ue,ae)}}onMouseDblClick(oe,ae){if(!!ae){const G=!1,j=!0,te=ae.ctrlKey||ae.metaKey||ae.altKey;this._open(oe,G,j,te,ae)}}_open(oe,ae,G,j,te){!oe||this._onDidOpen.fire({editorOptions:{preserveFocus:ae,pinned:G,revealIfVisible:!0},sideBySide:j,element:oe,browserEvent:te})}}class Y extends K{constructor(oe,ae){super(oe,ae);this.widget=oe}getSelectedElement(){return this.widget.getSelectedElements()[0]}}class ee extends K{constructor(oe,ae){super(oe,ae);this.widget=oe}getSelectedElement(){return this.widget.getSelectedElements()[0]}}class se extends K{constructor(oe,ae){super(oe,ae);this.widget=oe}getSelectedElement(){var oe;return(oe=this.widget.getSelection()[0])!==null&&oe!==void 0?oe:void 0}}function ne(ie,oe){let ae=!1;return G=>{if(ae)return ae=!1,!1;const j=oe.softDispatch(G,ie);return j&&j.enterChord?(ae=!0,!1):(ae=!1,!0)}}let le=class extends i.ObjectTree{constructor(oe,ae,G,j,te,Z,ue,he,re,ce,me){const{options:Ce,getAutomaticKeyboardNavigation:be,disposable:Le}=U(ae,te,Z,re,ce,me);super(oe,ae,G,j,Ce);this.disposables.add(Le),this.internals=new H(this,te,be,te.overrideStyles,Z,ue,he,re,me),this.disposables.add(this.internals)}};le=Me([_e(5,p.IContextKeyService),_e(6,e.IListService),_e(7,u.IThemeService),_e(8,d.IConfigurationService),_e(9,o.IKeybindingService),_e(10,l.IAccessibilityService)],le),e.WorkbenchObjectTree=le;let X=class extends i.CompressibleObjectTree{constructor(oe,ae,G,j,te,Z,ue,he,re,ce,me){const{options:Ce,getAutomaticKeyboardNavigation:be,disposable:Le}=U(ae,te,Z,re,ce,me);super(oe,ae,G,j,Ce);this.disposables.add(Le),this.internals=new H(this,te,be,te.overrideStyles,Z,ue,he,re,me),this.disposables.add(this.internals)}updateOptions(oe={}){super.updateOptions(oe),oe.overrideStyles&&this.internals.updateStyleOverrides(oe.overrideStyles)}};X=Me([_e(5,p.IContextKeyService),_e(6,e.IListService),_e(7,u.IThemeService),_e(8,d.IConfigurationService),_e(9,o.IKeybindingService),_e(10,l.IAccessibilityService)],X),e.WorkbenchCompressibleObjectTree=X;let z=class extends t.DataTree{constructor(oe,ae,G,j,te,Z,ue,he,re,ce,me,Ce){const{options:be,getAutomaticKeyboardNavigation:Le,disposable:De}=U(ae,Z,ue,ce,me,Ce);super(oe,ae,G,j,te,be);this.disposables.add(De),this.internals=new H(this,Z,Le,Z.overrideStyles,ue,he,re,ce,Ce),this.disposables.add(this.internals)}updateOptions(oe={}){super.updateOptions(oe),oe.overrideStyles&&this.internals.updateStyleOverrides(oe.overrideStyles)}};z=Me([_e(6,p.IContextKeyService),_e(7,e.IListService),_e(8,u.IThemeService),_e(9,d.IConfigurationService),_e(10,o.IKeybindingService),_e(11,l.IAccessibilityService)],z),e.WorkbenchDataTree=z;let P=class extends n.AsyncDataTree{constructor(oe,ae,G,j,te,Z,ue,he,re,ce,me,Ce){const{options:be,getAutomaticKeyboardNavigation:Le,disposable:De}=U(ae,Z,ue,ce,me,Ce);super(oe,ae,G,j,te,be);this.disposables.add(De),this.internals=new H(this,Z,Le,Z.overrideStyles,ue,he,re,ce,Ce),this.disposables.add(this.internals)}get onDidOpen(){return this.internals.onDidOpen}updateOptions(oe={}){super.updateOptions(oe),oe.overrideStyles&&this.internals.updateStyleOverrides(oe.overrideStyles)}};P=Me([_e(6,p.IContextKeyService),_e(7,e.IListService),_e(8,u.IThemeService),_e(9,d.IConfigurationService),_e(10,o.IKeybindingService),_e(11,l.IAccessibilityService)],P),e.WorkbenchAsyncDataTree=P;let V=class extends n.CompressibleAsyncDataTree{constructor(oe,ae,G,j,te,Z,ue,he,re,ce,me,Ce,be){const{options:Le,getAutomaticKeyboardNavigation:De,disposable:Re}=U(ae,ue,he,me,Ce,be);super(oe,ae,G,j,te,Z,Le);this.disposables.add(Re),this.internals=new H(this,ue,De,ue.overrideStyles,he,re,ce,me,be),this.disposables.add(this.internals)}};V=Me([_e(7,p.IContextKeyService),_e(8,e.IListService),_e(9,u.IThemeService),_e(10,d.IConfigurationService),_e(11,o.IKeybindingService),_e(12,l.IAccessibilityService)],V),e.WorkbenchCompressibleAsyncDataTree=V;function U(ie,oe,ae,G,j,te){var Z;e.WorkbenchListSupportsKeyboardNavigation.bindTo(ae),e.didBindWorkbenchListAutomaticKeyboardNavigation||(e.WorkbenchListAutomaticKeyboardNavigation.bindTo(ae),e.didBindWorkbenchListAutomaticKeyboardNavigation=!0);const ue=()=>{let Le=ae.getContextKeyValue(e.WorkbenchListAutomaticKeyboardNavigationKey);return Le&&(Le=G.getValue(k)),Le},he=te.isScreenReaderOptimized(),re=oe.simpleKeyboardNavigation||he?"simple":G.getValue(I),ce=oe.horizontalScrolling!==void 0?oe.horizontalScrolling:G.getValue(L),[me,Ce]=D(oe,G,j),be=oe.additionalScrollHeight;return{getAutomaticKeyboardNavigation:ue,disposable:Ce,options:Object.assign(Object.assign({keyboardSupport:!1},me),{indent:G.getValue(E),renderIndentGuides:G.getValue(T),smoothScrolling:G.getValue(O),automaticKeyboardNavigation:ue(),simpleKeyboardNavigation:re==="simple",filterOnType:re==="filter",horizontalScrolling:ce,keyboardNavigationEventFilter:ne(ie,j),additionalScrollHeight:be,hideTwistiesOfChildlessElements:oe.hideTwistiesOfChildlessElements,expandOnlyOnTwistieClick:(Z=oe.expandOnlyOnTwistieClick)!==null&&Z!==void 0?Z:G.getValue(A)==="doubleClick"})}}let H=class{constructor(oe,ae,G,j,te,Z,ue,he,re){this.tree=oe,this.themeService=ue,this.disposables=[],this.contextKeyService=f(te,oe),e.WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService).set(ae.multipleSelectionSupport!==!1),this.hasSelectionOrFocus=e.WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService),this.hasDoubleSelection=e.WorkbenchListDoubleSelection.bindTo(this.contextKeyService),this.hasMultiSelection=e.WorkbenchListMultiSelection.bindTo(this.contextKeyService),this._useAltAsMultipleSelectionModifier=B(he);const me=new Set;me.add(e.WorkbenchListAutomaticKeyboardNavigationKey);const Ce=()=>{const Le=re.isScreenReaderOptimized()?"simple":he.getValue(I);oe.updateOptions({simpleKeyboardNavigation:Le==="simple",filterOnType:Le==="filter"})};this.updateStyleOverrides(j),this.disposables.push(this.contextKeyService,Z.register(oe),oe.onDidChangeSelection(()=>{const be=oe.getSelection(),Le=oe.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.hasSelectionOrFocus.set(be.length>0||Le.length>0),this.hasMultiSelection.set(be.length>1),this.hasDoubleSelection.set(be.length===2)})}),oe.onDidChangeFocus(()=>{const be=oe.getSelection(),Le=oe.getFocus();this.hasSelectionOrFocus.set(be.length>0||Le.length>0)}),he.onDidChangeConfiguration(be=>{let Le={};if(be.affectsConfiguration(v)&&(this._useAltAsMultipleSelectionModifier=B(he)),be.affectsConfiguration(E)){const De=he.getValue(E);Le=Object.assign(Object.assign({},Le),{indent:De})}if(be.affectsConfiguration(T)){const De=he.getValue(T);Le=Object.assign(Object.assign({},Le),{renderIndentGuides:De})}if(be.affectsConfiguration(O)){const De=he.getValue(O);Le=Object.assign(Object.assign({},Le),{smoothScrolling:De})}if(be.affectsConfiguration(I)&&Ce(),be.affectsConfiguration(k)&&(Le=Object.assign(Object.assign({},Le),{automaticKeyboardNavigation:G()})),be.affectsConfiguration(L)&&ae.horizontalScrolling===void 0){const De=he.getValue(L);Le=Object.assign(Object.assign({},Le),{horizontalScrolling:De})}be.affectsConfiguration(A)&&ae.expandOnlyOnTwistieClick===void 0&&(Le=Object.assign(Object.assign({},Le),{expandOnlyOnTwistieClick:he.getValue(A)==="doubleClick"})),Object.keys(Le).length>0&&oe.updateOptions(Le)}),this.contextKeyService.onDidChangeContext(be=>{be.affectsSome(me)&&oe.updateOptions({automaticKeyboardNavigation:G()})}),re.onDidChangeScreenReaderOptimized(()=>Ce())),this.navigator=new se(oe,Object.assign({configurationService:he},ae)),this.disposables.push(this.navigator)}get onDidOpen(){return this.navigator.onDidOpen}updateStyleOverrides(oe){S.dispose(this.styler),this.styler=oe?a.attachListStyler(this.tree,this.themeService,oe):S.Disposable.None}dispose(){this.disposables=S.dispose(this.disposables),S.dispose(this.styler),this.styler=void 0}};H=Me([_e(4,p.IContextKeyService),_e(5,e.IListService),_e(6,u.IThemeService),_e(7,d.IConfigurationService),_e(8,l.IAccessibilityService)],H),s.Registry.as(g.Extensions.Configuration).registerConfiguration({id:"workbench",order:7,title:C.localize(0,null),type:"object",properties:{[v]:{type:"string",enum:["ctrlCmd","alt"],enumDescriptions:[C.localize(1,null),C.localize(2,null)],default:"ctrlCmd",description:C.localize(3,null)},[y]:{type:"string",enum:["singleClick","doubleClick"],default:"singleClick",description:C.localize(4,null)},[L]:{type:"boolean",default:!1,description:C.localize(5,null)},[E]:{type:"number",default:8,minimum:0,maximum:40,description:C.localize(6,null)},[T]:{type:"string",enum:["none","onHover","always"],default:"onHover",description:C.localize(7,null)},[O]:{type:"boolean",default:!1,description:C.localize(8,null)},[I]:{type:"string",enum:["simple","highlight","filter"],enumDescriptions:[C.localize(9,null),C.localize(10,null),C.localize(11,null)],default:"highlight",description:C.localize(12,null)},[k]:{type:"boolean",default:!0,markdownDescription:C.localize(13,null)},[A]:{type:"string",enum:["singleClick","doubleClick"],default:"singleClick",description:C.localize(14,null)}}})}),define(Q[652],J([0,1,139,9,11,22,23,116,16,65,443,147,574]),function(q,e,b,N,M,w,S,C,d,g,p,c,o){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputService=void 0;let s=class extends M.Themable{constructor(u,r,i,n,t){super(i);this.instantiationService=u,this.contextKeyService=r,this.accessibilityService=n,this.layoutService=t,this.contexts=new Map}get controller(){return this._controller||(this._controller=this._register(this.createController())),this._controller}get quickAccess(){return this._quickAccess||(this._quickAccess=this._register(this.instantiationService.createInstance(o.QuickAccessController))),this._quickAccess}createController(u=this.layoutService,r){var i,n;const t={idPrefix:"quickInput_",container:u.container,ignoreFocusOut:()=>!1,isScreenReaderOptimized:()=>this.accessibilityService.isScreenReaderOptimized(),backKeybindingLabel:()=>{},setContextKey:h=>this.setContextKey(h),returnFocus:()=>u.focus(),createList:(h,m,_,f,v)=>this.instantiationService.createInstance(c.WorkbenchList,h,m,_,f,v),styles:this.computeStyles()},l=this._register(new p.QuickInputController(Object.assign(Object.assign({},t),r)));return l.layout(u.dimension,(n=(i=u.offset)===null||i===void 0?void 0:i.top)!==null&&n!==void 0?n:0),this._register(u.onDidLayout(h=>{var m,_;return l.layout(h,(_=(m=u.offset)===null||m===void 0?void 0:m.top)!==null&&_!==void 0?_:0)})),this._register(l.onShow(()=>this.resetContextKeys())),this._register(l.onHide(()=>this.resetContextKeys())),l}setContextKey(u){let r;u&&(r=this.contexts.get(u),r||(r=new d.RawContextKey(u,!1).bindTo(this.contextKeyService),this.contexts.set(u,r))),!(r&&r.get())&&(this.resetContextKeys(),r&&r.set(!0))}resetContextKeys(){this.contexts.forEach(u=>{u.get()&&u.reset()})}pick(u,r={},i=S.CancellationToken.None){return this.controller.pick(u,r,i)}createQuickPick(){return this.controller.createQuickPick()}updateStyles(){this.controller.applyStyles(this.computeStyles())}computeStyles(){return{widget:Object.assign({},C.computeStyles(this.theme,{quickInputBackground:w.quickInputBackground,quickInputForeground:w.quickInputForeground,quickInputTitleBackground:w.quickInputTitleBackground,contrastBorder:w.contrastBorder,widgetShadow:w.widgetShadow})),inputBox:C.computeStyles(this.theme,{inputForeground:w.inputForeground,inputBackground:w.inputBackground,inputBorder:w.inputBorder,inputValidationInfoBackground:w.inputValidationInfoBackground,inputValidationInfoForeground:w.inputValidationInfoForeground,inputValidationInfoBorder:w.inputValidationInfoBorder,inputValidationWarningBackground:w.inputValidationWarningBackground,inputValidationWarningForeground:w.inputValidationWarningForeground,inputValidationWarningBorder:w.inputValidationWarningBorder,inputValidationErrorBackground:w.inputValidationErrorBackground,inputValidationErrorForeground:w.inputValidationErrorForeground,inputValidationErrorBorder:w.inputValidationErrorBorder}),countBadge:C.computeStyles(this.theme,{badgeBackground:w.badgeBackground,badgeForeground:w.badgeForeground,badgeBorder:w.contrastBorder}),button:C.computeStyles(this.theme,{buttonForeground:w.buttonForeground,buttonBackground:w.buttonBackground,buttonHoverBackground:w.buttonHoverBackground,buttonBorder:w.contrastBorder}),progressBar:C.computeStyles(this.theme,{progressBarBackground:w.progressBarBackground}),list:C.computeStyles(this.theme,{listBackground:w.quickInputBackground,listInactiveFocusForeground:w.listFocusForeground,listInactiveFocusBackground:w.quickInputListFocusBackground,listFocusOutline:w.activeContrastBorder,listInactiveFocusOutline:w.activeContrastBorder,pickerGroupBorder:w.pickerGroupBorder,pickerGroupForeground:w.pickerGroupForeground})}}};s=Me([_e(0,N.IInstantiationService),_e(1,d.IContextKeyService),_e(2,M.IThemeService),_e(3,g.IAccessibilityService),_e(4,b.ILayoutService)],s),e.QuickInputService=s}),define(Q[653],J([0,1,13,11,23,9,16,65,139,28,652,88,357]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.QuickInputEditorWidget=e.QuickInputEditorContribution=e.StandaloneQuickInputServiceImpl=e.EditorScopedQuickInputServiceImpl=void 0;let o=class extends p.QuickInputService{constructor(i,n,t,l,h,m){super(n,t,l,h,m);this.host=void 0;const _=a.get(i);this.host={_serviceBrand:void 0,get container(){return _.widget.getDomNode()},get dimension(){return i.getLayoutInfo()},get onDidLayout(){return i.onDidLayoutChange},focus:()=>i.focus()}}createController(){return super.createController(this.host)}};o=Me([_e(1,w.IInstantiationService),_e(2,S.IContextKeyService),_e(3,N.IThemeService),_e(4,C.IAccessibilityService),_e(5,d.ILayoutService)],o),e.EditorScopedQuickInputServiceImpl=o;let s=class{constructor(i,n){this.instantiationService=i,this.codeEditorService=n,this.mapEditorToService=new Map}get activeService(){const i=this.codeEditorService.getFocusedCodeEditor();if(!i)throw new Error("Quick input service needs a focused editor to work.");let n=this.mapEditorToService.get(i);if(!n){const t=n=this.instantiationService.createInstance(o,i);this.mapEditorToService.set(i,n),c.once(i.onDidDispose)(()=>{t.dispose(),this.mapEditorToService.delete(i)})}return n}get quickAccess(){return this.activeService.quickAccess}pick(i,n={},t=M.CancellationToken.None){return this.activeService.pick(i,n,t)}createQuickPick(){return this.activeService.createQuickPick()}};s=Me([_e(0,w.IInstantiationService),_e(1,g.ICodeEditorService)],s),e.StandaloneQuickInputServiceImpl=s;class a{constructor(i){this.editor=i,this.widget=new u(this.editor)}static get(i){return i.getContribution(a.ID)}dispose(){this.widget.dispose()}}e.QuickInputEditorContribution=a,a.ID="editor.controller.quickInput";class u{constructor(i){this.codeEditor=i,this.domNode=document.createElement("div"),this.codeEditor.addOverlayWidget(this)}getId(){return u.ID}getDomNode(){return this.domNode}getPosition(){return{preference:2}}dispose(){this.codeEditor.removeOverlayWidget(this)}}e.QuickInputEditorWidget=u,u.ID="editor.contrib.quickInputWidget",b.registerEditorContribution(a.ID,a)}),define(Q[654],J([0,1,82,11,22,27]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SeverityIcon=void 0;var S;(function(C){function d(g){switch(g){case b.default.Ignore:return"severity-ignore "+w.Codicon.info.classNames;case b.default.Info:return w.Codicon.info.classNames;case b.default.Warning:return w.Codicon.warning.classNames;case b.default.Error:return w.Codicon.error.classNames;default:return""}}C.className=d})(S=e.SeverityIcon||(e.SeverityIcon={})),N.registerThemingParticipant((C,d)=>{const g=C.getColor(M.problemsErrorIconForeground);if(g){const o=w.Codicon.error.cssSelector;d.addRule(` + .monaco-editor .zone-widget ${o}, + .markers-panel .marker-icon${o}, + .extensions-viewlet > .extensions ${o} { + color: ${g}; + } + `)}const p=C.getColor(M.problemsWarningIconForeground);if(p){const o=w.Codicon.warning.cssSelector;d.addRule(` + .monaco-editor .zone-widget ${o}, + .markers-panel .marker-icon${o}, + .extensions-viewlet > .extensions ${o}, + .extension-editor ${o} { + color: ${p}; + } + `)}const c=C.getColor(M.problemsInfoIconForeground);if(c){const o=w.Codicon.info.cssSelector;d.addRule(` + .monaco-editor .zone-widget ${o}, + .markers-panel .marker-icon${o}, + .extensions-viewlet > .extensions ${o}, + .extension-editor ${o} { + color: ${c}; + } + `)}})}),define(Q[655],J([0,1,480,7,2,85,3,22,11,29,61,159,19,6,118,44,654,58,34,16,189,9,8,115,343]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.editorMarkerNavigationBackground=e.editorMarkerNavigationInfo=e.editorMarkerNavigationWarning=e.editorMarkerNavigationError=e.MarkerNavigationWidget=void 0;class f{constructor(E,T,O,A,B){this._openerService=A,this._labelService=B,this._lines=0,this._longestLineLength=0,this._relatedDiagnostics=new WeakMap,this._disposables=new M.DisposableStore,this._editor=T;const F=document.createElement("div");F.className="descriptioncontainer",this._messageBlock=document.createElement("div"),this._messageBlock.classList.add("message"),this._messageBlock.setAttribute("aria-live","assertive"),this._messageBlock.setAttribute("role","alert"),F.appendChild(this._messageBlock),this._relatedBlock=document.createElement("div"),F.appendChild(this._relatedBlock),this._disposables.add(N.addStandardDisposableListener(this._relatedBlock,"click",D=>{D.preventDefault();const R=this._relatedDiagnostics.get(D.target);R&&O(R)})),this._scrollable=new p.ScrollableElement(F,{horizontal:1,vertical:1,useShadows:!1,horizontalScrollbarSize:3,verticalScrollbarSize:3}),E.appendChild(this._scrollable.getDomNode()),this._disposables.add(this._scrollable.onScroll(D=>{F.style.left=`-${D.scrollLeft}px`,F.style.top=`-${D.scrollTop}px`})),this._disposables.add(this._scrollable)}dispose(){M.dispose(this._disposables)}update(E){const{source:T,message:O,relatedInformation:A,code:B}=E;let F=((T==null?void 0:T.length)||0)+"()".length;B&&(typeof B=="string"?F+=B.length:F+=B.value.length);const D=m.splitLines(O);this._lines=D.length,this._longestLineLength=0;for(const Y of D)this._longestLineLength=Math.max(Y.length+F,this._longestLineLength);N.clearNode(this._messageBlock),this._messageBlock.setAttribute("aria-label",this.getAriaLabel(E)),this._editor.applyFontInfo(this._messageBlock);let R=this._messageBlock;for(const Y of D)R=document.createElement("div"),R.innerText=Y,Y===""&&(R.style.height=this._messageBlock.style.lineHeight),this._messageBlock.appendChild(R);if(T||B){const Y=document.createElement("span");if(Y.classList.add("details"),R.appendChild(Y),T){const ee=document.createElement("span");ee.innerText=T,ee.classList.add("source"),Y.appendChild(ee)}if(B)if(typeof B=="string"){const ee=document.createElement("span");ee.innerText=`(${B})`,ee.classList.add("code"),Y.appendChild(ee)}else{this._codeLink=N.$("a.code-link"),this._codeLink.setAttribute("href",`${B.target.toString()}`),this._codeLink.onclick=se=>{this._openerService.open(B.target),se.preventDefault(),se.stopPropagation()};const ee=N.append(this._codeLink,N.$("span"));ee.innerText=B.value,Y.appendChild(this._codeLink)}}if(N.clearNode(this._relatedBlock),this._editor.applyFontInfo(this._relatedBlock),o.isNonEmptyArray(A)){const Y=this._relatedBlock.appendChild(document.createElement("div"));Y.style.paddingTop=`${Math.floor(this._editor.getOption(53)*.66)}px`,this._lines+=1;for(const ee of A){let se=document.createElement("div"),ne=document.createElement("a");ne.classList.add("filename"),ne.innerText=`${c.getBaseLabel(ee.resource)}(${ee.startLineNumber}, ${ee.startColumn}): `,ne.title=this._labelService.getUriLabel(ee.resource),this._relatedDiagnostics.set(ne,ee);let le=document.createElement("span");le.innerText=ee.message,se.appendChild(ne),se.appendChild(le),this._lines+=1,Y.appendChild(se)}}const W=this._editor.getOption(38),x=Math.ceil(W.typicalFullwidthCharacterWidth*this._longestLineLength*.75),K=W.lineHeight*this._lines;this._scrollable.setScrollDimensions({scrollWidth:x,scrollHeight:K})}layout(E,T){this._scrollable.getDomNode().style.height=`${E}px`,this._scrollable.getDomNode().style.width=`${T}px`,this._scrollable.setScrollDimensions({width:T,height:E})}getHeightInLines(){return Math.min(17,this._lines)}getAriaLabel(E){let T="";switch(E.severity){case w.MarkerSeverity.Error:T=b.localize(0,null);break;case w.MarkerSeverity.Warning:T=b.localize(1,null);break;case w.MarkerSeverity.Info:T=b.localize(2,null);break;case w.MarkerSeverity.Hint:T=b.localize(3,null);break}let O=b.localize(4,null,T,E.startLineNumber+":"+E.startColumn);const A=this._editor.getModel();return A&&E.startLineNumber<=A.getLineCount()&&E.startLineNumber>=1&&(O=`${A.getLineContent(E.startLineNumber)}, ${O}`),O}}let v=class Kt extends a.PeekViewWidget{constructor(E,T,O,A,B,F,D){super(E,{showArrow:!0,showFrame:!0,isAccessible:!0},B);this._themeService=T,this._openerService=O,this._menuService=A,this._contextKeyService=F,this._labelService=D,this._callOnDispose=new M.DisposableStore,this._onDidSelectRelatedInformation=new s.Emitter,this.onDidSelectRelatedInformation=this._onDidSelectRelatedInformation.event,this._severity=w.MarkerSeverity.Warning,this._backgroundColor=g.Color.white,this._applyTheme(T.getColorTheme()),this._callOnDispose.add(T.onDidColorThemeChange(this._applyTheme.bind(this))),this.create()}_applyTheme(E){this._backgroundColor=E.getColor(e.editorMarkerNavigationBackground);let T=e.editorMarkerNavigationError;this._severity===w.MarkerSeverity.Warning?T=e.editorMarkerNavigationWarning:this._severity===w.MarkerSeverity.Info&&(T=e.editorMarkerNavigationInfo);const O=E.getColor(T);this.style({arrowColor:O,frameColor:O,headerBackgroundColor:this._backgroundColor,primaryHeadingColor:E.getColor(a.peekViewTitleForeground),secondaryHeadingColor:E.getColor(a.peekViewTitleInfoForeground)})}_applyStyles(){this._parentContainer&&(this._parentContainer.style.backgroundColor=this._backgroundColor?this._backgroundColor.toString():""),super._applyStyles()}dispose(){this._callOnDispose.dispose(),super.dispose()}_fillHead(E){super._fillHead(E),this._disposables.add(this._actionbarWidget.actionRunner.onBeforeRun(A=>this.editor.focus()));const T=[],O=this._menuService.createMenu(Kt.TitleMenu,this._contextKeyService);l.createAndFillInActionBarActions(O,void 0,T),this._actionbarWidget.push(T,{label:!1,icon:!0,index:0}),O.dispose()}_fillTitleIcon(E){this._icon=N.append(E,N.$(""))}_fillBody(E){this._parentContainer=E,E.classList.add("marker-widget"),this._parentContainer.tabIndex=0,this._parentContainer.setAttribute("role","tooltip"),this._container=document.createElement("div"),E.appendChild(this._container),this._message=new f(this._container,this.editor,T=>this._onDidSelectRelatedInformation.fire(T),this._openerService,this._labelService),this._disposables.add(this._message)}show(){throw new Error("call showAtMarker")}showAtMarker(E,T,O){this._container.classList.remove("stale"),this._message.update(E),this._severity=E.severity,this._applyTheme(this._themeService.getColorTheme());let A=S.Range.lift(E);const B=this.editor.getPosition();let F=B&&A.containsPosition(B)?B:A.getStartPosition();super.show(F,this.computeRequiredHeight());const D=this.editor.getModel();if(D){const R=O>1?b.localize(5,null,T,O):b.localize(6,null,T,O);this.setTitle(u.basename(D.uri),R)}this._icon.className=`codicon ${r.SeverityIcon.className(w.MarkerSeverity.toSeverity(this._severity))}`,this.editor.revealPositionNearTop(F,0),this.editor.focus()}updateMarker(E){this._container.classList.remove("stale"),this._message.update(E)}showStale(){this._container.classList.add("stale"),this._relayout()}_doLayoutBody(E,T){super._doLayoutBody(E,T),this._heightInPixel=E,this._message.layout(E,T),this._container.style.height=`${E}px`}_onWidth(E){this._message.layout(this._heightInPixel,E)}_relayout(){super._relayout(this.computeRequiredHeight())}computeRequiredHeight(){return 3+this._message.getHeightInLines()}};v.TitleMenu=new n.MenuId("gotoErrorTitleMenu"),v=Me([_e(1,d.IThemeService),_e(2,i.IOpenerService),_e(3,n.IMenuService),_e(4,h.IInstantiationService),_e(5,t.IContextKeyService),_e(6,_.ILabelService)],v),e.MarkerNavigationWidget=v;let y=C.oneOf(C.editorErrorForeground,C.editorErrorBorder),L=C.oneOf(C.editorWarningForeground,C.editorWarningBorder),I=C.oneOf(C.editorInfoForeground,C.editorInfoBorder);e.editorMarkerNavigationError=C.registerColor("editorMarkerNavigationError.background",{dark:y,light:y,hc:y},b.localize(7,null)),e.editorMarkerNavigationWarning=C.registerColor("editorMarkerNavigationWarning.background",{dark:L,light:L,hc:L},b.localize(8,null)),e.editorMarkerNavigationInfo=C.registerColor("editorMarkerNavigationInfo.background",{dark:I,light:I,hc:I},b.localize(9,null)),e.editorMarkerNavigationBackground=C.registerColor("editorMarkerNavigation.background",{dark:"#2D2D30",light:g.Color.white,hc:"#0C141F"},b.localize(10,null)),d.registerThemingParticipant((k,E)=>{const T=k.getColor(C.textLinkForeground);T&&(E.addRule(`.monaco-editor .marker-widget a { color: ${T}; }`),E.addRule(`.monaco-editor .marker-widget a.code-link span:hover { color: ${T}; }`))})}),define(Q[80],J([0,1,33,11,6,528,185,15,27]),function(q,e,b,N,M,w,S,C,d){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.widgetClose=e.iconsSchemaId=e.getIconRegistry=e.registerIcon=e.Extensions=void 0,e.Extensions={IconContribution:"base.contributions.icons"};class g{constructor(){this._onDidChange=new M.Emitter,this.onDidChange=this._onDidChange.event,this.iconSchema={definitions:{icons:{type:"object",properties:{fontId:{type:"string",description:w.localize(0,null)},fontCharacter:{type:"string",description:w.localize(1,null)}},additionalProperties:!1,defaultSnippets:[{body:{fontCharacter:"\\\\e030"}}]}},type:"object",properties:{}},this.iconReferenceSchema={type:"string",pattern:`^${d.CSSIcon.iconNameExpression}$`,enum:[],enumDescriptions:[]},this.iconsById={},this.iconFontsById={}}registerIcon(i,n,t,l){const h=this.iconsById[i];if(h){if(t&&!h.description){h.description=t,this.iconSchema.properties[i].markdownDescription=`${t} $(${i})`;const f=this.iconReferenceSchema.enum.indexOf(i);f!==-1&&(this.iconReferenceSchema.enumDescriptions[f]=t),this._onDidChange.fire()}return h}let m={id:i,description:t,defaults:n,deprecationMessage:l};this.iconsById[i]=m;let _={$ref:"#/definitions/icons"};return l&&(_.deprecationMessage=l),t&&(_.markdownDescription=`${t}: $(${i})`),this.iconSchema.properties[i]=_,this.iconReferenceSchema.enum.push(i),this.iconReferenceSchema.enumDescriptions.push(t||""),this._onDidChange.fire(),{id:i}}getIcons(){return Object.keys(this.iconsById).map(i=>this.iconsById[i])}getIcon(i){return this.iconsById[i]}getIconSchema(){return this.iconSchema}getIconFont(i){return this.iconFontsById[i]}toString(){const i=(h,m)=>h.id.localeCompare(m.id),n=h=>{for(;N.ThemeIcon.isThemeIcon(h.defaults);)h=this.iconsById[h.defaults.id];return`codicon codicon-${h?h.id:""}`};let t=[];t.push("| preview | identifier | default codicon ID | description"),t.push("| ----------- | --------------------------------- | --------------------------------- | --------------------------------- |");const l=Object.keys(this.iconsById).map(h=>this.iconsById[h]);for(const h of l.filter(m=>!!m.description).sort(i))t.push(`||${h.id}|${N.ThemeIcon.isThemeIcon(h.defaults)?h.defaults.id:h.id}|${h.description||""}|`);t.push("| preview | identifier "),t.push("| ----------- | --------------------------------- |");for(const h of l.filter(m=>!N.ThemeIcon.isThemeIcon(m.defaults)).sort(i))t.push(`||${h.id}|`);return t.join(` +`)}}const p=new g;b.Registry.add(e.Extensions.IconContribution,p);function c(r,i,n,t){return p.registerIcon(r,i,n,t)}e.registerIcon=c;function o(){return p}e.getIconRegistry=o;function s(){for(const r of d.iconRegistry.all)p.registerIcon(r.id,r.definition,r.description);d.iconRegistry.onDidRegister(r=>p.registerIcon(r.id,r.definition,r.description))}s(),e.iconsSchemaId="vscode://schemas/icons";let a=b.Registry.as(S.Extensions.JSONContribution);a.registerSchema(e.iconsSchemaId,p.getIconSchema());const u=new C.RunOnceScheduler(()=>a.notifySchemaChanged(e.iconsSchemaId),200);p.onDidChange(()=>{u.isScheduled()||u.schedule()}),e.widgetClose=c("widget-close",d.Codicon.close,w.localize(2,null))}),define(Q[656],J([0,1,450,7,30,83,61,48,2,69,13,28,38,113,14,49,129,63,16,22,11,27,80,333]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m){"use strict";var _;Object.defineProperty(e,"__esModule",{value:!0}),e.DiffReview=void 0;const f=3;class v{constructor(F,D,R,W){this.originalLineStart=F,this.originalLineEnd=D,this.modifiedLineStart=R,this.modifiedLineEnd=W}getType(){return this.originalLineStart===0?1:this.modifiedLineStart===0?2:0}}class y{constructor(F){this.entries=F}}const L=m.registerIcon("diff-review-insert",h.Codicon.add,b.localize(0,null)),I=m.registerIcon("diff-review-remove",h.Codicon.remove,b.localize(1,null)),k=m.registerIcon("diff-review-close",h.Codicon.close,b.localize(2,null));class E extends d.Disposable{constructor(F){super();this._width=0,this._diffEditor=F,this._isVisible=!1,this.shadow=M.createFastDomNode(document.createElement("div")),this.shadow.setClassName("diff-review-shadow"),this.actionBarContainer=M.createFastDomNode(document.createElement("div")),this.actionBarContainer.setClassName("diff-review-actions"),this._actionBar=this._register(new w.ActionBar(this.actionBarContainer.domNode)),this._actionBar.push(new C.Action("diffreview.close",b.localize(3,null),"close-diff-review "+l.ThemeIcon.asClassName(k),!0,()=>(this.hide(),Promise.resolve(null))),{label:!1,icon:!0}),this.domNode=M.createFastDomNode(document.createElement("div")),this.domNode.setClassName("diff-review monaco-editor-background"),this._content=M.createFastDomNode(document.createElement("div")),this._content.setClassName("diff-review-content"),this._content.setAttribute("role","code"),this.scrollbar=this._register(new S.DomScrollableElement(this._content.domNode,{})),this.domNode.domNode.appendChild(this.scrollbar.getDomNode()),this._register(F.onDidUpdateDiff(()=>{!this._isVisible||(this._diffs=this._compute(),this._render())})),this._register(F.getModifiedEditor().onDidChangeCursorPosition(()=>{!this._isVisible||this._render()})),this._register(N.addStandardDisposableListener(this.domNode.domNode,"click",D=>{D.preventDefault();let R=N.findParentWithClass(D.target,"diff-review-row");R&&this._goToRow(R)})),this._register(N.addStandardDisposableListener(this.domNode.domNode,"keydown",D=>{(D.equals(18)||D.equals(2048|18)||D.equals(512|18))&&(D.preventDefault(),this._goToRow(this._getNextRow())),(D.equals(16)||D.equals(2048|16)||D.equals(512|16))&&(D.preventDefault(),this._goToRow(this._getPrevRow())),(D.equals(9)||D.equals(2048|9)||D.equals(512|9)||D.equals(1024|9))&&(D.preventDefault(),this.hide()),(D.equals(10)||D.equals(3))&&(D.preventDefault(),this.accept())})),this._diffs=[],this._currentDiff=null}prev(){let F=0;if(this._isVisible||(this._diffs=this._compute()),this._isVisible){let R=-1;for(let W=0,x=this._diffs.length;W0){const te=F[se-1];te.originalEndLineNumber===0?oe=te.originalStartLineNumber+1:oe=te.originalEndLineNumber+1,te.modifiedEndLineNumber===0?ae=te.modifiedStartLineNumber+1:ae=te.modifiedEndLineNumber+1}let G=$-f+1,j=ie-f+1;if(Goe){const te=oe-G;G=G+te,j=j+te}if(j>ae){const te=ae-j;G=G+te,j=j+te}U[H++]=new v($,G,ie,j)}W[x++]=new y(U)}let K=W[0].entries,Y=[],ee=0;for(let se=1,ne=W.length;sele)&&(le=he),re!==0&&(X===0||rez)&&(z=ce)}let P=document.createElement("div");P.className="diff-review-row";let V=document.createElement("div");V.className="diff-review-cell diff-review-summary";const U=le-ne+1,H=z-X+1;V.appendChild(document.createTextNode(`${Y+1}/${this._diffs.length}: @@ -${ne},${U} +${X},${H} @@`)),P.setAttribute("data-line",String(X));const $=j=>j===0?b.localize(4,null):j===1?b.localize(5,null):b.localize(6,null,j),ie=$(U),oe=$(H);P.setAttribute("aria-label",b.localize(7,null,Y+1,this._diffs.length,ne,ie,X,oe)),P.appendChild(V),P.setAttribute("role","listitem"),se.appendChild(P);const ae=D.get(53);let G=X;for(let j=0,te=ee.length;j>>0,ee=new Uint32Array(2);ee[0]=x.length,ee[1]=Y;const se=new s.LineTokens(ee,x),ne=i.ViewLineRenderingData.isBasicASCII(x,F.mightContainNonBasicASCII()),le=i.ViewLineRenderingData.containsRTL(x,ne,F.mightContainRTL());return r.renderViewLine2(new r.RenderLineInput(K.isMonospace&&!D.get(26),K.canUseHalfwidthRightwardsArrow,x,!1,ne,le,0,se,[],R,0,K.spaceWidth,K.middotWidth,K.wsmiddotWidth,D.get(100),D.get(83),D.get(77),D.get(39)!==o.EditorFontLigatures.OFF,null)).html}}e.DiffReview=E,E._ttPolicy=(_=window.trustedTypes)===null||_===void 0?void 0:_.createPolicy("diffReview",{createHTML:B=>B}),l.registerThemingParticipant((B,F)=>{const D=B.getColor(u.editorLineNumbers);D&&F.addRule(`.monaco-diff-editor .diff-review-line-number { color: ${D}; }`);const R=B.getColor(t.scrollbarShadow);R&&F.addRule(`.monaco-diff-editor .diff-review-shadow { box-shadow: ${R} 0 -6px 6px -6px inset; }`)});class T extends p.EditorAction{constructor(){super({id:"editor.action.diffReview.next",label:b.localize(13,null),alias:"Go to Next Difference",precondition:n.ContextKeyExpr.has("isInDiffEditor"),kbOpts:{kbExpr:null,primary:65,weight:100}})}run(F,D){const R=A(F);R&&R.diffReviewNext()}}class O extends p.EditorAction{constructor(){super({id:"editor.action.diffReview.prev",label:b.localize(14,null),alias:"Go to Previous Difference",precondition:n.ContextKeyExpr.has("isInDiffEditor"),kbOpts:{kbExpr:null,primary:1024|65,weight:100}})}run(F,D){const R=A(F);R&&R.diffReviewPrev()}}function A(B){const F=B.get(c.ICodeEditorService),D=F.listDiffEditors(),R=F.getActiveCodeEditor();if(!R)return null;for(let W=0,x=D.length;W!this._zonesMap[String(ce.id)])}clean(re){this._zones.length>0&&re.changeViewZones(ce=>{for(const me of this._zones)ce.removeZone(me)}),this._zones=[],this._zonesMap={},this._decorations=re.deltaDecorations(this._decorations,[])}apply(re,ce,me,Ce){const be=Ce?p.StableEditorScrollState.capture(re):null;re.changeViewZones(Le=>{for(const De of this._zones)Le.removeZone(De);for(const De of this._inlineDiffMargins)De.dispose();this._zones=[],this._zonesMap={},this._inlineDiffMargins=[];for(let De=0,Re=me.zones.length;Dehe});let X=class Ge extends d.Disposable{constructor(re,ce,me,Ce,be,Le,De,Re,Ee,Ae,Se,we){super();this._editorProgressService=we,this._onDidDispose=this._register(new C.Emitter),this.onDidDispose=this._onDidDispose.event,this._onDidUpdateDiff=this._register(new C.Emitter),this.onDidUpdateDiff=this._onDidUpdateDiff.event,this._onDidContentSizeChange=this._register(new C.Emitter),this._lastOriginalWarning=null,this._lastModifiedWarning=null,this._editorWorkerService=be,this._codeEditorService=Re,this._contextKeyService=this._register(Le.createScoped(re)),this._instantiationService=De.createChild(new y.ServiceCollection([f.IContextKeyService,this._contextKeyService])),this._contextKeyService.createKey("isInDiffEditor",!0),this._themeService=Ee,this._notificationService=Ae,this._id=++ee,this._state=0,this._updatingDiffProgress=null,this._domElement=re,ce=ce||{},this._renderSideBySide=!0,typeof ce.renderSideBySide!="undefined"&&(this._renderSideBySide=ce.renderSideBySide),this._maxComputationTime=5e3,typeof ce.maxComputationTime!="undefined"&&(this._maxComputationTime=ce.maxComputationTime),this._ignoreTrimWhitespace=!0,typeof ce.ignoreTrimWhitespace!="undefined"&&(this._ignoreTrimWhitespace=ce.ignoreTrimWhitespace),this._renderIndicators=!0,typeof ce.renderIndicators!="undefined"&&(this._renderIndicators=ce.renderIndicators),this._originalIsEditable=a.boolean(ce.originalEditable,!1),this._diffCodeLens=a.boolean(ce.diffCodeLens,!1),this._diffWordWrap=G(ce.diffWordWrap,"inherit"),typeof ce.isInEmbeddedEditor!="undefined"?this._contextKeyService.createKey("isInEmbeddedDiffEditor",ce.isInEmbeddedEditor):this._contextKeyService.createKey("isInEmbeddedDiffEditor",!1),this._renderOverviewRuler=!0,typeof ce.renderOverviewRuler!="undefined"&&(this._renderOverviewRuler=Boolean(ce.renderOverviewRuler)),this._updateDecorationsRunner=this._register(new S.RunOnceScheduler(()=>this._updateDecorations(),0)),this._containerDomElement=document.createElement("div"),this._containerDomElement.className=Ge._getClassName(this._themeService.getColorTheme(),this._renderSideBySide),this._containerDomElement.style.position="relative",this._containerDomElement.style.height="100%",this._domElement.appendChild(this._containerDomElement),this._overviewViewportDomElement=M.createFastDomNode(document.createElement("div")),this._overviewViewportDomElement.setClassName("diffViewport"),this._overviewViewportDomElement.setPosition("absolute"),this._overviewDomElement=document.createElement("div"),this._overviewDomElement.className="diffOverview",this._overviewDomElement.style.position="absolute",this._overviewDomElement.appendChild(this._overviewViewportDomElement.domNode),this._register(N.addStandardDisposableListener(this._overviewDomElement,"mousedown",fe=>{this._modifiedEditor.delegateVerticalScrollbarMouseDown(fe)})),this._renderOverviewRuler&&this._containerDomElement.appendChild(this._overviewDomElement),this._originalDomNode=document.createElement("div"),this._originalDomNode.className="editor original",this._originalDomNode.style.position="absolute",this._originalDomNode.style.height="100%",this._containerDomElement.appendChild(this._originalDomNode),this._modifiedDomNode=document.createElement("div"),this._modifiedDomNode.className="editor modified",this._modifiedDomNode.style.position="absolute",this._modifiedDomNode.style.height="100%",this._containerDomElement.appendChild(this._modifiedDomNode),this._beginUpdateDecorationsTimeout=-1,this._currentlyChangingViewZones=!1,this._diffComputationToken=0,this._originalEditorState=new Y(Se,Ce),this._modifiedEditorState=new Y(Se,Ce),this._isVisible=!0,this._isHandlingScrollEvent=!1,this._elementSizeObserver=this._register(new D.ElementSizeObserver(this._containerDomElement,ce.dimension,()=>this._onDidContainerSizeChanged())),ce.automaticLayout&&this._elementSizeObserver.startObserving(),this._diffComputationResult=null,this._originalEditor=this._createLeftHandSideEditor(ce,me.originalEditor||{}),this._modifiedEditor=this._createRightHandSideEditor(ce,me.modifiedEditor||{}),this._originalOverviewRuler=null,this._modifiedOverviewRuler=null,this._reviewPane=new s.DiffReview(this),this._containerDomElement.appendChild(this._reviewPane.domNode.domNode),this._containerDomElement.appendChild(this._reviewPane.shadow.domNode),this._containerDomElement.appendChild(this._reviewPane.actionBarContainer.domNode),this._enableSplitViewResizing=!0,typeof ce.enableSplitViewResizing!="undefined"&&(this._enableSplitViewResizing=ce.enableSplitViewResizing),this._renderSideBySide?this._setStrategy(new $(this._createDataSource(),this._enableSplitViewResizing)):this._setStrategy(new oe(this._createDataSource(),this._enableSplitViewResizing)),this._register(Ee.onDidColorThemeChange(fe=>{this._strategy&&this._strategy.applyColors(fe)&&this._updateDecorationsRunner.schedule(),this._containerDomElement.className=Ge._getClassName(this._themeService.getColorTheme(),this._renderSideBySide)}));const ye=A.EditorExtensionsRegistry.getDiffEditorContributions();for(const fe of ye)try{this._register(De.createInstance(fe.ctor,this))}catch(de){B.onUnexpectedError(de)}this._codeEditorService.addDiffEditor(this)}_setState(re){this._state!==re&&(this._state=re,this._updatingDiffProgress&&(this._updatingDiffProgress.done(),this._updatingDiffProgress=null),this._state===1&&(this._updatingDiffProgress=this._editorProgressService.show(!0,1e3)))}diffReviewNext(){this._reviewPane.next()}diffReviewPrev(){this._reviewPane.prev()}static _getClassName(re,ce){let me="monaco-diff-editor monaco-editor-background ";return ce&&(me+="side-by-side "),me+=k.getThemeTypeSelector(re.type),me}_recreateOverviewRulers(){!this._renderOverviewRuler||(this._originalOverviewRuler&&(this._overviewDomElement.removeChild(this._originalOverviewRuler.getDomNode()),this._originalOverviewRuler.dispose()),this._originalEditor.hasModel()&&(this._originalOverviewRuler=this._originalEditor.createOverviewRuler("original diffOverviewRuler"),this._overviewDomElement.appendChild(this._originalOverviewRuler.getDomNode())),this._modifiedOverviewRuler&&(this._overviewDomElement.removeChild(this._modifiedOverviewRuler.getDomNode()),this._modifiedOverviewRuler.dispose()),this._modifiedEditor.hasModel()&&(this._modifiedOverviewRuler=this._modifiedEditor.createOverviewRuler("modified diffOverviewRuler"),this._overviewDomElement.appendChild(this._modifiedOverviewRuler.getDomNode())),this._layoutOverviewRulers())}_createLeftHandSideEditor(re,ce){const me=this._createInnerEditor(this._instantiationService,this._originalDomNode,this._adjustOptionsForLeftHandSide(re),ce);this._register(me.onDidScrollChange(be=>{this._isHandlingScrollEvent||!be.scrollTopChanged&&!be.scrollLeftChanged&&!be.scrollHeightChanged||(this._isHandlingScrollEvent=!0,this._modifiedEditor.setScrollPosition({scrollLeft:be.scrollLeft,scrollTop:be.scrollTop}),this._isHandlingScrollEvent=!1,this._layoutOverviewViewport())})),this._register(me.onDidChangeViewZones(()=>{this._onViewZonesChanged()})),this._register(me.onDidChangeConfiguration(be=>{!me.getModel()||(be.hasChanged(38)&&this._updateDecorationsRunner.schedule(),be.hasChanged(125)&&(this._updateDecorationsRunner.cancel(),this._updateDecorations()))})),this._register(me.onDidChangeModelContent(()=>{this._isVisible&&this._beginUpdateDecorationsSoon()}));const Ce=this._contextKeyService.createKey("isInDiffLeftEditor",me.hasWidgetFocus());return this._register(me.onDidFocusEditorWidget(()=>Ce.set(!0))),this._register(me.onDidBlurEditorWidget(()=>Ce.set(!1))),this._register(me.onDidContentSizeChange(be=>{const Le=this._originalEditor.getContentWidth()+this._modifiedEditor.getContentWidth()+Ge.ONE_OVERVIEW_WIDTH,De=Math.max(this._modifiedEditor.getContentHeight(),this._originalEditor.getContentHeight());this._onDidContentSizeChange.fire({contentHeight:De,contentWidth:Le,contentHeightChanged:be.contentHeightChanged,contentWidthChanged:be.contentWidthChanged})})),me}_createRightHandSideEditor(re,ce){const me=this._createInnerEditor(this._instantiationService,this._modifiedDomNode,this._adjustOptionsForRightHandSide(re),ce);this._register(me.onDidScrollChange(be=>{this._isHandlingScrollEvent||!be.scrollTopChanged&&!be.scrollLeftChanged&&!be.scrollHeightChanged||(this._isHandlingScrollEvent=!0,this._originalEditor.setScrollPosition({scrollLeft:be.scrollLeft,scrollTop:be.scrollTop}),this._isHandlingScrollEvent=!1,this._layoutOverviewViewport())})),this._register(me.onDidChangeViewZones(()=>{this._onViewZonesChanged()})),this._register(me.onDidChangeConfiguration(be=>{!me.getModel()||(be.hasChanged(38)&&this._updateDecorationsRunner.schedule(),be.hasChanged(125)&&(this._updateDecorationsRunner.cancel(),this._updateDecorations()))})),this._register(me.onDidChangeModelContent(()=>{this._isVisible&&this._beginUpdateDecorationsSoon()})),this._register(me.onDidChangeModelOptions(be=>{be.tabSize&&this._updateDecorationsRunner.schedule()}));const Ce=this._contextKeyService.createKey("isInDiffRightEditor",me.hasWidgetFocus());return this._register(me.onDidFocusEditorWidget(()=>Ce.set(!0))),this._register(me.onDidBlurEditorWidget(()=>Ce.set(!1))),this._register(me.onDidContentSizeChange(be=>{const Le=this._originalEditor.getContentWidth()+this._modifiedEditor.getContentWidth()+Ge.ONE_OVERVIEW_WIDTH,De=Math.max(this._modifiedEditor.getContentHeight(),this._originalEditor.getContentHeight());this._onDidContentSizeChange.fire({contentHeight:De,contentWidth:Le,contentHeightChanged:be.contentHeightChanged,contentWidthChanged:be.contentWidthChanged})})),me}_createInnerEditor(re,ce,me,Ce){return re.createInstance(o.CodeEditorWidget,ce,me,Ce)}dispose(){this._codeEditorService.removeDiffEditor(this),this._beginUpdateDecorationsTimeout!==-1&&(window.clearTimeout(this._beginUpdateDecorationsTimeout),this._beginUpdateDecorationsTimeout=-1),this._cleanViewZonesAndDecorations(),this._originalOverviewRuler&&(this._overviewDomElement.removeChild(this._originalOverviewRuler.getDomNode()),this._originalOverviewRuler.dispose()),this._modifiedOverviewRuler&&(this._overviewDomElement.removeChild(this._modifiedOverviewRuler.getDomNode()),this._modifiedOverviewRuler.dispose()),this._overviewDomElement.removeChild(this._overviewViewportDomElement.domNode),this._renderOverviewRuler&&this._containerDomElement.removeChild(this._overviewDomElement),this._containerDomElement.removeChild(this._originalDomNode),this._originalEditor.dispose(),this._containerDomElement.removeChild(this._modifiedDomNode),this._modifiedEditor.dispose(),this._strategy.dispose(),this._containerDomElement.removeChild(this._reviewPane.domNode.domNode),this._containerDomElement.removeChild(this._reviewPane.shadow.domNode),this._containerDomElement.removeChild(this._reviewPane.actionBarContainer.domNode),this._reviewPane.dispose(),this._domElement.removeChild(this._containerDomElement),this._onDidDispose.fire(),super.dispose()}getId(){return this.getEditorType()+":"+this._id}getEditorType(){return i.EditorType.IDiffEditor}getLineChanges(){return this._diffComputationResult?this._diffComputationResult.changes:null}getOriginalEditor(){return this._originalEditor}getModifiedEditor(){return this._modifiedEditor}updateOptions(re){let ce=!1;typeof re.renderSideBySide!="undefined"&&this._renderSideBySide!==re.renderSideBySide&&(this._renderSideBySide=re.renderSideBySide,ce=!0),typeof re.maxComputationTime!="undefined"&&(this._maxComputationTime=re.maxComputationTime,this._isVisible&&this._beginUpdateDecorationsSoon());let me=!1;typeof re.ignoreTrimWhitespace!="undefined"&&this._ignoreTrimWhitespace!==re.ignoreTrimWhitespace&&(this._ignoreTrimWhitespace=re.ignoreTrimWhitespace,me=!0),typeof re.renderIndicators!="undefined"&&this._renderIndicators!==re.renderIndicators&&(this._renderIndicators=re.renderIndicators,me=!0),me&&this._beginUpdateDecorations(),this._originalIsEditable=a.boolean(re.originalEditable,this._originalIsEditable),this._diffCodeLens=a.boolean(re.diffCodeLens,this._diffCodeLens),this._diffWordWrap=G(re.diffWordWrap,this._diffWordWrap),this._modifiedEditor.updateOptions(this._adjustOptionsForRightHandSide(re)),this._originalEditor.updateOptions(this._adjustOptionsForLeftHandSide(re)),typeof re.enableSplitViewResizing!="undefined"&&(this._enableSplitViewResizing=re.enableSplitViewResizing),this._strategy.setEnableSplitViewResizing(this._enableSplitViewResizing),ce&&(this._renderSideBySide?this._setStrategy(new $(this._createDataSource(),this._enableSplitViewResizing)):this._setStrategy(new oe(this._createDataSource(),this._enableSplitViewResizing)),this._containerDomElement.className=Ge._getClassName(this._themeService.getColorTheme(),this._renderSideBySide)),typeof re.renderOverviewRuler!="undefined"&&this._renderOverviewRuler!==re.renderOverviewRuler&&(this._renderOverviewRuler=re.renderOverviewRuler,this._renderOverviewRuler?this._containerDomElement.appendChild(this._overviewDomElement):this._containerDomElement.removeChild(this._overviewDomElement))}getModel(){return{original:this._originalEditor.getModel(),modified:this._modifiedEditor.getModel()}}setModel(re){if(re&&(!re.original||!re.modified))throw new Error(re.original?"DiffEditorWidget.setModel: Modified model is null":"DiffEditorWidget.setModel: Original model is null");this._cleanViewZonesAndDecorations(),this._originalEditor.setModel(re?re.original:null),this._modifiedEditor.setModel(re?re.modified:null),this._updateDecorationsRunner.cancel(),re&&(this._originalEditor.setScrollTop(0),this._modifiedEditor.setScrollTop(0)),this._diffComputationResult=null,this._diffComputationToken++,this._setState(0),re&&(this._recreateOverviewRulers(),this._beginUpdateDecorations()),this._layoutOverviewViewport()}getDomNode(){return this._domElement}getVisibleColumnFromPosition(re){return this._modifiedEditor.getVisibleColumnFromPosition(re)}getPosition(){return this._modifiedEditor.getPosition()}setPosition(re){this._modifiedEditor.setPosition(re)}revealLine(re,ce=0){this._modifiedEditor.revealLine(re,ce)}revealLineInCenter(re,ce=0){this._modifiedEditor.revealLineInCenter(re,ce)}revealLineInCenterIfOutsideViewport(re,ce=0){this._modifiedEditor.revealLineInCenterIfOutsideViewport(re,ce)}revealLineNearTop(re,ce=0){this._modifiedEditor.revealLineNearTop(re,ce)}revealPosition(re,ce=0){this._modifiedEditor.revealPosition(re,ce)}revealPositionInCenter(re,ce=0){this._modifiedEditor.revealPositionInCenter(re,ce)}revealPositionInCenterIfOutsideViewport(re,ce=0){this._modifiedEditor.revealPositionInCenterIfOutsideViewport(re,ce)}revealPositionNearTop(re,ce=0){this._modifiedEditor.revealPositionNearTop(re,ce)}getSelection(){return this._modifiedEditor.getSelection()}getSelections(){return this._modifiedEditor.getSelections()}setSelection(re){this._modifiedEditor.setSelection(re)}setSelections(re){this._modifiedEditor.setSelections(re)}revealLines(re,ce,me=0){this._modifiedEditor.revealLines(re,ce,me)}revealLinesInCenter(re,ce,me=0){this._modifiedEditor.revealLinesInCenter(re,ce,me)}revealLinesInCenterIfOutsideViewport(re,ce,me=0){this._modifiedEditor.revealLinesInCenterIfOutsideViewport(re,ce,me)}revealLinesNearTop(re,ce,me=0){this._modifiedEditor.revealLinesNearTop(re,ce,me)}revealRange(re,ce=0,me=!1,Ce=!0){this._modifiedEditor.revealRange(re,ce,me,Ce)}revealRangeInCenter(re,ce=0){this._modifiedEditor.revealRangeInCenter(re,ce)}revealRangeInCenterIfOutsideViewport(re,ce=0){this._modifiedEditor.revealRangeInCenterIfOutsideViewport(re,ce)}revealRangeNearTop(re,ce=0){this._modifiedEditor.revealRangeNearTop(re,ce)}revealRangeNearTopIfOutsideViewport(re,ce=0){this._modifiedEditor.revealRangeNearTopIfOutsideViewport(re,ce)}revealRangeAtTop(re,ce=0){this._modifiedEditor.revealRangeAtTop(re,ce)}getSupportedActions(){return this._modifiedEditor.getSupportedActions()}saveViewState(){const re=this._originalEditor.saveViewState(),ce=this._modifiedEditor.saveViewState();return{original:re,modified:ce}}restoreViewState(re){if(re&&re.original&&re.modified){const ce=re;this._originalEditor.restoreViewState(ce.original),this._modifiedEditor.restoreViewState(ce.modified)}}layout(re){this._elementSizeObserver.observe(re)}focus(){this._modifiedEditor.focus()}hasTextFocus(){return this._originalEditor.hasTextFocus()||this._modifiedEditor.hasTextFocus()}trigger(re,ce,me){this._modifiedEditor.trigger(re,ce,me)}changeDecorations(re){return this._modifiedEditor.changeDecorations(re)}_onDidContainerSizeChanged(){this._doLayout()}_getReviewHeight(){return this._reviewPane.isVisible()?this._elementSizeObserver.getHeight():0}_layoutOverviewRulers(){if(!!this._renderOverviewRuler&&!(!this._originalOverviewRuler||!this._modifiedOverviewRuler)){const re=this._elementSizeObserver.getHeight(),ce=this._getReviewHeight(),me=Ge.ENTIRE_DIFF_OVERVIEW_WIDTH-2*Ge.ONE_OVERVIEW_WIDTH;this._modifiedEditor.getLayoutInfo()&&(this._originalOverviewRuler.setLayout({top:0,width:Ge.ONE_OVERVIEW_WIDTH,right:me+Ge.ONE_OVERVIEW_WIDTH,height:re-ce}),this._modifiedOverviewRuler.setLayout({top:0,right:0,width:Ge.ONE_OVERVIEW_WIDTH,height:re-ce}))}}_onViewZonesChanged(){this._currentlyChangingViewZones||this._updateDecorationsRunner.schedule()}_beginUpdateDecorationsSoon(){this._beginUpdateDecorationsTimeout!==-1&&(window.clearTimeout(this._beginUpdateDecorationsTimeout),this._beginUpdateDecorationsTimeout=-1),this._beginUpdateDecorationsTimeout=window.setTimeout(()=>this._beginUpdateDecorations(),Ge.UPDATE_DIFF_DECORATIONS_DELAY)}static _equals(re,ce){return!re&&!ce?!0:!re||!ce?!1:re.toString()===ce.toString()}_beginUpdateDecorations(){this._beginUpdateDecorationsTimeout=-1;const re=this._originalEditor.getModel(),ce=this._modifiedEditor.getModel();if(!(!re||!ce)){this._diffComputationToken++;const me=this._diffComputationToken;if(this._setState(1),!this._editorWorkerService.canComputeDiff(re.uri,ce.uri)){(!Ge._equals(re.uri,this._lastOriginalWarning)||!Ge._equals(ce.uri,this._lastModifiedWarning))&&(this._lastOriginalWarning=re.uri,this._lastModifiedWarning=ce.uri,this._notificationService.warn(b.localize(2,null)));return}this._editorWorkerService.computeDiff(re.uri,ce.uri,this._ignoreTrimWhitespace,this._maxComputationTime).then(Ce=>{me===this._diffComputationToken&&re===this._originalEditor.getModel()&&ce===this._modifiedEditor.getModel()&&(this._setState(2),this._diffComputationResult=Ce,this._updateDecorationsRunner.schedule(),this._onDidUpdateDiff.fire())},Ce=>{me===this._diffComputationToken&&re===this._originalEditor.getModel()&&ce===this._modifiedEditor.getModel()&&(this._setState(2),this._diffComputationResult=null,this._updateDecorationsRunner.schedule())})}}_cleanViewZonesAndDecorations(){this._originalEditorState.clean(this._originalEditor),this._modifiedEditorState.clean(this._modifiedEditor)}_updateDecorations(){if(!(!this._originalEditor.getModel()||!this._modifiedEditor.getModel())){const re=this._diffComputationResult?this._diffComputationResult.changes:[],ce=this._originalEditorState.getForeignViewZones(this._originalEditor.getWhitespaces()),me=this._modifiedEditorState.getForeignViewZones(this._modifiedEditor.getWhitespaces()),Ce=this._strategy.getEditorsDiffDecorations(re,this._ignoreTrimWhitespace,this._renderIndicators,ce,me);try{this._currentlyChangingViewZones=!0,this._originalEditorState.apply(this._originalEditor,this._originalOverviewRuler,Ce.original,!1),this._modifiedEditorState.apply(this._modifiedEditor,this._modifiedOverviewRuler,Ce.modified,!0)}finally{this._currentlyChangingViewZones=!1}}}_adjustOptionsForSubEditor(re){const ce=Object.assign({},re);return ce.inDiffEditor=!0,ce.automaticLayout=!1,ce.scrollbar=Object.assign({},ce.scrollbar||{}),ce.scrollbar.vertical="visible",ce.folding=!1,ce.codeLens=this._diffCodeLens,ce.fixedOverflowWidgets=!0,ce.minimap=Object.assign({},ce.minimap||{}),ce.minimap.enabled=!1,ce}_adjustOptionsForLeftHandSide(re){const ce=this._adjustOptionsForSubEditor(re);return this._renderSideBySide?ce.wordWrapOverride1=this._diffWordWrap:ce.wordWrapOverride1="off",re.originalAriaLabel&&(ce.ariaLabel=re.originalAriaLabel),ce.readOnly=!this._originalIsEditable,ce.extraEditorClassName="original-in-monaco-diff-editor",Object.assign(Object.assign({},ce),{dimension:{height:0,width:0}})}_adjustOptionsForRightHandSide(re){const ce=this._adjustOptionsForSubEditor(re);return re.modifiedAriaLabel&&(ce.ariaLabel=re.modifiedAriaLabel),ce.wordWrapOverride1=this._diffWordWrap,ce.revealHorizontalRightPadding=a.EditorOptions.revealHorizontalRightPadding.defaultValue+Ge.ENTIRE_DIFF_OVERVIEW_WIDTH,ce.scrollbar.verticalHasArrows=!1,ce.extraEditorClassName="modified-in-monaco-diff-editor",Object.assign(Object.assign({},ce),{dimension:{height:0,width:0}})}doLayout(){this._elementSizeObserver.observe(),this._doLayout()}_doLayout(){const re=this._elementSizeObserver.getWidth(),ce=this._elementSizeObserver.getHeight(),me=this._getReviewHeight(),Ce=this._strategy.layout();this._originalDomNode.style.width=Ce+"px",this._originalDomNode.style.left="0px",this._modifiedDomNode.style.width=re-Ce+"px",this._modifiedDomNode.style.left=Ce+"px",this._overviewDomElement.style.top="0px",this._overviewDomElement.style.height=ce-me+"px",this._overviewDomElement.style.width=Ge.ENTIRE_DIFF_OVERVIEW_WIDTH+"px",this._overviewDomElement.style.left=re-Ge.ENTIRE_DIFF_OVERVIEW_WIDTH+"px",this._overviewViewportDomElement.setWidth(Ge.ENTIRE_DIFF_OVERVIEW_WIDTH),this._overviewViewportDomElement.setHeight(30),this._originalEditor.layout({width:Ce,height:ce-me}),this._modifiedEditor.layout({width:re-Ce-(this._renderOverviewRuler?Ge.ENTIRE_DIFF_OVERVIEW_WIDTH:0),height:ce-me}),(this._originalOverviewRuler||this._modifiedOverviewRuler)&&this._layoutOverviewRulers(),this._reviewPane.layout(ce-me,re,me),this._layoutOverviewViewport()}_layoutOverviewViewport(){const re=this._computeOverviewViewport();re?(this._overviewViewportDomElement.setTop(re.top),this._overviewViewportDomElement.setHeight(re.height)):(this._overviewViewportDomElement.setTop(0),this._overviewViewportDomElement.setHeight(0))}_computeOverviewViewport(){const re=this._modifiedEditor.getLayoutInfo();if(!re)return null;const ce=this._modifiedEditor.getScrollTop(),me=this._modifiedEditor.getScrollHeight(),Ce=Math.max(0,re.height),be=Math.max(0,Ce-2*0),Le=me>0?be/me:0,De=Math.max(0,Math.floor(re.height*Le)),Re=Math.floor(ce*Le);return{height:De,top:Re}}_createDataSource(){return{getWidth:()=>this._elementSizeObserver.getWidth(),getHeight:()=>this._elementSizeObserver.getHeight()-this._getReviewHeight(),getOptions:()=>({renderOverviewRuler:this._renderOverviewRuler}),getContainerDomNode:()=>this._containerDomElement,relayoutEditors:()=>{this._doLayout()},getOriginalEditor:()=>this._originalEditor,getModifiedEditor:()=>this._modifiedEditor}}_setStrategy(re){this._strategy&&this._strategy.dispose(),this._strategy=re,re.applyColors(this._themeService.getColorTheme()),this._diffComputationResult&&this._updateDecorations(),this._doLayout()}_getLineChangeAtOrBeforeLineNumber(re,ce){const me=this._diffComputationResult?this._diffComputationResult.changes:[];if(me.length===0||re=Re?Ce=Le+1:(Ce=Le,be=Le)}return me[Ce]}_getEquivalentLineForOriginalLineNumber(re){const ce=this._getLineChangeAtOrBeforeLineNumber(re,Re=>Re.originalStartLineNumber);if(!ce)return re;const me=ce.originalStartLineNumber+(ce.originalEndLineNumber>0?-1:0),Ce=ce.modifiedStartLineNumber+(ce.modifiedEndLineNumber>0?-1:0),be=ce.originalEndLineNumber>0?ce.originalEndLineNumber-ce.originalStartLineNumber+1:0,Le=ce.modifiedEndLineNumber>0?ce.modifiedEndLineNumber-ce.modifiedStartLineNumber+1:0,De=re-me;return De<=be?Ce+Math.min(De,Le):Ce+Le-be+De}_getEquivalentLineForModifiedLineNumber(re){const ce=this._getLineChangeAtOrBeforeLineNumber(re,Re=>Re.modifiedStartLineNumber);if(!ce)return re;const me=ce.originalStartLineNumber+(ce.originalEndLineNumber>0?-1:0),Ce=ce.modifiedStartLineNumber+(ce.modifiedEndLineNumber>0?-1:0),be=ce.originalEndLineNumber>0?ce.originalEndLineNumber-ce.originalStartLineNumber+1:0,Le=ce.modifiedEndLineNumber>0?ce.modifiedEndLineNumber-ce.modifiedStartLineNumber+1:0,De=re-Ce;return De<=Le?me+Math.min(De,be):me+be-Le+De}getDiffLineInformationForOriginal(re){return this._diffComputationResult?{equivalentLineNumber:this._getEquivalentLineForOriginalLineNumber(re)}:null}getDiffLineInformationForModified(re){return this._diffComputationResult?{equivalentLineNumber:this._getEquivalentLineForModifiedLineNumber(re)}:null}};X.ONE_OVERVIEW_WIDTH=15,X.ENTIRE_DIFF_OVERVIEW_WIDTH=30,X.UPDATE_DIFF_DECORATIONS_DELAY=200,X=Me([_e(3,O.IClipboardService),_e(4,t.IEditorWorkerService),_e(5,f.IContextKeyService),_e(6,v.IInstantiationService),_e(7,c.ICodeEditorService),_e(8,k.IThemeService),_e(9,L.INotificationService),_e(10,E.IContextMenuService),_e(11,F.IEditorProgressService)],X),e.DiffEditorWidget=X;class z extends d.Disposable{constructor(re){super();this._dataSource=re,this._insertColor=null,this._removeColor=null}applyColors(re){const ce=(re.getColor(I.diffInserted)||I.defaultInsertColor).transparent(2),me=(re.getColor(I.diffRemoved)||I.defaultRemoveColor).transparent(2),Ce=!ce.equals(this._insertColor)||!me.equals(this._removeColor);return this._insertColor=ce,this._removeColor=me,Ce}getEditorsDiffDecorations(re,ce,me,Ce,be){be=be.sort((Ee,Ae)=>Ee.afterLineNumber-Ae.afterLineNumber),Ce=Ce.sort((Ee,Ae)=>Ee.afterLineNumber-Ae.afterLineNumber);const Le=this._getViewZones(re,Ce,be,me),De=this._getOriginalEditorDecorations(re,ce,me),Re=this._getModifiedEditorDecorations(re,ce,me);return{original:{decorations:De.decorations,overviewZones:De.overviewZones,zones:Le.original},modified:{decorations:Re.decorations,overviewZones:Re.overviewZones,zones:Le.modified}}}}class P{constructor(re){this._source=re,this._index=-1,this.current=null,this.advance()}advance(){this._index++,this._indexOe.afterLineNumber-Fe.afterLineNumber,pe=(Oe,Fe)=>{if(Fe.domNode===null&&Oe.length>0){const Pe=Oe[Oe.length-1];if(Pe.afterLineNumber===Fe.afterLineNumber&&Pe.domNode===null){Pe.heightInLines+=Fe.heightInLines;return}}Oe.push(Fe)},ve=new P(this._modifiedForeignVZ),ke=new P(this._originalForeignVZ);let Ne=1,Te=1;for(let Oe=0,Fe=this._lineChanges.length;Oe<=Fe;Oe++){const Pe=Oe0?-1:0),ye=Pe.modifiedStartLineNumber+(Pe.modifiedEndLineNumber>0?-1:0),Se=Pe.originalEndLineNumber>0?V._getViewLineCount(this._originalEditor,Pe.originalStartLineNumber,Pe.originalEndLineNumber):0,Ae=Pe.modifiedEndLineNumber>0?V._getViewLineCount(this._modifiedEditor,Pe.modifiedStartLineNumber,Pe.modifiedEndLineNumber):0,fe=Math.max(Pe.originalStartLineNumber,Pe.originalEndLineNumber),de=Math.max(Pe.modifiedStartLineNumber,Pe.modifiedEndLineNumber)):(we+=1e7+Se,ye+=1e7+Ae,fe=we,de=ye);let xe=[],We=[];if(be){let Be;Pe?Pe.originalEndLineNumber>0?Be=Pe.originalStartLineNumber-Ne:Be=Pe.modifiedStartLineNumber-Te:Be=Le.getLineCount()-Ne;for(let He=0;Heje&&We.push({afterLineNumber:Ue,heightInLines:Ye-je,domNode:null,marginDomNode:null})}Pe&&(Ne=(Pe.originalEndLineNumber>0?Pe.originalEndLineNumber:Pe.originalStartLineNumber)+1,Te=(Pe.modifiedEndLineNumber>0?Pe.modifiedEndLineNumber:Pe.modifiedStartLineNumber)+1)}for(;ve.current&&ve.current.afterLineNumber<=de;){let Be;ve.current.afterLineNumber<=ye?Be=we-ye+ve.current.afterLineNumber:Be=fe;let He=null;Pe&&Pe.modifiedStartLineNumber<=ve.current.afterLineNumber&&ve.current.afterLineNumber<=Pe.modifiedEndLineNumber&&(He=this._createOriginalMarginDomNodeForModifiedForeignViewZoneInAddedRegion()),xe.push({afterLineNumber:Be,heightInLines:ve.current.height/ce,domNode:null,marginDomNode:He}),ve.advance()}for(;ke.current&&ke.current.afterLineNumber<=fe;){let Be;ke.current.afterLineNumber<=we?Be=ye-we+ke.current.afterLineNumber:Be=de,We.push({afterLineNumber:Be,heightInLines:ke.current.height/re,domNode:null}),ke.advance()}if(Pe!==null&&j(Pe)){const Be=this._produceOriginalFromDiff(Pe,Se,Ae);Be&&xe.push(Be)}if(Pe!==null&&te(Pe)){const Be=this._produceModifiedFromDiff(Pe,Se,Ae);Be&&We.push(Be)}let ze=0,Ke=0;for(xe=xe.sort(ge),We=We.sort(ge);ze=He.heightInLines?(Be.heightInLines-=He.heightInLines,Ke++):(He.heightInLines-=Be.heightInLines,ze++)}for(;ze(ce.domNode||(ce.domNode=Z()),ce))}}function U(he,re,ce,me,Ce){return{range:new u.Range(he,re,ce,me),options:Ce}}const H={charDelete:n.ModelDecorationOptions.register({className:"char-delete"}),charDeleteWholeLine:n.ModelDecorationOptions.register({className:"char-delete",isWholeLine:!0}),charInsert:n.ModelDecorationOptions.register({className:"char-insert"}),charInsertWholeLine:n.ModelDecorationOptions.register({className:"char-insert",isWholeLine:!0}),lineInsert:n.ModelDecorationOptions.register({className:"line-insert",marginClassName:"line-insert",isWholeLine:!0}),lineInsertWithSign:n.ModelDecorationOptions.register({className:"line-insert",linesDecorationsClassName:"insert-sign "+k.ThemeIcon.asClassName(se),marginClassName:"line-insert",isWholeLine:!0}),lineDelete:n.ModelDecorationOptions.register({className:"line-delete",marginClassName:"line-delete",isWholeLine:!0}),lineDeleteWithSign:n.ModelDecorationOptions.register({className:"line-delete",linesDecorationsClassName:"delete-sign "+k.ThemeIcon.asClassName(ne),marginClassName:"line-delete",isWholeLine:!0}),lineDeleteMargin:n.ModelDecorationOptions.register({marginClassName:"line-delete"})};class $ extends z{constructor(re,ce){super(re);this._disableSash=ce===!1,this._sashRatio=null,this._sashPosition=null,this._startSashPosition=null,this._sash=this._register(new w.Sash(this._dataSource.getContainerDomNode(),this,{orientation:0})),this._disableSash&&(this._sash.state=0),this._sash.onDidStart(()=>this._onSashDragStart()),this._sash.onDidChange(me=>this._onSashDrag(me)),this._sash.onDidEnd(()=>this._onSashDragEnd()),this._sash.onDidReset(()=>this._onSashReset())}setEnableSplitViewResizing(re){const ce=re===!1;this._disableSash!==ce&&(this._disableSash=ce,this._sash.state=this._disableSash?0:3)}layout(re=this._sashRatio){const me=this._dataSource.getWidth()-(this._dataSource.getOptions().renderOverviewRuler?X.ENTIRE_DIFF_OVERVIEW_WIDTH:0);let Ce=Math.floor((re||.5)*me);const be=Math.floor(.5*me);return Ce=this._disableSash?be:Ce||be,me>$.MINIMUM_EDITOR_WIDTH*2?(Ce<$.MINIMUM_EDITOR_WIDTH&&(Ce=$.MINIMUM_EDITOR_WIDTH),Ce>me-$.MINIMUM_EDITOR_WIDTH&&(Ce=me-$.MINIMUM_EDITOR_WIDTH)):Ce=be,this._sashPosition!==Ce&&(this._sashPosition=Ce,this._sash.layout()),this._sashPosition}_onSashDragStart(){this._startSashPosition=this._sashPosition}_onSashDrag(re){const me=this._dataSource.getWidth()-(this._dataSource.getOptions().renderOverviewRuler?X.ENTIRE_DIFF_OVERVIEW_WIDTH:0),Ce=this.layout((this._startSashPosition+(re.currentX-re.startX))/me);this._sashRatio=Ce/me,this._dataSource.relayoutEditors()}_onSashDragEnd(){this._sash.layout()}_onSashReset(){this._sashRatio=.5,this._dataSource.relayoutEditors(),this._sash.layout()}getVerticalSashTop(re){return 0}getVerticalSashLeft(re){return this._sashPosition}getVerticalSashHeight(re){return this._dataSource.getHeight()}_getViewZones(re,ce,me){const Ce=this._dataSource.getOriginalEditor(),be=this._dataSource.getModifiedEditor();return new ie(re,ce,me,Ce,be).getViewZones()}_getOriginalEditorDecorations(re,ce,me){const Ce=this._dataSource.getOriginalEditor(),be=String(this._removeColor),Le={decorations:[],overviewZones:[]},De=Ce.getModel(),Re=Ce._getViewModel();for(const Ee of re)if(te(Ee)){Le.decorations.push({range:new u.Range(Ee.originalStartLineNumber,1,Ee.originalEndLineNumber,1073741824),options:me?H.lineDeleteWithSign:H.lineDelete}),(!j(Ee)||!Ee.charChanges)&&Le.decorations.push(U(Ee.originalStartLineNumber,1,Ee.originalEndLineNumber,1073741824,H.charDeleteWholeLine));const Ae=ue(De,Re,Ee.originalStartLineNumber,Ee.originalEndLineNumber);if(Le.overviewZones.push(new l.OverviewRulerZone(Ae.startLineNumber,Ae.endLineNumber,be)),Ee.charChanges){for(const Se of Ee.charChanges)if(te(Se))if(ce)for(let we=Se.originalStartLineNumber;we<=Se.originalEndLineNumber;we++){let ye,fe;we===Se.originalStartLineNumber?ye=Se.originalStartColumn:ye=De.getLineFirstNonWhitespaceColumn(we),we===Se.originalEndLineNumber?fe=Se.originalEndColumn:fe=De.getLineLastNonWhitespaceColumn(we),Le.decorations.push(U(we,ye,we,fe,H.charDelete))}else Le.decorations.push(U(Se.originalStartLineNumber,Se.originalStartColumn,Se.originalEndLineNumber,Se.originalEndColumn,H.charDelete))}}return Le}_getModifiedEditorDecorations(re,ce,me){const Ce=this._dataSource.getModifiedEditor(),be=String(this._insertColor),Le={decorations:[],overviewZones:[]},De=Ce.getModel(),Re=Ce._getViewModel();for(const Ee of re)if(j(Ee)){Le.decorations.push({range:new u.Range(Ee.modifiedStartLineNumber,1,Ee.modifiedEndLineNumber,1073741824),options:me?H.lineInsertWithSign:H.lineInsert}),(!te(Ee)||!Ee.charChanges)&&Le.decorations.push(U(Ee.modifiedStartLineNumber,1,Ee.modifiedEndLineNumber,1073741824,H.charInsertWholeLine));const Ae=ue(De,Re,Ee.modifiedStartLineNumber,Ee.modifiedEndLineNumber);if(Le.overviewZones.push(new l.OverviewRulerZone(Ae.startLineNumber,Ae.endLineNumber,be)),Ee.charChanges){for(const Se of Ee.charChanges)if(j(Se))if(ce)for(let we=Se.modifiedStartLineNumber;we<=Se.modifiedEndLineNumber;we++){let ye,fe;we===Se.modifiedStartLineNumber?ye=Se.modifiedStartColumn:ye=De.getLineFirstNonWhitespaceColumn(we),we===Se.modifiedEndLineNumber?fe=Se.modifiedEndColumn:fe=De.getLineLastNonWhitespaceColumn(we),Le.decorations.push(U(we,ye,we,fe,H.charInsert))}else Le.decorations.push(U(Se.modifiedStartLineNumber,Se.modifiedStartColumn,Se.modifiedEndLineNumber,Se.modifiedEndColumn,H.charInsert))}}return Le}}$.MINIMUM_EDITOR_WIDTH=100;class ie extends V{constructor(re,ce,me,Ce,be){super(re,ce,me,Ce,be)}_createOriginalMarginDomNodeForModifiedForeignViewZoneInAddedRegion(){return null}_produceOriginalFromDiff(re,ce,me){return me>ce?{afterLineNumber:Math.max(re.originalStartLineNumber,re.originalEndLineNumber),heightInLines:me-ce,domNode:null}:null}_produceModifiedFromDiff(re,ce,me){return ce>me?{afterLineNumber:Math.max(re.modifiedStartLineNumber,re.modifiedEndLineNumber),heightInLines:ce-me,domNode:null}:null}}class oe extends z{constructor(re,ce){super(re);this._decorationsLeft=re.getOriginalEditor().getLayoutInfo().decorationsLeft,this._register(re.getOriginalEditor().onDidLayoutChange(me=>{this._decorationsLeft!==me.decorationsLeft&&(this._decorationsLeft=me.decorationsLeft,re.relayoutEditors())}))}setEnableSplitViewResizing(re){}_getViewZones(re,ce,me,Ce){const be=this._dataSource.getOriginalEditor(),Le=this._dataSource.getModifiedEditor();return new ae(re,ce,me,be,Le,Ce).getViewZones()}_getOriginalEditorDecorations(re,ce,me){const Ce=String(this._removeColor),be={decorations:[],overviewZones:[]},Le=this._dataSource.getOriginalEditor(),De=Le.getModel(),Re=Le._getViewModel();for(const Ee of re)if(te(Ee)){be.decorations.push({range:new u.Range(Ee.originalStartLineNumber,1,Ee.originalEndLineNumber,1073741824),options:H.lineDeleteMargin});const Ae=ue(De,Re,Ee.originalStartLineNumber,Ee.originalEndLineNumber);be.overviewZones.push(new l.OverviewRulerZone(Ae.startLineNumber,Ae.endLineNumber,Ce))}return be}_getModifiedEditorDecorations(re,ce,me){const Ce=this._dataSource.getModifiedEditor(),be=String(this._insertColor),Le={decorations:[],overviewZones:[]},De=Ce.getModel(),Re=Ce._getViewModel();for(const Ee of re)if(j(Ee)){Le.decorations.push({range:new u.Range(Ee.modifiedStartLineNumber,1,Ee.modifiedEndLineNumber,1073741824),options:me?H.lineInsertWithSign:H.lineInsert});const Ae=ue(De,Re,Ee.modifiedStartLineNumber,Ee.modifiedEndLineNumber);if(Le.overviewZones.push(new l.OverviewRulerZone(Ae.startLineNumber,Ae.endLineNumber,be)),Ee.charChanges){for(const Se of Ee.charChanges)if(j(Se))if(ce)for(let we=Se.modifiedStartLineNumber;we<=Se.modifiedEndLineNumber;we++){let ye,fe;we===Se.modifiedStartLineNumber?ye=Se.modifiedStartColumn:ye=De.getLineFirstNonWhitespaceColumn(we),we===Se.modifiedEndLineNumber?fe=Se.modifiedEndColumn:fe=De.getLineLastNonWhitespaceColumn(we),Le.decorations.push(U(we,ye,we,fe,H.charInsert))}else Le.decorations.push(U(Se.modifiedStartLineNumber,Se.modifiedStartColumn,Se.modifiedEndLineNumber,Se.modifiedEndColumn,H.charInsert))}else Le.decorations.push(U(Ee.modifiedStartLineNumber,1,Ee.modifiedEndLineNumber,1073741824,H.charInsertWholeLine))}return Le}layout(){return Math.max(5,this._decorationsLeft)}}class ae extends V{constructor(re,ce,me,Ce,be,Le){super(re,ce,me,Ce,be);this._originalModel=Ce.getModel(),this._renderIndicators=Le,this._pendingLineChange=[],this._pendingViewZones=[],this._lineBreaksComputer=this._modifiedEditor._getViewModel().createLineBreaksComputer()}getViewZones(){const re=super.getViewZones();return this._finalize(re),re}_createOriginalMarginDomNodeForModifiedForeignViewZoneInAddedRegion(){const re=document.createElement("div");return re.className="inline-added-margin-view-zone",re}_produceOriginalFromDiff(re,ce,me){const Ce=document.createElement("div");return Ce.className="inline-added-margin-view-zone",{afterLineNumber:Math.max(re.originalStartLineNumber,re.originalEndLineNumber),heightInLines:me,domNode:document.createElement("div"),marginDomNode:Ce}}_produceModifiedFromDiff(re,ce,me){const Ce=document.createElement("div");Ce.className=`view-lines line-delete ${W.MOUSE_CURSOR_TEXT_CSS_CLASS_NAME}`;const be=document.createElement("div");be.className="inline-deleted-margin-view-zone";const Le={shouldNotShrink:!0,afterLineNumber:re.modifiedEndLineNumber===0?re.modifiedStartLineNumber:re.modifiedStartLineNumber-1,heightInLines:ce,minWidthInPx:0,domNode:Ce,marginDomNode:be,diff:{originalStartLineNumber:re.originalStartLineNumber,originalEndLineNumber:re.originalEndLineNumber,modifiedStartLineNumber:re.modifiedStartLineNumber,modifiedEndLineNumber:re.modifiedEndLineNumber,originalModel:this._originalModel,viewLineCounts:null}};for(let De=re.originalStartLineNumber;De<=re.originalEndLineNumber;De++)this._lineBreaksComputer.addRequest(this._originalModel.getLineContent(De),null);return this._pendingLineChange.push(re),this._pendingViewZones.push(Le),Le}_finalize(re){const ce=this._modifiedEditor.getOptions(),me=this._modifiedEditor.getModel().getOptions().tabSize,Ce=ce.get(38),be=ce.get(26),Le=Ce.typicalHalfwidthCharacterWidth,De=ce.get(88),Re=this._originalModel.mightContainNonBasicASCII(),Ee=this._originalModel.mightContainRTL(),Ae=ce.get(53),we=ce.get(124).decorationsWidth,ye=ce.get(100),fe=ce.get(83),de=ce.get(77),ge=ce.get(39),pe=this._lineBreaksComputer.finalize();let ve=0;for(let ke=0;ke0,We=r.createStringBuilder(1e4);let ze=0,Ke=0,Be=null;for(let Ue=Ne.originalStartLineNumber;Ue<=Ne.originalEndLineNumber;Ue++){const Ye=Ue-Ne.originalStartLineNumber,je=this._originalModel.getLineTokens(Ue),Xe=je.getLineContent(),$e=pe[ve++],Ze=h.LineDecoration.filter(Pe,Ue,1,Xe.length+1);if($e){let Qe=0;for(const Je of $e.breakOffsets){const nt=je.sliceAndInflate(Qe,Je,0),si=Xe.substring(Qe,Je);ze=Math.max(ze,this._renderOriginalLine(Ke++,si,nt,h.LineDecoration.extractWrapped(Ze,Qe,Je),xe,Re,Ee,Ce,be,Ae,we,ye,fe,de,ge,me,We,Fe)),Qe=Je}for(Be||(Be=[]);Be.lengthke.afterLineNumber-Ne.afterLineNumber)}_renderOriginalLine(re,ce,me,Ce,be,Le,De,Re,Ee,Ae,Se,we,ye,fe,de,ge,pe,ve){pe.appendASCIIString('
    ');const ke=_.ViewLineRenderingData.isBasicASCII(ce,Le),Ne=_.ViewLineRenderingData.containsRTL(ce,ke,De),Te=m.renderViewLine(new m.RenderLineInput(Re.isMonospace&&!Ee,Re.canUseHalfwidthRightwardsArrow,ce,!1,ke,Ne,0,me,Ce,ge,0,Re.spaceWidth,Re.middotWidth,Re.wsmiddotWidth,we,ye,fe,de!==a.EditorFontLigatures.OFF,null),pe);if(pe.appendASCIIString("
    "),this._renderIndicators){const Fe=document.createElement("div");Fe.className=`delete-sign ${k.ThemeIcon.asClassName(ne)}`,Fe.setAttribute("style",`position:absolute;top:${re*Ae}px;width:${Se}px;height:${Ae}px;right:0;`),ve.appendChild(Fe)}const Oe=Te.characterMapping.getAbsoluteOffsets();return Oe.length>0?Oe[Oe.length-1]:0}}function G(he,re){return a.stringSet(he,re,["off","on","inherit"])}function j(he){return he.modifiedEndLineNumber>0}function te(he){return he.originalEndLineNumber>0}function Z(){const he=document.createElement("div");return he.className="diagonal-fill",he}function ue(he,re,ce,me){const Ce=he.getLineCount();return ce=Math.min(Ce,Math.max(1,ce)),me=Math.min(Ce,Math.max(1,me)),re.coordinatesConverter.convertModelRangeToViewRange(new u.Range(ce,he.getLineMinColumn(ce),me,he.getLineMaxColumn(me)))}k.registerThemingParticipant((he,re)=>{const ce=he.getColor(I.diffInserted);ce&&(re.addRule(`.monaco-editor .line-insert, .monaco-editor .char-insert { background-color: ${ce}; }`),re.addRule(`.monaco-diff-editor .line-insert, .monaco-diff-editor .char-insert { background-color: ${ce}; }`),re.addRule(`.monaco-editor .inline-added-margin-view-zone { background-color: ${ce}; }`));const me=he.getColor(I.diffRemoved);me&&(re.addRule(`.monaco-editor .line-delete, .monaco-editor .char-delete { background-color: ${me}; }`),re.addRule(`.monaco-diff-editor .line-delete, .monaco-diff-editor .char-delete { background-color: ${me}; }`),re.addRule(`.monaco-editor .inline-deleted-margin-view-zone { background-color: ${me}; }`));const Ce=he.getColor(I.diffInsertedOutline);Ce&&re.addRule(`.monaco-editor .line-insert, .monaco-editor .char-insert { border: 1px ${he.type==="hc"?"dashed":"solid"} ${Ce}; }`);const be=he.getColor(I.diffRemovedOutline);be&&re.addRule(`.monaco-editor .line-delete, .monaco-editor .char-delete { border: 1px ${he.type==="hc"?"dashed":"solid"} ${be}; }`);const Le=he.getColor(I.scrollbarShadow);Le&&re.addRule(`.monaco-diff-editor.side-by-side .editor.modified { box-shadow: -6px 0 5px -5px ${Le}; }`);const De=he.getColor(I.diffBorder);De&&re.addRule(`.monaco-diff-editor.side-by-side .editor.modified { border-left: 1px solid ${De}; }`);const Re=he.getColor(I.scrollbarSliderBackground);Re&&re.addRule(` + .monaco-diff-editor .diffViewport { + background: ${Re}; + } + `);const Ee=he.getColor(I.scrollbarSliderHoverBackground);Ee&&re.addRule(` + .monaco-diff-editor .diffViewport:hover { + background: ${Ee}; + } + `);const Ae=he.getColor(I.scrollbarSliderActiveBackground);Ae&&re.addRule(` + .monaco-diff-editor .diffViewport:active { + background: ${Ae}; + } + `);const Se=he.getColor(I.diffDiagonalFill);re.addRule(` + .monaco-editor .diagonal-fill { + background-image: linear-gradient( + -45deg, + ${Se} 12.5%, + #0000 12.5%, #0000 50%, + ${Se} 50%, ${Se} 62.5%, + #0000 62.5%, #0000 100% + ); + background-size: 8px 8px; + } + `)})}),define(Q[657],J([0,1,473,7,47,160,104,52,15,12,2,17,8,3,142,22,11,571,27,80,341]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SimpleButton=e.FindWidget=e.FindWidgetViewZone=e.findNextMatchIcon=e.findPreviousMatchIcon=e.findReplaceAllIcon=e.findReplaceIcon=void 0;const l=t.registerIcon("find-selection",n.Codicon.selection,b.localize(0,null)),h=t.registerIcon("find-collapsed",n.Codicon.chevronRight,b.localize(1,null)),m=t.registerIcon("find-expanded",n.Codicon.chevronDown,b.localize(2,null));e.findReplaceIcon=t.registerIcon("find-replace",n.Codicon.replace,b.localize(3,null)),e.findReplaceAllIcon=t.registerIcon("find-replace-all",n.Codicon.replaceAll,b.localize(4,null)),e.findPreviousMatchIcon=t.registerIcon("find-previous-match",n.Codicon.arrowUp,b.localize(5,null)),e.findNextMatchIcon=t.registerIcon("find-next-match",n.Codicon.arrowDown,b.localize(6,null));const _=b.localize(7,null),f=b.localize(8,null),v=b.localize(9,null),y=b.localize(10,null),L=b.localize(11,null),I=b.localize(12,null),k=b.localize(13,null),E=b.localize(14,null),T=b.localize(15,null),O=b.localize(16,null),A=b.localize(17,null),B=b.localize(18,null,a.MATCHES_LIMIT),F=b.localize(19,null),D=b.localize(20,null),R=419,x=275-54;let K=69;const Y=33,ee="ctrlEnterReplaceAll.windows.donotask",se=c.isMacintosh?256:2048;class ne{constructor(U){this.afterLineNumber=U,this.heightInPx=Y,this.suppressMouseDown=!1,this.domNode=document.createElement("div"),this.domNode.className="dock-find-viewzone"}}e.FindWidgetViewZone=ne;function le(V,U,H){const $=!!U.match(/\n/);if(H&&$&&H.selectionStart>0){V.stopPropagation();return}}function X(V,U,H){const $=!!U.match(/\n/);if(H&&$&&H.selectionEndthis._updateHistoryDelayer.cancel())),this._register(this._state.onFindReplaceStateChange(Z=>this._onStateChanged(Z))),this._buildDomNode(),this._updateButtons(),this._tryUpdateWidgetWidth(),this._findInput.inputBox.layout(),this._register(this._codeEditor.onDidChangeConfiguration(Z=>{if(Z.hasChanged(75)&&(this._codeEditor.getOption(75)&&this._state.change({isReplaceRevealed:!1},!1),this._updateButtons()),Z.hasChanged(124)&&this._tryUpdateWidgetWidth(),Z.hasChanged(2)&&this.updateAccessibilitySupport(),Z.hasChanged(31)){const ue=this._codeEditor.getOption(31).addExtraSpaceOnTop;ue&&!this._viewZone&&(this._viewZone=new ne(0),this._showViewZone()),!ue&&this._viewZone&&this._removeViewZone()}})),this.updateAccessibilitySupport(),this._register(this._codeEditor.onDidChangeCursorSelection(()=>{this._isVisible&&this._updateToggleSelectionFindButton()})),this._register(this._codeEditor.onDidFocusEditorWidget(()=>Ie(this,void 0,void 0,function*(){if(this._isVisible){let Z=yield this._controller.getGlobalBufferTerm();Z&&Z!==this._state.searchString&&(this._state.change({searchString:Z},!1),this._findInput.select())}}))),this._findInputFocused=a.CONTEXT_FIND_INPUT_FOCUSED.bindTo(ae),this._findFocusTracker=this._register(N.trackFocus(this._findInput.inputBox.inputElement)),this._register(this._findFocusTracker.onDidFocus(()=>{this._findInputFocused.set(!0),this._updateSearchScope()})),this._register(this._findFocusTracker.onDidBlur(()=>{this._findInputFocused.set(!1)})),this._replaceInputFocused=a.CONTEXT_REPLACE_INPUT_FOCUSED.bindTo(ae),this._replaceFocusTracker=this._register(N.trackFocus(this._replaceInput.inputBox.inputElement)),this._register(this._replaceFocusTracker.onDidFocus(()=>{this._replaceInputFocused.set(!0),this._updateSearchScope()})),this._register(this._replaceFocusTracker.onDidBlur(()=>{this._replaceInputFocused.set(!1)})),this._codeEditor.addOverlayWidget(this),this._codeEditor.getOption(31).addExtraSpaceOnTop&&(this._viewZone=new ne(0)),this._applyTheme(G.getColorTheme()),this._register(G.onDidColorThemeChange(this._applyTheme.bind(this))),this._register(this._codeEditor.onDidChangeModel(()=>{!this._isVisible||(this._viewZoneId=void 0)})),this._register(this._codeEditor.onDidScrollChange(Z=>{if(Z.scrollTopChanged){this._layoutViewZone();return}setTimeout(()=>{this._layoutViewZone()},0)}))}getId(){return z.ID}getDomNode(){return this._domNode}getPosition(){return this._isVisible?{preference:0}:null}_onStateChanged(U){if(U.searchString){try{this._ignoreChangeEvent=!0,this._findInput.setValue(this._state.searchString)}finally{this._ignoreChangeEvent=!1}this._updateButtons()}if(U.replaceString&&(this._replaceInput.inputBox.value=this._state.replaceString),U.isRevealed&&(this._state.isRevealed?this._reveal():this._hide(!0)),U.isReplaceRevealed&&(this._state.isReplaceRevealed?!this._codeEditor.getOption(75)&&!this._isReplaceVisible&&(this._isReplaceVisible=!0,this._replaceInput.width=N.getTotalWidth(this._findInput.domNode),this._updateButtons(),this._replaceInput.inputBox.layout()):this._isReplaceVisible&&(this._isReplaceVisible=!1,this._updateButtons())),(U.isRevealed||U.isReplaceRevealed)&&(this._state.isRevealed||this._state.isReplaceRevealed)&&this._tryUpdateHeight()&&this._showViewZone(),U.isRegex&&this._findInput.setRegex(this._state.isRegex),U.wholeWord&&this._findInput.setWholeWords(this._state.wholeWord),U.matchCase&&this._findInput.setCaseSensitive(this._state.matchCase),U.preserveCase&&this._replaceInput.setPreserveCase(this._state.preserveCase),U.searchScope&&(this._state.searchScope?this._toggleSelectionFind.checked=!0:this._toggleSelectionFind.checked=!1,this._updateToggleSelectionFindButton()),U.searchString||U.matchesCount||U.matchesPosition){let H=this._state.searchString.length>0&&this._state.matchesCount===0;this._domNode.classList.toggle("no-results",H),this._updateMatchesCount(),this._updateButtons()}(U.searchString||U.currentMatch)&&this._layoutViewZone(),U.updateHistory&&this._delayedUpdateHistory(),U.loop&&this._updateButtons()}_delayedUpdateHistory(){this._updateHistoryDelayer.trigger(this._updateHistory.bind(this)).then(void 0,g.onUnexpectedError)}_updateHistory(){this._state.searchString&&this._findInput.inputBox.addToHistory(),this._state.replaceString&&this._replaceInput.inputBox.addToHistory()}_updateMatchesCount(){this._matchesCount.style.minWidth=K+"px",this._state.matchesCount>=a.MATCHES_LIMIT?this._matchesCount.title=B:this._matchesCount.title="",this._matchesCount.firstChild&&this._matchesCount.removeChild(this._matchesCount.firstChild);let U;if(this._state.matchesCount>0){let H=String(this._state.matchesCount);this._state.matchesCount>=a.MATCHES_LIMIT&&(H+="+");let $=String(this._state.matchesPosition);$==="0"&&($="?"),U=o.format(F,$,H)}else U=D;this._matchesCount.appendChild(document.createTextNode(U)),M.alert(this._getAriaLabel(U,this._state.currentMatch,this._state.searchString)),K=Math.max(K,this._matchesCount.clientWidth)}_getAriaLabel(U,H,$){if(U===D)return $===""?b.localize(21,null,U):b.localize(22,null,U,$);if(H){const ie=b.localize(23,null,U,$,H.startLineNumber+":"+H.startColumn),oe=this._codeEditor.getModel();return oe&&H.startLineNumber<=oe.getLineCount()&&H.startLineNumber>=1?`${oe.getLineContent(H.startLineNumber)}, ${ie}`:ie}return b.localize(24,null,U,$)}_updateToggleSelectionFindButton(){let U=this._codeEditor.getSelection(),H=U?U.startLineNumber!==U.endLineNumber||U.startColumn!==U.endColumn:!1,$=this._toggleSelectionFind.checked;this._isVisible&&($||H)?this._toggleSelectionFind.enable():this._toggleSelectionFind.disable()}_updateButtons(){this._findInput.setEnabled(this._isVisible),this._replaceInput.setEnabled(this._isVisible&&this._isReplaceVisible),this._updateToggleSelectionFindButton(),this._closeBtn.setEnabled(this._isVisible);let U=this._state.searchString.length>0,H=!!this._state.matchesCount;this._prevBtn.setEnabled(this._isVisible&&U&&H&&this._state.canNavigateBack()),this._nextBtn.setEnabled(this._isVisible&&U&&H&&this._state.canNavigateForward()),this._replaceBtn.setEnabled(this._isVisible&&this._isReplaceVisible&&U),this._replaceAllBtn.setEnabled(this._isVisible&&this._isReplaceVisible&&U),this._domNode.classList.toggle("replaceToggled",this._isReplaceVisible),this._toggleReplaceBtn.setExpanded(this._isReplaceVisible);let $=!this._codeEditor.getOption(75);this._toggleReplaceBtn.setEnabled(this._isVisible&&$)}_reveal(){if(this._revealTimeouts.forEach(U=>{clearTimeout(U)}),this._revealTimeouts=[],!this._isVisible){this._isVisible=!0;const U=this._codeEditor.getSelection();switch(this._codeEditor.getOption(31).autoFindInSelection){case"always":this._toggleSelectionFind.checked=!0;break;case"never":this._toggleSelectionFind.checked=!1;break;case"multiline":const $=!!U&&U.startLineNumber!==U.endLineNumber;this._toggleSelectionFind.checked=$;break;default:break}this._tryUpdateWidgetWidth(),this._updateButtons(),this._revealTimeouts.push(setTimeout(()=>{this._domNode.classList.add("visible"),this._domNode.setAttribute("aria-hidden","false")},0)),this._revealTimeouts.push(setTimeout(()=>{this._findInput.validate()},200)),this._codeEditor.layoutOverlayWidget(this);let H=!0;if(this._codeEditor.getOption(31).seedSearchStringFromSelection&&U){const $=this._codeEditor.getDomNode();if($){const ie=N.getDomNodePagePosition($),oe=this._codeEditor.getScrolledVisiblePosition(U.getStartPosition()),ae=ie.left+(oe?oe.left:0),G=oe?oe.top:0;if(this._viewZone&&GU.startLineNumber&&(H=!1);const j=N.getTopLeftOffset(this._domNode).left;ae>j&&(H=!1);const te=this._codeEditor.getScrolledVisiblePosition(U.getEndPosition());ie.left+(te?te.left:0)>j&&(H=!1)}}}this._showViewZone(H)}}_hide(U){this._revealTimeouts.forEach(H=>{clearTimeout(H)}),this._revealTimeouts=[],this._isVisible&&(this._isVisible=!1,this._updateButtons(),this._domNode.classList.remove("visible"),this._domNode.setAttribute("aria-hidden","true"),this._findInput.clearMessage(),U&&this._codeEditor.focus(),this._codeEditor.layoutOverlayWidget(this),this._removeViewZone())}_layoutViewZone(U){if(!this._codeEditor.getOption(31).addExtraSpaceOnTop){this._removeViewZone();return}if(!!this._isVisible){const $=this._viewZone;this._viewZoneId!==void 0||!$||this._codeEditor.changeViewZones(ie=>{$.heightInPx=this._getHeight(),this._viewZoneId=ie.addZone($),this._codeEditor.setScrollTop(U||this._codeEditor.getScrollTop()+$.heightInPx)})}}_showViewZone(U=!0){if(!!this._isVisible&&!!this._codeEditor.getOption(31).addExtraSpaceOnTop){this._viewZone===void 0&&(this._viewZone=new ne(0));const $=this._viewZone;this._codeEditor.changeViewZones(ie=>{if(this._viewZoneId!==void 0){const oe=this._getHeight();if(oe===$.heightInPx)return;let ae=oe-$.heightInPx;$.heightInPx=oe,ie.layoutZone(this._viewZoneId),U&&this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()+ae);return}else{let oe=this._getHeight();if(oe-=this._codeEditor.getOption(69).top,oe<=0)return;$.heightInPx=oe,this._viewZoneId=ie.addZone($),U&&this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()+oe)}})}}_removeViewZone(){this._codeEditor.changeViewZones(U=>{this._viewZoneId!==void 0&&(U.removeZone(this._viewZoneId),this._viewZoneId=void 0,this._viewZone&&(this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()-this._viewZone.heightInPx),this._viewZone=void 0))})}_applyTheme(U){let H={inputActiveOptionBorder:U.getColor(u.inputActiveOptionBorder),inputActiveOptionBackground:U.getColor(u.inputActiveOptionBackground),inputActiveOptionForeground:U.getColor(u.inputActiveOptionForeground),inputBackground:U.getColor(u.inputBackground),inputForeground:U.getColor(u.inputForeground),inputBorder:U.getColor(u.inputBorder),inputValidationInfoBackground:U.getColor(u.inputValidationInfoBackground),inputValidationInfoForeground:U.getColor(u.inputValidationInfoForeground),inputValidationInfoBorder:U.getColor(u.inputValidationInfoBorder),inputValidationWarningBackground:U.getColor(u.inputValidationWarningBackground),inputValidationWarningForeground:U.getColor(u.inputValidationWarningForeground),inputValidationWarningBorder:U.getColor(u.inputValidationWarningBorder),inputValidationErrorBackground:U.getColor(u.inputValidationErrorBackground),inputValidationErrorForeground:U.getColor(u.inputValidationErrorForeground),inputValidationErrorBorder:U.getColor(u.inputValidationErrorBorder)};this._findInput.style(H),this._replaceInput.style(H),this._toggleSelectionFind.style(H)}_tryUpdateWidgetWidth(){if(!!this._isVisible&&!!N.isInDOM(this._domNode)){const U=this._codeEditor.getLayoutInfo();if(U.contentWidth<=0){this._domNode.classList.add("hiddenEditor");return}else this._domNode.classList.contains("hiddenEditor")&&this._domNode.classList.remove("hiddenEditor");const $=U.width,ie=U.minimap.minimapWidth;let oe=!1,ae=!1,G=!1;if(this._resized&&N.getTotalWidth(this._domNode)>R){this._domNode.style.maxWidth=`${$-28-ie-15}px`,this._replaceInput.width=N.getTotalWidth(this._findInput.domNode);return}if(R+28+ie>=$&&(ae=!0),R+28+ie-K>=$&&(G=!0),R+28+ie-K>=$+50&&(oe=!0),this._domNode.classList.toggle("collapsed-find-widget",oe),this._domNode.classList.toggle("narrow-find-widget",G),this._domNode.classList.toggle("reduced-find-widget",ae),!G&&!oe&&(this._domNode.style.maxWidth=`${$-28-ie-15}px`),this._resized){this._findInput.inputBox.layout();let j=this._findInput.inputBox.element.clientWidth;j>0&&(this._replaceInput.width=j)}else this._isReplaceVisible&&(this._replaceInput.width=N.getTotalWidth(this._findInput.domNode))}}_getHeight(){let U=0;return U+=4,U+=this._findInput.inputBox.height+2,this._isReplaceVisible&&(U+=4,U+=this._replaceInput.inputBox.height+2),U+=4,U}_tryUpdateHeight(){const U=this._getHeight();return this._cachedHeight!==null&&this._cachedHeight===U?!1:(this._cachedHeight=U,this._domNode.style.height=`${U}px`,!0)}focusFindInput(){this._findInput.select(),this._findInput.focus()}focusReplaceInput(){this._replaceInput.select(),this._replaceInput.focus()}highlightFindOptions(){this._findInput.highlightFindOptions()}_updateSearchScope(){if(!!this._codeEditor.hasModel()&&this._toggleSelectionFind.checked){let U=this._codeEditor.getSelections();U.map(H=>{H.endColumn===1&&H.endLineNumber>H.startLineNumber&&(H=H.setEndPosition(H.endLineNumber-1,this._codeEditor.getModel().getLineMaxColumn(H.endLineNumber-1)));const $=this._state.currentMatch;return H.startLineNumber!==H.endLineNumber&&!s.Range.equalsRange(H,$)?H:null}).filter(H=>!!H),U.length&&this._state.change({searchScope:U},!0)}}_onFindInputMouseDown(U){U.middleButton&&U.stopPropagation()}_onFindInputKeyDown(U){if(U.equals(se|3)){this._findInput.inputBox.insertAtCursor(` +`),U.preventDefault();return}if(U.equals(2)){this._isReplaceVisible?this._replaceInput.focus():this._findInput.focusOnCaseSensitive(),U.preventDefault();return}if(U.equals(2048|18)){this._codeEditor.focus(),U.preventDefault();return}if(U.equals(16))return le(U,this._findInput.getValue(),this._findInput.domNode.querySelector("textarea"));if(U.equals(18))return X(U,this._findInput.getValue(),this._findInput.domNode.querySelector("textarea"))}_onReplaceInputKeyDown(U){if(U.equals(se|3)){c.isWindows&&c.isNative&&!this._ctrlEnterReplaceAllWarningPrompted&&(this._notificationService.info(b.localize(25,null)),this._ctrlEnterReplaceAllWarningPrompted=!0,this._storageService.store(ee,!0,0,0)),this._replaceInput.inputBox.insertAtCursor(` +`),U.preventDefault();return}if(U.equals(2)){this._findInput.focusOnCaseSensitive(),U.preventDefault();return}if(U.equals(1024|2)){this._findInput.focus(),U.preventDefault();return}if(U.equals(2048|18)){this._codeEditor.focus(),U.preventDefault();return}if(U.equals(16))return le(U,this._replaceInput.inputBox.value,this._replaceInput.inputBox.element.querySelector("textarea"));if(U.equals(18))return X(U,this._replaceInput.inputBox.value,this._replaceInput.inputBox.element.querySelector("textarea"))}getVerticalSashLeft(U){return 0}_keybindingLabelFor(U){let H=this._keybindingService.lookupKeybinding(U);return H?` (${H.getLabel()})`:""}_buildDomNode(){const U=!0,H=!0;this._findInput=this._register(new i.ContextScopedFindInput(null,this._contextViewProvider,{width:x,label:_,placeholder:f,appendCaseSensitiveLabel:this._keybindingLabelFor(a.FIND_IDS.ToggleCaseSensitiveCommand),appendWholeWordsLabel:this._keybindingLabelFor(a.FIND_IDS.ToggleWholeWordCommand),appendRegexLabel:this._keybindingLabelFor(a.FIND_IDS.ToggleRegexCommand),validation:j=>{if(j.length===0||!this._findInput.getRegex())return null;try{return new RegExp(j,"gu"),null}catch(te){return{content:te.message}}},flexibleHeight:U,flexibleWidth:H,flexibleMaxHeight:118},this._contextKeyService,!0)),this._findInput.setRegex(!!this._state.isRegex),this._findInput.setCaseSensitive(!!this._state.matchCase),this._findInput.setWholeWords(!!this._state.wholeWord),this._register(this._findInput.onKeyDown(j=>this._onFindInputKeyDown(j))),this._register(this._findInput.inputBox.onDidChange(()=>{this._ignoreChangeEvent||this._state.change({searchString:this._findInput.getValue()},!0)})),this._register(this._findInput.onDidOptionChange(()=>{this._state.change({isRegex:this._findInput.getRegex(),wholeWord:this._findInput.getWholeWords(),matchCase:this._findInput.getCaseSensitive()},!0)})),this._register(this._findInput.onCaseSensitiveKeyDown(j=>{j.equals(1024|2)&&this._isReplaceVisible&&(this._replaceInput.focus(),j.preventDefault())})),this._register(this._findInput.onRegexKeyDown(j=>{j.equals(2)&&this._isReplaceVisible&&(this._replaceInput.focusOnPreserve(),j.preventDefault())})),this._register(this._findInput.inputBox.onDidHeightChange(j=>{this._tryUpdateHeight()&&this._showViewZone()})),c.isLinux&&this._register(this._findInput.onMouseDown(j=>this._onFindInputMouseDown(j))),this._matchesCount=document.createElement("div"),this._matchesCount.className="matchesCount",this._updateMatchesCount(),this._prevBtn=this._register(new P({label:v+this._keybindingLabelFor(a.FIND_IDS.PreviousMatchFindAction),icon:e.findPreviousMatchIcon,onTrigger:()=>{this._codeEditor.getAction(a.FIND_IDS.PreviousMatchFindAction).run().then(void 0,g.onUnexpectedError)}})),this._nextBtn=this._register(new P({label:y+this._keybindingLabelFor(a.FIND_IDS.NextMatchFindAction),icon:e.findNextMatchIcon,onTrigger:()=>{this._codeEditor.getAction(a.FIND_IDS.NextMatchFindAction).run().then(void 0,g.onUnexpectedError)}}));let $=document.createElement("div");$.className="find-part",$.appendChild(this._findInput.domNode);const ie=document.createElement("div");ie.className="find-actions",$.appendChild(ie),ie.appendChild(this._matchesCount),ie.appendChild(this._prevBtn.domNode),ie.appendChild(this._nextBtn.domNode),this._toggleSelectionFind=this._register(new w.Checkbox({icon:l,title:L+this._keybindingLabelFor(a.FIND_IDS.ToggleSearchScopeCommand),isChecked:!1})),this._register(this._toggleSelectionFind.onChange(()=>{if(this._toggleSelectionFind.checked){if(this._codeEditor.hasModel()){let j=this._codeEditor.getSelections();j.map(te=>(te.endColumn===1&&te.endLineNumber>te.startLineNumber&&(te=te.setEndPosition(te.endLineNumber-1,this._codeEditor.getModel().getLineMaxColumn(te.endLineNumber-1))),te.isEmpty()?null:te)).filter(te=>!!te),j.length&&this._state.change({searchScope:j},!0)}}else this._state.change({searchScope:null},!0)})),ie.appendChild(this._toggleSelectionFind.domNode),this._closeBtn=this._register(new P({label:I+this._keybindingLabelFor(a.FIND_IDS.CloseFindWidgetCommand),icon:t.widgetClose,onTrigger:()=>{this._state.change({isRevealed:!1,searchScope:null},!1)},onKeyDown:j=>{j.equals(2)&&this._isReplaceVisible&&(this._replaceBtn.isEnabled()?this._replaceBtn.focus():this._codeEditor.focus(),j.preventDefault())}})),ie.appendChild(this._closeBtn.domNode),this._replaceInput=this._register(new i.ContextScopedReplaceInput(null,void 0,{label:k,placeholder:E,appendPreserveCaseLabel:this._keybindingLabelFor(a.FIND_IDS.TogglePreserveCaseCommand),history:[],flexibleHeight:U,flexibleWidth:H,flexibleMaxHeight:118},this._contextKeyService,!0)),this._replaceInput.setPreserveCase(!!this._state.preserveCase),this._register(this._replaceInput.onKeyDown(j=>this._onReplaceInputKeyDown(j))),this._register(this._replaceInput.inputBox.onDidChange(()=>{this._state.change({replaceString:this._replaceInput.inputBox.value},!1)})),this._register(this._replaceInput.inputBox.onDidHeightChange(j=>{this._isReplaceVisible&&this._tryUpdateHeight()&&this._showViewZone()})),this._register(this._replaceInput.onDidOptionChange(()=>{this._state.change({preserveCase:this._replaceInput.getPreserveCase()},!0)})),this._register(this._replaceInput.onPreserveCaseKeyDown(j=>{j.equals(2)&&(this._prevBtn.isEnabled()?this._prevBtn.focus():this._nextBtn.isEnabled()?this._nextBtn.focus():this._toggleSelectionFind.enabled?this._toggleSelectionFind.focus():this._closeBtn.isEnabled()&&this._closeBtn.focus(),j.preventDefault())})),this._replaceBtn=this._register(new P({label:T+this._keybindingLabelFor(a.FIND_IDS.ReplaceOneAction),icon:e.findReplaceIcon,onTrigger:()=>{this._controller.replace()},onKeyDown:j=>{j.equals(1024|2)&&(this._closeBtn.focus(),j.preventDefault())}})),this._replaceAllBtn=this._register(new P({label:O+this._keybindingLabelFor(a.FIND_IDS.ReplaceAllAction),icon:e.findReplaceAllIcon,onTrigger:()=>{this._controller.replaceAll()}}));let oe=document.createElement("div");oe.className="replace-part",oe.appendChild(this._replaceInput.domNode);const ae=document.createElement("div");ae.className="replace-actions",oe.appendChild(ae),ae.appendChild(this._replaceBtn.domNode),ae.appendChild(this._replaceAllBtn.domNode),this._toggleReplaceBtn=this._register(new P({label:A,className:"codicon toggle left",onTrigger:()=>{this._state.change({isReplaceRevealed:!this._isReplaceVisible},!1),this._isReplaceVisible&&(this._replaceInput.width=N.getTotalWidth(this._findInput.domNode),this._replaceInput.inputBox.layout()),this._showViewZone()}})),this._toggleReplaceBtn.setExpanded(this._isReplaceVisible),this._domNode=document.createElement("div"),this._domNode.className="editor-widget find-widget",this._domNode.setAttribute("aria-hidden","true"),this._domNode.style.width=`${R}px`,this._domNode.appendChild(this._toggleReplaceBtn.domNode),this._domNode.appendChild($),this._domNode.appendChild(oe),this._resizeSash=new S.Sash(this._domNode,this,{orientation:0,size:2}),this._resized=!1;let G=R;this._register(this._resizeSash.onDidStart(()=>{G=N.getTotalWidth(this._domNode)})),this._register(this._resizeSash.onDidChange(j=>{this._resized=!0;let te=G+j.startX-j.currentX;if(!(teZ||(this._domNode.style.width=`${te}px`,this._isReplaceVisible&&(this._replaceInput.width=N.getTotalWidth(this._findInput.domNode)),this._findInput.inputBox.layout(),this._tryUpdateHeight())}})),this._register(this._resizeSash.onDidReset(()=>{const j=N.getTotalWidth(this._domNode);if(!(j{this._opts.onTrigger(),$.preventDefault()}),this.onkeydown(this._domNode,$=>{if($.equals(10)||$.equals(3)){this._opts.onTrigger(),$.preventDefault();return}this._opts.onKeyDown&&this._opts.onKeyDown($)})}get domNode(){return this._domNode}isEnabled(){return this._domNode.tabIndex>=0}focus(){this._domNode.focus()}setEnabled(U){this._domNode.classList.toggle("disabled",!U),this._domNode.setAttribute("aria-disabled",String(!U)),this._domNode.tabIndex=U?0:-1}setExpanded(U){this._domNode.setAttribute("aria-expanded",String(!!U)),U?(this._domNode.classList.remove(...r.ThemeIcon.asClassNameArray(h)),this._domNode.classList.add(...r.ThemeIcon.asClassNameArray(m))):(this._domNode.classList.remove(...r.ThemeIcon.asClassNameArray(m)),this._domNode.classList.add(...r.ThemeIcon.asClassNameArray(h)))}}e.SimpleButton=P,r.registerThemingParticipant((V,U)=>{const H=(re,ce)=>{ce&&U.addRule(`.monaco-editor ${re} { background-color: ${ce}; }`)};H(".findMatch",V.getColor(u.editorFindMatchHighlight)),H(".currentFindMatch",V.getColor(u.editorFindMatch)),H(".findScope",V.getColor(u.editorFindRangeHighlight));const $=V.getColor(u.editorWidgetBackground);H(".find-widget",$);const ie=V.getColor(u.widgetShadow);ie&&U.addRule(`.monaco-editor .find-widget { box-shadow: 0 0 8px 2px ${ie}; }`);const oe=V.getColor(u.editorFindMatchHighlightBorder);oe&&U.addRule(`.monaco-editor .findMatch { border: 1px ${V.type==="hc"?"dotted":"solid"} ${oe}; box-sizing: border-box; }`);const ae=V.getColor(u.editorFindMatchBorder);ae&&U.addRule(`.monaco-editor .currentFindMatch { border: 2px solid ${ae}; padding: 1px; box-sizing: border-box; }`);const G=V.getColor(u.editorFindRangeHighlightBorder);G&&U.addRule(`.monaco-editor .findScope { border: 1px ${V.type==="hc"?"dashed":"solid"} ${G}; }`);const j=V.getColor(u.contrastBorder);j&&U.addRule(`.monaco-editor .find-widget { border: 1px solid ${j}; }`);const te=V.getColor(u.editorWidgetForeground);te&&U.addRule(`.monaco-editor .find-widget { color: ${te}; }`);const Z=V.getColor(u.errorForeground);Z&&U.addRule(`.monaco-editor .find-widget.no-results .matchesCount { color: ${Z}; }`);const ue=V.getColor(u.editorWidgetResizeBorder);if(ue)U.addRule(`.monaco-editor .find-widget .monaco-sash { background-color: ${ue}; }`);else{const re=V.getColor(u.editorWidgetBorder);re&&U.addRule(`.monaco-editor .find-widget .monaco-sash { background-color: ${re}; }`)}const he=V.getColor(u.focusBorder);he&&U.addRule(`.monaco-editor .find-widget .monaco-inputbox.synthetic-focus { outline-color: ${he}; }`)})}),define(Q[267],J([0,1,472,15,2,8,13,25,142,599,600,657,34,84,16,68,37,79,11,32,28]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StartFindReplaceAction=e.PreviousSelectionMatchFindAction=e.NextSelectionMatchFindAction=e.SelectionMatchFindAction=e.PreviousMatchFindAction2=e.PreviousMatchFindAction=e.NextMatchFindAction2=e.NextMatchFindAction=e.MatchFindAction=e.StartFindWithSelectionAction=e.StartFindAction=e.FindController=e.CommonFindController=e.getSelectionSearchString=void 0;const h=524288;function m(F,D="single"){if(!F.hasModel())return null;const R=F.getSelection();if(D==="single"&&R.startLineNumber===R.endLineNumber||D==="multiple"){if(R.isEmpty()){const W=F.getConfiguredWordAtPosition(R.getStartPosition());if(W)return W.word}else if(F.getModel().getValueLengthInRange(R)this._onStateChanged(K))),this._model=null,this._register(this._editor.onDidChangeModel(()=>{let K=this._editor.getModel()&&this._state.isRevealed;this.disposeModel(),this._state.change({searchScope:null,matchCase:this._storageService.getBoolean("editor.matchCase",1,!1),wholeWord:this._storageService.getBoolean("editor.wholeWord",1,!1),isRegex:this._storageService.getBoolean("editor.isRegex",1,!1),preserveCase:this._storageService.getBoolean("editor.preserveCase",1,!1)},!1),K&&this._start({forceRevealReplace:!1,seedSearchStringFromSelection:"none",seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!1,updateSearchScope:!1,loop:this._editor.getOption(31).loop})}))}get editor(){return this._editor}static get(D){return D.getContribution(qt.ID)}dispose(){this.disposeModel(),super.dispose()}disposeModel(){this._model&&(this._model.dispose(),this._model=null)}_onStateChanged(D){this.saveQueryState(D),D.isRevealed&&(this._state.isRevealed?this._findWidgetVisible.set(!0):(this._findWidgetVisible.reset(),this.disposeModel())),D.searchString&&this.setGlobalBufferTerm(this._state.searchString)}saveQueryState(D){D.isRegex&&this._storageService.store("editor.isRegex",this._state.actualIsRegex,1,0),D.wholeWord&&this._storageService.store("editor.wholeWord",this._state.actualWholeWord,1,0),D.matchCase&&this._storageService.store("editor.matchCase",this._state.actualMatchCase,1,0),D.preserveCase&&this._storageService.store("editor.preserveCase",this._state.actualPreserveCase,1,0)}loadQueryState(){this._state.change({matchCase:this._storageService.getBoolean("editor.matchCase",1,this._state.matchCase),wholeWord:this._storageService.getBoolean("editor.wholeWord",1,this._state.wholeWord),isRegex:this._storageService.getBoolean("editor.isRegex",1,this._state.isRegex),preserveCase:this._storageService.getBoolean("editor.preserveCase",1,this._state.preserveCase)},!1)}isFindInputFocused(){return!!d.CONTEXT_FIND_INPUT_FOCUSED.getValue(this._contextKeyService)}getState(){return this._state}closeFindWidget(){this._state.change({isRevealed:!1,searchScope:null},!1),this._editor.focus()}toggleCaseSensitive(){this._state.change({matchCase:!this._state.matchCase},!1),this._state.isRevealed||this.highlightFindOptions()}toggleWholeWords(){this._state.change({wholeWord:!this._state.wholeWord},!1),this._state.isRevealed||this.highlightFindOptions()}toggleRegex(){this._state.change({isRegex:!this._state.isRegex},!1),this._state.isRevealed||this.highlightFindOptions()}togglePreserveCase(){this._state.change({preserveCase:!this._state.preserveCase},!1),this._state.isRevealed||this.highlightFindOptions()}toggleSearchScope(){if(this._state.searchScope)this._state.change({searchScope:null},!0);else if(this._editor.hasModel()){let D=this._editor.getSelections();D.map(R=>(R.endColumn===1&&R.endLineNumber>R.startLineNumber&&(R=R.setEndPosition(R.endLineNumber-1,this._editor.getModel().getLineMaxColumn(R.endLineNumber-1))),R.isEmpty()?null:R)).filter(R=>!!R),D.length&&this._state.change({searchScope:D},!0)}}setSearchString(D){this._state.isRegex&&(D=w.escapeRegExpCharacters(D)),this._state.change({searchString:D},!1)}highlightFindOptions(D=!1){}_start(D){return Ie(this,void 0,void 0,function*(){if(this.disposeModel(),!!this._editor.hasModel()){let R={isRevealed:!0};if(D.seedSearchStringFromSelection==="single"){let W=m(this._editor,D.seedSearchStringFromSelection);W&&(this._state.isRegex?R.searchString=w.escapeRegExpCharacters(W):R.searchString=W)}else if(D.seedSearchStringFromSelection==="multiple"&&!D.updateSearchScope){let W=m(this._editor,D.seedSearchStringFromSelection);W&&(R.searchString=W)}if(!R.searchString&&D.seedSearchStringFromGlobalClipboard){let W=yield this.getGlobalBufferTerm();if(!this._editor.hasModel())return;W&&(R.searchString=W)}if(D.forceRevealReplace?R.isReplaceRevealed=!0:this._findWidgetVisible.get()||(R.isReplaceRevealed=!1),D.updateSearchScope){let W=this._editor.getSelections();W.some(x=>!x.isEmpty())&&(R.searchScope=W)}R.loop=D.loop,this._state.change(R,!1),this._model||(this._model=new d.FindModelBoundToEditorModel(this._editor,this._state))}})}start(D){return this._start(D)}moveToNextMatch(){return this._model?(this._model.moveToNextMatch(),!0):!1}moveToPrevMatch(){return this._model?(this._model.moveToPrevMatch(),!0):!1}replace(){return this._model?(this._model.replace(),!0):!1}replaceAll(){return this._model?(this._model.replaceAll(),!0):!1}selectAllMatches(){return this._model?(this._model.selectAllMatches(),this._editor.focus(),!0):!1}getGlobalBufferTerm(){return Ie(this,void 0,void 0,function*(){return this._editor.getOption(31).globalFindClipboard&&this._editor.hasModel()&&!this._editor.getModel().isTooLargeForSyncing()?this._clipboardService.readFindText():""})}setGlobalBufferTerm(D){this._editor.getOption(31).globalFindClipboard&&this._editor.hasModel()&&!this._editor.getModel().isTooLargeForSyncing()&&this._clipboardService.writeFindText(D)}};_.ID="editor.contrib.findController",_=Me([_e(1,a.IContextKeyService),_e(2,i.IStorageService),_e(3,s.IClipboardService)],_),e.CommonFindController=_;let f=class extends _{constructor(D,R,W,x,K,Y,ee,se){super(D,W,ee,se);this._contextViewService=R,this._keybindingService=x,this._themeService=K,this._notificationService=Y,this._widget=null,this._findOptionsWidget=null}_start(D){const R=Object.create(null,{_start:{get:()=>super._start}});return Ie(this,void 0,void 0,function*(){this._widget||this._createFindWidget();const W=this._editor.getSelection();let x=!1;switch(this._editor.getOption(31).autoFindInSelection){case"always":x=!0;break;case"never":x=!1;break;case"multiline":x=!!W&&W.startLineNumber!==W.endLineNumber;break;default:break}D.updateSearchScope=x,yield R._start.call(this,D),this._widget&&(D.shouldFocus===2?this._widget.focusReplaceInput():D.shouldFocus===1&&this._widget.focusFindInput())})}highlightFindOptions(D=!1){this._widget||this._createFindWidget(),this._state.isRevealed&&!D?this._widget.highlightFindOptions():this._findOptionsWidget.highlightFindOptions()}_createFindWidget(){this._widget=this._register(new c.FindWidget(this._editor,this,this._state,this._contextViewService,this._keybindingService,this._contextKeyService,this._themeService,this._storageService,this._notificationService)),this._findOptionsWidget=this._register(new g.FindOptionsWidget(this._editor,this._state,this._keybindingService,this._themeService))}};f=Me([_e(1,u.IContextViewService),_e(2,a.IContextKeyService),_e(3,r.IKeybindingService),_e(4,n.IThemeService),_e(5,t.INotificationService),_e(6,i.IStorageService),_e(7,s.IClipboardService)],f),e.FindController=f,e.StartFindAction=S.registerMultiEditorAction(new S.MultiEditorAction({id:d.FIND_IDS.StartFindAction,label:b.localize(0,null),alias:"Find",precondition:a.ContextKeyExpr.or(C.EditorContextKeys.focus,a.ContextKeyExpr.has("editorIsOpen")),kbOpts:{kbExpr:null,primary:2048|36,weight:100},menuOpts:{menuId:o.MenuId.MenubarEditMenu,group:"3_find",title:b.localize(1,null),order:1}})),e.StartFindAction.addImplementation(0,(F,D)=>{const R=F.get(l.ICodeEditorService),W=R.getFocusedCodeEditor()||R.getActiveCodeEditor();if(!W)return!1;const x=_.get(W);return x?x.start({forceRevealReplace:!1,seedSearchStringFromSelection:W.getOption(31).seedSearchStringFromSelection?"single":"none",seedSearchStringFromGlobalClipboard:W.getOption(31).globalFindClipboard,shouldFocus:1,shouldAnimate:!0,updateSearchScope:!1,loop:W.getOption(31).loop}):!1});class v extends S.EditorAction{constructor(){super({id:d.FIND_IDS.StartFindWithSelection,label:b.localize(2,null),alias:"Find With Selection",precondition:void 0,kbOpts:{kbExpr:null,primary:0,mac:{primary:2048|35},weight:100}})}run(D,R){return Ie(this,void 0,void 0,function*(){let W=_.get(R);W&&(yield W.start({forceRevealReplace:!1,seedSearchStringFromSelection:"multiple",seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:R.getOption(31).loop}),W.setGlobalBufferTerm(W.getState().searchString))})}}e.StartFindWithSelectionAction=v;class y extends S.EditorAction{run(D,R){return Ie(this,void 0,void 0,function*(){let W=_.get(R);W&&!this._run(W)&&(yield W.start({forceRevealReplace:!1,seedSearchStringFromSelection:W.getState().searchString.length===0&&R.getOption(31).seedSearchStringFromSelection?"single":"none",seedSearchStringFromGlobalClipboard:!0,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:R.getOption(31).loop}),this._run(W))})}}e.MatchFindAction=y;class L extends y{constructor(){super({id:d.FIND_IDS.NextMatchFindAction,label:b.localize(3,null),alias:"Find Next",precondition:void 0,kbOpts:{kbExpr:C.EditorContextKeys.focus,primary:61,mac:{primary:2048|37,secondary:[61]},weight:100}})}_run(D){return D.moveToNextMatch()?(D.editor.pushUndoStop(),!0):!1}}e.NextMatchFindAction=L;class I extends y{constructor(){super({id:d.FIND_IDS.NextMatchFindAction,label:b.localize(4,null),alias:"Find Next",precondition:void 0,kbOpts:{kbExpr:a.ContextKeyExpr.and(C.EditorContextKeys.focus,d.CONTEXT_FIND_INPUT_FOCUSED),primary:3,weight:100}})}_run(D){return D.moveToNextMatch()?(D.editor.pushUndoStop(),!0):!1}}e.NextMatchFindAction2=I;class k extends y{constructor(){super({id:d.FIND_IDS.PreviousMatchFindAction,label:b.localize(5,null),alias:"Find Previous",precondition:void 0,kbOpts:{kbExpr:C.EditorContextKeys.focus,primary:1024|61,mac:{primary:2048|1024|37,secondary:[1024|61]},weight:100}})}_run(D){return D.moveToPrevMatch()}}e.PreviousMatchFindAction=k;class E extends y{constructor(){super({id:d.FIND_IDS.PreviousMatchFindAction,label:b.localize(6,null),alias:"Find Previous",precondition:void 0,kbOpts:{kbExpr:a.ContextKeyExpr.and(C.EditorContextKeys.focus,d.CONTEXT_FIND_INPUT_FOCUSED),primary:1024|3,weight:100}})}_run(D){return D.moveToPrevMatch()}}e.PreviousMatchFindAction2=E;class T extends S.EditorAction{run(D,R){return Ie(this,void 0,void 0,function*(){let W=_.get(R);if(!!W){let x=m(R);x&&W.setSearchString(x),this._run(W)||(yield W.start({forceRevealReplace:!1,seedSearchStringFromSelection:R.getOption(31).seedSearchStringFromSelection?"single":"none",seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:R.getOption(31).loop}),this._run(W))}})}}e.SelectionMatchFindAction=T;class O extends T{constructor(){super({id:d.FIND_IDS.NextSelectionMatchFindAction,label:b.localize(7,null),alias:"Find Next Selection",precondition:void 0,kbOpts:{kbExpr:C.EditorContextKeys.focus,primary:2048|61,weight:100}})}_run(D){return D.moveToNextMatch()}}e.NextSelectionMatchFindAction=O;class A extends T{constructor(){super({id:d.FIND_IDS.PreviousSelectionMatchFindAction,label:b.localize(8,null),alias:"Find Previous Selection",precondition:void 0,kbOpts:{kbExpr:C.EditorContextKeys.focus,primary:2048|1024|61,weight:100}})}_run(D){return D.moveToPrevMatch()}}e.PreviousSelectionMatchFindAction=A,e.StartFindReplaceAction=S.registerMultiEditorAction(new S.MultiEditorAction({id:d.FIND_IDS.StartFindReplaceAction,label:b.localize(9,null),alias:"Replace",precondition:a.ContextKeyExpr.or(C.EditorContextKeys.focus,a.ContextKeyExpr.has("editorIsOpen")),kbOpts:{kbExpr:null,primary:2048|38,mac:{primary:2048|512|36},weight:100},menuOpts:{menuId:o.MenuId.MenubarEditMenu,group:"3_find",title:b.localize(10,null),order:2}})),e.StartFindReplaceAction.addImplementation(0,(F,D)=>{const R=F.get(l.ICodeEditorService),W=R.getFocusedCodeEditor()||R.getActiveCodeEditor();if(!W||!W.hasModel()||W.getOption(75))return!1;const x=_.get(W);if(!x)return!1;const K=W.getSelection(),Y=x.isFindInputFocused(),ee=!K.isEmpty()&&K.startLineNumber===K.endLineNumber&&W.getOption(31).seedSearchStringFromSelection&&!Y,se=Y||ee?2:1;return x.start({forceRevealReplace:!0,seedSearchStringFromSelection:ee?"single":"none",seedSearchStringFromGlobalClipboard:W.getOption(31).seedSearchStringFromSelection,shouldFocus:se,shouldAnimate:!0,updateSearchScope:!1,loop:W.getOption(31).loop})}),S.registerEditorContribution(_.ID,f),S.registerEditorAction(v),S.registerEditorAction(L),S.registerEditorAction(I),S.registerEditorAction(k),S.registerEditorAction(E),S.registerEditorAction(O),S.registerEditorAction(A);const B=S.EditorCommand.bindToContribution(_.get);S.registerEditorCommand(new B({id:d.FIND_IDS.CloseFindWidgetCommand,precondition:d.CONTEXT_FIND_WIDGET_VISIBLE,handler:F=>F.closeFindWidget(),kbOpts:{weight:100+5,kbExpr:a.ContextKeyExpr.and(C.EditorContextKeys.focus,a.ContextKeyExpr.not("isComposing")),primary:9,secondary:[1024|9]}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ToggleCaseSensitiveCommand,precondition:void 0,handler:F=>F.toggleCaseSensitive(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:d.ToggleCaseSensitiveKeybinding.primary,mac:d.ToggleCaseSensitiveKeybinding.mac,win:d.ToggleCaseSensitiveKeybinding.win,linux:d.ToggleCaseSensitiveKeybinding.linux}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ToggleWholeWordCommand,precondition:void 0,handler:F=>F.toggleWholeWords(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:d.ToggleWholeWordKeybinding.primary,mac:d.ToggleWholeWordKeybinding.mac,win:d.ToggleWholeWordKeybinding.win,linux:d.ToggleWholeWordKeybinding.linux}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ToggleRegexCommand,precondition:void 0,handler:F=>F.toggleRegex(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:d.ToggleRegexKeybinding.primary,mac:d.ToggleRegexKeybinding.mac,win:d.ToggleRegexKeybinding.win,linux:d.ToggleRegexKeybinding.linux}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ToggleSearchScopeCommand,precondition:void 0,handler:F=>F.toggleSearchScope(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:d.ToggleSearchScopeKeybinding.primary,mac:d.ToggleSearchScopeKeybinding.mac,win:d.ToggleSearchScopeKeybinding.win,linux:d.ToggleSearchScopeKeybinding.linux}})),S.registerEditorCommand(new B({id:d.FIND_IDS.TogglePreserveCaseCommand,precondition:void 0,handler:F=>F.togglePreserveCase(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:d.TogglePreserveCaseKeybinding.primary,mac:d.TogglePreserveCaseKeybinding.mac,win:d.TogglePreserveCaseKeybinding.win,linux:d.TogglePreserveCaseKeybinding.linux}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ReplaceOneAction,precondition:d.CONTEXT_FIND_WIDGET_VISIBLE,handler:F=>F.replace(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:2048|1024|22}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ReplaceOneAction,precondition:d.CONTEXT_FIND_WIDGET_VISIBLE,handler:F=>F.replace(),kbOpts:{weight:100+5,kbExpr:a.ContextKeyExpr.and(C.EditorContextKeys.focus,d.CONTEXT_REPLACE_INPUT_FOCUSED),primary:3}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ReplaceAllAction,precondition:d.CONTEXT_FIND_WIDGET_VISIBLE,handler:F=>F.replaceAll(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:2048|512|3}})),S.registerEditorCommand(new B({id:d.FIND_IDS.ReplaceAllAction,precondition:d.CONTEXT_FIND_WIDGET_VISIBLE,handler:F=>F.replaceAll(),kbOpts:{weight:100+5,kbExpr:a.ContextKeyExpr.and(C.EditorContextKeys.focus,d.CONTEXT_REPLACE_INPUT_FOCUSED),primary:void 0,mac:{primary:2048|3}}})),S.registerEditorCommand(new B({id:d.FIND_IDS.SelectAllMatchesAction,precondition:d.CONTEXT_FIND_WIDGET_VISIBLE,handler:F=>F.selectAllMatches(),kbOpts:{weight:100+5,kbExpr:C.EditorContextKeys.focus,primary:512|3}}))}),define(Q[658],J([0,1,31,27,475,80,11]),function(q,e,b,N,M,w,S){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.FoldingDecorationProvider=e.foldingCollapsedIcon=e.foldingExpandedIcon=void 0,e.foldingExpandedIcon=w.registerIcon("folding-expanded",N.Codicon.chevronDown,M.localize(0,null)),e.foldingCollapsedIcon=w.registerIcon("folding-collapsed",N.Codicon.chevronRight,M.localize(1,null));class C{constructor(g){this.editor=g,this.autoHideFoldingControls=!0,this.showFoldingHighlights=!0}getDecorationOption(g,p){return p?C.HIDDEN_RANGE_DECORATION:g?this.showFoldingHighlights?C.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION:C.COLLAPSED_VISUAL_DECORATION:this.autoHideFoldingControls?C.EXPANDED_AUTO_HIDE_VISUAL_DECORATION:C.EXPANDED_VISUAL_DECORATION}deltaDecorations(g,p){return this.editor.deltaDecorations(g,p)}changeDecorations(g){return this.editor.changeDecorations(g)}}e.FoldingDecorationProvider=C,C.COLLAPSED_VISUAL_DECORATION=b.ModelDecorationOptions.register({stickiness:1,afterContentClassName:"inline-folded",isWholeLine:!0,firstLineDecorationClassName:S.ThemeIcon.asClassName(e.foldingCollapsedIcon)}),C.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION=b.ModelDecorationOptions.register({stickiness:1,afterContentClassName:"inline-folded",className:"folded-background",isWholeLine:!0,firstLineDecorationClassName:S.ThemeIcon.asClassName(e.foldingCollapsedIcon)}),C.EXPANDED_AUTO_HIDE_VISUAL_DECORATION=b.ModelDecorationOptions.register({stickiness:1,isWholeLine:!0,firstLineDecorationClassName:S.ThemeIcon.asClassName(e.foldingExpandedIcon)}),C.EXPANDED_VISUAL_DECORATION=b.ModelDecorationOptions.register({stickiness:1,isWholeLine:!0,firstLineDecorationClassName:"alwaysShowFoldIcons "+S.ThemeIcon.asClassName(e.foldingExpandedIcon)}),C.HIDDEN_RANGE_DECORATION=b.ModelDecorationOptions.register({stickiness:1})}),define(Q[659],J([0,1,474,20,8,15,39,2,13,405,658,25,406,41,541,18,225,407,12,16,11,22,342]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.editorFoldForeground=e.foldBackgroundBackground=e.FoldingController=void 0;const m=new t.RawContextKey("foldingEnabled",!1);let _=class $t extends C.Disposable{constructor(W,x){super();this.contextKeyService=x,this.localToDispose=this._register(new C.DisposableStore),this.editor=W;const K=this.editor.getOptions();this._isEnabled=K.get(33),this._useFoldingProviders=K.get(34)!=="indentation",this._unfoldOnClickAfterEndOfLine=K.get(36),this._restoringViewState=!1,this.foldingModel=null,this.hiddenRangeModel=null,this.rangeProvider=null,this.foldingRegionPromise=null,this.foldingStateMemento=null,this.foldingModelPromise=null,this.updateScheduler=null,this.cursorChangedScheduler=null,this.mouseDownInfo=null,this.foldingDecorationProvider=new p.FoldingDecorationProvider(W),this.foldingDecorationProvider.autoHideFoldingControls=K.get(94)==="mouseover",this.foldingDecorationProvider.showFoldingHighlights=K.get(35),this.foldingEnabled=m.bindTo(this.contextKeyService),this.foldingEnabled.set(this._isEnabled),this._register(this.editor.onDidChangeModel(()=>this.onModelChanged())),this._register(this.editor.onDidChangeConfiguration(Y=>{if(Y.hasChanged(33)&&(this._isEnabled=this.editor.getOptions().get(33),this.foldingEnabled.set(this._isEnabled),this.onModelChanged()),Y.hasChanged(94)||Y.hasChanged(35)){const ee=this.editor.getOptions();this.foldingDecorationProvider.autoHideFoldingControls=ee.get(94)==="mouseover",this.foldingDecorationProvider.showFoldingHighlights=ee.get(35),this.onModelContentChanged()}Y.hasChanged(34)&&(this._useFoldingProviders=this.editor.getOptions().get(34)!=="indentation",this.onFoldingStrategyChanged()),Y.hasChanged(36)&&(this._unfoldOnClickAfterEndOfLine=this.editor.getOptions().get(36))})),this.onModelChanged()}static get(W){return W.getContribution($t.ID)}saveViewState(){let W=this.editor.getModel();if(!W||!this._isEnabled||W.isTooLargeForTokenization())return{};if(this.foldingModel){let x=this.foldingModel.isInitialized?this.foldingModel.getMemento():this.hiddenRangeModel.getMemento(),K=this.rangeProvider?this.rangeProvider.id:void 0;return{collapsedRegions:x,lineCount:W.getLineCount(),provider:K}}}restoreViewState(W){let x=this.editor.getModel();if(!(!x||!this._isEnabled||x.isTooLargeForTokenization()||!this.hiddenRangeModel)&&!(!W||!W.collapsedRegions||W.lineCount!==x.getLineCount())){(W.provider===r.ID_SYNTAX_PROVIDER||W.provider===i.ID_INIT_PROVIDER)&&(this.foldingStateMemento=W);const K=W.collapsedRegions;if(this.hiddenRangeModel.applyMemento(K)){const Y=this.getFoldingModel();Y&&Y.then(ee=>{if(ee){this._restoringViewState=!0;try{ee.applyMemento(K)}finally{this._restoringViewState=!1}}}).then(void 0,n.onUnexpectedError)}}}onModelChanged(){this.localToDispose.clear();let W=this.editor.getModel();!this._isEnabled||!W||W.isTooLargeForTokenization()||(this.foldingModel=new g.FoldingModel(W,this.foldingDecorationProvider),this.localToDispose.add(this.foldingModel),this.hiddenRangeModel=new o.HiddenRangeModel(this.foldingModel),this.localToDispose.add(this.hiddenRangeModel),this.localToDispose.add(this.hiddenRangeModel.onDidChange(x=>this.onHiddenRangesChanges(x))),this.updateScheduler=new w.Delayer(200),this.cursorChangedScheduler=new w.RunOnceScheduler(()=>this.revealCursor(),200),this.localToDispose.add(this.cursorChangedScheduler),this.localToDispose.add(u.FoldingRangeProviderRegistry.onDidChange(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelLanguageConfiguration(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelContent(()=>this.onModelContentChanged())),this.localToDispose.add(this.editor.onDidChangeCursorPosition(()=>this.onCursorPositionChanged())),this.localToDispose.add(this.editor.onMouseDown(x=>this.onEditorMouseDown(x))),this.localToDispose.add(this.editor.onMouseUp(x=>this.onEditorMouseUp(x))),this.localToDispose.add({dispose:()=>{this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),this.updateScheduler&&this.updateScheduler.cancel(),this.updateScheduler=null,this.foldingModel=null,this.foldingModelPromise=null,this.hiddenRangeModel=null,this.cursorChangedScheduler=null,this.foldingStateMemento=null,this.rangeProvider&&this.rangeProvider.dispose(),this.rangeProvider=null}}),this.onModelContentChanged())}onFoldingStrategyChanged(){this.rangeProvider&&this.rangeProvider.dispose(),this.rangeProvider=null,this.onModelContentChanged()}getRangeProvider(W){if(this.rangeProvider)return this.rangeProvider;if(this.rangeProvider=new a.IndentRangeProvider(W),this._useFoldingProviders&&this.foldingModel){let x=u.FoldingRangeProviderRegistry.ordered(this.foldingModel.textModel);if(x.length===0&&this.foldingStateMemento&&this.foldingStateMemento.collapsedRegions)return this.rangeProvider=new i.InitializingRangeProvider(W,this.foldingStateMemento.collapsedRegions,()=>{this.foldingStateMemento=null,this.onFoldingStrategyChanged()},3e4);x.length>0&&(this.rangeProvider=new r.SyntaxRangeProvider(W,x,()=>this.onModelContentChanged()))}return this.foldingStateMemento=null,this.rangeProvider}getFoldingModel(){return this.foldingModelPromise}onModelContentChanged(){this.updateScheduler&&(this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),this.foldingModelPromise=this.updateScheduler.trigger(()=>{const W=this.foldingModel;if(!W)return null;let x=this.foldingRegionPromise=w.createCancelablePromise(K=>this.getRangeProvider(W.textModel).compute(K));return x.then(K=>{if(K&&x===this.foldingRegionPromise){let Y=this.editor.getSelections(),ee=Y?Y.map(se=>se.startLineNumber):[];W.update(K,ee)}return W})}).then(void 0,W=>(n.onUnexpectedError(W),null)))}onHiddenRangesChanges(W){if(this.hiddenRangeModel&&W.length&&!this._restoringViewState){let x=this.editor.getSelections();x&&this.hiddenRangeModel.adjustSelections(x)&&this.editor.setSelections(x)}this.editor.setHiddenAreas(W)}onCursorPositionChanged(){this.hiddenRangeModel&&this.hiddenRangeModel.hasRanges()&&this.cursorChangedScheduler.schedule()}revealCursor(){const W=this.getFoldingModel();!W||W.then(x=>{if(x){let K=this.editor.getSelections();if(K&&K.length>0){let Y=[];for(let ee of K){let se=ee.selectionStartLineNumber;this.hiddenRangeModel&&this.hiddenRangeModel.isHidden(se)&&Y.push(...x.getAllRegionsAtLine(se,ne=>ne.isCollapsed&&se>ne.startLineNumber))}Y.length&&(x.toggleCollapseState(Y),this.reveal(K[0].getPosition()))}}}).then(void 0,n.onUnexpectedError)}onEditorMouseDown(W){if(this.mouseDownInfo=null,!(!this.hiddenRangeModel||!W.target||!W.target.range)&&!(!W.event.leftButton&&!W.event.middleButton)){const x=W.target.range;let K=!1;switch(W.target.type){case 4:const Y=W.target.detail,ee=W.target.element.offsetLeft;if(Y.offsetX-ee<5)return;K=!0;break;case 7:{if(this._unfoldOnClickAfterEndOfLine&&this.hiddenRangeModel.hasRanges()&&!W.target.detail.isAfterLines)break;return}case 6:{if(this.hiddenRangeModel.hasRanges()){let ne=this.editor.getModel();if(ne&&x.startColumn===ne.getLineMaxColumn(x.startLineNumber))break}return}default:return}this.mouseDownInfo={lineNumber:x.startLineNumber,iconClicked:K}}}onEditorMouseUp(W){const x=this.getFoldingModel();if(!(!x||!this.mouseDownInfo||!W.target)){let K=this.mouseDownInfo.lineNumber,Y=this.mouseDownInfo.iconClicked,ee=W.target.range;if(!(!ee||ee.startLineNumber!==K)){if(Y){if(W.target.type!==4)return}else{let se=this.editor.getModel();if(!se||ee.startColumn!==se.getLineMaxColumn(K))return}x.then(se=>{if(se){let ne=se.getRegionAtLine(K);if(ne&&ne.startLineNumber===K){let le=ne.isCollapsed;if(Y||le){let X=[],z=W.event.middleButton||W.event.shiftKey;if(z)for(const P of se.getRegionsInside(ne))P.isCollapsed===le&&X.push(P);(le||!z||X.length===0)&&X.push(ne),se.toggleCollapseState(X),this.reveal({lineNumber:K,column:1})}}}}).then(void 0,n.onUnexpectedError)}}}reveal(W){this.editor.revealPositionInCenterIfOutsideViewport(W,0)}};_.ID="editor.contrib.folding",_=Me([_e(1,t.IContextKeyService)],_),e.FoldingController=_;class f extends d.EditorAction{runEditorCommand(W,x,K){let Y=_.get(x);if(!!Y){let ee=Y.getFoldingModel();if(ee)return this.reportTelemetry(W,x),ee.then(se=>{if(se){this.invoke(Y,se,x,K);const ne=x.getSelection();ne&&Y.reveal(ne.getStartPosition())}})}}getSelectedLines(W){let x=W.getSelections();return x?x.map(K=>K.startLineNumber):[]}getLineNumbers(W,x){return W&&W.selectionLines?W.selectionLines.map(K=>K+1):this.getSelectedLines(x)}run(W,x){}}function v(R){if(!N.isUndefined(R)){if(!N.isObject(R))return!1;const W=R;if(!N.isUndefined(W.levels)&&!N.isNumber(W.levels)||!N.isUndefined(W.direction)&&!N.isString(W.direction)||!N.isUndefined(W.selectionLines)&&(!N.isArray(W.selectionLines)||!W.selectionLines.every(N.isNumber)))return!1}return!0}class y extends f{constructor(){super({id:"editor.unfold",label:b.localize(0,null),alias:"Unfold",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:2048|1024|89,mac:{primary:2048|512|89},weight:100},description:{description:"Unfold the content in the editor",args:[{name:"Unfold editor argument",description:`Property-value pairs that can be passed through this argument: + * 'levels': Number of levels to unfold. If not set, defaults to 1. + * 'direction': If 'up', unfold given number of levels up otherwise unfolds down. + * 'selectionLines': The start lines (0-based) of the editor selections to apply the unfold action to. If not set, the active selection(s) will be used. + `,constraint:v,schema:{type:"object",properties:{levels:{type:"number",default:1},direction:{type:"string",enum:["up","down"],default:"down"},selectionLines:{type:"array",items:{type:"number"}}}}}]}})}invoke(W,x,K,Y){let ee=Y&&Y.levels||1,se=this.getLineNumbers(Y,K);Y&&Y.direction==="up"?g.setCollapseStateLevelsUp(x,!1,ee,se):g.setCollapseStateLevelsDown(x,!1,ee,se)}}class L extends f{constructor(){super({id:"editor.unfoldRecursively",label:b.localize(1,null),alias:"Unfold Recursively",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|89),weight:100}})}invoke(W,x,K,Y){g.setCollapseStateLevelsDown(x,!1,Number.MAX_VALUE,this.getSelectedLines(K))}}class I extends f{constructor(){super({id:"editor.fold",label:b.localize(2,null),alias:"Fold",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:2048|1024|87,mac:{primary:2048|512|87},weight:100},description:{description:"Fold the content in the editor",args:[{name:"Fold editor argument",description:`Property-value pairs that can be passed through this argument: + * 'levels': Number of levels to fold. + * 'direction': If 'up', folds given number of levels up otherwise folds down. + * 'selectionLines': The start lines (0-based) of the editor selections to apply the fold action to. If not set, the active selection(s) will be used. + If no levels or direction is set, folds the region at the locations or if already collapsed, the first uncollapsed parent instead. + `,constraint:v,schema:{type:"object",properties:{levels:{type:"number"},direction:{type:"string",enum:["up","down"]},selectionLines:{type:"array",items:{type:"number"}}}}}]}})}invoke(W,x,K,Y){let ee=this.getLineNumbers(Y,K);const se=Y&&Y.levels,ne=Y&&Y.direction;typeof se!="number"&&typeof ne!="string"?g.setCollapseStateUp(x,!0,ee):ne==="up"?g.setCollapseStateLevelsUp(x,!0,se||1,ee):g.setCollapseStateLevelsDown(x,!0,se||1,ee)}}class k extends f{constructor(){super({id:"editor.toggleFold",label:b.localize(3,null),alias:"Toggle Fold",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|42),weight:100}})}invoke(W,x,K){let Y=this.getSelectedLines(K);g.toggleCollapseState(x,1,Y)}}class E extends f{constructor(){super({id:"editor.foldRecursively",label:b.localize(4,null),alias:"Fold Recursively",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|87),weight:100}})}invoke(W,x,K){let Y=this.getSelectedLines(K);g.setCollapseStateLevelsDown(x,!0,Number.MAX_VALUE,Y)}}class T extends f{constructor(){super({id:"editor.foldAllBlockComments",label:b.localize(5,null),alias:"Fold All Block Comments",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|85),weight:100}})}invoke(W,x,K){if(x.regions.hasTypes())g.setCollapseStateForType(x,u.FoldingRangeKind.Comment.value,!0);else{const Y=K.getModel();if(!Y)return;let ee=s.LanguageConfigurationRegistry.getComments(Y.getLanguageIdentifier().id);if(ee&&ee.blockCommentStartToken){let se=new RegExp("^\\s*"+M.escapeRegExpCharacters(ee.blockCommentStartToken));g.setCollapseStateForMatchingLines(x,se,!0)}}}}class O extends f{constructor(){super({id:"editor.foldAllMarkerRegions",label:b.localize(6,null),alias:"Fold All Regions",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|29),weight:100}})}invoke(W,x,K){if(x.regions.hasTypes())g.setCollapseStateForType(x,u.FoldingRangeKind.Region.value,!0);else{const Y=K.getModel();if(!Y)return;let ee=s.LanguageConfigurationRegistry.getFoldingRules(Y.getLanguageIdentifier().id);if(ee&&ee.markers&&ee.markers.start){let se=new RegExp(ee.markers.start);g.setCollapseStateForMatchingLines(x,se,!0)}}}}class A extends f{constructor(){super({id:"editor.unfoldAllMarkerRegions",label:b.localize(7,null),alias:"Unfold All Regions",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|30),weight:100}})}invoke(W,x,K){if(x.regions.hasTypes())g.setCollapseStateForType(x,u.FoldingRangeKind.Region.value,!1);else{const Y=K.getModel();if(!Y)return;let ee=s.LanguageConfigurationRegistry.getFoldingRules(Y.getLanguageIdentifier().id);if(ee&&ee.markers&&ee.markers.start){let se=new RegExp(ee.markers.start);g.setCollapseStateForMatchingLines(x,se,!1)}}}}class B extends f{constructor(){super({id:"editor.foldAll",label:b.localize(8,null),alias:"Fold All",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|21),weight:100}})}invoke(W,x,K){g.setCollapseStateLevelsDown(x,!0)}}class F extends f{constructor(){super({id:"editor.unfoldAll",label:b.localize(9,null),alias:"Unfold All",precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|40),weight:100}})}invoke(W,x,K){g.setCollapseStateLevelsDown(x,!1)}}class D extends f{getFoldingLevel(){return parseInt(this.id.substr(D.ID_PREFIX.length))}invoke(W,x,K){g.setCollapseStateAtLevel(x,this.getFoldingLevel(),!0,this.getSelectedLines(K))}}D.ID_PREFIX="editor.foldLevel",D.ID=R=>D.ID_PREFIX+R,d.registerEditorContribution(_.ID,_),d.registerEditorAction(y),d.registerEditorAction(L),d.registerEditorAction(I),d.registerEditorAction(E),d.registerEditorAction(B),d.registerEditorAction(F),d.registerEditorAction(T),d.registerEditorAction(O),d.registerEditorAction(A),d.registerEditorAction(k);for(let R=1;R<=7;R++)d.registerInstantiatedEditorAction(new D({id:D.ID(R),label:b.localize(10,null,R),alias:`Fold Level ${R}`,precondition:m,kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:S.KeyChord(2048|41,2048|21+R),weight:100}}));e.foldBackgroundBackground=h.registerColor("editor.foldBackground",{light:h.transparent(h.editorSelectionBackground,.3),dark:h.transparent(h.editorSelectionBackground,.3),hc:null},b.localize(11,null),!0),e.editorFoldForeground=h.registerColor("editorGutter.foldingControlForeground",{dark:h.iconForeground,light:h.iconForeground,hc:h.iconForeground},b.localize(12,null)),l.registerThemingParticipant((R,W)=>{const x=R.getColor(e.foldBackgroundBackground);x&&W.addRule(`.monaco-editor .folded-background { background-color: ${x}; }`);const K=R.getColor(e.editorFoldForeground);K&&W.addRule(` + .monaco-editor .cldr${l.ThemeIcon.asCSSSelector(p.foldingExpandedIcon)}, + .monaco-editor .cldr${l.ThemeIcon.asCSSSelector(p.foldingCollapsedIcon)} { + color: ${K} !important; + } + `)})}),define(Q[268],J([0,1,479,2,16,14,3,13,25,655,28,34,27,9,557,80]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.NextMarkerAction=e.MarkerController=void 0;let r=class gt{constructor(v,y,L,I,k){this._markerNavigationService=y,this._contextKeyService=L,this._editorService=I,this._instantiationService=k,this._sessionDispoables=new N.DisposableStore,this._editor=v,this._widgetVisible=m.bindTo(this._contextKeyService)}static get(v){return v.getContribution(gt.ID)}dispose(){this._cleanUp(),this._sessionDispoables.dispose()}_cleanUp(){this._widgetVisible.reset(),this._sessionDispoables.clear(),this._widget=void 0,this._model=void 0}_getOrCreateModel(v){if(this._model&&this._model.matches(v))return this._model;let y=!1;return this._model&&(y=!0,this._cleanUp()),this._model=this._markerNavigationService.getMarkerList(v),y&&this._model.move(!0,this._editor.getModel(),this._editor.getPosition()),this._widget=this._instantiationService.createInstance(g.MarkerNavigationWidget,this._editor),this._widget.onDidClose(()=>this.close(),this,this._sessionDispoables),this._widgetVisible.set(!0),this._sessionDispoables.add(this._model),this._sessionDispoables.add(this._widget),this._sessionDispoables.add(this._editor.onDidChangeCursorPosition(L=>{var I,k,E;(!((I=this._model)===null||I===void 0?void 0:I.selected)||!S.Range.containsPosition((k=this._model)===null||k===void 0?void 0:k.selected.marker,L.position))&&((E=this._model)===null||E===void 0||E.resetIndex())})),this._sessionDispoables.add(this._model.onDidChange(()=>{if(!(!this._widget||!this._widget.position||!this._model)){const L=this._model.find(this._editor.getModel().uri,this._widget.position);L?this._widget.updateMarker(L.marker):this._widget.showStale()}})),this._sessionDispoables.add(this._widget.onDidSelectRelatedInformation(L=>{this._editorService.openCodeEditor({resource:L.resource,options:{pinned:!0,revealIfOpened:!0,selection:S.Range.lift(L).collapseToStart()}},this._editor),this.close(!1)})),this._sessionDispoables.add(this._editor.onDidChangeModel(()=>this._cleanUp())),this._model}close(v=!0){this._cleanUp(),v&&this._editor.focus()}showAtMarker(v){if(this._editor.hasModel()){const y=this._getOrCreateModel(this._editor.getModel().uri);y.resetIndex(),y.move(!0,this._editor.getModel(),new w.Position(v.startLineNumber,v.startColumn)),y.selected&&this._widget.showAtMarker(y.selected.marker,y.selected.index,y.selected.total)}}nagivate(v,y){return Ie(this,void 0,void 0,function*(){if(this._editor.hasModel()){const L=this._getOrCreateModel(y?void 0:this._editor.getModel().uri);if(L.move(v,this._editor.getModel(),this._editor.getPosition()),!L.selected)return;if(L.selected.marker.resource.toString()!==this._editor.getModel().uri.toString()){this._cleanUp();const I=yield this._editorService.openCodeEditor({resource:L.selected.marker.resource,options:{pinned:!1,revealIfOpened:!0,selectionRevealType:2,selection:L.selected.marker}},this._editor);I&&(gt.get(I).close(),gt.get(I).nagivate(v,y))}else this._widget.showAtMarker(L.selected.marker,L.selected.index,L.selected.total)}})}};r.ID="editor.contrib.markerController",r=Me([_e(1,a.IMarkerNavigationService),_e(2,M.IContextKeyService),_e(3,p.ICodeEditorService),_e(4,s.IInstantiationService)],r),e.MarkerController=r;class i extends C.EditorAction{constructor(v,y,L){super(L);this._next=v,this._multiFile=y}run(v,y){return Ie(this,void 0,void 0,function*(){y.hasModel()&&r.get(y).nagivate(this._next,this._multiFile)})}}class n extends i{constructor(){super(!0,!1,{id:n.ID,label:n.LABEL,alias:"Go to Next Problem (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.focus,primary:512|66,weight:100},menuOpts:{menuId:g.MarkerNavigationWidget.TitleMenu,title:n.LABEL,icon:u.registerIcon("marker-navigation-next",o.Codicon.chevronDown,b.localize(1,null)),group:"navigation",order:1}})}}e.NextMarkerAction=n,n.ID="editor.action.marker.next",n.LABEL=b.localize(0,null);class t extends i{constructor(){super(!1,!1,{id:t.ID,label:t.LABEL,alias:"Go to Previous Problem (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.focus,primary:1024|512|66,weight:100},menuOpts:{menuId:g.MarkerNavigationWidget.TitleMenu,title:n.LABEL,icon:u.registerIcon("marker-navigation-previous",o.Codicon.chevronUp,b.localize(3,null)),group:"navigation",order:2}})}}t.ID="editor.action.marker.prev",t.LABEL=b.localize(2,null);class l extends i{constructor(){super(!0,!0,{id:"editor.action.marker.nextInFiles",label:b.localize(4,null),alias:"Go to Next Problem in Files (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.focus,primary:66,weight:100},menuOpts:{menuId:c.MenuId.MenubarGoMenu,title:b.localize(5,null),group:"6_problem_nav",order:1}})}}class h extends i{constructor(){super(!1,!0,{id:"editor.action.marker.prevInFiles",label:b.localize(6,null),alias:"Go to Previous Problem in Files (Error, Warning, Info)",precondition:void 0,kbOpts:{kbExpr:d.EditorContextKeys.focus,primary:1024|66,weight:100},menuOpts:{menuId:c.MenuId.MenubarGoMenu,title:b.localize(7,null),group:"6_problem_nav",order:2}})}}C.registerEditorContribution(r.ID,r),C.registerEditorAction(n),C.registerEditorAction(t),C.registerEditorAction(l),C.registerEditorAction(h);const m=new M.RawContextKey("markersNavigationVisible",!1),_=C.EditorCommand.bindToContribution(r.get);C.registerEditorCommand(new _({id:"closeMarkersNavigation",precondition:m,handler:f=>f.close(),kbOpts:{weight:100+50,kbExpr:d.EditorContextKeys.focus,primary:9,secondary:[1024|9]}}))}),define(Q[660],J([0,1,490,7,2,3,19,85,44,178,12,58,268,37,15,145,263,130,59,209]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.MarkerHoverParticipant=e.MarkerHover=void 0;const l=N.$;class h{constructor(v,y){this.range=v,this.marker=y}equals(v){return v instanceof h?C.IMarkerData.makeKey(this.marker)===C.IMarkerData.makeKey(v.marker):!1}}e.MarkerHover=h;const m={type:2,filter:{include:i.CodeActionKind.QuickFix}};let _=class{constructor(v,y,L,I,k){this._editor=v,this._hover=y,this._markerDecorationsService=L,this._keybindingService=I,this._openerService=k,this.recentMarkerCodeActionsInfo=void 0}computeSync(v,y){if(!this._editor.hasModel())return[];const L=this._editor.getModel(),I=v.startLineNumber,k=L.getLineMaxColumn(I),E=[];for(const T of y){const O=T.range.startLineNumber===I?T.range.startColumn:1,A=T.range.endLineNumber===I?T.range.endColumn:k,B=this._markerDecorationsService.getMarker(L.uri,T);if(!!B){const F=new w.Range(v.startLineNumber,O,v.startLineNumber,A);E.push(new h(F,B))}}return E}renderHoverParts(v,y){if(!v.length)return M.Disposable.None;const L=new M.DisposableStore;v.forEach(k=>y.appendChild(this.renderMarkerHover(k,L)));const I=v.length===1?v[0]:v.sort((k,E)=>C.MarkerSeverity.compare(k.marker.severity,E.marker.severity))[0];return y.appendChild(this.renderMarkerStatusbar(I,L)),L}renderMarkerHover(v,y){const L=l("div.hover-row"),I=N.append(L,l("div.marker.hover-contents")),{source:k,message:E,code:T,relatedInformation:O}=v.marker;this._editor.applyFontInfo(I);const A=N.append(I,l("span"));if(A.style.whiteSpace="pre-wrap",A.innerText=E,k||T)if(T&&typeof T!="string"){const B=l("span");if(k){const W=N.append(B,l("span"));W.innerText=k}const F=N.append(B,l("a.code-link"));F.setAttribute("href",T.target.toString()),y.add(N.addDisposableListener(F,"click",W=>{this._openerService.open(T.target),W.preventDefault(),W.stopPropagation()}));const D=N.append(F,l("span"));D.innerText=T.value;const R=N.append(I,B);R.style.opacity="0.6",R.style.paddingLeft="6px"}else{const B=N.append(I,l("span"));B.style.opacity="0.6",B.style.paddingLeft="6px",B.innerText=k&&T?`${k}(${T})`:k||`(${T})`}if(S.isNonEmptyArray(O))for(const{message:B,resource:F,startLineNumber:D,startColumn:R}of O){const W=N.append(I,l("div"));W.style.marginTop="8px";const x=N.append(W,l("a"));x.innerText=`${d.basename(F)}(${D}, ${R}): `,x.style.cursor="pointer",y.add(N.addDisposableListener(x,"click",Y=>{Y.stopPropagation(),Y.preventDefault(),this._openerService&&this._openerService.open(F,{fromUserGesture:!0,editorOptions:{selection:{startLineNumber:D,startColumn:R}}}).catch(p.onUnexpectedError)}));const K=N.append(W,l("span"));K.innerText=B,this._editor.applyFontInfo(K)}return L}renderMarkerStatusbar(v,y){const L=l("div.hover-row.status-bar"),I=N.append(L,l("div.actions"));if((v.marker.severity===C.MarkerSeverity.Error||v.marker.severity===C.MarkerSeverity.Warning||v.marker.severity===C.MarkerSeverity.Info)&&y.add(this.renderAction(I,{label:b.localize(0,null),commandId:o.NextMarkerAction.ID,run:()=>{this._hover.hide(),o.MarkerController.get(this._editor).showAtMarker(v.marker),this._editor.focus()}})),!this._editor.getOption(75)){const k=N.append(I,l("div"));this.recentMarkerCodeActionsInfo&&(C.IMarkerData.makeKey(this.recentMarkerCodeActionsInfo.marker)===C.IMarkerData.makeKey(v.marker)?this.recentMarkerCodeActionsInfo.hasCodeActions||(k.textContent=b.localize(1,null)):this.recentMarkerCodeActionsInfo=void 0);const E=this.recentMarkerCodeActionsInfo&&!this.recentMarkerCodeActionsInfo.hasCodeActions?M.Disposable.None:y.add(a.disposableTimeout(()=>k.textContent=b.localize(2,null),200));k.textContent||(k.textContent=String.fromCharCode(160));const T=this.getCodeActions(v.marker);y.add(M.toDisposable(()=>T.cancel())),T.then(O=>{if(E.dispose(),this.recentMarkerCodeActionsInfo={marker:v.marker,hasCodeActions:O.validActions.length>0},!this.recentMarkerCodeActionsInfo.hasCodeActions){O.dispose(),k.textContent=b.localize(3,null);return}k.style.display="none";let A=!1;y.add(M.toDisposable(()=>{A||O.dispose()})),y.add(this.renderAction(I,{label:b.localize(4,null),commandId:r.QuickFixAction.Id,run:B=>{A=!0;const F=r.QuickFixController.get(this._editor),D=N.getDomNodePagePosition(B);this._hover.hide(),F.showCodeActions(m,O,{x:D.left+6,y:D.top+D.height+6})}}))})}return L}renderAction(v,y){const L=this._keybindingService.lookupKeybinding(y.commandId),I=L?L.getLabel():null;return t.renderHoverAction(v,y,I)}getCodeActions(v){return a.createCancelablePromise(y=>u.getCodeActions(this._editor.getModel(),new w.Range(v.startLineNumber,v.startColumn,v.endLineNumber,v.endColumn),m,n.Progress.None,y))}};_=Me([_e(2,g.IMarkerDecorationsService),_e(3,s.IKeybindingService),_e(4,c.IOpenerService)],_),e.MarkerHoverParticipant=_}),define(Q[661],J([0,1,7,23,29,2,14,3,31,18,249,260,400,597,228,11,19,22,52,209,660,627]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ModesContentHoverWidget=void 0;class m{constructor(I,k,E){this.range=I,this.color=k,this.provider=E}equals(I){return!1}}class _{constructor(I,k){this.owner=I,this.data=k}}class f{constructor(I,k,E){this._markerHoverParticipant=k,this._markdownHoverParticipant=E,this._editor=I,this._result=[],this._range=null}setRange(I){this._range=I,this._result=[]}clearResult(){this._result=[]}computeAsync(I){return Ie(this,void 0,void 0,function*(){return!this._editor.hasModel()||!this._range?Promise.resolve([]):(yield this._markdownHoverParticipant.computeAsync(this._range,I)).map(E=>new _(this._markdownHoverParticipant,E))})}computeSync(){if(!this._editor.hasModel()||!this._range)return[];const I=this._editor.getModel(),k=this._range,E=k.startLineNumber;if(E>this._editor.getModel().getLineCount())return[];const T=I.getLineMaxColumn(E),O=this._editor.getLineDecorations(E).filter(R=>{if(R.options.isWholeLine)return!0;const W=R.range.startLineNumber===E?R.range.startColumn:1,x=R.range.endLineNumber===E?R.range.endColumn:T;return!(W>k.startColumn||k.endColumn>x)});let A=[];const B=c.ColorDetector.get(this._editor);for(const R of O){const W=B.getColorData(R.range.getStartPosition());if(W){const{color:x,range:K}=W.colorInfo;A.push(new _(null,new m(C.Range.lift(K),x,W.provider)));break}}const F=this._markdownHoverParticipant.computeSync(this._range,O);A=A.concat(F.map(R=>new _(this._markdownHoverParticipant,R)));const D=this._markerHoverParticipant.computeSync(this._range,O);return A=A.concat(D.map(R=>new _(this._markerHoverParticipant,R))),r.coalesce(A)}onResult(I,k){k?this._result=I.concat(this._result):this._result=this._result.concat(I)}getResult(){return this._result.slice(0)}getResultWithLoadingMessage(){if(this._range){const I=new _(this._markdownHoverParticipant,this._markdownHoverParticipant.createLoadingMessage(this._range));return this._result.slice(0).concat([I])}return this._result.slice(0)}}class v extends n.Widget{constructor(I,k,E,T){super();this._hoverVisibleKey=k,this._themeService=T,this.allowEditorOverflow=!0,this._markerHoverParticipant=E.createInstance(l.MarkerHoverParticipant,I,this),this._markdownHoverParticipant=E.createInstance(h.MarkdownHoverParticipant,I,this),this._hover=this._register(new t.HoverWidget),this._id=v.ID,this._editor=I,this._isVisible=!1,this._stoleFocus=!1,this._renderDisposable=null,this.onkeydown(this._hover.containerDomNode,O=>{O.equals(9)&&this.hide()}),this._register(this._editor.onDidChangeConfiguration(O=>{O.hasChanged(38)&&this._updateFont()})),this._editor.onDidLayoutChange(()=>this.layout()),this.layout(),this._editor.addContentWidget(this),this._showAtPosition=null,this._showAtRange=null,this._stoleFocus=!1,this._messages=[],this._lastRange=null,this._computer=new f(this._editor,this._markerHoverParticipant,this._markdownHoverParticipant),this._highlightDecorations=[],this._isChangingDecorations=!1,this._shouldFocus=!1,this._colorPicker=null,this._hoverOperation=new a.HoverOperation(this._computer,O=>this._withResult(O,!0),null,O=>this._withResult(O,!1),this._editor.getOption(48).delay),this._register(b.addStandardDisposableListener(this.getDomNode(),b.EventType.FOCUS,()=>{this._colorPicker&&this.getDomNode().classList.add("colorpicker-hover")})),this._register(b.addStandardDisposableListener(this.getDomNode(),b.EventType.BLUR,()=>{this.getDomNode().classList.remove("colorpicker-hover")})),this._register(I.onDidChangeConfiguration(()=>{this._hoverOperation.setHoverTime(this._editor.getOption(48).delay)})),this._register(g.TokenizationRegistry.onDidChange(()=>{this._isVisible&&this._lastRange&&this._messages.length>0&&(this._messages=this._messages.map(O=>{var A,B;if(O.data instanceof m&&!!((A=this._lastRange)===null||A===void 0?void 0:A.intersectRanges(O.data.range))&&((B=this._colorPicker)===null||B===void 0?void 0:B.model.color)){const F=this._colorPicker.model.color,D={red:F.rgba.r/255,green:F.rgba.g/255,blue:F.rgba.b/255,alpha:F.rgba.a};return new _(O.owner,new m(O.data.range,D,O.data.provider))}else return O}),this._hover.contentsDomNode.textContent="",this._renderMessages(this._lastRange,this._messages))}))}dispose(){this._hoverOperation.cancel(),this._editor.removeContentWidget(this),super.dispose()}getId(){return this._id}getDomNode(){return this._hover.containerDomNode}showAt(I,k,E){this._showAtPosition=I,this._showAtRange=k,this._hoverVisibleKey.set(!0),this._isVisible=!0,this._hover.containerDomNode.classList.toggle("hidden",!this._isVisible),this._editor.layoutContentWidget(this),this._editor.render(),this._stoleFocus=E,E&&this._hover.containerDomNode.focus()}getPosition(){return this._isVisible?{position:this._showAtPosition,range:this._showAtRange,preference:[1,2]}:null}_updateFont(){Array.prototype.slice.call(this._hover.contentsDomNode.getElementsByClassName("code")).forEach(k=>this._editor.applyFontInfo(k))}_updateContents(I){this._hover.contentsDomNode.textContent="",this._hover.contentsDomNode.appendChild(I),this._updateFont(),this._editor.layoutContentWidget(this),this._hover.onContentsChanged()}layout(){const I=Math.max(this._editor.getLayoutInfo().height/4,250),{fontSize:k,lineHeight:E}=this._editor.getOption(38);this._hover.contentsDomNode.style.fontSize=`${k}px`,this._hover.contentsDomNode.style.lineHeight=`${E}px`,this._hover.contentsDomNode.style.maxHeight=`${I}px`,this._hover.contentsDomNode.style.maxWidth=`${Math.max(this._editor.getLayoutInfo().width*.66,500)}px`}onModelDecorationsChanged(){this._isChangingDecorations||this._isVisible&&(this._hoverOperation.cancel(),this._computer.clearResult(),this._colorPicker||this._hoverOperation.start(0))}startShowingAt(I,k,E){if(!(this._lastRange&&this._lastRange.equalsRange(I))){if(this._hoverOperation.cancel(),this._isVisible)if(!this._showAtPosition||this._showAtPosition.lineNumber!==I.startLineNumber)this.hide();else{let T=[];for(let O=0,A=this._messages.length;O=I.endColumn&&T.push(B)}if(T.length>0){if(y(T,this._messages))return;this._renderMessages(I,T)}else this.hide()}this._lastRange=I,this._computer.setRange(I),this._shouldFocus=E,this._hoverOperation.start(k)}}hide(){this._lastRange=null,this._hoverOperation.cancel(),this._isVisible&&(setTimeout(()=>{this._isVisible||this._hoverVisibleKey.set(!1)},0),this._isVisible=!1,this._hover.containerDomNode.classList.toggle("hidden",!this._isVisible),this._editor.layoutContentWidget(this),this._stoleFocus&&this._editor.focus()),this._isChangingDecorations=!0,this._highlightDecorations=this._editor.deltaDecorations(this._highlightDecorations,[]),this._isChangingDecorations=!1,this._renderDisposable&&(this._renderDisposable.dispose(),this._renderDisposable=null),this._colorPicker=null}isColorPickerVisible(){return!!this._colorPicker}onContentsChanged(){this._hover.onContentsChanged()}_withResult(I,k){this._messages=I,this._lastRange&&this._messages.length>0?this._renderMessages(this._lastRange,this._messages):k&&this.hide()}_renderMessages(I,k){this._renderDisposable&&(this._renderDisposable.dispose(),this._renderDisposable=null),this._colorPicker=null;let E=1073741824,T=k[0].data.range?C.Range.lift(k[0].data.range):null,O=document.createDocumentFragment(),A=!1;const B=new w.DisposableStore,F=[],D=[];k.forEach(R=>{const W=R.data;if(!!W.range)if(E=Math.min(E,W.range.startColumn),T=T?C.Range.plusRange(T,W.range):C.Range.lift(W.range),W instanceof m){A=!0;const{red:x,green:K,blue:Y,alpha:ee}=W.color,se=new M.RGBA(Math.round(x*255),Math.round(K*255),Math.round(Y*255),ee),ne=new M.Color(se);if(!this._editor.hasModel())return;const le=this._editor.getModel();let X=new C.Range(W.range.startLineNumber,W.range.startColumn,W.range.endLineNumber,W.range.endColumn),z={range:W.range,color:W.color};const P=new o.ColorPickerModel(ne,[],0),V=new s.ColorPickerWidget(O,P,this._editor.getOption(122),this._themeService);p.getColorPresentations(le,z,W.provider,N.CancellationToken.None).then(U=>{if(P.colorPresentations=U||[],!!this._editor.hasModel()){const H=this._editor.getModel().getValueInRange(W.range);P.guessColorPresentation(ne,H);const $=()=>{let G,j;if(P.presentation.textEdit){G=[P.presentation.textEdit],j=new C.Range(P.presentation.textEdit.range.startLineNumber,P.presentation.textEdit.range.startColumn,P.presentation.textEdit.range.endLineNumber,P.presentation.textEdit.range.endColumn);const te=this._editor.getModel()._setTrackedRange(null,j,3);this._editor.pushUndoStop(),this._editor.executeEdits("colorpicker",G),j=this._editor.getModel()._getTrackedRange(te)||j}else G=[{identifier:null,range:X,text:P.presentation.label,forceMoveMarkers:!1}],j=X.setEndPosition(X.endLineNumber,X.startColumn+P.presentation.label.length),this._editor.pushUndoStop(),this._editor.executeEdits("colorpicker",G);P.presentation.additionalTextEdits&&(G=[...P.presentation.additionalTextEdits],this._editor.executeEdits("colorpicker",G),this.hide()),this._editor.pushUndoStop(),X=j},ie=G=>p.getColorPresentations(le,{range:X,color:{red:G.rgba.r/255,green:G.rgba.g/255,blue:G.rgba.b/255,alpha:G.rgba.a}},W.provider,N.CancellationToken.None).then(j=>{P.colorPresentations=j||[]}),oe=P.onColorFlushed(G=>{ie(G).then($)}),ae=P.onDidChangeColor(ie);this._colorPicker=V,this.showAt(X.getStartPosition(),X,this._shouldFocus),this._updateContents(O),this._colorPicker.layout(),this._renderDisposable=w.combinedDisposable(oe,ae,V,B)}})}else W instanceof l.MarkerHover?F.push(W):W instanceof h.MarkdownHover&&D.push(W)}),D.length>0&&B.add(this._markdownHoverParticipant.renderHoverParts(D,O)),F.length&&B.add(this._markerHoverParticipant.renderHoverParts(F,O)),this._renderDisposable=B,!A&&O.hasChildNodes()&&(this.showAt(new S.Position(I.startLineNumber,E),T,this._shouldFocus),this._updateContents(O)),this._isChangingDecorations=!0,this._highlightDecorations=this._editor.deltaDecorations(this._highlightDecorations,T?[{range:T,options:v._DECORATION_OPTIONS}]:[]),this._isChangingDecorations=!1}}e.ModesContentHoverWidget=v,v.ID="editor.contrib.modesContentHoverWidget",v._DECORATION_OPTIONS=d.ModelDecorationOptions.register({className:"hoverHighlight"});function y(L,I){if(L.length!==I.length)return!1;for(let k=0;k{const k=L.getColor(i.textLinkForeground);k&&I.addRule(`.monaco-hover .hover-contents a.code-link span:hover { color: ${k}; }`)})}),define(Q[662],J([0,1,497,15,39,2,13,241,3,21,25,53,31,18,267,34,22,11,16]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SelectionHighlighter=e.CompatChangeAll=e.SelectHighlightsAction=e.MoveSelectionToPreviousFindMatchAction=e.MoveSelectionToNextFindMatchAction=e.AddSelectionToPreviousFindMatchAction=e.AddSelectionToNextFindMatchAction=e.MultiCursorSelectionControllerAction=e.MultiCursorSelectionController=e.MultiCursorSession=e.MultiCursorSessionResult=e.InsertCursorBelow=e.InsertCursorAbove=void 0;class t extends S.EditorAction{constructor(){super({id:"editor.action.insertCursorAbove",label:b.localize(0,null),alias:"Add Cursor Above",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:2048|512|16,linux:{primary:1024|512|16,secondary:[2048|1024|16]},weight:100},menuOpts:{menuId:u.MenuId.MenubarSelectionMenu,group:"3_multi",title:b.localize(1,null),order:2}})}run(x,K,Y){if(!!K.hasModel()){const ee=Y&&Y.logicalLine===!0,se=K._getViewModel();se.cursorConfig.readOnly||(se.pushStackElement(),se.setCursorStates(Y.source,3,C.CursorMoveCommands.addCursorUp(se,se.getCursorStates(),ee)),se.revealTopMostCursor(Y.source))}}}e.InsertCursorAbove=t;class l extends S.EditorAction{constructor(){super({id:"editor.action.insertCursorBelow",label:b.localize(2,null),alias:"Add Cursor Below",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:2048|512|18,linux:{primary:1024|512|18,secondary:[2048|1024|18]},weight:100},menuOpts:{menuId:u.MenuId.MenubarSelectionMenu,group:"3_multi",title:b.localize(3,null),order:3}})}run(x,K,Y){if(!!K.hasModel()){const ee=Y&&Y.logicalLine===!0,se=K._getViewModel();se.cursorConfig.readOnly||(se.pushStackElement(),se.setCursorStates(Y.source,3,C.CursorMoveCommands.addCursorDown(se,se.getCursorStates(),ee)),se.revealBottomMostCursor(Y.source))}}}e.InsertCursorBelow=l;class h extends S.EditorAction{constructor(){super({id:"editor.action.insertCursorAtEndOfEachLineSelected",label:b.localize(4,null),alias:"Add Cursors to Line Ends",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:1024|512|39,weight:100},menuOpts:{menuId:u.MenuId.MenubarSelectionMenu,group:"3_multi",title:b.localize(5,null),order:4}})}getCursorsForSelection(x,K,Y){if(!x.isEmpty()){for(let ee=x.startLineNumber;ee1&&Y.push(new g.Selection(x.endLineNumber,x.endColumn,x.endLineNumber,x.endColumn))}}run(x,K){if(!!K.hasModel()){const Y=K.getModel(),ee=K.getSelections();let se=[];ee.forEach(ne=>this.getCursorsForSelection(ne,Y,se)),se.length>0&&K.setSelections(se)}}}class m extends S.EditorAction{constructor(){super({id:"editor.action.addCursorsToBottom",label:b.localize(6,null),alias:"Add Cursors To Bottom",precondition:void 0})}run(x,K){if(!!K.hasModel()){const Y=K.getSelections(),ee=K.getModel().getLineCount();let se=[];for(let ne=Y[0].startLineNumber;ne<=ee;ne++)se.push(new g.Selection(ne,Y[0].startColumn,ne,Y[0].endColumn));se.length>0&&K.setSelections(se)}}}class _ extends S.EditorAction{constructor(){super({id:"editor.action.addCursorsToTop",label:b.localize(7,null),alias:"Add Cursors To Top",precondition:void 0})}run(x,K){if(!!K.hasModel()){const Y=K.getSelections();let ee=[];for(let se=Y[0].startLineNumber;se>=1;se--)ee.push(new g.Selection(se,Y[0].startColumn,se,Y[0].endColumn));ee.length>0&&K.setSelections(ee)}}}class f{constructor(x,K,Y){this.selections=x,this.revealRange=K,this.revealScrollType=Y}}e.MultiCursorSessionResult=f;class v{constructor(x,K,Y,ee,se,ne,le){this._editor=x,this.findController=K,this.isDisconnectedFromFindController=Y,this.searchText=ee,this.wholeWord=se,this.matchCase=ne,this.currentMatch=le}static create(x,K){if(!x.hasModel())return null;const Y=K.getState();if(!x.hasTextFocus()&&Y.isRevealed&&Y.searchString.length>0)return new v(x,K,!1,Y.searchString,Y.wholeWord,Y.matchCase,null);let ee=!1,se,ne;const le=x.getSelections();le.length===1&&le[0].isEmpty()?(ee=!0,se=!0,ne=!0):(se=Y.wholeWord,ne=Y.matchCase);const X=x.getSelection();let z,P=null;if(X.isEmpty()){const V=x.getConfiguredWordAtPosition(X.getStartPosition());if(!V)return null;z=V.word,P=new g.Selection(X.startLineNumber,V.startColumn,X.startLineNumber,V.endColumn)}else z=x.getModel().getValueInRange(X).replace(/\r\n/g,` +`);return new v(x,K,ee,z,se,ne,P)}addSelectionToNextFindMatch(){if(!this._editor.hasModel())return null;const x=this._getNextMatch();if(!x)return null;const K=this._editor.getSelections();return new f(K.concat(x),x,0)}moveSelectionToNextFindMatch(){if(!this._editor.hasModel())return null;const x=this._getNextMatch();if(!x)return null;const K=this._editor.getSelections();return new f(K.slice(0,K.length-1).concat(x),x,0)}_getNextMatch(){if(!this._editor.hasModel())return null;if(this.currentMatch){const ee=this.currentMatch;return this.currentMatch=null,ee}this.findController.highlightFindOptions();const x=this._editor.getSelections(),K=x[x.length-1],Y=this._editor.getModel().findNextMatch(this.searchText,K.getEndPosition(),!1,this.matchCase,this.wholeWord?this._editor.getOption(110):null,!1);return Y?new g.Selection(Y.range.startLineNumber,Y.range.startColumn,Y.range.endLineNumber,Y.range.endColumn):null}addSelectionToPreviousFindMatch(){if(!this._editor.hasModel())return null;const x=this._getPreviousMatch();if(!x)return null;const K=this._editor.getSelections();return new f(K.concat(x),x,0)}moveSelectionToPreviousFindMatch(){if(!this._editor.hasModel())return null;const x=this._getPreviousMatch();if(!x)return null;const K=this._editor.getSelections();return new f(K.slice(0,K.length-1).concat(x),x,0)}_getPreviousMatch(){if(!this._editor.hasModel())return null;if(this.currentMatch){const ee=this.currentMatch;return this.currentMatch=null,ee}this.findController.highlightFindOptions();const x=this._editor.getSelections(),K=x[x.length-1],Y=this._editor.getModel().findPreviousMatch(this.searchText,K.getStartPosition(),!1,this.matchCase,this.wholeWord?this._editor.getOption(110):null,!1);return Y?new g.Selection(Y.range.startLineNumber,Y.range.startColumn,Y.range.endLineNumber,Y.range.endColumn):null}selectAll(){return this._editor.hasModel()?(this.findController.highlightFindOptions(),this._editor.getModel().findMatches(this.searchText,!0,!1,this.matchCase,this.wholeWord?this._editor.getOption(110):null,!1,1073741824)):[]}}e.MultiCursorSession=v;class y extends w.Disposable{constructor(x){super();this._sessionDispose=this._register(new w.DisposableStore),this._editor=x,this._ignoreSelectionChange=!1,this._session=null}static get(x){return x.getContribution(y.ID)}dispose(){this._endSession(),super.dispose()}_beginSessionIfNeeded(x){if(!this._session){const K=v.create(this._editor,x);if(!K)return;this._session=K;const Y={searchString:this._session.searchText};this._session.isDisconnectedFromFindController&&(Y.wholeWordOverride=1,Y.matchCaseOverride=1,Y.isRegexOverride=2),x.getState().change(Y,!1),this._sessionDispose.add(this._editor.onDidChangeCursorSelection(ee=>{this._ignoreSelectionChange||this._endSession()})),this._sessionDispose.add(this._editor.onDidBlurEditorText(()=>{this._endSession()})),this._sessionDispose.add(x.getState().onFindReplaceStateChange(ee=>{(ee.matchCase||ee.wholeWord)&&this._endSession()}))}}_endSession(){if(this._sessionDispose.clear(),this._session&&this._session.isDisconnectedFromFindController){const x={wholeWordOverride:0,matchCaseOverride:0,isRegexOverride:0};this._session.findController.getState().change(x,!1)}this._session=null}_setSelections(x){this._ignoreSelectionChange=!0,this._editor.setSelections(x),this._ignoreSelectionChange=!1}_expandEmptyToWord(x,K){if(!K.isEmpty())return K;const Y=this._editor.getConfiguredWordAtPosition(K.getStartPosition());return Y?new g.Selection(K.startLineNumber,Y.startColumn,K.startLineNumber,Y.endColumn):K}_applySessionResult(x){!x||(this._setSelections(x.selections),x.revealRange&&this._editor.revealRangeInCenterIfOutsideViewport(x.revealRange,x.revealScrollType))}getSession(x){return this._session}addSelectionToNextFindMatch(x){if(!!this._editor.hasModel()){if(!this._session){const K=this._editor.getSelections();if(K.length>1){const ee=x.getState().matchCase;if(!D(this._editor.getModel(),K,ee)){const ne=this._editor.getModel();let le=[];for(let X=0,z=K.length;X0&&Y.isRegex)K=this._editor.getModel().findMatches(Y.searchString,!0,Y.isRegex,Y.matchCase,Y.wholeWord?this._editor.getOption(110):null,!1,1073741824);else{if(this._beginSessionIfNeeded(x),!this._session)return;K=this._session.selectAll()}if(Y.searchScope){const ee=Y.searchScope;let se=[];K.forEach(ne=>{ee.forEach(le=>{ne.range.endLineNumber<=le.endLineNumber&&ne.range.startLineNumber>=le.startLineNumber&&se.push(ne)})}),K=se}if(K.length>0){const ee=this._editor.getSelection();for(let se=0,ne=K.length;senew g.Selection(se.range.startLineNumber,se.range.startColumn,se.range.endLineNumber,se.range.endColumn)))}}}}e.MultiCursorSelectionController=y,y.ID="editor.contrib.multiCursorController";class L extends S.EditorAction{run(x,K){const Y=y.get(K);if(!!Y){const ee=a.CommonFindController.get(K);!ee||this._run(Y,ee)}}}e.MultiCursorSelectionControllerAction=L;class I extends L{constructor(){super({id:"editor.action.addSelectionToNextFindMatch",label:b.localize(8,null),alias:"Add Selection To Next Find Match",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:2048|34,weight:100},menuOpts:{menuId:u.MenuId.MenubarSelectionMenu,group:"3_multi",title:b.localize(9,null),order:5}})}_run(x,K){x.addSelectionToNextFindMatch(K)}}e.AddSelectionToNextFindMatchAction=I;class k extends L{constructor(){super({id:"editor.action.addSelectionToPreviousFindMatch",label:b.localize(10,null),alias:"Add Selection To Previous Find Match",precondition:void 0,menuOpts:{menuId:u.MenuId.MenubarSelectionMenu,group:"3_multi",title:b.localize(11,null),order:6}})}_run(x,K){x.addSelectionToPreviousFindMatch(K)}}e.AddSelectionToPreviousFindMatchAction=k;class E extends L{constructor(){super({id:"editor.action.moveSelectionToNextFindMatch",label:b.localize(12,null),alias:"Move Last Selection To Next Find Match",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:M.KeyChord(2048|41,2048|34),weight:100}})}_run(x,K){x.moveSelectionToNextFindMatch(K)}}e.MoveSelectionToNextFindMatchAction=E;class T extends L{constructor(){super({id:"editor.action.moveSelectionToPreviousFindMatch",label:b.localize(13,null),alias:"Move Last Selection To Previous Find Match",precondition:void 0})}_run(x,K){x.moveSelectionToPreviousFindMatch(K)}}e.MoveSelectionToPreviousFindMatchAction=T;class O extends L{constructor(){super({id:"editor.action.selectHighlights",label:b.localize(14,null),alias:"Select All Occurrences of Find Match",precondition:void 0,kbOpts:{kbExpr:p.EditorContextKeys.focus,primary:2048|1024|42,weight:100},menuOpts:{menuId:u.MenuId.MenubarSelectionMenu,group:"3_multi",title:b.localize(15,null),order:7}})}_run(x,K){x.selectAll(K)}}e.SelectHighlightsAction=O;class A extends L{constructor(){super({id:"editor.action.changeAll",label:b.localize(16,null),alias:"Change All Occurrences",precondition:n.ContextKeyExpr.and(p.EditorContextKeys.writable,p.EditorContextKeys.editorTextFocus),kbOpts:{kbExpr:p.EditorContextKeys.editorTextFocus,primary:2048|60,weight:100},contextMenuOpts:{group:"1_modification",order:1.2}})}_run(x,K){x.selectAll(K)}}e.CompatChangeAll=A;class B{constructor(x,K,Y,ee){this.searchText=x,this.matchCase=K,this.wordSeparators=Y,this.modelVersionId=ee}static softEquals(x,K){return!x&&!K?!0:!x||!K?!1:x.searchText===K.searchText&&x.matchCase===K.matchCase&&x.wordSeparators===K.wordSeparators&&x.modelVersionId===K.modelVersionId}}class F extends w.Disposable{constructor(x){super();this.editor=x,this._isEnabled=x.getOption(92),this.decorations=[],this.updateSoon=this._register(new N.RunOnceScheduler(()=>this._update(),300)),this.state=null,this._register(x.onDidChangeConfiguration(K=>{this._isEnabled=x.getOption(92)})),this._register(x.onDidChangeCursorSelection(K=>{!this._isEnabled||(K.selection.isEmpty()?K.reason===3?(this.state&&this._setState(null),this.updateSoon.schedule()):this._setState(null):this._update())})),this._register(x.onDidChangeModel(K=>{this._setState(null)})),this._register(x.onDidChangeModelContent(K=>{this._isEnabled&&this.updateSoon.schedule()})),this._register(a.CommonFindController.get(x).getState().onFindReplaceStateChange(K=>{this._update()}))}_update(){this._setState(F._createState(this._isEnabled,this.editor))}static _createState(x,K){if(!x||!K.hasModel())return null;const Y=K.getSelection();if(Y.startLineNumber!==Y.endLineNumber)return null;const ee=y.get(K);if(!ee)return null;const se=a.CommonFindController.get(K);if(!se)return null;let ne=ee.getSession(se);if(!ne){const z=K.getSelections();if(z.length>1){const V=se.getState().matchCase;if(!D(K.getModel(),z,V))return null}ne=v.create(K,se)}if(!ne||ne.currentMatch||/^[ \t]+$/.test(ne.searchText)||ne.searchText.length>200)return null;const le=se.getState(),X=le.matchCase;if(le.isRevealed){let z=le.searchString;X||(z=z.toLowerCase());let P=ne.searchText;if(X||(P=P.toLowerCase()),z===P&&ne.matchCase===le.matchCase&&ne.wholeWord===le.wholeWord&&!le.isRegex)return null}return new B(ne.searchText,ne.matchCase,ne.wholeWord?K.getOption(110):null,K.getModel().getVersionId())}_setState(x){if(B.softEquals(this.state,x)){this.state=x;return}if(this.state=x,!this.state){this.decorations=this.editor.deltaDecorations(this.decorations,[]);return}if(!!this.editor.hasModel()){const K=this.editor.getModel();if(!K.isTooLargeForTokenization()){const Y=s.DocumentHighlightProviderRegistry.has(K)&&this.editor.getOption(66);let ee=K.findMatches(this.state.searchText,!0,!1,this.state.matchCase,this.state.wordSeparators,!1).map(X=>X.range);ee.sort(d.Range.compareRangesUsingStarts);let se=this.editor.getSelections();se.sort(d.Range.compareRangesUsingStarts);let ne=[];for(let X=0,z=0,P=ee.length,V=se.length;X=V)ne.push(U),X++;else{const H=d.Range.compareRangesUsingStarts(U,se[z]);H<0?((se[z].isEmpty()||!d.Range.areIntersecting(U,se[z]))&&ne.push(U),X++):(H>0||X++,z++)}}const le=ne.map(X=>({range:X,options:Y?F._SELECTION_HIGHLIGHT:F._SELECTION_HIGHLIGHT_OVERVIEW}));this.decorations=this.editor.deltaDecorations(this.decorations,le)}}}dispose(){this._setState(null),super.dispose()}}e.SelectionHighlighter=F,F.ID="editor.contrib.selectionHighlighter",F._SELECTION_HIGHLIGHT_OVERVIEW=o.ModelDecorationOptions.register({stickiness:1,className:"selectionHighlight",overviewRuler:{color:i.themeColorFromId(r.overviewRulerSelectionHighlightForeground),position:c.OverviewRulerLane.Center}}),F._SELECTION_HIGHLIGHT=o.ModelDecorationOptions.register({stickiness:1,className:"selectionHighlight"});function D(W,x,K){const Y=R(W,x[0],!K);for(let ee=1,se=x.length;ee{T?(this.show(),this.render(T)):this.hide()}))}createParamaterHintDOMNodes(){const L=m(".editor-widget.parameter-hints-widget"),I=b.append(L,m(".phwrapper"));I.tabIndex=-1;const k=b.append(I,m(".controls")),E=b.append(k,m(".button"+u.ThemeIcon.asCSSSelector(f))),T=b.append(k,m(".overloads")),O=b.append(k,m(".button"+u.ThemeIcon.asCSSSelector(_))),A=N.stop(N.domEvent(E,"click"));this._register(A(this.previous,this));const B=N.stop(N.domEvent(O,"click"));this._register(B(this.next,this));const F=m(".body"),D=new w.DomScrollableElement(F,{});this._register(D),I.appendChild(D.getDomNode());const R=b.append(F,m(".signature")),W=b.append(F,m(".docs"));L.style.userSelect="text",this.domNodes={element:L,signature:R,overloads:T,docs:W,scrollbar:D},this.editor.addContentWidget(this),this.hide(),this._register(this.editor.onDidChangeCursorSelection(K=>{this.visible&&this.editor.layoutContentWidget(this)}));const x=()=>{if(!!this.domNodes){const K=this.editor.getOption(38);this.domNodes.element.style.fontSize=`${K.fontSize}px`}};x(),this._register(S.Event.chain(this.editor.onDidChangeConfiguration.bind(this.editor)).filter(K=>K.hasChanged(38)).on(x,null)),this._register(this.editor.onDidLayoutChange(K=>this.updateMaxHeight())),this.updateMaxHeight()}show(){this.visible||(this.domNodes||this.createParamaterHintDOMNodes(),this.keyVisible.set(!0),this.visible=!0,setTimeout(()=>{this.domNodes&&this.domNodes.element.classList.add("visible")},100),this.editor.layoutContentWidget(this))}hide(){this.renderDisposeables.clear(),!!this.visible&&(this.keyVisible.reset(),this.visible=!1,this.announcedLabel=null,this.domNodes&&this.domNodes.element.classList.remove("visible"),this.editor.layoutContentWidget(this))}getPosition(){return this.visible?{position:this.editor.getPosition(),preference:[1,2]}:null}render(L){var I;if(this.renderDisposeables.clear(),!!this.domNodes){const k=L.signatures.length>1;this.domNodes.element.classList.toggle("multiple",k),this.keyMultipleSignatures.set(k),this.domNodes.signature.innerText="",this.domNodes.docs.innerText="";const E=L.signatures[L.activeSignature];if(!!E){const T=b.append(this.domNodes.signature,m(".code")),O=this.editor.getOption(38);T.style.fontSize=`${O.fontSize}px`,T.style.fontFamily=O.fontFamily;const A=E.parameters.length>0,B=(I=E.activeParameter)!==null&&I!==void 0?I:L.activeParameter;if(A)this.renderParameters(T,E,B);else{const R=b.append(T,m("span"));R.textContent=E.label}const F=E.parameters[B];if(F==null?void 0:F.documentation){const R=m("span.documentation");if(typeof F.documentation=="string")R.textContent=F.documentation;else{const W=this.renderMarkdownDocs(F.documentation);R.appendChild(W.element)}b.append(this.domNodes.docs,m("p",{},R))}if(E.documentation!==void 0)if(typeof E.documentation=="string")b.append(this.domNodes.docs,m("p",{},E.documentation));else{const R=this.renderMarkdownDocs(E.documentation);b.append(this.domNodes.docs,R.element)}const D=this.hasDocs(E,F);if(this.domNodes.signature.classList.toggle("has-docs",D),this.domNodes.docs.classList.toggle("empty",!D),this.domNodes.overloads.textContent=String(L.activeSignature+1).padStart(L.signatures.length.toString().length,"0")+"/"+L.signatures.length,F){const R=this.getParameterLabel(E,B);this.announcedLabel!==R&&(M.alert(c.localize(2,null,R)),this.announcedLabel=R)}this.editor.layoutContentWidget(this),this.domNodes.scrollbar.scanDomNode()}}}renderMarkdownDocs(L){const I=this.renderDisposeables.add(this.markdownRenderer.render(L,{asyncRenderCallback:()=>{var k;(k=this.domNodes)===null||k===void 0||k.scrollbar.scanDomNode()}}));return I.element.classList.add("markdown-docs"),I}hasDocs(L,I){return!!(I&&typeof I.documentation=="string"&&t.assertIsDefined(I.documentation).length>0||I&&typeof I.documentation=="object"&&t.assertIsDefined(I.documentation).value.length>0||L.documentation&&typeof L.documentation=="string"&&t.assertIsDefined(L.documentation).length>0||L.documentation&&typeof L.documentation=="object"&&t.assertIsDefined(L.documentation.value).length>0)}renderParameters(L,I,k){const[E,T]=this.getParameterLabelOffsets(I,k),O=document.createElement("span");O.textContent=I.label.substring(0,E);const A=document.createElement("span");A.textContent=I.label.substring(E,T),A.className="parameter active";const B=document.createElement("span");B.textContent=I.label.substring(T),b.append(L,O,A,B)}getParameterLabel(L,I){const k=L.parameters[I];return Array.isArray(k.label)?L.label.substring(k.label[0],k.label[1]):k.label}getParameterLabelOffsets(L,I){const k=L.parameters[I];if(k){if(Array.isArray(k.label))return k.label;if(k.label.length){const E=new RegExp(`(\\W|^)${i.escapeRegExpCharacters(k.label)}(?=\\W|$)`,"g");E.test(L.label);const T=E.lastIndex-k.label.length;return T>=0?[T,E.lastIndex]:[0,0]}else return[0,0]}else return[0,0]}next(){this.editor.focus(),this.model.next()}previous(){this.editor.focus(),this.model.previous()}cancel(){this.model.cancel()}getDomNode(){return this.domNodes||this.createParamaterHintDOMNodes(),this.domNodes.element}getId(){return jt.ID}trigger(L){this.model.trigger(L,0)}updateMaxHeight(){if(!!this.domNodes){const I=`${Math.max(this.editor.getLayoutInfo().height/4,250)}px`;this.domNodes.element.style.maxHeight=I;const k=this.domNodes.element.getElementsByClassName("phwrapper");k.length&&(k[0].style.maxHeight=I)}}};v.ID="editor.widget.parameterHintsWidget",v=Me([_e(1,o.IContextKeyService),_e(2,s.IOpenerService),_e(3,d.IModeService)],v),e.ParameterHintsWidget=v,u.registerThemingParticipant((y,L)=>{const I=y.getColor(a.editorHoverBorder);if(I){const A=y.type===l.ColorScheme.HIGH_CONTRAST?2:1;L.addRule(`.monaco-editor .parameter-hints-widget { border: ${A}px solid ${I}; }`),L.addRule(`.monaco-editor .parameter-hints-widget.multiple .body { border-left: 1px solid ${I.transparent(.5)}; }`),L.addRule(`.monaco-editor .parameter-hints-widget .signature.has-docs { border-bottom: 1px solid ${I.transparent(.5)}; }`)}const k=y.getColor(a.editorHoverBackground);k&&L.addRule(`.monaco-editor .parameter-hints-widget { background-color: ${k}; }`);const E=y.getColor(a.textLinkForeground);E&&L.addRule(`.monaco-editor .parameter-hints-widget a { color: ${E}; }`);const T=y.getColor(a.editorHoverForeground);T&&L.addRule(`.monaco-editor .parameter-hints-widget { color: ${T}; }`);const O=y.getColor(a.textCodeBlockBackground);O&&L.addRule(`.monaco-editor .parameter-hints-widget code { background-color: ${O}; }`)})}),define(Q[664],J([0,1,498,2,9,25,16,13,663,183,18]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TriggerParameterHintsAction=void 0;let c=class Gt extends N.Disposable{constructor(r,i){super();this.editor=r,this.widget=this._register(i.createInstance(d.ParameterHintsWidget,this.editor))}static get(r){return r.getContribution(Gt.ID)}cancel(){this.widget.cancel()}previous(){this.widget.previous()}next(){this.widget.next()}trigger(r){this.widget.trigger(r)}};c.ID="editor.controller.parameterHints",c=Me([_e(1,M.IInstantiationService)],c);class o extends C.EditorAction{constructor(){super({id:"editor.action.triggerParameterHints",label:b.localize(0,null),alias:"Trigger Parameter Hints",precondition:w.EditorContextKeys.hasSignatureHelpProvider,kbOpts:{kbExpr:w.EditorContextKeys.editorTextFocus,primary:2048|1024|10,weight:100}})}run(r,i){const n=c.get(i);n&&n.trigger({triggerKind:p.SignatureHelpTriggerKind.Invoke})}}e.TriggerParameterHintsAction=o,C.registerEditorContribution(c.ID,c),C.registerEditorAction(o);const s=100+75,a=C.EditorCommand.bindToContribution(c.get);C.registerEditorCommand(new a({id:"closeParameterHints",precondition:g.Context.Visible,handler:u=>u.cancel(),kbOpts:{weight:s,kbExpr:w.EditorContextKeys.focus,primary:9,secondary:[1024|9]}})),C.registerEditorCommand(new a({id:"showPrevParameterHint",precondition:S.ContextKeyExpr.and(g.Context.Visible,g.Context.MultipleSignatures),handler:u=>u.previous(),kbOpts:{weight:s,kbExpr:w.EditorContextKeys.focus,primary:16,secondary:[512|16],mac:{primary:16,secondary:[512|16,256|46]}}})),C.registerEditorCommand(new a({id:"showNextParameterHint",precondition:S.ContextKeyExpr.and(g.Context.Visible,g.Context.MultipleSignatures),handler:u=>u.next(),kbOpts:{weight:s,kbExpr:w.EditorContextKeys.focus,primary:18,secondary:[512|18],mac:{primary:18,secondary:[512|18,256|44]}}}))}),define(Q[665],J([0,1,510,66,2,7,11,57,18,175,562,36,24,237,19,254,27,6,80]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n){"use strict";var t;Object.defineProperty(e,"__esModule",{value:!0}),e.ItemRenderer=e.suggestMoreInfoIcon=e.getAriaId=void 0;function l(_){return`suggest-aria-id:${_}`}e.getAriaId=l,e.suggestMoreInfoIcon=n.registerIcon("suggest-more-info",r.Codicon.chevronRight,b.localize(0,null));const h=new(t=class ft{extract(f,v){if(f.textLabel.match(ft._regexStrict))return v[0]=f.textLabel,!0;if(f.completion.detail&&f.completion.detail.match(ft._regexStrict))return v[0]=f.completion.detail,!0;if(typeof f.completion.documentation=="string"){const y=ft._regexRelaxed.exec(f.completion.documentation);if(y&&(y.index===0||y.index+y[0].length===f.completion.documentation.length))return v[0]=y[0],!0}return!1}},t._regexRelaxed=/(#([\da-fA-F]{3}){1,2}|(rgb|hsl)a\(\s*(\d{1,3}%?\s*,\s*){3}(1|0?\.\d+)\)|(rgb|hsl)\(\s*\d{1,3}%?(\s*,\s*\d{1,3}%?){2}\s*\))/,t._regexStrict=new RegExp(`^${t._regexRelaxed.source}$`,"i"),t);let m=class{constructor(f,v,y,L){this._editor=f,this._modelService=v,this._modeService=y,this._themeService=L,this._onDidToggleDetails=new i.Emitter,this.onDidToggleDetails=this._onDidToggleDetails.event,this.templateId="suggestion"}dispose(){this._onDidToggleDetails.dispose()}renderTemplate(f){const v=Object.create(null);v.disposables=new M.DisposableStore,v.root=f,v.root.classList.add("show-file-icons"),v.icon=w.append(f,w.$(".icon")),v.colorspan=w.append(v.icon,w.$("span.colorspan"));const y=w.append(f,w.$(".contents")),L=w.append(y,w.$(".main"));v.iconContainer=w.append(L,w.$(".icon-label.codicon")),v.left=w.append(L,w.$("span.left")),v.right=w.append(L,w.$("span.right")),v.iconLabel=new g.IconLabel(v.left,{supportHighlights:!0,supportIcons:!0}),v.disposables.add(v.iconLabel),v.parametersLabel=w.append(v.left,w.$("span.signature-label")),v.qualifierLabel=w.append(v.left,w.$("span.qualifier-label")),v.detailsLabel=w.append(v.right,w.$("span.details-label")),v.readMore=w.append(v.right,w.$("span.readMore"+S.ThemeIcon.asCSSSelector(e.suggestMoreInfoIcon))),v.readMore.title=b.localize(1,null);const I=()=>{const k=this._editor.getOptions(),E=k.get(38),T=E.fontFamily,O=E.fontFeatureSettings,A=k.get(102)||E.fontSize,B=k.get(103)||E.lineHeight,F=E.fontWeight,D=`${A}px`,R=`${B}px`;v.root.style.fontSize=D,v.root.style.fontWeight=F,L.style.fontFamily=T,L.style.fontFeatureSettings=O,L.style.lineHeight=R,v.icon.style.height=R,v.icon.style.width=R,v.readMore.style.height=R,v.readMore.style.width=R};return I(),v.disposables.add(this._editor.onDidChangeConfiguration(k=>{(k.hasChanged(38)||k.hasChanged(102)||k.hasChanged(103))&&I()})),v}renderElement(f,v,y){var L,I,k;const{completion:E}=f,T=typeof E.label=="string"?E.label:E.label.name;y.root.id=l(v),y.colorspan.style.backgroundColor="";const O={labelEscapeNewLines:!0,matches:N.createMatches(f.score)};let A=[];if(E.kind===19&&h.extract(f,A))y.icon.className="icon customcolor",y.iconContainer.className="icon hide",y.colorspan.style.backgroundColor=A[0];else if(E.kind===20&&this._themeService.getFileIconTheme().hasFileIcons){y.icon.className="icon hide",y.iconContainer.className="icon hide";const B=p.getIconClasses(this._modelService,this._modeService,o.URI.from({scheme:"fake",path:T}),s.FileKind.FILE),F=p.getIconClasses(this._modelService,this._modeService,o.URI.from({scheme:"fake",path:E.detail}),s.FileKind.FILE);O.extraClasses=B.length>F.length?B:F}else E.kind===23&&this._themeService.getFileIconTheme().hasFolderIcons?(y.icon.className="icon hide",y.iconContainer.className="icon hide",O.extraClasses=a.flatten([p.getIconClasses(this._modelService,this._modeService,o.URI.from({scheme:"fake",path:T}),s.FileKind.FOLDER),p.getIconClasses(this._modelService,this._modeService,o.URI.from({scheme:"fake",path:E.detail}),s.FileKind.FOLDER)])):(y.icon.className="icon hide",y.iconContainer.className="",y.iconContainer.classList.add("suggest-icon",...d.completionKindToCssClass(E.kind).split(" ")));E.tags&&E.tags.indexOf(1)>=0&&(O.extraClasses=(O.extraClasses||[]).concat(["deprecated"]),O.matches=[]),y.iconLabel.setLabel(T,void 0,O),typeof E.label=="string"?(y.parametersLabel.textContent="",y.qualifierLabel.textContent="",y.detailsLabel.textContent=(E.detail||"").replace(/\n.*$/m,""),y.root.classList.add("string-label"),y.root.title=""):(y.parametersLabel.textContent=(E.label.parameters||"").replace(/\n.*$/m,""),y.qualifierLabel.textContent=(E.label.qualifier||"").replace(/\n.*$/m,""),y.detailsLabel.textContent=(E.label.type||"").replace(/\n.*$/m,""),y.root.classList.remove("string-label"),y.root.title=`${T}${(L=E.label.parameters)!==null&&L!==void 0?L:""} ${(I=E.label.qualifier)!==null&&I!==void 0?I:""} ${(k=E.label.type)!==null&&k!==void 0?k:""}`),this._editor.getOption(101).showInlineDetails?w.show(y.detailsLabel):w.hide(y.detailsLabel),u.canExpandCompletionItem(f)?(y.right.classList.add("can-expand-details"),w.show(y.readMore),y.readMore.onmousedown=B=>{B.stopPropagation(),B.preventDefault()},y.readMore.onclick=B=>{B.stopPropagation(),B.preventDefault(),this._onDidToggleDetails.fire()}):(y.right.classList.remove("can-expand-details"),w.hide(y.readMore),y.readMore.onmousedown=null,y.readMore.onclick=null)}disposeTemplate(f){f.disposables.dispose()}};m=Me([_e(1,c.IModelService),_e(2,C.IModeService),_e(3,S.IThemeService)],m),e.ItemRenderer=m}),define(Q[666],J([0,1,508,8,7,6,12,2,105,16,117,116,11,22,79,15,9,254,649,665,231,144,100,352,123,259]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestContentWidget=e.SuggestWidget=e.editorSuggestWidgetHighlightForeground=e.editorSuggestWidgetSelectedBackground=e.editorSuggestWidgetForeground=e.editorSuggestWidgetBorder=e.editorSuggestWidgetBackground=void 0,e.editorSuggestWidgetBackground=s.registerColor("editorSuggestWidget.background",{dark:s.editorWidgetBackground,light:s.editorWidgetBackground,hc:s.editorWidgetBackground},b.localize(0,null)),e.editorSuggestWidgetBorder=s.registerColor("editorSuggestWidget.border",{dark:s.editorWidgetBorder,light:s.editorWidgetBorder,hc:s.editorWidgetBorder},b.localize(1,null)),e.editorSuggestWidgetForeground=s.registerColor("editorSuggestWidget.foreground",{dark:s.editorForeground,light:s.editorForeground,hc:s.editorForeground},b.localize(2,null)),e.editorSuggestWidgetSelectedBackground=s.registerColor("editorSuggestWidget.selectedBackground",{dark:s.quickInputListFocusBackground,light:s.quickInputListFocusBackground,hc:s.quickInputListFocusBackground},b.localize(3,null)),e.editorSuggestWidgetHighlightForeground=s.registerColor("editorSuggestWidget.highlightForeground",{dark:s.listHighlightForeground,light:s.listHighlightForeground,hc:s.listHighlightForeground},b.localize(4,null));class _{constructor(L,I){this._service=L,this._key=`suggestWidget.size/${I.getEditorType()}/${I instanceof h.EmbeddedCodeEditorWidget}`}restore(){var L;const I=(L=this._service.get(this._key,0))!==null&&L!==void 0?L:"";try{const k=JSON.parse(I);if(M.Dimension.is(k))return M.Dimension.lift(k)}catch(k){}}store(L){this._service.store(this._key,JSON.stringify(L),0,1)}reset(){this._service.remove(this._key,0)}}let f=class wt{constructor(L,I,k,E,T){this.editor=L,this._storageService=I,this._state=0,this._isAuto=!1,this._ignoreFocusEvents=!1,this._explainMode=!1,this._showTimeout=new u.TimeoutTimer,this._disposables=new C.DisposableStore,this._onDidSelect=new w.Emitter,this._onDidFocus=new w.Emitter,this._onDidHide=new w.Emitter,this._onDidShow=new w.Emitter,this.onDidSelect=this._onDidSelect.event,this.onDidFocus=this._onDidFocus.event,this.onDidHide=this._onDidHide.event,this.onDidShow=this._onDidShow.event,this._onDetailsKeydown=new w.Emitter,this.onDetailsKeyDown=this._onDetailsKeydown.event,this.element=new l.ResizableHTMLElement,this.element.domNode.classList.add("editor-widget","suggest-widget"),this._contentWidget=new v(this,L),this._persistedSize=new _(I,L);class O{constructor(x,K,Y=!1,ee=!1){this.persistedSize=x,this.currentSize=K,this.persistHeight=Y,this.persistWidth=ee}}let A;this._disposables.add(this.element.onDidWillResize(()=>{this._contentWidget.lockPreference(),A=new O(this._persistedSize.restore(),this.element.size)})),this._disposables.add(this.element.onDidResize(W=>{var x,K,Y,ee;if(this._resize(W.dimension.width,W.dimension.height),A&&(A.persistHeight=A.persistHeight||!!W.north||!!W.south,A.persistWidth=A.persistWidth||!!W.east||!!W.west),!!W.done){if(A){const{itemHeight:se,defaultSize:ne}=this.getLayoutInfo(),le=Math.round(se/2);let{width:X,height:z}=this.element.size;(!A.persistHeight||Math.abs(A.currentSize.height-z)<=le)&&(z=(K=(x=A.persistedSize)===null||x===void 0?void 0:x.height)!==null&&K!==void 0?K:ne.height),(!A.persistWidth||Math.abs(A.currentSize.width-X)<=le)&&(X=(ee=(Y=A.persistedSize)===null||Y===void 0?void 0:Y.width)!==null&&ee!==void 0?ee:ne.width),this._persistedSize.store(new M.Dimension(X,z))}this._contentWidget.unlockPreference(),A=void 0}})),this._messageElement=M.append(this.element.domNode,M.$(".message")),this._listElement=M.append(this.element.domNode,M.$(".tree"));const B=T.createInstance(i.SuggestDetailsWidget,this.editor);B.onDidClose(this.toggleDetails,this,this._disposables),this._details=new i.SuggestDetailsOverlay(B,this.editor);const F=()=>this.element.domNode.classList.toggle("no-icons",!this.editor.getOption(101).showIcons);F();const D=T.createInstance(t.ItemRenderer,this.editor);this._disposables.add(D),this._disposables.add(D.onDidToggleDetails(()=>this.toggleDetails())),this._list=new d.List("SuggestWidget",this._listElement,{getHeight:W=>this.getLayoutInfo().itemHeight,getTemplateId:W=>"suggestion"},[D],{alwaysConsumeMouseWheel:!0,useShadows:!1,mouseSupport:!1,accessibilityProvider:{getRole:()=>"option",getAriaLabel:W=>{const x=typeof W.completion.label=="string"?W.completion.label:W.completion.label.name;if(W.isResolved&&this._isDetailsVisible()){const{documentation:K,detail:Y}=W.completion,ee=N.format("{0}{1}",Y||"",K?typeof K=="string"?K:K.value:"");return b.localize(7,null,x,ee)}else return x},getWidgetAriaLabel:()=>b.localize(8,null),getWidgetRole:()=>"listbox"}}),this._status=T.createInstance(n.SuggestWidgetStatus,this.element.domNode);const R=()=>this.element.domNode.classList.toggle("with-status-bar",this.editor.getOption(101).showStatusBar);R(),this._disposables.add(c.attachListStyler(this._list,E,{listInactiveFocusBackground:e.editorSuggestWidgetSelectedBackground,listInactiveFocusOutline:s.activeContrastBorder})),this._disposables.add(E.onDidColorThemeChange(W=>this._onThemeChange(W))),this._onThemeChange(E.getColorTheme()),this._disposables.add(this._list.onMouseDown(W=>this._onListMouseDownOrTap(W))),this._disposables.add(this._list.onTap(W=>this._onListMouseDownOrTap(W))),this._disposables.add(this._list.onDidChangeSelection(W=>this._onListSelection(W))),this._disposables.add(this._list.onDidChangeFocus(W=>this._onListFocus(W))),this._disposables.add(this.editor.onDidChangeCursorSelection(()=>this._onCursorSelectionChanged())),this._disposables.add(this.editor.onDidChangeConfiguration(W=>{W.hasChanged(101)&&(R(),F())})),this._ctxSuggestWidgetVisible=p.Context.Visible.bindTo(k),this._ctxSuggestWidgetDetailsVisible=p.Context.DetailsVisible.bindTo(k),this._ctxSuggestWidgetMultipleSuggestions=p.Context.MultipleSuggestions.bindTo(k),this._disposables.add(M.addStandardDisposableListener(this._details.widget.domNode,"keydown",W=>{this._onDetailsKeydown.fire(W)})),this._disposables.add(this.editor.onMouseDown(W=>this._onEditorMouseDown(W)))}dispose(){var L;this._details.widget.dispose(),this._details.dispose(),this._list.dispose(),this._status.dispose(),this._disposables.dispose(),(L=this._loadingTimeout)===null||L===void 0||L.dispose(),this._showTimeout.dispose(),this._contentWidget.dispose(),this.element.dispose()}_onEditorMouseDown(L){this._details.widget.domNode.contains(L.target.element)?this._details.widget.domNode.focus():this.element.domNode.contains(L.target.element)&&this.editor.focus()}_onCursorSelectionChanged(){this._state!==0&&this._contentWidget.layout()}_onListMouseDownOrTap(L){typeof L.element=="undefined"||typeof L.index=="undefined"||(L.browserEvent.preventDefault(),L.browserEvent.stopPropagation(),this._select(L.element,L.index))}_onListSelection(L){L.elements.length&&this._select(L.elements[0],L.indexes[0])}_select(L,I){const k=this._completionModel;k&&(this._onDidSelect.fire({item:L,index:I,model:k}),this.editor.focus())}_onThemeChange(L){const I=L.getColor(e.editorSuggestWidgetBackground);I&&(this.element.domNode.style.backgroundColor=I.toString(),this._messageElement.style.backgroundColor=I.toString(),this._details.widget.domNode.style.backgroundColor=I.toString());const k=L.getColor(e.editorSuggestWidgetBorder);k&&(this.element.domNode.style.borderColor=k.toString(),this._messageElement.style.borderColor=k.toString(),this._status.element.style.borderTopColor=k.toString(),this._details.widget.domNode.style.borderColor=k.toString(),this._detailsBorderColor=k.toString());const E=L.getColor(s.focusBorder);E&&(this._detailsFocusBorderColor=E.toString()),this._details.widget.borderWidth=L.type==="hc"?2:1}_onListFocus(L){var I;if(!this._ignoreFocusEvents){if(!L.elements.length){this._currentSuggestionDetails&&(this._currentSuggestionDetails.cancel(),this._currentSuggestionDetails=void 0,this._focusedItem=void 0),this.editor.setAriaOptions({activeDescendant:void 0});return}if(!!this._completionModel){const k=L.elements[0],E=L.indexes[0];k!==this._focusedItem&&((I=this._currentSuggestionDetails)===null||I===void 0||I.cancel(),this._currentSuggestionDetails=void 0,this._focusedItem=k,this._list.reveal(E),this._currentSuggestionDetails=u.createCancelablePromise(T=>Ie(this,void 0,void 0,function*(){const O=u.disposableTimeout(()=>{this._isDetailsVisible()&&this.showDetails(!0)},250);T.onCancellationRequested(()=>O.dispose());const A=yield k.resolve(T);return O.dispose(),A})),this._currentSuggestionDetails.then(()=>{E>=this._list.length||k!==this._list.element(E)||(this._ignoreFocusEvents=!0,this._list.splice(E,1,[k]),this._list.setFocus([E]),this._ignoreFocusEvents=!1,this._isDetailsVisible()?this.showDetails(!1):this.element.domNode.classList.remove("docs-side"),this.editor.setAriaOptions({activeDescendant:t.getAriaId(E)}))}).catch(S.onUnexpectedError)),this._onDidFocus.fire({item:k,index:E,model:this._completionModel})}}}_setState(L){if(this._state!==L)switch(this._state=L,this.element.domNode.classList.toggle("frozen",L===4),this.element.domNode.classList.remove("message"),L){case 0:M.hide(this._messageElement,this._listElement,this._status.element),this._details.hide(!0),this._status.hide(),this._contentWidget.hide(),this._ctxSuggestWidgetVisible.reset(),this._ctxSuggestWidgetMultipleSuggestions.reset(),this.element.domNode.classList.remove("visible"),this._list.splice(0,this._list.length),this._focusedItem=void 0,this._cappedHeight=void 0,this._explainMode=!1;break;case 1:this.element.domNode.classList.add("message"),this._messageElement.textContent=wt.LOADING_MESSAGE,M.hide(this._listElement,this._status.element),M.show(this._messageElement),this._details.hide(),this._show(),this._focusedItem=void 0;break;case 2:this.element.domNode.classList.add("message"),this._messageElement.textContent=wt.NO_SUGGESTIONS_MESSAGE,M.hide(this._listElement,this._status.element),M.show(this._messageElement),this._details.hide(),this._show(),this._focusedItem=void 0;break;case 3:M.hide(this._messageElement),M.show(this._listElement,this._status.element),this._show();break;case 4:M.hide(this._messageElement),M.show(this._listElement,this._status.element),this._show();break;case 5:M.hide(this._messageElement),M.show(this._listElement,this._status.element),this._details.show(),this._show();break}}_show(){this._status.show(),this._contentWidget.show(),this._layout(this._persistedSize.restore()),this._ctxSuggestWidgetVisible.set(!0),this._showTimeout.cancelAndSet(()=>{this.element.domNode.classList.add("visible"),this._onDidShow.fire(this)},100)}showTriggered(L,I){this._state===0&&(this._contentWidget.setPosition(this.editor.getPosition()),this._isAuto=!!L,this._isAuto||(this._loadingTimeout=u.disposableTimeout(()=>this._setState(1),I)))}showSuggestions(L,I,k,E){var T,O;if(this._contentWidget.setPosition(this.editor.getPosition()),(T=this._loadingTimeout)===null||T===void 0||T.dispose(),(O=this._currentSuggestionDetails)===null||O===void 0||O.cancel(),this._currentSuggestionDetails=void 0,this._completionModel!==L&&(this._completionModel=L),k&&this._state!==2&&this._state!==0){this._setState(4);return}const A=this._completionModel.items.length,B=A===0;if(this._ctxSuggestWidgetMultipleSuggestions.set(A>1),B){this._setState(E?0:2),this._completionModel=void 0;return}this._focusedItem=void 0,this._list.splice(0,this._list.length,this._completionModel.items),this._setState(k?4:3),this._list.reveal(I,0),this._list.setFocus([I]),this._layout(this.element.size),this._detailsBorderColor&&(this._details.widget.domNode.style.borderColor=this._detailsBorderColor)}selectNextPage(){switch(this._state){case 0:return!1;case 5:return this._details.widget.pageDown(),!0;case 1:return!this._isAuto;default:return this._list.focusNextPage(),!0}}selectNext(){switch(this._state){case 0:return!1;case 1:return!this._isAuto;default:return this._list.focusNext(1,!0),!0}}selectLast(){switch(this._state){case 0:return!1;case 5:return this._details.widget.scrollBottom(),!0;case 1:return!this._isAuto;default:return this._list.focusLast(),!0}}selectPreviousPage(){switch(this._state){case 0:return!1;case 5:return this._details.widget.pageUp(),!0;case 1:return!this._isAuto;default:return this._list.focusPreviousPage(),!0}}selectPrevious(){switch(this._state){case 0:return!1;case 1:return!this._isAuto;default:return this._list.focusPrevious(1,!0),!1}}selectFirst(){switch(this._state){case 0:return!1;case 5:return this._details.widget.scrollTop(),!0;case 1:return!this._isAuto;default:return this._list.focusFirst(),!0}}getFocusedItem(){if(this._state!==0&&this._state!==2&&this._state!==1&&this._completionModel)return{item:this._list.getFocusedElements()[0],index:this._list.getFocus()[0],model:this._completionModel}}toggleDetailsFocus(){this._state===5?(this._setState(3),this._detailsBorderColor&&(this._details.widget.domNode.style.borderColor=this._detailsBorderColor)):this._state===3&&this._isDetailsVisible()&&(this._setState(5),this._detailsFocusBorderColor&&(this._details.widget.domNode.style.borderColor=this._detailsFocusBorderColor))}toggleDetails(){this._isDetailsVisible()?(this._ctxSuggestWidgetDetailsVisible.set(!1),this._setDetailsVisible(!1),this._details.hide(),this.element.domNode.classList.remove("shows-details")):i.canExpandCompletionItem(this._list.getFocusedElements()[0])&&(this._state===3||this._state===5||this._state===4)&&(this._ctxSuggestWidgetDetailsVisible.set(!0),this._setDetailsVisible(!0),this.showDetails(!1))}showDetails(L){this._details.show(),L?this._details.widget.renderLoading():this._details.widget.renderItem(this._list.getFocusedElements()[0],this._explainMode),this._positionDetails(),this.editor.focus(),this.element.domNode.classList.add("shows-details")}toggleExplainMode(){this._list.getFocusedElements()[0]&&this._isDetailsVisible()&&(this._explainMode=!this._explainMode,this.showDetails(!1))}resetPersistedSize(){this._persistedSize.reset()}hideWidget(){var L;(L=this._loadingTimeout)===null||L===void 0||L.dispose(),this._setState(0),this._onDidHide.fire(this);const I=this._persistedSize.restore(),k=Math.ceil(this.getLayoutInfo().itemHeight*4.3);I&&I.heightF&&(B=F);const D=this._completionModel?this._completionModel.stats.pLabelLen*O.typicalHalfwidthCharacterWidth:B,R=O.statusBarHeight+this._list.contentHeight+O.borderHeight,W=O.itemHeight+O.statusBarHeight,x=M.getDomNodePagePosition(this.editor.getDomNode()),K=this.editor.getScrolledVisiblePosition(this.editor.getPosition()),Y=x.top+K.top+K.height,ee=Math.min(T.height-Y-O.verticalPadding,R),se=Math.min(x.top+K.top-O.verticalPadding,R);let ne=Math.min(Math.max(se,ee)+O.borderHeight,R);A===((I=this._cappedHeight)===null||I===void 0?void 0:I.capped)&&(A=this._cappedHeight.wanted),Ane&&(A=ne),A>ee?(this._contentWidget.setPreference(1),this.element.enableSashes(!0,!0,!1,!1),ne=se):(this._contentWidget.setPreference(2),this.element.enableSashes(!1,!0,!0,!1),ne=ee),this.element.preferredSize=new M.Dimension(D,O.defaultSize.height),this.element.maxSize=new M.Dimension(F,ne),this.element.minSize=new M.Dimension(220,W),this._cappedHeight=A===R?{wanted:(E=(k=this._cappedHeight)===null||k===void 0?void 0:k.wanted)!==null&&E!==void 0?E:L.height,capped:A}:void 0}this._resize(B,A)}}_resize(L,I){const{width:k,height:E}=this.element.maxSize;L=Math.min(k,L),I=Math.min(E,I);const{statusBarHeight:T}=this.getLayoutInfo();this._list.layout(I-T,L),this._listElement.style.height=`${I-T}px`,this.element.layout(I,L),this._contentWidget.layout(),this._positionDetails()}_positionDetails(){this._isDetailsVisible()&&this._details.placeAtAnchor(this.element.domNode)}getLayoutInfo(){const L=this.editor.getOption(38),I=m.clamp(this.editor.getOption(103)||L.lineHeight,8,1e3),k=!this.editor.getOption(101).showStatusBar||this._state===2||this._state===1?0:I,E=this._details.widget.borderWidth,T=2*E;return{itemHeight:I,statusBarHeight:k,borderWidth:E,borderHeight:T,typicalHalfwidthCharacterWidth:L.typicalHalfwidthCharacterWidth,verticalPadding:22,horizontalPadding:14,defaultSize:new M.Dimension(430,k+12*I+T)}}_isDetailsVisible(){return this._storageService.getBoolean("expandSuggestionDocs",0,!1)}_setDetailsVisible(L){this._storageService.store("expandSuggestionDocs",L,0,0)}};f.LOADING_MESSAGE=b.localize(5,null),f.NO_SUGGESTIONS_MESSAGE=b.localize(6,null),f=Me([_e(1,a.IStorageService),_e(2,g.IContextKeyService),_e(3,o.IThemeService),_e(4,r.IInstantiationService)],f),e.SuggestWidget=f;class v{constructor(L,I){this._widget=L,this._editor=I,this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._preferenceLocked=!1,this._added=!1,this._hidden=!1}dispose(){this._added&&(this._added=!1,this._editor.removeContentWidget(this))}getId(){return"editor.widget.suggestWidget"}getDomNode(){return this._widget.element.domNode}show(){this._hidden=!1,this._added||(this._added=!0,this._editor.addContentWidget(this))}hide(){this._hidden||(this._hidden=!0,this.layout())}layout(){this._editor.layoutContentWidget(this)}getPosition(){return this._hidden||!this._position||!this._preference?null:{position:this._position,preference:[this._preference]}}beforeRender(){const{height:L,width:I}=this._widget.element.size,{borderWidth:k,horizontalPadding:E}=this._widget.getLayoutInfo();return new M.Dimension(I+2*k+E,L+2*k)}afterRender(L){this._widget._afterRender(L)}setPreference(L){this._preferenceLocked||(this._preference=L)}lockPreference(){this._preferenceLocked=!0}unlockPreference(){this._preferenceLocked=!1}setPosition(L){this._position=L}}e.SuggestContentWidget=v,o.registerThemingParticipant((y,L)=>{const I=y.getColor(e.editorSuggestWidgetHighlightForeground);I&&L.addRule(`.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-highlighted-label .highlight { color: ${I}; }`);const k=y.getColor(e.editorSuggestWidgetForeground);k&&L.addRule(`.monaco-editor .suggest-widget, .monaco-editor .suggest-details { color: ${k}; }`);const E=y.getColor(s.textLinkForeground);E&&L.addRule(`.monaco-editor .suggest-details a { color: ${E}; }`);const T=y.getColor(s.textCodeBlockBackground);T&&L.addRule(`.monaco-editor .suggest-details code { background-color: ${T}; }`)})}),define(Q[667],J([0,1,11,80,7,6]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getIconsStyleSheet=void 0;function S(){const C=new w.Emitter,d=N.getIconRegistry();return d.onDidChange(()=>C.fire()),{onDidChange:C.event,getCSS(){const g={},p=o=>{let s=o.defaults;for(;b.ThemeIcon.isThemeIcon(s);){const u=d.getIcon(s.id);if(!u)return;s=u.defaults}const a=s.fontId;if(a){const u=d.getIconFont(a);if(u)return g[a]=u,`.codicon-${o.id}:before { content: '${s.fontCharacter}'; font-family: ${M.asCSSPropertyValue(a)}; }`}return`.codicon-${o.id}:before { content: '${s.fontCharacter}'; }`},c=[];for(let o of d.getIcons()){const s=p(o);s&&c.push(s)}for(let o in g){const a=g[o].definition.src.map(u=>`${M.asCSSUrl(u.location)} format('${u.format}')`).join(", ");c.push(`@font-face { src: ${a}; font-family: ${M.asCSSPropertyValue(o)}; }`)}return c.join(` +`)}}}e.getIconsStyleSheet=S}),define(Q[668],J([0,1,7,29,6,18,381,606,33,22,11,2,97,667]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneThemeServiceImpl=void 0;const a="vs",u="vs-dark",r="hc-black",i=d.Registry.as(g.Extensions.ColorContribution),n=d.Registry.as(p.Extensions.ThemingContribution);class t{constructor(v,y){this.semanticHighlighting=!1,this.themeData=y;let L=y.base;v.length>0?(l(v)?this.id=v:this.id=L+" "+v,this.themeName=v):(this.id=L,this.themeName=L),this.colors=null,this.defaultColors=Object.create(null),this._tokenTheme=null}get base(){return this.themeData.base}notifyBaseUpdated(){this.themeData.inherit&&(this.colors=null,this._tokenTheme=null)}getColors(){if(!this.colors){const v=new Map;for(let y in this.themeData.colors)v.set(y,N.Color.fromHex(this.themeData.colors[y]));if(this.themeData.inherit){let y=h(this.themeData.base);for(let L in y.colors)v.has(L)||v.set(L,N.Color.fromHex(y.colors[L]))}this.colors=v}return this.colors}getColor(v,y){const L=this.getColors().get(v);if(L)return L;if(y!==!1)return this.getDefault(v)}getDefault(v){let y=this.defaultColors[v];return y||(y=i.resolveDefaultColor(v,this),this.defaultColors[v]=y,y)}defines(v){return Object.prototype.hasOwnProperty.call(this.getColors(),v)}get type(){switch(this.base){case a:return o.ColorScheme.LIGHT;case r:return o.ColorScheme.HIGH_CONTRAST;default:return o.ColorScheme.DARK}}get tokenTheme(){if(!this._tokenTheme){let v=[],y=[];if(this.themeData.inherit){let L=h(this.themeData.base);v=L.rules,L.encodedTokensColors&&(y=L.encodedTokensColors)}v=v.concat(this.themeData.rules),this.themeData.encodedTokensColors&&(y=this.themeData.encodedTokensColors),this._tokenTheme=S.TokenTheme.createFromRawTokenTheme(v,y)}return this._tokenTheme}getTokenStyleMetadata(v,y,L){const k=this.tokenTheme._match([v].concat(y).join(".")).metadata,E=w.TokenMetadata.getForeground(k),T=w.TokenMetadata.getFontStyle(k);return{foreground:E,italic:Boolean(T&1),bold:Boolean(T&2),underline:Boolean(T&4)}}}function l(f){return f===a||f===u||f===r}function h(f){switch(f){case a:return C.vs;case u:return C.vs_dark;case r:return C.hc_black}}function m(f){let v=h(f);return new t(f,v)}class _ extends c.Disposable{constructor(){super();this._onColorThemeChange=this._register(new M.Emitter),this.onDidColorThemeChange=this._onColorThemeChange.event,this._environment=Object.create(null),this._autoDetectHighContrast=!0,this._knownThemes=new Map,this._knownThemes.set(a,m(a)),this._knownThemes.set(u,m(u)),this._knownThemes.set(r,m(r));const v=s.getIconsStyleSheet();this._codiconCSS=v.getCSS(),this._themeCSS="",this._allCSS=`${this._codiconCSS} +${this._themeCSS}`,this._globalStyleElement=null,this._styleElements=[],this._colorMapOverride=null,this.setTheme(a),v.onDidChange(()=>{this._codiconCSS=v.getCSS(),this._updateCSS()}),window.matchMedia("(forced-colors: active)").addEventListener("change",()=>{this._updateActualTheme()})}registerEditorContainer(v){return b.isInShadowDOM(v)?this._registerShadowDomContainer(v):this._registerRegularEditorContainer()}_registerRegularEditorContainer(){return this._globalStyleElement||(this._globalStyleElement=b.createStyleSheet(),this._globalStyleElement.className="monaco-colors",this._globalStyleElement.textContent=this._allCSS,this._styleElements.push(this._globalStyleElement)),c.Disposable.None}_registerShadowDomContainer(v){const y=b.createStyleSheet(v);return y.className="monaco-colors",y.textContent=this._allCSS,this._styleElements.push(y),{dispose:()=>{for(let L=0;L{L.base===v&&L.notifyBaseUpdated()}),this._theme.themeName===v&&this.setTheme(v)}getColorTheme(){return this._theme}setColorMapOverride(v){this._colorMapOverride=v,this._updateThemeOrColorMap()}setTheme(v){let y;this._knownThemes.has(v)?y=this._knownThemes.get(v):y=this._knownThemes.get(a),this._desiredTheme=y,this._updateActualTheme()}_updateActualTheme(){const v=this._autoDetectHighContrast&&window.matchMedia("(forced-colors: active)").matches?this._knownThemes.get(r):this._desiredTheme;this._theme!==v&&(this._theme=v,this._updateThemeOrColorMap())}setAutoDetectHighContrast(v){this._autoDetectHighContrast=v,this._updateActualTheme()}_updateThemeOrColorMap(){let v=[],y={},L={addRule:k=>{y[k]||(v.push(k),y[k]=!0)}};n.getThemingParticipants().forEach(k=>k(this._theme,L,this._environment));const I=this._colorMapOverride||this._theme.tokenTheme.getColorMap();L.addRule(S.generateTokensCSSForColorMap(I)),this._themeCSS=v.join(` +`),this._updateCSS(),w.TokenizationRegistry.setColorMap(I),this._onColorThemeChange.fire(this._theme)}_updateCSS(){this._allCSS=`${this._codiconCSS} +${this._themeCSS}`,this._styleElements.forEach(v=>v.textContent=this._allCSS)}getFileIconTheme(){return{hasFileIcons:!1,hasFolderIcons:!1,hidesExplorerArrows:!1}}}e.StandaloneThemeServiceImpl=_}),define(Q[148],J([0,1,9]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UndoRedoSource=e.UndoRedoGroup=e.ResourceEditStackSnapshot=e.IUndoRedoService=void 0,e.IUndoRedoService=b.createDecorator("undoRedoService");class N{constructor(C,d){this.resource=C,this.elements=d}}e.ResourceEditStackSnapshot=N;class M{constructor(){this.id=M._ID++,this.order=1}nextOrder(){return this.id===0?0:this.order++}}e.UndoRedoGroup=M,M._ID=0,M.None=new M;class w{constructor(){this.id=w._ID++,this.order=1}nextOrder(){return this.id===0?0:this.order++}}e.UndoRedoSource=w,w._ID=0,w.None=new w}),define(Q[269],J([0,1,6,2,17,12,38,31,18,141,137,46,15,23,11,77,148,89,236,43,253,247]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ModelSemanticColoring=e.isSemanticColoringEnabled=e.SEMANTIC_HIGHLIGHTING_SETTING_ID=e.ModelServiceImpl=void 0;function m(B){return B.toString()}function _(B){const F=new i.StringSHA1,D=B.createSnapshot();let R;for(;R=D.read();)F.update(R);return F.digest()}class f{constructor(F,D,R){this._modelEventListeners=new N.DisposableStore,this.model=F,this._languageSelection=null,this._languageSelectionListener=null,this._modelEventListeners.add(F.onWillDispose(()=>D(F))),this._modelEventListeners.add(F.onDidChangeLanguage(W=>R(F,W)))}_disposeLanguageSelection(){this._languageSelectionListener&&(this._languageSelectionListener.dispose(),this._languageSelectionListener=null),this._languageSelection&&(this._languageSelection.dispose(),this._languageSelection=null)}dispose(){this._modelEventListeners.dispose(),this._disposeLanguageSelection()}setLanguage(F){this._disposeLanguageSelection(),this._languageSelection=F,this._languageSelectionListener=this._languageSelection.onDidChange(()=>this.model.setMode(F.languageIdentifier)),this.model.setMode(F.languageIdentifier)}}const v=M.isLinux||M.isMacintosh?1:2;class y{constructor(F,D,R,W,x,K,Y,ee){this.uri=F,this.initialUndoRedoSnapshot=D,this.time=R,this.sharesUndoRedoStack=W,this.heapSize=x,this.sha1=K,this.versionId=Y,this.alternativeVersionId=ee}}function L(B){return B.scheme===t.Schemas.file||B.scheme===t.Schemas.vscodeRemote||B.scheme===t.Schemas.userData||B.scheme==="fake-fs"}let I=class st extends N.Disposable{constructor(F,D,R,W,x){super();this._configurationService=F,this._resourcePropertiesService=D,this._themeService=R,this._logService=W,this._undoRedoService=x,this._onModelAdded=this._register(new b.Emitter),this.onModelAdded=this._onModelAdded.event,this._onModelRemoved=this._register(new b.Emitter),this.onModelRemoved=this._onModelRemoved.event,this._onModelModeChanged=this._register(new b.Emitter),this.onModelModeChanged=this._onModelModeChanged.event,this._modelCreationOptionsByLanguageAndResource=Object.create(null),this._models={},this._disposedModels=new Map,this._disposedModelsHeapSize=0,this._semanticStyling=this._register(new T(this._themeService,this._logService)),this._register(this._configurationService.onDidChangeConfiguration(()=>this._updateModelOptions())),this._updateModelOptions(),this._register(new E(this,this._themeService,this._configurationService,this._semanticStyling))}static _readModelOptions(F,D){let R=S.EDITOR_MODEL_DEFAULTS.tabSize;if(F.editor&&typeof F.editor.tabSize!="undefined"){const le=parseInt(F.editor.tabSize,10);isNaN(le)||(R=le),R<1&&(R=1)}let W=R;if(F.editor&&typeof F.editor.indentSize!="undefined"&&F.editor.indentSize!=="tabSize"){const le=parseInt(F.editor.indentSize,10);isNaN(le)||(W=le),W<1&&(W=1)}let x=S.EDITOR_MODEL_DEFAULTS.insertSpaces;F.editor&&typeof F.editor.insertSpaces!="undefined"&&(x=F.editor.insertSpaces==="false"?!1:Boolean(F.editor.insertSpaces));let K=v;const Y=F.eol;Y===`\r +`?K=2:Y===` +`&&(K=1);let ee=S.EDITOR_MODEL_DEFAULTS.trimAutoWhitespace;F.editor&&typeof F.editor.trimAutoWhitespace!="undefined"&&(ee=F.editor.trimAutoWhitespace==="false"?!1:Boolean(F.editor.trimAutoWhitespace));let se=S.EDITOR_MODEL_DEFAULTS.detectIndentation;F.editor&&typeof F.editor.detectIndentation!="undefined"&&(se=F.editor.detectIndentation==="false"?!1:Boolean(F.editor.detectIndentation));let ne=S.EDITOR_MODEL_DEFAULTS.largeFileOptimizations;return F.editor&&typeof F.editor.largeFileOptimizations!="undefined"&&(ne=F.editor.largeFileOptimizations==="false"?!1:Boolean(F.editor.largeFileOptimizations)),{isForSimpleWidget:D,tabSize:R,indentSize:W,insertSpaces:x,detectIndentation:se,defaultEOL:K,trimAutoWhitespace:ee,largeFileOptimizations:ne}}_getEOL(F,D){if(F)return this._resourcePropertiesService.getEOL(F,D);const R=this._configurationService.getValue("files.eol",{overrideIdentifier:D});return R&&R!=="auto"?R:M.OS===3||M.OS===2?` +`:`\r +`}_shouldRestoreUndoStack(){const F=this._configurationService.getValue("files.restoreUndoStack");return typeof F=="boolean"?F:!0}getCreationOptions(F,D,R){let W=this._modelCreationOptionsByLanguageAndResource[F+D];if(!W){const x=this._configurationService.getValue("editor",{overrideIdentifier:F,resource:D}),K=this._getEOL(D,F);W=st._readModelOptions({editor:x,eol:K},R),this._modelCreationOptionsByLanguageAndResource[F+D]=W}return W}_updateModelOptions(){const F=this._modelCreationOptionsByLanguageAndResource;this._modelCreationOptionsByLanguageAndResource=Object.create(null);const D=Object.keys(this._models);for(let R=0,W=D.length;RF){const D=[];for(this._disposedModels.forEach(R=>{R.sharesUndoRedoStack||D.push(R)}),D.sort((R,W)=>R.time-W.time);D.length>0&&this._disposedModelsHeapSize>F;){const R=D.shift();this._removeDisposedModel(R.uri),R.initialUndoRedoSnapshot!==null&&this._undoRedoService.restoreSnapshot(R.initialUndoRedoSnapshot)}}}_createModelData(F,D,R,W){const x=this.getCreationOptions(D.language,R,W),K=new C.TextModel(F,x,D,R,this._undoRedoService);if(R&&this._disposedModels.has(m(R))){const se=this._removeDisposedModel(R),ne=this._undoRedoService.getElements(R),le=_(K)===se.sha1;if(le||se.sharesUndoRedoStack){for(const X of ne.past)n.isEditStackElement(X)&&X.matchesResource(R)&&X.setModel(K);for(const X of ne.future)n.isEditStackElement(X)&&X.matchesResource(R)&&X.setModel(K);this._undoRedoService.setElementsValidFlag(R,!0,X=>n.isEditStackElement(X)&&X.matchesResource(R)),le&&(K._overwriteVersionId(se.versionId),K._overwriteAlternativeVersionId(se.alternativeVersionId),K._overwriteInitialUndoRedoSnapshot(se.initialUndoRedoSnapshot))}else se.initialUndoRedoSnapshot!==null&&this._undoRedoService.restoreSnapshot(se.initialUndoRedoSnapshot)}const Y=m(K.uri);if(this._models[Y])throw new Error("ModelService: Cannot add model because it already exists!");const ee=new f(K,se=>this._onWillDispose(se),(se,ne)=>this._onDidChangeLanguage(se,ne));return this._models[Y]=ee,ee}createModel(F,D,R,W=!1){let x;return D?(x=this._createModelData(F,D.languageIdentifier,R,W),this.setMode(x.model,D)):x=this._createModelData(F,g.PLAINTEXT_LANGUAGE_IDENTIFIER,R,W),this._onModelAdded.fire(x.model),x.model}setMode(F,D){if(!!D){const R=this._models[m(F.uri)];!R||R.setLanguage(D)}}getModels(){const F=[],D=Object.keys(this._models);for(let R=0,W=D.length;R0||ee.future.length>0){for(const se of ee.past)n.isEditStackElement(se)&&se.matchesResource(F.uri)&&(x=!0,K+=se.heapSize(F.uri),se.setModel(F.uri));for(const se of ee.future)n.isEditStackElement(se)&&se.matchesResource(F.uri)&&(x=!0,K+=se.heapSize(F.uri),se.setModel(F.uri))}}const Y=st.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK;if(x)if(!W&&K>Y){const ee=R.model.getInitialUndoRedoSnapshot();ee!==null&&this._undoRedoService.restoreSnapshot(ee)}else this._ensureDisposedModelsHeapSize(Y-K),this._undoRedoService.setElementsValidFlag(F.uri,!1,ee=>n.isEditStackElement(ee)&&ee.matchesResource(F.uri)),this._insertDisposedModel(new y(F.uri,R.model.getInitialUndoRedoSnapshot(),Date.now(),W,K,_(F),F.getVersionId(),F.getAlternativeVersionId()));else if(!W){const ee=R.model.getInitialUndoRedoSnapshot();ee!==null&&this._undoRedoService.restoreSnapshot(ee)}delete this._models[D],R.dispose(),delete this._modelCreationOptionsByLanguageAndResource[F.getLanguageIdentifier().language+F.uri],this._onModelRemoved.fire(F)}_onDidChangeLanguage(F,D){const R=D.oldLanguage,W=F.getLanguageIdentifier().language,x=this.getCreationOptions(R,F.uri,F.isForSimpleWidget),K=this.getCreationOptions(W,F.uri,F.isForSimpleWidget);st._setModelOptionsForModel(F,K,x),this._onModelModeChanged.fire({model:F,oldModeId:R})}};I.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK=20*1024*1024,I=Me([_e(0,c.IConfigurationService),_e(1,p.ITextResourcePropertiesService),_e(2,a.IThemeService),_e(3,u.ILogService),_e(4,r.IUndoRedoService)],I),e.ModelServiceImpl=I,e.SEMANTIC_HIGHLIGHTING_SETTING_ID="editor.semanticHighlighting";function k(B,F,D){var R;const W=(R=D.getValue(e.SEMANTIC_HIGHLIGHTING_SETTING_ID,{overrideIdentifier:B.getLanguageIdentifier().language,resource:B.uri}))===null||R===void 0?void 0:R.enabled;return typeof W=="boolean"?W:F.getColorTheme().semanticHighlighting}e.isSemanticColoringEnabled=k;class E extends N.Disposable{constructor(F,D,R,W){super();this._watchers=Object.create(null),this._semanticStyling=W;const x=ee=>{this._watchers[ee.uri.toString()]=new A(ee,D,this._semanticStyling)},K=(ee,se)=>{se.dispose(),delete this._watchers[ee.uri.toString()]},Y=()=>{for(let ee of F.getModels()){const se=this._watchers[ee.uri.toString()];k(ee,D,R)?se||x(ee):se&&K(ee,se)}};this._register(F.onModelAdded(ee=>{k(ee,D,R)&&x(ee)})),this._register(F.onModelRemoved(ee=>{const se=this._watchers[ee.uri.toString()];se&&K(ee,se)})),this._register(R.onDidChangeConfiguration(ee=>{ee.affectsConfiguration(e.SEMANTIC_HIGHLIGHTING_SETTING_ID)&&Y()})),this._register(D.onDidColorThemeChange(Y))}}class T extends N.Disposable{constructor(F,D){super();this._themeService=F,this._logService=D,this._caches=new WeakMap,this._register(this._themeService.onDidColorThemeChange(()=>{this._caches=new WeakMap}))}get(F){return this._caches.has(F)||this._caches.set(F,new l.SemanticTokensProviderStyling(F.getLegend(),this._themeService,this._logService)),this._caches.get(F)}}class O{constructor(F,D,R){this._provider=F,this.resultId=D,this.data=R}dispose(){this._provider.releaseDocumentSemanticTokens(this.resultId)}}class A extends N.Disposable{constructor(F,D,R){super();this._isDisposed=!1,this._model=F,this._semanticStyling=R,this._fetchDocumentSemanticTokens=this._register(new o.RunOnceScheduler(()=>this._fetchDocumentSemanticTokensNow(),A.FETCH_DOCUMENT_SEMANTIC_TOKENS_DELAY)),this._currentDocumentResponse=null,this._currentDocumentRequestCancellationTokenSource=null,this._documentProvidersChangeListeners=[],this._register(this._model.onDidChangeContent(()=>{this._fetchDocumentSemanticTokens.isScheduled()||this._fetchDocumentSemanticTokens.schedule()}));const W=()=>{N.dispose(this._documentProvidersChangeListeners),this._documentProvidersChangeListeners=[];for(const x of d.DocumentSemanticTokensProviderRegistry.all(F))typeof x.onDidChange=="function"&&this._documentProvidersChangeListeners.push(x.onDidChange(()=>this._fetchDocumentSemanticTokens.schedule(0)))};W(),this._register(d.DocumentSemanticTokensProviderRegistry.onDidChange(()=>{W(),this._fetchDocumentSemanticTokens.schedule()})),this._register(D.onDidColorThemeChange(x=>{this._setDocumentSemanticTokens(null,null,null,[]),this._fetchDocumentSemanticTokens.schedule()})),this._fetchDocumentSemanticTokens.schedule(0)}dispose(){this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._currentDocumentRequestCancellationTokenSource&&(this._currentDocumentRequestCancellationTokenSource.cancel(),this._currentDocumentRequestCancellationTokenSource=null),this._setDocumentSemanticTokens(null,null,null,[]),this._isDisposed=!0,super.dispose()}_fetchDocumentSemanticTokensNow(){if(!this._currentDocumentRequestCancellationTokenSource){const F=new s.CancellationTokenSource,D=this._currentDocumentResponse&&this._currentDocumentResponse.resultId||null,R=h.getDocumentSemanticTokens(this._model,D,F.token);if(!R){this._currentDocumentResponse&&this._model.setSemanticTokens(null,!1);return}const{provider:W,request:x}=R;this._currentDocumentRequestCancellationTokenSource=F;const K=[],Y=this._model.onDidChangeContent(se=>{K.push(se)}),ee=this._semanticStyling.get(W);x.then(se=>{this._currentDocumentRequestCancellationTokenSource=null,Y.dispose(),this._setDocumentSemanticTokens(W,se||null,ee,K)},se=>{se&&(w.isPromiseCanceledError(se)||typeof se.message=="string"&&se.message.indexOf("busy")!==-1)||w.onUnexpectedError(se),this._currentDocumentRequestCancellationTokenSource=null,Y.dispose(),K.length>0&&(this._fetchDocumentSemanticTokens.isScheduled()||this._fetchDocumentSemanticTokens.schedule())})}}static _copy(F,D,R,W,x){for(let K=0;K{W.length>0&&!this._fetchDocumentSemanticTokens.isScheduled()&&this._fetchDocumentSemanticTokens.schedule()};if(this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._isDisposed){F&&D&&F.releaseDocumentSemanticTokens(D.resultId);return}if(!F||!R){this._model.setSemanticTokens(null,!1);return}if(!D){this._model.setSemanticTokens(null,!0),K();return}if(h.isSemanticTokensEdits(D)){if(!x){this._model.setSemanticTokens(null,!0);return}if(D.edits.length===0)D={resultId:D.resultId,data:x.data};else{let Y=0;for(const X of D.edits)Y+=(X.data?X.data.length:0)-X.deleteCount;const ee=x.data,se=new Uint32Array(ee.length+Y);let ne=ee.length,le=se.length;for(let X=D.edits.length-1;X>=0;X--){const z=D.edits[X],P=ne-(z.start+z.deleteCount);P>0&&(A._copy(ee,ne-P,se,le-P,P),le-=P),z.data&&(A._copy(z.data,0,se,le-z.data.length,z.data.length),le-=z.data.length),ne=z.start}ne>0&&A._copy(ee,0,se,0,ne),D={resultId:D.resultId,data:se}}}if(h.isSemanticTokens(D)){this._currentDocumentResponse=new O(F,D.resultId,D.data);const Y=l.toMultilineTokens2(D,R,this._model.getLanguageIdentifier());if(W.length>0)for(const ee of W)for(const se of Y)for(const ne of ee.changes)se.applyEdit(ne.range,ne.text);this._model.setSemanticTokens(Y,!0)}else this._model.setSemanticTokens(null,!0);K()}}e.ModelSemanticColoring=A,A.FETCH_DOCUMENT_SEMANTIC_TOKENS_DELAY=300}),define(Q[669],J([0,1,7,29,6,2,43,44,144,3,31,67,601,485,9,115,147,22,11,118,132,210,148,37,345]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReferenceWidget=e.LayoutData=void 0;class f{constructor(k,E){this._editor=k,this._model=E,this._decorations=new Map,this._decorationIgnoreSet=new Set,this._callOnDispose=new w.DisposableStore,this._callOnModelChange=new w.DisposableStore,this._callOnDispose.add(this._editor.onDidChangeModel(()=>this._onModelChanged())),this._onModelChanged()}dispose(){this._callOnModelChange.dispose(),this._callOnDispose.dispose(),this.removeDecorations()}_onModelChanged(){this._callOnModelChange.clear();const k=this._editor.getModel();if(!!k){for(let E of this._model.references)if(E.uri.toString()===k.uri.toString()){this._addDecorations(E.parent);return}}}_addDecorations(k){if(!!this._editor.hasModel()){this._callOnModelChange.add(this._editor.getModel().onDidChangeDecorations(()=>this._onDecorationChanged()));const E=[],T=[];for(let A=0,B=k.children.length;A{A.equals(9)&&(this._keybindingService.dispatchEvent(A,A.target),A.stopPropagation())},!0)),this._tree=this._instantiationService.createInstance(y,"ReferencesWidget",this._treeContainer,new o.Delegate,[this._instantiationService.createInstance(o.FileReferencesRenderer),this._instantiationService.createInstance(o.OneReferenceRenderer)],this._instantiationService.createInstance(o.DataSource),T),this._splitView.addView({onDidChange:M.Event.None,element:this._previewContainer,minimumSize:200,maximumSize:Number.MAX_VALUE,layout:A=>{this._preview.layout({height:this._dim.height,width:A})}},h.Sizing.Distribute),this._splitView.addView({onDidChange:M.Event.None,element:this._treeContainer,minimumSize:100,maximumSize:Number.MAX_VALUE,layout:A=>{this._treeContainer.style.height=`${this._dim.height}px`,this._treeContainer.style.width=`${A}px`,this._tree.layout(this._dim.height,A)}},h.Sizing.Distribute),this._disposables.add(this._splitView.onDidSashChange(()=>{this._dim.width&&(this.layoutData.ratio=this._splitView.getViewSize(0)/this._dim.width)},void 0));let O=(A,B)=>{A instanceof l.OneReference&&(B==="show"&&this._revealReference(A,!1),this._onDidSelectReference.fire({element:A,kind:B,source:"tree"}))};this._tree.onDidOpen(A=>{A.sideBySide?O(A.element,"side"):A.editorOptions.pinned?O(A.element,"goto"):O(A.element,"show")}),b.hide(this._treeContainer)}_onWidth(k){this._dim&&this._doLayoutBody(this._dim.height,k)}_doLayoutBody(k,E){super._doLayoutBody(k,E),this._dim=new b.Dimension(E,k),this.layoutData.heightInLines=this._viewZone?this._viewZone.heightInLines:this.layoutData.heightInLines,this._splitView.layout(E),this._splitView.resizeView(0,E*this.layoutData.ratio)}setSelection(k){return this._revealReference(k,!0).then(()=>{!this._model||(this._tree.setSelection([k]),this._tree.setFocus([k]))})}setModel(k){return this._disposeOnNewModel.clear(),this._model=k,this._model?this._onNewModel():Promise.resolve()}_onNewModel(){return this._model?this._model.isEmpty?(this.setTitle(""),this._messageContainer.innerText=s.localize(1,null),b.show(this._messageContainer),Promise.resolve(void 0)):(b.hide(this._messageContainer),this._decorationsManager=new f(this._preview,this._model),this._disposeOnNewModel.add(this._decorationsManager),this._disposeOnNewModel.add(this._model.onDidChangeReferenceRange(k=>this._tree.rerender(k))),this._disposeOnNewModel.add(this._preview.onMouseDown(k=>{const{event:E,target:T}=k;if(E.detail===2){const O=this._getFocusedReference();!O||this._onDidSelectReference.fire({element:{uri:O.uri,range:T.range},kind:E.ctrlKey||E.metaKey||E.altKey?"side":"open",source:"editor"})}})),this.container.classList.add("results-loaded"),b.show(this._treeContainer),b.show(this._previewContainer),this._splitView.layout(this._dim.width),this.focusOnReferenceTree(),this._tree.setInput(this._model.groups.length===1?this._model.groups[0]:this._model)):Promise.resolve(void 0)}_getFocusedReference(){const[k]=this._tree.getFocus();if(k instanceof l.OneReference)return k;if(k instanceof l.FileReferences&&k.children.length>0)return k.children[0]}revealReference(k){return Ie(this,void 0,void 0,function*(){yield this._revealReference(k,!1),this._onDidSelectReference.fire({element:k,kind:"goto",source:"tree"})})}_revealReference(k,E){return Ie(this,void 0,void 0,function*(){if(this._revealedReference!==k){this._revealedReference=k,k.uri.scheme!==S.Schemas.inMemory?this.setTitle(C.basenameOrAuthority(k.uri),this._uriLabel.getUriLabel(C.dirname(k.uri))):this.setTitle(s.localize(2,null));const T=this._textModelResolverService.createModelReference(k.uri);this._tree.getInput()===k.parent?this._tree.reveal(k):(E&&this._tree.reveal(k.parent),yield this._tree.expand(k.parent),this._tree.reveal(k));const O=yield T;if(!this._model){O.dispose();return}w.dispose(this._previewModelReference);const A=O.object;if(A){const B=this._preview.getModel()===A.textEditorModel?0:1,F=g.Range.lift(k.range).collapseToStart();this._previewModelReference=O,this._preview.setModel(A.textEditorModel),this._preview.setSelection(F),this._preview.revealRangeInCenter(F,B)}else this._preview.setModel(this._previewNotAvailableMessage),O.dispose()}})}};L=Me([_e(3,n.IThemeService),_e(4,c.ITextModelService),_e(5,a.IInstantiationService),_e(6,t.IPeekViewService),_e(7,u.ILabelService),_e(8,m.IUndoRedoService),_e(9,_.IKeybindingService)],L),e.ReferenceWidget=L,n.registerThemingParticipant((I,k)=>{const E=I.getColor(t.peekViewResultsMatchHighlight);E&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree .referenceMatch .highlight { background-color: ${E}; }`);const T=I.getColor(t.peekViewEditorMatchHighlight);T&&k.addRule(`.monaco-editor .reference-zone-widget .preview .reference-decoration { background-color: ${T}; }`);const O=I.getColor(t.peekViewEditorMatchHighlightBorder);O&&k.addRule(`.monaco-editor .reference-zone-widget .preview .reference-decoration { border: 2px solid ${O}; box-sizing: border-box; }`);const A=I.getColor(i.activeContrastBorder);A&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree .referenceMatch .highlight { border: 1px dotted ${A}; box-sizing: border-box; }`);const B=I.getColor(t.peekViewResultsBackground);B&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree { background-color: ${B}; }`);const F=I.getColor(t.peekViewResultsMatchForeground);F&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree { color: ${F}; }`);const D=I.getColor(t.peekViewResultsFileForeground);D&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree .reference-file { color: ${D}; }`);const R=I.getColor(t.peekViewResultsSelectionBackground);R&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .monaco-list-rows > .monaco-list-row.selected:not(.highlighted) { background-color: ${R}; }`);const W=I.getColor(t.peekViewResultsSelectionForeground);W&&k.addRule(`.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .monaco-list-rows > .monaco-list-row.selected:not(.highlighted) { color: ${W} !important; }`);const x=I.getColor(t.peekViewEditorBackground);x&&k.addRule(`.monaco-editor .reference-zone-widget .preview .monaco-editor .monaco-editor-background,.monaco-editor .reference-zone-widget .preview .monaco-editor .inputarea.ime-input { background-color: ${x};}`);const K=I.getColor(t.peekViewEditorGutterBackground);K&&k.addRule(`.monaco-editor .reference-zone-widget .preview .monaco-editor .margin { background-color: ${K};}`)})}),define(Q[270],J([0,1,483,12,2,28,9,16,46,79,132,669,3,14,32,15,118,147,86,39,26]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ReferencesController=e.ctxReferenceSearchVisible=void 0,e.ctxReferenceSearchVisible=new C.RawContextKey("referenceSearchVisible",!1);let h=class yt{constructor(f,v,y,L,I,k,E,T){this._defaultTreeKeyboardSupport=f,this._editor=v,this._editorService=L,this._notificationService=I,this._instantiationService=k,this._storageService=E,this._configurationService=T,this._disposables=new M.DisposableStore,this._requestIdPool=0,this._ignoreModelChangeEvent=!1,this._referenceSearchVisible=e.ctxReferenceSearchVisible.bindTo(y)}static get(f){return f.getContribution(yt.ID)}dispose(){var f,v;this._referenceSearchVisible.reset(),this._disposables.dispose(),(f=this._widget)===null||f===void 0||f.dispose(),(v=this._model)===null||v===void 0||v.dispose(),this._widget=void 0,this._model=void 0}toggleWidget(f,v,y){let L;if(this._widget&&(L=this._widget.position),this.closeWidget(),!(!!L&&f.containsPosition(L))){this._peekMode=y,this._referenceSearchVisible.set(!0),this._disposables.add(this._editor.onDidChangeModelLanguage(()=>{this.closeWidget()})),this._disposables.add(this._editor.onDidChangeModel(()=>{this._ignoreModelChangeEvent||this.closeWidget()}));const I="peekViewLayout",k=c.LayoutData.fromJSON(this._storageService.get(I,0,"{}"));this._widget=this._instantiationService.createInstance(c.ReferenceWidget,this._editor,this._defaultTreeKeyboardSupport,k),this._widget.setTitle(b.localize(0,null)),this._widget.show(f),this._disposables.add(this._widget.onDidClose(()=>{v.cancel(),this._widget&&(this._storageService.store(I,JSON.stringify(this._widget.layoutData),0,1),this._widget=void 0),this.closeWidget()})),this._disposables.add(this._widget.onDidSelectReference(T=>{let{element:O,kind:A}=T;if(!!O)switch(A){case"open":(T.source!=="editor"||!this._configurationService.getValue("editor.stablePeek"))&&this.openReference(O,!1,!1);break;case"side":this.openReference(O,!0,!1);break;case"goto":y?this._gotoReference(O):this.openReference(O,!1,!0);break}}));const E=++this._requestIdPool;v.then(T=>{var O;if(E!==this._requestIdPool||!this._widget){T.dispose();return}return(O=this._model)===null||O===void 0||O.dispose(),this._model=T,this._widget.setModel(this._model).then(()=>{if(this._widget&&this._model&&this._editor.hasModel()){this._model.isEmpty?this._widget.setMetaTitle(""):this._widget.setMetaTitle(b.localize(1,null,this._model.title,this._model.references.length));let A=this._editor.getModel().uri,B=new s.Position(f.startLineNumber,f.startColumn),F=this._model.nearestReference(A,B);if(F)return this._widget.setSelection(F).then(()=>{this._widget&&this._editor.getOption(71)==="editor"&&this._widget.focusOnPreviewEditor()})}})},T=>{this._notificationService.error(T)})}}changeFocusBetweenPreviewAndReferences(){!this._widget||(this._widget.isPreviewEditorFocused()?this._widget.focusOnReferenceTree():this._widget.focusOnPreviewEditor())}goToNextOrPreviousReference(f){return Ie(this,void 0,void 0,function*(){if(!(!this._editor.hasModel()||!this._model||!this._widget)){const v=this._widget.position;if(!!v){const y=this._model.nearestReference(this._editor.getModel().uri,v);if(!!y){const L=this._model.nextOrPreviousReference(y,f),I=this._editor.hasTextFocus(),k=this._widget.isPreviewEditorFocused();yield this._widget.setSelection(L),yield this._gotoReference(L),I?this._editor.focus():this._widget&&k&&this._widget.focusOnPreviewEditor()}}}})}revealReference(f){return Ie(this,void 0,void 0,function*(){!this._editor.hasModel()||!this._model||!this._widget||(yield this._widget.revealReference(f))})}closeWidget(f=!0){var v,y;(v=this._widget)===null||v===void 0||v.dispose(),(y=this._model)===null||y===void 0||y.dispose(),this._referenceSearchVisible.reset(),this._disposables.clear(),this._widget=void 0,this._model=void 0,f&&this._editor.focus(),this._requestIdPool+=1}_gotoReference(f){this._widget&&this._widget.hide(),this._ignoreModelChangeEvent=!0;const v=o.Range.lift(f.range).collapseToStart();return this._editorService.openCodeEditor({resource:f.uri,options:{selection:v}},this._editor).then(y=>{var L;if(this._ignoreModelChangeEvent=!1,!y||!this._widget){this.closeWidget();return}if(this._editor===y)this._widget.show(v),this._widget.focusOnReferenceTree();else{const I=yt.get(y),k=this._model.clone();this.closeWidget(),y.focus(),I.toggleWidget(v,u.createCancelablePromise(E=>Promise.resolve(k)),(L=this._peekMode)!==null&&L!==void 0?L:!1)}},y=>{this._ignoreModelChangeEvent=!1,N.onUnexpectedError(y)})}openReference(f,v,y){v||this.closeWidget();const{uri:L,range:I}=f;this._editorService.openCodeEditor({resource:L,options:{selection:I,pinned:y}},this._editor,v)}};h.ID="editor.contrib.referencesController",h=Me([_e(2,C.IContextKeyService),_e(3,w.ICodeEditorService),_e(4,a.INotificationService),_e(5,S.IInstantiationService),_e(6,g.IStorageService),_e(7,d.IConfigurationService)],h),e.ReferencesController=h;function m(_,f){const v=r.getOuterEditor(_);if(!!v){let y=h.get(v);y&&f(y)}}n.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"togglePeekWidgetFocus",weight:100,primary:t.KeyChord(2048|41,60),when:C.ContextKeyExpr.or(e.ctxReferenceSearchVisible,r.PeekContext.inPeekEditor),handler(_){m(_,f=>{f.changeFocusBetweenPreviewAndReferences()})}}),n.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"goToNextReference",weight:100-10,primary:62,secondary:[70],when:C.ContextKeyExpr.or(e.ctxReferenceSearchVisible,r.PeekContext.inPeekEditor),handler(_){m(_,f=>{f.goToNextOrPreviousReference(!0)})}}),n.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"goToPreviousReference",weight:100-10,primary:1024|62,secondary:[1024|70],when:C.ContextKeyExpr.or(e.ctxReferenceSearchVisible,r.PeekContext.inPeekEditor),handler(_){m(_,f=>{f.goToNextOrPreviousReference(!1)})}}),l.CommandsRegistry.registerCommandAlias("goToNextReferenceFromEmbeddedEditor","goToNextReference"),l.CommandsRegistry.registerCommandAlias("goToPreviousReferenceFromEmbeddedEditor","goToPreviousReference"),l.CommandsRegistry.registerCommandAlias("closeReferenceSearchEditor","closeReferenceSearch"),l.CommandsRegistry.registerCommand("closeReferenceSearch",_=>m(_,f=>f.closeWidget())),n.KeybindingsRegistry.registerKeybindingRule({id:"closeReferenceSearch",weight:100-101,primary:9,secondary:[1024|9],when:C.ContextKeyExpr.and(r.PeekContext.inPeekEditor,C.ContextKeyExpr.not("config.editor.stablePeek"))}),n.KeybindingsRegistry.registerKeybindingRule({id:"closeReferenceSearch",weight:200+50,primary:9,secondary:[1024|9],when:C.ContextKeyExpr.and(e.ctxReferenceSearchVisible,C.ContextKeyExpr.not("config.editor.stablePeek"))}),n.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"revealReference",weight:200,primary:3,mac:{primary:3,secondary:[2048|18]},when:C.ContextKeyExpr.and(e.ctxReferenceSearchVisible,i.WorkbenchListFocusContextKey),handler(_){var f;const y=(f=_.get(i.IListService).lastFocusedList)===null||f===void 0?void 0:f.getFocus();Array.isArray(y)&&y[0]instanceof p.OneReference&&m(_,L=>L.revealReference(y[0]))}}),n.KeybindingsRegistry.registerCommandAndKeybindingRule({id:"openReferenceToSide",weight:100,primary:2048|3,mac:{primary:256|3},when:C.ContextKeyExpr.and(e.ctxReferenceSearchVisible,i.WorkbenchListFocusContextKey),handler(_){var f;const y=(f=_.get(i.IListService).lastFocusedList)===null||f===void 0?void 0:f.getFocus();Array.isArray(y)&&y[0]instanceof p.OneReference&&m(_,L=>L.openReference(y[0],!0,!0))}}),l.CommandsRegistry.registerCommand("openReference",_=>{var f;const y=(f=_.get(i.IListService).lastFocusedList)===null||f===void 0?void 0:f.getFocus();Array.isArray(y)&&y[0]instanceof p.OneReference&&m(_,L=>L.openReference(y[0],!1,!0))})}),define(Q[271],J([0,1,47,15,39,17,108,13,28,14,3,25,18,146,118,270,132,481,34,16,32,59,262,26,70,625,35,24,9,20,144]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I,k,E){"use strict";var T,O,A,B,F,D,R,W;Object.defineProperty(e,"__esModule",{value:!0}),e.DefinitionAction=void 0,n.MenuRegistry.appendMenuItem(n.MenuId.EditorContext,{submenu:n.MenuId.EditorContextPeek,title:i.localize(0,null),group:"navigation",order:100});class x extends C.EditorAction{constructor(P,V){super(V);this._configuration=P}run(P,V){if(!V.hasModel())return Promise.resolve(void 0);const U=P.get(l.INotificationService),H=P.get(d.ICodeEditorService),$=P.get(h.IEditorProgressService),ie=P.get(v.ISymbolNavigationService),oe=V.getModel(),ae=V.getPosition(),G=new f.EditorStateCancellationTokenSource(V,1|4),j=N.raceCancellation(this._getLocationModel(oe,ae,G.token),G.token).then(te=>Ie(this,void 0,void 0,function*(){if(!(!te||G.token.isCancellationRequested)){b.alert(te.ariaMessage);let Z;if(te.referenceAt(oe.uri,ae)){const he=this._getAlternativeCommand(V);he!==this.id&&(Z=V.getAction(he))}const ue=te.references.length;if(ue===0){if(!this._configuration.muteMessage){const he=oe.getWordAtPosition(ae);s.MessageController.get(V).showMessage(this._getNoResultFoundMessage(he),ae)}}else if(ue===1&&Z)Z.run();else return this._onResult(H,ie,V,te)}}),te=>{U.error(te)}).finally(()=>{G.dispose()});return $.showWhile(j,250),j}_onResult(P,V,U,H){return Ie(this,void 0,void 0,function*(){const $=this._getGoToPreference(U);if(!(U instanceof E.EmbeddedCodeEditorWidget)&&(this._configuration.openInPeek||$==="peek"&&H.references.length>1))this._openInPeek(U,H);else{const ie=H.firstReference(),oe=H.references.length>1&&$==="gotoAndPeek",ae=yield this._openReference(U,P,ie,this._configuration.openToSide,!oe);oe&&ae?this._openInPeek(ae,H):H.dispose(),$==="goto"&&V.put(ie)}})}_openReference(P,V,U,H,$){return Ie(this,void 0,void 0,function*(){let ie;if(o.isLocationLink(U)&&(ie=U.targetSelectionRange),ie||(ie=U.range),!!ie){const oe=yield V.openCodeEditor({resource:U.uri,options:{selection:p.Range.collapseToStart(ie),selectionRevealType:3}},P,H);if(!!oe){if($){const ae=oe.getModel(),G=oe.deltaDecorations([],[{range:ie,options:{className:"symbolHighlight"}}]);setTimeout(()=>{oe.getModel()===ae&&oe.deltaDecorations(G,[])},350)}return oe}}})}_openInPeek(P,V){let U=u.ReferencesController.get(P);U&&P.hasModel()?U.toggleWidget(P.getSelection(),N.createCancelablePromise(H=>Promise.resolve(V)),this._configuration.openInPeek):V.dispose()}}class K extends x{_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(yield m.getDefinitionsAtPosition(P,V,U),i.localize(1,null))})}_getNoResultFoundMessage(P){return P&&P.word?i.localize(2,null,P.word):i.localize(3,null)}_getAlternativeCommand(P){return P.getOption(45).alternativeDefinitionCommand}_getGoToPreference(P){return P.getOption(45).multipleDefinitions}}e.DefinitionAction=K;const Y=w.isWeb&&!y.isStandalone?2048|70:70;C.registerEditorAction((T=class Lt extends K{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:Lt.id,label:i.localize(4,null),alias:"Go to Definition",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasDefinitionProvider,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:Y,weight:100},contextMenuOpts:{group:"navigation",order:1.1},menuOpts:{menuId:n.MenuId.MenubarGoMenu,group:"4_symbol_nav",order:2,title:i.localize(5,null)}});_.CommandsRegistry.registerCommandAlias("editor.action.goToDeclaration",Lt.id)}},T.id="editor.action.revealDefinition",T)),C.registerEditorAction((O=class Et extends K{constructor(){super({openToSide:!0,openInPeek:!1,muteMessage:!1},{id:Et.id,label:i.localize(6,null),alias:"Open Definition to the Side",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasDefinitionProvider,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:M.KeyChord(2048|41,Y),weight:100}});_.CommandsRegistry.registerCommandAlias("editor.action.openDeclarationToTheSide",Et.id)}},O.id="editor.action.revealDefinitionAside",O)),C.registerEditorAction((A=class Dt extends K{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:Dt.id,label:i.localize(7,null),alias:"Peek Definition",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasDefinitionProvider,a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:512|70,linux:{primary:2048|1024|68},weight:100},contextMenuOpts:{menuId:n.MenuId.EditorContextPeek,group:"peek",order:2}});_.CommandsRegistry.registerCommandAlias("editor.action.previewDeclaration",Dt.id)}},A.id="editor.action.peekDefinition",A));class ee extends x{_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(yield m.getDeclarationsAtPosition(P,V,U),i.localize(8,null))})}_getNoResultFoundMessage(P){return P&&P.word?i.localize(9,null,P.word):i.localize(10,null)}_getAlternativeCommand(P){return P.getOption(45).alternativeDeclarationCommand}_getGoToPreference(P){return P.getOption(45).multipleDeclarations}}C.registerEditorAction((B=class Yt extends ee{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:Yt.id,label:i.localize(11,null),alias:"Go to Declaration",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasDeclarationProvider,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),contextMenuOpts:{group:"navigation",order:1.3},menuOpts:{menuId:n.MenuId.MenubarGoMenu,group:"4_symbol_nav",order:3,title:i.localize(12,null)}})}_getNoResultFoundMessage(P){return P&&P.word?i.localize(13,null,P.word):i.localize(14,null)}},B.id="editor.action.revealDeclaration",B)),C.registerEditorAction(class extends ee{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:"editor.action.peekDeclaration",label:i.localize(15,null),alias:"Peek Declaration",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasDeclarationProvider,a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),contextMenuOpts:{menuId:n.MenuId.EditorContextPeek,group:"peek",order:3}})}});class se extends x{_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(yield m.getTypeDefinitionsAtPosition(P,V,U),i.localize(16,null))})}_getNoResultFoundMessage(P){return P&&P.word?i.localize(17,null,P.word):i.localize(18,null)}_getAlternativeCommand(P){return P.getOption(45).alternativeTypeDefinitionCommand}_getGoToPreference(P){return P.getOption(45).multipleTypeDefinitions}}C.registerEditorAction((F=class Zt extends se{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:Zt.ID,label:i.localize(19,null),alias:"Go to Type Definition",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasTypeDefinitionProvider,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:0,weight:100},contextMenuOpts:{group:"navigation",order:1.4},menuOpts:{menuId:n.MenuId.MenubarGoMenu,group:"4_symbol_nav",order:3,title:i.localize(20,null)}})}},F.ID="editor.action.goToTypeDefinition",F)),C.registerEditorAction((D=class Xt extends se{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:Xt.ID,label:i.localize(21,null),alias:"Peek Type Definition",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasTypeDefinitionProvider,a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),contextMenuOpts:{menuId:n.MenuId.EditorContextPeek,group:"peek",order:4}})}},D.ID="editor.action.peekTypeDefinition",D));class ne extends x{_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(yield m.getImplementationsAtPosition(P,V,U),i.localize(22,null))})}_getNoResultFoundMessage(P){return P&&P.word?i.localize(23,null,P.word):i.localize(24,null)}_getAlternativeCommand(P){return P.getOption(45).alternativeImplementationCommand}_getGoToPreference(P){return P.getOption(45).multipleImplementations}}C.registerEditorAction((R=class Qt extends ne{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:Qt.ID,label:i.localize(25,null),alias:"Go to Implementations",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasImplementationProvider,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:2048|70,weight:100},menuOpts:{menuId:n.MenuId.MenubarGoMenu,group:"4_symbol_nav",order:4,title:i.localize(26,null)},contextMenuOpts:{group:"navigation",order:1.45}})}},R.ID="editor.action.goToImplementation",R)),C.registerEditorAction((W=class Jt extends ne{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:Jt.ID,label:i.localize(27,null),alias:"Peek Implementations",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasImplementationProvider,a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:2048|1024|70,weight:100},contextMenuOpts:{menuId:n.MenuId.EditorContextPeek,group:"peek",order:5}})}},W.ID="editor.action.peekImplementation",W));class le extends x{_getNoResultFoundMessage(P){return P?i.localize(28,null,P.word):i.localize(29,null)}_getAlternativeCommand(P){return P.getOption(45).alternativeReferenceCommand}_getGoToPreference(P){return P.getOption(45).multipleReferences}}C.registerEditorAction(class extends le{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:"editor.action.goToReferences",label:i.localize(30,null),alias:"Go to References",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasReferenceProvider,a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:c.EditorContextKeys.editorTextFocus,primary:1024|70,weight:100},contextMenuOpts:{group:"navigation",order:1.45},menuOpts:{menuId:n.MenuId.MenubarGoMenu,group:"4_symbol_nav",order:5,title:i.localize(31,null)}})}_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(yield m.getReferencesAtPosition(P,V,!0,U),i.localize(32,null))})}}),C.registerEditorAction(class extends le{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:"editor.action.referenceSearch.trigger",label:i.localize(33,null),alias:"Peek References",precondition:t.ContextKeyExpr.and(c.EditorContextKeys.hasReferenceProvider,a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated()),contextMenuOpts:{menuId:n.MenuId.EditorContextPeek,group:"peek",order:6}})}_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(yield m.getReferencesAtPosition(P,V,!1,U),i.localize(34,null))})}});class X extends x{constructor(P,V,U){super(P,{id:"editor.action.goToLocation",label:i.localize(35,null),alias:"Go To Any Symbol",precondition:t.ContextKeyExpr.and(a.PeekContext.notInPeekEditor,c.EditorContextKeys.isInWalkThroughSnippet.toNegated())});this._references=V,this._gotoMultipleBehaviour=U}_getLocationModel(P,V,U){return Ie(this,void 0,void 0,function*(){return new r.ReferencesModel(this._references,i.localize(36,null))})}_getNoResultFoundMessage(P){return P&&i.localize(37,null,P.word)||""}_getGoToPreference(P){var V;return(V=this._gotoMultipleBehaviour)!==null&&V!==void 0?V:P.getOption(45).multipleReferences}_getAlternativeCommand(){return""}}_.CommandsRegistry.registerCommand({id:"editor.action.goToLocations",description:{description:"Go to locations from a position in a file",args:[{name:"uri",description:"The text document in which to start",constraint:L.URI},{name:"position",description:"The position at which to start",constraint:g.Position.isIPosition},{name:"locations",description:"An array of locations.",constraint:Array},{name:"multiple",description:"Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto"},{name:"noResultsMessage",description:"Human readable message that shows when locations is empty."}]},handler:(z,P,V,U,H,$,ie)=>Ie(void 0,void 0,void 0,function*(){k.assertType(L.URI.isUri(P)),k.assertType(g.Position.isIPosition(V)),k.assertType(Array.isArray(U)),k.assertType(typeof H=="undefined"||typeof H=="string"),k.assertType(typeof ie=="undefined"||typeof ie=="boolean");const oe=z.get(d.ICodeEditorService),ae=yield oe.openCodeEditor({resource:P},oe.getFocusedCodeEditor());if(S.isCodeEditor(ae))return ae.setPosition(V),ae.revealPositionInCenterIfOutsideViewport(V,0),ae.invokeWithinContext(G=>{const j=new class extends X{_getNoResultFoundMessage(te){return $||super._getNoResultFoundMessage(te)}}({muteMessage:!Boolean($),openInPeek:Boolean(ie),openToSide:!1},U,H);G.get(I.IInstantiationService).invokeFunction(j.run.bind(j),ae)})})}),_.CommandsRegistry.registerCommand({id:"editor.action.peekLocations",description:{description:"Peek locations from a position in a file",args:[{name:"uri",description:"The text document in which to start",constraint:L.URI},{name:"position",description:"The position at which to start",constraint:g.Position.isIPosition},{name:"locations",description:"An array of locations.",constraint:Array},{name:"multiple",description:"Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto"}]},handler:(z,P,V,U,H)=>Ie(void 0,void 0,void 0,function*(){z.get(_.ICommandService).executeCommand("editor.action.goToLocations",P,V,U,H,void 0,!0)})}),_.CommandsRegistry.registerCommand({id:"editor.action.findReferences",handler:(z,P,V)=>{k.assertType(L.URI.isUri(P)),k.assertType(g.Position.isIPosition(V));const U=z.get(d.ICodeEditorService);return U.openCodeEditor({resource:P},U.getFocusedCodeEditor()).then(H=>{if(!(!S.isCodeEditor(H)||!H.hasModel())){const $=u.ReferencesController.get(H);if(!!$){const ie=N.createCancelablePromise(ae=>m.getReferencesAtPosition(H.getModel(),g.Position.lift(V),!1,ae).then(G=>new r.ReferencesModel(G,i.localize(38,null)))),oe=new p.Range(V.lineNumber,V.column,V.lineNumber,V.column);return Promise.resolve($.toggleWidget(oe,ie,!1))}}})}}),_.CommandsRegistry.registerCommandAlias("editor.action.showReferences","editor.action.peekLocations")}),define(Q[272],J([0,1,482,15,12,73,57,3,18,13,262,2,67,11,22,70,271,227,14,20,118,16,344]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.GotoDefinitionAtPositionEditorContribution=void 0;let m=class rt{constructor(f,v,y){this.textModelResolverService=v,this.modeService=y,this.toUnhook=new c.DisposableStore,this.toUnhookForKeyboard=new c.DisposableStore,this.linkDecorations=[],this.currentWordAtPosition=null,this.previousPromise=null,this.editor=f;let L=new i.ClickLinkGesture(f);this.toUnhook.add(L),this.toUnhook.add(L.onMouseMoveOrRelevantKeyDown(([I,k])=>{this.startFindDefinitionFromMouse(I,t.withNullAsUndefined(k))})),this.toUnhook.add(L.onExecute(I=>{this.isEnabled(I)&&this.gotoDefinition(I.target.position,I.hasSideBySideModifier).then(()=>{this.removeLinkDecorations()},k=>{this.removeLinkDecorations(),M.onUnexpectedError(k)})})),this.toUnhook.add(L.onCancel(()=>{this.removeLinkDecorations(),this.currentWordAtPosition=null}))}static get(f){return f.getContribution(rt.ID)}startFindDefinitionFromCursor(f){return this.startFindDefinition(f).then(()=>{this.toUnhookForKeyboard.add(this.editor.onDidChangeCursorPosition(()=>{this.currentWordAtPosition=null,this.removeLinkDecorations(),this.toUnhookForKeyboard.clear()})),this.toUnhookForKeyboard.add(this.editor.onKeyDown(v=>{v&&(this.currentWordAtPosition=null,this.removeLinkDecorations(),this.toUnhookForKeyboard.clear())}))})}startFindDefinitionFromMouse(f,v){if(!(f.target.type===9&&this.linkDecorations.length>0)){if(!this.editor.hasModel()||!this.isEnabled(f,v)){this.currentWordAtPosition=null,this.removeLinkDecorations();return}const y=f.target.position;this.startFindDefinition(y)}}startFindDefinition(f){var v;this.toUnhookForKeyboard.clear();const y=f?(v=this.editor.getModel())===null||v===void 0?void 0:v.getWordAtPosition(f):null;if(!y)return this.currentWordAtPosition=null,this.removeLinkDecorations(),Promise.resolve(0);if(this.currentWordAtPosition&&this.currentWordAtPosition.startColumn===y.startColumn&&this.currentWordAtPosition.endColumn===y.endColumn&&this.currentWordAtPosition.word===y.word)return Promise.resolve(0);this.currentWordAtPosition=y;let L=new u.EditorState(this.editor,4|1|2|8);return this.previousPromise&&(this.previousPromise.cancel(),this.previousPromise=null),this.previousPromise=N.createCancelablePromise(I=>this.findDefinition(f,I)),this.previousPromise.then(I=>{if(!I||!I.length||!L.validate(this.editor)){this.removeLinkDecorations();return}if(I.length>1)this.addDecoration(new C.Range(f.lineNumber,y.startColumn,f.lineNumber,y.endColumn),new w.MarkdownString().appendText(b.localize(0,null,I.length)));else{let k=I[0];if(!k.uri)return;this.textModelResolverService.createModelReference(k.uri).then(E=>{if(!E.object||!E.object.textEditorModel){E.dispose();return}const{object:{textEditorModel:T}}=E,{startLineNumber:O}=k.range;if(O<1||O>T.getLineCount()){E.dispose();return}const A=this.getPreviewValue(T,O,k);let B;k.originSelectionRange?B=C.Range.lift(k.originSelectionRange):B=new C.Range(f.lineNumber,y.startColumn,f.lineNumber,y.endColumn);const F=this.modeService.getModeIdByFilepathOrFirstLine(T.uri);this.addDecoration(B,new w.MarkdownString().appendCodeblock(F||"",A)),E.dispose()})}}).then(void 0,M.onUnexpectedError)}getPreviewValue(f,v,y){let L=y.targetSelectionRange?y.range:this.getPreviewRangeBasedOnBrackets(f,v);return L.endLineNumber-L.startLineNumber>=rt.MAX_SOURCE_PREVIEW_LINES&&(L=this.getPreviewRangeBasedOnIndentation(f,v)),this.stripIndentationFromPreviewRange(f,v,L)}stripIndentationFromPreviewRange(f,v,y){let I=f.getLineFirstNonWhitespaceColumn(v);for(let E=v+1;Ey)return new C.Range(v,1,y+1,1);k=f.findNextBracket(new n.Position(T,O))}return new C.Range(v,1,y+1,1)}addDecoration(f,v){const y={range:f,options:{inlineClassName:"goto-definition-link",hoverMessage:v}};this.linkDecorations=this.editor.deltaDecorations(this.linkDecorations,[y])}removeLinkDecorations(){this.linkDecorations.length>0&&(this.linkDecorations=this.editor.deltaDecorations(this.linkDecorations,[]))}isEnabled(f,v){return this.editor.hasModel()&&f.isNoneOrSingleMouseDown&&f.target.type===6&&(f.hasTriggerModifier||(v?v.keyCodeIsTriggerKey:!1))&&d.DefinitionProviderRegistry.has(this.editor.getModel())}findDefinition(f,v){const y=this.editor.getModel();return y?p.getDefinitionsAtPosition(y,f,v):Promise.resolve(null)}gotoDefinition(f,v){return this.editor.setPosition(f),this.editor.invokeWithinContext(y=>{const L=!v&&this.editor.getOption(72)&&!this.isInPeekEditor(y);return new r.DefinitionAction({openToSide:v,openInPeek:L,muteMessage:!0},{alias:"",label:"",id:"",precondition:void 0}).run(y,this.editor)})}isInPeekEditor(f){const v=f.get(h.IContextKeyService);return l.PeekContext.inPeekEditor.getValue(v)}dispose(){this.toUnhook.dispose()}};m.ID="editor.contrib.gotodefinitionatposition",m.MAX_SOURCE_PREVIEW_LINES=8,m=Me([_e(1,o.ITextModelService),_e(2,S.IModeService)],m),e.GotoDefinitionAtPositionEditorContribution=m,g.registerEditorContribution(m.ID,m),s.registerThemingParticipant((_,f)=>{const v=_.getColor(a.editorActiveLinkForeground);v&&f.addRule(`.monaco-editor .goto-definition-link { color: ${v} !important; }`)})}),define(Q[273],J([0,1,488,39,2,13,3,25,57,661,560,58,22,11,272,16,9]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ModesHoverController=void 0;let i=class ei{constructor(h,m,_,f,v,y){this._editor=h,this._instantiationService=m,this._openerService=_,this._modeService=f,this._themeService=v,this._toUnhook=new M.DisposableStore,this._isMouseDown=!1,this._hoverClicked=!1,this._contentWidget=null,this._glyphWidget=null,this._hookEvents(),this._didChangeConfigurationHandler=this._editor.onDidChangeConfiguration(L=>{L.hasChanged(48)&&(this._unhookEvents(),this._hookEvents())}),this._hoverVisibleKey=C.EditorContextKeys.hoverVisible.bindTo(y)}static get(h){return h.getContribution(ei.ID)}_hookEvents(){const h=()=>this._hideWidgets(),m=this._editor.getOption(48);this._isHoverEnabled=m.enabled,this._isHoverSticky=m.sticky,this._isHoverEnabled?(this._toUnhook.add(this._editor.onMouseDown(_=>this._onEditorMouseDown(_))),this._toUnhook.add(this._editor.onMouseUp(_=>this._onEditorMouseUp(_))),this._toUnhook.add(this._editor.onMouseMove(_=>this._onEditorMouseMove(_))),this._toUnhook.add(this._editor.onKeyDown(_=>this._onKeyDown(_))),this._toUnhook.add(this._editor.onDidChangeModelDecorations(()=>this._onModelDecorationsChanged()))):(this._toUnhook.add(this._editor.onMouseMove(_=>this._onEditorMouseMove(_))),this._toUnhook.add(this._editor.onKeyDown(_=>this._onKeyDown(_)))),this._toUnhook.add(this._editor.onMouseLeave(h)),this._toUnhook.add(this._editor.onDidChangeModel(h)),this._toUnhook.add(this._editor.onDidScrollChange(_=>this._onEditorScrollChanged(_)))}_unhookEvents(){this._toUnhook.clear()}_onModelDecorationsChanged(){var h,m;(h=this._contentWidget)===null||h===void 0||h.onModelDecorationsChanged(),(m=this._glyphWidget)===null||m===void 0||m.onModelDecorationsChanged()}_onEditorScrollChanged(h){(h.scrollTopChanged||h.scrollLeftChanged)&&this._hideWidgets()}_onEditorMouseDown(h){this._isMouseDown=!0;const m=h.target.type;if(m===9&&h.target.detail===g.ModesContentHoverWidget.ID){this._hoverClicked=!0;return}m===12&&h.target.detail===p.ModesGlyphHoverWidget.ID||(m!==12&&h.target.detail!==p.ModesGlyphHoverWidget.ID&&(this._hoverClicked=!1),this._hideWidgets())}_onEditorMouseUp(h){this._isMouseDown=!1}_onEditorMouseMove(h){var m,_,f,v,y,L;let I=h.target.type;if(!(this._isMouseDown&&this._hoverClicked)&&!(this._isHoverSticky&&I===9&&h.target.detail===g.ModesContentHoverWidget.ID)&&!(this._isHoverSticky&&!((_=(m=h.event.browserEvent.view)===null||m===void 0?void 0:m.getSelection())===null||_===void 0?void 0:_.isCollapsed))&&!(!this._isHoverSticky&&I===9&&h.target.detail===g.ModesContentHoverWidget.ID&&((f=this._contentWidget)===null||f===void 0?void 0:f.isColorPickerVisible()))&&!(this._isHoverSticky&&I===12&&h.target.detail===p.ModesGlyphHoverWidget.ID)){if(I===7){const k=this._editor.getOption(38).typicalHalfwidthCharacterWidth/2,E=h.target.detail;E&&!E.isAfterLines&&typeof E.horizontalDistanceToText=="number"&&E.horizontalDistanceToTextT.startsWith("ced-colorBox"))&&h.target.range.endColumn-h.target.range.startColumn==1?new S.Range(h.target.range.startLineNumber,h.target.range.startColumn+1,h.target.range.endLineNumber,h.target.range.endColumn+1):h.target.range;this._contentWidget||(this._contentWidget=new g.ModesContentHoverWidget(this._editor,this._hoverVisibleKey,this._instantiationService,this._themeService)),this._contentWidget.startShowingAt(E,0,!1)}}else I===2?((L=this._contentWidget)===null||L===void 0||L.hide(),this._isHoverEnabled&&h.target.position&&(this._glyphWidget||(this._glyphWidget=new p.ModesGlyphHoverWidget(this._editor,this._modeService,this._openerService)),this._glyphWidget.startShowingAt(h.target.position.lineNumber))):this._hideWidgets()}}_onKeyDown(h){h.keyCode!==5&&h.keyCode!==6&&h.keyCode!==57&&h.keyCode!==4&&this._hideWidgets()}_hideWidgets(){var h,m,_;this._isMouseDown&&this._hoverClicked&&((h=this._contentWidget)===null||h===void 0?void 0:h.isColorPickerVisible())||(this._hoverClicked=!1,(m=this._glyphWidget)===null||m===void 0||m.hide(),(_=this._contentWidget)===null||_===void 0||_.hide())}isColorPickerVisible(){var h;return((h=this._contentWidget)===null||h===void 0?void 0:h.isColorPickerVisible())||!1}showContentHover(h,m,_){this._contentWidget||(this._contentWidget=new g.ModesContentHoverWidget(this._editor,this._hoverVisibleKey,this._instantiationService,this._themeService)),this._contentWidget.startShowingAt(h,m,_)}dispose(){var h,m;this._unhookEvents(),this._toUnhook.dispose(),this._didChangeConfigurationHandler.dispose(),(h=this._glyphWidget)===null||h===void 0||h.dispose(),(m=this._contentWidget)===null||m===void 0||m.dispose()}};i.ID="editor.contrib.hover",i=Me([_e(1,r.IInstantiationService),_e(2,c.IOpenerService),_e(3,d.IModeService),_e(4,s.IThemeService),_e(5,u.IContextKeyService)],i),e.ModesHoverController=i;class n extends w.EditorAction{constructor(){super({id:"editor.action.showHover",label:b.localize(0,null),alias:"Show Hover",precondition:void 0,kbOpts:{kbExpr:C.EditorContextKeys.editorTextFocus,primary:N.KeyChord(2048|41,2048|39),weight:100}})}run(h,m){if(!!m.hasModel()){let _=i.get(m);if(!!_){const f=m.getPosition(),v=new S.Range(f.lineNumber,f.column,f.lineNumber,f.column),y=m.getOption(2)===2;_.showContentHover(v,1,y)}}}}class t extends w.EditorAction{constructor(){super({id:"editor.action.showDefinitionPreviewHover",label:b.localize(1,null),alias:"Show Definition Preview Hover",precondition:void 0})}run(h,m){let _=i.get(m);if(!!_){const f=m.getPosition();if(!!f){const v=new S.Range(f.lineNumber,f.column,f.lineNumber,f.column),L=a.GotoDefinitionAtPositionEditorContribution.get(m).startFindDefinitionFromCursor(f);L?L.then(()=>{_.showContentHover(v,1,!0)}):_.showContentHover(v,1,!0)}}}}w.registerEditorContribution(i.ID,i),w.registerEditorAction(n),w.registerEditorAction(t),s.registerThemingParticipant((l,h)=>{const m=l.getColor(o.editorHoverHighlight);m&&h.addRule(`.monaco-editor .hoverHighlight { background-color: ${m}; }`);const _=l.getColor(o.editorHoverBackground);_&&h.addRule(`.monaco-editor .monaco-hover { background-color: ${_}; }`);const f=l.getColor(o.editorHoverBorder);f&&(h.addRule(`.monaco-editor .monaco-hover { border: 1px solid ${f}; }`),h.addRule(`.monaco-editor .monaco-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${f.transparent(.5)}; }`),h.addRule(`.monaco-editor .monaco-hover hr { border-top: 1px solid ${f.transparent(.5)}; }`),h.addRule(`.monaco-editor .monaco-hover hr { border-bottom: 0px solid ${f.transparent(.5)}; }`));const v=l.getColor(o.textLinkForeground);v&&h.addRule(`.monaco-editor .monaco-hover a { color: ${v}; }`);const y=l.getColor(o.editorHoverForeground);y&&h.addRule(`.monaco-editor .monaco-hover { color: ${y}; }`);const L=l.getColor(o.editorHoverStatusBarBackground);L&&h.addRule(`.monaco-editor .monaco-hover .hover-row .actions { background-color: ${L}; }`);const I=l.getColor(o.textCodeBlockBackground);I&&h.addRule(`.monaco-editor .monaco-hover code { background-color: ${I}; }`)})}),define(Q[670],J([0,1,2,13,273,3,260]),function(q,e,b,N,M,w){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ColorContribution=void 0;class S extends b.Disposable{constructor(d){super();this._editor=d,this._register(d.onMouseDown(g=>this.onMouseDown(g)))}dispose(){super.dispose()}onMouseDown(d){var g;if(d.target.type===6&&!![...((g=d.target.element)===null||g===void 0?void 0:g.classList.values())||[]].find(s=>s.startsWith("ced-colorBox"))&&!!d.target.range){const o=this._editor.getContribution(M.ModesHoverController.ID);if(!o.isColorPickerVisible()){const s=new w.Range(d.target.range.startLineNumber,d.target.range.startColumn+1,d.target.range.endLineNumber,d.target.range.endColumn+1);o.showContentHover(s,0,!1)}}}}e.ColorContribution=S,S.ID="editor.contrib.colorContribution",N.registerEditorContribution(S.ID,S)}),define(Q[671],J([0,1,15,2,13,18,36,253,11,46,269,247]),function(q,e,b,N,M,w,S,C,d,g,p,c){"use strict";Object.defineProperty(e,"__esModule",{value:!0});let o=class extends N.Disposable{constructor(a,u,r,i){super();this._modelService=u,this._themeService=r,this._configurationService=i,this._editor=a,this._tokenizeViewport=new b.RunOnceScheduler(()=>this._tokenizeViewportNow(),100),this._outstandingRequests=[],this._register(this._editor.onDidScrollChange(()=>{this._tokenizeViewport.schedule()})),this._register(this._editor.onDidChangeModel(()=>{this._cancelAll(),this._tokenizeViewport.schedule()})),this._register(this._editor.onDidChangeModelContent(n=>{this._cancelAll(),this._tokenizeViewport.schedule()})),this._register(w.DocumentRangeSemanticTokensProviderRegistry.onDidChange(()=>{this._cancelAll(),this._tokenizeViewport.schedule()})),this._register(this._configurationService.onDidChangeConfiguration(n=>{n.affectsConfiguration(p.SEMANTIC_HIGHLIGHTING_SETTING_ID)&&(this._cancelAll(),this._tokenizeViewport.schedule())})),this._register(this._themeService.onDidColorThemeChange(()=>{this._cancelAll(),this._tokenizeViewport.schedule()}))}_cancelAll(){for(const a of this._outstandingRequests)a.cancel();this._outstandingRequests=[]}_removeOutstandingRequest(a){for(let u=0,r=this._outstandingRequests.length;uthis._requestRange(a,n,u,r)))}}}_requestRange(a,u,r,i){const n=a.getVersionId(),t=b.createCancelablePromise(l=>Promise.resolve(r.provideDocumentRangeSemanticTokens(a,u,l)));return t.then(l=>{!l||a.isDisposed()||a.getVersionId()!==n||a.setPartialSemanticTokens(u,C.toMultilineTokens2(l,i,a.getLanguageIdentifier()))}).then(()=>this._removeOutstandingRequest(t),()=>this._removeOutstandingRequest(t)),t}};o.ID="editor.contrib.viewportSemanticTokens",o=Me([_e(1,S.IModelService),_e(2,d.IThemeService),_e(3,g.IConfigurationService)],o),M.registerEditorContribution(o.ID,o)}),define(Q[672],J([0,1,13,28,270,46,16,9,32,79]),function(q,e,b,N,M,w,S,C,d,g){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.StandaloneReferencesController=void 0;let p=class extends M.ReferencesController{constructor(o,s,a,u,r,i,n){super(!0,o,s,a,u,r,i,n)}};p=Me([_e(1,S.IContextKeyService),_e(2,N.ICodeEditorService),_e(3,d.INotificationService),_e(4,C.IInstantiationService),_e(5,g.IStorageService),_e(6,w.IConfigurationService)],p),e.StandaloneReferencesController=p,b.registerEditorContribution(M.ReferencesController.ID,p)}),define(Q[673],J([0,1,529,148,12,74,184,82,43,32,2]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.UndoRedoService=void 0;const c=!1;function o(_){return _.scheme===d.Schemas.file?_.fsPath:_.path}let s=0;class a{constructor(f,v,y,L,I,k,E){this.id=++s,this.type=0,this.actual=f,this.label=f.label,this.confirmBeforeUndo=f.confirmBeforeUndo||!1,this.resourceLabel=v,this.strResource=y,this.resourceLabels=[this.resourceLabel],this.strResources=[this.strResource],this.groupId=L,this.groupOrder=I,this.sourceId=k,this.sourceOrder=E,this.isValid=!0}setValid(f){this.isValid=f}toString(){return`[id:${this.id}] [group:${this.groupId}] [${this.isValid?" VALID":"INVALID"}] ${this.actual.constructor.name} - ${this.actual}`}}class u{constructor(f,v){this.resourceLabel=f,this.reason=v}}class r{constructor(){this.elements=new Map}createMessage(){const f=[],v=[];for(const[,L]of this.elements)(L.reason===0?f:v).push(L.resourceLabel);let y=[];return f.length>0&&y.push(b.localize(0,null,f.join(", "))),v.length>0&&y.push(b.localize(1,null,v.join(", "))),y.join(` +`)}get size(){return this.elements.size}has(f){return this.elements.has(f)}set(f,v){this.elements.set(f,v)}delete(f){return this.elements.delete(f)}}class i{constructor(f,v,y,L,I,k,E){this.id=++s,this.type=1,this.actual=f,this.label=f.label,this.confirmBeforeUndo=f.confirmBeforeUndo||!1,this.resourceLabels=v,this.strResources=y,this.groupId=L,this.groupOrder=I,this.sourceId=k,this.sourceOrder=E,this.removedResources=null,this.invalidatedResources=null}canSplit(){return typeof this.actual.split=="function"}removeResource(f,v,y){this.removedResources||(this.removedResources=new r),this.removedResources.has(v)||this.removedResources.set(v,new u(f,y))}setValid(f,v,y){y?this.invalidatedResources&&(this.invalidatedResources.delete(v),this.invalidatedResources.size===0&&(this.invalidatedResources=null)):(this.invalidatedResources||(this.invalidatedResources=new r),this.invalidatedResources.has(v)||this.invalidatedResources.set(v,new u(f,0)))}toString(){return`[id:${this.id}] [group:${this.groupId}] [${this.invalidatedResources?"INVALID":" VALID"}] ${this.actual.constructor.name} - ${this.actual}`}}class n{constructor(f,v){this.resourceLabel=f,this.strResource=v,this._past=[],this._future=[],this.locked=!1,this.versionId=1}dispose(){for(const f of this._past)f.type===1&&f.removeResource(this.resourceLabel,this.strResource,0);for(const f of this._future)f.type===1&&f.removeResource(this.resourceLabel,this.strResource,0);this.versionId++}toString(){let f=[];f.push(`* ${this.strResource}:`);for(let v=0;v=0;v--)f.push(` * [REDO] ${this._future[v]}`);return f.join(` +`)}flushAllElements(){this._past=[],this._future=[],this.versionId++}_setElementValidFlag(f,v){f.type===1?f.setValid(this.resourceLabel,this.strResource,v):f.setValid(v)}setElementsValidFlag(f,v){for(const y of this._past)v(y.actual)&&this._setElementValidFlag(y,f);for(const y of this._future)v(y.actual)&&this._setElementValidFlag(y,f)}pushElement(f){for(const v of this._future)v.type===1&&v.removeResource(this.resourceLabel,this.strResource,1);this._future=[],this._past.push(f),this.versionId++}createSnapshot(f){const v=[];for(let y=0,L=this._past.length;y=0;y--)v.push(this._future[y].id);return new N.ResourceEditStackSnapshot(f,v)}restoreSnapshot(f){const v=f.elements.length;let y=!0,L=0,I=-1;for(let E=0,T=this._past.length;E=v||O.id!==f.elements[L])&&(y=!1,I=0),!y&&O.type===1&&O.removeResource(this.resourceLabel,this.strResource,0)}let k=-1;for(let E=this._future.length-1;E>=0;E--,L++){const T=this._future[E];y&&(L>=v||T.id!==f.elements[L])&&(y=!1,k=E),!y&&T.type===1&&T.removeResource(this.resourceLabel,this.strResource,0)}I!==-1&&(this._past=this._past.slice(0,I)),k!==-1&&(this._future=this._future.slice(k+1)),this.versionId++}getElements(){const f=[],v=[];for(const y of this._past)f.push(y.actual);for(const y of this._future)v.push(y.actual);return{past:f,future:v}}getClosestPastElement(){return this._past.length===0?null:this._past[this._past.length-1]}getSecondClosestPastElement(){return this._past.length<2?null:this._past[this._past.length-2]}getClosestFutureElement(){return this._future.length===0?null:this._future[this._future.length-1]}hasPastElements(){return this._past.length>0}hasFutureElements(){return this._future.length>0}splitPastWorkspaceElement(f,v){for(let y=this._past.length-1;y>=0;y--)if(this._past[y]===f){v.has(this.strResource)?this._past[y]=v.get(this.strResource):this._past.splice(y,1);break}this.versionId++}splitFutureWorkspaceElement(f,v){for(let y=this._future.length-1;y>=0;y--)if(this._future[y]===f){v.has(this.strResource)?this._future[y]=v.get(this.strResource):this._future.splice(y,1);break}this.versionId++}moveBackward(f){this._past.pop(),this._future.push(f),this.versionId++}moveForward(f){this._future.pop(),this._past.push(f),this.versionId++}}class t{constructor(f){this.editStacks=f,this._versionIds=[];for(let v=0,y=this.editStacks.length;vv.sourceOrder)&&(v=k,y=L)}return[v,y]}canUndo(f){if(f instanceof N.UndoRedoSource){const[,y]=this._findClosestUndoElementWithSource(f.id);return!!y}const v=this.getUriComparisonKey(f);return this._editStacks.has(v)?this._editStacks.get(v).hasPastElements():!1}_onError(f,v){M.onUnexpectedError(f);for(const y of v.strResources)this.removeElements(y);this._notificationService.error(f)}_acquireLocks(f){for(const v of f.editStacks)if(v.locked)throw new Error("Cannot acquire edit stack lock");for(const v of f.editStacks)v.locked=!0;return()=>{for(const v of f.editStacks)v.locked=!1}}_safeInvokeWithLocks(f,v,y,L,I){const k=this._acquireLocks(y);let E;try{E=v()}catch(T){return k(),L.dispose(),this._onError(T,f)}return E?E.then(()=>(k(),L.dispose(),I()),T=>(k(),L.dispose(),this._onError(T,f))):(k(),L.dispose(),I())}_invokeWorkspacePrepare(f){return Ie(this,void 0,void 0,function*(){if(typeof f.actual.prepareUndoRedo=="undefined")return p.Disposable.None;const v=f.actual.prepareUndoRedo();return typeof v=="undefined"?p.Disposable.None:v})}_invokeResourcePrepare(f,v){if(f.actual.type!==1||typeof f.actual.prepareUndoRedo=="undefined")return v(p.Disposable.None);const y=f.actual.prepareUndoRedo();return y?p.isDisposable(y)?v(y):y.then(L=>v(L)):v(p.Disposable.None)}_getAffectedEditStacks(f){const v=[];for(const y of f.strResources)v.push(this._editStacks.get(y)||l);return new t(v)}_tryToSplitAndUndo(f,v,y,L){if(v.canSplit())return this._splitPastWorkspaceElement(v,y),this._notificationService.info(L),new m(this._undo(f,0,!0));for(const I of v.strResources)this.removeElements(I);return this._notificationService.info(L),new m}_checkWorkspaceUndo(f,v,y,L){if(v.removedResources)return this._tryToSplitAndUndo(f,v,v.removedResources,b.localize(2,null,v.label,v.removedResources.createMessage()));if(L&&v.invalidatedResources)return this._tryToSplitAndUndo(f,v,v.invalidatedResources,b.localize(3,null,v.label,v.invalidatedResources.createMessage()));const I=[];for(const E of y.editStacks)E.getClosestPastElement()!==v&&I.push(E.resourceLabel);if(I.length>0)return this._tryToSplitAndUndo(f,v,null,b.localize(4,null,v.label,I.join(", ")));const k=[];for(const E of y.editStacks)E.locked&&k.push(E.resourceLabel);return k.length>0?this._tryToSplitAndUndo(f,v,null,b.localize(5,null,v.label,k.join(", "))):y.isValid()?null:this._tryToSplitAndUndo(f,v,null,b.localize(6,null,v.label))}_workspaceUndo(f,v,y){const L=this._getAffectedEditStacks(v),I=this._checkWorkspaceUndo(f,v,L,!1);return I?I.returnValue:this._confirmAndExecuteWorkspaceUndo(f,v,L,y)}_isPartOfUndoGroup(f){if(!f.groupId)return!1;for(const[,v]of this._editStacks){const y=v.getClosestPastElement();if(!!y){if(y===f){const L=v.getSecondClosestPastElement();if(L&&L.groupId===f.groupId)return!0}if(y.groupId===f.groupId)return!0}}return!1}_confirmAndExecuteWorkspaceUndo(f,v,y,L){return Ie(this,void 0,void 0,function*(){if(v.canSplit()&&!this._isPartOfUndoGroup(v)){const E=yield this._dialogService.show(C.default.Info,b.localize(7,null,v.label),[b.localize(8,null,y.editStacks.length),b.localize(9,null),b.localize(10,null)],{cancelId:2});if(E.choice===2)return;if(E.choice===1)return this._splitPastWorkspaceElement(v,null),this._undo(f,0,!0);const T=this._checkWorkspaceUndo(f,v,y,!1);if(T)return T.returnValue;L=!0}let I;try{I=yield this._invokeWorkspacePrepare(v)}catch(E){return this._onError(E,v)}const k=this._checkWorkspaceUndo(f,v,y,!0);if(k)return I.dispose(),k.returnValue;for(const E of y.editStacks)E.moveBackward(v);return this._safeInvokeWithLocks(v,()=>v.actual.undo(),y,I,()=>this._continueUndoInGroup(v.groupId,L))})}_resourceUndo(f,v,y){if(!v.isValid){f.flushAllElements();return}if(f.locked){const L=b.localize(11,null,v.label);this._notificationService.info(L);return}return this._invokeResourcePrepare(v,L=>(f.moveBackward(v),this._safeInvokeWithLocks(v,()=>v.actual.undo(),new t([f]),L,()=>this._continueUndoInGroup(v.groupId,y))))}_findClosestUndoElementInGroup(f){if(!f)return[null,null];let v=null,y=null;for(const[L,I]of this._editStacks){const k=I.getClosestPastElement();!k||k.groupId===f&&(!v||k.groupOrder>v.groupOrder)&&(v=k,y=L)}return[v,y]}_continueUndoInGroup(f,v){if(!!f){const[,y]=this._findClosestUndoElementInGroup(f);if(y)return this._undo(y,0,v)}}undo(f){if(f instanceof N.UndoRedoSource){const[,v]=this._findClosestUndoElementWithSource(f.id);return v?this._undo(v,f.id,!1):void 0}return typeof f=="string"?this._undo(f,0,!1):this._undo(this.getUriComparisonKey(f),0,!1)}_undo(f,v=0,y){if(!!this._editStacks.has(f)){const L=this._editStacks.get(f),I=L.getClosestPastElement();if(!!I){if(I.groupId){const[E,T]=this._findClosestUndoElementInGroup(I.groupId);if(I!==E&&T)return this._undo(T,v,y)}if((I.sourceId!==v||I.confirmBeforeUndo)&&!y)return this._confirmAndContinueUndo(f,v,I);try{return I.type===1?this._workspaceUndo(f,I,y):this._resourceUndo(L,I,y)}finally{c&&this._print("undo")}}}}_confirmAndContinueUndo(f,v,y){return Ie(this,void 0,void 0,function*(){if((yield this._dialogService.show(C.default.Info,b.localize(12,null,y.label),[b.localize(13,null),b.localize(14,null)],{cancelId:1})).choice!==1)return this._undo(f,v,!0)})}_findClosestRedoElementWithSource(f){if(!f)return[null,null];let v=null,y=null;for(const[L,I]of this._editStacks){const k=I.getClosestFutureElement();!k||k.sourceId===f&&(!v||k.sourceOrder0)return this._tryToSplitAndRedo(f,v,null,b.localize(17,null,v.label,I.join(", ")));const k=[];for(const E of y.editStacks)E.locked&&k.push(E.resourceLabel);return k.length>0?this._tryToSplitAndRedo(f,v,null,b.localize(18,null,v.label,k.join(", "))):y.isValid()?null:this._tryToSplitAndRedo(f,v,null,b.localize(19,null,v.label))}_workspaceRedo(f,v){const y=this._getAffectedEditStacks(v),L=this._checkWorkspaceRedo(f,v,y,!1);return L?L.returnValue:this._executeWorkspaceRedo(f,v,y)}_executeWorkspaceRedo(f,v,y){return Ie(this,void 0,void 0,function*(){let L;try{L=yield this._invokeWorkspacePrepare(v)}catch(k){return this._onError(k,v)}const I=this._checkWorkspaceRedo(f,v,y,!0);if(I)return L.dispose(),I.returnValue;for(const k of y.editStacks)k.moveForward(v);return this._safeInvokeWithLocks(v,()=>v.actual.redo(),y,L,()=>this._continueRedoInGroup(v.groupId))})}_resourceRedo(f,v){if(!v.isValid){f.flushAllElements();return}if(f.locked){const y=b.localize(20,null,v.label);this._notificationService.info(y);return}return this._invokeResourcePrepare(v,y=>(f.moveForward(v),this._safeInvokeWithLocks(v,()=>v.actual.redo(),new t([f]),y,()=>this._continueRedoInGroup(v.groupId))))}_findClosestRedoElementInGroup(f){if(!f)return[null,null];let v=null,y=null;for(const[L,I]of this._editStacks){const k=I.getClosestFutureElement();!k||k.groupId===f&&(!v||k.groupOrderthis.findModel(U,P),U=>this.findModel(U.getOriginalEditor(),P)||this.findModel(U.getModifiedEditor(),P))),V?Promise.resolve(new C.ImmortalReference(new k(V))):Promise.reject(new Error("Model not found"))}findModel(P,V){let U=this.modelService.getModel(V);return U&&U.uri.toString()!==V.toString()?null:U}};T=Me([_e(0,i.IModelService)],T),e.SimpleEditorModelResolverService=T;class O{show(){return O.NULL_PROGRESS_RUNNER}showWhile(P,V){return Ie(this,void 0,void 0,function*(){yield P})}}e.SimpleEditorProgressService=O,O.NULL_PROGRESS_RUNNER={done:()=>{},total:()=>{},worked:()=>{}};class A{confirm(P){return this.doConfirm(P).then(V=>({confirmed:V,checkboxChecked:!1}))}doConfirm(P){let V=P.message;return P.detail&&(V=V+` + +`+P.detail),Promise.resolve(window.confirm(V))}show(P,V,U,H){return Promise.resolve({choice:0})}}e.SimpleDialogService=A;class B{info(P){return this.notify({severity:g.default.Info,message:P})}warn(P){return this.notify({severity:g.default.Warning,message:P})}error(P){return this.notify({severity:g.default.Error,message:P})}notify(P){switch(P.severity){case g.default.Error:console.error(P.message);break;case g.default.Warning:console.warn(P.message);break;default:console.log(P.message);break}return B.NO_OP}status(P,V){return C.Disposable.None}}e.SimpleNotificationService=B,B.NO_OP=new y.NoOpNotification;class F{constructor(P){this._onWillExecuteCommand=new w.Emitter,this._onDidExecuteCommand=new w.Emitter,this._instantiationService=P}executeCommand(P,...V){const U=n.CommandsRegistry.getCommand(P);if(!U)return Promise.reject(new Error(`command '${P}' not found`));try{this._onWillExecuteCommand.fire({commandId:P,args:V});const H=this._instantiationService.invokeFunction.apply(this._instantiationService,[U.handler,...V]);return this._onDidExecuteCommand.fire({commandId:P,args:V}),Promise.resolve(H)}catch(H){return Promise.reject(H)}}}e.StandaloneCommandService=F;class D extends h.AbstractKeybindingService{constructor(P,V,U,H,$,ie){super(P,V,U,H,$);this._cachedResolver=null,this._dynamicKeybindings=[],this._register(N.addDisposableListener(ie,N.EventType.KEY_DOWN,oe=>{const ae=new M.StandardKeyboardEvent(oe);this._dispatch(ae,ae.target)&&(ae.preventDefault(),ae.stopPropagation())})),this._register(N.addDisposableListener(window,N.EventType.KEY_UP,oe=>{const ae=new M.StandardKeyboardEvent(oe);this._singleModifierDispatch(ae,ae.target)&&ae.preventDefault()}))}addDynamicKeybinding(P,V,U,H){const $=S.createKeybinding(V,d.OS),ie=new C.DisposableStore;return $&&(this._dynamicKeybindings.push({keybinding:$,command:P,when:H,weight1:1e3,weight2:0,extensionId:null,isBuiltinExtension:!1}),ie.add(C.toDisposable(()=>{for(let oe=0;oethis._log(U))}return this._cachedResolver}_documentHasFocus(){return document.hasFocus()}_toNormalizedKeybindingItems(P,V){let U=[],H=0;for(const $ of P){const ie=$.when||void 0,oe=$.keybinding;if(!oe)U[H++]=new f.ResolvedKeybindingItem(void 0,$.command,$.commandArgs,ie,V,null,!1);else{const ae=this.resolveKeybinding(oe);for(const G of ae)U[H++]=new f.ResolvedKeybindingItem(G,$.command,$.commandArgs,ie,V,null,!1)}}return U}resolveKeybinding(P){return[new v.USLayoutResolvedKeybinding(P,d.OS)]}resolveKeyboardEvent(P){let V=new S.SimpleKeybinding(P.ctrlKey,P.shiftKey,P.altKey,P.metaKey,P.keyCode).toChord();return new v.USLayoutResolvedKeybinding(V,d.OS)}}e.StandaloneKeybindingService=D;function R(z){return z&&typeof z=="object"&&(!z.overrideIdentifier||typeof z.overrideIdentifier=="string")&&(!z.resource||z.resource instanceof p.URI)}class W{constructor(){this._onDidChangeConfiguration=new w.Emitter,this.onDidChangeConfiguration=this._onDidChangeConfiguration.event,this._configuration=new l.Configuration(new l.DefaultConfigurationModel,new l.ConfigurationModel)}getValue(P,V){const U=typeof P=="string"?P:void 0,H=R(P)?P:R(V)?V:{};return this._configuration.getValue(U,H,void 0)}updateValues(P){const V={data:this._configuration.toData()};let U=[];for(const H of P){const[$,ie]=H;this.getValue($)!==ie&&(this._configuration.updateValue($,ie),U.push($))}if(U.length>0){const H=new l.ConfigurationChangeEvent({keys:U,overrides:[]},V,this._configuration);H.source=7,H.sourceConfig=null,this._onDidChangeConfiguration.fire(H)}return Promise.resolve()}}e.SimpleConfigurationService=W;class x{constructor(P){this.configurationService=P,this._onDidChangeConfiguration=new w.Emitter,this.configurationService.onDidChangeConfiguration(V=>{this._onDidChangeConfiguration.fire({affectedKeys:V.affectedKeys,affectsConfiguration:(U,H)=>V.affectsConfiguration(H)})})}getValue(P,V,U){const $=(u.Position.isIPosition(V)?V:null)?typeof U=="string"?U:void 0:typeof V=="string"?V:void 0;return typeof $=="undefined"?this.configurationService.getValue():this.configurationService.getValue($)}}e.SimpleResourceConfigurationService=x;let K=class{constructor(P){this.configurationService=P}getEOL(P,V){const U=this.configurationService.getValue("files.eol",{overrideIdentifier:V,resource:P});return U&&U!=="auto"?U:d.isLinux||d.isMacintosh?` +`:`\r +`}};K=Me([_e(0,t.IConfigurationService)],K),e.SimpleResourcePropertiesService=K;class Y{publicLog(P,V){return Promise.resolve(void 0)}publicLog2(P,V){return this.publicLog(P,V)}}e.StandaloneTelemetryService=Y;class ee{constructor(){const P=p.URI.from({scheme:ee.SCHEME,authority:"model",path:"/"});this.workspace={id:"4064f6ec-cb38-4ad0-af64-ee6467e63c82",folders:[new L.WorkspaceFolder({uri:P,name:"",index:0})]}}getWorkspace(){return this.workspace}}e.SimpleWorkspaceContextService=ee,ee.SCHEME="inmemory";function se(z,P,V){if(!!P&&z instanceof W){let U=[];Object.keys(P).forEach(H=>{s.isEditorConfigurationKey(H)&&U.push([`editor.${H}`,P[H]]),V&&s.isDiffEditorConfigurationKey(H)&&U.push([`diffEditor.${H}`,P[H]])}),U.length>0&&z.updateValues(U)}}e.updateConfigurationService=se;class ne{constructor(P){this._modelService=P}hasPreviewHandler(){return!1}apply(P,V){return Ie(this,void 0,void 0,function*(){const U=new Map;for(let ie of P){if(!(ie instanceof o.ResourceTextEdit))throw new Error("bad edit - only text edits are supported");const oe=this._modelService.getModel(ie.resource);if(!oe)throw new Error("bad edit - model not found");if(typeof ie.versionId=="number"&&oe.getVersionId()!==ie.versionId)throw new Error("bad state - model changed in the meantime");let ae=U.get(oe);ae||(ae=[],U.set(oe,ae)),ae.push(a.EditOperation.replaceMove(r.Range.lift(ie.textEdit.range),ie.textEdit.text))}let H=0,$=0;for(const[ie,oe]of U)ie.pushStackElement(),ie.pushEditOperations([],oe,()=>[]),ie.pushStackElement(),$+=1,H+=oe.length;return{ariaSummary:b.format(I.SimpleServicesNLS.bulkEditServiceSummary,H,$)}})}}e.SimpleBulkEditService=ne;class le{getUriLabel(P,V){return P.scheme==="file"?P.fsPath:P.path}}e.SimpleUriLabelService=le;class X{constructor(P,V){this._codeEditorService=P,this._container=V,this.onDidLayout=w.Event.None}get dimension(){return this._dimension||(this._dimension=N.getClientArea(window.document.body)),this._dimension}get container(){return this._container}focus(){var P;(P=this._codeEditorService.getFocusedCodeEditor())===null||P===void 0||P.focus()}}e.SimpleLayoutService=X}),define(Q[674],J([0,1,47,2,28,143,266,217,75,191,114,34,26,46,16,68,9,37,32,11,65,64,84,59,36,57]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createTextModel=e.StandaloneDiffEditor=e.StandaloneEditor=e.StandaloneCodeEditor=void 0;let y=0,L=!1;function I(){L||(L=!0,b.setARIAContainer(document.body))}let k=class extends w.CodeEditorWidget{constructor(F,D,R,W,x,K,Y,ee,se,ne){const le=Object.assign({},D);le.ariaLabel=le.ariaLabel||h.StandaloneCodeEditorNLS.editorViewAccessibleLabel,le.ariaLabel=le.ariaLabel+";"+h.StandaloneCodeEditorNLS.accessibilityHelpMessage,super(F,le,{},R,W,x,K,ee,se,ne),Y instanceof g.StandaloneKeybindingService?this._standaloneKeybindingService=Y:this._standaloneKeybindingService=null,I()}addCommand(F,D,R){if(!this._standaloneKeybindingService)return console.warn("Cannot add command because the editor is configured with an unrecognized KeybindingService"),null;let W="DYNAMIC_"+ ++y,x=a.ContextKeyExpr.deserialize(R);return this._standaloneKeybindingService.addDynamicKeybinding(W,F,D,x),W}createContextKey(F,D){return this._contextKeyService.createKey(F,D)}addAction(F){if(typeof F.id!="string"||typeof F.label!="string"||typeof F.run!="function")throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!");if(!this._standaloneKeybindingService)return console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"),N.Disposable.None;const D=F.id,R=F.label,W=a.ContextKeyExpr.and(a.ContextKeyExpr.equals("editorId",this.getId()),a.ContextKeyExpr.deserialize(F.precondition)),x=F.keybindings,K=a.ContextKeyExpr.and(W,a.ContextKeyExpr.deserialize(F.keybindingContext)),Y=F.contextMenuGroupId||null,ee=F.contextMenuOrder||0,se=(z,...P)=>Promise.resolve(F.run(this,...P)),ne=new N.DisposableStore,le=this.getId()+":"+D;if(ne.add(o.CommandsRegistry.registerCommand(le,se)),Y){let z={command:{id:le,title:R},when:W,group:Y,order:ee};ne.add(c.MenuRegistry.appendMenuItem(c.MenuId.EditorContext,z))}if(Array.isArray(x))for(const z of x)ne.add(this._standaloneKeybindingService.addDynamicKeybinding(le,z,se,K));let X=new C.InternalEditorAction(le,R,R,W,se,this._contextKeyService);return this._actions[D]=X,ne.add(N.toDisposable(()=>{delete this._actions[D]})),ne}};k=Me([_e(2,r.IInstantiationService),_e(3,M.ICodeEditorService),_e(4,o.ICommandService),_e(5,a.IContextKeyService),_e(6,i.IKeybindingService),_e(7,t.IThemeService),_e(8,n.INotificationService),_e(9,l.IAccessibilityService)],k),e.StandaloneCodeEditor=k;let E=class extends k{constructor(F,D,R,W,x,K,Y,ee,se,ne,le,X,z,P,V){const U=Object.assign({},D);g.updateConfigurationService(X,U,!1);const H=ne.registerEditorContainer(F);typeof U.theme=="string"&&ne.setTheme(U.theme),typeof U.autoDetectHighContrast!="undefined"&&ne.setAutoDetectHighContrast(Boolean(U.autoDetectHighContrast));let $=U.model;delete U.model,super(F,U,W,x,K,Y,ee,ne,le,z),this._contextViewService=se,this._configurationService=X,this._standaloneThemeService=ne,this._register(R),this._register(H);let ie;if(typeof $=="undefined"?(ie=O(P,V,U.value||"",U.language||"text/plain",void 0),this._ownsModel=!0):(ie=$,this._ownsModel=!1),this._attachModel(ie),ie){let oe={oldModelUrl:null,newModelUrl:ie.uri};this._onDidChangeModel.fire(oe)}}dispose(){super.dispose()}updateOptions(F){g.updateConfigurationService(this._configurationService,F,!1),typeof F.theme=="string"&&this._standaloneThemeService.setTheme(F.theme),typeof F.autoDetectHighContrast!="undefined"&&this._standaloneThemeService.setAutoDetectHighContrast(Boolean(F.autoDetectHighContrast)),super.updateOptions(F)}_attachModel(F){super._attachModel(F),this._modelData&&this._contextViewService.setContainer(this._modelData.view.domNode.domNode)}_postDetachModelCleanup(F){super._postDetachModelCleanup(F),F&&this._ownsModel&&(F.dispose(),this._ownsModel=!1)}};E=Me([_e(3,r.IInstantiationService),_e(4,M.ICodeEditorService),_e(5,o.ICommandService),_e(6,a.IContextKeyService),_e(7,i.IKeybindingService),_e(8,u.IContextViewService),_e(9,p.IStandaloneThemeService),_e(10,n.INotificationService),_e(11,s.IConfigurationService),_e(12,l.IAccessibilityService),_e(13,f.IModelService),_e(14,v.IModeService)],E),e.StandaloneEditor=E;let T=class extends S.DiffEditorWidget{constructor(F,D,R,W,x,K,Y,ee,se,ne,le,X,z,P,V){const U=Object.assign({},D);g.updateConfigurationService(X,U,!0);const H=ne.registerEditorContainer(F);typeof U.theme=="string"&&ne.setTheme(U.theme),typeof U.autoDetectHighContrast!="undefined"&&ne.setAutoDetectHighContrast(Boolean(U.autoDetectHighContrast)),super(F,U,{},V,ee,x,W,se,ne,le,z,P),this._contextViewService=Y,this._configurationService=X,this._standaloneThemeService=ne,this._register(R),this._register(H),this._contextViewService.setContainer(this._containerDomElement)}dispose(){super.dispose()}updateOptions(F){g.updateConfigurationService(this._configurationService,F,!0),typeof F.theme=="string"&&this._standaloneThemeService.setTheme(F.theme),typeof F.autoDetectHighContrast!="undefined"&&this._standaloneThemeService.setAutoDetectHighContrast(Boolean(F.autoDetectHighContrast)),super.updateOptions(F)}_createInnerEditor(F,D,R){return F.createInstance(k,D,R)}getOriginalEditor(){return super.getOriginalEditor()}getModifiedEditor(){return super.getModifiedEditor()}addCommand(F,D,R){return this.getModifiedEditor().addCommand(F,D,R)}createContextKey(F,D){return this.getModifiedEditor().createContextKey(F,D)}addAction(F){return this.getModifiedEditor().addAction(F)}};T=Me([_e(3,r.IInstantiationService),_e(4,a.IContextKeyService),_e(5,i.IKeybindingService),_e(6,u.IContextViewService),_e(7,d.IEditorWorkerService),_e(8,M.ICodeEditorService),_e(9,p.IStandaloneThemeService),_e(10,n.INotificationService),_e(11,s.IConfigurationService),_e(12,u.IContextMenuService),_e(13,_.IEditorProgressService),_e(14,m.IClipboardService)],T),e.StandaloneDiffEditor=T;function O(B,F,D,R,W){if(D=D||"",!R){const x=D.indexOf(` +`);let K=D;return x!==-1&&(K=D.substring(0,x)),A(B,D,F.createByFilepathOrFirstLine(W||null,K),W)}return A(B,D,F.create(R),W)}e.createTextModel=O;function A(B,F,D,R){return B.createModel(F,D,R)}}),define(Q[274],J([0,1,2,133,28,75,252,57,567,36,269,137,191,605,668,114,34,26,46,570,16,651,68,555,184,9,550,138,37,115,147,77,558,85,32,59,79,87,11,190,650,178,594,65,139,74,568,84,530,148,673,653,78]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I,k,E,T,O,A,B,F,D,R,W,x,K,Y,ee,se,ne,le,X,z,P,V,U,H,$){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DynamicStandaloneServices=e.StaticServices=void 0;var ie;(function(ae){const G=new L.ServiceCollection;class j{constructor(ce,me){this._serviceId=ce,this._factory=me,this._value=null}get id(){return this._serviceId}get(ce){if(!this._value){if(ce&&(this._value=ce[this._serviceId.toString()]),this._value||(this._value=this._factory(ce)),!this._value)throw new Error("Service "+this._serviceId+" is missing!");G.set(this._serviceId,this._value)}return this._value}}ae.LazyStaticService=j;let te=[];function Z(re,ce){let me=new j(re,ce);return te.push(me),me}function ue(re){let ce=new L.ServiceCollection;for(const[Ce,be]of le.getSingletonServiceDescriptors())ce.set(Ce,be);for(let Ce in re)re.hasOwnProperty(Ce)&&ce.set(v.createDecorator(Ce),re[Ce]);te.forEach(Ce=>ce.set(Ce.id,Ce.get(re)));let me=new y.InstantiationService(ce,!0);return ce.set(v.IInstantiationService,me),[ce,me]}ae.init=ue,ae.instantiationService=Z(v.IInstantiationService,()=>new y.InstantiationService(G,!0));const he=new o.SimpleConfigurationService;ae.configurationService=Z(n.IConfigurationService,()=>he),ae.resourceConfigurationService=Z(c.ITextResourceConfigurationService,()=>new o.SimpleResourceConfigurationService(he)),ae.resourcePropertiesService=Z(c.ITextResourcePropertiesService,()=>new o.SimpleResourcePropertiesService(he)),ae.contextService=Z(x.IWorkspaceContextService,()=>new o.SimpleWorkspaceContextService),ae.labelService=Z(k.ILabelService,()=>new o.SimpleUriLabelService),ae.telemetryService=Z(R.ITelemetryService,()=>new o.StandaloneTelemetryService),ae.dialogService=Z(f.IDialogService,()=>new o.SimpleDialogService),ae.notificationService=Z(B.INotificationService,()=>new o.SimpleNotificationService),ae.markerService=Z(A.IMarkerService,()=>new O.MarkerService),ae.modeService=Z(C.IModeService,re=>new d.ModeServiceImpl),ae.standaloneThemeService=Z(u.IStandaloneThemeService,()=>new a.StandaloneThemeServiceImpl),ae.logService=Z(T.ILogService,()=>new T.LogService(new T.ConsoleLogger)),ae.undoRedoService=Z(V.IUndoRedoService,re=>new U.UndoRedoService(ae.dialogService.get(re),ae.notificationService.get(re))),ae.modelService=Z(g.IModelService,re=>new p.ModelServiceImpl(ae.configurationService.get(re),ae.resourcePropertiesService.get(re),ae.standaloneThemeService.get(re),ae.logService.get(re),ae.undoRedoService.get(re))),ae.markerDecorationsService=Z(Y.IMarkerDecorationsService,re=>new ee.MarkerDecorationsService(ae.modelService.get(re),ae.markerService.get(re))),ae.contextKeyService=Z(l.IContextKeyService,re=>new t.ContextKeyService(ae.configurationService.get(re))),ae.codeEditorService=Z(M.ICodeEditorService,re=>new s.StandaloneCodeEditorServiceImpl(null,ae.contextKeyService.get(re),ae.standaloneThemeService.get(re))),ae.editorProgressService=Z(F.IEditorProgressService,()=>new o.SimpleEditorProgressService),ae.storageService=Z(D.IStorageService,()=>new D.InMemoryStorageService),ae.editorWorkerService=Z(w.IEditorWorkerService,re=>new S.EditorWorkerServiceImpl(ae.modelService.get(re),ae.resourceConfigurationService.get(re),ae.logService.get(re)))})(ie=e.StaticServices||(e.StaticServices={}));class oe extends b.Disposable{constructor(G,j){super();const[te,Z]=ie.init(j);this._serviceCollection=te,this._instantiationService=Z;const ue=this.get(n.IConfigurationService),he=this.get(B.INotificationService),re=this.get(R.ITelemetryService),ce=this.get(W.IThemeService),me=this.get(T.ILogService),Ce=this.get(l.IContextKeyService);let be=(Ae,Se)=>{let we=null;return j&&(we=j[Ae.toString()]),we||(we=Se()),this._serviceCollection.set(Ae,we),we};be(se.IAccessibilityService,()=>new X.AccessibilityService(Ce,ue)),be(E.IListService,()=>new E.ListService(ce));let Le=be(i.ICommandService,()=>new o.StandaloneCommandService(this._instantiationService)),De=be(I.IKeybindingService,()=>this._register(new o.StandaloneKeybindingService(Ce,Le,re,he,me,G))),Re=be(ne.ILayoutService,()=>new o.SimpleLayoutService(ie.codeEditorService.get(M.ICodeEditorService),G));be($.IQuickInputService,()=>new H.StandaloneQuickInputServiceImpl(Z,ie.codeEditorService.get(M.ICodeEditorService)));let Ee=be(m.IContextViewService,()=>this._register(new _.ContextViewService(Re)));be(z.IClipboardService,()=>new P.BrowserClipboardService),be(m.IContextMenuService,()=>{const Ae=new h.ContextMenuService(re,he,Ee,De,ce);return Ae.configure({blockMouse:!1}),this._register(Ae)}),be(r.IMenuService,()=>new K.MenuService(Le)),be(N.IBulkEditService,()=>new o.SimpleBulkEditService(ie.modelService.get(g.IModelService)))}get(G){let j=this._serviceCollection.get(G);if(!j)throw new Error("Missing service "+G);return j}set(G,j){this._serviceCollection.set(G,j)}has(G){return this._serviceCollection.has(G)}}e.DynamicStandaloneServices=oe}),define(Q[675],J([0,1,28,559,215,38,163,107,53,18,76,75,57,67,556,169,544,191,674,274,114,26,46,16,68,9,37,32,58,65,69,59,84,8,36,358]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I,k,E,T,O,A,B){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createMonacoEditorAPI=e.registerCommand=e.remeasureFonts=e.setTheme=e.defineTheme=e.tokenize=e.colorizeModelLine=e.colorize=e.colorizeElement=e.createWebWorker=e.onDidChangeModelLanguage=e.onWillDisposeModel=e.onDidCreateModel=e.getModels=e.getModel=e.onDidChangeMarkers=e.getModelMarkers=e.setModelMarkers=e.setModelLanguage=e.createModel=e.createDiffNavigator=e.createDiffEditor=e.onDidCreateEditor=e.create=void 0;function F(he,re,ce){let me=new t.DynamicStandaloneServices(he,re),Ce=null;me.has(s.ITextModelService)||(Ce=new i.SimpleEditorModelResolverService(t.StaticServices.modelService.get()),me.set(s.ITextModelService,Ce)),me.has(I.IOpenerService)||me.set(I.IOpenerService,new N.OpenerService(me.get(b.ICodeEditorService),me.get(h.ICommandService)));let be=ce(me);return Ce&&Ce.setEditor(be),be}function D(he,re,ce){return F(he,ce||{},me=>new n.StandaloneEditor(he,re,me,me.get(v.IInstantiationService),me.get(b.ICodeEditorService),me.get(h.ICommandService),me.get(_.IContextKeyService),me.get(y.IKeybindingService),me.get(f.IContextViewService),me.get(l.IStandaloneThemeService),me.get(L.INotificationService),me.get(m.IConfigurationService),me.get(k.IAccessibilityService),me.get(B.IModelService),me.get(o.IModeService)))}e.create=D;function R(he){return t.StaticServices.codeEditorService.get().onCodeEditorAdd(re=>{he(re)})}e.onDidCreateEditor=R;function W(he,re,ce){return F(he,ce||{},me=>new n.StandaloneDiffEditor(he,re,me,me.get(v.IInstantiationService),me.get(_.IContextKeyService),me.get(y.IKeybindingService),me.get(f.IContextViewService),me.get(c.IEditorWorkerService),me.get(b.ICodeEditorService),me.get(l.IStandaloneThemeService),me.get(L.INotificationService),me.get(m.IConfigurationService),me.get(f.IContextMenuService),me.get(T.IEditorProgressService),me.get(O.IClipboardService)))}e.createDiffEditor=W;function x(he,re){return new M.DiffNavigator(he,re)}e.createDiffNavigator=x;function K(he,re,ce){return n.createTextModel(t.StaticServices.modelService.get(),t.StaticServices.modeService.get(),he,re,ce)}e.createModel=K;function Y(he,re){t.StaticServices.modelService.get().setMode(he,t.StaticServices.modeService.get().create(re))}e.setModelLanguage=Y;function ee(he,re,ce){he&&t.StaticServices.markerService.get().changeOne(re,he.uri,ce)}e.setModelMarkers=ee;function se(he){return t.StaticServices.markerService.get().read(he)}e.getModelMarkers=se;function ne(he){return t.StaticServices.markerService.get().onMarkerChanged(he)}e.onDidChangeMarkers=ne;function le(he){return t.StaticServices.modelService.get().getModel(he)}e.getModel=le;function X(){return t.StaticServices.modelService.get().getModels()}e.getModels=X;function z(he){return t.StaticServices.modelService.get().onModelAdded(he)}e.onDidCreateModel=z;function P(he){return t.StaticServices.modelService.get().onModelRemoved(he)}e.onWillDisposeModel=P;function V(he){return t.StaticServices.modelService.get().onModelModeChanged(re=>{he({model:re.model,oldLanguage:re.oldModeId})})}e.onDidChangeModelLanguage=V;function U(he){return a.createWebWorker(t.StaticServices.modelService.get(),he)}e.createWebWorker=U;function H(he,re){const ce=t.StaticServices.standaloneThemeService.get();return ce.registerEditorContainer(he),r.Colorizer.colorizeElement(ce,t.StaticServices.modeService.get(),he,re)}e.colorizeElement=H;function $(he,re,ce){return t.StaticServices.standaloneThemeService.get().registerEditorContainer(document.body),r.Colorizer.colorize(t.StaticServices.modeService.get(),he,re,ce)}e.colorize=$;function ie(he,re,ce=4){return t.StaticServices.standaloneThemeService.get().registerEditorContainer(document.body),r.Colorizer.colorizeModelLine(he,re,ce)}e.colorizeModelLine=ie;function oe(he){let re=g.TokenizationRegistry.get(he);return re||{getInitialState:()=>p.NULL_STATE,tokenize:(ce,me,Ce,be)=>p.nullTokenize(he,ce,Ce,be)}}function ae(he,re){t.StaticServices.modeService.get().triggerMode(re);let me=oe(re),Ce=A.splitLines(he),be=[],Le=me.getInitialState();for(let De=0,Re=Ce.length;De{H.getId()===P&&(U.dispose(),V())});return U}e.onLanguage=u;function r(P,V){let U=g.StaticServices.modeService.get().getLanguageIdentifier(P);if(!U)throw new Error(`Cannot set configuration for unknown language ${P}`);return S.LanguageConfigurationRegistry.register(U,V,100)}e.setLanguageConfiguration=r;class i{constructor(V,U){this._languageIdentifier=V,this._actual=U}getInitialState(){return this._actual.getInitialState()}tokenize(V,U,H,$){if(typeof this._actual.tokenize=="function")return n.adaptTokenize(this._languageIdentifier.language,this._actual,V,H,$);throw new Error("Not supported!")}tokenize2(V,U,H){let $=this._actual.tokenizeEncoded(V,H);return new M.TokenizationResult2($.tokens,$.endState)}}e.EncodedTokenizationSupport2Adapter=i;class n{constructor(V,U,H){this._standaloneThemeService=V,this._languageIdentifier=U,this._actual=H}getInitialState(){return this._actual.getInitialState()}static _toClassicTokens(V,U,H){let $=[],ie=0;for(let oe=0,ae=V.length;oe0&&ie[oe-1]===ue)){let he=Z.startIndex;j===0?he=0:het($)?new i(U,$):new n(g.StaticServices.standaloneThemeService.get(),U,$);return l(V)?w.TokenizationRegistry.registerPromise(P,V.then($=>H($))):w.TokenizationRegistry.register(P,H(V))}e.setTokensProvider=m;function _(P,V){const U=H=>c.createTokenizationSupport(g.StaticServices.modeService.get(),g.StaticServices.standaloneThemeService.get(),P,p.compile(P,H));return l(V)?w.TokenizationRegistry.registerPromise(P,V.then(H=>U(H))):w.TokenizationRegistry.register(P,U(V))}e.setMonarchTokensProvider=_;function f(P,V){return w.ReferenceProviderRegistry.register(P,V)}e.registerReferenceProvider=f;function v(P,V){return w.RenameProviderRegistry.register(P,V)}e.registerRenameProvider=v;function y(P,V){return w.SignatureHelpProviderRegistry.register(P,V)}e.registerSignatureHelpProvider=y;function L(P,V){return w.HoverProviderRegistry.register(P,{provideHover:(U,H,$)=>{let ie=U.getWordAtPosition(H);return Promise.resolve(V.provideHover(U,H,$)).then(oe=>{if(!!oe)return!oe.range&&ie&&(oe.range=new N.Range(H.lineNumber,ie.startColumn,H.lineNumber,ie.endColumn)),oe.range||(oe.range=new N.Range(H.lineNumber,H.column,H.lineNumber,H.column)),oe})}})}e.registerHoverProvider=L;function I(P,V){return w.DocumentSymbolProviderRegistry.register(P,V)}e.registerDocumentSymbolProvider=I;function k(P,V){return w.DocumentHighlightProviderRegistry.register(P,V)}e.registerDocumentHighlightProvider=k;function E(P,V){return w.LinkedEditingRangeProviderRegistry.register(P,V)}e.registerLinkedEditingRangeProvider=E;function T(P,V){return w.DefinitionProviderRegistry.register(P,V)}e.registerDefinitionProvider=T;function O(P,V){return w.ImplementationProviderRegistry.register(P,V)}e.registerImplementationProvider=O;function A(P,V){return w.TypeDefinitionProviderRegistry.register(P,V)}e.registerTypeDefinitionProvider=A;function B(P,V){return w.CodeLensProviderRegistry.register(P,V)}e.registerCodeLensProvider=B;function F(P,V){return w.CodeActionProviderRegistry.register(P,{provideCodeActions:(U,H,$,ie)=>{let oe=g.StaticServices.markerService.get().read({resource:U.uri}).filter(ae=>N.Range.areIntersectingOrTouching(ae,H));return V.provideCodeActions(U,H,{markers:oe,only:$.only},ie)}})}e.registerCodeActionProvider=F;function D(P,V){return w.DocumentFormattingEditProviderRegistry.register(P,V)}e.registerDocumentFormattingEditProvider=D;function R(P,V){return w.DocumentRangeFormattingEditProviderRegistry.register(P,V)}e.registerDocumentRangeFormattingEditProvider=R;function W(P,V){return w.OnTypeFormattingEditProviderRegistry.register(P,V)}e.registerOnTypeFormattingEditProvider=W;function x(P,V){return w.LinkProviderRegistry.register(P,V)}e.registerLinkProvider=x;function K(P,V){return w.CompletionProviderRegistry.register(P,V)}e.registerCompletionItemProvider=K;function Y(P,V){return w.ColorProviderRegistry.register(P,V)}e.registerColorProvider=Y;function ee(P,V){return w.FoldingRangeProviderRegistry.register(P,V)}e.registerFoldingRangeProvider=ee;function se(P,V){return w.DeclarationProviderRegistry.register(P,V)}e.registerDeclarationProvider=se;function ne(P,V){return w.SelectionRangeRegistry.register(P,V)}e.registerSelectionRangeProvider=ne;function le(P,V){return w.DocumentSemanticTokensProviderRegistry.register(P,V)}e.registerDocumentSemanticTokensProvider=le;function X(P,V){return w.DocumentRangeSemanticTokensProviderRegistry.register(P,V)}e.registerDocumentRangeSemanticTokensProvider=X;function z(){return{register:o,getLanguages:s,onLanguage:u,getEncodedLanguageId:a,setLanguageConfiguration:r,setColorMap:h,setTokensProvider:m,setMonarchTokensProvider:_,registerReferenceProvider:f,registerRenameProvider:v,registerCompletionItemProvider:K,registerSignatureHelpProvider:y,registerHoverProvider:L,registerDocumentSymbolProvider:I,registerDocumentHighlightProvider:k,registerLinkedEditingRangeProvider:E,registerDefinitionProvider:T,registerImplementationProvider:O,registerTypeDefinitionProvider:A,registerCodeLensProvider:B,registerCodeActionProvider:F,registerDocumentFormattingEditProvider:D,registerDocumentRangeFormattingEditProvider:R,registerOnTypeFormattingEditProvider:W,registerLinkProvider:x,registerColorProvider:Y,registerFoldingRangeProvider:ee,registerDeclarationProvider:se,registerSelectionRangeProvider:ne,registerDocumentSemanticTokensProvider:le,registerDocumentRangeSemanticTokensProvider:X,DocumentHighlightKind:d.DocumentHighlightKind,CompletionItemKind:d.CompletionItemKind,CompletionItemTag:d.CompletionItemTag,CompletionItemInsertTextRule:d.CompletionItemInsertTextRule,SymbolKind:d.SymbolKind,SymbolTag:d.SymbolTag,IndentAction:d.IndentAction,CompletionTriggerKind:d.CompletionTriggerKind,SignatureHelpTriggerKind:d.SignatureHelpTriggerKind,InlineHintKind:d.InlineHintKind,FoldingRangeKind:w.FoldingRangeKind}}e.createMonacoLanguagesAPI=z}),define(Q[677],J([0,1,38,220,675,676,17,261]),function(q,e,b,N,M,w,S,C){"use strict";var d;Object.defineProperty(e,"__esModule",{value:!0}),e.languages=e.editor=e.Token=e.Uri=e.MarkerTag=e.MarkerSeverity=e.SelectionDirection=e.Selection=e.Range=e.Position=e.KeyMod=e.KeyCode=e.Emitter=e.CancellationTokenSource=void 0,b.EditorOptions.wrappingIndent.defaultValue=0,b.EditorOptions.glyphMargin.defaultValue=!1,b.EditorOptions.autoIndent.defaultValue=3,b.EditorOptions.overviewRulerLanes.defaultValue=2,C.FormattingConflicts.setFormatterSelector((p,c,o)=>Promise.resolve(p[0]));const g=N.createMonacoBaseAPI();g.editor=M.createMonacoEditorAPI(),g.languages=w.createMonacoLanguagesAPI(),e.CancellationTokenSource=g.CancellationTokenSource,e.Emitter=g.Emitter,e.KeyCode=g.KeyCode,e.KeyMod=g.KeyMod,e.Position=g.Position,e.Range=g.Range,e.Selection=g.Selection,e.SelectionDirection=g.SelectionDirection,e.MarkerSeverity=g.MarkerSeverity,e.MarkerTag=g.MarkerTag,e.Uri=g.Uri,e.Token=g.Token,e.editor=g.editor,e.languages=g.languages,(((d=S.globals.MonacoEnvironment)===null||d===void 0?void 0:d.globalAPI)||typeof define=="function"&&define.amd)&&(self.monaco=g),typeof self.require!="undefined"&&typeof self.require.config=="function"&&self.require.config({ignoreDuplicateModules:["vscode-languageserver-types","vscode-languageserver-types/main","vscode-languageserver-textdocument","vscode-languageserver-textdocument/main","vscode-nls","vscode-nls/vscode-nls","jsonc-parser","jsonc-parser/main","vscode-uri","vscode-uri/index","vs/basic-languages/typescript/typescript"]})}),define(Q[678],J([0,1,24]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toWorkspaceIdentifier=e.isSingleFolderWorkspaceIdentifier=e.WORKSPACE_EXTENSION=void 0,e.WORKSPACE_EXTENSION="code-workspace";function N(w){const S=w;return typeof(S==null?void 0:S.id)=="string"&&b.URI.isUri(S.uri)}e.isSingleFolderWorkspaceIdentifier=N;function M(w){if(w.configuration)return{id:w.id,configPath:w.configuration};if(w.folders.length===1)return{id:w.id,uri:w.folders[0].uri}}e.toWorkspaceIdentifier=M}),define(Q[679],J([0,1,506,72,44,131,41,8,678,159,292]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.RandomBasedVariableResolver=e.WorkspaceBasedVariableResolver=e.TimeBasedVariableResolver=e.CommentBasedVariableResolver=e.ClipboardBasedVariableResolver=e.ModelBasedVariableResolver=e.SelectionBasedVariableResolver=e.CompositeSnippetVariableResolver=void 0;class c{constructor(l){this._delegates=l}resolve(l){for(const h of this._delegates){let m=h.resolve(l);if(m!==void 0)return m}}}e.CompositeSnippetVariableResolver=c;class o{constructor(l,h,m,_){this._model=l,this._selection=h,this._selectionIdx=m,this._overtypingCapturer=_}resolve(l){const{name:h}=l;if(h==="SELECTION"||h==="TM_SELECTED_TEXT"){let m=this._model.getValueInRange(this._selection)||void 0,_=this._selection.startLineNumber!==this._selection.endLineNumber;if(!m&&this._overtypingCapturer){const f=this._overtypingCapturer.getLastOvertypedInfo(this._selectionIdx);f&&(m=f.value,_=f.multiline)}if(m&&_&&l.snippet){const f=this._model.getLineContent(this._selection.startLineNumber),v=C.getLeadingWhitespace(f,0,this._selection.startColumn-1);let y=v;l.snippet.walk(I=>I===l?!1:(I instanceof w.Text&&(y=C.getLeadingWhitespace(C.splitLines(I.value).pop())),!0));const L=C.commonPrefixLength(y,v);m=m.replace(/(\r\n|\r|\n)(.*)/g,(I,k,E)=>`${k}${y.substr(L)}${E}`)}return m}else{if(h==="TM_CURRENT_LINE")return this._model.getLineContent(this._selection.positionLineNumber);if(h==="TM_CURRENT_WORD"){const m=this._model.getWordAtPosition({lineNumber:this._selection.positionLineNumber,column:this._selection.positionColumn});return m&&m.word||void 0}else{if(h==="TM_LINE_INDEX")return String(this._selection.positionLineNumber-1);if(h==="TM_LINE_NUMBER")return String(this._selection.positionLineNumber)}}}}e.SelectionBasedVariableResolver=o;class s{constructor(l,h){this._labelService=l,this._model=h}resolve(l){const{name:h}=l;if(h==="TM_FILENAME")return N.basename(this._model.uri.fsPath);if(h==="TM_FILENAME_BASE"){const m=N.basename(this._model.uri.fsPath),_=m.lastIndexOf(".");return _<=0?m:m.slice(0,_)}else{if(h==="TM_DIRECTORY"&&this._labelService)return N.dirname(this._model.uri.fsPath)==="."?"":this._labelService.getUriLabel(M.dirname(this._model.uri));if(h==="TM_FILEPATH"&&this._labelService)return this._labelService.getUriLabel(this._model.uri);if(h==="RELATIVE_FILEPATH"&&this._labelService)return this._labelService.getUriLabel(this._model.uri,{relative:!0,noPrefix:!0})}}}e.ModelBasedVariableResolver=s;class a{constructor(l,h,m,_){this._readClipboardText=l,this._selectionIdx=h,this._selectionCount=m,this._spread=_}resolve(l){if(l.name==="CLIPBOARD"){const h=this._readClipboardText();if(!!h){if(this._spread){const m=h.split(/\r\n|\n|\r/).filter(_=>!C.isFalsyOrWhitespace(_));if(m.length===this._selectionCount)return m[this._selectionIdx]}return h}}}}e.ClipboardBasedVariableResolver=a;class u{constructor(l,h){this._model=l,this._selection=h}resolve(l){const{name:h}=l,m=this._model.getLanguageIdAtPosition(this._selection.selectionStartLineNumber,this._selection.selectionStartColumn),_=S.LanguageConfigurationRegistry.getComments(m);if(!!_){if(h==="LINE_COMMENT")return _.lineCommentToken||void 0;if(h==="BLOCK_COMMENT_START")return _.blockCommentStartToken||void 0;if(h==="BLOCK_COMMENT_END")return _.blockCommentEndToken||void 0}}}e.CommentBasedVariableResolver=u;class r{resolve(l){const{name:h}=l;if(h==="CURRENT_YEAR")return String(new Date().getFullYear());if(h==="CURRENT_YEAR_SHORT")return String(new Date().getFullYear()).slice(-2);if(h==="CURRENT_MONTH")return String(new Date().getMonth().valueOf()+1).padStart(2,"0");if(h==="CURRENT_DATE")return String(new Date().getDate().valueOf()).padStart(2,"0");if(h==="CURRENT_HOUR")return String(new Date().getHours().valueOf()).padStart(2,"0");if(h==="CURRENT_MINUTE")return String(new Date().getMinutes().valueOf()).padStart(2,"0");if(h==="CURRENT_SECOND")return String(new Date().getSeconds().valueOf()).padStart(2,"0");if(h==="CURRENT_DAY_NAME")return r.dayNames[new Date().getDay()];if(h==="CURRENT_DAY_NAME_SHORT")return r.dayNamesShort[new Date().getDay()];if(h==="CURRENT_MONTH_NAME")return r.monthNames[new Date().getMonth()];if(h==="CURRENT_MONTH_NAME_SHORT")return r.monthNamesShort[new Date().getMonth()];if(h==="CURRENT_SECONDS_UNIX")return String(Math.floor(Date.now()/1e3))}}e.TimeBasedVariableResolver=r,r.dayNames=[b.localize(0,null),b.localize(1,null),b.localize(2,null),b.localize(3,null),b.localize(4,null),b.localize(5,null),b.localize(6,null)],r.dayNamesShort=[b.localize(7,null),b.localize(8,null),b.localize(9,null),b.localize(10,null),b.localize(11,null),b.localize(12,null),b.localize(13,null)],r.monthNames=[b.localize(14,null),b.localize(15,null),b.localize(16,null),b.localize(17,null),b.localize(18,null),b.localize(19,null),b.localize(20,null),b.localize(21,null),b.localize(22,null),b.localize(23,null),b.localize(24,null),b.localize(25,null)],r.monthNamesShort=[b.localize(26,null),b.localize(27,null),b.localize(28,null),b.localize(29,null),b.localize(30,null),b.localize(31,null),b.localize(32,null),b.localize(33,null),b.localize(34,null),b.localize(35,null),b.localize(36,null),b.localize(37,null)];class i{constructor(l){this._workspaceService=l}resolve(l){if(!!this._workspaceService){const h=d.toWorkspaceIdentifier(this._workspaceService.getWorkspace());if(!!h){if(l.name==="WORKSPACE_NAME")return this._resolveWorkspaceName(h);if(l.name==="WORKSPACE_FOLDER")return this._resoveWorkspacePath(h)}}}_resolveWorkspaceName(l){if(d.isSingleFolderWorkspaceIdentifier(l))return N.basename(l.uri.path);let h=N.basename(l.configPath.path);return h.endsWith(d.WORKSPACE_EXTENSION)&&(h=h.substr(0,h.length-d.WORKSPACE_EXTENSION.length-1)),h}_resoveWorkspacePath(l){if(d.isSingleFolderWorkspaceIdentifier(l))return g.normalizeDriveLetter(l.uri.fsPath);let h=N.basename(l.configPath.path),m=l.configPath.fsPath;return m.endsWith(h)&&(m=m.substr(0,m.length-h.length-1)),m?g.normalizeDriveLetter(m):"/"}}e.WorkspaceBasedVariableResolver=i;class n{resolve(l){const{name:h}=l;if(h==="RANDOM")return Math.random().toString().slice(-6);if(h==="RANDOM_HEX")return Math.random().toString(16).slice(-6);if(h==="UUID")return p.generateUuid()}}e.RandomBasedVariableResolver=n}),define(Q[680],J([0,1,19,2,8,62,3,21,31,190,9,131,679,11,22,115,351]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SnippetSession=e.OneSnippet=void 0,s.registerThemingParticipant((t,l)=>{function h(m){const _=t.getColor(m);return _?_.toString():"transparent"}l.addRule(`.monaco-editor .snippet-placeholder { background-color: ${h(a.snippetTabstopHighlightBackground)}; outline-color: ${h(a.snippetTabstopHighlightBorder)}; }`),l.addRule(`.monaco-editor .finish-snippet-placeholder { background-color: ${h(a.snippetFinalTabstopHighlightBackground)}; outline-color: ${h(a.snippetFinalTabstopHighlightBorder)}; }`)});class r{constructor(l,h,m,_){this._editor=l,this._snippet=h,this._offset=m,this._snippetLineLeadingWhitespace=_,this._nestingLevel=1,this._placeholderGroups=b.groupBy(h.placeholders,c.Placeholder.compareByIndex),this._placeholderGroupsIdx=-1}dispose(){this._placeholderDecorations&&this._editor.deltaDecorations([...this._placeholderDecorations.values()],[]),this._placeholderGroups.length=0}_initDecorations(){if(!this._placeholderDecorations){this._placeholderDecorations=new Map;const l=this._editor.getModel();this._editor.changeDecorations(h=>{for(const m of this._snippet.placeholders){const _=this._snippet.offset(m),f=this._snippet.fullLen(m),v=S.Range.fromPositions(l.getPositionAt(this._offset+_),l.getPositionAt(this._offset+_+f)),y=m.isFinalTabstop?r._decor.inactiveFinal:r._decor.inactive,L=h.addDecoration(v,y);this._placeholderDecorations.set(m,L)}})}}move(l){if(!this._editor.hasModel())return[];if(this._initDecorations(),this._placeholderGroupsIdx>=0){let _=[];for(const f of this._placeholderGroups[this._placeholderGroupsIdx])if(f.transform){const v=this._placeholderDecorations.get(f),y=this._editor.getModel().getDecorationRange(v),L=this._editor.getModel().getValueInRange(y),I=f.transform.resolve(L).split(/\r\n|\r|\n/);for(let k=1;k0&&this._editor.executeEdits("snippet.placeholderTransform",_)}let h=!1;l===!0&&this._placeholderGroupsIdx0&&(this._placeholderGroupsIdx-=1,h=!0);const m=this._editor.getModel().changeDecorations(_=>{const f=new Set,v=[];for(const y of this._placeholderGroups[this._placeholderGroupsIdx]){const L=this._placeholderDecorations.get(y),I=this._editor.getModel().getDecorationRange(L);v.push(new C.Selection(I.startLineNumber,I.startColumn,I.endLineNumber,I.endColumn)),h=h&&this._hasPlaceholderBeenCollapsed(y),_.changeDecorationOptions(L,y.isFinalTabstop?r._decor.activeFinal:r._decor.active),f.add(y);for(const k of this._snippet.enclosingPlaceholders(y)){const E=this._placeholderDecorations.get(k);_.changeDecorationOptions(E,k.isFinalTabstop?r._decor.activeFinal:r._decor.active),f.add(k)}}for(const[y,L]of this._placeholderDecorations)f.has(y)||_.changeDecorationOptions(L,y.isFinalTabstop?r._decor.inactiveFinal:r._decor.inactive);return v});return h?this.move(l):m!=null?m:[]}_hasPlaceholderBeenCollapsed(l){let h=l;for(;h;){if(h instanceof c.Placeholder){const m=this._placeholderDecorations.get(h);if(this._editor.getModel().getDecorationRange(m).isEmpty()&&h.toString().length>0)return!0}h=h.parent}return!1}get isAtFirstPlaceholder(){return this._placeholderGroupsIdx<=0||this._placeholderGroups.length===0}get isAtLastPlaceholder(){return this._placeholderGroupsIdx===this._placeholderGroups.length-1}get hasPlaceholder(){return this._snippet.placeholders.length>0}computePossibleSelections(){const l=new Map;for(const h of this._placeholderGroups){let m;for(const _ of h){if(_.isFinalTabstop)break;m||(m=[],l.set(_.index,m));const f=this._placeholderDecorations.get(_),v=this._editor.getModel().getDecorationRange(f);if(!v){l.delete(_.index);break}m.push(v)}}return l}get choice(){return this._placeholderGroups[this._placeholderGroupsIdx][0].choice}merge(l){const h=this._editor.getModel();this._nestingLevel*=10,this._editor.changeDecorations(m=>{for(const _ of this._placeholderGroups[this._placeholderGroupsIdx]){const f=l.shift();console.assert(!f._placeholderDecorations);const v=f._snippet.placeholderInfo.last.index;for(const L of f._snippet.placeholderInfo.all)L.isFinalTabstop?L.index=_.index+(v+1)/this._nestingLevel:L.index=_.index+L.index/this._nestingLevel;this._snippet.replace(_,f._snippet.children);const y=this._placeholderDecorations.get(_);m.removeDecoration(y),this._placeholderDecorations.delete(_);for(const L of f._snippet.placeholders){const I=f._snippet.offset(L),k=f._snippet.fullLen(L),E=S.Range.fromPositions(h.getPositionAt(f._offset+I),h.getPositionAt(f._offset+I+k)),T=m.addDecoration(E,r._decor.inactive);this._placeholderDecorations.set(L,T)}}this._placeholderGroups=b.groupBy(this._snippet.placeholders,c.Placeholder.compareByIndex)})}}e.OneSnippet=r,r._decor={active:d.ModelDecorationOptions.register({stickiness:0,className:"snippet-placeholder"}),inactive:d.ModelDecorationOptions.register({stickiness:1,className:"snippet-placeholder"}),activeFinal:d.ModelDecorationOptions.register({stickiness:1,className:"finish-snippet-placeholder"}),inactiveFinal:d.ModelDecorationOptions.register({stickiness:1,className:"finish-snippet-placeholder"})};const i={overwriteBefore:0,overwriteAfter:0,adjustWhitespace:!0,clipboardText:void 0,overtypingCapturer:void 0};class n{constructor(l,h,m=i){this._templateMerges=[],this._snippets=[],this._editor=l,this._template=h,this._options=m}static adjustWhitespace(l,h,m,_,f){const v=l.getLineContent(h.lineNumber),y=M.getLeadingWhitespace(v,0,h.column-1);let L;return m.walk(I=>{if(!(I instanceof c.Text)||I.parent instanceof c.Choice)return!0;const k=I.value.split(/\r\n|\r|\n/);if(_){const T=m.offset(I);if(T===0)k[0]=l.normalizeIndentation(k[0]);else{L=L!=null?L:m.toString();let O=L.charCodeAt(T-1);(O===10||O===13)&&(k[0]=l.normalizeIndentation(y+k[0]))}for(let O=1;Ox.get(g.IWorkspaceContextService,p.optional)),O=l.invokeWithinContext(x=>new o.ModelBasedVariableResolver(x.get(u.ILabelService,p.optional),E)),A=()=>y;let B=0,F=E.getValueInRange(n.adjustSelection(E,l.getSelection(),m,0)),D=E.getValueInRange(n.adjustSelection(E,l.getSelection(),0,_)),R=E.getLineFirstNonWhitespaceColumn(l.getSelection().positionLineNumber);const W=l.getSelections().map((x,K)=>({selection:x,idx:K})).sort((x,K)=>S.Range.compareRangesUsingStarts(x.selection,K.selection));for(const{selection:x,idx:K}of W){let Y=n.adjustSelection(E,x,m,0),ee=n.adjustSelection(E,x,0,_);F!==E.getValueInRange(Y)&&(Y=x),D!==E.getValueInRange(ee)&&(ee=x);const se=x.setStartPosition(Y.startLineNumber,Y.startColumn).setEndPosition(ee.endLineNumber,ee.endColumn),ne=new c.SnippetParser().parse(h,!0,f),le=se.getStartPosition(),X=n.adjustWhitespace(E,le,ne,v||K>0&&R!==E.getLineFirstNonWhitespaceColumn(x.positionLineNumber),!0);ne.resolveVariables(new o.CompositeSnippetVariableResolver([O,new o.ClipboardBasedVariableResolver(A,K,W.length,l.getOption(65)==="spread"),new o.SelectionBasedVariableResolver(E,x,K,L),new o.CommentBasedVariableResolver(E,x),new o.TimeBasedVariableResolver,new o.WorkspaceBasedVariableResolver(T),new o.RandomBasedVariableResolver]));const z=E.getOffsetAt(le)+B;B+=ne.toString().length-E.getValueLengthInRange(se),I[K]=w.EditOperation.replace(se,ne.toString()),I[K].identifier={major:K,minor:0},k[K]=new r(l,ne,z,X)}return{edits:I,snippets:k}}dispose(){N.dispose(this._snippets)}_logInfo(){return`template="${this._template}", merged_templates="${this._templateMerges.join(" -> ")}"`}insert(){if(!!this._editor.hasModel()){const{edits:l,snippets:h}=n.createEditsAndSnippets(this._editor,this._template,this._options.overwriteBefore,this._options.overwriteAfter,!1,this._options.adjustWhitespace,this._options.clipboardText,this._options.overtypingCapturer);this._snippets=h,this._editor.executeEdits("snippet",l,m=>this._snippets[0].hasPlaceholder?this._move(!0):m.filter(_=>!!_.identifier).map(_=>C.Selection.fromPositions(_.range.getEndPosition()))),this._editor.revealRange(this._editor.getSelections()[0])}}merge(l,h=i){if(!!this._editor.hasModel()){this._templateMerges.push([this._snippets[0]._nestingLevel,this._snippets[0]._placeholderGroupsIdx,l]);const{edits:m,snippets:_}=n.createEditsAndSnippets(this._editor,l,h.overwriteBefore,h.overwriteAfter,!0,h.adjustWhitespace,h.clipboardText,h.overtypingCapturer);this._editor.executeEdits("snippet",m,f=>{for(const v of this._snippets)v.merge(_);return console.assert(_.length===0),this._snippets[0].hasPlaceholder?this._move(void 0):f.filter(v=>!!v.identifier).map(v=>C.Selection.fromPositions(v.range.getEndPosition()))})}}next(){const l=this._move(!0);this._editor.setSelections(l),this._editor.revealPositionInCenterIfOutsideViewport(l[0].getPosition())}prev(){const l=this._move(!1);this._editor.setSelections(l),this._editor.revealPositionInCenterIfOutsideViewport(l[0].getPosition())}_move(l){const h=[];for(const m of this._snippets){const _=m.move(l);h.push(..._)}return h}get isAtFirstPlaceholder(){return this._snippets[0].isAtFirstPlaceholder}get isAtLastPlaceholder(){return this._snippets[0].isAtLastPlaceholder}get hasPlaceholder(){return this._snippets[0].hasPlaceholder}get choice(){return this._snippets[0].choice}isSelectionWithinPlaceholders(){if(!this.hasPlaceholder)return!1;const l=this._editor.getSelections();if(l.length{f.push(..._.get(v))})}l.sort(S.Range.compareRangesUsingStarts);for(let[m,_]of h){if(_.length!==l.length){h.delete(m);continue}_.sort(S.Range.compareRangesUsingStarts);for(let f=0;f<_.length;f++)if(!_[f].containsRange(l[f])){h.delete(m);continue}}return h.size>0}}e.SnippetSession=n}),define(Q[192],J([0,1,2,13,3,21,25,117,16,77,680]),function(q,e,b,N,M,w,S,C,d,g,p){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SnippetController2=void 0;const c={overwriteBefore:0,overwriteAfter:0,undoStopBefore:!0,undoStopAfter:!0,adjustWhitespace:!0,clipboardText:void 0,overtypingCapturer:void 0};let o=class ot{constructor(u,r,i){this._editor=u,this._logService=r,this._snippetListener=new b.DisposableStore,this._modelVersionId=-1,this._inSnippet=ot.InSnippetMode.bindTo(i),this._hasNextTabstop=ot.HasNextTabstop.bindTo(i),this._hasPrevTabstop=ot.HasPrevTabstop.bindTo(i)}static get(u){return u.getContribution(ot.ID)}dispose(){var u;this._inSnippet.reset(),this._hasPrevTabstop.reset(),this._hasNextTabstop.reset(),(u=this._session)===null||u===void 0||u.dispose(),this._snippetListener.dispose()}insert(u,r){try{this._doInsert(u,typeof r=="undefined"?c:Object.assign(Object.assign({},c),r))}catch(i){this.cancel(),this._logService.error(i),this._logService.error("snippet_error"),this._logService.error("insert_template=",u),this._logService.error("existing_template=",this._session?this._session._logInfo():"")}}_doInsert(u,r){!this._editor.hasModel()||(this._snippetListener.clear(),r.undoStopBefore&&this._editor.getModel().pushStackElement(),this._session?this._session.merge(u,r):(this._modelVersionId=this._editor.getModel().getAlternativeVersionId(),this._session=new p.SnippetSession(this._editor,u,r),this._session.insert()),r.undoStopAfter&&this._editor.getModel().pushStackElement(),this._updateState(),this._snippetListener.add(this._editor.onDidChangeModelContent(i=>i.isFlush&&this.cancel())),this._snippetListener.add(this._editor.onDidChangeModel(()=>this.cancel())),this._snippetListener.add(this._editor.onDidChangeCursorSelection(()=>this._updateState())))}_updateState(){if(!(!this._session||!this._editor.hasModel())){if(this._modelVersionId===this._editor.getModel().getAlternativeVersionId())return this.cancel();if(!this._session.hasPlaceholder)return this.cancel();if(this._session.isAtLastPlaceholder||!this._session.isSelectionWithinPlaceholders())return this.cancel();this._inSnippet.set(!0),this._hasPrevTabstop.set(!this._session.isAtFirstPlaceholder),this._hasNextTabstop.set(!this._session.isAtLastPlaceholder),this._handleChoice()}}_handleChoice(){if(!this._session||!this._editor.hasModel()){this._currentChoice=void 0;return}const{choice:u}=this._session;if(!u){this._currentChoice=void 0;return}if(this._currentChoice!==u){this._currentChoice=u,this._editor.setSelections(this._editor.getSelections().map(i=>w.Selection.fromPositions(i.getStartPosition())));const[r]=u.options;C.showSimpleSuggestions(this._editor,u.options.map((i,n)=>({kind:13,label:i.value,insertText:i.value,sortText:"a".repeat(n+1),range:M.Range.fromPositions(this._editor.getPosition(),this._editor.getPosition().delta(0,r.value.length))})))}}finish(){for(;this._inSnippet.get();)this.next()}cancel(u=!1){var r;this._inSnippet.reset(),this._hasPrevTabstop.reset(),this._hasNextTabstop.reset(),this._snippetListener.clear(),(r=this._session)===null||r===void 0||r.dispose(),this._session=void 0,this._modelVersionId=-1,u&&this._editor.setSelections([this._editor.getSelection()])}prev(){this._session&&this._session.prev(),this._updateState()}next(){this._session&&this._session.next(),this._updateState()}isInSnippet(){return Boolean(this._inSnippet.get())}};o.ID="snippetController2",o.InSnippetMode=new d.RawContextKey("inSnippetMode",!1),o.HasNextTabstop=new d.RawContextKey("hasNextTabstop",!1),o.HasPrevTabstop=new d.RawContextKey("hasPrevTabstop",!1),o=Me([_e(1,g.ILogService),_e(2,d.IContextKeyService)],o),e.SnippetController2=o,N.registerEditorContribution(o.ID,o);const s=N.EditorCommand.bindToContribution(o.get);N.registerEditorCommand(new s({id:"jumpToNextSnippetPlaceholder",precondition:d.ContextKeyExpr.and(o.InSnippetMode,o.HasNextTabstop),handler:a=>a.next(),kbOpts:{weight:100+30,kbExpr:S.EditorContextKeys.editorTextFocus,primary:2}})),N.registerEditorCommand(new s({id:"jumpToPrevSnippetPlaceholder",precondition:d.ContextKeyExpr.and(o.InSnippetMode,o.HasPrevTabstop),handler:a=>a.prev(),kbOpts:{weight:100+30,kbExpr:S.EditorContextKeys.editorTextFocus,primary:1024|2}})),N.registerEditorCommand(new s({id:"leaveSnippet",precondition:o.InSnippetMode,handler:a=>a.cancel(!0),kbOpts:{weight:100+30,kbExpr:S.EditorContextKeys.editorTextFocus,primary:9,secondary:[1024|9]}})),N.registerEditorCommand(new s({id:"acceptSnippet",precondition:o.InSnippetMode,handler:a=>a.finish()}))}),define(Q[681],J([0,1,15,12,6,2,21,18,413,117,192,23,75,416,8,84,87,77]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SuggestModel=e.LineContext=void 0;class n{constructor(h,m,_,f){this.leadingLineContent=h.getLineContent(m.lineNumber).substr(0,m.column-1),this.leadingWord=h.getWordUntilPosition(m),this.lineNumber=m.lineNumber,this.column=m.column,this.auto=_,this.shy=f}static shouldAutoTrigger(h){if(!h.hasModel())return!1;const m=h.getModel(),_=h.getPosition();m.tokenizeIfCheap(_.lineNumber);const f=m.getWordAtPosition(_);return!(!f||f.endColumn!==_.column||!isNaN(Number(f.word)))}}e.LineContext=n;let t=class ti{constructor(h,m,_,f,v){this._editor=h,this._editorWorkerService=m,this._clipboardService=_,this._telemetryService=f,this._logService=v,this._toDispose=new w.DisposableStore,this._quickSuggestDelay=10,this._triggerCharacterListener=new w.DisposableStore,this._triggerQuickSuggest=new b.TimeoutTimer,this._state=0,this._completionDisposables=new w.DisposableStore,this._onDidCancel=new M.Emitter,this._onDidTrigger=new M.Emitter,this._onDidSuggest=new M.Emitter,this.onDidCancel=this._onDidCancel.event,this.onDidTrigger=this._onDidTrigger.event,this.onDidSuggest=this._onDidSuggest.event,this._telemetryGate=0,this._currentSelection=this._editor.getSelection()||new S.Selection(1,1,1,1),this._toDispose.add(this._editor.onDidChangeModel(()=>{this._updateTriggerCharacters(),this.cancel()})),this._toDispose.add(this._editor.onDidChangeModelLanguage(()=>{this._updateTriggerCharacters(),this.cancel()})),this._toDispose.add(this._editor.onDidChangeConfiguration(()=>{this._updateTriggerCharacters(),this._updateQuickSuggest()})),this._toDispose.add(C.CompletionProviderRegistry.onDidChange(()=>{this._updateTriggerCharacters(),this._updateActiveSuggestSession()})),this._toDispose.add(this._editor.onDidChangeCursorSelection(L=>{this._onCursorChange(L)}));let y=!1;this._toDispose.add(this._editor.onDidCompositionStart(()=>{y=!0})),this._toDispose.add(this._editor.onDidCompositionEnd(()=>{y=!1,this._refilterCompletionItems()})),this._toDispose.add(this._editor.onDidChangeModelContent(()=>{y||this._refilterCompletionItems()})),this._updateTriggerCharacters(),this._updateQuickSuggest()}dispose(){w.dispose(this._triggerCharacterListener),w.dispose([this._onDidCancel,this._onDidSuggest,this._onDidTrigger,this._triggerQuickSuggest]),this._toDispose.dispose(),this._completionDisposables.dispose(),this.cancel()}_updateQuickSuggest(){this._quickSuggestDelay=this._editor.getOption(74),(isNaN(this._quickSuggestDelay)||!this._quickSuggestDelay&&this._quickSuggestDelay!==0||this._quickSuggestDelay<0)&&(this._quickSuggestDelay=10)}_updateTriggerCharacters(){if(this._triggerCharacterListener.clear(),!(this._editor.getOption(75)||!this._editor.hasModel()||!this._editor.getOption(104))){const h=new Map;for(const _ of C.CompletionProviderRegistry.all(this._editor.getModel()))for(const f of _.triggerCharacters||[]){let v=h.get(f);v||(v=new Set,v.add(g.getSnippetSuggestSupport()),h.set(f,v)),v.add(_)}const m=_=>{if(!_){const y=this._editor.getPosition();_=this._editor.getModel().getLineContent(y.lineNumber).substr(0,y.column-1)}let f="";a.isLowSurrogate(_.charCodeAt(_.length-1))?a.isHighSurrogate(_.charCodeAt(_.length-2))&&(f=_.substr(_.length-2)):f=_.charAt(_.length-1);const v=h.get(f);if(v){const y=this._completionModel?{items:this._completionModel.adopt(v),clipboardText:this._completionModel.clipboardText}:void 0;this.trigger({auto:!0,shy:!1,triggerCharacter:f},Boolean(this._completionModel),v,y)}};this._triggerCharacterListener.add(this._editor.onDidType(m)),this._triggerCharacterListener.add(this._editor.onDidCompositionEnd(m))}}get state(){return this._state}cancel(h=!1){var m;this._state!==0&&(this._triggerQuickSuggest.cancel(),(m=this._requestToken)===null||m===void 0||m.cancel(),this._requestToken=void 0,this._state=0,this._completionModel=void 0,this._context=void 0,this._onDidCancel.fire({retrigger:h}))}clear(){this._completionDisposables.clear()}_updateActiveSuggestSession(){this._state!==0&&(!this._editor.hasModel()||!C.CompletionProviderRegistry.has(this._editor.getModel())?this.cancel():this.trigger({auto:this._state===2,shy:!1},!0))}_onCursorChange(h){if(!!this._editor.hasModel()){const m=this._editor.getModel(),_=this._currentSelection;if(this._currentSelection=this._editor.getSelection(),!h.selection.isEmpty()||h.reason!==0&&h.reason!==3||h.source!=="keyboard"&&h.source!=="deleteLeft"){this.cancel();return}if(!!C.CompletionProviderRegistry.has(m))if(this._state===0&&h.reason===0){if(this._editor.getOption(73)===!1||!_.containsRange(this._currentSelection)&&!_.getEndPosition().isBeforeOrEqual(this._currentSelection.getPosition())||this._editor.getOption(101).snippetsPreventQuickSuggestions&&p.SnippetController2.get(this._editor).isInSnippet())return;this.cancel(),this._triggerQuickSuggest.cancelAndSet(()=>{if(this._state===0&&!!n.shouldAutoTrigger(this._editor)&&!!this._editor.hasModel()){const f=this._editor.getModel(),v=this._editor.getPosition(),y=this._editor.getOption(73);if(y!==!1){if(y!==!0){f.tokenizeIfCheap(v.lineNumber);const L=f.getLineTokens(v.lineNumber),I=L.getStandardTokenType(L.findTokenIndexAtOffset(Math.max(v.column-1-1,0)));if(!(y.other&&I===0||y.comments&&I===1||y.strings&&I===2))return}this.trigger({auto:!0,shy:!1})}}},this._quickSuggestDelay)}else this._state!==0&&h.reason===3&&this._refilterCompletionItems()}}_refilterCompletionItems(){Promise.resolve().then(()=>{if(this._state!==0&&!!this._editor.hasModel()){const h=this._editor.getModel(),m=this._editor.getPosition(),_=new n(h,m,this._state===2,!1);this._onNewContext(_)}})}trigger(h,m=!1,_,f){var v;if(!!this._editor.hasModel()){const y=this._editor.getModel(),L=h.auto,I=new n(y,this._editor.getPosition(),L,h.shy);this.cancel(m),this._state=L?2:1,this._onDidTrigger.fire({auto:L,shy:h.shy,position:this._editor.getPosition()}),this._context=I;let k={triggerKind:(v=h.triggerKind)!==null&&v!==void 0?v:0};h.triggerCharacter&&(k={triggerKind:1,triggerCharacter:h.triggerCharacter}),this._requestToken=new c.CancellationTokenSource;const E=this._editor.getOption(96);let T=1;switch(E){case"top":T=0;break;case"bottom":T=2;break}const O=ti._createItemKindFilter(this._editor),A=s.WordDistance.create(this._editorWorkerService,this._editor),B=g.provideSuggestionItems(y,this._editor.getPosition(),new g.CompletionOptions(T,O,_),k,this._requestToken.token);Promise.all([B,A]).then(([F,D])=>Ie(this,void 0,void 0,function*(){var R;if((R=this._requestToken)===null||R===void 0||R.dispose(),!!this._editor.hasModel()){let W=f==null?void 0:f.clipboardText;if(!W&&F.needsClipboard&&(W=yield this._clipboardService.readText()),this._state!==0){const x=this._editor.getModel();let K=F.items;if(f){const ee=g.getSuggestionComparator(T);K=K.concat(f.items).sort(ee)}const Y=new n(x,this._editor.getPosition(),L,h.shy);this._completionModel=new d.CompletionModel(K,this._context.column,{leadingLineContent:Y.leadingLineContent,characterCountDelta:Y.column-this._context.column},D,this._editor.getOption(101),this._editor.getOption(96),W),this._completionDisposables.add(F.disposable),this._onNewContext(Y),this._reportDurationsTelemetry(F.durations)}}})).catch(N.onUnexpectedError)}}_reportDurationsTelemetry(h){this._telemetryGate++%230==0&&setTimeout(()=>{this._telemetryService.publicLog2("suggest.durations.json",{data:JSON.stringify(h)}),this._logService.debug("suggest.durations.json",h)})}static _createItemKindFilter(h){const m=new Set;h.getOption(96)==="none"&&m.add(27);const f=h.getOption(101);return f.showMethods||m.add(0),f.showFunctions||m.add(1),f.showConstructors||m.add(2),f.showFields||m.add(3),f.showVariables||m.add(4),f.showClasses||m.add(5),f.showStructs||m.add(6),f.showInterfaces||m.add(7),f.showModules||m.add(8),f.showProperties||m.add(9),f.showEvents||m.add(10),f.showOperators||m.add(11),f.showUnits||m.add(12),f.showValues||m.add(13),f.showConstants||m.add(14),f.showEnums||m.add(15),f.showEnumMembers||m.add(16),f.showKeywords||m.add(17),f.showWords||m.add(18),f.showColors||m.add(19),f.showFiles||m.add(20),f.showReferences||m.add(21),f.showColors||m.add(22),f.showFolders||m.add(23),f.showTypeParameters||m.add(24),f.showSnippets||m.add(27),f.showUsers||m.add(25),f.showIssues||m.add(26),m}_onNewContext(h){if(!!this._context){if(h.lineNumber!==this._context.lineNumber){this.cancel();return}if(a.getLeadingWhitespace(h.leadingLineContent)!==a.getLeadingWhitespace(this._context.leadingLineContent)){this.cancel();return}if(h.columnthis._context.leadingWord.startColumn){const m=new Set(C.CompletionProviderRegistry.all(this._editor.getModel()));for(let f of this._completionModel.allProvider)m.delete(f);const _=this._completionModel.adopt(new Set);this.trigger({auto:this._context.auto,shy:!1},!0,m,{items:_,clipboardText:this._completionModel.clipboardText});return}if(h.column>this._context.column&&this._completionModel.incomplete.size>0&&h.leadingWord.word.length!==0){const{incomplete:m}=this._completionModel,_=this._completionModel.adopt(m);this.trigger({auto:this._state===2,shy:!1,triggerKind:2},!0,m,{items:_,clipboardText:this._completionModel.clipboardText})}else{let m=this._completionModel.lineContext,_=!1;if(this._completionModel.lineContext={leadingLineContent:h.leadingLineContent,characterCountDelta:h.column-this._context.column},this._completionModel.items.length===0){if(n.shouldAutoTrigger(this._editor)&&this._context.leadingWord.endColumn0,_&&h.leadingWord.word.length===0){this.cancel();return}}this._onDidSuggest.fire({completionModel:this._completionModel,auto:this._context.auto,shy:this._context.shy,isFrozen:_})}}}}};t=Me([_e(1,o.IEditorWorkerService),_e(2,u.IClipboardService),_e(3,r.ITelemetryService),_e(4,i.ILogService)],t),e.SuggestModel=t}),define(Q[682],J([0,1,47,19,12,39,2,70,13,62,3,25,192,131,576,507,26,16,9,86,117,548,681,666,549,6,15,20,414,415,14,17,34,23,77,81]),function(q,e,b,N,M,w,S,C,d,g,p,c,o,s,a,u,r,i,n,t,l,h,m,_,f,v,y,L,I,k,E,T,O,A,B,F){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.TriggerSuggestAction=e.SuggestController=void 0;let D=!1;class R{constructor(se,ne){if(this._model=se,this._position=ne,se.getLineMaxColumn(ne.lineNumber)!==ne.column){const X=se.getOffsetAt(ne),z=se.getPositionAt(X+1);this._marker=se.deltaDecorations([],[{range:p.Range.fromPositions(ne,z),options:{stickiness:1}}])}}dispose(){this._marker&&!this._model.isDisposed()&&this._model.deltaDecorations(this._marker,[])}delta(se){if(this._model.isDisposed()||this._position.lineNumber!==se.lineNumber)return 0;if(this._marker){const ne=this._model.getDecorationRange(this._marker[0]);return this._model.getOffsetAt(ne.getStartPosition())-this._model.getOffsetAt(se)}else return this._model.getLineMaxColumn(se.lineNumber)-se.column}}let W=class ii{constructor(se,ne,le,X,z,P){this._memoryService=ne,this._commandService=le,this._contextKeyService=X,this._instantiationService=z,this._logService=P,this._lineSuffix=new S.MutableDisposable,this._toDispose=new S.DisposableStore,this.editor=se,this.model=z.createInstance(m.SuggestModel,this.editor);const V=l.Context.InsertMode.bindTo(X);V.set(se.getOption(101).insertMode),this.model.onDidTrigger(()=>V.set(se.getOption(101).insertMode)),this.widget=this._toDispose.add(new y.IdleValue(()=>{const $=this._instantiationService.createInstance(_.SuggestWidget,this.editor);this._toDispose.add($),this._toDispose.add($.onDidSelect(j=>this._insertSuggestion(j,0),this));const ie=new I.CommitCharacterController(this.editor,$,j=>this._insertSuggestion(j,2));this._toDispose.add(ie),this._toDispose.add(this.model.onDidSuggest(j=>{j.completionModel.items.length===0&&ie.reset()}));const oe=l.Context.MakesTextEdit.bindTo(this._contextKeyService),ae=l.Context.HasInsertAndReplaceRange.bindTo(this._contextKeyService),G=l.Context.CanResolve.bindTo(this._contextKeyService);return this._toDispose.add(S.toDisposable(()=>{oe.reset(),ae.reset(),G.reset()})),this._toDispose.add($.onDidFocus(({item:j})=>{const te=this.editor.getPosition(),Z=j.editStart.column,ue=te.column;let he=!0;this.editor.getOption(1)==="smart"&&this.model.state===2&&!j.completion.command&&!j.completion.additionalTextEdits&&!(j.completion.insertTextRules&4)&&ue-Z===j.completion.insertText.length&&(he=this.editor.getModel().getValueInRange({startLineNumber:te.lineNumber,startColumn:Z,endLineNumber:te.lineNumber,endColumn:ue})!==j.completion.insertText),oe.set(he),ae.set(!E.Position.equals(j.editInsertEnd,j.editReplaceEnd)),G.set(Boolean(j.provider.resolveCompletionItem)||Boolean(j.completion.documentation)||j.completion.detail!==j.completion.label)})),this._toDispose.add($.onDetailsKeyDown(j=>{if(j.toKeybinding().equals(new w.SimpleKeybinding(!0,!1,!1,!1,33))||T.isMacintosh&&j.toKeybinding().equals(new w.SimpleKeybinding(!1,!1,!1,!0,33))){j.stopPropagation();return}j.toKeybinding().isModifierKey()||this.editor.focus()})),$})),this._overtypingCapturer=this._toDispose.add(new y.IdleValue(()=>this._toDispose.add(new k.OvertypingCapturer(this.editor,this.model)))),this._alternatives=this._toDispose.add(new y.IdleValue(()=>this._toDispose.add(new h.SuggestAlternatives(this.editor,this._contextKeyService)))),this._toDispose.add(z.createInstance(f.WordContextKey,se)),this._toDispose.add(this.model.onDidTrigger($=>{this.widget.value.showTriggered($.auto,$.shy?250:50),this._lineSuffix.value=new R(this.editor.getModel(),$.position)})),this._toDispose.add(this.model.onDidSuggest($=>{if(!$.shy){let ie=this._memoryService.select(this.editor.getModel(),this.editor.getPosition(),$.completionModel.items);this.widget.value.showSuggestions($.completionModel,ie,$.isFrozen,$.auto)}})),this._toDispose.add(this.model.onDidCancel($=>{$.retrigger||this.widget.value.hideWidget()})),this._toDispose.add(this.editor.onDidBlurEditorWidget(()=>{D||(this.model.cancel(),this.model.clear())}));let U=l.Context.AcceptSuggestionsOnEnter.bindTo(X),H=()=>{const $=this.editor.getOption(1);U.set($==="on"||$==="smart")};this._toDispose.add(this.editor.onDidChangeConfiguration(()=>H())),H()}static get(se){return se.getContribution(ii.ID)}dispose(){this._alternatives.dispose(),this._toDispose.dispose(),this.widget.dispose(),this.model.dispose(),this._lineSuffix.dispose()}_insertSuggestion(se,ne){if(!se||!se.item){this._alternatives.value.reset(),this.model.cancel(),this.model.clear();return}if(!!this.editor.hasModel()){const le=this.editor.getModel(),X=le.getAlternativeVersionId(),{item:z}=se,P=[],V=new A.CancellationTokenSource;ne&1||this.editor.pushUndoStop();const U=this.getOverwriteInfo(z,Boolean(ne&8));if(this._memoryService.memorize(le,this.editor.getPosition(),z),Array.isArray(z.completion.additionalTextEdits)){const $=C.StableEditorScrollState.capture(this.editor);this.editor.executeEdits("suggestController.additionalTextEdits.sync",z.completion.additionalTextEdits.map(ie=>g.EditOperation.replace(p.Range.lift(ie.range),ie.text))),$.restoreRelativeVerticalPositionOfCursor(this.editor)}else if(!z.isResolved){const $=new F.StopWatch(!0);let ie;const oe=le.onDidChangeContent(te=>{if(te.isFlush){V.cancel(),oe.dispose();return}for(let Z of te.changes){const ue=p.Range.getEndPosition(Z.range);(!ie||E.Position.isBefore(ue,ie))&&(ie=ue)}});let ae=ne;ne|=2;let G=!1,j=this.editor.onWillType(()=>{j.dispose(),G=!0,ae&2||this.editor.pushUndoStop()});P.push(z.resolve(V.token).then(()=>{if(!z.completion.additionalTextEdits||V.token.isCancellationRequested||ie&&z.completion.additionalTextEdits.some(Z=>E.Position.isBefore(ie,p.Range.getStartPosition(Z.range))))return!1;G&&this.editor.pushUndoStop();const te=C.StableEditorScrollState.capture(this.editor);return this.editor.executeEdits("suggestController.additionalTextEdits.async",z.completion.additionalTextEdits.map(Z=>g.EditOperation.replace(p.Range.lift(Z.range),Z.text))),te.restoreRelativeVerticalPositionOfCursor(this.editor),(G||!(ae&2))&&this.editor.pushUndoStop(),!0}).then(te=>{this._logService.trace("[suggest] async resolving of edits DONE (ms, applied?)",$.elapsed(),te),oe.dispose(),j.dispose()}))}let{insertText:H}=z.completion;z.completion.insertTextRules&4||(H=s.SnippetParser.escape(H)),o.SnippetController2.get(this.editor).insert(H,{overwriteBefore:U.overwriteBefore,overwriteAfter:U.overwriteAfter,undoStopBefore:!1,undoStopAfter:!1,adjustWhitespace:!(z.completion.insertTextRules&1),clipboardText:se.model.clipboardText,overtypingCapturer:this._overtypingCapturer.value}),ne&2||this.editor.pushUndoStop(),z.completion.command?z.completion.command.id===x.id?this.model.trigger({auto:!0,shy:!1},!0):(P.push(this._commandService.executeCommand(z.completion.command.id,...z.completion.command.arguments?[...z.completion.command.arguments]:[]).catch(M.onUnexpectedError)),this.model.cancel()):this.model.cancel(),ne&4&&this._alternatives.value.set(se,$=>{for(V.cancel();le.canUndo();){X!==le.getAlternativeVersionId()&&le.undo(),this._insertSuggestion($,1|2|(ne&8?8:0));break}}),this._alertCompletionItem(z),Promise.all(P).finally(()=>{this.model.clear(),V.dispose()})}}getOverwriteInfo(se,ne){L.assertType(this.editor.hasModel());let le=this.editor.getOption(101).insertMode==="replace";ne&&(le=!le);const X=se.position.column-se.editStart.column,z=(le?se.editReplaceEnd.column:se.editInsertEnd.column)-se.position.column,P=this.editor.getPosition().column-se.position.column,V=this._lineSuffix.value?this._lineSuffix.value.delta(this.editor.getPosition()):0;return{overwriteBefore:X+P,overwriteAfter:z+V}}_alertCompletionItem({completion:se}){const ne=typeof se.label=="string"?se.label:se.label.name;if(N.isNonEmptyArray(se.additionalTextEdits)){let le=u.localize(0,null,ne,se.additionalTextEdits.length);b.alert(le)}}triggerSuggest(se){this.editor.hasModel()&&(this.model.trigger({auto:!1,shy:!1},!1,se),this.editor.revealLine(this.editor.getPosition().lineNumber,0),this.editor.focus())}triggerSuggestAndAcceptBest(se){if(!!this.editor.hasModel()){const ne=this.editor.getPosition(),le=()=>{ne.equals(this.editor.getPosition())&&this._commandService.executeCommand(se.fallback)},X=z=>{if(z.completion.insertTextRules&4||z.completion.additionalTextEdits)return!0;const P=this.editor.getPosition(),V=z.editStart.column,U=P.column;return U-V!==z.completion.insertText.length?!0:this.editor.getModel().getValueInRange({startLineNumber:P.lineNumber,startColumn:V,endLineNumber:P.lineNumber,endColumn:U})!==z.completion.insertText};v.Event.once(this.model.onDidTrigger)(z=>{let P=[];v.Event.any(this.model.onDidTrigger,this.model.onDidCancel)(()=>{S.dispose(P),le()},void 0,P),this.model.onDidSuggest(({completionModel:V})=>{if(S.dispose(P),V.items.length===0){le();return}const U=this._memoryService.select(this.editor.getModel(),this.editor.getPosition(),V.items),H=V.items[U];if(!X(H)){le();return}this.editor.pushUndoStop(),this._insertSuggestion({index:U,item:H,model:V},4|1|2)},void 0,P)}),this.model.trigger({auto:!1,shy:!0}),this.editor.revealLine(ne.lineNumber,0),this.editor.focus()}}acceptSelectedSuggestion(se,ne){const le=this.widget.value.getFocusedItem();let X=0;se&&(X|=4),ne&&(X|=8),this._insertSuggestion(le,X)}acceptNextSuggestion(){this._alternatives.value.next()}acceptPrevSuggestion(){this._alternatives.value.prev()}cancelSuggestWidget(){this.model.cancel(),this.model.clear(),this.widget.value.hideWidget()}selectNextSuggestion(){this.widget.value.selectNext()}selectNextPageSuggestion(){this.widget.value.selectNextPage()}selectLastSuggestion(){this.widget.value.selectLast()}selectPrevSuggestion(){this.widget.value.selectPrevious()}selectPrevPageSuggestion(){this.widget.value.selectPreviousPage()}selectFirstSuggestion(){this.widget.value.selectFirst()}toggleSuggestionDetails(){this.widget.value.toggleDetails()}toggleExplainMode(){this.widget.value.toggleExplainMode()}toggleSuggestionFocus(){this.widget.value.toggleDetailsFocus()}resetWidgetSize(){this.widget.value.resetPersistedSize()}};W.ID="editor.contrib.suggestController",W=Me([_e(1,a.ISuggestMemoryService),_e(2,r.ICommandService),_e(3,i.IContextKeyService),_e(4,n.IInstantiationService),_e(5,B.ILogService)],W),e.SuggestController=W;class x extends d.EditorAction{constructor(){super({id:x.id,label:u.localize(1,null),alias:"Trigger Suggest",precondition:i.ContextKeyExpr.and(c.EditorContextKeys.writable,c.EditorContextKeys.hasCompletionItemProvider),kbOpts:{kbExpr:c.EditorContextKeys.textInputFocus,primary:2048|10,secondary:[2048|39],mac:{primary:256|10,secondary:[512|9,2048|39]},weight:100}})}run(se,ne){const le=W.get(ne);!le||le.triggerSuggest()}}e.TriggerSuggestAction=x,x.id="editor.action.triggerSuggest",d.registerEditorContribution(W.ID,W),d.registerEditorAction(x);const K=100+90,Y=d.EditorCommand.bindToContribution(W.get);d.registerEditorCommand(new Y({id:"acceptSelectedSuggestion",precondition:l.Context.Visible,handler(ee){ee.acceptSelectedSuggestion(!0,!1)}})),t.KeybindingsRegistry.registerKeybindingRule({id:"acceptSelectedSuggestion",when:i.ContextKeyExpr.and(l.Context.Visible,c.EditorContextKeys.textInputFocus),primary:2,weight:K}),t.KeybindingsRegistry.registerKeybindingRule({id:"acceptSelectedSuggestion",when:i.ContextKeyExpr.and(l.Context.Visible,c.EditorContextKeys.textInputFocus,l.Context.AcceptSuggestionsOnEnter,l.Context.MakesTextEdit),primary:3,weight:K}),O.MenuRegistry.appendMenuItem(l.suggestWidgetStatusbarMenu,{command:{id:"acceptSelectedSuggestion",title:u.localize(2,null)},group:"left",order:1,when:l.Context.HasInsertAndReplaceRange.toNegated()}),O.MenuRegistry.appendMenuItem(l.suggestWidgetStatusbarMenu,{command:{id:"acceptSelectedSuggestion",title:u.localize(3,null)},group:"left",order:1,when:i.ContextKeyExpr.and(l.Context.HasInsertAndReplaceRange,l.Context.InsertMode.isEqualTo("insert"))}),O.MenuRegistry.appendMenuItem(l.suggestWidgetStatusbarMenu,{command:{id:"acceptSelectedSuggestion",title:u.localize(4,null)},group:"left",order:1,when:i.ContextKeyExpr.and(l.Context.HasInsertAndReplaceRange,l.Context.InsertMode.isEqualTo("replace"))}),d.registerEditorCommand(new Y({id:"acceptAlternativeSelectedSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,c.EditorContextKeys.textInputFocus),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:1024|3,secondary:[1024|2]},handler(ee){ee.acceptSelectedSuggestion(!1,!0)},menuOpts:[{menuId:l.suggestWidgetStatusbarMenu,group:"left",order:2,when:i.ContextKeyExpr.and(l.Context.HasInsertAndReplaceRange,l.Context.InsertMode.isEqualTo("insert")),title:u.localize(5,null)},{menuId:l.suggestWidgetStatusbarMenu,group:"left",order:2,when:i.ContextKeyExpr.and(l.Context.HasInsertAndReplaceRange,l.Context.InsertMode.isEqualTo("replace")),title:u.localize(6,null)}]})),r.CommandsRegistry.registerCommandAlias("acceptSelectedSuggestionOnEnter","acceptSelectedSuggestion"),d.registerEditorCommand(new Y({id:"hideSuggestWidget",precondition:l.Context.Visible,handler:ee=>ee.cancelSuggestWidget(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:9,secondary:[1024|9]}})),d.registerEditorCommand(new Y({id:"selectNextSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,l.Context.MultipleSuggestions),handler:ee=>ee.selectNextSuggestion(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:18,secondary:[2048|18],mac:{primary:18,secondary:[2048|18,256|44]}}})),d.registerEditorCommand(new Y({id:"selectNextPageSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,l.Context.MultipleSuggestions),handler:ee=>ee.selectNextPageSuggestion(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:12,secondary:[2048|12]}})),d.registerEditorCommand(new Y({id:"selectLastSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,l.Context.MultipleSuggestions),handler:ee=>ee.selectLastSuggestion()})),d.registerEditorCommand(new Y({id:"selectPrevSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,l.Context.MultipleSuggestions),handler:ee=>ee.selectPrevSuggestion(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:16,secondary:[2048|16],mac:{primary:16,secondary:[2048|16,256|46]}}})),d.registerEditorCommand(new Y({id:"selectPrevPageSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,l.Context.MultipleSuggestions),handler:ee=>ee.selectPrevPageSuggestion(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:11,secondary:[2048|11]}})),d.registerEditorCommand(new Y({id:"selectFirstSuggestion",precondition:i.ContextKeyExpr.and(l.Context.Visible,l.Context.MultipleSuggestions),handler:ee=>ee.selectFirstSuggestion()})),d.registerEditorCommand(new Y({id:"toggleSuggestionDetails",precondition:l.Context.Visible,handler:ee=>ee.toggleSuggestionDetails(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:2048|10,mac:{primary:256|10}},menuOpts:[{menuId:l.suggestWidgetStatusbarMenu,group:"right",order:1,when:i.ContextKeyExpr.and(l.Context.DetailsVisible,l.Context.CanResolve),title:u.localize(7,null)},{menuId:l.suggestWidgetStatusbarMenu,group:"right",order:1,when:i.ContextKeyExpr.and(l.Context.DetailsVisible.toNegated(),l.Context.CanResolve),title:u.localize(8,null)}]})),d.registerEditorCommand(new Y({id:"toggleExplainMode",precondition:l.Context.Visible,handler:ee=>ee.toggleExplainMode(),kbOpts:{weight:100,primary:2048|85}})),d.registerEditorCommand(new Y({id:"toggleSuggestionFocus",precondition:l.Context.Visible,handler:ee=>ee.toggleSuggestionFocus(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:2048|512|10,mac:{primary:256|512|10}}})),d.registerEditorCommand(new Y({id:"insertBestCompletion",precondition:i.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,i.ContextKeyExpr.equals("config.editor.tabCompletion","on"),f.WordContextKey.AtEnd,l.Context.Visible.toNegated(),h.SuggestAlternatives.OtherSuggestions.toNegated(),o.SnippetController2.InSnippetMode.toNegated()),handler:(ee,se)=>{ee.triggerSuggestAndAcceptBest(L.isObject(se)?Object.assign({fallback:"tab"},se):{fallback:"tab"})},kbOpts:{weight:K,primary:2}})),d.registerEditorCommand(new Y({id:"insertNextSuggestion",precondition:i.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,i.ContextKeyExpr.equals("config.editor.tabCompletion","on"),h.SuggestAlternatives.OtherSuggestions,l.Context.Visible.toNegated(),o.SnippetController2.InSnippetMode.toNegated()),handler:ee=>ee.acceptNextSuggestion(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:2}})),d.registerEditorCommand(new Y({id:"insertPrevSuggestion",precondition:i.ContextKeyExpr.and(c.EditorContextKeys.textInputFocus,i.ContextKeyExpr.equals("config.editor.tabCompletion","on"),h.SuggestAlternatives.OtherSuggestions,l.Context.Visible.toNegated(),o.SnippetController2.InSnippetMode.toNegated()),handler:ee=>ee.acceptPrevSuggestion(),kbOpts:{weight:K,kbExpr:c.EditorContextKeys.textInputFocus,primary:1024|2}})),d.registerEditorAction(class extends d.EditorAction{constructor(){super({id:"editor.action.resetSuggestSize",label:u.localize(9,null),alias:"Reset Suggest Widget Size",precondition:void 0})}run(ee,se){W.get(se).resetWidgetSize()}})}),define(Q[683],J([0,1,188,143,266,215,611,612,613,614,615,635,618,670,619,620,621,622,267,659,623,624,545,271,272,268,273,629,630,628,631,632,633,662,664,636,637,192,682,638,264,639,671,640,265,641,64,123]),function(q,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0})});var mt=this&&this.__createBinding||(Object.create?function(q,e,b,N){N===void 0&&(N=b),Object.defineProperty(q,N,{enumerable:!0,get:function(){return e[b]}})}:function(q,e,b,N){N===void 0&&(N=b),q[N]=e[b]}),pt=this&&this.__exportStar||function(q,e){for(var b in q)b!=="default"&&!Object.prototype.hasOwnProperty.call(e,b)&&mt(e,q,b)};define(Q[686],J([0,1,677,683,642,643,644,573,646,647,645,672,648]),function(q,e,b){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),pt(b,e)})}).call(this); + + +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-typescript version: 4.3.1(d4e91e07d8144e428885c93029b3d3cbf1994c33) + * Released under the MIT license + * https://github.com/Microsoft/monaco-typescript/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/language/typescript/lib/typescriptServicesMetadata",["require","exports"],(function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.typescriptVersion=void 0,e.typescriptVersion="4.2.3"})),define("vs/language/typescript/fillers/monaco-editor-core",['vs/editor/editor.api'],(function(){return self.monaco})),define("vs/language/typescript/monaco.contribution",["require","exports","./lib/typescriptServicesMetadata","./fillers/monaco-editor-core"],(function(t,e,i,n){"use strict";var r,o,s,a,c;Object.defineProperty(e,"__esModule",{value:!0}),e.getJavaScriptWorker=e.getTypeScriptWorker=e.javascriptDefaults=e.typescriptDefaults=e.typescriptVersion=e.ModuleResolutionKind=e.ScriptTarget=e.NewLineKind=e.JsxEmit=e.ModuleKind=void 0,function(t){t[t.None=0]="None",t[t.CommonJS=1]="CommonJS",t[t.AMD=2]="AMD",t[t.UMD=3]="UMD",t[t.System=4]="System",t[t.ES2015=5]="ES2015",t[t.ESNext=99]="ESNext"}(r=e.ModuleKind||(e.ModuleKind={})),function(t){t[t.None=0]="None",t[t.Preserve=1]="Preserve",t[t.React=2]="React",t[t.ReactNative=3]="ReactNative",t[t.ReactJSX=4]="ReactJSX",t[t.ReactJSXDev=5]="ReactJSXDev"}(o=e.JsxEmit||(e.JsxEmit={})),function(t){t[t.CarriageReturnLineFeed=0]="CarriageReturnLineFeed",t[t.LineFeed=1]="LineFeed"}(s=e.NewLineKind||(e.NewLineKind={})),function(t){t[t.ES3=0]="ES3",t[t.ES5=1]="ES5",t[t.ES2015=2]="ES2015",t[t.ES2016=3]="ES2016",t[t.ES2017=4]="ES2017",t[t.ES2018=5]="ES2018",t[t.ES2019=6]="ES2019",t[t.ES2020=7]="ES2020",t[t.ESNext=99]="ESNext",t[t.JSON=100]="JSON",t[t.Latest=99]="Latest"}(a=e.ScriptTarget||(e.ScriptTarget={})),function(t){t[t.Classic=1]="Classic",t[t.NodeJs=2]="NodeJs"}(c=e.ModuleResolutionKind||(e.ModuleResolutionKind={}));var p=function(){function t(t,e,i){this._onDidChange=new n.Emitter,this._onDidExtraLibsChange=new n.Emitter,this._extraLibs=Object.create(null),this._removedExtraLibs=Object.create(null),this._eagerModelSync=!1,this.setCompilerOptions(t),this.setDiagnosticsOptions(e),this.setWorkerOptions(i),this._onDidExtraLibsChangeTimeout=-1}return Object.defineProperty(t.prototype,"onDidChange",{get:function(){return this._onDidChange.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"onDidExtraLibsChange",{get:function(){return this._onDidExtraLibsChange.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"workerOptions",{get:function(){return this._workerOptions},enumerable:!1,configurable:!0}),t.prototype.getExtraLibs=function(){return this._extraLibs},t.prototype.addExtraLib=function(t,e){var i,n=this;if(i=void 0===e?"ts:extralib-"+Math.random().toString(36).substring(2,15):e,this._extraLibs[i]&&this._extraLibs[i].content===t)return{dispose:function(){}};var r=1;return this._removedExtraLibs[i]&&(r=this._removedExtraLibs[i]+1),this._extraLibs[i]&&(r=this._extraLibs[i].version+1),this._extraLibs[i]={content:t,version:r},this._fireOnDidExtraLibsChangeSoon(),{dispose:function(){var t=n._extraLibs[i];t&&t.version===r&&(delete n._extraLibs[i],n._removedExtraLibs[i]=r,n._fireOnDidExtraLibsChangeSoon())}}},t.prototype.setExtraLibs=function(t){for(var e in this._extraLibs)this._removedExtraLibs[e]=this._extraLibs[e].version;if(this._extraLibs=Object.create(null),t&&t.length>0)for(var i=0,n=t;i console.log", weil "log" vor Kurzem abgeschlossen wurde.','W\xE4hlen Sie Vorschl\xE4ge basierend auf fr\xFCheren Pr\xE4fixen aus, die diese Vorschl\xE4ge abgeschlossen haben, z.B. "co -> console" und "con ->" const".',"Steuert, wie Vorschl\xE4ge bei Anzeige der Vorschlagsliste vorab ausgew\xE4hlt werden.","Die Tab-Vervollst\xE4ndigung f\xFCgt den passendsten Vorschlag ein, wenn auf Tab gedr\xFCckt wird.","Tab-Vervollst\xE4ndigungen deaktivieren.",'Codeausschnitte per Tab vervollst\xE4ndigen, wenn die Pr\xE4fixe \xFCbereinstimmen. Funktioniert am besten, wenn "quickSuggestions" deaktiviert sind.',"Tab-Vervollst\xE4ndigungen aktivieren.","Ungew\xF6hnliche Zeilenabschlusszeichen werden automatisch entfernt.","Ungew\xF6hnliche Zeilenabschlusszeichen werden ignoriert.","Zum Entfernen ungew\xF6hnlicher Zeilenabschlusszeichen wird eine Eingabeaufforderung angezeigt.","Entfernen Sie un\xFCbliche Zeilenabschlusszeichen, die Probleme verursachen k\xF6nnen.","Das Einf\xFCgen und L\xF6schen von Leerzeichen erfolgt nach Tabstopps.","Zeichen, die als Worttrennzeichen verwendet werden, wenn wortbezogene Navigationen oder Vorg\xE4nge ausgef\xFChrt werden.","Zeilenumbr\xFCche erfolgen nie.","Der Zeilenumbruch erfolgt an der Breite des Anzeigebereichs.",'Der Zeilenumbruch erfolgt bei "#editor.wordWrapColumn#".','Der Zeilenumbruch erfolgt beim Mindestanzeigebereich und "#editor.wordWrapColumn".',"Steuert, wie der Zeilenumbruch durchgef\xFChrt werden soll.",'Steuert die umschlie\xDFende Spalte des Editors, wenn "#editor.wordWrap#" den Wert "wordWrapColumn" oder "bounded" aufweist.',"Kein Einzug. Umbrochene Zeilen beginnen bei Spalte 1.","Umbrochene Zeilen erhalten den gleichen Einzug wie das \xFCbergeordnete Element.","Umbrochene Zeilen erhalten + 1 Einzug auf das \xFCbergeordnete Element.","Umgebrochene Zeilen werden im Vergleich zum \xFCbergeordneten Element +2 einger\xFCckt.","Steuert die Einr\xFCckung der umbrochenen Zeilen.","Es wird angenommen, dass alle Zeichen gleich breit sind. Dies ist ein schneller Algorithmus, der f\xFCr Festbreitenschriftarten und bestimmte Alphabete (wie dem lateinischen), bei denen die Glyphen gleich breit sind, korrekt funktioniert.","Delegiert die Berechnung von Umbruchpunkten an den Browser. Dies ist ein langsamer Algorithmus, der bei gro\xDFen Dateien Code Freezes verursachen kann, aber in allen F\xE4llen korrekt funktioniert.","Steuert den Algorithmus, der Umbruchpunkte berechnet."],"vs/editor/common/editorContextKeys":["Gibt an, ob der Editor-Text den Fokus besitzt (Cursor blinkt).","Gibt an, ob der Editor oder ein Editor-Widget den Fokus besitzt (z.\xA0B. ob der Fokus sich im Suchwidget befindet).","Gibt an, ob ein Editor oder eine Rich-Text-Eingabe den Fokus besitzt (Cursor blinkt).","Gibt an, ob der Editor schreibgesch\xFCtzt ist.","Gibt an, ob der Kontext ein Diff-Editor ist.",'Gibt an, ob "editor.columnSelection" aktiviert ist.',"Gibt an, ob im Editor Text ausgew\xE4hlt ist.","Gibt an, ob der Editor \xFCber Mehrfachauswahl verf\xFCgt.","Gibt an, ob die TAB-TASTE den Fokus aus dem Editor verschiebt.","Gibt an, ob Hover im Editor sichtbar ist.","Gibt an, ob der Editor Bestandteil eines gr\xF6\xDFeren Editors ist (z.\xA0B. Notebooks).","Der Sprachbezeichner des Editors.","Gibt an, ob der Editor \xFCber einen Vervollst\xE4ndigungselementanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Codeaktionsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen CodeLens-Anbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Definitionsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Deklarationsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Implementierungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Typdefinitionsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Hoveranbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Dokumenthervorhebungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Dokumentsymbolanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Verweisanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Umbenennungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Signaturhilfeanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Inlinehinweisanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Dokumentformatierungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber einen Anbieter f\xFCr Dokumentauswahlformatierung verf\xFCgt.","Gibt an, ob der Editor \xFCber mehrere Dokumentformatierungsanbieter verf\xFCgt.","Gibt an, ob der Editor \xFCber mehrere Anbieter f\xFCr Dokumentauswahlformatierung verf\xFCgt."],"vs/editor/common/model/editStack":["Eingabe"],"vs/editor/common/modes/modesRegistry":["Nur-Text"],"vs/editor/common/standaloneStrings":["Keine Auswahl","Zeile {0}, Spalte {1} ({2} ausgew\xE4hlt)","Zeile {0}, Spalte {1}","{0} Auswahlen ({1} Zeichen ausgew\xE4hlt)","{0} Auswahlen",'Die Einstellung "accessibilitySupport" wird jetzt in "on" ge\xE4ndert.',"Die Dokumentationsseite zur Barrierefreiheit des Editors wird ge\xF6ffnet."," in einem schreibgesch\xFCtzten Bereich eines Diff-Editors."," in einem Bereich eines Diff-Editors."," in einem schreibgesch\xFCtzten Code-Editor"," in einem Code-Editor","Dr\xFCcken Sie BEFEHLSTASTE + E, um den Editor f\xFCr eine optimierte Verwendung mit Sprachausgabe zu konfigurieren.","Dr\xFCcken Sie STRG + E, um den Editor f\xFCr eine optimierte Verwendung mit Sprachausgabe zu konfigurieren.","Der Editor ist auf eine optimale Verwendung mit Sprachausgabe konfiguriert.","Der Editor ist so konfiguriert, dass er nie auf die Verwendung mit Sprachausgabe hin optimiert wird. Dies ist zu diesem Zeitpunkt nicht der Fall.","Durch Dr\xFCcken der TAB-TASTE im aktuellen Editor wird der Fokus in das n\xE4chste Element verschoben, das den Fokus erhalten kann. Schalten Sie dieses Verhalten um, indem Sie {0} dr\xFCcken.","Durch Dr\xFCcken der TAB-TASTE im aktuellen Editor wird der Fokus in das n\xE4chste Element verschoben, das den Fokus erhalten kann. Der {0}-Befehl kann zurzeit nicht durch eine Tastenzuordnung ausgel\xF6st werden.","Durch Dr\xFCcken der TAB-TASTE im aktuellen Editor wird das Tabstoppzeichen eingef\xFCgt. Schalten Sie dieses Verhalten um, indem Sie {0} dr\xFCcken.","Durch Dr\xFCcken der TAB-TASTE im aktuellen Editor wird das Tabstoppzeichen eingef\xFCgt. Der {0}-Befehl kann zurzeit nicht durch eine Tastenzuordnung ausgel\xF6st werden.","Dr\xFCcken Sie BEFEHLSTASTE + H, um ein Browserfenster mit weiteren Informationen zur Barrierefreiheit des Editors zu \xF6ffnen.","Dr\xFCcken Sie STRG + H, um ein Browserfenster mit weiteren Informationen zur Barrierefreiheit des Editors zu \xF6ffnen.","Sie k\xF6nnen diese QuickInfo schlie\xDFen und durch Dr\xFCcken von ESC oder UMSCHALT+ESC zum Editor zur\xFCckkehren.","Hilfe zur Barrierefreiheit anzeigen","Entwickler: Token \xFCberpr\xFCfen","Gehe zu Zeile/Spalte...","Alle Anbieter f\xFCr den Schnellzugriff anzeigen","Befehlspalette","Befehle anzeigen und ausf\xFChren","Gehe zu Symbol...","Gehe zu Symbol nach Kategorie...","Editor-Inhalt","Dr\xFCcken Sie ALT + F1, um die Barrierefreiheitsoptionen aufzurufen.","Zu Design mit hohem Kontrast umschalten","{0} Bearbeitungen in {1} Dateien durchgef\xFChrt"],"vs/editor/common/view/editorColorRegistry":["Hintergrundfarbe zur Hervorhebung der Zeile an der Cursorposition.","Hintergrundfarbe f\xFCr den Rahmen um die Zeile an der Cursorposition.","Hintergrundfarbe der markierten Bereiche, wie z.B. Quick Open oder die Suche. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe f\xFCr den Rahmen um hervorgehobene Bereiche.",'Hintergrundfarbe des hervorgehobenen Symbols, z. B. "Gehe zu Definition" oder "Gehe zu n\xE4chster/vorheriger". Die Farbe darf nicht undurchsichtig sein, um zugrunde liegende Dekorationen nicht zu verbergen.',"Hintergrundfarbe des Rahmens um hervorgehobene Symbole","Farbe des Cursors im Editor.","Hintergrundfarbe vom Editor-Cursor. Erlaubt die Anpassung der Farbe von einem Zeichen, welches von einem Block-Cursor \xFCberdeckt wird.","Farbe der Leerzeichen im Editor.","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im Editor.","Farbe der F\xFChrungslinien f\xFCr Einz\xFCge im aktiven Editor.","Zeilennummernfarbe im Editor.","Zeilennummernfarbe der aktiven Editorzeile.",'Die ID ist veraltet. Verwenden Sie stattdessen "editorLineNumber.activeForeground".',"Zeilennummernfarbe der aktiven Editorzeile.","Farbe des Editor-Lineals.","Vordergrundfarbe der CodeLens-Links im Editor","Hintergrundfarbe f\xFCr zusammengeh\xF6rige Klammern","Farbe f\xFCr zusammengeh\xF6rige Klammern","Farbe des Rahmens f\xFCr das \xDCbersicht-Lineal.","Hintergrundfarbe des \xDCbersichtslineals im Editor. Wird nur verwendet, wenn die Minimap aktiviert ist und auf der rechten Seite des Editors platziert wird.","Hintergrundfarbe der Editorleiste. Die Leiste enth\xE4lt die Glyphenr\xE4nder und die Zeilennummern.","Rahmenfarbe unn\xF6tigen (nicht genutzten) Quellcodes im Editor.",'Deckkraft des unn\xF6tigen (nicht genutzten) Quellcodes im Editor. "#000000c0" rendert z.B. den Code mit einer Deckkraft von 75%. Verwenden Sie f\xFCr Designs mit hohem Kontrast das Farbdesign "editorUnnecessaryCode.border", um unn\xF6tigen Code zu unterstreichen statt ihn abzublenden.',"\xDCbersichtslinealmarkerfarbe f\xFCr das Hervorheben von Bereichen. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","\xDCbersichtslineal-Markierungsfarbe f\xFCr Fehler.","\xDCbersichtslineal-Markierungsfarbe f\xFCr Warnungen.","\xDCbersichtslineal-Markierungsfarbe f\xFCr Informationen."],"vs/editor/contrib/anchorSelect/anchorSelect":["Auswahlanker",'Anker festgelegt bei "{0}:{1}"',"Auswahlanker festlegen","Zu Auswahlanker wechseln","Auswahl von Anker zu Cursor","Auswahlanker abbrechen"],"vs/editor/contrib/bracketMatching/bracketMatching":["\xDCbersichtslineal-Markierungsfarbe f\xFCr zusammengeh\xF6rige Klammern.","Gehe zu Klammer","Ausw\xE4hlen bis Klammer","Gehe zu &&Klammer"],"vs/editor/contrib/caretOperations/caretOperations":["Ausgew\xE4hlten Text nach links verschieben","Ausgew\xE4hlten Text nach rechts verschieben"],"vs/editor/contrib/caretOperations/transpose":["Buchstaben austauschen"],"vs/editor/contrib/clipboard/clipboard":["&&Ausschneiden","Ausschneiden","Ausschneiden","&&Kopieren","Kopieren","Kopieren","&&Einf\xFCgen","Einf\xFCgen","Einf\xFCgen","Mit Syntaxhervorhebung kopieren"],"vs/editor/contrib/codeAction/codeActionCommands":["Art der auszuf\xFChrenden Codeaktion","Legt fest, wann die zur\xFCckgegebenen Aktionen angewendet werden","Die erste zur\xFCckgegebene Codeaktion immer anwenden","Die erste zur\xFCckgegebene Codeaktion anwenden, wenn nur eine vorhanden ist","Zur\xFCckgegebene Codeaktionen nicht anwenden","Legt fest, ob nur bevorzugte Codeaktionen zur\xFCckgegeben werden sollen","Beim Anwenden der Code-Aktion ist ein unbekannter Fehler aufgetreten","Schnelle Problembehebung ...","Keine Codeaktionen verf\xFCgbar",'Keine bevorzugten Codeaktionen f\xFCr "{0}" verf\xFCgbar','Keine Codeaktionen f\xFCr "{0}" verf\xFCgbar',"Keine bevorzugten Codeaktionen verf\xFCgbar","Keine Codeaktionen verf\xFCgbar","Refactoring durchf\xFChren...",'Keine bevorzugten Refactorings f\xFCr "{0}" verf\xFCgbar','Keine Refactorings f\xFCr "{0}" verf\xFCgbar',"Keine bevorzugten Refactorings verf\xFCgbar","Keine Refactorings verf\xFCgbar","Quellaktion...",'Keine bevorzugten Quellaktionen f\xFCr "{0}" verf\xFCgbar','Keine Quellaktionen f\xFCr "{0}" verf\xFCgbar',"Keine bevorzugten Quellaktionen verf\xFCgbar","Keine Quellaktionen verf\xFCgbar","Importe organisieren","Keine Aktion zum Organisieren von Importen verf\xFCgbar","Alle korrigieren",'Aktion "Alle korrigieren" nicht verf\xFCgbar',"Automatisch korrigieren...","Keine automatischen Korrekturen verf\xFCgbar"],"vs/editor/contrib/codeAction/lightBulbWidget":["Fixes anzeigen. Bevorzugter Fix verf\xFCgbar ({0})","Korrekturen anzeigen ({0})","Korrekturen anzeigen"],"vs/editor/contrib/codelens/codelensController":["CodeLens-Befehle f\xFCr aktuelle Zeile anzeigen"],"vs/editor/contrib/comment/comment":["Zeilenkommentar umschalten","Zeilenkommen&&tar umschalten","Zeilenkommentar hinzuf\xFCgen","Zeilenkommentar entfernen","Blockkommentar umschalten","&&Blockkommentar umschalten"],"vs/editor/contrib/contextmenu/contextmenu":["Editor-Kontextmen\xFC anzeigen"],"vs/editor/contrib/cursorUndo/cursorUndo":["Mit Cursor r\xFCckg\xE4ngig machen","Wiederholen mit Cursor"],"vs/editor/contrib/find/findController":["Suchen","&&Suchen","Mit Auswahl suchen","Weitersuchen","Weitersuchen","Vorheriges Element suchen","Vorheriges Element suchen","N\xE4chste Auswahl suchen","Vorherige Auswahl suchen","Ersetzen","&&Ersetzen"],"vs/editor/contrib/find/findWidget":['Symbol f\xFCr "In Auswahl suchen" im Editor-Such-Widget.',"Symbol f\xFCr die Anzeige, dass das Editor-Such-Widget zugeklappt wurde.","Symbol f\xFCr die Anzeige, dass das Editor-Such-Widget aufgeklappt wurde.",'Symbol f\xFCr "Ersetzen" im Editor-Such-Widget.','Symbol f\xFCr "Alle ersetzen" im Editor-Such-Widget.','Symbol f\xFCr "Vorheriges Element suchen" im Editor-Such-Widget.','Symbol f\xFCr "N\xE4chstes Element suchen" im Editor-Such-Widget.',"Suchen","Suchen","Vorheriger Treffer","N\xE4chste \xDCbereinstimmung","In Auswahl suchen","Schlie\xDFen","Ersetzen","Ersetzen","Ersetzen","Alle ersetzen","Ersetzen-Modus wechseln","Nur die ersten {0} Ergebnisse wurden hervorgehoben, aber alle Suchoperationen werden auf dem gesamten Text durchgef\xFChrt.","{0} von {1}","Keine Ergebnisse","{0} gefunden",'{0} f\xFCr "{1}" gefunden','{0} f\xFCr "{1}" gefunden, bei {2}','{0} f\xFCr "{1}" gefunden','STRG+EINGABE f\xFCgt jetzt einen Zeilenumbruch ein, statt alles zu ersetzen. Sie k\xF6nnen die Tastenzuordnung f\xFCr "editor.action.replaceAll" \xE4ndern, um dieses Verhalten au\xDFer Kraft zu setzen.'],"vs/editor/contrib/folding/folding":["Auffalten","Faltung rekursiv aufheben","Falten","Einklappung umschalten","Rekursiv falten","Alle Blockkommentare falten","Alle Regionen falten","Alle Regionen auffalten","Alle falten","Alle auffalten","Faltebene {0}","Hintergrundfarbe hinter gefalteten Bereichen. Die Farbe darf nicht deckend sein, sodass zugrunde liegende Dekorationen nicht ausgeblendet werden.","Farbe des Faltsteuerelements im Editor-Bundsteg."],"vs/editor/contrib/folding/foldingDecorations":["Symbol f\xFCr aufgeklappte Bereiche im Editor-Glyphenrand.","Symbol f\xFCr zugeklappte Bereiche im Editor-Glyphenrand."],"vs/editor/contrib/fontZoom/fontZoom":["Editorschriftart vergr\xF6\xDFern","Editorschriftart verkleinern","Editor Schriftart Vergr\xF6\xDFerung zur\xFCcksetzen"],"vs/editor/contrib/format/format":["1 Formatierung in Zeile {0} vorgenommen","{0} Formatierungen in Zeile {1} vorgenommen","1 Formatierung zwischen Zeilen {0} und {1} vorgenommen","{0} Formatierungen zwischen Zeilen {1} und {2} vorgenommen"],"vs/editor/contrib/format/formatActions":["Dokument formatieren","Auswahl formatieren"],"vs/editor/contrib/gotoError/gotoError":["Gehe zu n\xE4chstem Problem (Fehler, Warnung, Information)","Symbol f\xFCr den Marker zum Wechseln zum n\xE4chsten Element.","Gehe zu vorigem Problem (Fehler, Warnung, Information)","Symbol f\xFCr den Marker zum Wechseln zum vorherigen Element.","Gehe zu dem n\xE4chsten Problem in den Dateien (Fehler, Warnung, Info)","N\xE4chstes &&Problem","Gehe zu dem vorherigen Problem in den Dateien (Fehler, Warnung, Info)","Vorheriges &&Problem"],"vs/editor/contrib/gotoError/gotoErrorWidget":["Fehler","Warnung","Info","Hinweis","{0} bei {1}. ","{0} von {1} Problemen","{0} von {1} Problemen","Editormarkierung: Farbe bei Fehler des Navigationswidgets.","Editormarkierung: Farbe bei Warnung des Navigationswidgets.","Editormarkierung: Farbe bei Information des Navigationswidgets.","Editormarkierung: Hintergrund des Navigationswidgets."],"vs/editor/contrib/gotoSymbol/goToCommands":["Vorschau","Definitionen",'Keine Definition gefunden f\xFCr "{0}".',"Keine Definition gefunden","Gehe zu Definition","Gehe &&zu Definition","Definition an der Seite \xF6ffnen","Definition einsehen","Deklarationen",'Keine Deklaration f\xFCr "{0}" gefunden.',"Keine Deklaration gefunden.","Zur Deklaration wechseln","Gehe zu &&Deklaration",'Keine Deklaration f\xFCr "{0}" gefunden.',"Keine Deklaration gefunden.","Vorschau f\xFCr Deklaration anzeigen","Typdefinitionen",'Keine Typendefinition gefunden f\xFCr "{0}"',"Keine Typendefinition gefunden","Zur Typdefinition wechseln","Zur &&Typdefinition wechseln","Vorschau der Typdefinition anzeigen","Implementierungen",'Keine Implementierung gefunden f\xFCr "{0}"',"Keine Implementierung gefunden","Gehe zu Implementierungen","Gehe zu &&Implementierungen","Vorschau f\xFCr Implementierungen anzeigen",'F\xFCr "{0}" wurden keine Verweise gefunden.',"Keine Referenzen gefunden","Gehe zu Verweisen","Gehe zu &&Verweisen","Verweise","Vorschau f\xFCr Verweise anzeigen","Verweise","Gehe zu beliebigem Symbol","Speicherorte",'Keine Ergebnisse f\xFCr "{0}"',"Verweise"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["Klicken Sie, um {0} Definitionen anzuzeigen."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["Wird geladen...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} Verweise","{0} Verweis","Verweise"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["Keine Vorschau verf\xFCgbar.","Keine Ergebnisse","Verweise"],"vs/editor/contrib/gotoSymbol/referencesModel":["Symbol in {0} in Zeile {1}, Spalte {2}",'Symbol in "{0}" in Zeile {1}, Spalte {2}, {3}',"1 Symbol in {0}, vollst\xE4ndiger Pfad {1}","{0} Symbole in {1}, vollst\xE4ndiger Pfad {2}","Es wurden keine Ergebnisse gefunden.","1 Symbol in {0} gefunden","{0} Symbole in {1} gefunden","{0} Symbole in {1} Dateien gefunden"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["Symbol {0} von {1}, {2} f\xFCr n\xE4chstes","Symbol {0} von {1}"],"vs/editor/contrib/hover/hover":["Hovern anzeigen","Definitionsvorschauhover anzeigen"],"vs/editor/contrib/hover/markdownHoverParticipant":["Wird geladen..."],"vs/editor/contrib/hover/markerHoverParticipant":["Problem anzeigen","Keine Schnellkorrekturen verf\xFCgbar","Es wird nach Schnellkorrekturen gesucht...","Keine Schnellkorrekturen verf\xFCgbar","Schnelle Problembehebung ..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["Durch vorherigen Wert ersetzen","Durch n\xE4chsten Wert ersetzen"],"vs/editor/contrib/indentation/indentation":["Einzug in Leerzeichen konvertieren","Einzug in Tabstopps konvertieren","Konfigurierte Tabulatorgr\xF6\xDFe","Tabulatorgr\xF6\xDFe f\xFCr aktuelle Datei ausw\xE4hlen","Einzug mithilfe von Tabstopps","Einzug mithilfe von Leerzeichen","Einzug aus Inhalt erkennen","Neuen Einzug f\xFCr Zeilen festlegen","Gew\xE4hlte Zeilen zur\xFCckziehen"],"vs/editor/contrib/linesOperations/linesOperations":["Zeile nach oben kopieren","Zeile nach oben &&kopieren","Zeile nach unten kopieren","Zeile nach unten ko&&pieren","Auswahl duplizieren","&&Auswahl duplizieren","Zeile nach oben verschieben","Zeile nach oben &&verschieben","Zeile nach unten verschieben","Zeile nach &&unten verschieben","Zeilen aufsteigend sortieren","Zeilen absteigend sortieren","Nachgestelltes Leerzeichen k\xFCrzen","Zeile l\xF6schen","Zeileneinzug","Zeile ausr\xFCcken","Zeile oben einf\xFCgen","Zeile unten einf\xFCgen","Alle \xFCbrigen l\xF6schen","Alle rechts l\xF6schen","Zeilen verkn\xFCpfen","Zeichen um den Cursor herum transponieren","In Gro\xDFbuchstaben umwandeln","In Kleinbuchstaben umwandeln","In gro\xDFe Anfangsbuchstaben umwandeln","In Snake Case umwandeln"],"vs/editor/contrib/linkedEditing/linkedEditing":["Verkn\xFCpfte Bearbeitung starten","Hintergrundfarbe, wenn der Editor automatisch nach Typ umbenennt."],"vs/editor/contrib/links/links":["Befehl ausf\xFChren","Link folgen","BEFEHL + Klicken","STRG + Klicken","OPTION + Klicken","alt + klicken",'F\xFChren Sie den Befehl "{0}" aus.',"Fehler beim \xD6ffnen dieses Links, weil er nicht wohlgeformt ist: {0}","Fehler beim \xD6ffnen dieses Links, weil das Ziel fehlt.","Link \xF6ffnen"],"vs/editor/contrib/message/messageController":["Gibt an, ob der Editor zurzeit eine Inlinenachricht anzeigt.","Ein Bearbeiten ist im schreibgesch\xFCtzten Editor nicht m\xF6glich"],"vs/editor/contrib/multicursor/multicursor":["Cursor oberhalb hinzuf\xFCgen","Cursor oberh&&alb hinzuf\xFCgen","Cursor unterhalb hinzuf\xFCgen","Cursor unterhal&&b hinzuf\xFCgen","Cursor an Zeilenenden hinzuf\xFCgen","C&&ursor an Zeilenenden hinzuf\xFCgen","Cursor am Ende hinzuf\xFCgen","Cursor am Anfang hinzuf\xFCgen","Auswahl zur n\xE4chsten \xDCbereinstimmungssuche hinzuf\xFCgen","&&N\xE4chstes Vorkommen hinzuf\xFCgen","Letzte Auswahl zu vorheriger \xDCbereinstimmungssuche hinzuf\xFCgen","Vo&&rheriges Vorkommen hinzuf\xFCgen","Letzte Auswahl in n\xE4chste \xDCbereinstimmungssuche verschieben","Letzte Auswahl in vorherige \xDCbereinstimmungssuche verschieben","Alle Vorkommen ausw\xE4hlen und \xDCbereinstimmung suchen","Alle V&&orkommen ausw\xE4hlen","Alle Vorkommen \xE4ndern"],"vs/editor/contrib/parameterHints/parameterHints":["Parameterhinweise ausl\xF6sen"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["Symbol f\xFCr die Anzeige des n\xE4chsten Parameterhinweises.","Symbol f\xFCr die Anzeige des vorherigen Parameterhinweises.","{0}, Hinweis"],"vs/editor/contrib/peekView/peekView":["Schlie\xDFen","Hintergrundfarbe des Titelbereichs der Peek-Ansicht.","Farbe des Titels in der Peek-Ansicht.","Farbe der Titelinformationen in der Peek-Ansicht.","Farbe der Peek-Ansichtsr\xE4nder und des Pfeils.","Hintergrundfarbe der Ergebnisliste in der Peek-Ansicht.","Vordergrundfarbe f\xFCr Zeilenknoten in der Ergebnisliste der Peek-Ansicht.","Vordergrundfarbe f\xFCr Dateiknoten in der Ergebnisliste der Peek-Ansicht.","Hintergrundfarbe des ausgew\xE4hlten Eintrags in der Ergebnisliste der Peek-Ansicht.","Vordergrundfarbe des ausgew\xE4hlten Eintrags in der Ergebnisliste der Peek-Ansicht.","Hintergrundfarbe des Peek-Editors.","Hintergrundfarbe der Leiste im Peek-Editor.","Farbe f\xFCr \xDCbereinstimmungsmarkierungen in der Ergebnisliste der Peek-Ansicht.","Farbe f\xFCr \xDCbereinstimmungsmarkierungen im Peek-Editor.","Rahmen f\xFCr \xDCbereinstimmungsmarkierungen im Peek-Editor."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["\xD6ffnen Sie zuerst einen Text-Editor, um zu einer Zeile zu wechseln.","Wechseln Sie zu Zeile {0} und Spalte {1}.","Zu Zeile {0} wechseln.","Aktuelle Zeile: {0}, Zeichen: {1}. Geben Sie eine Zeilennummer zwischen 1 und {2} ein, zu der Sie navigieren m\xF6chten.","Aktuelle Zeile: {0}, Zeichen: {1}. Geben Sie eine Zeilennummer ein, zu der Sie navigieren m\xF6chten."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["\xD6ffnen Sie zun\xE4chst einen Text-Editor mit Symbolinformationen, um zu einem Symbol zu navigieren.","Der aktive Text-Editor stellt keine Symbolinformationen bereit.","Keine \xFCbereinstimmenden Editorsymbole.","Keine Editorsymbole.","An der Seite \xF6ffnen","Unten \xF6ffnen","Symbole ({0})","Eigenschaften ({0})","Methoden ({0})","Funktionen ({0})","Konstruktoren ({0})","Variablen ({0})","Klassen ({0})","Strukturen ({0})","Ereignisse ({0})","Operatoren ({0})","Schnittstellen ({0})","Namespaces ({0})","Pakete ({0})","Typparameter ({0})","Module ({0})","Eigenschaften ({0})","Enumerationen ({0})","Enumerationsmember ({0})","Zeichenfolgen ({0})","Dateien ({0})","Arrays ({0})","Zahlen ({0})","Boolesche Werte ({0})","Objekte ({0})","Schl\xFCssel ({0})","Felder ({0})","Konstanten ({0})"],"vs/editor/contrib/rename/rename":["Kein Ergebnis.","Ein unbekannter Fehler ist beim Aufl\xF6sen der Umbenennung eines Ortes aufgetreten.",'"{0}" wird umbenannt.',"{0} wird umbenannt.",'"{0}" erfolgreich in "{1}" umbenannt. Zusammenfassung: {2}',"Die rename-Funktion konnte die \xC4nderungen nicht anwenden.","Die rename-Funktion konnte die \xC4nderungen nicht berechnen.","Symbol umbenennen","M\xF6glichkeit aktivieren/deaktivieren, \xC4nderungen vor dem Umbenennen als Vorschau anzeigen zu lassen"],"vs/editor/contrib/rename/renameInputField":["Benennen Sie die Eingabe um. Geben Sie einen neuen Namen ein, und dr\xFCcken Sie die EINGABETASTE, um den Commit auszuf\xFChren.","{0} zur Umbenennung, {1} zur Vorschau"],"vs/editor/contrib/smartSelect/smartSelect":["Auswahl aufklappen","Auswahl &&erweitern","Markierung verkleinern","Au&&swahl verkleinern"],"vs/editor/contrib/snippet/snippetVariables":["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","So","Mo","Di","Mi","Do","Fr","Sa","Januar","Februar","M\xE4rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember","Jan","Feb","M\xE4r","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],"vs/editor/contrib/suggest/suggestController":['Das Akzeptieren von "{0}" ergab {1} zus\xE4tzliche Bearbeitungen.',"Vorschlag ausl\xF6sen","Einf\xFCgen","Einf\xFCgen","Ersetzen","Ersetzen","Einf\xFCgen","weniger anzeigen","mehr anzeigen","Gr\xF6\xDFe des Vorschlagswidgets zur\xFCcksetzen"],"vs/editor/contrib/suggest/suggestWidget":["Hintergrundfarbe des Vorschlagswidgets.","Rahmenfarbe des Vorschlagswidgets.","Vordergrundfarbe des Vorschlagswidgets.","Hintergrundfarbe des ausgew\xE4hlten Eintrags im Vorschlagswidget.","Farbe der Trefferhervorhebung im Vorschlagswidget.","Wird geladen...","Keine Vorschl\xE4ge.","{0}, Dokumente: {1}","Vorschlagen"],"vs/editor/contrib/suggest/suggestWidgetDetails":["Schlie\xDFen","Wird geladen..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["Symbol f\xFCr weitere Informationen im Vorschlags-Widget.","Weitere Informationen"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["Die Vordergrundfarbe f\xFCr Arraysymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr boolesche Symbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Klassensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Farbsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr konstante Symbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Konstruktorsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Enumeratorsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Enumeratormembersymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Ereignissymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Feldsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Dateisymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Ordnersymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Funktionssymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Schnittstellensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Schl\xFCsselsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Schl\xFCsselwortsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Methodensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Modulsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Namespacesymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr NULL-Symbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Zahlensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Objektsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Operatorsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Paketsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Eigenschaftensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Referenzsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Codeausschnittsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Zeichenfolgensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Struktursymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Textsymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Typparametersymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr Einheitensymbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt.","Die Vordergrundfarbe f\xFCr variable Symbole. Diese Symbole werden in den Widgets f\xFCr Gliederung, Breadcrumbs und Vorschl\xE4ge angezeigt."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["TAB-Umschalttaste verschiebt Fokus","Beim Dr\xFCcken auf Tab wird der Fokus jetzt auf das n\xE4chste fokussierbare Element verschoben","Beim Dr\xFCcken von Tab wird jetzt das Tabulator-Zeichen eingef\xFCgt"],"vs/editor/contrib/tokenization/tokenization":["Entwickler: Force Retokenize"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["Ungew\xF6hnliche Zeilentrennzeichen","Ungew\xF6hnliche Zeilentrennzeichen erkannt",`Diese Datei enth\xE4lt mindestens ein ung\xFCltiges Zeilenabschlusszeichen, z.\xA0B. Zeilentrennzeichen (LS) oder Absatztrennzeichen (PS).\r +\r +Es wird empfohlen, diese Zeichen aus der Datei zu entfernen. Die betreffende Einstellung kann \xFCber "editor.unusualLineTerminators" konfiguriert werden.`,"Diese Datei korrigieren","Problem f\xFCr diese Datei ignorieren"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["Hintergrundfarbe eines Symbols beim Lesezugriff, z.B. beim Lesen einer Variablen. Die Farbe darf nicht deckend sein, damit sie nicht die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe eines Symbols bei Schreibzugriff, z.B. beim Schreiben in eine Variable. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Randfarbe eines Symbols beim Lesezugriff, wie etwa beim Lesen einer Variablen.","Randfarbe eines Symbols beim Schreibzugriff, wie etwa beim Schreiben einer Variablen.","\xDCbersichtslinealmarkerfarbd f\xFCr das Hervorheben von Symbolen. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","\xDCbersichtslinealmarkerfarbe f\xFCr Symbolhervorhebungen bei Schreibzugriff. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Gehe zur n\xE4chsten Symbolhervorhebungen","Gehe zur vorherigen Symbolhervorhebungen","Symbol-Hervorhebung ein-/ausschalten"],"vs/editor/contrib/wordOperations/wordOperations":["Wort l\xF6schen"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["Au\xDFerkraftsetzungen f\xFCr die Standardsprachkonfiguration","Zu \xFCberschreibende Editor-Einstellungen f\xFCr eine Sprache konfigurieren.","Diese Einstellung unterst\xFCtzt keine sprachspezifische Konfiguration.","Eine leere Eigenschaft kann nicht registriert werden.",'"{0}" kann nicht registriert werden. Stimmt mit dem Eigenschaftsmuster "\\\\[.*\\\\]$" zum Beschreiben sprachspezifischer Editor-Einstellungen \xFCberein. Verwenden Sie den Beitrag "configurationDefaults".','{0}" kann nicht registriert werden. Diese Eigenschaft ist bereits registriert.'],"vs/platform/contextkey/browser/contextKeyService":["Ein Befehl, der Informationen zu Kontextschl\xFCsseln zur\xFCckgibt"],"vs/platform/contextkey/common/contextkeys":["Gibt an, ob Windows als Betriebssystem verwendet wird."],"vs/platform/keybinding/common/abstractKeybindingService":["({0}) wurde gedr\xFCckt. Es wird auf die zweite Taste in der Kombination gewartet...","Die Tastenkombination ({0}, {1}) ist kein Befehl."],"vs/platform/list/browser/listService":["Workbench","Ist unter Windows und Linux der STRG-Taste und unter macOS der Befehlstaste zugeordnet.","Ist unter Windows und Linux der ALT-Taste und unter macOS der Wahltaste zugeordnet.",'Der Modifizierer zum Hinzuf\xFCgen eines Elements in B\xE4umen und Listen zu einer Mehrfachauswahl mit der Maus (zum Beispiel im Explorer, in ge\xF6ffneten Editoren und in der SCM-Ansicht). Die Mausbewegung "Seitlich \xF6ffnen" wird \u2013 sofern unterst\xFCtzt \u2013 so angepasst, dass kein Konflikt mit dem Modifizierer f\xFCr Mehrfachauswahl entsteht.',"Steuert, wie Elemente in Strukturen und Listen mithilfe der Maus ge\xF6ffnet werden (sofern unterst\xFCtzt). Bei \xFCbergeordneten Elementen, deren untergeordnete Elemente sich in Strukturen befinden, steuert diese Einstellung, ob ein Einfachklick oder ein Doppelklick das \xFCbergeordnete Elemente erweitert. Beachten Sie, dass einige Strukturen und Listen diese Einstellung ggf. ignorieren, wenn sie nicht zutrifft.","Steuert, ob Listen und Strukturen ein horizontales Scrollen in der Workbench unterst\xFCtzen. Warnung: Das Aktivieren dieser Einstellung kann sich auf die Leistung auswirken.","Steuert den Struktureinzug in Pixeln.","Steuert, ob die Struktur Einzugsf\xFChrungslinien rendern soll.","Steuert, ob Listen und Strukturen einen optimierten Bildlauf verwenden.","Bei der einfachen Tastaturnavigation werden Elemente in den Fokus genommen, die mit der Tastatureingabe \xFCbereinstimmen. Die \xDCbereinstimmungen gelten nur f\xFCr Pr\xE4fixe.","Hervorheben von Tastaturnavigationshervorgebungselemente, die mit der Tastatureingabe \xFCbereinstimmen. Beim nach oben und nach unten Navigieren werden nur die hervorgehobenen Elemente durchlaufen.","Durch das Filtern der Tastaturnavigation werden alle Elemente herausgefiltert und ausgeblendet, die nicht mit der Tastatureingabe \xFCbereinstimmen.",'Steuert die Tastaturnavigation in Listen und Strukturen in der Workbench. Kann "simple" (einfach), "highlight" (hervorheben) und "filter" (filtern) sein.','Legt fest, ob die Tastaturnavigation in Listen und Strukturen automatisch durch Eingaben ausgel\xF6st wird. Wenn der Wert auf "false" festgelegt ist, wird die Tastaturnavigation nur ausgel\xF6st, wenn der Befehl "list.toggleKeyboardNavigation" ausgef\xFChrt wird. Diesem Befehl k\xF6nnen Sie eine Tastenkombination zuweisen.',"Steuert, wie Strukturordner beim Klicken auf die Ordnernamen erweitert werden. Beachten Sie, dass einige Strukturen und Listen diese Einstellung ggf. ignorieren, wenn sie nicht zutrifft."],"vs/platform/markers/common/markers":["Fehler","Warnung","Info"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","zuletzt verwendet","andere Befehle","Der Befehl {0} hat einen Fehler ausgel\xF6st ({1})."],"vs/platform/quickinput/browser/helpQuickAccess":["Globale Befehle","Editor-Befehle","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["Allgemeine Vordergrundfarbe. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente \xFCberschrieben wird.","Allgemeine Vordergrundfarbe f\xFCr Fehlermeldungen. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente \xFCberschrieben wird.","Die f\xFCr Symbole in der Workbench verwendete Standardfarbe.","Allgemeine Rahmenfarbe f\xFCr fokussierte Elemente. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente \xFCberschrieben wird.","Ein zus\xE4tzlicher Rahmen um Elemente, mit dem diese von anderen getrennt werden, um einen gr\xF6\xDFeren Kontrast zu erreichen.","Ein zus\xE4tzlicher Rahmen um aktive Elemente, mit dem diese von anderen getrennt werden, um einen gr\xF6\xDFeren Kontrast zu erreichen.","Vordergrundfarbe f\xFCr Links im Text.","Hintergrundfarbe f\xFCr Codebl\xF6cke im Text.","Schattenfarbe von Widgets wie zum Beispiel Suchen/Ersetzen innerhalb des Editors.","Hintergrund f\xFCr Eingabefeld.","Vordergrund f\xFCr Eingabefeld.","Rahmen f\xFCr Eingabefeld.","Rahmenfarbe f\xFCr aktivierte Optionen in Eingabefeldern.","Hintergrundfarbe f\xFCr aktivierte Optionen in Eingabefeldern.","Vordergrundfarbe f\xFCr aktivierte Optionen in Eingabefeldern.","Hintergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Information.","Vordergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Information.","Rahmenfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Information.","Hintergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Warnung.","Vordergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Warnung.","Rahmenfarbe bei der Eingabevalidierung f\xFCr den Schweregrad der Warnung.","Hintergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad des Fehlers.","Vordergrundfarbe bei der Eingabevalidierung f\xFCr den Schweregrad des Fehlers.","Rahmenfarbe bei der Eingabevalidierung f\xFCr den Schweregrad des Fehlers.","Hintergrund f\xFCr Dropdown.","Vordergrund f\xFCr Dropdown.","Vordergrundfarbe der Schaltfl\xE4che.","Hintergrundfarbe der Schaltfl\xE4che.","Hintergrundfarbe der Schaltfl\xE4che, wenn darauf gezeigt wird.","Hintergrundfarbe f\xFCr Badge. Badges sind kurze Info-Texte, z.B. f\xFCr Anzahl Suchergebnisse.","Vordergrundfarbe f\xFCr Badge. Badges sind kurze Info-Texte, z.B. f\xFCr Anzahl Suchergebnisse.","Schatten der Scrollleiste, um anzuzeigen, dass die Ansicht gescrollt wird.","Hintergrundfarbe vom Scrollbar-Schieber","Hintergrundfarbe des Schiebereglers, wenn darauf gezeigt wird.","Hintergrundfarbe des Schiebereglers, wenn darauf geklickt wird.","Hintergrundfarbe des Fortschrittbalkens, der f\xFCr zeitintensive Vorg\xE4nge angezeigt werden kann.","Hintergrundfarbe f\xFCr Fehlertext im Editor. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Vordergrundfarbe von Fehlerunterstreichungen im Editor.","Randfarbe von Fehlerfeldern im Editor.","Hintergrundfarbe f\xFCr Warnungstext im Editor. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Vordergrundfarbe von Warnungsunterstreichungen im Editor.","Randfarbe der Warnfelder im Editor.","Hintergrundfarbe f\xFCr Infotext im Editor. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Vordergrundfarbe von Informationsunterstreichungen im Editor.","Randfarbe der Infofelder im Editor.","Vordergrundfarbe der Hinweisunterstreichungen im Editor.","Randfarbe der Hinweisfelder im Editor.","Hintergrundfarbe des Editors.","Standardvordergrundfarbe des Editors.","Hintergrundfarbe von Editor-Widgets wie zum Beispiel Suchen/Ersetzen.","Vordergrundfarbe f\xFCr Editorwidgets wie Suchen/Ersetzen.","Rahmenfarbe von Editorwigdets. Die Farbe wird nur verwendet, wenn f\xFCr das Widget ein Rahmen verwendet wird und die Farbe nicht von einem Widget \xFCberschrieben wird.","Rahmenfarbe der Gr\xF6\xDFenanpassungsleiste von Editorwigdets. Die Farbe wird nur verwendet, wenn f\xFCr das Widget ein Gr\xF6\xDFenanpassungsrahmen verwendet wird und die Farbe nicht von einem Widget au\xDFer Kraft gesetzt wird.","Schnellauswahl der Hintergrundfarbe. Im Widget f\xFCr die Schnellauswahl sind Auswahlelemente wie die Befehlspalette enthalten.","Vordergrundfarbe der Schnellauswahl. Im Widget f\xFCr die Schnellauswahl sind Auswahlelemente wie die Befehlspalette enthalten.","Hintergrundfarbe f\xFCr den Titel der Schnellauswahl. Im Widget f\xFCr die Schnellauswahl sind Auswahlelemente wie die Befehlspalette enthalten.","Die Hintergrundfarbe der Schnellauswahl f\xFCr das fokussierte Element.","Schnellauswahlfarbe f\xFCr das Gruppieren von Bezeichnungen.","Schnellauswahlfarbe f\xFCr das Gruppieren von Rahmen.","Farbe der Editor-Auswahl.","Farbe des gew\xE4hlten Text f\xFCr einen hohen Kontrast","Die Farbe der Auswahl befindet sich in einem inaktiven Editor. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegende Dekorationen verdeckt.","Farbe f\xFCr Bereiche mit dem gleichen Inhalt wie die Auswahl. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Randfarbe f\xFCr Bereiche, deren Inhalt der Auswahl entspricht.","Farbe des aktuellen Suchergebnisses.","Farbe der anderen Suchergebnisse. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Farbe des Bereichs, der die Suche eingrenzt. Die Farbe darf nicht deckend sein, damit sie nicht die zugrunde liegenden Dekorationen verdeckt.","Randfarbe des aktuellen Suchergebnisses.","Randfarbe der anderen Suchtreffer.","Rahmenfarbe des Bereichs, der die Suche eingrenzt. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hervorhebung unterhalb des Worts, f\xFCr das ein Hoverelement angezeigt wird. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe des Editor-Mauszeigers.","Vordergrundfarbe des Editor-Mauszeigers","Rahmenfarbe des Editor-Mauszeigers.","Hintergrundfarbe der Hoverstatusleiste des Editors.","Farbe der aktiven Links.","Vordergrundfarbe f\xFCr Inlinehinweise","Hintergrundfarbe f\xFCr Inlinehinweise",'Die f\xFCr das Aktionssymbol "Gl\xFChbirne" verwendete Farbe.','Die f\xFCr das Aktionssymbol "Automatische Gl\xFChbirnenkorrektur" verwendete Farbe.',"Hintergrundfarbe f\xFCr eingef\xFCgten Text. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Hintergrundfarbe f\xFCr Text, der entfernt wurde. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Konturfarbe f\xFCr eingef\xFCgten Text.","Konturfarbe f\xFCr entfernten Text.","Die Rahmenfarbe zwischen zwei Text-Editoren.","Farbe der diagonalen F\xFCllung des Vergleichs-Editors. Die diagonale F\xFCllung wird in Ansichten mit parallelem Vergleich verwendet.","Hintergrundfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Vordergrundfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Konturfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Hintergrundfarbe der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Vordergrundfarbe der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Hintergrundfarbe der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Vordergrundfarbe der Liste/Struktur f\xFCr das ausgew\xE4hlte Element, wenn die Liste/Baumstruktur inaktiv ist. Eine aktive Liste/Baumstruktur hat Tastaturfokus, eine inaktive hingegen nicht.","Hintergrundfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Konturfarbe der Liste/Struktur f\xFCr das fokussierte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.","Hintergrund der Liste/Struktur, wenn mit der Maus auf Elemente gezeigt wird.","Vordergrund der Liste/Struktur, wenn mit der Maus auf Elemente gezeigt wird.","Drag & Drop-Hintergrund der Liste/Struktur, wenn Elemente mithilfe der Maus verschoben werden.","Vordergrundfarbe der Liste/Struktur zur Trefferhervorhebung beim Suchen innerhalb der Liste/Struktur.","Hintergrundfarbe des Typfilterwidgets in Listen und Strukturen.","Konturfarbe des Typfilterwidgets in Listen und Strukturen.","Konturfarbe des Typfilterwidgets in Listen und Strukturen, wenn es keine \xDCbereinstimmungen gibt.","Strukturstrichfarbe f\xFCr die Einzugsf\xFChrungslinien.","Strukturstrichfarbe f\xFCr die Einzugsf\xFChrungslinien.","Rahmenfarbe von Men\xFCs.","Vordergrundfarbe von Men\xFCelementen.","Hintergrundfarbe von Men\xFCelementen.","Vordergrundfarbe des ausgew\xE4hlten Men\xFCelements im Men\xFC.","Hintergrundfarbe des ausgew\xE4hlten Men\xFCelements im Men\xFC.","Rahmenfarbe des ausgew\xE4hlten Men\xFCelements im Men\xFC.","Farbe eines Trenner-Men\xFCelements in Men\xFCs.","Hervorhebungs-Hintergrundfarbe eines Codeausschnitt-Tabstopps.","Hervorhebungs-Rahmenfarbe eines Codeausschnitt-Tabstopps.","Hervorhebungs-Hintergrundfarbe des letzten Tabstopps eines Codeausschnitts.","Rahmenfarbe zur Hervorhebung des letzten Tabstopps eines Codeausschnitts.","\xDCbersichtslinealmarkerfarbe f\xFCr das Suchen von \xDCbereinstimmungen. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","\xDCbersichtslinealmarkerfarbe f\xFCr das Hervorheben der Auswahl. Die Farbe darf nicht deckend sein, weil sie sonst die zugrunde liegenden Dekorationen verdeckt.","Minimap-Markerfarbe f\xFCr gefundene \xDCbereinstimmungen.","Minimap-Markerfarbe f\xFCr die Editorauswahl.","Minimapmarkerfarbe f\xFCr Fehler","Minimapmarkerfarbe f\xFCr Warnungen","Hintergrundfarbe der Minimap.","Hintergrundfarbe des Minimap-Schiebereglers.","Hintergrundfarbe des Minimap-Schiebereglers beim Daraufzeigen.","Hintergrundfarbe des Minimap-Schiebereglers, wenn darauf geklickt wird.","Die Farbe, die f\xFCr das Problemfehlersymbol verwendet wird.","Die Farbe, die f\xFCr das Problemwarnsymbol verwendet wird.","Die Farbe, die f\xFCr das Probleminfosymbol verwendet wird."],"vs/platform/theme/common/iconRegistry":["Die ID der zu verwendenden Schriftart. Sofern nicht festgelegt, wird die zuerst definierte Schriftart verwendet.","Das der Symboldefinition zugeordnete Schriftzeichen.","Symbol f\xFCr Aktion zum Schlie\xDFen in Widgets"],"vs/platform/undoRedo/common/undoRedoService":["Die folgenden Dateien wurden geschlossen und auf dem Datentr\xE4ger ge\xE4ndert: {0}.","Die folgenden Dateien wurden auf inkompatible Weise ge\xE4ndert: {0}.",'"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden. {1}','"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden. {1}','"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden, da \xC4nderungen an {1} vorgenommen wurden.','"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden, weil bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen f\xFCr "{1}" durchgef\xFChrt wird.','"{0}" konnte nicht f\xFCr alle Dateien r\xFCckg\xE4ngig gemacht werden, weil in der Zwischenzeit bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen durchgef\xFChrt wurde.','M\xF6chten Sie "{0}" f\xFCr alle Dateien r\xFCckg\xE4ngig machen?',"In {0} Dateien r\xFCckg\xE4ngig machen","Datei r\xFCckg\xE4ngig machen","Abbrechen",'"{0}" konnte nicht r\xFCckg\xE4ngig gemacht werden, weil bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen durchgef\xFChrt wird.','M\xF6chten Sie "{0}" r\xFCckg\xE4ngig machen?',"R\xFCckg\xE4ngig machen","Abbrechen",'"{0}" konnte nicht in allen Dateien wiederholt werden. {1}','"{0}" konnte nicht in allen Dateien wiederholt werden. {1}','"{0}" konnte nicht in allen Dateien wiederholt werden, da \xC4nderungen an {1} vorgenommen wurden.','"{0}" konnte nicht f\xFCr alle Dateien wiederholt werden, weil bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen f\xFCr "{1}" durchgef\xFChrt wird.','"{0}" konnte nicht f\xFCr alle Dateien wiederholt werden, weil in der Zwischenzeit bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen durchgef\xFChrt wurde.','"{0}" konnte nicht wiederholt werden, weil bereits ein Vorgang zum R\xFCckg\xE4ngigmachen oder Wiederholen durchgef\xFChrt wird.']}); diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.de.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.de.js.gz new file mode 100644 index 0000000..c33499e Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.de.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.es.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.es.js new file mode 100644 index 0000000..d71fd7d --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.es.js @@ -0,0 +1,8 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.es",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["entrada"],"vs/base/browser/ui/findinput/findInputCheckboxes":["Coincidir may\xFAsculas y min\xFAsculas","Solo palabras completas","Usar expresi\xF3n regular"],"vs/base/browser/ui/findinput/replaceInput":["entrada","Conservar may/min"],"vs/base/browser/ui/iconLabel/iconLabel":["Cargando..."],"vs/base/browser/ui/inputbox/inputBox":["Error: {0}","Advertencia: {0}","Informaci\xF3n: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Sin enlazar"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["Borrar","Desactivar filtro en tipo","Activar filtro en el tipo","No se encontraron elementos","{0} de {1} elementos coincidentes"],"vs/base/common/actions":["(vac\xEDo)"],"vs/base/common/errorMessage":["{0}: {1}","Error del sistema ({0})","Se ha producido un error desconocido. Consulte el registro para obtener m\xE1s detalles.","Se ha producido un error desconocido. Consulte el registro para obtener m\xE1s detalles.","{0} ({1} errores en total)","Se ha producido un error desconocido. Consulte el registro para obtener m\xE1s detalles."],"vs/base/common/keybindingLabels":["Ctrl","May\xFAs","Alt","Windows","Ctrl","May\xFAs","Alt","Super","Control","May\xFAs","Alt","Comando","Control","May\xFAs","Alt","Windows","Control","May\xFAs","Alt","Super"],"vs/base/parts/quickinput/browser/quickInput":["Atr\xE1s","{0}/{1}","Escriba para restringir los resultados.","{0} resultados","{0} seleccionados","Aceptar","Personalizado","Atr\xE1s ({0})","Atr\xE1s"],"vs/base/parts/quickinput/browser/quickInputList":["Entrada r\xE1pida"],"vs/editor/browser/controller/coreCommands":["Anclar al final incluso cuando se vayan a l\xEDneas m\xE1s largas","Anclar al final incluso cuando se vayan a l\xEDneas m\xE1s largas"],"vs/editor/browser/controller/textAreaHandler":["editor","El editor no es accesible en este momento. Pulse {0} para ver las opciones."],"vs/editor/browser/core/keybindingCancellation":['Indica si el editor ejecuta una operaci\xF3n que se puede cancelar como, por ejemplo, "Inspeccionar referencias"'],"vs/editor/browser/editorExtensions":["&&Deshacer","Deshacer","&&Rehacer","Rehacer","&&Seleccionar todo","Seleccionar todo"],"vs/editor/browser/widget/codeEditorWidget":["El n\xFAmero de cursores se ha limitado a {0}."],"vs/editor/browser/widget/diffEditorWidget":["Decoraci\xF3n de l\xEDnea para las inserciones en el editor de diferencias.","Decoraci\xF3n de l\xEDnea para las eliminaciones en el editor de diferencias.","Los archivos no se pueden comparar porque uno de ellos es demasiado grande."],"vs/editor/browser/widget/diffReview":['Icono para "Insertar" en la revisi\xF3n de diferencias.','Icono para "Quitar" en la revisi\xF3n de diferencias.','Icono para "Cerrar" en la revisi\xF3n de diferencias.',"Cerrar","no se han cambiado l\xEDneas","1 l\xEDnea cambiada","{0} l\xEDneas cambiadas","Diferencia {0} de {1}: l\xEDnea original {2}, {3}, l\xEDnea modificada {4}, {5}","vac\xEDo","{0} l\xEDnea sin cambios {1}","{0} l\xEDnea original {1} l\xEDnea modificada {2}","+ {0} l\xEDnea modificada {1}","- {0} l\xEDnea original {1}","Ir a la siguiente diferencia","Ir a la diferencia anterior"],"vs/editor/browser/widget/inlineDiffMargin":["Copiar l\xEDneas eliminadas","Copiar l\xEDnea eliminada","Copiar la l\xEDnea eliminada ({0})","Revertir este cambio","Copiar la l\xEDnea eliminada ({0})"],"vs/editor/common/config/commonEditorConfig":["Editor",'El n\xFAmero de espacios a los que equivale una tabulaci\xF3n. Este valor se invalida en funci\xF3n del contenido del archivo cuando "#editor.detectIndentation#" est\xE1 activado.','Insertar espacios al presionar "TAB". Este valor se invalida en funci\xF3n del contenido del archivo cuando "#editor.detectIndentation#" est\xE1 activado. ','Controla si "#editor.tabSize#" y "#editor.insertSpaces#" se detectar\xE1n autom\xE1ticamente al abrir un archivo en funci\xF3n del contenido de este.',"Quitar el espacio en blanco final autoinsertado.","Manejo especial para archivos grandes para desactivar ciertas funciones de memoria intensiva.","Habilita sugerencias basadas en palabras.","Sugerir palabras solo del documento activo.","Sugerir palabras de todos los documentos abiertos del mismo idioma.","Sugerir palabras de todos los documentos abiertos.","Controla de qu\xE9 documentos se calculan las finalizaciones basadas en palabras.","El resaltado sem\xE1ntico est\xE1 habilitado para todos los temas de color.","El resaltado sem\xE1ntico est\xE1 deshabilitado para todos los temas de color.",'El resaltado sem\xE1ntico est\xE1 configurado con el valor "semanticHighlighting" del tema de color actual.',"Controla si se muestra semanticHighlighting para los idiomas que lo admiten.",'Mantiene abiertos los editores interactivos, incluso al hacer doble clic en su contenido o presionar "Escape".',"Las lineas por encima de esta longitud no se tokenizar\xE1n por razones de rendimiento.","Tiempo de espera en milisegundos despu\xE9s del cual se cancela el c\xE1lculo de diferencias. Utilice 0 para no usar tiempo de espera.","Controla si el editor de diferencias muestra las diferencias en paralelo o alineadas.","Cuando est\xE1 habilitado, el editor de diferencias omite los cambios en los espacios en blanco iniciales o finales.","Controla si el editor de diferencias muestra los indicadores +/- para los cambios agregados o quitados.","Controla si el editor muestra CodeLens.","Las l\xEDneas no se ajustar\xE1n nunca.","Las l\xEDneas se ajustar\xE1n en el ancho de la ventanilla.",'Las l\xEDneas se ajustar\xE1n en funci\xF3n de la configuraci\xF3n de "#editor.wordWrap#".'],"vs/editor/common/config/editorOptions":["El editor usar\xE1 API de plataforma para detectar cu\xE1ndo est\xE1 conectado un lector de pantalla.","El editor se optimizar\xE1 de forma permanente para su uso con un lector de pantalla. El ajuste de l\xEDneas se deshabilitar\xE1.","El editor nunca se optimizar\xE1 para su uso con un lector de pantalla.","Controla si el editor se debe ejecutar en un modo optimizado para lectores de pantalla. Si se activa, se deshabilitar\xE1 el ajuste de l\xEDneas.","Controla si se inserta un car\xE1cter de espacio al comentar.","Controla si las l\xEDneas vac\xEDas deben ignorarse con la opci\xF3n de alternar, agregar o quitar acciones para los comentarios de l\xEDnea.","Controla si al copiar sin selecci\xF3n se copia la l\xEDnea actual.","Controla si el cursor debe saltar para buscar coincidencias mientras se escribe.","Controla si la cadena de b\xFAsqueda del widget de b\xFAsqueda se inicializa desde la selecci\xF3n del editor.","No activar nunca Buscar en la selecci\xF3n autom\xE1ticamente (predeterminado)","Activar siempre autom\xE1ticamente Buscar en la selecci\xF3n","Active Buscar en la selecci\xF3n autom\xE1ticamente cuando se seleccionen varias l\xEDneas de contenido.","Controla la condici\xF3n para activar la b\xFAsqueda en la selecci\xF3n de forma autom\xE1tica.","Controla si el widget de b\xFAsqueda debe leer o modificar el Portapapeles de b\xFAsqueda compartido en macOS.","Controla si Encontrar widget debe agregar m\xE1s l\xEDneas en la parte superior del editor. Si es true, puede desplazarse m\xE1s all\xE1 de la primera l\xEDnea cuando Encontrar widget est\xE1 visible.","Controla si la b\xFAsqueda se reinicia autom\xE1ticamente desde el principio (o el final) cuando no se encuentran m\xE1s coincidencias.",'Habilita o deshabilita las ligaduras tipogr\xE1ficas (caracter\xEDsticas de fuente "calt" y "liga"). C\xE1mbielo a una cadena para el control espec\xEDfico de la propiedad de CSS "font-feature-settings".','Propiedad de CSS "font-feature-settings" expl\xEDcita. En su lugar, puede pasarse un valor booleano si solo es necesario activar o desactivar las ligaduras.','Configura las ligaduras tipogr\xE1ficas o las caracter\xEDsticas de fuente. Puede ser un valor booleano para habilitar o deshabilitar las ligaduras o bien una cadena para el valor de la propiedad "font-feature-settings" de CSS.',"Controla el tama\xF1o de fuente en p\xEDxeles.",'Solo se permiten las palabras clave "normal" y "negrita" o los n\xFAmeros entre 1 y 1000.','Controla el grosor de la fuente. Acepta las palabras clave "normal" y "negrita" o los n\xFAmeros entre 1 y 1000.',"Mostrar vista de inspecci\xF3n de los resultados (predeterminado)","Ir al resultado principal y mostrar una vista de inspecci\xF3n","Vaya al resultado principal y habilite la navegaci\xF3n sin peek para otros",'Esta configuraci\xF3n est\xE1 en desuso. Use configuraciones separadas como "editor.editor.gotoLocation.multipleDefinitions" o "editor.editor.gotoLocation.multipleImplementations" en su lugar.','Controla el comportamiento del comando "Ir a definici\xF3n" cuando existen varias ubicaciones de destino.','Controla el comportamiento del comando "Ir a definici\xF3n de tipo" cuando existen varias ubicaciones de destino.','Controla el comportamiento del comando "Ir a declaraci\xF3n" cuando existen varias ubicaciones de destino.','Controla el comportamiento del comando "Ir a implementaciones" cuando existen varias ubicaciones de destino.','Controla el comportamiento del comando "Ir a referencias" cuando existen varias ubicaciones de destino.','Identificador de comando alternativo que se ejecuta cuando el resultado de "Ir a definici\xF3n" es la ubicaci\xF3n actual.','Id. de comando alternativo que se est\xE1 ejecutando cuando el resultado de "Ir a definici\xF3n de tipo" es la ubicaci\xF3n actual.','Id. de comando alternativo que se est\xE1 ejecutando cuando el resultado de "Ir a declaraci\xF3n" es la ubicaci\xF3n actual.','Id. de comando alternativo que se est\xE1 ejecutando cuando el resultado de "Ir a implementaci\xF3n" es la ubicaci\xF3n actual.','Identificador de comando alternativo que se ejecuta cuando el resultado de "Ir a referencia" es la ubicaci\xF3n actual.',"Controla si se muestra la informaci\xF3n al mantener el puntero sobre un elemento.","Controla el retardo en milisegundos despu\xE9s del cual se muestra la informaci\xF3n al mantener el puntero sobre un elemento.","Controla si la informaci\xF3n que aparece al mantener el puntero sobre un elemento permanece visible al mover el mouse sobre este.","Habilita la bombilla de acci\xF3n de c\xF3digo en el editor.","Habilita las sugerencias insertadas en el editor.",'Controla el tama\xF1o de fuente de las sugerencias insertadas en el editor. Cuando se establece en "0", se usa el 90\xA0% de "#editor.fontSize#".',"Controla la familia de fuentes de las sugerencias insertadas en el editor.","Controla la altura de l\xEDnea. Usa 0 para utilizar la altura del tama\xF1o de fuente.","Controla si se muestra el minimapa.","El minimapa tiene el mismo tama\xF1o que el contenido del editor (y podr\xEDa desplazarse).","El minimapa se estirar\xE1 o reducir\xE1 seg\xFAn sea necesario para ocupar la altura del editor (sin desplazamiento).","El minimapa se reducir\xE1 seg\xFAn sea necesario para no ser nunca m\xE1s grande que el editor (sin desplazamiento).","Controla el tama\xF1o del minimapa.","Controla en qu\xE9 lado se muestra el minimapa.","Controla cu\xE1ndo se muestra el control deslizante del minimapa.","Escala del contenido dibujado en el minimapa: 1, 2 o 3.","Represente los caracteres reales en una l\xEDnea, por oposici\xF3n a los bloques de color.","Limite el ancho del minimapa para representar como mucho un n\xFAmero de columnas determinado.","Controla la cantidad de espacio entre el borde superior del editor y la primera l\xEDnea.","Controla el espacio entre el borde inferior del editor y la \xFAltima l\xEDnea.","Habilita un elemento emergente que muestra documentaci\xF3n de los par\xE1metros e informaci\xF3n de los tipos mientras escribe.","Controla si el men\xFA de sugerencias de par\xE1metros se cicla o se cierra al llegar al final de la lista.","Habilita sugerencias r\xE1pidas en las cadenas.","Habilita sugerencias r\xE1pidas en los comentarios.","Habilita sugerencias r\xE1pidas fuera de las cadenas y los comentarios.","Controla si deben mostrarse sugerencias autom\xE1ticamente mientras se escribe.","Los n\xFAmeros de l\xEDnea no se muestran.","Los n\xFAmeros de l\xEDnea se muestran como un n\xFAmero absoluto.","Los n\xFAmeros de l\xEDnea se muestran como distancia en l\xEDneas a la posici\xF3n del cursor.","Los n\xFAmeros de l\xEDnea se muestran cada 10 l\xEDneas.","Controla la visualizaci\xF3n de los n\xFAmeros de l\xEDnea.","N\xFAmero de caracteres monoespaciales en los que se representar\xE1 esta regla del editor.","Color de esta regla del editor.","Muestra reglas verticales despu\xE9s de un cierto n\xFAmero de caracteres monoespaciados. Usa m\xFAltiples valores para mostrar m\xFAltiples reglas. Si la matriz est\xE1 vac\xEDa, no se muestran reglas.","Inserte la sugerencia sin sobrescribir el texto a la derecha del cursor.","Inserte la sugerencia y sobrescriba el texto a la derecha del cursor.","Controla si las palabras se sobrescriben al aceptar la finalizaci\xF3n. Tenga en cuenta que esto depende de las extensiones que participan en esta caracter\xEDstica.","Controla si el filtrado y la ordenaci\xF3n de sugerencias se tienen en cuenta para los errores ortogr\xE1ficos peque\xF1os.","Controla si la ordenaci\xF3n de palabras mejora lo que aparece cerca del cursor.",'Controla si las selecciones de sugerencias recordadas se comparten entre m\xFAltiples \xE1reas de trabajo y ventanas (necesita "#editor.suggestSelection#").',"Controla si un fragmento de c\xF3digo activo impide sugerencias r\xE1pidas.","Controla si mostrar u ocultar iconos en sugerencias.","Controla la visibilidad de la barra de estado en la parte inferior del widget de sugerencias.","Controla si los detalles de sugerencia se muestran incorporados con la etiqueta o solo en el widget de detalles.","La configuraci\xF3n est\xE1 en desuso. Ahora puede cambiarse el tama\xF1o del widget de sugerencias.",'Esta configuraci\xF3n est\xE1 en desuso. Use configuraciones separadas como "editor.suggest.showKeyword" o "editor.suggest.showSnippets" en su lugar.','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "method".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de "funci\xF3n".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "constructor".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "field".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "variable".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "class".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "struct".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "interface".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "module".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "property".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "event".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "operator".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "unit".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de "value".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "constant".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "enum".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "enumMember".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "keyword".','Si est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "text".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de "color".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "file".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "reference".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "customcolor".','Si est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "folder".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "typeParameter".','Cuando est\xE1 habilitado, IntelliSense muestra sugerencias de tipo "snippet".',"Cuando est\xE1 habilitado, IntelliSense muestra sugerencias del usuario.","Cuando est\xE1 habilitado IntelliSense muestra sugerencias para problemas.","Indica si los espacios en blanco iniciales y finales deben seleccionarse siempre.",'Controla si se deben aceptar sugerencias en los caracteres de confirmaci\xF3n. Por ejemplo, en Javascript, el punto y coma (";") puede ser un car\xE1cter de confirmaci\xF3n que acepta una sugerencia y escribe ese car\xE1cter.','Aceptar solo una sugerencia con "Entrar" cuando realiza un cambio textual.','Controla si las sugerencias deben aceptarse con "Entrar", adem\xE1s de "TAB". Ayuda a evitar la ambig\xFCedad entre insertar nuevas l\xEDneas o aceptar sugerencias.',"Controla el n\xFAmero de l\xEDneas en el editor que puede leer un lector de pantalla. Advertencia: Esto puede afectar al rendimiento de n\xFAmeros superiores al predeterminado.","Contenido del editor","Utilizar las configuraciones del lenguaje para determinar cu\xE1ndo cerrar los corchetes autom\xE1ticamente.","Cerrar autom\xE1ticamente los corchetes cuando el cursor est\xE9 a la izquierda de un espacio en blanco.","Controla si el editor debe cerrar autom\xE1ticamente los corchetes despu\xE9s de que el usuario agregue un corchete de apertura.","Escriba en las comillas o los corchetes solo si se insertaron autom\xE1ticamente.","Controla si el editor debe escribir entre comillas o corchetes.","Utilizar las configuraciones del lenguaje para determinar cu\xE1ndo cerrar las comillas autom\xE1ticamente. ","Cerrar autom\xE1ticamente las comillas cuando el cursor est\xE9 a la izquierda de un espacio en blanco. ","Controla si el editor debe cerrar autom\xE1ticamente las comillas despu\xE9s de que el usuario agrega uma comilla de apertura.","El editor no insertar\xE1 la sangr\xEDa autom\xE1ticamente.","El editor mantendr\xE1 la sangr\xEDa de la l\xEDnea actual.","El editor respetar\xE1 la sangr\xEDa de la l\xEDnea actual y los corchetes definidos por el idioma.","El editor mantendr\xE1 la sangr\xEDa de la l\xEDnea actual, respetar\xE1 los corchetes definidos por el idioma e invocar\xE1 onEnterRules especiales definidos por idiomas.","El editor respetar\xE1 la sangr\xEDa de la l\xEDnea actual, los corchetes definidos por idiomas y las reglas indentationRules definidas por idiomas, adem\xE1s de invocar reglas onEnterRules especiales.","Controla si el editor debe ajustar autom\xE1ticamente la sangr\xEDa mientras los usuarios escriben, pegan, mueven o sangran l\xEDneas.","Use las configuraciones de idioma para determinar cu\xE1ndo delimitar las selecciones autom\xE1ticamente.","Envolver con comillas, pero no con corchetes.","Envolver con corchetes, pero no con comillas.","Controla si el editor debe rodear autom\xE1ticamente las selecciones al escribir comillas o corchetes.","Emule el comportamiento de selecci\xF3n de los caracteres de tabulaci\xF3n al usar espacios para la sangr\xEDa. La selecci\xF3n se aplicar\xE1 a las tabulaciones.","Controla si el editor muestra CodeLens.","Controla la familia de fuentes para CodeLens.",'Controla el tama\xF1o de fuente de CodeLens en p\xEDxeles. Cuando se establece en "0", se usa el 90\xA0% de "#editor.fontSize#".',"Controla si el editor debe representar el Selector de colores y los elementos Decorator de color en l\xEDnea.","Habilite que la selecci\xF3n con el mouse y las teclas est\xE9 realizando la selecci\xF3n de columnas.","Controla si el resaltado de sintaxis debe ser copiado al portapapeles.","Controla el estilo de animaci\xF3n del cursor.","Controla si la animaci\xF3n suave del cursor debe estar habilitada.","Controla el estilo del cursor.",'Controla el n\xFAmero m\xEDnimo de l\xEDneas iniciales y finales visibles que rodean al cursor. En algunos otros editores, se conoce como "scrollOff" o "scrollOffset".','Solo se aplica "cursorSurroundingLines" cuando se desencadena mediante el teclado o la API.','"cursorSurroundingLines" se aplica siempre.','Controla cuando se debe aplicar "cursorSurroundingLines".','Controla el ancho del cursor cuando "#editor.cursorStyle#" se establece en "line".',"Controla si el editor debe permitir mover las selecciones mediante arrastrar y colocar.",'Multiplicador de la velocidad de desplazamiento al presionar "Alt".',"Controla si el editor tiene el plegado de c\xF3digo habilitado.","Utilice una estrategia de plegado espec\xEDfica del idioma, si est\xE1 disponible, de lo contrario la basada en sangr\xEDa.","Utilice la estrategia de plegado basada en sangr\xEDa.","Controla la estrategia para calcular rangos de plegado.","Controla si el editor debe destacar los rangos plegados.","Controla si al hacer clic en el contenido vac\xEDo despu\xE9s de una l\xEDnea plegada se desplegar\xE1 la l\xEDnea.","Controla la familia de fuentes.","Controla si el editor debe dar formato autom\xE1ticamente al contenido pegado. Debe haber disponible un formateador capaz de aplicar formato a un rango dentro de un documento. ","Controla si el editor debe dar formato a la l\xEDnea autom\xE1ticamente despu\xE9s de escribirla.","Controla si el editor debe representar el margen de glifo vertical. El margen de glifo se usa, principalmente, para depuraci\xF3n.","Controla si el cursor debe ocultarse en la regla de informaci\xF3n general.","Controla si el editor debe resaltar la gu\xEDa de sangr\xEDa activa.","Controla el espacio entre letras en p\xEDxeles.","Controla si el editor tiene habilitada la edici\xF3n vinculada. Dependiendo del lenguaje, los s\xEDmbolos relacionados (por ejemplo, las etiquetas HTML) se actualizan durante la edici\xF3n.","Controla si el editor debe detectar v\xEDnculos y hacerlos interactivos.","Resaltar par\xE9ntesis coincidentes.",'Se usar\xE1 un multiplicador en los eventos de desplazamiento de la rueda del mouse "deltaX" y "deltaY". ','Ampliar la fuente del editor cuando se use la rueda del mouse mientras se presiona "Ctrl".',"Combinar varios cursores cuando se solapan.",'Se asigna a "Control" en Windows y Linux y a "Comando" en macOS.','Se asigna a "Alt" en Windows y Linux y a "Opci\xF3n" en macOS.',"El modificador que se usar\xE1 para agregar varios cursores con el mouse. Los gestos del mouse Ir a definici\xF3n y Abrir v\xEDnculo se adaptar\xE1n de modo que no entren en conflicto con el modificador multicursor. [M\xE1s informaci\xF3n](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","Cada cursor pega una \xFAnica l\xEDnea del texto.","Cada cursor pega el texto completo.","Controla el pegado cuando el recuento de l\xEDneas del texto pegado coincide con el recuento de cursores.","Controla si el editor debe resaltar las apariciones de s\xEDmbolos sem\xE1nticos.","Controla si debe dibujarse un borde alrededor de la regla de informaci\xF3n general.","Enfocar el \xE1rbol al abrir la inspecci\xF3n","Enfocar el editor al abrir la inspecci\xF3n","Controla si se debe enfocar el editor en l\xEDnea o el \xE1rbol en el widget de vista.","Controla si el gesto del mouse Ir a definici\xF3n siempre abre el widget interactivo.","Controla el retraso, en milisegundos, tras el cual aparecer\xE1n sugerencias r\xE1pidas.","Controla si el editor cambia el nombre autom\xE1ticamente en el tipo.",'En desuso. Utilice "editor.linkedEditing" en su lugar.',"Controla si el editor debe representar caracteres de control.","Controla si el editor debe representar gu\xEDas de sangr\xEDa.","Representar el n\xFAmero de la \xFAltima l\xEDnea cuando el archivo termina con un salto de l\xEDnea.","Resalta el medianil y la l\xEDnea actual.","Controla c\xF3mo debe representar el editor el resaltado de l\xEDnea actual.","Controla si el editor debe representar el resaltado de la l\xEDnea actual solo cuando el editor est\xE1 enfocado","Representa caracteres de espacio en blanco, excepto los espacios individuales entre palabras.","Represente los caracteres de espacio en blanco solo en el texto seleccionado.","Representar solo los caracteres de espacio en blanco al final","Controla la forma en que el editor debe representar los caracteres de espacio en blanco.","Controla si las selecciones deber\xEDan tener las esquinas redondeadas.","Controla el n\xFAmero de caracteres adicionales a partir del cual el editor se desplazar\xE1 horizontalmente.","Controla si el editor seguir\xE1 haciendo scroll despu\xE9s de la \xFAltima l\xEDnea.","Despl\xE1cese solo a lo largo del eje predominante cuando se desplace vertical y horizontalmente al mismo tiempo. Evita la deriva horizontal cuando se desplaza verticalmente en un trackpad.","Controla si el portapapeles principal de Linux debe admitirse.","Controla si el editor debe destacar las coincidencias similares a la selecci\xF3n.","Mostrar siempre los controles de plegado.","Mostrar solo los controles de plegado cuando el mouse est\xE1 sobre el medianil.","Controla cu\xE1ndo se muestran los controles de plegado en el medianil.","Controla el fundido de salida del c\xF3digo no usado.","Controla las variables en desuso tachadas.","Mostrar sugerencias de fragmentos de c\xF3digo por encima de otras sugerencias.","Mostrar sugerencias de fragmentos de c\xF3digo por debajo de otras sugerencias.","Mostrar sugerencias de fragmentos de c\xF3digo con otras sugerencias.","No mostrar sugerencias de fragmentos de c\xF3digo.","Controla si se muestran los fragmentos de c\xF3digo con otras sugerencias y c\xF3mo se ordenan.","Controla si el editor se desplazar\xE1 con una animaci\xF3n.","Tama\xF1o de la fuente para el widget de sugerencias. Cuando se establece a `0`, se utilizar\xE1 el valor `#editor.fontSize#`.",'Altura de la l\xEDnea del widget de sugerencias. Cuando se establece en "0", se usa el valor "#editor.lineHeight#". El valor m\xEDnimo es 8.',"Controla si deben aparecer sugerencias de forma autom\xE1tica al escribir caracteres desencadenadores.","Seleccionar siempre la primera sugerencia.",'Seleccione sugerencias recientes a menos que al escribir m\xE1s se seleccione una, por ejemplo, "console.| -> console.log" porque "log" se ha completado recientemente.','Seleccione sugerencias basadas en prefijos anteriores que han completado esas sugerencias, por ejemplo, "co -> console" y "con -> const".',"Controla c\xF3mo se preseleccionan las sugerencias cuando se muestra la lista,","La pesta\xF1a se completar\xE1 insertando la mejor sugerencia de coincidencia encontrada al presionar la pesta\xF1a","Deshabilitar los complementos para pesta\xF1as.","La pesta\xF1a se completa con fragmentos de c\xF3digo cuando su prefijo coincide. Funciona mejor cuando las 'quickSuggestions' no est\xE1n habilitadas.","Habilita completar pesta\xF1as.","Los terminadores de l\xEDnea no habituales se quitan autom\xE1ticamente.","Los terminadores de l\xEDnea no habituales se omiten.","Advertencia de terminadores de l\xEDnea inusuales que se quitar\xE1n.","Quite los terminadores de l\xEDnea inusuales que podr\xEDan provocar problemas.","La inserci\xF3n y eliminaci\xF3n del espacio en blanco sigue a las tabulaciones.","Caracteres que se usar\xE1n como separadores de palabras al realizar operaciones o navegaciones relacionadas con palabras.","Las l\xEDneas no se ajustar\xE1n nunca.","Las l\xEDneas se ajustar\xE1n en el ancho de la ventanilla.",'Las l\xEDneas se ajustar\xE1n al valor de "#editor.wordWrapColumn#". ','Las l\xEDneas se ajustar\xE1n al valor que sea inferior: el tama\xF1o de la ventanilla o el valor de "#editor.wordWrapColumn#".',"Controla c\xF3mo deben ajustarse las l\xEDneas.",'Controla la columna de ajuste del editor cuando "#editor.wordWrap#" es "wordWrapColumn" o "bounded".',"No hay sangr\xEDa. Las l\xEDneas ajustadas comienzan en la columna 1.","A las l\xEDneas ajustadas se les aplica la misma sangr\xEDa que al elemento primario.","A las l\xEDneas ajustadas se les aplica una sangr\xEDa de +1 respecto al elemento primario.","A las l\xEDneas ajustadas se les aplica una sangr\xEDa de +2 respecto al elemento primario.","Controla la sangr\xEDa de las l\xEDneas ajustadas.","Se supone que todos los caracteres son del mismo ancho. Este es un algoritmo r\xE1pido que funciona correctamente para fuentes monoespaciales y ciertos scripts (como caracteres latinos) donde los glifos tienen el mismo ancho.","Delega el c\xE1lculo de puntos de ajuste en el explorador. Es un algoritmo lento, que podr\xEDa causar bloqueos para archivos grandes, pero funciona correctamente en todos los casos.","Controla el algoritmo que calcula los puntos de ajuste."],"vs/editor/common/editorContextKeys":["Si el texto del editor tiene el foco (el cursor parpadea)","Si el editor o un widget del editor tiene el foco (por ejemplo, el foco est\xE1 en el widget de b\xFAsqueda)","Si un editor o una entrada de texto enriquecido tienen el foco (el cursor parpadea)","Si el editor es de solo lectura","Si el contexto es un editor de diferencias",'Si "editor.columnSelection" se ha habilitado',"Si el editor tiene texto seleccionado","Si el editor tiene varias selecciones",'Si "Tabulaci\xF3n" mover\xE1 el foco fuera del editor',"Si el mantenimiento del puntero del editor es visible","Si el editor forma parte de otro m\xE1s grande (por ejemplo, blocs de notas)","Identificador de idioma del editor","Si el editor tiene un proveedor de elementos de finalizaci\xF3n","Si el editor tiene un proveedor de acciones de c\xF3digo","Si el editor tiene un proveedor de CodeLens","Si el editor tiene un proveedor de definiciones","Si el editor tiene un proveedor de declaraciones","Si el editor tiene un proveedor de implementaci\xF3n","Si el editor tiene un proveedor de definiciones de tipo","Si el editor tiene un proveedor de contenido con mantenimiento del puntero","Si el editor tiene un proveedor de resaltado de documentos","Si el editor tiene un proveedor de s\xEDmbolos de documentos","Si el editor tiene un proveedor de referencia","Si el editor tiene un proveedor de cambio de nombre","Si el editor tiene un proveedor de ayuda de signatura","Si el editor tiene un proveedor de sugerencias insertadas","Si el editor tiene un proveedor de formatos de documento","Si el editor tiene un proveedor de formatos de selecci\xF3n de documentos","Si el editor tiene varios proveedores de formatos del documento","Si el editor tiene varios proveedores de formato de la selecci\xF3n de documentos"],"vs/editor/common/model/editStack":["Escribiendo"],"vs/editor/common/modes/modesRegistry":["Texto sin formato"],"vs/editor/common/standaloneStrings":["Sin selecci\xF3n","L\xEDnea {0}, columna {1} ({2} seleccionadas)","L\xEDnea {0}, columna {1}","{0} selecciones ({1} caracteres seleccionados)","{0} selecciones",'Se cambiar\xE1 ahora el valor "accessibilitySupport" a "activado".',"Se abrir\xE1 ahora la p\xE1gina de documentaci\xF3n de accesibilidad del editor.","en un panel de solo lectura de un editor de diferencias.","en un panel de un editor de diferencias.","en un editor de c\xF3digo de solo lectura"," en un editor de c\xF3digo","Para configurar el editor de forma que se optimice su uso con un lector de pantalla, presione ahora Comando+E.","Para configurar el editor de forma que se optimice su uso con un lector de pantalla, presione ahora Control+E.","El editor est\xE1 configurado para optimizarse para su uso con un lector de pantalla.","El editor est\xE1 configurado para que no se optimice nunca su uso con un lector de pantalla, que en este momento no es el caso.","Al presionar TAB en el editor actual, el foco se mueve al siguiente elemento activable. Presione {0} para activar o desactivar este comportamiento.","Al presionar TAB en el editor actual, el foco se mueve al siguiente elemento activable. El comando {0} no se puede desencadenar actualmente mediante un enlace de teclado.","Al presionar TAB en el editor actual, se insertar\xE1 el car\xE1cter de tabulaci\xF3n. Presione {0} para activar o desactivar este comportamiento.","Al presionar TAB en el editor actual, se insertar\xE1 el car\xE1cter de tabulaci\xF3n. El comando {0} no se puede desencadenar actualmente mediante un enlace de teclado.","Presione ahora Comando+H para abrir una ventana del explorador con m\xE1s informaci\xF3n relacionada con la accesibilidad del editor.","Presione ahora Control+H para abrir una ventana del explorador con m\xE1s informaci\xF3n relacionada con la accesibilidad del editor.","Para descartar esta informaci\xF3n sobre herramientas y volver al editor, presione Esc o May\xFAs+Escape.","Mostrar ayuda de accesibilidad","Desarrollador: inspeccionar tokens","Vaya a L\xEDnea/Columna...","Mostrar todos los proveedores de acceso r\xE1pido","Paleta de comandos","Mostrar y ejecutar comandos","Ir a s\xEDmbolo...","Ir a s\xEDmbolo por categor\xEDa...","Contenido del editor","Presione Alt+F1 para ver las opciones de accesibilidad.","Alternar tema de contraste alto","{0} ediciones realizadas en {1} archivos"],"vs/editor/common/view/editorColorRegistry":["Color de fondo para la l\xEDnea resaltada en la posici\xF3n del cursor.","Color de fondo del borde alrededor de la l\xEDnea en la posici\xF3n del cursor.","Color de fondo de rangos resaltados, como en abrir r\xE1pido y encontrar caracter\xEDsticas. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de fondo del borde alrededor de los intervalos resaltados.","Color de fondo del s\xEDmbolo destacado, como Ir a definici\xF3n o Ir al siguiente/anterior s\xEDmbolo. El color no debe ser opaco para no ocultar la decoraci\xF3n subyacente.","Color de fondo del borde alrededor de los s\xEDmbolos resaltados.","Color del cursor del editor.","Color de fondo del cursor de edici\xF3n. Permite personalizar el color del caracter solapado por el bloque del cursor.","Color de los caracteres de espacio en blanco del editor.","Color de las gu\xEDas de sangr\xEDa del editor.","Color de las gu\xEDas de sangr\xEDa activas del editor.","Color de n\xFAmeros de l\xEDnea del editor.","Color del n\xFAmero de l\xEDnea activa en el editor","ID es obsoleto. Usar en lugar 'editorLineNumber.activeForeground'. ","Color del n\xFAmero de l\xEDnea activa en el editor","Color de las reglas del editor","Color principal de lentes de c\xF3digo en el editor","Color de fondo tras corchetes coincidentes","Color de bloques con corchetes coincidentes","Color del borde de la regla de visi\xF3n general.","Color de fondo de la regla de informaci\xF3n general del editor. Solo se usa cuando el minimapa est\xE1 habilitado y est\xE1 ubicado en el lado derecho del editor.","Color de fondo del margen del editor. Este espacio contiene los m\xE1rgenes de glifos y los n\xFAmeros de l\xEDnea.","Color del borde de c\xF3digo fuente innecesario (sin usar) en el editor.",`Opacidad de c\xF3digo fuente innecesario (sin usar) en el editor. Por ejemplo, "#000000c0" representar\xE1 el c\xF3digo con un 75 % de opacidad. Para temas de alto contraste, utilice el color del tema 'editorUnnecessaryCode.border' para resaltar el c\xF3digo innecesario en vez de atenuarlo.`,"Color de marcador de regla general para los destacados de rango. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de marcador de regla de informaci\xF3n general para errores. ","Color de marcador de regla de informaci\xF3n general para advertencias.","Color de marcador de regla de informaci\xF3n general para mensajes informativos. "],"vs/editor/contrib/anchorSelect/anchorSelect":["Delimitador de la selecci\xF3n","Delimitador establecido en {0}:{1}","Establecer el delimitador de la selecci\xF3n","Ir al delimitador de la selecci\xF3n","Seleccionar desde el delimitador hasta el cursor","Cancelar el delimitador de la selecci\xF3n"],"vs/editor/contrib/bracketMatching/bracketMatching":["Resumen color de marcador de regla para corchetes.","Ir al corchete","Seleccionar para corchete","Ir al &&corchete"],"vs/editor/contrib/caretOperations/caretOperations":["Mover el texto seleccionado a la izquierda","Mover el texto seleccionado a la derecha"],"vs/editor/contrib/caretOperations/transpose":["Transponer letras"],"vs/editor/contrib/clipboard/clipboard":["Cor&&tar","Cortar","Cortar","&&Copiar","Copiar","Copiar","&&Pegar","Pegar","Pegar","Copiar con resaltado de sintaxis"],"vs/editor/contrib/codeAction/codeActionCommands":["Tipo de la acci\xF3n de c\xF3digo que se va a ejecutar.","Controla cu\xE1ndo se aplican las acciones devueltas.","Aplicar siempre la primera acci\xF3n de c\xF3digo devuelto.","Aplicar la primera acci\xF3n de c\xF3digo devuelta si solo hay una.","No aplique las acciones de c\xF3digo devuelto.","Controla si solo se deben devolver las acciones de c\xF3digo preferidas.","Se ha producido un error desconocido al aplicar la acci\xF3n de c\xF3digo","Correcci\xF3n R\xE1pida","No hay acciones de c\xF3digo disponibles",'No hay acciones de c\xF3digo preferidas para "{0}" disponibles','No hay ninguna acci\xF3n de c\xF3digo para "{0}" disponible.',"No hay acciones de c\xF3digo preferidas disponibles","No hay acciones de c\xF3digo disponibles","Refactorizar...",'No hay refactorizaciones preferidas de "{0}" disponibles','No hay refactorizaciones de "{0}" disponibles',"No hay ninguna refactorizaci\xF3n favorita disponible.","No hay refactorizaciones disponibles","Acci\xF3n de Origen...",'No hay acciones de origen preferidas para "{0}" disponibles','No hay ninguna acci\xF3n de origen para "{0}" disponible.',"No hay ninguna acci\xF3n de origen favorita disponible.","No hay acciones de origen disponibles","Organizar Importaciones","No hay acciones de importaci\xF3n disponibles","Corregir todo","No est\xE1 disponible la acci\xF3n de corregir todo","Corregir autom\xE1ticamente...","No hay autocorrecciones disponibles"],"vs/editor/contrib/codeAction/lightBulbWidget":["Mostrar correcciones. Soluci\xF3n preferida disponible ({0})","Mostrar correcciones ({0})","Mostrar correcciones"],"vs/editor/contrib/codelens/codelensController":["Mostrar comandos de lente de c\xF3digo para la l\xEDnea actual"],"vs/editor/contrib/comment/comment":["Alternar comentario de l\xEDnea","&&Alternar comentario de l\xEDnea","Agregar comentario de l\xEDnea","Quitar comentario de l\xEDnea","Alternar comentario de bloque","Alternar &&bloque de comentario"],"vs/editor/contrib/contextmenu/contextmenu":["Mostrar men\xFA contextual del editor"],"vs/editor/contrib/cursorUndo/cursorUndo":["Cursor Deshacer","Cursor Rehacer"],"vs/editor/contrib/find/findController":["Buscar","&&Buscar","Buscar con selecci\xF3n","Buscar siguiente","Buscar siguiente","Buscar anterior","Buscar anterior","Buscar selecci\xF3n siguiente","Buscar selecci\xF3n anterior","Reemplazar","&&Reemplazar"],"vs/editor/contrib/find/findWidget":['Icono para "Buscar en selecci\xF3n" en el widget de b\xFAsqueda del editor.',"Icono para indicar que el widget de b\xFAsqueda del editor est\xE1 contra\xEDdo.","Icono para indicar que el widget de b\xFAsqueda del editor est\xE1 expandido.",'Icono para "Reemplazar" en el widget de b\xFAsqueda del editor.','Icono para "Reemplazar todo" en el widget de b\xFAsqueda del editor.','Icono para "Buscar anterior" en el widget de b\xFAsqueda del editor.','Icono para "Buscar siguiente" en el widget de b\xFAsqueda del editor.',"Buscar","Buscar","Coincidencia anterior","Pr\xF3xima coincidencia","Buscar en selecci\xF3n","Cerrar","Reemplazar","Reemplazar","Reemplazar","Reemplazar todo","Alternar modo de reemplazar","S\xF3lo los primeros {0} resultados son resaltados, pero todas las operaciones de b\xFAsqueda trabajan en todo el texto.","{0} de {1}","No hay resultados","Encontrados: {0}",'{0} encontrado para "{1}"','{0} encontrado para "{1}", en {2}','{0} encontrado para "{1}"',"Ctrl+Entrar ahora inserta un salto de l\xEDnea en lugar de reemplazar todo. Puede modificar el enlace de claves para editor.action.replaceAll para invalidar este comportamiento."],"vs/editor/contrib/folding/folding":["Desplegar","Desplegar de forma recursiva","Plegar","Alternar plegado","Plegar de forma recursiva","Cerrar todos los comentarios de bloque","Plegar todas las regiones","Desplegar Todas las Regiones","Plegar todo","Desplegar todo","Nivel de plegamiento {0}","Color de fondo detr\xE1s de los rangos plegados. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color del control plegable en el medianil del editor."],"vs/editor/contrib/folding/foldingDecorations":["Icono de rangos expandidos en el margen de glifo del editor.","Icono de rangos contra\xEDdos en el margen de glifo del editor."],"vs/editor/contrib/fontZoom/fontZoom":["Acercarse a la tipograf\xEDa del editor","Alejarse de la tipograf\xEDa del editor","Restablecer alejamiento de la tipograf\xEDa del editor"],"vs/editor/contrib/format/format":["1 edici\xF3n de formato en la l\xEDnea {0}","{0} ediciones de formato en la l\xEDnea {1}","1 edici\xF3n de formato entre las l\xEDneas {0} y {1}","{0} ediciones de formato entre las l\xEDneas {1} y {2}"],"vs/editor/contrib/format/formatActions":["Dar formato al documento","Dar formato a la selecci\xF3n"],"vs/editor/contrib/gotoError/gotoError":["Ir al siguiente problema (Error, Advertencia, Informaci\xF3n)","Icono para ir al marcador siguiente.","Ir al problema anterior (Error, Advertencia, Informaci\xF3n)","Icono para ir al marcador anterior.","Ir al siguiente problema en Archivos (Error, Advertencia, Informaci\xF3n)","Siguiente &&problema","Ir al problema anterior en Archivos (Error, Advertencia, Informaci\xF3n)","Anterior &&problema"],"vs/editor/contrib/gotoError/gotoErrorWidget":["Error","Advertencia","Informaci\xF3n","Sugerencia","{0} en {1}. ","{0} de {1} problemas","{0} de {1} problema","Color de los errores del widget de navegaci\xF3n de marcadores del editor.","Color de las advertencias del widget de navegaci\xF3n de marcadores del editor.","Color del widget informativo marcador de navegaci\xF3n en el editor.","Fondo del widget de navegaci\xF3n de marcadores del editor."],"vs/editor/contrib/gotoSymbol/goToCommands":["Ver","Definiciones",'No se encontr\xF3 ninguna definici\xF3n para "{0}"',"No se encontr\xF3 ninguna definici\xF3n","Ir a definici\xF3n","Ir a &&definici\xF3n","Abrir definici\xF3n en el lateral","Ver la definici\xF3n sin salir","Declaraciones","No se encontr\xF3 ninguna definici\xF3n para '{0}'","No se encontr\xF3 ninguna declaraci\xF3n","Ir a Definici\xF3n","Ir a &&Declaraci\xF3n","No se encontr\xF3 ninguna definici\xF3n para '{0}'","No se encontr\xF3 ninguna declaraci\xF3n","Inspeccionar Definici\xF3n","Definiciones de tipo",'No se encontr\xF3 ninguna definici\xF3n de tipo para "{0}"',"No se encontr\xF3 ninguna definici\xF3n de tipo","Ir a la definici\xF3n de tipo","Ir a la definici\xF3n de &&tipo","Inspeccionar definici\xF3n de tipo","Implementaciones",'No se encontr\xF3 ninguna implementaci\xF3n para "{0}"',"No se encontr\xF3 ninguna implementaci\xF3n","Ir a Implementaciones","Ir a &&Implementaciones","Inspeccionar implementaciones",'No se ha encontrado ninguna referencia para "{0}".',"No se encontraron referencias","Ir a Referencias","Ir a &&Referencias","Referencias","Inspeccionar Referencias","Referencias","Ir a cualquier s\xEDmbolo","Ubicaciones",'No hay resultados para "{0}"',"Referencias"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["Haga clic para mostrar {0} definiciones."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["Cargando...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} referencias","{0} referencia","Referencias"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["vista previa no disponible","No hay resultados","Referencias"],"vs/editor/contrib/gotoSymbol/referencesModel":["s\xEDmbolo en {0} linea {1} en la columna {2}","s\xEDmbolo en {0} l\xEDnea {1} en la columna {2}, {3}","1 s\xEDmbolo en {0}, ruta de acceso completa {1}","{0} s\xEDmbolos en {1}, ruta de acceso completa {2}","No se encontraron resultados","Encontr\xF3 1 s\xEDmbolo en {0}","Encontr\xF3 {0} s\xEDmbolos en {1}","Encontr\xF3 {0} s\xEDmbolos en {1} archivos"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["S\xEDmbolo {0} de {1}, {2} para el siguiente","S\xEDmbolo {0} de {1}"],"vs/editor/contrib/hover/hover":["Mostrar al mantener el puntero","Mostrar vista previa de la definici\xF3n que aparece al mover el puntero"],"vs/editor/contrib/hover/markdownHoverParticipant":["Cargando..."],"vs/editor/contrib/hover/markerHoverParticipant":["Ver el problema","No hay correcciones r\xE1pidas disponibles","Buscando correcciones r\xE1pidas...","No hay correcciones r\xE1pidas disponibles","Correcci\xF3n R\xE1pida"],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["Reemplazar con el valor anterior","Reemplazar con el valor siguiente"],"vs/editor/contrib/indentation/indentation":["Convertir sangr\xEDa en espacios","Convertir sangr\xEDa en tabulaciones","Tama\xF1o de tabulaci\xF3n configurado","Seleccionar tama\xF1o de tabulaci\xF3n para el archivo actual","Aplicar sangr\xEDa con tabulaciones","Aplicar sangr\xEDa con espacios","Detectar sangr\xEDa del contenido","Volver a aplicar sangr\xEDa a l\xEDneas","Volver a aplicar sangr\xEDa a l\xEDneas seleccionadas"],"vs/editor/contrib/linesOperations/linesOperations":["Copiar l\xEDnea arriba","&&Copiar l\xEDnea arriba","Copiar l\xEDnea abajo","Co&&piar l\xEDnea abajo","Selecci\xF3n duplicada","&&Duplicar selecci\xF3n","Mover l\xEDnea hacia arriba","Mo&&ver l\xEDnea arriba","Mover l\xEDnea hacia abajo","Mover &&l\xEDnea abajo","Ordenar l\xEDneas en orden ascendente","Ordenar l\xEDneas en orden descendente","Recortar espacio final","Eliminar l\xEDnea","Sangr\xEDa de l\xEDnea","Anular sangr\xEDa de l\xEDnea","Insertar l\xEDnea arriba","Insertar l\xEDnea debajo","Eliminar todo a la izquierda","Eliminar todo lo que est\xE1 a la derecha","Unir l\xEDneas","Transponer caracteres alrededor del cursor","Transformar a may\xFAsculas","Transformar a min\xFAsculas","Transformar en Title Case","Transformar en Snake Case"],"vs/editor/contrib/linkedEditing/linkedEditing":["Iniciar edici\xF3n vinculada","Color de fondo cuando el editor cambia el nombre autom\xE1ticamente al escribir."],"vs/editor/contrib/links/links":["Ejecutar comando","Seguir v\xEDnculo","cmd + clic","ctrl + clic","opci\xF3n + clic","alt + clic","Ejecutar el comando {0}","No se pudo abrir este v\xEDnculo porque no tiene un formato correcto: {0}","No se pudo abrir este v\xEDnculo porque falta el destino.","Abrir v\xEDnculo"],"vs/editor/contrib/message/messageController":["Indica si el editor muestra actualmente un mensaje insertado","No se puede editar en un editor de s\xF3lo lectura"],"vs/editor/contrib/multicursor/multicursor":["Agregar cursor arriba","&&Agregar cursor arriba","Agregar cursor debajo","A&&gregar cursor abajo","A\xF1adir cursores a finales de l\xEDnea","Agregar c&&ursores a extremos de l\xEDnea","A\xF1adir cursores a la parte inferior","A\xF1adir cursores a la parte superior","Agregar selecci\xF3n hasta la siguiente coincidencia de b\xFAsqueda","Agregar &&siguiente repetici\xF3n","Agregar selecci\xF3n hasta la anterior coincidencia de b\xFAsqueda","Agregar r&&epetici\xF3n anterior","Mover \xFAltima selecci\xF3n hasta la siguiente coincidencia de b\xFAsqueda","Mover \xFAltima selecci\xF3n hasta la anterior coincidencia de b\xFAsqueda","Seleccionar todas las repeticiones de coincidencia de b\xFAsqueda","Seleccionar todas las &&repeticiones","Cambiar todas las ocurrencias"],"vs/editor/contrib/parameterHints/parameterHints":["Sugerencias para par\xE1metros Trigger"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["Icono para mostrar la sugerencia de par\xE1metro siguiente.","Icono para mostrar la sugerencia de par\xE1metro anterior.","{0}, sugerencia"],"vs/editor/contrib/peekView/peekView":["Cerrar","Color de fondo del \xE1rea de t\xEDtulo de la vista de inspecci\xF3n.","Color del t\xEDtulo de la vista de inpecci\xF3n.","Color de la informaci\xF3n del t\xEDtulo de la vista de inspecci\xF3n.","Color de los bordes y la flecha de la vista de inspecci\xF3n.","Color de fondo de la lista de resultados de vista de inspecci\xF3n.","Color de primer plano de los nodos de inspecci\xF3n en la lista de resultados.","Color de primer plano de los archivos de inspecci\xF3n en la lista de resultados.","Color de fondo de la entrada seleccionada en la lista de resultados de vista de inspecci\xF3n.","Color de primer plano de la entrada seleccionada en la lista de resultados de vista de inspecci\xF3n.","Color de fondo del editor de vista de inspecci\xF3n.","Color de fondo del margen en el editor de vista de inspecci\xF3n.","Buscar coincidencia con el color de resaltado de la lista de resultados de vista de inspecci\xF3n.","Buscar coincidencia del color de resultado del editor de vista de inspecci\xF3n.","Hacer coincidir el borde resaltado en el editor de vista previa."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["Abra primero un editor de texto para ir a una l\xEDnea.","Vaya a la l\xEDnea {0} y a la columna {1}.","Ir a la l\xEDnea {0}.","L\xEDnea actual: {0}, Car\xE1cter: {1}. Escriba un n\xFAmero de l\xEDnea entre 1 y {2} a los que navegar.","L\xEDnea actual: {0}, Car\xE1cter: {1}. Escriba un n\xFAmero de l\xEDnea al que navegar."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["Para ir a un s\xEDmbolo, primero abra un editor de texto con informaci\xF3n de s\xEDmbolo.","El editor de texto activo no proporciona informaci\xF3n de s\xEDmbolos.","No hay ning\xFAn s\xEDmbolo del editor coincidente.","No hay s\xEDmbolos del editor.","Abrir en el lateral","Abrir en la parte inferior","s\xEDmbolos ({0})","propiedades ({0})","m\xE9todos ({0})","funciones ({0})","constructores ({0})","variables ({0})","clases ({0})","estructuras ({0})","eventos ({0})","operadores ({0})","interfaces ({0})","espacios de nombres ({0})","paquetes ({0})","par\xE1metros de tipo ({0})","m\xF3dulos ({0})","propiedades ({0})","enumeraciones ({0})","miembros de enumeraci\xF3n ({0})","cadenas ({0})","archivos ({0})","matrices ({0})","n\xFAmeros ({0})","booleanos ({0})","objetos ({0})","claves ({0})","campos ({0})","constantes ({0})"],"vs/editor/contrib/rename/rename":["No hay ning\xFAn resultado.","Error desconocido al resolver el cambio de nombre de la ubicaci\xF3n",'Cambiando el nombre de "{0}"',"Cambiar el nombre de {0}","Nombre cambiado correctamente de '{0}' a '{1}'. Resumen: {2}","No se pudo cambiar el nombre a las ediciones de aplicaci\xF3n","No se pudo cambiar el nombre de las ediciones de c\xE1lculo","Cambiar el nombre del s\xEDmbolo","Activar/desactivar la capacidad de previsualizar los cambios antes de cambiar el nombre"],"vs/editor/contrib/rename/renameInputField":["Cambie el nombre de la entrada. Escriba el nuevo nombre y presione Entrar para confirmar.","{0} para cambiar de nombre, {1} para obtener una vista previa"],"vs/editor/contrib/smartSelect/smartSelect":["Expandir selecci\xF3n","&&Expandir selecci\xF3n","Reducir la selecci\xF3n","&&Reducir selecci\xF3n"],"vs/editor/contrib/snippet/snippetVariables":["Domingo","Lunes","Martes","Mi\xE9rcoles","Jueves","Viernes","S\xE1bado","Dom","Lun","Mar","Mi\xE9","Jue","Vie","S\xE1b","Enero","Febrero","Marzo","Abril","May","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre","Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],"vs/editor/contrib/suggest/suggestController":['Aceptando "{0}" ediciones adicionales de {1} realizadas',"Sugerencias para Trigger","Insertar","Insertar","Reemplazar","Reemplazar","Insertar","mostrar menos","mostrar m\xE1s","Restablecer tama\xF1o del widget de sugerencias"],"vs/editor/contrib/suggest/suggestWidget":["Color de fondo del widget sugerido.","Color de borde del widget sugerido.","Color de primer plano del widget sugerido.","Color de fondo de la entrada seleccionada del widget sugerido.","Color del resaltado coincidido en el widget sugerido.","Cargando...","No hay sugerencias.","{0}, documentos: {1}","Sugerir"],"vs/editor/contrib/suggest/suggestWidgetDetails":["Cerrar","Cargando..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["Icono para obtener m\xE1s informaci\xF3n en el widget de sugerencias.","Leer m\xE1s"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["Color de primer plano de los s\xEDmbolos de matriz. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos booleanos. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de clase. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de color. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos constantes. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de constructor. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de enumerador. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de miembro del enumerador. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de evento. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de campo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de archivo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de carpeta. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de funci\xF3n. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de interfaz. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de claves. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de palabra clave. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de m\xE9todo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de m\xF3dulo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de espacio de nombres. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos nulos. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano para los s\xEDmbolos num\xE9ricos. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de objeto. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano para los s\xEDmbolos del operador. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de paquete. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de propiedad. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de referencia. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de fragmento de c\xF3digo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de cadena. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de estructura. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de texto. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano para los s\xEDmbolos de par\xE1metro de tipo. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos de unidad. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias.","Color de primer plano de los s\xEDmbolos variables. Estos s\xEDmbolos aparecen en el contorno, la ruta de navegaci\xF3n y el widget de sugerencias."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["Alternar tecla de tabulaci\xF3n para mover el punto de atenci\xF3n","Presionando la pesta\xF1a ahora mover\xE1 el foco al siguiente elemento enfocable.","Presionando la pesta\xF1a ahora insertar\xE1 el car\xE1cter de tabulaci\xF3n"],"vs/editor/contrib/tokenization/tokenization":["Desarrollador: forzar nueva aplicaci\xF3n de token"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["Terminadores de l\xEDnea inusuales","Se han detectado terminadores de l\xEDnea inusuales",`Este archivo contiene uno o varios caracteres de terminador de l\xEDnea inusuales, como Separador de l\xEDneas (LS) o Separador de p\xE1rrafos (PS).\r +\r +Se recomienda quitarlos del archivo. Se puede configurar a trav\xE9s de "editor.unusualLineTerminators".`,"Corregir este archivo","Ignorar problema para este archivo"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["Color de fondo de un s\xEDmbolo durante el acceso de lectura, como la lectura de una variable. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de fondo de un s\xEDmbolo durante el acceso de escritura, como escribir en una variable. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de fondo de un s\xEDmbolo durante el acceso de lectura; por ejemplo, cuando se lee una variable.","Color de fondo de un s\xEDmbolo durante el acceso de escritura; por ejemplo, cuando se escribe una variable.","Color del marcador de regla general para destacados de s\xEDmbolos. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de marcador de regla general para destacados de s\xEDmbolos de acceso de escritura. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Ir al siguiente s\xEDmbolo destacado","Ir al s\xEDmbolo destacado anterior","Desencadenar los s\xEDmbolos destacados"],"vs/editor/contrib/wordOperations/wordOperations":["Eliminar palabra"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["La configuraci\xF3n del lenguaje predeterminada se reemplaza","Establecer los valores de configuraci\xF3n que se reemplazar\xE1n para un lenguaje.","Esta configuraci\xF3n no admite la configuraci\xF3n por idioma.","No se puede registrar una propiedad vac\xEDa.",`No se puede registrar "{0}". Coincide con el patr\xF3n de propiedad '\\\\[.*\\\\]$' para describir la configuraci\xF3n del editor espec\xEDfica del lenguaje. Utilice la contribuci\xF3n "configurationDefaults".`,'No se puede registrar "{0}". Esta propiedad ya est\xE1 registrada.'],"vs/platform/contextkey/browser/contextKeyService":["Comando que devuelve informaci\xF3n sobre las claves de contexto"],"vs/platform/contextkey/common/contextkeys":["Si el sistema operativo es Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["Se presion\xF3 ({0}). Esperando la siguiente tecla...","La combinaci\xF3n de claves ({0}, {1}) no es un comando."],"vs/platform/list/browser/listService":["\xC1rea de trabajo",'Se asigna a "Control" en Windows y Linux y a "Comando" en macOS.','Se asigna a "Alt" en Windows y Linux y a "Opci\xF3n" en macOS.',"El modificador que se utilizar\xE1 para agregar un elemento en los \xE1rboles y listas para una selecci\xF3n m\xFAltiple con el rat\xF3n (por ejemplo en el explorador, abiertos editores y vista de scm). Los gestos de rat\xF3n 'Abrir hacia' - si est\xE1n soportados - se adaptar\xE1n de forma tal que no tenga conflicto con el modificador m\xFAltiple.","Controla c\xF3mo abrir elementos en los \xE1rboles y las listas mediante el mouse (si se admite). Tenga en cuenta que algunos \xE1rboles y listas pueden optar por ignorar esta configuraci\xF3n si no es aplicable.","Controla si las listas y los \xE1rboles admiten el desplazamiento horizontal en el \xE1rea de trabajo. Advertencia: La activaci\xF3n de esta configuraci\xF3n repercute en el rendimiento.","Controla la sangr\xEDa de \xE1rbol en p\xEDxeles.","Controla si el \xE1rbol debe representar gu\xEDas de sangr\xEDa.","Controla si las listas y los \xE1rboles tienen un desplazamiento suave.","La navegaci\xF3n simple del teclado se centra en elementos que coinciden con la entrada del teclado. El emparejamiento se hace solo en prefijos.","Destacar la navegaci\xF3n del teclado resalta los elementos que coinciden con la entrada del teclado. M\xE1s arriba y abajo la navegaci\xF3n atravesar\xE1 solo los elementos destacados.","La navegaci\xF3n mediante el teclado de filtro filtrar\xE1 y ocultar\xE1 todos los elementos que no coincidan con la entrada del teclado.","Controla el estilo de navegaci\xF3n del teclado para listas y \xE1rboles en el \xE1rea de trabajo. Puede ser simple, resaltar y filtrar.",'Controla si la navegaci\xF3n del teclado en listas y \xE1rboles se activa autom\xE1ticamente simplemente escribiendo. Si se establece en "false", la navegaci\xF3n con el teclado solo se activa al ejecutar el comando "list.toggleKeyboardNavigation", para el cual puede asignar un m\xE9todo abreviado de teclado.',"Controla c\xF3mo se expanden las carpetas de \xE1rbol al hacer clic en sus nombres. Tenga en cuenta que algunos \xE1rboles y listas pueden optar por omitir esta configuraci\xF3n si no es aplicable."],"vs/platform/markers/common/markers":["Error","Advertencia","Informaci\xF3n"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","usado recientemente","otros comandos",'El comando "{0}" dio lugar a un error ({1})'],"vs/platform/quickinput/browser/helpQuickAccess":["comandos globales","comandos del editor","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["Color de primer plano general. Este color solo se usa si un componente no lo invalida.","Color de primer plano general para los mensajes de erroe. Este color solo se usa si un componente no lo invalida.","El color predeterminado para los iconos en el \xE1rea de trabajo.","Color de borde de los elementos con foco. Este color solo se usa si un componente no lo invalida.","Un borde adicional alrededor de los elementos para separarlos unos de otros y as\xED mejorar el contraste.","Un borde adicional alrededor de los elementos activos para separarlos unos de otros y as\xED mejorar el contraste.","Color de primer plano para los v\xEDnculos en el texto.","Color de fondo para los bloques de c\xF3digo en el texto.","Color de sombra de los widgets dentro del editor, como buscar/reemplazar","Fondo de cuadro de entrada.","Primer plano de cuadro de entrada.","Borde de cuadro de entrada.","Color de borde de opciones activadas en campos de entrada.","Color de fondo de las opciones activadas en los campos de entrada.","Color de primer plano de las opciones activadas en los campos de entrada.","Color de fondo de validaci\xF3n de entrada para gravedad de informaci\xF3n.","Color de primer plano de validaci\xF3n de entrada para informaci\xF3n de gravedad.","Color de borde de validaci\xF3n de entrada para gravedad de informaci\xF3n.","Color de fondo de validaci\xF3n de entrada para gravedad de advertencia.","Color de primer plano de validaci\xF3n de entrada para informaci\xF3n de advertencia.","Color de borde de validaci\xF3n de entrada para gravedad de advertencia.","Color de fondo de validaci\xF3n de entrada para gravedad de error.","Color de primer plano de validaci\xF3n de entrada para informaci\xF3n de error.","Color de borde de valdaci\xF3n de entrada para gravedad de error.","Fondo de lista desplegable.","Primer plano de lista desplegable.","Color de primer plano del bot\xF3n.","Color de fondo del bot\xF3n.","Color de fondo del bot\xF3n al mantener el puntero.","Color de fondo de la insignia. Las insignias son peque\xF1as etiquetas de informaci\xF3n, por ejemplo los resultados de un n\xFAmero de resultados.","Color de primer plano de la insignia. Las insignias son peque\xF1as etiquetas de informaci\xF3n, por ejemplo los resultados de un n\xFAmero de resultados.","Sombra de la barra de desplazamiento indica que la vista se ha despazado.","Color de fondo de control deslizante de barra de desplazamiento.","Color de fondo de barra de desplazamiento cursor cuando se pasar sobre el control.","Color de fondo de la barra de desplazamiento al hacer clic.","Color de fondo para la barra de progreso que se puede mostrar para las operaciones de larga duraci\xF3n.","Color de fondo del texto de error del editor. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de primer plano de squigglies de error en el editor.","Color del borde de los cuadros de error en el editor.","Color de fondo del texto de advertencia del editor. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de primer plano de squigglies de advertencia en el editor.","Color del borde de los cuadros de advertencia en el editor.","Color de fondo del texto de informaci\xF3n del editor. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de primer plano de los subrayados ondulados informativos en el editor.","Color del borde de los cuadros de informaci\xF3n en el editor.","Color de primer plano de pista squigglies en el editor.","Color del borde de los cuadros de sugerencia en el editor.","Color de fondo del editor.","Color de primer plano predeterminado del editor.","Color de fondo del editor de widgets como buscar/reemplazar","Color de primer plano de los widgets del editor, como buscar y reemplazar.","Color de borde de los widgets del editor. El color solo se usa si el widget elige tener un borde y no invalida el color.","Color del borde de la barra de cambio de tama\xF1o de los widgets del editor. El color se utiliza solo si el widget elige tener un borde de cambio de tama\xF1o y si un widget no invalida el color.","Color de fondo del selector r\xE1pido. El widget del selector r\xE1pido es el contenedor para selectores como la paleta de comandos.","Color de primer plano del selector r\xE1pido. El widget del selector r\xE1pido es el contenedor para selectores como la paleta de comandos.","Color de fondo del t\xEDtulo del selector r\xE1pido. El widget del selector r\xE1pido es el contenedor para selectores como la paleta de comandos.","Color de fondo del selector r\xE1pido para el elemento con el foco.","Selector de color r\xE1pido para la agrupaci\xF3n de etiquetas.","Selector de color r\xE1pido para la agrupaci\xF3n de bordes.","Color de la selecci\xF3n del editor.","Color del texto seleccionado para alto contraste.","Color de la selecci\xF3n en un editor inactivo. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color en las regiones con el mismo contenido que la selecci\xF3n. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de borde de las regiones con el mismo contenido que la selecci\xF3n.","Color de la coincidencia de b\xFAsqueda actual.","Color de los otros resultados de la b\xFAsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de la gama que limita la b\xFAsqueda. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de borde de la coincidencia de b\xFAsqueda actual.","Color de borde de otra b\xFAsqueda que coincide.","Color del borde de la gama que limita la b\xFAsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Destacar debajo de la palabra para la que se muestra un mensaje al mantener el mouse. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de fondo al mantener el puntero en el editor.","Color de primer plano al mantener el puntero en el editor.","Color del borde al mantener el puntero en el editor.","Color de fondo de la barra de estado al mantener el puntero en el editor.","Color de los v\xEDnculos activos.","Color de primer plano de las sugerencias insertadas","Color de fondo de las sugerencias insertadas","El color utilizado para el icono de bombilla de acciones.","El color utilizado para el icono de la bombilla de acciones de correcci\xF3n autom\xE1tica.","Color de fondo para el texto que se insert\xF3. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de fondo para el texto que se elimin\xF3. El color no debe ser opaco para no ocultar decoraciones subyacentes.","Color de contorno para el texto insertado.","Color de contorno para el texto quitado.","Color del borde entre ambos editores de texto.","Color de relleno diagonal del editor de diferencias. El relleno diagonal se usa en las vistas de diferencias en paralelo.","Color de fondo de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de primer plano de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de contorno de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, pero no cuando est\xE1n inactivos.","Color de fondo de la lista o el \xE1rbol del elemento seleccionado cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de primer plano de la lista o el \xE1rbol del elemento seleccionado cuando la lista o el \xE1rbol est\xE1n activos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de fondo de la lista o el \xE1rbol del elemento seleccionado cuando la lista o el \xE1rbol est\xE1n inactivos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, cuando est\xE1n inactivos no.","Color de primer plano de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol esta inactiva. Una lista o un \xE1rbol tiene el foco del teclado cuando est\xE1 activo, cuando esta inactiva no.","Color de fondo de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n inactivos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, pero no cuando est\xE1n inactivos.","Color de contorno de la lista o el \xE1rbol del elemento con el foco cuando la lista o el \xE1rbol est\xE1n inactivos. Una lista o un \xE1rbol tienen el foco del teclado cuando est\xE1n activos, pero no cuando est\xE1n inactivos.","Fondo de la lista o el \xE1rbol al mantener el mouse sobre los elementos.","Color de primer plano de la lista o el \xE1rbol al pasar por encima de los elementos con el rat\xF3n.","Fondo de arrastrar y colocar la lista o el \xE1rbol al mover los elementos con el mouse.","Color de primer plano de la lista o el \xE1rbol de las coincidencias resaltadas al buscar dentro de la lista o el \xE1bol.","Color de fondo del widget de filtro de tipo en listas y \xE1rboles.","Color de contorno del widget de filtro de tipo en listas y \xE1rboles.","Color de contorno del widget de filtro de tipo en listas y \xE1rboles, cuando no hay coincidencias.","Color de trazo de \xE1rbol para las gu\xEDas de sangr\xEDa.","Color de trazo de \xE1rbol para las gu\xEDas de sangr\xEDa.","Color del borde de los men\xFAs.","Color de primer plano de los elementos de men\xFA.","Color de fondo de los elementos de men\xFA.","Color de primer plano del menu para el elemento del men\xFA seleccionado.","Color de fondo del menu para el elemento del men\xFA seleccionado.","Color del borde del elemento seleccionado en los men\xFAs.","Color del separador del menu para un elemento del men\xFA.","Resaltado del color de fondo para una ficha de un fragmento de c\xF3digo.","Resaltado del color del borde para una ficha de un fragmento de c\xF3digo.","Resaltado del color de fondo para la \xFAltima ficha de un fragmento de c\xF3digo.","Resaltado del color del borde para la \xFAltima tabulaci\xF3n de un fragmento de c\xF3digo.","Color del marcador de regla general para buscar actualizaciones. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color del marcador de la regla general para los destacados de la selecci\xF3n. El color no debe ser opaco para no ocultar las decoraciones subyacentes.","Color de marcador de minimapa para coincidencias de b\xFAsqueda.","Color del marcador de minimapa para la selecci\xF3n del editor.","Color del marcador de minimapa para errores.","Color del marcador de minimapa para advertencias.","Color de fondo del minimapa.","Color de fondo del deslizador del minimapa.","Color de fondo del deslizador del minimapa al pasar el puntero.","Color de fondo del deslizador de minimapa al hacer clic en \xE9l.","Color utilizado para el icono de error de problemas.","Color utilizado para el icono de advertencia de problemas.","Color utilizado para el icono de informaci\xF3n de problemas."],"vs/platform/theme/common/iconRegistry":["Identificador de la fuente que se va a usar. Si no se establece, se usa la fuente definida en primer lugar.","Car\xE1cter de fuente asociado a la definici\xF3n del icono.","Icono de la acci\xF3n de cierre en los widgets."],"vs/platform/undoRedo/common/undoRedoService":["Se han cerrado los siguientes archivos y se han modificado en el disco: {0}.","Los siguientes archivos se han modificado de forma incompatible: {0}.",'No se pudo deshacer "{0}" en todos los archivos. {1}','No se pudo deshacer "{0}" en todos los archivos. {1}','No se pudo deshacer "{0}" en todos los archivos porque se realizaron cambios en {1}','No se pudo deshacer "{0}" en todos los archivos porque ya hay una operaci\xF3n de deshacer o rehacer en ejecuci\xF3n en {1}','No se pudo deshacer "{0}" en todos los archivos porque se produjo una operaci\xF3n de deshacer o rehacer mientras tanto','\xBFDesea deshacer "{0}" en todos los archivos?',"Deshacer en {0} archivos","Deshacer este archivo","Cancelar",'No se pudo deshacer "{0}" porque ya hay una operaci\xF3n de deshacer o rehacer en ejecuci\xF3n.','\xBFQuiere deshacer "{0}"?',"Deshacer","Cancelar",'No se pudo rehacer "{0}" en todos los archivos. {1}','No se pudo rehacer "{0}" en todos los archivos. {1}','No se pudo volver a hacer "{0}" en todos los archivos porque se realizaron cambios en {1}','No se pudo rehacer "{0}" en todos los archivos porque ya hay una operaci\xF3n de deshacer o rehacer en ejecuci\xF3n en {1}','No se pudo rehacer "{0}" en todos los archivos porque se produjo una operaci\xF3n de deshacer o rehacer mientras tanto','No se pudo rehacer "{0}" porque ya hay una operaci\xF3n de deshacer o rehacer en ejecuci\xF3n.']}); diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.es.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.es.js.gz new file mode 100644 index 0000000..a88e045 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.es.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.fr.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.fr.js new file mode 100644 index 0000000..d16d576 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.fr.js @@ -0,0 +1,8 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.fr",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["entr\xE9e"],"vs/base/browser/ui/findinput/findInputCheckboxes":["Respecter la casse","Mot entier","Utiliser une expression r\xE9guli\xE8re"],"vs/base/browser/ui/findinput/replaceInput":["entr\xE9e","Pr\xE9server la casse"],"vs/base/browser/ui/iconLabel/iconLabel":["Chargement..."],"vs/base/browser/ui/inputbox/inputBox":["Erreur\xA0: {0}","Avertissement\xA0: {0}","Info\xA0: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Ind\xE9pendant"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["Effacer","D\xE9sactiver le filtre sur le type","Activer le filtre sur le type","Aucun \xE9l\xE9ment","{0}\xA0\xE9l\xE9ments sur {1} correspondants"],"vs/base/common/actions":["(vide)"],"vs/base/common/errorMessage":["{0}: {1}","Une erreur syst\xE8me s'est produite ({0})","Une erreur inconnue s\u2019est produite. Veuillez consulter le journal pour plus de d\xE9tails.","Une erreur inconnue s\u2019est produite. Veuillez consulter le journal pour plus de d\xE9tails.","{0} ({1}\xA0erreurs au total)","Une erreur inconnue s\u2019est produite. Veuillez consulter le journal pour plus de d\xE9tails."],"vs/base/common/keybindingLabels":["Ctrl","Maj","Alt","Windows","Ctrl","Maj","Alt","Super","Contr\xF4le","Maj","Alt","Commande","Contr\xF4le","Maj","Alt","Windows","Contr\xF4le","Maj","Alt","Super"],"vs/base/parts/quickinput/browser/quickInput":["Pr\xE9c\xE9dent","{0}/{1}","Taper pour affiner les r\xE9sultats.","{0}\xA0r\xE9sultats","{0} S\xE9lectionn\xE9s","OK","Personnalis\xE9","Pr\xE9c\xE9dent ({0})","Pr\xE9c\xE9dent"],"vs/base/parts/quickinput/browser/quickInputList":["Entr\xE9e rapide"],"vs/editor/browser/controller/coreCommands":["Aligner par rapport \xE0 la fin m\xEAme en cas de passage \xE0 des lignes plus longues","Aligner par rapport \xE0 la fin m\xEAme en cas de passage \xE0 des lignes plus longues"],"vs/editor/browser/controller/textAreaHandler":["\xE9diteur","L'\xE9diteur n'est pas accessible pour le moment. Appuyez sur {0} pour voir les options."],"vs/editor/browser/core/keybindingCancellation":["Indique si l'\xE9diteur ex\xE9cute une op\xE9ration annulable, par exemple 'Avoir un aper\xE7u des r\xE9f\xE9rences'"],"vs/editor/browser/editorExtensions":["Ann&&uler","Annuler","&&R\xE9tablir","R\xE9tablir","&&S\xE9lectionner tout","Tout s\xE9lectionner"],"vs/editor/browser/widget/codeEditorWidget":["Le nombre de curseurs a \xE9t\xE9 limit\xE9 \xE0\xA0{0}."],"vs/editor/browser/widget/diffEditorWidget":["\xC9l\xE9ment d\xE9coratif de ligne pour les insertions dans l'\xE9diteur de diff\xE9rences.","\xC9l\xE9ment d\xE9coratif de ligne pour les suppressions dans l'\xE9diteur de diff\xE9rences.","Impossible de comparer les fichiers car l'un d'eux est trop volumineux."],"vs/editor/browser/widget/diffReview":["Ic\xF4ne de l'option Ins\xE9rer dans la revue des diff\xE9rences.","Ic\xF4ne de l'option Supprimer dans la revue des diff\xE9rences.","Ic\xF4ne de l'option Fermer dans la revue des diff\xE9rences.","Fermer","aucune ligne chang\xE9e","1\xA0ligne chang\xE9e","{0}\xA0lignes chang\xE9es","Diff\xE9rence\xA0{0} sur\xA0{1}\xA0: ligne d'origine {2}, {3}, ligne modifi\xE9e {4}, {5}","vide","{0} ligne inchang\xE9e {1}","{0}\xA0ligne d'origine {1}\xA0ligne modifi\xE9e {2}","+ {0}\xA0ligne modifi\xE9e {1}","- {0} ligne d'origine {1}","Acc\xE9der \xE0 la diff\xE9rence suivante","Acc\xE9der la diff\xE9rence pr\xE9c\xE9dente"],"vs/editor/browser/widget/inlineDiffMargin":["Copier les lignes supprim\xE9es","Copier la ligne supprim\xE9e","Copier la ligne supprim\xE9e ({0})","Annuler la modification","Copier la ligne supprim\xE9e ({0})"],"vs/editor/common/config/commonEditorConfig":["\xC9diteur","Le nombre d'espaces auxquels une tabulation est \xE9gale. Ce param\xE8tre est substitu\xE9 bas\xE9 sur le contenu du fichier lorsque `#editor.detectIndentation#` est \xE0 'on'.","Espaces ins\xE9r\xE9s quand vous appuyez sur la touche Tab. Ce param\xE8tre est remplac\xE9 en fonction du contenu du fichier quand '#editor.detectIndentation#' est activ\xE9.","Contr\xF4le si '#editor.tabSize#' et '#editor.insertSpaces#' sont automatiquement d\xE9tect\xE9s lors de l\u2019ouverture d\u2019un fichier en fonction de son contenu.","Supprimer l'espace blanc de fin ins\xE9r\xE9 automatiquement.","Traitement sp\xE9cial des fichiers volumineux pour d\xE9sactiver certaines fonctionnalit\xE9s utilisant beaucoup de m\xE9moire.","Contr\xF4le si la saisie semi-automatique doit \xEAtre calcul\xE9e en fonction des mots pr\xE9sents dans le document.","Sugg\xE8re uniquement des mots dans le document actif.","Sugg\xE8re des mots dans tous les documents ouverts du m\xEAme langage.","Sugg\xE8re des mots dans tous les documents ouverts.","Contr\xF4le la fa\xE7on dont sont calcul\xE9es les compl\xE9tions bas\xE9es sur des mots dans les documents.","Coloration s\xE9mantique activ\xE9e pour tous les th\xE8mes de couleur.","Coloration s\xE9mantique d\xE9sactiv\xE9e pour tous les th\xE8mes de couleur.","La coloration s\xE9mantique est configur\xE9e par le param\xE8tre 'semanticHighlighting' du th\xE8me de couleur actuel.","Contr\xF4le si semanticHighlighting est affich\xE9 pour les langages qui le prennent en charge.","Garder les \xE9diteurs d'aper\xE7u ouverts m\xEAme si l'utilisateur double-clique sur son contenu ou appuie sur la touche \xC9chap. ","Les lignes plus longues que cette valeur ne sont pas tokenis\xE9es pour des raisons de performances","D\xE9lai d'expiration en millisecondes avant annulation du calcul de diff. Utilisez\xA00 pour supprimer le d\xE9lai d'expiration.","Contr\xF4le si l'\xE9diteur de diff\xE9rences affiche les diff\xE9rences en mode c\xF4te \xE0 c\xF4te ou inline.","Quand il est activ\xE9, l'\xE9diteur de diff\xE9rences ignore les changements d'espace blanc de d\xE9but ou de fin.","Contr\xF4le si l'\xE9diteur de diff\xE9rences affiche les indicateurs +/- pour les changements ajout\xE9s/supprim\xE9s .","Contr\xF4le si l'\xE9diteur affiche CodeLens.","Le retour automatique \xE0 la ligne n'est jamais effectu\xE9.","Le retour automatique \xE0 la ligne s'effectue en fonction de la largeur de la fen\xEAtre d'affichage.","Le retour automatique \xE0 la ligne d\xE9pend du param\xE8tre '#editor.wordWrap#'."],"vs/editor/common/config/editorOptions":["L'\xE9diteur utilise les API de la plateforme pour d\xE9tecter si un lecteur d'\xE9cran est attach\xE9.","L'\xE9diteur est optimis\xE9 en permanence pour les lecteurs d'\xE9cran. Le retour automatique \xE0 la ligne est d\xE9sactiv\xE9.","L'\xE9diteur n'est jamais optimis\xE9 pour une utilisation avec un lecteur d'\xE9cran.","Contr\xF4le si l'\xE9diteur doit s'ex\xE9cuter dans un mode optimis\xE9 pour les lecteurs d'\xE9cran. Si la valeur est on, le retour automatique \xE0 la ligne est d\xE9sactiv\xE9.","Contr\xF4le si un espace est ins\xE9r\xE9 pour les commentaires.","Contr\xF4le si les lignes vides doivent \xEAtre ignor\xE9es avec des actions d'activation/de d\xE9sactivation, d'ajout ou de suppression des commentaires de ligne.","Contr\xF4le si la copie sans s\xE9lection permet de copier la ligne actuelle.","Contr\xF4le si le curseur doit sauter pour rechercher les correspondances lors de la saisie.","D\xE9termine si la cha\xEEne de recherche dans le Widget Recherche est initialis\xE9e avec la s\xE9lection de l\u2019\xE9diteur.","Ne jamais activer Rechercher automatiquement dans la s\xE9lection (par d\xE9faut)","Toujours activer Rechercher automatiquement dans la s\xE9lection","Activez Rechercher automatiquement dans la s\xE9lection quand plusieurs lignes de contenu sont s\xE9lectionn\xE9es.","Contr\xF4le la condition d'activation automatique de la recherche dans la s\xE9lection.","D\xE9termine si le Widget Recherche devrait lire ou modifier le presse-papiers de recherche partag\xE9 sur macOS.","Contr\xF4le si le widget Recherche doit ajouter des lignes suppl\xE9mentaires en haut de l'\xE9diteur. Quand la valeur est true, vous pouvez faire d\xE9filer au-del\xE0 de la premi\xE8re ligne si le widget Recherche est visible.","Contr\xF4le si la recherche red\xE9marre automatiquement depuis le d\xE9but (ou la fin) quand il n'existe aucune autre correspondance.","Active/d\xE9sactive les ligatures de police (fonctionnalit\xE9s de police 'calt' et 'liga'). Remplacez ceci par une cha\xEEne pour contr\xF4ler de mani\xE8re pr\xE9cise la propri\xE9t\xE9 CSS 'font-feature-settings'.","Propri\xE9t\xE9 CSS 'font-feature-settings' explicite. Vous pouvez passer une valeur bool\xE9enne \xE0 la place si vous devez uniquement activer/d\xE9sactiver les ligatures.","Configure les ligatures de police ou les fonctionnalit\xE9s de police. Il peut s'agir d'une valeur bool\xE9enne permettant d'activer/de d\xE9sactiver les ligatures, ou d'une cha\xEEne correspondant \xE0 la valeur de la propri\xE9t\xE9 CSS 'font-feature-settings'.","Contr\xF4le la taille de police en pixels.",'Seuls les mots cl\xE9s "normal" et "bold", ou les nombres compris entre\xA01 et\xA01\xA0000 sont autoris\xE9s.',`Contr\xF4le l'\xE9paisseur de police. Accepte les mots cl\xE9s "normal" et "bold", ou les nombres compris entre\xA01 et\xA01\xA0000.`,"Montrer l'aper\xE7u des r\xE9sultats (par d\xE9faut)","Acc\xE9der au r\xE9sultat principal et montrer un aper\xE7u","Acc\xE9der au r\xE9sultat principal et activer l'acc\xE8s sans aper\xE7u pour les autres","Ce param\xE8tre est d\xE9pr\xE9ci\xE9, utilisez des param\xE8tres distincts comme 'editor.editor.gotoLocation.multipleDefinitions' ou 'editor.editor.gotoLocation.multipleImplementations' \xE0 la place.","Contr\xF4le le comportement de la commande 'Atteindre la d\xE9finition' quand plusieurs emplacements cibles existent.","Contr\xF4le le comportement de la commande 'Atteindre la d\xE9finition de type' quand plusieurs emplacements cibles existent.","Contr\xF4le le comportement de la commande 'Atteindre la d\xE9claration' quand plusieurs emplacements cibles existent.","Contr\xF4le le comportement de la commande 'Atteindre les impl\xE9mentations' quand plusieurs emplacements cibles existent.","Contr\xF4le le comportement de la commande 'Atteindre les r\xE9f\xE9rences' quand plusieurs emplacements cibles existent.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre la d\xE9finition' est l'emplacement actuel.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre la d\xE9finition de type' est l'emplacement actuel.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre la d\xE9claration' est l'emplacement actuel.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre l'impl\xE9mentation' est l'emplacement actuel.","ID de commande alternatif ex\xE9cut\xE9 quand le r\xE9sultat de 'Atteindre la r\xE9f\xE9rence' est l'emplacement actuel.","Contr\xF4le si le pointage est affich\xE9.","Contr\xF4le le d\xE9lai en millisecondes, apr\xE8s lequel le survol est affich\xE9.","Contr\xF4le si le pointage doit rester visible quand la souris est d\xE9plac\xE9e au-dessus.","Active l\u2019ampoule d\u2019action de code dans l\u2019\xE9diteur.","Active les indicateurs inline dans l'\xE9diteur.","Contr\xF4le la taille de police des indicateurs inline dans l'\xE9diteur. Quand la valeur est '0', 90\xA0% de '#editor.fontSize#' est utilis\xE9.","Contr\xF4le la famille de polices des indicateurs inline dans l'\xE9diteur.","Contr\xF4le la hauteur de ligne. Utilisez 0 pour calculer la hauteur de ligne de la taille de la police.","Contr\xF4le si la minimap est affich\xE9e.","Le minimap a la m\xEAme taille que le contenu de l'\xE9diteur (d\xE9filement possible).","Le minimap s'agrandit ou se r\xE9duit selon les besoins pour remplir la hauteur de l'\xE9diteur (pas de d\xE9filement).","Le minimap est r\xE9duit si n\xE9cessaire pour ne jamais d\xE9passer la taille de l'\xE9diteur (pas de d\xE9filement).","Contr\xF4le la taille du minimap.","Contr\xF4le le c\xF4t\xE9 o\xF9 afficher la minimap.","Contr\xF4le quand afficher le curseur du minimap.","\xC9chelle du contenu dessin\xE9 dans le minimap\xA0: 1, 2\xA0ou\xA03.","Afficher les caract\xE8res r\xE9els sur une ligne par opposition aux blocs de couleur.","Limiter la largeur de la minimap pour afficher au plus un certain nombre de colonnes.","Contr\xF4le la quantit\xE9 d\u2019espace entre le bord sup\xE9rieur de l\u2019\xE9diteur et la premi\xE8re ligne.","Contr\xF4le la quantit\xE9 d'espace entre le bord inf\xE9rieur de l'\xE9diteur et la derni\xE8re ligne.","Active une fen\xEAtre contextuelle qui affiche de la documentation sur les param\xE8tres et des informations sur les types \xE0 mesure que vous tapez.","D\xE9termine si le menu de suggestions de param\xE8tres se ferme ou reviens au d\xE9but lorsque la fin de la liste est atteinte.","Activez les suggestions rapides dans les cha\xEEnes.","Activez les suggestions rapides dans les commentaires.","Activez les suggestions rapides en dehors des cha\xEEnes et des commentaires.","Contr\xF4le si les suggestions doivent appara\xEEtre automatiquement pendant la saisie.","Les num\xE9ros de ligne ne sont pas affich\xE9s.","Les num\xE9ros de ligne sont affich\xE9s en nombre absolu.","Les num\xE9ros de ligne sont affich\xE9s sous la forme de distance en lignes \xE0 la position du curseur.","Les num\xE9ros de ligne sont affich\xE9s toutes les 10 lignes.","Contr\xF4le l'affichage des num\xE9ros de ligne.","Nombre de caract\xE8res monospace auxquels cette r\xE8gle d'\xE9diteur effectue le rendu.","Couleur de cette r\xE8gle d'\xE9diteur.","Rendre les r\xE8gles verticales apr\xE8s un certain nombre de caract\xE8res \xE0 espacement fixe. Utiliser plusieurs valeurs pour plusieurs r\xE8gles. Aucune r\xE8gle n'est dessin\xE9e si le tableau est vide.","Ins\xE9rez une suggestion sans remplacer le texte \xE0 droite du curseur.","Ins\xE9rez une suggestion et remplacez le texte \xE0 droite du curseur.","Contr\xF4le si les mots sont remplac\xE9s en cas d'acceptation de la saisie semi-automatique. Notez que cela d\xE9pend des extensions adh\xE9rant \xE0 cette fonctionnalit\xE9.","D\xE9termine si le filtre et le tri des suggestions doivent prendre en compte les fautes de frappes mineures.","Contr\xF4le si le tri favorise trier les mots qui apparaissent pr\xE8s du curseur.","Contr\xF4le si les s\xE9lections de suggestion m\xE9moris\xE9es sont partag\xE9es entre plusieurs espaces de travail et fen\xEAtres (n\xE9cessite '#editor.suggestSelection#').","Contr\xF4le si un extrait de code actif emp\xEAche les suggestions rapides.","Contr\xF4le s'il faut montrer ou masquer les ic\xF4nes dans les suggestions.","Contr\xF4le la visibilit\xE9 de la barre d'\xE9tat en bas du widget de suggestion.","D\xE9termine si les d\xE9tails du widget de suggestion sont inclus dans l'\xE9tiquette ou uniquement dans le widget de d\xE9tails","Ce param\xE8tre est d\xE9pr\xE9ci\xE9. Le widget de suggestion peut d\xE9sormais \xEAtre redimensionn\xE9.","Ce param\xE8tre est d\xE9pr\xE9ci\xE9, veuillez utiliser des param\xE8tres distincts comme 'editor.suggest.showKeywords' ou 'editor.suggest.showSnippets' \xE0 la place.","Si activ\xE9, IntelliSense montre des suggestions de type 'method'.","Si activ\xE9, IntelliSense montre des suggestions de type 'function'.","Si activ\xE9, IntelliSense montre des suggestions de type 'constructor'.","Si activ\xE9, IntelliSense montre des suggestions de type 'field'.","Si activ\xE9, IntelliSense montre des suggestions de type 'variable'.","Si activ\xE9, IntelliSense montre des suggestions de type 'class'.","Si activ\xE9, IntelliSense montre des suggestions de type 'struct'.","Si activ\xE9, IntelliSense montre des suggestions de type 'interface'.","Si activ\xE9, IntelliSense montre des suggestions de type 'module'.","Si activ\xE9, IntelliSense montre des suggestions de type 'property'.","Si activ\xE9, IntelliSense montre des suggestions de type 'event'.","Si activ\xE9, IntelliSense montre des suggestions de type 'operator'.","Si activ\xE9, IntelliSense montre des suggestions de type 'unit'.","Si activ\xE9, IntelliSense montre des suggestions de type 'value'.","Si activ\xE9, IntelliSense montre des suggestions de type 'constant'.","Si activ\xE9, IntelliSense montre des suggestions de type 'enum'.","Si activ\xE9, IntelliSense montre des suggestions de type 'enumMember'.","Si activ\xE9, IntelliSense montre des suggestions de type 'keyword'.","Si activ\xE9, IntelliSense montre des suggestions de type 'text'.","Si activ\xE9, IntelliSense montre des suggestions de type 'color'.","Si activ\xE9, IntelliSense montre des suggestions de type 'file'.","Si activ\xE9, IntelliSense montre des suggestions de type 'reference'.","Si activ\xE9, IntelliSense montre des suggestions de type 'customcolor'.","Si activ\xE9, IntelliSense montre des suggestions de type 'folder'.","Si activ\xE9, IntelliSense montre des suggestions de type 'typeParameter'.","Si activ\xE9, IntelliSense montre des suggestions de type 'snippet'.","Si activ\xE9, IntelliSense montre des suggestions de type 'utilisateur'.","Si activ\xE9, IntelliSense montre des suggestions de type 'probl\xE8mes'.","Indique si les espaces blancs de d\xE9but et de fin doivent toujours \xEAtre s\xE9lectionn\xE9s.","Contr\xF4le si les suggestions doivent \xEAtre accept\xE9es sur les caract\xE8res de validation. Par exemple, en JavaScript, le point-virgule (`;`) peut \xEAtre un caract\xE8re de validation qui accepte une suggestion et tape ce caract\xE8re.","Accepter uniquement une suggestion avec 'Entr\xE9e' quand elle effectue une modification textuelle.","Contr\xF4le si les suggestions sont accept\xE9es apr\xE8s appui sur 'Entr\xE9e', en plus de 'Tab'. Permet d\u2019\xE9viter toute ambigu\xEFt\xE9 entre l\u2019insertion de nouvelles lignes et l'acceptation de suggestions.","Contr\xF4le le nombre de lignes dans l'\xE9diteur qui peuvent \xEAtre lues par un lecteur d'\xE9cran. Avertissement : Ce param\xE8tre a une incidence sur les performances quand le nombre est sup\xE9rieur \xE0 la valeur par d\xE9faut.","Contenu de l'\xE9diteur","Utilisez les configurations de langage pour d\xE9terminer quand fermer automatiquement les parenth\xE8ses.","Fermer automatiquement les parenth\xE8ses uniquement lorsque le curseur est \xE0 gauche de l\u2019espace.","Contr\xF4le si l\u2019\xE9diteur doit fermer automatiquement les parenth\xE8ses quand l\u2019utilisateur ajoute une parenth\xE8se ouvrante.","Tapez avant les guillemets ou les crochets fermants uniquement s'ils sont automatiquement ins\xE9r\xE9s.","Contr\xF4le si l'\xE9diteur doit taper avant les guillemets ou crochets fermants.","Utilisez les configurations de langage pour d\xE9terminer quand fermer automatiquement les guillemets.","Fermer automatiquement les guillemets uniquement lorsque le curseur est \xE0 gauche de l\u2019espace.","Contr\xF4le si l\u2019\xE9diteur doit fermer automatiquement les guillemets apr\xE8s que l\u2019utilisateur ajoute un guillemet ouvrant.","L'\xE9diteur n'ins\xE8re pas de retrait automatiquement.","L'\xE9diteur conserve le retrait de la ligne actuelle.","L'\xE9diteur conserve le retrait de la ligne actuelle et honore les crochets d\xE9finis par le langage.","L'\xE9diteur conserve le retrait de la ligne actuelle, honore les crochets d\xE9finis par le langage et appelle des objets onEnterRules sp\xE9ciaux d\xE9finis par les langages.","L'\xE9diteur conserve le retrait de la ligne actuelle, honore les crochets d\xE9finis par le langage, appelle des objets onEnterRules sp\xE9ciaux d\xE9finis par les langages et honore les objets indentationRules d\xE9finis par les langages.","Contr\xF4le si l'\xE9diteur doit ajuster automatiquement le retrait quand les utilisateurs tapent, collent, d\xE9placent ou mettent en retrait des lignes.","Utilisez les configurations de langue pour d\xE9terminer quand entourer automatiquement les s\xE9lections.","Entourez avec des guillemets et non des crochets.","Entourez avec des crochets et non des guillemets.","Contr\xF4le si l'\xE9diteur doit automatiquement entourer les s\xE9lections quand l'utilisateur tape des guillemets ou des crochets.","\xC9mule le comportement des tabulations pour la s\xE9lection quand des espaces sont utilis\xE9s \xE0 des fins de mise en retrait. La s\xE9lection respecte les taquets de tabulation.","Contr\xF4le si l'\xE9diteur affiche CodeLens.","Contr\xF4le la famille de polices pour CodeLens.","Contr\xF4le la taille de police en pixels pour CodeLens. Quand la valeur est '0', 90\xA0% de '#editor.fontSize#' est utilis\xE9.","Contr\xF4le si l'\xE9diteur doit afficher les \xE9l\xE9ments d\xE9coratifs de couleurs inline et le s\xE9lecteur de couleurs.","Autoriser l'utilisation de la souris et des touches pour s\xE9lectionner des colonnes.","Contr\xF4le si la coloration syntaxique doit \xEAtre copi\xE9e dans le presse-papiers.","Contr\xF4ler le style d\u2019animation du curseur.","Contr\xF4le si l'animation du point d'insertion doit \xEAtre activ\xE9e.","Contr\xF4le le style du curseur.","Contr\xF4le le nombre minimal de lignes de d\xE9but et de fin visibles autour du curseur. \xC9galement appel\xE9 'scrollOff' ou 'scrollOffset' dans d'autres \xE9diteurs.","'cursorSurroundingLines' est appliqu\xE9 seulement s'il est d\xE9clench\xE9 via le clavier ou une API.","'cursorSurroundingLines' est toujours appliqu\xE9.","Contr\xF4le quand 'cursorSurroundingLines' doit \xEAtre appliqu\xE9.","D\xE9termine la largeur du curseur lorsque `#editor.cursorStyle#` est \xE0 `line`.","Contr\xF4le si l\u2019\xE9diteur autorise le d\xE9placement de s\xE9lections par glisser-d\xE9placer.","Multiplicateur de vitesse de d\xE9filement quand vous appuyez sur 'Alt'.","Contr\xF4le si l'\xE9diteur a le pliage de code activ\xE9.","Utilisez une strat\xE9gie de pliage propre \xE0 la langue, si disponible, sinon utilisez la strat\xE9gie bas\xE9e sur le retrait.","Utilisez la strat\xE9gie de pliage bas\xE9e sur le retrait.","Contr\xF4le la strat\xE9gie de calcul des plages de pliage.","Contr\xF4le si l'\xE9diteur doit mettre en \xE9vidence les plages pli\xE9es.","Contr\xF4le si le fait de cliquer sur le contenu vide apr\xE8s une ligne pli\xE9e d\xE9plie la ligne.","Contr\xF4le la famille de polices.","D\xE9termine si l\u2019\xE9diteur doit automatiquement mettre en forme le contenu coll\xE9. Un formateur doit \xEAtre disponible et \xEAtre capable de mettre en forme une plage dans un document.","Contr\xF4le si l\u2019\xE9diteur doit mettre automatiquement en forme la ligne apr\xE8s la saisie.","Contr\xF4le si l'\xE9diteur doit afficher la marge de glyphes verticale. La marge de glyphes sert principalement au d\xE9bogage.","Contr\xF4le si le curseur doit \xEAtre masqu\xE9 dans la r\xE8gle de la vue d\u2019ensemble.","Contr\xF4le si l\u2019\xE9diteur doit mettre en surbrillance le guide de mise en retrait actif.","Contr\xF4le l'espacement des lettres en pixels.","Contr\xF4le si la modification li\xE9e est activ\xE9e dans l'\xE9diteur. En fonction du langage, les symboles associ\xE9s, par exemple les balises HTML, sont mis \xE0 jour durant le processus de modification.","Contr\xF4le si l\u2019\xE9diteur doit d\xE9tecter les liens et les rendre cliquables.","Mettez en surbrillance les crochets correspondants.","Un multiplicateur \xE0 utiliser sur les `deltaX` et `deltaY` des \xE9v\xE9nements de d\xE9filement de roulette de souris.","Faire un zoom sur la police de l'\xE9diteur quand l'utilisateur fait tourner la roulette de la souris tout en maintenant la touche 'Ctrl' enfonc\xE9e.","Fusionnez plusieurs curseurs quand ils se chevauchent.","Mappe vers 'Contr\xF4le' dans Windows et Linux, et vers 'Commande' dans macOS.","Mappe vers 'Alt' dans Windows et Linux, et vers 'Option' dans macOS.","Le modificateur \xE0 utiliser pour ajouter plusieurs curseurs avec la souris. Les gestes de souris Atteindre la d\xE9finition et Ouvrir le lien s'adapteront tels qu\u2019ils n\u2019entrent pas en conflit avec le modificateur multicursor. [Lire la suite] (https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","Chaque curseur colle une seule ligne de texte.","Chaque curseur colle le texte en entier.","Contr\xF4le le collage quand le nombre de lignes du texte coll\xE9 correspond au nombre de curseurs.","Contr\xF4le si l'\xE9diteur doit mettre en surbrillance les occurrences de symboles s\xE9mantiques.","Contr\xF4le si une bordure doit \xEAtre dessin\xE9e autour de la r\xE8gle de la vue d'ensemble.","Focus sur l'arborescence \xE0 l'ouverture de l'aper\xE7u","Placer le focus sur l'\xE9diteur \xE0 l'ouverture de l'aper\xE7u","Contr\xF4le s'il faut mettre le focus sur l'\xE9diteur inline ou sur l'arborescence dans le widget d'aper\xE7u.","Contr\xF4le si le geste de souris Acc\xE9der \xE0 la d\xE9finition ouvre toujours le widget d'aper\xE7u.","Contr\xF4le le d\xE9lai en millisecondes apr\xE8s lequel des suggestions rapides sont affich\xE9es.","Contr\xF4le si l'\xE9diteur renomme automatiquement selon le type.","D\xE9pr\xE9ci\xE9. Utilisez 'editor.linkedEditing' \xE0 la place.","Contr\xF4le si l\u2019\xE9diteur doit afficher les caract\xE8res de contr\xF4le.","Contr\xF4le si l\u2019\xE9diteur doit afficher les guides de mise en retrait.","Affichez le dernier num\xE9ro de ligne quand le fichier se termine par un saut de ligne.","Met en surbrillance la goutti\xE8re et la ligne actuelle.","Contr\xF4le la fa\xE7on dont l\u2019\xE9diteur doit afficher la mise en surbrillance de la ligne actuelle.","Contr\xF4le si l'\xE9diteur doit afficher la mise en surbrillance de la ligne actuelle seulement quand l'\xE9diteur a le focus","Affiche les espaces blancs \xE0 l'exception des espaces uniques entre les mots.","Afficher les espaces blancs uniquement sur le texte s\xE9lectionn\xE9.","Afficher uniquement les caract\xE8res correspondant aux espaces blancs de fin","Contr\xF4le la fa\xE7on dont l\u2019\xE9diteur doit restituer les caract\xE8res espaces.","Contr\xF4le si les s\xE9lections doivent avoir des angles arrondis.","Contr\xF4le le nombre de caract\xE8res suppl\xE9mentaires, au-del\xE0 duquel l\u2019\xE9diteur d\xE9file horizontalement.","Contr\xF4le si l\u2019\xE9diteur d\xE9file au-del\xE0 de la derni\xE8re ligne.","Faites d\xE9filer uniquement le long de l'axe pr\xE9dominant quand le d\xE9filement est \xE0 la fois vertical et horizontal. Emp\xEAche la d\xE9rive horizontale en cas de d\xE9filement vertical sur un pav\xE9 tactile.","Contr\xF4le si le presse-papiers principal Linux doit \xEAtre pris en charge.","Contr\xF4le si l'\xE9diteur doit mettre en surbrillance les correspondances similaires \xE0 la s\xE9lection.","Affichez toujours les contr\xF4les de pliage.","Affichez uniquement les contr\xF4les de pliage quand la souris est au-dessus de la reliure.","Contr\xF4le quand afficher les contr\xF4les de pliage sur la reliure.","Contr\xF4le la disparition du code inutile.","Contr\xF4le les variables d\xE9pr\xE9ci\xE9es barr\xE9es.","Afficher des suggestions d\u2019extraits au-dessus d\u2019autres suggestions.","Afficher des suggestions d\u2019extraits en-dessous d\u2019autres suggestions.","Afficher des suggestions d\u2019extraits avec d\u2019autres suggestions.","Ne pas afficher de suggestions d\u2019extrait de code.","Contr\xF4le si les extraits de code s'affichent en m\xEAme temps que d'autres suggestions, ainsi que leur mode de tri.","Contr\xF4le si l'\xE9diteur d\xE9file en utilisant une animation.","Taille de la police pour le widget de suggestion. Lorsque la valeur est \xE0 `0`, la valeur de `#editor.fontSize` est utilis\xE9e.","Hauteur de ligne du widget de suggestion. Quand la valeur est '0', la valeur de '#editor.lineHeight#' est utilis\xE9e. La valeur minimale est\xA08.","Contr\xF4le si les suggestions devraient automatiquement s\u2019afficher lorsque vous tapez les caract\xE8res de d\xE9clencheur.","S\xE9lectionnez toujours la premi\xE8re suggestion.","S\xE9lectionnez les suggestions r\xE9centes sauf si une entr\xE9e ult\xE9rieure en a s\xE9lectionn\xE9 une, par ex., 'console.| -> console.log', car 'log' a \xE9t\xE9 effectu\xE9 r\xE9cemment.","S\xE9lectionnez des suggestions en fonction des pr\xE9fixes pr\xE9c\xE9dents qui ont compl\xE9t\xE9 ces suggestions, par ex., 'co -> console' et 'con -> const'.","Contr\xF4le comment les suggestions sont pr\xE9-s\xE9lectionn\xE9s lors de l\u2019affichage de la liste de suggestion.","La compl\xE9tion par tabulation ins\xE9rera la meilleure suggestion lorsque vous appuyez sur tab.","D\xE9sactiver les compl\xE9tions par tabulation.","Compl\xE9ter les extraits de code par tabulation lorsque leur pr\xE9fixe correspond. Fonctionne mieux quand les 'quickSuggestions' ne sont pas activ\xE9es.","Active les compl\xE9tions par tabulation","Les marques de fin de ligne inhabituelles sont automatiquement supprim\xE9es.","Les marques de fin de ligne inhabituelles sont ignor\xE9es.","Les marques de fin de ligne inhabituelles demandent \xE0 \xEAtre supprim\xE9es.","Supprimez les marques de fin de ligne inhabituelles susceptibles de causer des probl\xE8mes.","L'insertion et la suppression des espaces blancs suit les taquets de tabulation.","Caract\xE8res utilis\xE9s comme s\xE9parateurs de mots durant la navigation ou les op\xE9rations bas\xE9es sur les mots","Le retour automatique \xE0 la ligne n'est jamais effectu\xE9.","Le retour automatique \xE0 la ligne s'effectue en fonction de la largeur de la fen\xEAtre d'affichage.","Les lignes seront termin\xE9es \xE0 `#editor.wordWrapColumn#`.","Les lignes seront termin\xE9es au minimum du viewport et `#editor.wordWrapColumn#`.","Contr\xF4le comment les lignes doivent \xEAtre limit\xE9es.","Contr\xF4le la colonne de terminaison de l\u2019\xE9diteur lorsque `#editor.wordWrap#` est \xE0 `wordWrapColumn` ou `bounded`.","Aucune mise en retrait. Les lignes envelopp\xE9es commencent \xE0 la colonne 1.","Les lignes envelopp\xE9es obtiennent la m\xEAme mise en retrait que le parent.","Les lignes justifi\xE9es obtiennent une mise en retrait +1 vers le parent.","Les lignes justifi\xE9es obtiennent une mise en retrait +2 vers le parent. ","Contr\xF4le la mise en retrait des lignes justifi\xE9es.","Suppose que tous les caract\xE8res ont la m\xEAme largeur. Il s'agit d'un algorithme rapide qui fonctionne correctement pour les polices \xE0 espacement fixe et certains scripts (comme les caract\xE8res latins) o\xF9 les glyphes ont la m\xEAme largeur.","D\xE9l\xE8gue le calcul des points de wrapping au navigateur. Il s'agit d'un algorithme lent qui peut provoquer le gel des grands fichiers, mais qui fonctionne correctement dans tous les cas.","Contr\xF4le l'algorithme qui calcule les points de wrapping."],"vs/editor/common/editorContextKeys":["Indique si le texte de l'\xE9diteur a le focus (le curseur clignote)","Indique si l'\xE9diteur ou un widget de l'\xE9diteur a le focus (par exemple, le focus se trouve sur le widget de recherche)","Indique si un \xE9diteur ou une entr\xE9e de texte mis en forme a le focus (le curseur clignote)","Indique si l'\xE9diteur est en lecture seule","Indique si le contexte est celui d'un \xE9diteur de diff\xE9rences","Indique si 'editor.columnSelection' est activ\xE9","Indique si du texte est s\xE9lectionn\xE9 dans l'\xE9diteur","Indique si l'\xE9diteur a plusieurs s\xE9lections","Indique si la touche Tab permet de d\xE9placer le focus hors de l'\xE9diteur","Indique si le pointage de l'\xE9diteur est visible","Indique si l'\xE9diteur fait partie d'un \xE9diteur plus important (par exemple Notebooks)","Identificateur de langage de l'\xE9diteur","Indique si l'\xE9diteur a un fournisseur d'\xE9l\xE9ments de compl\xE9tion","Indique si l'\xE9diteur a un fournisseur d'actions de code","Indique si l'\xE9diteur a un fournisseur d'informations CodeLens","Indique si l'\xE9diteur a un fournisseur de d\xE9finitions","Indique si l'\xE9diteur a un fournisseur de d\xE9clarations","Indique si l'\xE9diteur a un fournisseur d'impl\xE9mentation","Indique si l'\xE9diteur a un fournisseur de d\xE9finitions de type","Indique si l'\xE9diteur a un fournisseur de pointage","Indique si l'\xE9diteur a un fournisseur de mise en surbrillance pour les documents","Indique si l'\xE9diteur a un fournisseur de symboles pour les documents","Indique si l'\xE9diteur a un fournisseur de r\xE9f\xE9rence","Indique si l'\xE9diteur a un fournisseur de renommage","Indique si l'\xE9diteur a un fournisseur d'aide sur les signatures","Indique si l'\xE9diteur a un fournisseur d'indicateurs inline","Indique si l'\xE9diteur a un fournisseur de mise en forme pour les documents","Indique si l'\xE9diteur a un fournisseur de mise en forme de s\xE9lection pour les documents","Indique si l'\xE9diteur a plusieurs fournisseurs de mise en forme pour les documents","Indique si l'\xE9diteur a plusieurs fournisseurs de mise en forme de s\xE9lection pour les documents"],"vs/editor/common/model/editStack":["Frappe en cours"],"vs/editor/common/modes/modesRegistry":["Texte brut"],"vs/editor/common/standaloneStrings":["Aucune s\xE9lection","Ligne {0}, colonne {1} ({2} s\xE9lectionn\xE9)","Ligne {0}, colonne {1}","{0} s\xE9lections ({1} caract\xE8res s\xE9lectionn\xE9s)","{0} s\xE9lections","Remplacement du param\xE8tre 'accessibilitySupport' par 'on'.","Ouverture de la page de documentation sur l'accessibilit\xE9 de l'\xE9diteur.","dans un volet en lecture seule d'un \xE9diteur de diff\xE9rences.","dans un volet d'un \xE9diteur de diff\xE9rences."," dans un \xE9diteur de code en lecture seule"," dans un \xE9diteur de code","Pour configurer l'\xE9diteur de mani\xE8re \xE0 \xEAtre optimis\xE9 en cas d'utilisation d'un lecteur d'\xE9cran, appuyez sur Commande+E maintenant.","Pour configurer l'\xE9diteur de mani\xE8re \xE0 \xEAtre optimis\xE9 en cas d'utilisation d'un lecteur d'\xE9cran, appuyez sur Contr\xF4le+E maintenant.","L'\xE9diteur est configur\xE9 pour \xEAtre optimis\xE9 en cas d'utilisation avec un lecteur d'\xE9cran.","L'\xE9diteur est configur\xE9 pour ne jamais \xEAtre optimis\xE9 en cas d'utilisation avec un lecteur d'\xE9cran, ce qui n'est pas le cas pour le moment.","Appuyez sur Tab dans l'\xE9diteur pour d\xE9placer le focus vers le prochain \xE9l\xE9ment pouvant \xEAtre d\xE9sign\xE9 comme \xE9l\xE9ment actif. Activez ou d\xE9sactivez ce comportement en appuyant sur {0}.","Appuyez sur Tab dans l'\xE9diteur pour d\xE9placer le focus vers le prochain \xE9l\xE9ment pouvant \xEAtre d\xE9sign\xE9 comme \xE9l\xE9ment actif. La commande {0} ne peut pas \xEAtre d\xE9clench\xE9e par une combinaison de touches.","Appuyez sur Tab dans l'\xE9diteur pour ins\xE9rer le caract\xE8re de tabulation. Activez ou d\xE9sactivez ce comportement en appuyant sur {0}.","Appuyez sur Tab dans l'\xE9diteur pour ins\xE9rer le caract\xE8re de tabulation. La commande {0} ne peut pas \xEAtre d\xE9clench\xE9e par une combinaison de touches.","Appuyez sur Commande+H maintenant pour ouvrir une fen\xEAtre de navigateur avec plus d'informations sur l'accessibilit\xE9 de l'\xE9diteur.","Appuyez sur Contr\xF4le+H maintenant pour ouvrir une fen\xEAtre de navigateur avec plus d'informations sur l'accessibilit\xE9 de l'\xE9diteur.","Vous pouvez masquer cette info-bulle et revenir \xE0 l'\xE9diteur en appuyant sur \xC9chap ou Maj+\xC9chap.","Afficher l'aide sur l'accessibilit\xE9","D\xE9veloppeur\xA0: Inspecter les jetons","Acc\xE9der \xE0 la ligne/colonne...","Afficher tous les fournisseurs d'acc\xE8s rapide","Palette de commandes","Commandes d'affichage et d'ex\xE9cution","Acc\xE9der au symbole...","Acc\xE9der au symbole par cat\xE9gorie...","Contenu de l'\xE9diteur","Appuyez sur Alt+F1 pour voir les options d'accessibilit\xE9.","Activer/d\xE9sactiver le th\xE8me \xE0 contraste \xE9lev\xE9","{0} modifications dans {1} fichiers"],"vs/editor/common/view/editorColorRegistry":["Couleur d'arri\xE8re-plan de la mise en surbrillance de la ligne \xE0 la position du curseur.","Couleur d'arri\xE8re-plan de la bordure autour de la ligne \xE0 la position du curseur.","Couleur d'arri\xE8re-plan des plages mises en surbrillance, comme par les fonctionnalit\xE9s de recherche et Quick Open. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan de la bordure autour des plages mises en surbrillance.","Couleur d'arri\xE8re-plan du symbole mis en surbrillance, comme le symbole Atteindre la d\xE9finition ou Suivant/Pr\xE9c\xE9dent. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les d\xE9corations sous-jacentes.","Couleur d'arri\xE8re-plan de la bordure autour des symboles mis en surbrillance.","Couleur du curseur de l'\xE9diteur.","La couleur de fond du curseur de l'\xE9diteur. Permet de personnaliser la couleur d'un caract\xE8re survol\xE9 par un curseur de bloc.","Couleur des espaces blancs dans l'\xE9diteur.","Couleur des rep\xE8res de retrait de l'\xE9diteur.","Couleur des guides d'indentation de l'\xE9diteur actif","Couleur des num\xE9ros de ligne de l'\xE9diteur.","Couleur des num\xE9ros de lignes actives de l'\xE9diteur","L\u2019ID est d\xE9pr\xE9ci\xE9. Utilisez \xE0 la place 'editorLineNumber.activeForeground'.","Couleur des num\xE9ros de lignes actives de l'\xE9diteur","Couleur des r\xE8gles de l'\xE9diteur","Couleur pour les indicateurs CodeLens","Couleur d'arri\xE8re-plan pour les accolades associ\xE9es","Couleur pour le contour des accolades associ\xE9es","Couleur de la bordure de la r\xE8gle d'aper\xE7u.","Couleur d'arri\xE8re-plan de la r\xE8gle d'aper\xE7u de l'\xE9diteur. Utilis\xE9e uniquement quand la minimap est activ\xE9e et plac\xE9e sur le c\xF4t\xE9 droit de l'\xE9diteur.","Couleur de fond pour la bordure de l'\xE9diteur. La bordure contient les marges pour les symboles et les num\xE9ros de ligne.","Couleur de bordure du code source inutile (non utilis\xE9) dans l'\xE9diteur.","Opacit\xE9 du code source inutile (non utilis\xE9) dans l'\xE9diteur. Par exemple, '#000000c0' affiche le code avec une opacit\xE9 de 75\xA0%. Pour les th\xE8mes \xE0 fort contraste, utilisez la couleur de th\xE8me 'editorUnnecessaryCode.border' pour souligner le code inutile au lieu d'utiliser la transparence.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour la mise en surbrillance des plages. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur du marqueur de la r\xE8gle d'aper\xE7u pour les erreurs.","Couleur du marqueur de la r\xE8gle d'aper\xE7u pour les avertissements.","Couleur du marqueur de la r\xE8gle d'aper\xE7u pour les informations."],"vs/editor/contrib/anchorSelect/anchorSelect":["Ancre de s\xE9lection","Ancre d\xE9finie sur {0}:{1}","D\xE9finir l'ancre de s\xE9lection","Atteindre l'ancre de s\xE9lection","S\xE9lectionner de l'ancre au curseur","Annuler l'ancre de s\xE9lection"],"vs/editor/contrib/bracketMatching/bracketMatching":["Couleur du marqueur de la r\xE8gle d'aper\xE7u pour rechercher des parenth\xE8ses.","Atteindre le crochet","S\xE9lectionner jusqu'au crochet","Acc\xE9der au &&crochet"],"vs/editor/contrib/caretOperations/caretOperations":["D\xE9placer le texte s\xE9lectionn\xE9 \xE0 gauche","D\xE9placer le texte s\xE9lectionn\xE9 \xE0 droite"],"vs/editor/contrib/caretOperations/transpose":["Transposer les lettres"],"vs/editor/contrib/clipboard/clipboard":["Co&&uper","Couper","Couper","&&Copier","Copier","Copier","Co&&ller","Coller","Coller","Copier avec la coloration syntaxique"],"vs/editor/contrib/codeAction/codeActionCommands":["Type d'action de code \xE0 ex\xE9cuter.","Contr\xF4le quand les actions retourn\xE9es sont appliqu\xE9es.","Appliquez toujours la premi\xE8re action de code retourn\xE9e.","Appliquez la premi\xE8re action de code retourn\xE9e si elle est la seule.","N'appliquez pas les actions de code retourn\xE9es.","Contr\xF4le si seules les actions de code par d\xE9faut doivent \xEAtre retourn\xE9es.","Une erreur inconnue s'est produite \xE0 l'application de l'action du code","Correction rapide...","Aucune action de code disponible","Aucune action de code pr\xE9f\xE9r\xE9e n'est disponible pour '{0}'","Aucune action de code disponible pour '{0}'","Aucune action de code par d\xE9faut disponible","Aucune action de code disponible","Remanier...","Aucune refactorisation par d\xE9faut disponible pour '{0}'","Aucune refactorisation disponible pour '{0}'","Aucune refactorisation par d\xE9faut disponible","Aucune refactorisation disponible","Action de la source","Aucune action source par d\xE9faut disponible pour '{0}'","Aucune action source disponible pour '{0}'","Aucune action source par d\xE9faut disponible","Aucune action n'est disponible","Organiser les importations","Aucune action organiser les imports disponible","Tout corriger","Aucune action Tout corriger disponible","Corriger automatiquement...","Aucun correctif automatique disponible"],"vs/editor/contrib/codeAction/lightBulbWidget":["Affichez les corrections. Correction pr\xE9f\xE9r\xE9e disponible ({0})","Afficher les correctifs ({0})","Afficher les correctifs"],"vs/editor/contrib/codelens/codelensController":["Afficher les commandes Code Lens de la ligne actuelle"],"vs/editor/contrib/comment/comment":["Activer/d\xE9sactiver le commentaire de ligne","Afficher/masquer le commen&&taire de ligne","Ajouter le commentaire de ligne","Supprimer le commentaire de ligne","Activer/d\xE9sactiver le commentaire de bloc","Afficher/masquer le commentaire de &&bloc"],"vs/editor/contrib/contextmenu/contextmenu":["Afficher le menu contextuel de l'\xE9diteur"],"vs/editor/contrib/cursorUndo/cursorUndo":["Annulation du curseur","Restauration du curseur"],"vs/editor/contrib/find/findController":["Rechercher","&&Rechercher","Rechercher dans la s\xE9lection","Rechercher suivant","Rechercher suivant","Rechercher pr\xE9c\xE9dent","Rechercher pr\xE9c\xE9dent","S\xE9lection suivante","S\xE9lection pr\xE9c\xE9dente","Remplacer","&&Remplacer"],"vs/editor/contrib/find/findWidget":["Ic\xF4ne de l'option Rechercher dans la s\xE9lection dans le widget de recherche de l'\xE9diteur.","Ic\xF4ne permettant d'indiquer que le widget de recherche de l'\xE9diteur est r\xE9duit.","Ic\xF4ne permettant d'indiquer que le widget de recherche de l'\xE9diteur est d\xE9velopp\xE9.","Ic\xF4ne de l'option Remplacer dans le widget de recherche de l'\xE9diteur.","Ic\xF4ne de l'option Tout remplacer dans le widget de recherche de l'\xE9diteur.","Ic\xF4ne de l'option Rechercher pr\xE9c\xE9dent dans le widget de recherche de l'\xE9diteur.","Ic\xF4ne de l'option Rechercher suivant dans le widget de recherche de l'\xE9diteur.","Rechercher","Rechercher","Correspondance pr\xE9c\xE9dente","Prochaine correspondance","Rechercher dans la s\xE9lection","Fermer","Remplacer","Remplacer","Remplacer","Tout remplacer","Changer le mode de remplacement","Seuls les {0} premiers r\xE9sultats sont mis en \xE9vidence, mais toutes les op\xE9rations de recherche fonctionnent sur l\u2019ensemble du texte.","{0} sur {1}","Aucun r\xE9sultat","{0} trouv\xE9(s)","{0} trouv\xE9 pour '{1}'","{0} trouv\xE9 pour '{1}', sur {2}","{0} trouv\xE9 pour '{1}'","La combinaison Ctrl+Entr\xE9e permet d\xE9sormais d'ajouter un saut de ligne au lieu de tout remplacer. Vous pouvez modifier le raccourci clavier de editor.action.replaceAll pour red\xE9finir le comportement."],"vs/editor/contrib/folding/folding":["D\xE9plier","D\xE9plier de mani\xE8re r\xE9cursive","Plier","Activer/d\xE9sactiver le pliage","Plier de mani\xE8re r\xE9cursive","Replier tous les commentaires de bloc","Replier toutes les r\xE9gions","D\xE9plier toutes les r\xE9gions","Plier tout","D\xE9plier tout","Niveau de pliage {0}","Couleur d'arri\xE8re-plan des gammes pli\xE9es. La couleur ne doit pas \xEAtre opaque pour ne pas cacher les d\xE9corations sous-jacentes.","Couleur du contr\xF4le de pliage dans la marge de l'\xE9diteur."],"vs/editor/contrib/folding/foldingDecorations":["Ic\xF4ne des plages d\xE9velopp\xE9es dans la marge de glyphes de l'\xE9diteur.","Ic\xF4ne des plages r\xE9duites dans la marge de glyphes de l'\xE9diteur."],"vs/editor/contrib/fontZoom/fontZoom":["Agrandissement de l'\xE9diteur de polices de caract\xE8res","R\xE9tr\xE9cissement de l'\xE9diteur de polices de caract\xE8res","Remise \xE0 niveau du zoom de l'\xE9diteur de polices de caract\xE8res"],"vs/editor/contrib/format/format":["1\xA0modification de format effectu\xE9e \xE0 la ligne {0}","{0} modifications de format effectu\xE9es \xE0 la ligne {1}","1\xA0modification de format effectu\xE9e entre les lignes {0} et {1}","{0} modifications de format effectu\xE9es entre les lignes {1} et {2}"],"vs/editor/contrib/format/formatActions":["Mettre le document en forme","Mettre la s\xE9lection en forme"],"vs/editor/contrib/gotoError/gotoError":["Aller au probl\xE8me suivant (Erreur, Avertissement, Info)","Ic\xF4ne du prochain marqueur goto.","Aller au probl\xE8me pr\xE9c\xE9dent (Erreur, Avertissement, Info)","Ic\xF4ne du pr\xE9c\xE9dent marqueur goto.","Aller au probl\xE8me suivant dans Fichiers (Erreur, Avertissement, Info)","&&Probl\xE8me suivant","Aller au probl\xE8me pr\xE9c\xE9dent dans Fichiers (Erreur, Avertissement, Info)","&&Probl\xE8me pr\xE9c\xE9dent"],"vs/editor/contrib/gotoError/gotoErrorWidget":["Erreur","Avertissement","Info","Conseil","{0} \xE0 {1}. ","{0}\xA0probl\xE8mes sur\xA0{1}","{0}\xA0probl\xE8me(s) sur {1}","Couleur d'erreur du widget de navigation dans les marqueurs de l'\xE9diteur.","Couleur d'avertissement du widget de navigation dans les marqueurs de l'\xE9diteur.","Couleur d\u2019information du widget de navigation du marqueur de l'\xE9diteur.","Arri\xE8re-plan du widget de navigation dans les marqueurs de l'\xE9diteur."],"vs/editor/contrib/gotoSymbol/goToCommands":["Aper\xE7u","D\xE9finitions","D\xE9finition introuvable pour '{0}'","D\xE9finition introuvable","Atteindre la d\xE9finition","Atteindre la &&d\xE9finition","Ouvrir la d\xE9finition sur le c\xF4t\xE9","Faire un Peek de la D\xE9finition","D\xE9clarations","Aucune d\xE9claration pour '{0}'","Aucune d\xE9claration","Acc\xE9der \xE0 la d\xE9claration","Atteindre la &&d\xE9claration","Aucune d\xE9claration pour '{0}'","Aucune d\xE9claration","Aper\xE7u de la d\xE9claration","D\xE9finitions de type","D\xE9finition de type introuvable pour '{0}'","D\xE9finition de type introuvable","Atteindre la d\xE9finition de type","Acc\xE9der \xE0 la d\xE9finition de &&type","Aper\xE7u de la d\xE9finition du type","Impl\xE9mentations","Impl\xE9mentation introuvable pour '{0}'","Impl\xE9mentation introuvable","Atteindre les impl\xE9mentations","Atteindre les &&impl\xE9mentations","Impl\xE9mentations d'aper\xE7u","Aucune r\xE9f\xE9rence pour '{0}'","Aucune r\xE9f\xE9rence","Atteindre les r\xE9f\xE9rences","Atteindre les &&r\xE9f\xE9rences","R\xE9f\xE9rences","Aper\xE7u des r\xE9f\xE9rences","R\xE9f\xE9rences","Atteindre un symbole","Emplacements","Aucun r\xE9sultat pour \xAB\xA0{0}\xA0\xBB","R\xE9f\xE9rences"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["Cliquez pour afficher {0}\xA0d\xE9finitions."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["Chargement en cours...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} r\xE9f\xE9rences","{0} r\xE9f\xE9rence","R\xE9f\xE9rences"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["aper\xE7u non disponible","Aucun r\xE9sultat","R\xE9f\xE9rences"],"vs/editor/contrib/gotoSymbol/referencesModel":["symbole dans {0} sur la ligne {1}, colonne {2}","symbole dans {0} \xE0 la ligne {1}, colonne {2}, {3}","1 symbole dans {0}, chemin complet {1}","{0} symboles dans {1}, chemin complet {2}","R\xE9sultats introuvables","1\xA0symbole dans {0}","{0}\xA0symboles dans {1}","{0}\xA0symboles dans {1} fichiers"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["Symbole {0} sur {1}, {2} pour le suivant","Symbole {0} sur {1}"],"vs/editor/contrib/hover/hover":["Afficher par pointage","Afficher le pointeur de l'aper\xE7u de d\xE9finition"],"vs/editor/contrib/hover/markdownHoverParticipant":["Chargement en cours..."],"vs/editor/contrib/hover/markerHoverParticipant":["Voir le probl\xE8me","Aucune solution disponible dans l'imm\xE9diat","Recherche de correctifs rapides...","Aucune solution disponible dans l'imm\xE9diat","Correction rapide..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["Remplacer par la valeur pr\xE9c\xE9dente","Remplacer par la valeur suivante"],"vs/editor/contrib/indentation/indentation":["Convertir les retraits en espaces","Convertir les retraits en tabulations","Taille des tabulations configur\xE9e","S\xE9lectionner la taille des tabulations pour le fichier actuel","Mettre en retrait avec des tabulations","Mettre en retrait avec des espaces","D\xE9tecter la mise en retrait \xE0 partir du contenu","Remettre en retrait les lignes","R\xE9indenter les lignes s\xE9lectionn\xE9es"],"vs/editor/contrib/linesOperations/linesOperations":["Copier la ligne en haut","&&Copier la ligne en haut","Copier la ligne en bas","Co&&pier la ligne en bas","Dupliquer la s\xE9lection","&&Dupliquer la s\xE9lection","D\xE9placer la ligne vers le haut","D\xE9placer la ligne &&vers le haut","D\xE9placer la ligne vers le bas","D\xE9placer la &&ligne vers le bas","Trier les lignes dans l'ordre croissant","Trier les lignes dans l'ordre d\xE9croissant","D\xE9couper l'espace blanc de fin","Supprimer la ligne","Mettre en retrait la ligne","Ajouter un retrait n\xE9gatif \xE0 la ligne","Ins\xE9rer une ligne au-dessus","Ins\xE9rer une ligne sous","Supprimer tout ce qui est \xE0 gauche","Supprimer tout ce qui est \xE0 droite","Joindre les lignes","Transposer les caract\xE8res autour du curseur","Transformer en majuscule","Transformer en minuscule",'Appliquer la casse "1re lettre des mots en majuscule"',"Transformer en snake case"],"vs/editor/contrib/linkedEditing/linkedEditing":["D\xE9marrer la modification li\xE9e","Couleur d'arri\xE8re-plan quand l'\xE9diteur renomme automatiquement le type."],"vs/editor/contrib/links/links":["Ex\xE9cuter la commande","suivre le lien","cmd + clic","ctrl + clic","option + clic","alt + clic","Ex\xE9cuter la commande {0}","\xC9chec de l'ouverture de ce lien, car il n'est pas bien form\xE9\xA0: {0}","\xC9chec de l'ouverture de ce lien, car sa cible est manquante.","Ouvrir le lien"],"vs/editor/contrib/message/messageController":["Indique si l'\xE9diteur affiche un message inline","Impossible de modifier dans l\u2019\xE9diteur en lecture seule"],"vs/editor/contrib/multicursor/multicursor":["Ajouter un curseur au-dessus","&&Ajouter un curseur au-dessus","Ajouter un curseur en dessous","Aj&&outer un curseur en dessous","Ajouter des curseurs \xE0 la fin des lignes","Ajouter des c&&urseurs \xE0 la fin des lignes","Ajouter des curseurs en bas","Ajouter des curseurs en haut","Ajouter la s\xE9lection \xE0 la correspondance de recherche suivante","Ajouter l'occurrence suiva&&nte","Ajouter la s\xE9lection \xE0 la correspondance de recherche pr\xE9c\xE9dente","Ajouter l'occurrence p&&r\xE9c\xE9dente","D\xE9placer la derni\xE8re s\xE9lection vers la correspondance de recherche suivante","D\xE9placer la derni\xE8re s\xE9lection \xE0 la correspondance de recherche pr\xE9c\xE9dente","S\xE9lectionner toutes les occurrences des correspondances de la recherche","S\xE9lectionner toutes les &&occurrences","Modifier toutes les occurrences"],"vs/editor/contrib/parameterHints/parameterHints":["Indicateurs des param\xE8tres Trigger"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["Ic\xF4ne d'affichage du prochain conseil de param\xE8tre.","Ic\xF4ne d'affichage du pr\xE9c\xE9dent conseil de param\xE8tre.","{0}, conseil"],"vs/editor/contrib/peekView/peekView":["Fermer","Couleur d'arri\xE8re-plan de la zone de titre de l'affichage d'aper\xE7u.","Couleur du titre de l'affichage d'aper\xE7u.","Couleur des informations sur le titre de l'affichage d'aper\xE7u.","Couleur des bordures et de la fl\xE8che de l'affichage d'aper\xE7u.","Couleur d'arri\xE8re-plan de la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur de premier plan des noeuds de lignes dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur de premier plan des noeuds de fichiers dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur d'arri\xE8re-plan de l'entr\xE9e s\xE9lectionn\xE9e dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur de premier plan de l'entr\xE9e s\xE9lectionn\xE9e dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur d'arri\xE8re-plan de l'\xE9diteur d'affichage d'aper\xE7u.","Couleur d'arri\xE8re-plan de la bordure de l'\xE9diteur d'affichage d'aper\xE7u.","Couleur de mise en surbrillance d'une correspondance dans la liste des r\xE9sultats de l'affichage d'aper\xE7u.","Couleur de mise en surbrillance d'une correspondance dans l'\xE9diteur de l'affichage d'aper\xE7u.","Bordure de mise en surbrillance d'une correspondance dans l'\xE9diteur de l'affichage d'aper\xE7u."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["Ouvrez d'abord un \xE9diteur de texte pour acc\xE9der \xE0 une ligne.","Allez \xE0 la ligne {0}, colonne {1}.","Acc\xE9dez \xE0 la ligne {0}.","Ligne actuelle\xA0: {0}, caract\xE8re\xA0: {1}. Tapez un num\xE9ro de ligne entre\xA01 et\xA0{2} auquel acc\xE9der.","Ligne actuelle\xA0: {0}, caract\xE8re\xA0: {1}. Tapez un num\xE9ro de ligne auquel acc\xE9der."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["Pour acc\xE9der \xE0 un symbole, ouvrez d'abord un \xE9diteur de texte avec des informations de symbole.","L'\xE9diteur de texte actif ne fournit pas les informations de symbole.","Aucun symbole d'\xE9diteur correspondant","Aucun symbole d'\xE9diteur","Ouvrir sur le c\xF4t\xE9","Ouvrir en bas","symboles ({0})","propri\xE9t\xE9s ({0})","m\xE9thodes ({0})","fonctions ({0})","constructeurs ({0})","variables ({0})","classes ({0})","structs ({0})","\xE9v\xE9nements ({0})","op\xE9rateurs ({0})","interfaces ({0})","espaces de noms ({0})","packages ({0})","param\xE8tres de type ({0})","modules ({0})","propri\xE9t\xE9s ({0})","\xE9num\xE9rations ({0})","membres d'\xE9num\xE9ration ({0})","cha\xEEnes ({0})","fichiers ({0})","tableaux ({0})","nombres ({0})","bool\xE9ens ({0})","objets ({0})","cl\xE9s ({0})","champs ({0})","constantes ({0})"],"vs/editor/contrib/rename/rename":["Aucun r\xE9sultat.","Une erreur inconnue s'est produite lors de la r\xE9solution de l'emplacement de renommage","Renommage de '{0}'","Changement du nom de {0}","'{0}' renomm\xE9 en '{1}'. R\xE9capitulatif : {2}","Le renommage n'a pas pu appliquer les modifications","Le renommage n'a pas pu calculer les modifications","Renommer le symbole","Activer/d\xE9sactiver la possibilit\xE9 d'afficher un aper\xE7u des changements avant le renommage"],"vs/editor/contrib/rename/renameInputField":["Renommez l'entr\xE9e. Tapez le nouveau nom et appuyez sur Entr\xE9e pour valider.","{0} pour renommer, {1} pour afficher un aper\xE7u"],"vs/editor/contrib/smartSelect/smartSelect":["\xC9tendre la s\xE9lection","D\xE9v&&elopper la s\xE9lection","R\xE9duire la s\xE9lection","&&R\xE9duire la s\xE9lection"],"vs/editor/contrib/snippet/snippetVariables":["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dim","Lun","Mar","Mer","Jeu","Ven","Sam","Janvier","F\xE9vrier","Mars","Avril","Mai","Juin","Juillet","Ao\xFBt","Septembre","Octobre","Novembre","D\xE9cembre","Jan","F\xE9v","Mar","Avr","Mai","Juin","Jul","Ao\xFB","Sept","Oct","Nov","D\xE9c"],"vs/editor/contrib/suggest/suggestController":["L'acceptation de '{0}' a entra\xEEn\xE9 {1}\xA0modifications suppl\xE9mentaires","Suggestions pour Trigger","Ins\xE9rer","Ins\xE9rer","Remplacer","Remplacer","Ins\xE9rer","afficher moins","afficher plus","R\xE9initialiser la taille du widget de suggestion"],"vs/editor/contrib/suggest/suggestWidget":["Couleur d'arri\xE8re-plan du widget de suggestion.","Couleur de bordure du widget de suggestion.","Couleur de premier plan du widget de suggestion.","Couleur d'arri\xE8re-plan de l'entr\xE9e s\xE9lectionn\xE9e dans le widget de suggestion.","Couleur de la surbrillance des correspondances dans le widget de suggestion.","Chargement en cours...","Pas de suggestions.","{0}, documents\xA0: {1}","Sugg\xE9rer"],"vs/editor/contrib/suggest/suggestWidgetDetails":["Fermer","Chargement en cours..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["Ic\xF4ne d'affichage d'informations suppl\xE9mentaires dans le widget de suggestion.","Lire la suite"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["Couleur de premier plan des symboles de tableau. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles bool\xE9ens. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de classe. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de couleur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan pour les symboles de constante. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de constructeur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'\xE9num\xE9rateur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de membre d'\xE9num\xE9rateur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'\xE9v\xE9nement. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de champ. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de fichier. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de dossier. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de fonction. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'interface. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de cl\xE9. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de mot cl\xE9. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de m\xE9thode. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de module. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'espace de noms. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles null. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de nombre. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'objet. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'op\xE9rateur. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de package. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de propri\xE9t\xE9. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de r\xE9f\xE9rence. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'extrait de code. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de cha\xEEne. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de struct. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de texte. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de param\xE8tre de type. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles d'unit\xE9. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion.","Couleur de premier plan des symboles de variable. Ces symboles apparaissent dans le plan, la barre de navigation et le widget de suggestion."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["Activer/d\xE9sactiver l'utilisation de la touche Tab pour d\xE9placer le focus","Appuyer sur Tab d\xE9placera le focus vers le prochain \xE9l\xE9ment pouvant \xEAtre d\xE9sign\xE9 comme \xE9l\xE9ment actif","Appuyer sur Tab ins\xE9rera le caract\xE8re de tabulation"],"vs/editor/contrib/tokenization/tokenization":["D\xE9veloppeur\xA0: forcer la retokenisation"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["Marques de fin de ligne inhabituelles","Marques de fin de ligne inhabituelles d\xE9tect\xE9es",`Ce fichier contient un ou plusieurs caract\xE8res de fin de ligne inhabituels, par exemple le s\xE9parateur de ligne (LS) ou le s\xE9parateur de paragraphe (PS).\r +\r +Il est recommand\xE9 de les supprimer du fichier. Vous pouvez le configurer via 'editor.unusualLineTerminators'.`,"Corriger ce fichier","Ignorer le probl\xE8me pour ce fichier"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["Couleur d'arri\xE8re-plan d'un symbole pendant l'acc\xE8s en lecture, comme la lecture d'une variable. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan d'un symbole pendant l'acc\xE8s en \xE9criture, comme l'\xE9criture d'une variable. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de bordure d'un symbole durant l'acc\xE8s en lecture, par exemple la lecture d'une variable.","Couleur de bordure d'un symbole durant l'acc\xE8s en \xE9criture, par exemple l'\xE9criture dans une variable.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour la mise en surbrillance des symboles. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour la mise en surbrillance des symboles d'acc\xE8s en \xE9criture. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Aller \xE0 la prochaine mise en \xE9vidence de symbole","Aller \xE0 la mise en \xE9vidence de symbole pr\xE9c\xE9dente","D\xE9clencher la mise en \xE9vidence de symbole"],"vs/editor/contrib/wordOperations/wordOperations":["Supprimer le mot"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["Substitutions de configuration du langage par d\xE9faut","Configurez les param\xE8tres d'\xE9diteur \xE0 remplacer pour un langage.","Ce param\xE8tre ne prend pas en charge la configuration par langage.","Impossible d'inscrire une propri\xE9t\xE9 vide","Impossible d'inscrire '{0}'. Ceci correspond au mod\xE8le de propri\xE9t\xE9 '\\\\[.*\\\\]$' permettant de d\xE9crire les param\xE8tres d'\xE9diteur sp\xE9cifiques \xE0 un langage. Utilisez la contribution 'configurationDefaults'.","Impossible d'inscrire '{0}'. Cette propri\xE9t\xE9 est d\xE9j\xE0 inscrite."],"vs/platform/contextkey/browser/contextKeyService":["Commande qui retourne des informations sur les cl\xE9s de contexte"],"vs/platform/contextkey/common/contextkeys":["Indique si le syst\xE8me d'exploitation est Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["Touche ({0}) utilis\xE9e. En attente d'une seconde touche...","La combinaison de touches ({0}, {1}) n\u2019est pas une commande."],"vs/platform/list/browser/listService":["Banc d'essai","Mappe vers 'Contr\xF4le' dans Windows et Linux, et vers 'Commande' dans macOS.","Mappe vers 'Alt' dans Windows et Linux, et vers 'Option' dans macOS.","Le modificateur \xE0 utiliser pour ajouter un \xE9l\xE9ment dans les arbres et listes pour une s\xE9lection multiple avec la souris (par exemple dans l\u2019Explorateur, les \xE9diteurs ouverts et la vue scm). Les mouvements de la souris 'Ouvrir \xE0 c\xF4t\xE9' (si pris en charge) s'adapteront tels qu\u2019ils n'entrent pas en conflit avec le modificateur multiselect.","Contr\xF4le l'ouverture des \xE9l\xE9ments dans les arborescences et les listes \xE0 l'aide de la souris (si cela est pris en charge). Notez que certaines arborescences et listes peuvent choisir d'ignorer ce param\xE8tre, s'il est non applicable.","Contr\xF4le si les listes et les arborescences prennent en charge le d\xE9filement horizontal dans le banc d'essai. Avertissement : L'activation de ce param\xE8tre a un impact sur les performances.","Contr\xF4le la mise en retrait de l'arborescence, en pixels.","Contr\xF4le si l'arborescence doit afficher les rep\xE8res de mise en retrait.","D\xE9termine si les listes et les arborescences ont un d\xE9filement fluide.","La navigation au clavier Simple place le focus sur les \xE9l\xE9ments qui correspondent \xE0 l'entr\xE9e de clavier. La mise en correspondance est effectu\xE9e sur les pr\xE9fixes uniquement.","La navigation de mise en surbrillance au clavier met en surbrillance les \xE9l\xE9ments qui correspondent \xE0 l'entr\xE9e de clavier. La navigation ult\xE9rieure vers le haut ou vers le bas parcourt uniquement les \xE9l\xE9ments mis en surbrillance.","La navigation au clavier Filtrer filtre et masque tous les \xE9l\xE9ments qui ne correspondent pas \xE0 l'entr\xE9e de clavier.","Contr\xF4le le style de navigation au clavier pour les listes et les arborescences dans le banc d'essai. Les options sont Simple, Mise en surbrillance et Filtrer.","Contr\xF4le si la navigation au clavier dans les listes et les arborescences est automatiquement d\xE9clench\xE9e simplement par la frappe. Si d\xE9fini sur 'false', la navigation au clavier est seulement d\xE9clench\xE9e avec l'ex\xE9cution de la commande 'list.toggleKeyboardNavigation', \xE0 laquelle vous pouvez attribuer un raccourci clavier.","Contr\xF4le la fa\xE7on dont les dossiers de l'arborescence sont d\xE9velopp\xE9s quand vous cliquez sur les noms de dossiers. Notez que certaines arborescences et listes peuvent choisir d'ignorer ce param\xE8tre, s'il est non applicable."],"vs/platform/markers/common/markers":["Erreur","Avertissement","Info"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","r\xE9cemment utilis\xE9es","autres commandes","La commande '{0}' a entra\xEEn\xE9 une erreur ({1})"],"vs/platform/quickinput/browser/helpQuickAccess":["commandes globales","commandes de l'\xE9diteur","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["Couleur de premier plan globale. Cette couleur est utilis\xE9e si elle n'est pas remplac\xE9e par un composant.","Couleur principale de premier plan pour les messages d'erreur. Cette couleur est utilis\xE9e uniquement si elle n'est pas red\xE9finie par un composant.","Couleur par d\xE9faut des ic\xF4nes du banc d'essai.","Couleur de bordure globale des \xE9l\xE9ments ayant le focus. Cette couleur est utilis\xE9e si elle n'est pas remplac\xE9e par un composant.","Bordure suppl\xE9mentaire autour des \xE9l\xE9ments pour les s\xE9parer des autres et obtenir un meilleur contraste.","Bordure suppl\xE9mentaire autour des \xE9l\xE9ments actifs pour les s\xE9parer des autres et obtenir un meilleur contraste.","Couleur des liens dans le texte.","Couleur d'arri\xE8re-plan des blocs de code dans le texte.","Couleur de l'ombre des widgets, comme rechercher/remplacer, au sein de l'\xE9diteur.","Arri\xE8re-plan de la zone d'entr\xE9e.","Premier plan de la zone d'entr\xE9e.","Bordure de la zone d'entr\xE9e.","Couleur de la bordure des options activ\xE9es dans les champs d'entr\xE9e.","Couleur d'arri\xE8re-plan des options activ\xE9es dans les champs d'entr\xE9e.","Couleur de premier plan des options activ\xE9es dans les champs d'entr\xE9e.","Couleur d'arri\xE8re-plan de la validation d'entr\xE9e pour la gravit\xE9 des informations.","Couleur de premier plan de validation de saisie pour la s\xE9v\xE9rit\xE9 Information.","Couleur de bordure de la validation d'entr\xE9e pour la gravit\xE9 des informations.","Couleur d'arri\xE8re-plan de la validation d'entr\xE9e pour la gravit\xE9 de l'avertissement.","Couleur de premier plan de la validation de la saisie pour la s\xE9v\xE9rit\xE9 Avertissement.","Couleur de bordure de la validation d'entr\xE9e pour la gravit\xE9 de l'avertissement.","Couleur d'arri\xE8re-plan de la validation d'entr\xE9e pour la gravit\xE9 de l'erreur.","Couleur de premier plan de la validation de saisie pour la s\xE9v\xE9rit\xE9 Erreur.","Couleur de bordure de la validation d'entr\xE9e pour la gravit\xE9 de l'erreur. ","Arri\xE8re-plan de la liste d\xE9roulante.","Premier plan de la liste d\xE9roulante.","Couleur de premier plan du bouton.","Couleur d'arri\xE8re-plan du bouton.","Couleur d'arri\xE8re-plan du bouton pendant le pointage.","Couleur de fond des badges. Les badges sont de courts libell\xE9s d'information, ex. le nombre de r\xE9sultats de recherche.","Couleur des badges. Les badges sont de courts libell\xE9s d'information, ex. le nombre de r\xE9sultats de recherche.","Ombre de la barre de d\xE9filement pour indiquer que la vue d\xE9file.","Couleur de fond du curseur de la barre de d\xE9filement.","Couleur de fond du curseur de la barre de d\xE9filement lors du survol.","Couleur d\u2019arri\xE8re-plan de la barre de d\xE9filement lorsqu'on clique dessus.","Couleur de fond pour la barre de progression qui peut s'afficher lors d'op\xE9rations longues.","Couleur d'arri\xE8re-plan du texte d'erreur dans l'\xE9diteur. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les d\xE9corations sous-jacentes.","Couleur de premier plan de la ligne ondul\xE9e marquant les erreurs dans l'\xE9diteur.","Couleur de bordure des zones d'erreur dans l'\xE9diteur.","Couleur d'arri\xE8re-plan du texte d'avertissement dans l'\xE9diteur. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les d\xE9corations sous-jacentes.","Couleur de premier plan de la ligne ondul\xE9e marquant les avertissements dans l'\xE9diteur.","Couleur de bordure des zones d'avertissement dans l'\xE9diteur.","Couleur d'arri\xE8re-plan du texte d'information dans l'\xE9diteur. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les d\xE9corations sous-jacentes.","Couleur de premier plan de la ligne ondul\xE9e marquant les informations dans l'\xE9diteur.","Couleur de bordure des zones d'informations dans l'\xE9diteur.","Couleur de premier plan de la ligne ondul\xE9e d'indication dans l'\xE9diteur.","Couleur de bordure des zones d'indication dans l'\xE9diteur.","Couleur d'arri\xE8re-plan de l'\xE9diteur.","Couleur de premier plan par d\xE9faut de l'\xE9diteur.","Couleur d'arri\xE8re-plan des gadgets de l'\xE9diteur tels que rechercher/remplacer.","Couleur de premier plan des widgets de l'\xE9diteur, notamment Rechercher/remplacer.","Couleur de bordure des widgets de l'\xE9diteur. La couleur est utilis\xE9e uniquement si le widget choisit d'avoir une bordure et si la couleur n'est pas remplac\xE9e par un widget.","Couleur de bordure de la barre de redimensionnement des widgets de l'\xE9diteur. La couleur est utilis\xE9e uniquement si le widget choisit une bordure de redimensionnement et si la couleur n'est pas remplac\xE9e par un widget.","Couleur d'arri\xE8re-plan du s\xE9lecteur rapide. Le widget de s\xE9lecteur rapide est le conteneur de s\xE9lecteurs comme la palette de commandes.","Couleur de premier plan du s\xE9lecteur rapide. Le widget de s\xE9lecteur rapide est le conteneur de s\xE9lecteurs comme la palette de commandes.","Couleur d'arri\xE8re-plan du titre du s\xE9lecteur rapide. Le widget de s\xE9lecteur rapide est le conteneur de s\xE9lecteurs comme la palette de commandes.","Couleur d'arri\xE8re-plan du s\xE9lecteur rapide pour l'\xE9l\xE9ment ayant le focus.","Couleur du s\xE9lecteur rapide pour les \xE9tiquettes de regroupement.","Couleur du s\xE9lecteur rapide pour les bordures de regroupement.","Couleur de la s\xE9lection de l'\xE9diteur.","Couleur du texte s\xE9lectionn\xE9 pour le contraste \xE9lev\xE9.","Couleur de la s\xE9lection dans un \xE9diteur inactif. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur des r\xE9gions dont le contenu est le m\xEAme que celui de la s\xE9lection. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de bordure des r\xE9gions dont le contenu est identique \xE0 la s\xE9lection.","Couleur du r\xE9sultat de recherche actif.","Couleur des autres correspondances de recherche. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de la plage limitant la recherche. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de bordure du r\xE9sultat de recherche actif.","Couleur de bordure des autres r\xE9sultats de recherche.","Couleur de bordure de la plage limitant la recherche. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Surlignage sous le mot s\xE9lectionn\xE9 par pointage. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan du pointage de l'\xE9diteur.","Couleur de premier plan du pointage de l'\xE9diteur.","Couleur de bordure du pointage de l'\xE9diteur.","Couleur d'arri\xE8re-plan de la barre d'\xE9tat du pointage de l'\xE9diteur.","Couleur des liens actifs.","Couleur de premier plan des indicateurs inline","Couleur d'arri\xE8re-plan des indicateurs inline","Couleur utilis\xE9e pour l'ic\xF4ne d'ampoule sugg\xE9rant des actions.","Couleur utilis\xE9e pour l'ic\xF4ne d'ampoule sugg\xE9rant des actions de correction automatique.","Couleur d'arri\xE8re-plan du texte ins\xE9r\xE9. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur d'arri\xE8re-plan du texte supprim\xE9. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de contour du texte ins\xE9r\xE9.","Couleur de contour du texte supprim\xE9.","Couleur de bordure entre les deux \xE9diteurs de texte.","Couleur du remplissage diagonal de l'\xE9diteur de diff\xE9rences. Le remplissage diagonal est utilis\xE9 dans les vues de diff\xE9rences c\xF4te \xE0 c\xF4te.","Couleur d'arri\xE8re-plan de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de premier plan de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de contour de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est active. Une liste/arborescence active a le focus clavier, contrairement \xE0 une liste/arborescence inactive.","Couleur d'arri\xE8re-plan de la liste/l'arborescence de l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de premier plan de la liste/l'arborescence pour l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur d'arri\xE8re-plan de la liste/l'arborescence pour l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est inactive. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur de premier plan de la liste/l'arborescence pour l'\xE9l\xE9ment s\xE9lectionn\xE9 quand la liste/l'arborescence est inactive. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier, elle ne l'est pas quand elle est inactive.","Couleur d'arri\xE8re-plan de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est active. Une liste/arborescence active peut \xEAtre s\xE9lectionn\xE9e au clavier (elle ne l'est pas quand elle est inactive).","Couleur de contour de la liste/l'arborescence pour l'\xE9l\xE9ment ayant le focus quand la liste/l'arborescence est inactive. Une liste/arborescence active a le focus clavier, contrairement \xE0 une liste/arborescence inactive.","Arri\xE8re-plan de la liste/l'arborescence pendant le pointage sur des \xE9l\xE9ments avec la souris.","Premier plan de la liste/l'arborescence pendant le pointage sur des \xE9l\xE9ments avec la souris.","Arri\xE8re-plan de l'op\xE9ration de glisser-d\xE9placer dans une liste/arborescence pendant le d\xE9placement d'\xE9l\xE9ments avec la souris.","Couleur de premier plan dans la liste/l'arborescence pour la surbrillance des correspondances pendant la recherche dans une liste/arborescence.","Couleur d'arri\xE8re-plan du widget de filtre de type dans les listes et les arborescences.","Couleur de contour du widget de filtre de type dans les listes et les arborescences.","Couleur de contour du widget de filtre de type dans les listes et les arborescences, en l'absence de correspondance.","Couleur de trait de l'arborescence pour les rep\xE8res de mise en retrait.","Couleur de trait de l'arborescence pour les rep\xE8res de mise en retrait.","Couleur de bordure des menus.","Couleur de premier plan des \xE9l\xE9ments de menu.","Couleur d'arri\xE8re-plan des \xE9l\xE9ments de menu.","Couleur de premier plan de l'\xE9l\xE9ment de menu s\xE9lectionn\xE9 dans les menus.","Couleur d'arri\xE8re-plan de l'\xE9l\xE9ment de menu s\xE9lectionn\xE9 dans les menus.","Couleur de bordure de l'\xE9l\xE9ment de menu s\xE9lectionn\xE9 dans les menus.","Couleur d'un \xE9l\xE9ment de menu s\xE9parateur dans les menus.","Couleur d\u2019arri\xE8re-plan de mise en surbrillance d\u2019un extrait tabstop.","Couleur de bordure de mise en surbrillance d\u2019un extrait tabstop.","Couleur d\u2019arri\xE8re-plan de mise en surbrillance du tabstop final d\u2019un extrait.","Mettez en surbrillance la couleur de bordure du dernier taquet de tabulation d'un extrait de code.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour rechercher les correspondances. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de marqueur de la r\xE8gle d'aper\xE7u pour la mise en surbrillance des s\xE9lections. La couleur ne doit pas \xEAtre opaque pour ne pas masquer les ornements sous-jacents.","Couleur de marqueur de la minimap pour les correspondances.","Couleur de marqueur du minimap pour la s\xE9lection de l'\xE9diteur.","Couleur de marqueur de minimap pour les erreurs.","Couleur de marqueur de minimap pour les avertissements.","Couleur d'arri\xE8re-plan du minimap.","Couleur d'arri\xE8re-plan du curseur de minimap.","Couleur d'arri\xE8re-plan du curseur de minimap pendant le survol.","Couleur d'arri\xE8re-plan du curseur de minimap pendant un clic.","Couleur utilis\xE9e pour l'ic\xF4ne d'erreur des probl\xE8mes.","Couleur utilis\xE9e pour l'ic\xF4ne d'avertissement des probl\xE8mes.","Couleur utilis\xE9e pour l'ic\xF4ne d'informations des probl\xE8mes."],"vs/platform/theme/common/iconRegistry":["ID de la police \xE0 utiliser. Si aucune valeur n'est d\xE9finie, la police d\xE9finie en premier est utilis\xE9e.","Caract\xE8re de police associ\xE9 \xE0 la d\xE9finition d'ic\xF4ne.","Ic\xF4ne de l'action de fermeture dans les widgets."],"vs/platform/undoRedo/common/undoRedoService":["Les fichiers suivants ont \xE9t\xE9 ferm\xE9s et modifi\xE9s sur le disque\xA0: {0}.","Les fichiers suivants ont \xE9t\xE9 modifi\xE9s de mani\xE8re incompatible : {0}.","Impossible d'annuler '{0}' dans tous les fichiers. {1}","Impossible d'annuler '{0}' dans tous les fichiers. {1}","Impossible d'annuler '{0}' dans tous les fichiers, car des modifications ont \xE9t\xE9 apport\xE9es \xE0 {1}","Impossible d'annuler '{0}' dans tous les fichiers, car une op\xE9ration d'annulation ou de r\xE9tablissement est d\xE9j\xE0 en cours d'ex\xE9cution sur {1}","Impossible d'annuler '{0}' dans tous les fichiers, car une op\xE9ration d'annulation ou de r\xE9tablissement s'est produite dans l'intervalle","Souhaitez-vous annuler '{0}' dans tous les fichiers\xA0?","Annuler dans {0} fichiers","Annuler ce fichier","Annuler","Impossible d'annuler '{0}', car une op\xE9ration d'annulation ou de r\xE9tablissement est d\xE9j\xE0 en cours d'ex\xE9cution.","Voulez-vous annuler '{0}'\xA0?","Annuler","Annuler","Impossible de r\xE9p\xE9ter '{0}' dans tous les fichiers. {1}","Impossible de r\xE9p\xE9ter '{0}' dans tous les fichiers. {1}","Impossible de r\xE9p\xE9ter '{0}' dans tous les fichiers, car des modifications ont \xE9t\xE9 apport\xE9es \xE0 {1}","Impossible de r\xE9tablir '{0}' dans tous les fichiers, car une op\xE9ration d'annulation ou de r\xE9tablissement est d\xE9j\xE0 en cours d'ex\xE9cution pour {1}","Impossible de r\xE9tablir '{0}' dans tous les fichiers, car une op\xE9ration d'annulation ou de r\xE9tablissement s'est produite dans l'intervalle","Impossible de r\xE9tablir '{0}', car une op\xE9ration d'annulation ou de r\xE9tablissement est d\xE9j\xE0 en cours d'ex\xE9cution."]}); diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.fr.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.fr.js.gz new file mode 100644 index 0000000..dcf28aa Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.fr.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.it.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.it.js new file mode 100644 index 0000000..13c210f --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.it.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.it",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["input"],"vs/base/browser/ui/findinput/findInputCheckboxes":["Maiuscole/minuscole","Parola intera","Usa espressione regolare"],"vs/base/browser/ui/findinput/replaceInput":["input","Mantieni maiuscole/minuscole"],"vs/base/browser/ui/iconLabel/iconLabel":["Caricamento..."],"vs/base/browser/ui/inputbox/inputBox":["Errore: {0}","Avviso: {0}","Info: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Non associato"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["Cancella","Disabilita filtro sul tipo","Abilita filtro sul tipo","Non sono stati trovati elementi","Abbinamento di {0} su {1} elementi"],"vs/base/common/actions":["(vuoto)"],"vs/base/common/errorMessage":["{0}: {1}","Si \xE8 verificato un errore di sistema ({0})","Si \xE8 verificato un errore sconosciuto. Per altri dettagli, vedere il log.","Si \xE8 verificato un errore sconosciuto. Per altri dettagli, vedere il log.","{0} ({1} errori in totale)","Si \xE8 verificato un errore sconosciuto. Per altri dettagli, vedere il log."],"vs/base/common/keybindingLabels":["CTRL","MAIUSC","ALT","Windows","CTRL","MAIUSC","ALT","Super","CTRL","MAIUSC","ALT","Comando","CTRL","MAIUSC","ALT","Windows","CTRL","MAIUSC","ALT","Super"],"vs/base/parts/quickinput/browser/quickInput":["Indietro","{0}/{1}","Digitare per ridurre il numero di risultati.","{0} risultati","{0} selezionati","OK","Personalizzato","Indietro ({0})","Indietro"],"vs/base/parts/quickinput/browser/quickInputList":["Input rapido"],"vs/editor/browser/controller/coreCommands":["Si attiene alla fine anche quando si passa a righe pi\xF9 lunghe","Si attiene alla fine anche quando si passa a righe pi\xF9 lunghe"],"vs/editor/browser/controller/textAreaHandler":["editor","L'editor non \xE8 accessibile in questo momento. Premere {0} per le opzioni."],"vs/editor/browser/core/keybindingCancellation":["Indica se l'editor esegue un'operazione annullabile, ad esempio 'Anteprima riferimenti'"],"vs/editor/browser/editorExtensions":["&&Annulla","Annulla","&&Ripeti","Ripeti","&&Seleziona tutto","Seleziona tutto"],"vs/editor/browser/widget/codeEditorWidget":["Il numero di cursori \xE8 stato limitato a {0}."],"vs/editor/browser/widget/diffEditorWidget":["Effetto di riga per gli inserimenti nell'editor diff.","Effetto di riga per le rimozioni nell'editor diff.","Non \xE8 possibile confrontare i file perch\xE9 uno \xE8 troppo grande."],"vs/editor/browser/widget/diffReview":["Icona per 'Inserisci' nella revisione diff.","Icona per 'Rimuovi' nella revisione diff.","Icona per 'Chiudi' nella revisione diff.","Chiudi","nessuna riga modificata","1 riga modificata","{0} righe modificate","Differenza {0} di {1}: riga originale {2}, {3}, riga modificata {4}, {5}","vuota","{0} riga non modificata {1}","{0} riga originale {1} riga modificata {2}","+ {0} riga modificata {1}","- {0} riga originale {1}","Vai alla differenza successiva","Vai alla differenza precedente"],"vs/editor/browser/widget/inlineDiffMargin":["Copia le righe eliminate","Copia la riga eliminata","Copia la riga eliminata ({0})","Ripristina questa modifica","Copia la riga eliminata ({0})"],"vs/editor/common/config/commonEditorConfig":["Editor","Numero di spazi a cui equivale una tabulazione. Quando `#editor.detectIndentation#` \xE8 attivo, questa impostazione viene sostituita in base al contenuto del file.","Inserisce spazi quando viene premuto TAB. Quando `#editor.detectIndentation#` \xE8 attivo, questa impostazione viene sostituita in base al contenuto del file.","Controlla se `#editor.tabSize#` e `#editor.insertSpaces#` verranno rilevati automaticamente quando un file viene aperto in base al contenuto del file.","Rimuovi gli spazi finali inseriti automaticamente.","Gestione speciale dei file di grandi dimensioni per disabilitare alcune funzionalit\xE0 che fanno un uso intensivo della memoria.","Controlla se calcolare i completamenti in base alle parole presenti nel documento.","Suggerisci parole solo dal documento attivo.","Suggerisci parole da tutti i documenti aperti della stessa lingua.","Suggerisci parole da tutti i documenti aperti.","Controlla i documenti da cui vengono calcolati i completamenti basati su parole.","L'evidenziazione semantica \xE8 abilitata per tutti i temi colore.","L'evidenziazione semantica \xE8 disabilitata per tutti i temi colore.","La configurazione dell'evidenziazione semantica \xE8 gestita tramite l'impostazione `semanticHighlighting` del tema colori corrente.","Controlla se l'evidenziazione semanticHighlighting \xE8 visualizzata per i linguaggi che la supportano.","Mantiene aperti gli editor rapidi anche quando si fa doppio clic sul contenuto o si preme 'ESC'.","Per motivi di prestazioni le righe di lunghezza superiore non verranno tokenizzate","Timeout in millisecondi dopo il quale il calcolo delle differenze viene annullato. Usare 0 per indicare nessun timeout.","Controlla se l'editor diff mostra le differenze affiancate o incorporate.","Se abilitato, l'editor differenze ignora le modifiche relative a spazi vuoti iniziali e finali.","Controlla se l'editor diff mostra gli indicatori +/- per le modifiche aggiunte/rimosse.","Controlla se l'editor visualizza CodeLens.","Il ritorno a capo automatico delle righe non viene mai applicato.","Il ritorno a capo automatico delle righe viene applicato in corrispondenza della larghezza del viewport.","Il ritorno a capo automatico delle righe viene applicato in base all'impostazione `#editor.wordWrap#`."],"vs/editor/common/config/editorOptions":["L'editor user\xE0 le API della piattaforma per rilevare quando viene collegata un'utilit\xE0 per la lettura dello schermo.","L'editor verr\xE0 definitivamente ottimizzato per l'utilizzo con un'utilit\xE0 per la lettura dello schermo. Il ritorno a capo automatico verr\xE0 disabilitato.","L'editor non verr\xE0 mai ottimizzato per l'utilizzo con un'utilit\xE0 per la lettura dello schermo.","Controlla se l'editor deve essere eseguito in una modalit\xE0 ottimizzata per le utilit\xE0 per la lettura dello schermo. Se viene attivata, il ritorno a capo automatico verr\xE0 disabilitato.","Consente di controllare se viene inserito uno spazio quando si aggiungono commenti.","Controlla se ignorare le righe vuote con le opzioni per attivare/disattivare, aggiungere o rimuovere relative ai commenti di riga.","Controlla se, quando si copia senza aver effettuato una selezione, viene copiata la riga corrente.","Controlla se il cursore deve passare direttamente alla ricerca delle corrispondenze durante la digitazione.","Controlla se inizializzare la stringa di ricerca nel Widget Trova con il testo selezionato nell'editor.","Non attivare mai automaticamente la funzione Trova nella selezione (impostazione predefinita)","Attiva sempre automaticamente la funzione Trova nella selezione","Attiva automaticamente la funzione Trova nella selezione quando sono selezionate pi\xF9 righe di contenuto.","Controlla la condizione per attivare automaticamente la funzione Trova nella selezione.","Controlla se il widget Trova deve leggere o modificare gli appunti di ricerca condivisi in macOS.","Controlla se il widget Trova deve aggiungere altre righe nella parte superiore dell'editor. Quando \xE8 true, \xE8 possibile scorrere oltre la prima riga quando il widget Trova \xE8 visibile.","Controlla se la ricerca viene riavviata automaticamente dall'inizio o dalla fine quando non \xE8 possibile trovare ulteriori corrispondenze.","Abilita/Disabilita i caratteri legatura (funzionalit\xE0 dei tipi di carattere 'calt' e 'liga'). Impostare su una stringa per un controllo pi\xF9 specifico sulla propriet\xE0 CSS 'font-feature-settings'.","Propriet\xE0 CSS 'font-feature-settings' esplicita. Se \xE8 necessario solo attivare/disattivare le legature, \xE8 possibile passare un valore booleano.","Consente di configurare i caratteri legatura o le funzionalit\xE0 dei tipi di carattere. Pu\xF2 essere un valore booleano per abilitare/disabilitare le legature o una stringa per il valore della propriet\xE0 CSS 'font-feature-settings'.","Controlla le dimensioni del carattere in pixel.",'Sono consentiti solo le parole chiave "normal" e "bold" o i numeri compresi tra 1 e 1000.','Controlla lo spessore del carattere. Accetta le parole chiave "normal" e "bold" o i numeri compresi tra 1 e 1000.',"Mostra la visualizzazione rapida dei risultati (impostazione predefinita)","Passa al risultato principale e mostra una visualizzazione rapida","Passa al risultato principale e abilita l'esplorazione senza anteprima per gli altri","Questa impostazione \xE8 deprecata. In alternativa, usare impostazioni diverse, come 'editor.editor.gotoLocation.multipleDefinitions' o 'editor.editor.gotoLocation.multipleImplementations'.","Controlla il comportamento del comando 'Vai alla definizione' quando esistono pi\xF9 posizioni di destinazione.","Controlla il comportamento del comando 'Vai alla definizione di tipo' quando esistono pi\xF9 posizioni di destinazione.","Controlla il comportamento del comando 'Vai a dichiarazione' quando esistono pi\xF9 posizioni di destinazione.","Controlla il comportamento del comando 'Vai a implementazioni' quando esistono pi\xF9 posizioni di destinazione.","Controlla il comportamento del comando 'Vai a riferimenti' quando esistono pi\xF9 posizioni di destinazione.","ID comando alternativo eseguito quando il risultato di 'Vai alla definizione' \xE8 la posizione corrente.","ID comando alternativo eseguito quando il risultato di 'Vai alla definizione di tipo' \xE8 la posizione corrente.","ID comando alternativo eseguito quando il risultato di 'Vai a dichiarazione' \xE8 la posizione corrente.","ID comando alternativo eseguito quando il risultato di 'Vai a implementazione' \xE8 la posizione corrente.","ID comando alternativo eseguito quando il risultato di 'Vai a riferimento' \xE8 la posizione corrente.","Controlla se mostrare l'area sensibile al passaggio del mouse.","Controlla il ritardo in millisecondi dopo il quale viene mostrato il passaggio del mouse.","Controlla se l'area sensibile al passaggio del mouse deve rimanere visibile quando vi si passa sopra con il puntatore del mouse.","Abilita la lampadina delle azioni codice nell'editor.","Abilita i suggerimenti inline nell'editor.","Controlla le dimensioni del carattere dei suggerimenti inline nell'editor. Quando \xE8 impostata su `0`, viene usato il 90% del valore di `#editor.fontSize#`.","Controlla la famiglia di caratteri dei suggerimenti inline nell'editor.","Controlla l'altezza della riga. Usare 0 per calcolare l'altezza della riga dalle dimensioni del carattere.","Controlla se la minimappa \xE8 visualizzata.","La minimappa ha le stesse dimensioni del contenuto dell'editor (e potrebbe supportare lo scorrimento).","Se necessario, la minimappa si ridurr\xE0 o si ingrandir\xE0 in modo da adattarsi all'altezza dell'editor (nessuno scorrimento).","Se necessario, la minimappa si ridurr\xE0 in modo che la larghezza non superi mai quella dell'editor (nessuno scorrimento).","Controlla le dimensioni della minimappa.","Definisce il lato in cui eseguire il rendering della minimappa.","Controlla se il dispositivo di scorrimento della minimappa \xE8 visualizzato.","Scala del contenuto disegnato nella minimappa: 1, 2 o 3.","Esegue il rendering dei caratteri effettivi di una riga in contrapposizione ai blocchi colore.","Limita la larghezza della minimappa in modo da eseguire il rendering al massimo di un certo numero di colonne.","Controlla la quantit\xE0 di spazio tra il bordo superiore dell'editor e la prima riga.","Controlla la quantit\xE0 di spazio tra il bordo inferiore dell'editor e l'ultima riga.","Abilita un popup che mostra documentazione sui parametri e informazioni sui tipi mentre si digita.","Controlla se il menu dei suggerimenti per i parametri esegue un ciclo o si chiude quando viene raggiunta la fine dell'elenco.","Abilita i suggerimenti rapidi all'interno di stringhe.","Abilita i suggerimenti rapidi all'interno di commenti.","Abilita i suggerimenti rapidi all'esterno di stringhe e commenti.","Controlla se visualizzare automaticamente i suggerimenti durante la digitazione.","I numeri di riga non vengono visualizzati.","I numeri di riga vengono visualizzati come numeri assoluti.","I numeri di riga vengono visualizzati come distanza in linee alla posizione del cursore.","I numeri di riga vengono visualizzati ogni 10 righe.","Controlla la visualizzazione dei numeri di riga.","Numero di caratteri a spaziatura fissa in corrispondenza del quale verr\xE0 eseguito il rendering di questo righello dell'editor.","Colore di questo righello dell'editor.","Esegue il rendering dei righelli verticali dopo un certo numero di caratteri a spaziatura fissa. Usare pi\xF9 valori per pi\xF9 righelli. Se la matrice \xE8 vuota, non viene disegnato alcun righello.","Inserisce il suggerimento senza sovrascrivere il testo a destra del cursore.","Inserisce il suggerimento e sovrascrive il testo a destra del cursore.","Controlla se le parole vengono sovrascritte quando si accettano i completamenti. Tenere presente che questa opzione dipende dalle estensioni che accettano esplicitamente questa funzionalit\xE0.","Controlla se i suggerimenti di filtro e ordinamento valgono per piccoli errori di battitura.","Controlla se l'ordinamento privilegia le parole che appaiono pi\xF9 vicine al cursore.","Controlla se condividere le selezioni dei suggerimenti memorizzati tra aree di lavoro e finestre (richiede `#editor.suggestSelection#`).","Controlla se un frammento attivo impedisce i suggerimenti rapidi.","Controlla se mostrare o nascondere le icone nei suggerimenti.","Controlla la visibilit\xE0 della barra di stato nella parte inferiore del widget dei suggerimenti.","Controlla se i dettagli del suggerimento vengono visualizzati inline con l'etichetta o solo nel widget dei dettagli","Questa impostazione \xE8 deprecata. Il widget dei suggerimenti pu\xF2 ora essere ridimensionato.","Questa impostazione \xE8 deprecata. In alternativa, usare impostazioni diverse, come 'editor.suggest.showKeywords' o 'editor.suggest.showSnippets'.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `method`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `function`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `constructor`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `field`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `variable`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `class`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `struct`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `interface`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `module`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `property`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `event`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `operator`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `unit`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `value`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `constant`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `enum`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `enumMember`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `keyword`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `text`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `color`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `file`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `reference`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `customcolor`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `folder`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `typeParameter`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `snippet`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `user`.","Se \xE8 abilitata, IntelliSense mostra i suggerimenti relativi a `issues`.","Indica se gli spazi vuoti iniziali e finali devono essere sempre selezionati.","Controlla se accettare i suggerimenti con i caratteri di commit. Ad esempio, in JavaScript il punto e virgola (';') pu\xF2 essere un carattere di commit che accetta un suggerimento e digita tale carattere.","Accetta un suggerimento con 'Invio' solo quando si apporta una modifica al testo.","Controlla se i suggerimenti devono essere accettati con 'INVIO' in aggiunta a 'TAB'. In questo modo \xE8 possibile evitare ambiguit\xE0 tra l'inserimento di nuove righe e l'accettazione di suggerimenti.","Controlla il numero di righe nell'editor che possono essere lette da un utilit\xE0 per la lettura dello schermo. Avviso: questa opzione pu\xF2 influire sulle prestazioni se il numero di righe \xE8 superiore a quello predefinito.","Contenuto editor","Usa le configurazioni del linguaggio per determinare la chiusura automatica delle parentesi.","Chiudi automaticamente le parentesi solo quando il cursore si trova alla sinistra di uno spazio vuoto.","Controlla se l'editor deve chiudere automaticamente le parentesi quadre dopo che sono state aperte.","Digita sopra le virgolette o le parentesi quadre di chiusura solo se sono state inserite automaticamente.","Controlla se l'editor deve digitare su virgolette o parentesi quadre.","Usa le configurazioni del linguaggio per determinare la chiusura automatica delle virgolette.","Chiudi automaticamente le virgolette solo quando il cursore si trova alla sinistra di uno spazio vuoto.","Controlla se l'editor deve chiudere automaticamente le citazioni dopo che sono state aperte.","L'editor non inserir\xE0 automaticamente il rientro.","L'editor manterr\xE0 il rientro della riga corrente.","L'editor manterr\xE0 il rientro della riga corrente e rispetter\xE0 le parentesi definite dalla lingua.","L'editor manterr\xE0 il rientro della riga corrente, rispetter\xE0 le parentesi definite dalla lingua e richiamer\xE0 le regole onEnterRules speciali definite dalle lingue.","L'editor manterr\xE0 il rientro della riga corrente, rispetter\xE0 le parentesi definite dalla lingua, richiamer\xE0 le regole onEnterRules speciali definite dalle lingue e rispetter\xE0 le regole indentationRules definite dalle lingue.","Controlla se l'editor deve regolare automaticamente il rientro quando gli utenti digitano, incollano, spostano le righe o applicano il rientro.","Usa le configurazioni del linguaggio per determinare quando racchiudere automaticamente le selezioni tra parentesi quadre o virgolette.","Racchiude la selezione tra virgolette ma non tra parentesi quadre.","Racchiude la selezione tra parentesi quadre ma non tra virgolette.","Controlla se l'editor deve racchiudere automaticamente le selezioni quando si digitano virgolette o parentesi quadre.","Emula il comportamento di selezione dei caratteri di tabulazione quando si usano gli spazi per il rientro. La selezione verr\xE0 applicata alle tabulazioni.","Controlla se l'editor visualizza CodeLens.","Controlla la famiglia di caratteri per CodeLens.","Controlla le dimensioni del carattere in pixel per CodeLens. Quando \xE8 impostata su `0`, viene usato il 90% del valore di `#editor.fontSize#`.","Controlla se l'editor deve eseguire il rendering della selezione colori e degli elementi Decorator di tipo colore inline.","Abilita l'uso di mouse e tasti per la selezione delle colonne.","Controlla se l'evidenziazione della sintassi deve essere copiata negli Appunti.","Controllo dello stile di animazione del cursore.","Controlla se l'animazione del cursore con anti-aliasing deve essere abilitata.","Controlla lo stile del cursore.","Controlla il numero minimo di righe iniziali e finali visibili che circondano il cursore. Noto come 'scrollOff' o 'scrollOffset' in altri editor.","`cursorSurroundingLines` viene applicato solo quando \xE8 attivato tramite la tastiera o l'API.","`cursorSurroundingLines` viene sempre applicato.","Controlla quando deve essere applicato `cursorSurroundingLines`.","Controlla la larghezza del cursore quando `#editor.cursorStyle#` \xE8 impostato su `line`.","Controlla se l'editor deve consentire lo spostamento di selezioni tramite trascinamento della selezione.","Moltiplicatore della velocit\xE0 di scorrimento quando si preme `Alt`.","Controlla se per l'editor \xE8 abilitata la riduzione del codice.","Usa una strategia di riduzione specifica della lingua, se disponibile; altrimenti ne usa una basata sui rientri.","Usa la strategia di riduzione basata sui rientri.","Controlla la strategia per il calcolo degli intervalli di riduzione.","Controlla se l'editor deve evidenziare gli intervalli con riduzione del codice.","Controlla se, facendo clic sul contenuto vuoto dopo una riga ridotta, la riga viene espansa.","Controlla la famiglia di caratteri.","Controlla se l'editor deve formattare automaticamente il contenuto incollato. Deve essere disponibile un formattatore che deve essere in grado di formattare un intervallo in un documento.","Controlla se l'editor deve formattare automaticamente la riga dopo la digitazione.","Controlla se l'editor deve eseguire il rendering del margine verticale del glifo. Il margine del glifo viene usato principalmente per il debug.","Controlla se il cursore deve essere nascosto nel righello delle annotazioni.","Controlla se l'editor deve evidenziare la guida con rientro attiva.","Controlla la spaziatura tra le lettere in pixel.","Controlla se la modifica collegata \xE8 abilitata per l'editor. A seconda del linguaggio, i simboli correlati, ad esempio i tag HTML, vengono aggiornati durante la modifica.","Controlla se l'editor deve individuare i collegamenti e renderli selezionabili.","Evidenzia le parentesi graffe corrispondenti.","Moltiplicatore da usare sui valori `deltaX` e `deltaY` degli eventi di scorrimento della rotellina del mouse.","Ingrandisce il carattere dell'editor quando si usa la rotellina del mouse e si tiene premuto 'CTRL'.","Unire i cursori multipli se sovrapposti.","Rappresenta il tasto 'Control' in Windows e Linux e il tasto 'Comando' in macOS.","Rappresenta il tasto 'Alt' in Windows e Linux e il tasto 'Opzione' in macOS.","Modificatore da usare per aggiungere pi\xF9 cursori con il mouse. I gesti del mouse Vai alla definizione e Apri il collegamento si adatteranno in modo da non entrare in conflitto con il modificatore di selezione multipla. [Altre informazioni](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","Ogni cursore incolla una singola riga del testo.","Ogni cursore incolla il testo completo.","Controlla l'operazione Incolla quando il conteggio delle righe del testo incollato corrisponde al conteggio dei cursori.","Controlla se l'editor deve evidenziare le occorrenze di simboli semantici.","Controlla se deve essere disegnato un bordo intorno al righello delle annotazioni.","Sposta lo stato attivo sull'albero quando si apre l'anteprima","Sposta lo stato attivo sull'editor quando si apre l'anteprima","Controlla se spostare lo stato attivo sull'editor inline o sull'albero nel widget di anteprima.","Controlla se il movimento del mouse Vai alla definizione consente sempre di aprire il widget di anteprima.","Controlla il ritardo in millisecondi dopo il quale verranno visualizzati i suggerimenti rapidi.","Controlla se l'editor viene rinominato automaticamente in base al tipo.","Deprecata. In alternativa, usare `editor.linkedEditing`.","Controlla se l'editor deve eseguire il rendering dei caratteri di controllo.","Controlla se l'editor deve eseguire il rendering delle guide con rientro.","Esegue il rendering dell'ultimo numero di riga quando il file termina con un carattere di nuova riga.","Mette in evidenza sia la barra di navigazione sia la riga corrente.","Controlla in che modo l'editor deve eseguire il rendering dell'evidenziazione di riga corrente.","Controlla se l'editor deve eseguire il rendering dell'evidenziazione della riga corrente solo quando l'editor ha lo stato attivo","Esegue il rendering dei caratteri di spazio vuoto ad eccezione dei singoli spazi tra le parole.","Esegui il rendering dei caratteri di spazio vuoto solo nel testo selezionato.","Esegui il rendering solo dei caratteri di spazio vuoto finali","Controlla in che modo l'editor deve eseguire il rendering dei caratteri di spazio vuoto.","Controlla se le selezioni devono avere gli angoli arrotondati.","Controlla il numero di caratteri aggiuntivi oltre i quali l'editor scorrer\xE0 orizzontalmente.","Controlla se l'editor scorrer\xE0 oltre l'ultima riga.","Scorre solo lungo l'asse predominante durante lo scorrimento verticale e orizzontale simultaneo. Impedisce la deviazione orizzontale quando si scorre in verticale su un trackpad.","Controlla se gli appunti primari di Linux devono essere supportati.","Controlla se l'editor deve evidenziare gli elementi corrispondenti simili alla selezione.","Mostra sempre i comandi di riduzione.","Mostra i comandi di riduzione solo quando il mouse \xE8 posizionato sul margine della barra di scorrimento.","Controlla se i controlli di riduzione sul margine della barra di scorrimento vengono visualizzati.","Controllo dissolvenza del codice inutilizzato.","Controlla le variabili deprecate barrate.","Visualizza i suggerimenti del frammento prima degli altri suggerimenti.","Visualizza i suggerimenti del frammento dopo gli altri suggerimenti.","Visualizza i suggerimenti del frammento insieme agli altri suggerimenti.","Non mostrare i suggerimenti del frammento.","Controlla se i frammenti di codice sono visualizzati con altri suggerimenti e il modo in cui sono ordinati.","Controlla se per lo scorrimento dell'editor verr\xE0 usata un'animazione.","Dimensioni del carattere per il widget dei suggerimenti. Se impostato su `0`, viene usato il valore di `#editor.fontSize#`.","Altezza della riga per il widget dei suggerimenti. Se impostato su `0`, viene usato il valore `editor.lineHeight#`. Il valore minimo \xE8 8.","Controlla se i suggerimenti devono essere visualizzati automaticamente durante la digitazione dei caratteri trigger.","Consente di selezionare sempre il primo suggerimento.","Consente di selezionare suggerimenti recenti a meno che continuando a digitare non ne venga selezionato uno, ad esempio `console.| ->; console.log` perch\xE9 `log` \xE8 stato completato di recente.","Consente di selezionare i suggerimenti in base a prefissi precedenti che hanno completato tali suggerimenti, ad esempio `co ->; console` e `con -> const`.","Controlla la modalit\xE0 di preselezione dei suggerimenti durante la visualizzazione dell'elenco dei suggerimenti.","La funzionalit\xE0 di completamento con tasto TAB inserir\xE0 il migliore suggerimento alla pressione del tasto TAB.","Disabilita le funzionalit\xE0 di completamento con tasto TAB.","Completa i frammenti con il tasto TAB quando i rispettivi prefissi corrispondono. Funziona in modo ottimale quando 'quickSuggestions' non \xE8 abilitato.","Abilit\xE0 la funzionalit\xE0 di completamento con tasto TAB.","I caratteri di terminazione di riga insoliti vengono rimossi automaticamente.","I caratteri di terminazione di riga insoliti vengono ignorati.","Prompt per i caratteri di terminazione di riga insoliti da rimuovere.","Rimuovi caratteri di terminazione di riga insoliti che potrebbero causare problemi.","Inserimento ed eliminazione dello spazio vuoto dopo le tabulazioni.","Caratteri che verranno usati come separatori di parola quando si eseguono operazioni o spostamenti correlati a parole.","Il ritorno a capo automatico delle righe non viene mai applicato.","Il ritorno a capo automatico delle righe viene applicato in corrispondenza della larghezza del viewport.","Il ritorno a capo automatico delle righe viene applicato in corrispondenza di `#editor.wordWrapColumn#`.","Il ritorno a capo automatico delle righe viene applicato in corrispondenza della larghezza minima del viewport e di `#editor.wordWrapColumn#`.","Controlla il ritorno a capo automatico delle righe.","Controlla la colonna per il ritorno a capo automatico dell'editor quando il valore di `#editor.wordWrap#` \xE8 `wordWrapColumn` o `bounded`.","Nessun rientro. Le righe con ritorno a capo iniziano dalla colonna 1. ","Le righe con ritorno a capo hanno lo stesso rientro della riga padre.","Le righe con ritorno a capo hanno un rientro di +1 rispetto alla riga padre.","Le righe con ritorno a capo hanno un rientro di +2 rispetto alla riga padre.","Controlla il rientro delle righe con ritorno a capo.","Presuppone che la larghezza sia identica per tutti caratteri. Si tratta di un algoritmo veloce che funziona correttamente per i tipi di carattere a spaziatura fissa e determinati script (come i caratteri latini) in cui i glifi hanno larghezza identica.","Delega il calcolo dei punti di ritorno a capo al browser. Si tratta di un algoritmo lento che potrebbe causare blocchi con file di grandi dimensioni, ma funziona correttamente in tutti gli altri casi.","Controlla l'algoritmo che calcola i punti di ritorno a capo."],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read only","Whether the context is a diff editor","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/model/editStack":["Digitazione"],"vs/editor/common/modes/modesRegistry":["Testo normale"],"vs/editor/common/standaloneStrings":["Nessuna selezione","Riga {0}, colonna {1} ({2} selezionate)","Riga {0}, colonna {1}","{0} selezioni ({1} caratteri selezionati)","{0} selezioni","Modifica dell'impostazione `accessibilitySupport` in `on`.","Apertura della pagina di documentazione sull'accessibilit\xE0 dell'editor.","in un riquadro di sola lettura di un editor diff.","in un riquadro di un editor diff."," in un editor di codice di sola lettura"," in un editor di codice","Per configurare l'editor da ottimizzare per l'utilizzo con un'utilit\xE0 per la lettura dello schermo, premere Comando+E.","Per configurare l'editor da ottimizzare per l'utilizzo con un'utilit\xE0 per la lettura dello schermo, premere CTRL+E.","L'editor \xE8 configurato per essere ottimizzato per l'utilizzo con un'utilit\xE0 per la lettura dello schermo.","L'editor \xE8 configurato per non essere ottimizzato per l'utilizzo con un'utilit\xE0 per la lettura dello schermo, che non viene usata in questo momento.","Premere TAB nell'editor corrente per spostare lo stato attivo sull'elemento con stato attivabile successivo. Per attivare/disattivare questo comportamento, premere {0}.","Premere TAB nell'editor corrente per spostare lo stato attivo sull'elemento con stato attivabile successivo. Il comando {0} non pu\xF2 essere attualmente attivato con un tasto di scelta rapida.","Premere TAB nell'editor corrente per inserire il carattere di tabulazione. Per attivare/disattivare questo comportamento, premere {0}.","Premere TAB nell'editor corrente per inserire il carattere di tabulazione. Il comando {0} non pu\xF2 essere attualmente attivato con un tasto di scelta rapida.","Premere Comando+H per aprire una finestra del browser contenente maggiori informazioni correlate all'accessibilit\xE0 dell'editor.","Premere CTRL+H per aprire una finestra del browser contenente maggiori informazioni correlate all'accessibilit\xE0 dell'editor.","Per chiudere questa descrizione comando e tornare all'editor, premere ESC o MAIUSC+ESC.","Visualizza la Guida sull'accessibilit\xE0","Sviluppatore: Controlla token","Vai a Riga/Colonna...","Mostra tutti i provider di accesso rapido","Riquadro comandi","Mostra ed esegui comandi","Vai al simbolo...","Vai al simbolo per categoria...","Contenuto editor","Premere ALT+F1 per le opzioni di accessibilit\xE0.","Attiva/disattiva tema a contrasto elevato","Effettuate {0} modifiche in {1} file"],"vs/editor/common/view/editorColorRegistry":["Colore di sfondo per l'evidenziazione della riga alla posizione del cursore.","Colore di sfondo per il bordo intorno alla riga alla posizione del cursore.","Colore di sfondo degli intervalli evidenziati, ad esempio dalle funzionalit\xE0 Quick Open e Trova. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo del bordo intorno agli intervalli selezionati.","Colore di sfondo del simbolo evidenziato, ad esempio per passare alla definizione o al simbolo successivo/precedente. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo del bordo intorno ai simboli selezionati.","Colore del cursore dell'editor.","Colore di sfondo del cursore editor. Permette di personalizzare il colore di un carattere quando sovrapposto da un blocco cursore.","Colore dei caratteri di spazio vuoto nell'editor.","Colore delle guide per i rientri dell'editor.","Colore delle guide di indentazione dell'editor attivo","Colore dei numeri di riga dell'editor.","Colore del numero di riga attivo dell'editor","Id \xE8 deprecato. In alternativa usare 'editorLineNumber.activeForeground'.","Colore del numero di riga attivo dell'editor","Colore dei righelli dell'editor.","Colore primo piano delle finestre di CodeLens dell'editor","Colore di sfondo delle parentesi corrispondenti","Colore delle caselle di parentesi corrispondenti","Colore del bordo del righello delle annotazioni.","Colore di sfondo del righello delle annotazioni dell'editor. Viene usato solo quando la minimappa \xE8 abilitata e posizionata sul lato destro dell'editor.","Colore di sfondo della barra di navigazione dell'editor. La barra contiene i margini di glifo e i numeri di riga.","Colore del bordo del codice sorgente non necessario (non usato) nell'editor.",`Opacit\xE0 del codice sorgente non necessario (non usato) nell'editor. Ad esempio, con "#000000c0" il rendering del codice verr\xE0 eseguito con il 75% di opacit\xE0. Per i temi a contrasto elevato, usare il colore del tema 'editorUnnecessaryCode.border' per sottolineare il codice non necessario invece di opacizzarlo.`,"Colore del marcatore del righello delle annotazioni per le evidenziazioni degli intervalli. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore del righello delle annotazioni per gli errori.","Colore del marcatore del righello delle annotazioni per gli avvisi.","Colore del marcatore del righello delle annotazioni per i messaggi di tipo informativo."],"vs/editor/contrib/anchorSelect/anchorSelect":["Ancoraggio della selezione","Ancoraggio impostato alla posizione {0}:{1}","Imposta ancoraggio della selezione","Vai ad ancoraggio della selezione","Seleziona da ancoraggio a cursore","Annulla ancoraggio della selezione"],"vs/editor/contrib/bracketMatching/bracketMatching":["Colore del marcatore del righello delle annotazioni per la corrispondenza delle parentesi.","Vai alla parentesi quadra","Seleziona fino alla parentesi","Vai alla parentesi &&quadra"],"vs/editor/contrib/caretOperations/caretOperations":["Sposta testo selezionato a sinistra","Sposta testo selezionato a destra"],"vs/editor/contrib/caretOperations/transpose":["Trasponi lettere"],"vs/editor/contrib/clipboard/clipboard":["&&Taglia","Taglia","Taglia","&&Copia","Copia","Copia","&&Incolla","Incolla","Incolla","Copia con evidenziazione sintassi"],"vs/editor/contrib/codeAction/codeActionCommands":["Tipo dell'azione codice da eseguire.","Controlla quando vengono applicate le azioni restituite.","Applica sempre la prima azione codice restituita.","Applica la prima azione codice restituita se \xE8 l'unica.","Non applicare le azioni codice restituite.","Controlla se devono essere restituite solo le azioni codice preferite.","Si \xE8 verificato un errore sconosciuto durante l'applicazione dell'azione del codice","Correzione rapida...","Azioni codice non disponibili","Non sono disponibili azioni codice preferite per '{0}'","Non sono disponibili azioni codice per '{0}'","Non sono disponibili azioni codice preferite","Azioni codice non disponibili","Effettua refactoring...","Non sono disponibili refactoring preferiti per '{0}'","Non sono disponibili refactoring per '{0}'","Non sono disponibili refactoring preferiti","Refactoring non disponibili","Azione origine...","Non sono disponibili azioni origine preferite per '{0}'","Non sono disponibili azioni origine per '{0}'","Non sono disponibili azioni origine preferite","Azioni origine non disponibili","Organizza import","Azioni di organizzazione Imports non disponibili","Correggi tutto","Non \xE8 disponibile alcuna azione Correggi tutto","Correzione automatica...","Non sono disponibili correzioni automatiche"],"vs/editor/contrib/codeAction/lightBulbWidget":["Mostra correzioni. Correzione preferita disponibile ({0})","Mostra correzioni ({0})","Mostra correzioni"],"vs/editor/contrib/codelens/codelensController":["Mostra comandi di CodeLens per la riga corrente"],"vs/editor/contrib/comment/comment":["Attiva/disattiva commento per la riga","Attiva/Disattiva commento per la &&riga","Aggiungi commento per la riga","Rimuovi commento per la riga","Attiva/Disattiva commento per il blocco","Attiva/Disattiva commento per il &&blocco"],"vs/editor/contrib/contextmenu/contextmenu":["Mostra il menu di scelta rapida editor"],"vs/editor/contrib/cursorUndo/cursorUndo":["Cursore - Annulla","Cursore - Ripeti"],"vs/editor/contrib/find/findController":["Trova","&&Trova","Trova con selezione","Trova successivo","Trova successivo","Trova precedente","Trova precedente","Trova selezione successiva","Trova selezione precedente","Sostituisci","&&Sostituisci"],"vs/editor/contrib/find/findWidget":["Icona per 'Trova nella selezione' nel widget di ricerca dell'editor.","Icona per indicare che il widget di ricerca dell'editor \xE8 compresso.","Icona per indicare che il widget di ricerca dell'editor \xE8 espanso.","Icona per 'Sostituisci' nel widget di ricerca dell'editor.","Icona per 'Sostituisci tutto' nel widget di ricerca dell'editor.","Icona per 'Trova precedente' nel widget di ricerca dell'editor.","Icona per 'Trova successivo' nel widget di ricerca dell'editor.","Trova","Trova","Corrispondenza precedente","Corrispondenza successiva","Trova nella selezione","Chiudi","Sostituisci","Sostituisci","Sostituisci","Sostituisci tutto","Attiva/Disattiva modalit\xE0 sostituzione","Solo i primi {0} risultati vengono evidenziati, ma tutte le operazioni di ricerca funzionano su tutto il testo.","{0} di {1}","Nessun risultato","{0} trovato","{0} trovati per '{1}'","{0} trovati per '{1}' alla posizione {2}","{0} trovati per '{1}'","Il tasto di scelta rapida CTRL+INVIO ora consente di inserire l'interruzione di linea invece di sostituire tutto. Per eseguire l'override di questo comportamento, \xE8 possibile modificare il tasto di scelta rapida per editor.action.replaceAll."],"vs/editor/contrib/folding/folding":["Espandi","Espandi in modo ricorsivo","Riduci","Attiva/Disattiva riduzione","Riduci in modo ricorsivo","Riduci tutti i blocchi commento","Riduci tutte le regioni","Espandi tutte le regioni","Riduci tutto","Espandi tutto","Livello riduzione {0}","Colore di sfondo degli intervalli con riduzione. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del controllo di riduzione nella barra di navigazione dell'editor."],"vs/editor/contrib/folding/foldingDecorations":["Icona per gli intervalli espansi nel margine del glifo dell'editor.","Icona per gli intervalli compressi nel margine del glifo dell'editor."],"vs/editor/contrib/fontZoom/fontZoom":["Zoom avanti tipo di carattere editor","Zoom indietro tipo di carattere editor","Reimpostazione zoom tipo di carattere editor"],"vs/editor/contrib/format/format":["\xC8 stata apportata 1 modifica di formattazione a riga {0}","Sono state apportate {0} modifiche di formattazione a riga {1}","\xC8 stata apportata 1 modifica di formattazione tra le righe {0} e {1}","Sono state apportate {0} modifiche di formattazione tra le righe {1} e {2}"],"vs/editor/contrib/format/formatActions":["Formatta documento","Formatta selezione"],"vs/editor/contrib/gotoError/gotoError":["Vai al problema successivo (Errore, Avviso, Informazioni)","Icona per il marcatore Vai a successivo.","Vai al problema precedente (Errore, Avviso, Informazioni)","Icona per il marcatore Vai a precedente.","Vai al problema successivo nei file (Errore, Avviso, Informazioni)","&&Problema successivo","Vai al problema precedente nei file (Errore, Avviso, Informazioni)","&&Problema precedente"],"vs/editor/contrib/gotoError/gotoErrorWidget":["Errore","Avviso","Info","Suggerimento","{0} a {1}. ","{0} di {1} problemi","{0} di {1} problema","Colore per gli errori del widget di spostamento tra marcatori dell'editor.","Colore per gli avvisi del widget di spostamento tra marcatori dell'editor.","Colore delle informazioni del widget di navigazione marcatori dell'editor.","Sfondo del widget di spostamento tra marcatori dell'editor."],"vs/editor/contrib/gotoSymbol/goToCommands":["Anteprima","Definizioni","Non \xE8 stata trovata alcuna definizione per '{0}'","Non \xE8 stata trovata alcuna definizione","Vai alla definizione","Vai alla &&definizione","Apri definizione lateralmente","Visualizza in anteprima la definizione","Dichiarazioni","Non \xE8 stata trovata alcuna dichiarazione per '{0}'","Dichiarazione non trovata","Vai a dichiarazione","Vai a &&dichiarazione","Non \xE8 stata trovata alcuna dichiarazione per '{0}'","Dichiarazione non trovata","Anteprima dichiarazione","Definizioni di tipo","Non sono state trovate definizioni di tipi per '{0}'","Non sono state trovate definizioni di tipi","Vai alla definizione di tipo","Vai alla &&definizione di tipo","Anteprima definizione di tipo","Implementazioni","Non sono state trovate implementazioni per '{0}'","Non sono state trovate implementazioni","Vai a implementazioni","Vai a &&Implementazioni","Visualizza implementazioni","Non sono stati trovati riferimenti per '{0}'","Non sono stati trovati riferimenti","Vai a Riferimenti","Vai a &&riferimenti","Riferimenti","Anteprima riferimenti","Riferimenti","Vai a qualsiasi simbolo","Posizioni","Nessun risultato per '{0}'","Riferimenti"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["Fare clic per visualizzare {0} definizioni."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["Caricamento...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} riferimenti","{0} riferimento","Riferimenti"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["anteprima non disponibile","Nessun risultato","Riferimenti"],"vs/editor/contrib/gotoSymbol/referencesModel":["simbolo in {0} alla riga {1} colonna {2}","simbolo in {0} alla riga {1} colonna {2}, {3}","1 simbolo in {0}, percorso completo {1}","{0} simboli in {1}, percorso completo {2}","Non sono stati trovati risultati","Trovato 1 simbolo in {0}","Trovati {0} simboli in {1}","Trovati {0} simboli in {1} file"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["Simbolo {0} di {1}, {2} per il successivo","Simbolo {0} di {1}"],"vs/editor/contrib/hover/hover":["Visualizza passaggio del mouse","Mostra anteprima definizione al passaggio del mouse"],"vs/editor/contrib/hover/markdownHoverParticipant":["Caricamento..."],"vs/editor/contrib/hover/markerHoverParticipant":["View Problem","Non sono disponibili correzioni rapide","Verifica disponibilit\xE0 correzioni rapide...","Non sono disponibili correzioni rapide","Correzione rapida..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["Sostituisci con il valore precedente","Sostituisci con il valore successivo"],"vs/editor/contrib/indentation/indentation":["Converti rientro in spazi","Converti rientro in tabulazioni","Dimensione tabulazione configurata","Seleziona dimensione tabulazione per il file corrente","Imposta rientro con tabulazioni","Imposta rientro con spazi","Rileva rientro dal contenuto","Imposta nuovo rientro per righe","Re-Indenta le Linee Selezionate"],"vs/editor/contrib/linesOperations/linesOperations":["Copia la riga in alto","&&Copia la riga in alto","Copia la riga in basso","Co&&pia la riga in basso","Duplica selezione","&&Duplica selezione","Sposta la riga in alto","Sposta la riga in &&alto","Sposta la riga in basso","Sposta la riga in &&basso","Ordinamento righe crescente","Ordinamento righe decrescente","Taglia spazio vuoto finale","Elimina riga","Imposta un rientro per la riga","Riduci il rientro per la riga","Inserisci la riga sopra","Inserisci la riga sotto","Elimina tutto a sinistra","Elimina tutto a destra","Unisci righe","Trasponi caratteri intorno al cursore","Converti in maiuscolo","Converti in minuscolo","Trasforma in Tutte Iniziali Maiuscole","Trasforma in snake case"],"vs/editor/contrib/linkedEditing/linkedEditing":["Avvia modifica collegata","Colore di sfondo quando l'editor viene rinominato automaticamente in base al tipo."],"vs/editor/contrib/links/links":["Esegui il comando","Visita il collegamento","CMD+clic","CTRL+clic","Opzione+clic","ALT+clic","Esegue il comando {0}","Non \xE8 stato possibile aprire questo collegamento perch\xE9 il formato non \xE8 valido: {0}","Non \xE8 stato possibile aprire questo collegamento perch\xE9 manca la destinazione.","Apri collegamento"],"vs/editor/contrib/message/messageController":["Indica se l'editor visualizza attualmente un messaggio inline","Non \xE8 possibile modificare nell'editor di sola lettura"],"vs/editor/contrib/multicursor/multicursor":["Aggiungi cursore sopra","&&Aggiungi cursore sopra","Aggiungi cursore sotto","A&&ggiungi cursore sotto","Aggiungi cursori a fine riga","Aggiungi c&&ursori a fine riga","Aggiungi cursori alla fine","Aggiungi cursori all'inizio","Aggiungi selezione a risultato ricerca successivo","Aggiungi &&occorrenza successiva","Aggiungi selezione a risultato ricerca precedente","Aggiungi occorrenza &&precedente","Sposta ultima selezione a risultato ricerca successivo","Sposta ultima selezione a risultato ricerca precedente","Seleziona tutte le occorrenze del risultato ricerca","Seleziona &&tutte le occorrenze","Cambia tutte le occorrenze"],"vs/editor/contrib/parameterHints/parameterHints":["Attiva i suggerimenti per i parametri"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["Icona per visualizzare il suggerimento del parametro successivo.","Icona per visualizzare il suggerimento del parametro precedente.","{0}, suggerimento"],"vs/editor/contrib/peekView/peekView":["Chiudi","Colore di sfondo dell'area del titolo della visualizzazione rapida.","Colore del titolo della visualizzazione rapida.","Colore delle informazioni del titolo della visualizzazione rapida.","Colore dei bordi e della freccia della visualizzazione rapida.","Colore di sfondo dell'elenco risultati della visualizzazione rapida.","Colore primo piano dei nodi riga nell'elenco risultati della visualizzazione rapida.","Colore primo piano dei nodi file nell'elenco risultati della visualizzazione rapida.","Colore di sfondo della voce selezionata nell'elenco risultati della visualizzazione rapida.","Colore primo piano della voce selezionata nell'elenco risultati della visualizzazione rapida.","Colore di sfondo dell'editor di visualizzazioni rapide.","Colore di sfondo della barra di navigazione nell'editor visualizzazione rapida.","Colore dell'evidenziazione delle corrispondenze nell'elenco risultati della visualizzazione rapida.","Colore dell'evidenziazione delle corrispondenze nell'editor di visualizzazioni rapide.","Bordo dell'evidenziazione delle corrispondenze nell'editor di visualizzazioni rapide."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["Aprire prima un editor di testo per passare a una riga.","Passa a riga {0} e colonna {1}.","Vai alla riga {0}.","Riga corrente: {0}, carattere: {1}. Digitare un numero di riga a cui passare compreso tra 1 e {2}.","Riga corrente: {0}, Carattere: {1}. Digitare un numero di riga a cui passare."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["Per passare a un simbolo, aprire prima un editor di testo con informazioni sui simboli.","L'editor di testo attivo non fornisce informazioni sui simboli.","Non ci sono simboli dell'editor corrispondenti","Non ci sono simboli dell'editor","Apri lateralmente","Apri in basso","simboli ({0})","propriet\xE0 ({0})","metodi ({0})","funzioni ({0})","costruttori ({0})","variabili ({0})","classi ({0})","struct ({0})","eventi ({0})","operatori ({0})","interfacce ({0})","spazi dei nomi ({0})","pacchetti ({0})","parametri di tipo ({0})","moduli ({0})","propriet\xE0 ({0})","enumerazioni ({0})","membri di enumerazione ({0})","stringhe ({0})","file ({0})","matrici ({0})","numeri ({0})","valori booleani ({0})","oggetti ({0})","chiavi ({0})","campi ({0})","costanti ({0})"],"vs/editor/contrib/rename/rename":["Nessun risultato.","Si \xE8 verificato un errore sconosciuto durante la risoluzione del percorso di ridenominazione","Ridenominazione di '{0}'","Ridenominazione di {0}","Correttamente rinominato '{0}' in '{1}'. Sommario: {2}","La ridenominazione non \xE8 riuscita ad applicare le modifiche","La ridenominazione non \xE8 riuscita a calcolare le modifiche","Rinomina simbolo","Abilita/Disabilita l'opzione per visualizzare le modifiche in anteprima prima della ridenominazione"],"vs/editor/contrib/rename/renameInputField":["Consente di rinominare l'input. Digitare il nuovo nome e premere INVIO per eseguire il commit.","{0} per rinominare, {1} per visualizzare in anteprima"],"vs/editor/contrib/smartSelect/smartSelect":["Espandi selezione","Espan&&di selezione","Riduci selezione","&&Riduci selezione"],"vs/editor/contrib/snippet/snippetVariables":["Domenica","Luned\xEC","Marted\xEC","Mercoled\xEC","Gioved\xEC","Venerd\xEC","Sabato","Dom","Lun","Mar","Mer","Gio","Ven","Sab","Gennaio","Febbraio","Marzo","Aprile","Mag","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre","Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],"vs/editor/contrib/suggest/suggestController":["In seguito all'accettazione di '{0}' sono state apportate altre {1} modifiche","Attiva suggerimento","Inserisci","Inserisci","Sostituisci","Sostituisci","Inserisci","nascondi dettagli","mostra dettagli","Reimposta le dimensioni del widget dei suggerimenti"],"vs/editor/contrib/suggest/suggestWidget":["Colore di sfondo del widget dei suggerimenti.","Colore del bordo del widget dei suggerimenti.","Colore primo piano del widget dei suggerimenti.","Colore di sfondo della voce selezionata del widget dei suggerimenti.","Colore delle evidenziazioni corrispondenze nel widget dei suggerimenti.","Caricamento...","Non ci sono suggerimenti.","{0}, documenti: {1}","Suggerisci"],"vs/editor/contrib/suggest/suggestWidgetDetails":["Chiudi","Caricamento..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["Icona per visualizzare altre informazioni nel widget dei suggerimenti.","Altre informazioni"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["Colore primo piano per i simboli di matrice. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli booleani. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di classe. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di colore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di costante. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di costruttore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di enumeratore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di membro di enumeratore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di evento. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di campo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di file. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di cartella. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di funzione. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di interfaccia. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di chiave. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di parola chiave. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di metodo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di modulo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di spazio dei nomi. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli Null. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli numerici. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di oggetto. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di operatore. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di pacchetto. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di propriet\xE0. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di riferimento. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di frammento. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di stringa. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di struct. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di testo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di parametro di tipo. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di unit\xE0. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti.","Colore primo piano per i simboli di variabile. Questi simboli vengono visualizzati nella struttura, nell'elemento di navigazione e nel widget dei suggerimenti."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["Attiva/Disattiva l'uso di TAB per spostare lo stato attivo","Se si preme TAB, lo stato attivo verr\xE0 spostato sull'elemento con stato attivabile successivo.","Se si preme TAB, verr\xE0 inserito il carattere di tabulazione"],"vs/editor/contrib/tokenization/tokenization":["Sviluppatore: Forza retokenizzazione"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["Caratteri di terminazione di riga insoliti","Sono stati rilevati caratteri di terminazione di riga insoliti","Questo file contiene uno o pi\xF9 caratteri di terminazione di riga insoliti, come separatore di riga (LS) o separatore di paragrafo (PS).\r\n\r\n\xC8 consigliabile rimuoverli dal file. \xC8 possibile configurare questa opzione tramite `editor.unusualLineTerminators`.","Correggi questo file","Ignora il problema per questo file"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["Colore di sfondo di un simbolo durante l'accesso in lettura, ad esempio durante la lettura di una variabile. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo di un simbolo durante l'accesso in scrittura, ad esempio durante la scrittura in una variabile. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del bordo di un simbolo durante l'accesso in lettura, ad esempio durante la lettura di una variabile.","Colore del bordo di un simbolo durante l'accesso in scrittura, ad esempio durante la scrittura in una variabile.","Colore del marcatore del righello delle annotazioni per le evidenziazioni dei simboli. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore del righello delle annotazioni per le evidenziazioni dei simboli di accesso in scrittura. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Vai al prossimo simbolo evidenziato","Vai al precedente simbolo evidenziato","Attiva/disattiva evidenziazione simbolo"],"vs/editor/contrib/wordOperations/wordOperations":["Elimina parola"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["Override configurazione predefinita del linguaggio","Consente di configurare le impostazioni dell'editor di cui eseguire l'override per un linguaggio.","Questa impostazione non supporta la configurazione per lingua.","Non \xE8 possibile registrare una propriet\xE0 vuota","Non \xE8 possibile registrare '{0}'. Corrisponde al criterio di propriet\xE0 '\\\\[.*\\\\]$' per la descrizione delle impostazioni dell'editor specifiche del linguaggio. Usare il contributo 'configurationDefaults'.","Non \xE8 possibile registrare '{0}'. Questa propriet\xE0 \xE8 gi\xE0 registrata."],"vs/platform/contextkey/browser/contextKeyService":["Comando che restituisce informazioni sulle chiavi di contesto"],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["\xC8 stato premuto ({0}). In attesa del secondo tasto...","La combinazione di tasti ({0}, {1}) non \xE8 un comando."],"vs/platform/list/browser/listService":["Workbench","Rappresenta il tasto 'Control' in Windows e Linux e il tasto 'Comando' in macOS.","Rappresenta il tasto 'Alt' in Windows e Linux e il tasto 'Opzione' in macOS.","Il modificatore da utilizzare per aggiungere un elemento di alberi e liste ad una selezione multipla con il mouse (ad esempio in Esplora Risorse, apre gli editor e le viste scm). Le gesture del mouse 'Apri a lato' - se supportate - si adatteranno in modo da non creare conflitti con il modificatore di selezione multipla.","Controls how to open items in trees and lists using the mouse (if supported). Note that some trees and lists might choose to ignore this setting if it is not applicable.","Controlla se elenchi e alberi supportano lo scorrimento orizzontale nell'area di lavoro. Avviso: l'attivazione di questa impostazione pu\xF2 influire sulle prestazioni.","Controlla il rientro dell'albero in pixel.","Controlla se l'albero deve eseguire il rendering delle guide per i rientri.","Controlla se elenchi e alberi prevedono lo scorrimento uniforme.","Con lo stile di spostamento da tastiera simple lo stato attivo si trova sugli elementi che corrispondono all'input da tastiera. L'abbinamento viene effettuato solo in base ai prefissi.","Con lo stile di spostamento da tastiera highlight vengono evidenziati gli elementi corrispondenti all'input da tastiera. Spostandosi ulteriormente verso l'alto o verso il basso ci si sposter\xE0 solo negli elementi evidenziati.","Con lo stile di spostamento da tastiera filter verranno filtrati e nascosti tutti gli elementi che non corrispondono all'input da tastiera.","Controlla lo stile di spostamento da tastiera per elenchi e alberi nel workbench. Le opzioni sono: simple, highlight e filter.","Controlla se gli spostamenti da tastiera per elenchi e alberi vengono attivati semplicemente premendo un tasto. Se \xE8 impostato su `false`, gli spostamenti da tastiera vengono attivati solo durante l'esecuzione del comando `list.toggleKeyboardNavigation`, al quale \xE8 possibile assegnare un tasto di scelta rapida.","Controlla l'espansione delle cartelle di alberi quando si fa clic sui nomi delle cartelle. Tenere presente che alcuni alberi ed elenchi potrebbero scegliere di ignorare questa impostazione se non \xE8 applicabile."],"vs/platform/markers/common/markers":["Errore","Avviso","Info"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","usate di recente","altri comandi","Il comando '{0}' ha restituito un errore ({1})"],"vs/platform/quickinput/browser/helpQuickAccess":["comandi globali","comandi dell'editor","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["Colore primo piano generale. Questo colore viene usato solo se non \xE8 sostituito da quello di un componente.","Colore primo piano globale per i messaggi di errore. Questo colore viene usato solo se non \xE8 sostituito da quello di un componente.","Colore predefinito per le icone nel workbench.","Colore del bordo globale per gli elementi evidenziati. Questo colore viene usato solo se non \xE8 sostituito da quello di un componente.","Un bordo supplementare attorno agli elementi per contrastarli maggiormente rispetto agli altri.","Un bordo supplementare intorno agli elementi attivi per contrastarli maggiormente rispetto agli altri.","Colore primo piano dei link nel testo.","Colore di sfondo per i blocchi di codice nel testo.","Colore ombreggiatura dei widget, ad es. Trova/Sostituisci all'interno dell'editor.","Sfondo della casella di input.","Primo piano della casella di input.","Bordo della casella di input.","Colore del bordo di opzioni attivate nei campi di input.","Colore di sfondo di opzioni attivate nei campi di input.","Colore primo piano di opzioni attivate nei campi di input.","Colore di sfondo di convalida dell'input di tipo Informazione.","Colore primo piano di convalida dell'input di tipo Informazione.","Colore del bordo della convalida dell'input di tipo Informazione.","Colore di sfondo di convalida dell'input di tipo Avviso.","Colore primo piano di convalida dell'input di tipo Avviso.","Colore del bordo della convalida dell'input di tipo Avviso.","Colore di sfondo di convalida dell'input di tipo Errore.","Colore primo piano di convalida dell'input di tipo Errore.","Colore del bordo della convalida dell'input di tipo Errore.","Sfondo dell'elenco a discesa.","Primo piano dell'elenco a discesa.","Colore primo piano del pulsante.","Colore di sfondo del pulsante.","Colore di sfondo del pulsante al passaggio del mouse.","Colore di sfondo del badge. I badge sono piccole etichette informative, ad esempio per mostrare il conteggio dei risultati della ricerca.","Colore primo piano del badge. I badge sono piccole etichette informative, ad esempio per mostrare il conteggio dei risultati di una ricerca.","Ombra della barra di scorrimento per indicare lo scorrimento della visualizzazione.","Colore di sfondo del cursore della barra di scorrimento.","Colore di sfondo del cursore della barra di scorrimento al passaggio del mouse.","Colore di sfondo del cursore della barra di scorrimento quando si fa clic con il mouse.","Colore di sfondo dell'indicatore di stato che pu\xF2 essere mostrato per operazioni a esecuzione prolungata.","Colore di sfondo del testo dell'errore nell'editor. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore primo piano degli indicatori di errore nell'editor.","Colore del bordo delle caselle di errore nell'editor.","Colore di sfondo del testo dell'avviso nell'editor. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore primo piano degli indicatori di avviso nell'editor.","Colore del bordo delle caselle di avviso nell'editor.","Colore di sfondo del testo delle informazioni nell'editor. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore primo piano degli indicatori di informazioni nell'editor.","Colore del bordo delle caselle informative nell'editor.","Colore primo piano degli indicatori di suggerimento nell'editor.","Colore del bordo delle caselle dei suggerimenti nell'editor.","Colore di sfondo dell'editor.","Colore primo piano predefinito dell'editor.","Colore di sfondo dei widget dell'editor, ad esempio Trova/Sostituisci.","Colore primo piano dei widget dell'editor, ad esempio Trova/Sostituisci.","Colore del bordo dei widget dell'editor. Il colore viene usato solo se il widget sceglie di avere un bordo e se il colore non \xE8 sottoposto a override da un widget.","Colore del bordo della barra di ridimensionamento dei widget dell'editor. Il colore viene usato solo se il widget sceglie di avere un bordo di ridimensionamento e se il colore non \xE8 sostituito da quello di un widget.","Colore di sfondo di Selezione rapida. Il widget Selezione rapida \xE8 il contenitore di selezioni quali il riquadro comandi.","Colore primo piano di Selezione rapida. Il widget Selezione rapida \xE8 il contenitore di selezioni quali il riquadro comandi.","Colore di sfondo del titolo di Selezione rapida. Il widget Selezione rapida \xE8 il contenitore di selezioni quali il riquadro comandi.","Colore di sfondo di Selezione rapida per l'elemento con lo stato attivo.","Colore di selezione rapida per il raggruppamento delle etichette.","Colore di selezione rapida per il raggruppamento dei bordi.","Colore della selezione dell'editor.","Colore del testo selezionato per il contrasto elevato.","Colore della selezione in un editor inattivo. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore delle aree con lo stesso contenuto della selezione. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del bordo delle regioni con lo stesso contenuto della selezione.","Colore della corrispondenza di ricerca corrente.","Colore degli altri risultati della ricerca. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore dell'intervallo di limite della ricerca. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del bordo della corrispondenza della ricerca corrente.","Colore del bordo delle altre corrispondenze della ricerca.","Colore del bordo dell'intervallo che limita la ricerca. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Evidenziazione sotto la parola per cui \xE8 visualizzata un'area sensibile al passaggio del mouse. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo dell'area sensibile al passaggio del mouse dell'editor.","Colore primo piano dell'area sensibile al passaggio del mouse dell'editor.","Colore del bordo dell'area sensibile al passaggio del mouse dell'editor.","Colore di sfondo della barra di stato sensibile al passaggio del mouse dell'editor.","Colore dei collegamenti attivi.","Colore primo piano dei suggerimenti inline","Colore di sfondo dei suggerimenti inline","Colore usato per l'icona delle azioni con lampadina.","Colore usato per l'icona delle azioni di correzione automatica con lampadina.","Colore di sfondo per il testo che \xE8 stato inserito. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore di sfondo per il testo che \xE8 stato rimosso. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del contorno del testo che \xE8 stato inserito.","Colore del contorno del testo che \xE8 stato rimosso.","Colore del bordo tra due editor di testo.","Colore del riempimento diagonale dell'editor diff. Il riempimento diagonale viene usato nelle visualizzazioni diff affiancate.","Colore di sfondo dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore primo piano dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore del contorno dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore di sfondo dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore primo piano dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 attivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore di sfondo dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore primo piano dell'elenco/albero per l'elemento selezionato quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Colore di sfondo dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, uno inattivo no.","Colore del contorno dell'elenco/albero per l'elemento con lo stato attivo quando l'elenco/albero \xE8 inattivo. Un elenco/albero attivo ha lo stato attivo della tastiera, a differenza di uno inattivo.","Sfondo dell'elenco/albero al passaggio del mouse sugli elementi.","Primo piano dell'elenco/albero al passaggio del mouse sugli elementi.","Sfondo dell'elenco/albero durante il trascinamento degli elementi selezionati.","Colore primo piano Elenco/Struttura ad albero delle occorrenze trovate durante la ricerca nell'Elenco/Struttura ad albero.","Colore di sfondo del widget del filtro per tipo in elenchi e alberi.","Colore del contorno del widget del filtro per tipo in elenchi e alberi.","Colore del contorno del widget del filtro per tipo in elenchi e alberi quando non sono presenti corrispondenze.","Colore del tratto dell'albero per le guide per i rientri.","Colore del tratto dell'albero per le guide per i rientri.","Colore del bordo del menu.","Colore primo piano delle voci di menu.","Colore di sfondo delle voci di menu.","Colore primo piano della voce di menu selezionata nei menu.","Colore di sfondo della voce di menu selezionata nei menu.","Colore del bordo della voce di menu selezionata nei menu.","Colore di un elemento separatore delle voci di menu.","Colore di sfondo dell'evidenziazione della tabulazione di un frammento.","Colore del bordo dell'evidenziazione della tabulazione di un frammento.","Colore di sfondo dell'evidenziazione della tabulazione finale di un frammento.","Colore del bordo dell'evidenziazione della tabulazione finale di un frammento.","Colore del marcatore del righello delle annotazioni per la ricerca di corrispondenze. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore del righello delle annotazioni per le evidenziazioni delle selezioni. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.","Colore del marcatore della minimappa per la ricerca delle corrispondenze.","Colore del marcatore della minimappa per la selezione dell'editor.","Colore del marcatore della minimappa per gli errori.","Colore del marcatore della minimappa per gli avvisi.","Colore di sfondo della minimappa.","Colore di sfondo del dispositivo di scorrimento della minimappa.","Colore di sfondo del dispositivo di scorrimento della minimappa al passaggio del mouse.","Colore di sfondo del dispositivo di scorrimento della minimappa quando si fa clic con il mouse.","Colore usato per l'icona di errore dei problemi.","Colore usato per l'icona di avviso dei problemi.","Colore usato per l'icona informazioni dei problemi."],"vs/platform/theme/common/iconRegistry":["ID del tipo di carattere da usare. Se non \xE8 impostato, viene usato il tipo di carattere definito per primo.","Tipo di carattere associato alla definizione di icona.","Icona dell'azione di chiusura nei widget."],"vs/platform/undoRedo/common/undoRedoService":["I file seguenti sono stati chiusi e modificati nel disco: {0}.","I file seguenti sono stati modificati in modo incompatibile: {0}.","Non \xE8 stato possibile annullare '{0}' in tutti i file. {1}","Non \xE8 stato possibile annullare '{0}' in tutti i file. {1}","Non \xE8 stato possibile annullare '{0}' in tutti i file perch\xE9 sono state apportate modifiche a {1}","Non \xE8 stato possibile annullare '{0}' su tutti i file perch\xE9 \xE8 gi\xE0 in esecuzione un'operazione di annullamento o ripetizione su {1}","Non \xE8 stato possibile annullare '{0}' su tutti i file perch\xE9 nel frattempo \xE8 stata eseguita un'operazione di annullamento o ripetizione","Annullare '{0}' in tutti i file?","Annulla in {0} file","Annulla questo file","Annulla","Non \xE8 stato possibile annullare '{0}' perch\xE9 \xE8 gi\xE0 in esecuzione un'operazione di annullamento o ripetizione.","Annullare '{0}'?","Annulla","Annulla","Non \xE8 stato possibile ripetere '{0}' in tutti i file. {1}","Non \xE8 stato possibile ripetere '{0}' in tutti i file. {1}","Non \xE8 stato possibile ripetere '{0}' in tutti i file perch\xE9 sono state apportate modifiche a {1}","Non \xE8 stato possibile ripetere l'operazione '{0}' su tutti i file perch\xE9 \xE8 gi\xE0 in esecuzione un'operazione di annullamento o ripetizione sull'elenco di file {1}","Non \xE8 stato possibile ripetere '{0}' su tutti i file perch\xE9 nel frattempo \xE8 stata eseguita un'operazione di annullamento o ripetizione","Non \xE8 stato possibile ripetere '{0}' perch\xE9 \xE8 gi\xE0 in esecuzione un'operazione di annullamento o ripetizione."]}); diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.it.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.it.js.gz new file mode 100644 index 0000000..2612d9e Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.it.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ja.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ja.js new file mode 100644 index 0000000..009489c --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ja.js @@ -0,0 +1,8 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.ja",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["\u5165\u529B"],"vs/base/browser/ui/findinput/findInputCheckboxes":["\u5927\u6587\u5B57\u3068\u5C0F\u6587\u5B57\u3092\u533A\u5225\u3059\u308B","\u5358\u8A9E\u5358\u4F4D\u3067\u691C\u7D22\u3059\u308B","\u6B63\u898F\u8868\u73FE\u3092\u4F7F\u7528\u3059\u308B"],"vs/base/browser/ui/findinput/replaceInput":["\u5165\u529B","\u4FDD\u6301\u3059\u308B"],"vs/base/browser/ui/iconLabel/iconLabel":["\u8AAD\u307F\u8FBC\u307F\u4E2D..."],"vs/base/browser/ui/inputbox/inputBox":["\u30A8\u30E9\u30FC: {0}","\u8B66\u544A: {0}","\u60C5\u5831: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\u30D0\u30A4\u30F3\u30C9\u306A\u3057"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["\u30AF\u30EA\u30A2","\u578B\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u7121\u52B9\u306B\u3059\u308B","\u578B\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u6709\u52B9\u306B\u3059\u308B","\u8981\u7D20\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","{1} \u500B\u306E\u8981\u7D20\u306E\u3046\u3061 {0} \u500B\u306E\u8981\u7D20\u304C\u4E00\u81F4\u3057\u307E\u3057\u305F"],"vs/base/common/actions":["(\u7A7A)"],"vs/base/common/errorMessage":["{0}: {1}","\u30B7\u30B9\u30C6\u30E0 \u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F ({0})","\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30ED\u30B0\u3067\u8A73\u7D30\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30ED\u30B0\u3067\u8A73\u7D30\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002","{0} (\u5408\u8A08 {1} \u30A8\u30E9\u30FC)","\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30ED\u30B0\u3067\u8A73\u7D30\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"],"vs/base/common/keybindingLabels":["Ctrl","Shift","Alt","Windows","Ctrl","Shift","Alt","Super","Control","Shift","Alt","\u30B3\u30DE\u30F3\u30C9","Control","Shift","Alt","Windows","Control","Shift","Alt","Super"],"vs/base/parts/quickinput/browser/quickInput":["\u623B\u308B","{0}/{1}","\u5165\u529B\u3059\u308B\u3068\u7D50\u679C\u304C\u7D5E\u308A\u8FBC\u307E\u308C\u307E\u3059\u3002","{0} \u4EF6\u306E\u7D50\u679C","{0} \u500B\u9078\u629E\u6E08\u307F","OK","\u30AB\u30B9\u30BF\u30E0","\u623B\u308B ({0})","\u623B\u308B"],"vs/base/parts/quickinput/browser/quickInputList":["\u30AF\u30A4\u30C3\u30AF\u5165\u529B"],"vs/editor/browser/controller/coreCommands":["\u9577\u3044\u884C\u306B\u79FB\u52D5\u3057\u3066\u3082\u884C\u672B\u306B\u4F4D\u7F6E\u3057\u307E\u3059","\u9577\u3044\u884C\u306B\u79FB\u52D5\u3057\u3066\u3082\u884C\u672B\u306B\u4F4D\u7F6E\u3057\u307E\u3059"],"vs/editor/browser/controller/textAreaHandler":["\u30A8\u30C7\u30A3\u30BF\u30FC","\u3053\u306E\u6642\u70B9\u3067\u306F\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30A2\u30AF\u30BB\u30B9\u3067\u304D\u307E\u305B\u3093\u3002\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u8868\u793A\u3059\u308B\u306B\u306F\u3001{0} \u3092\u62BC\u3057\u307E\u3059\u3002"],"vs/editor/browser/core/keybindingCancellation":["\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u53D6\u308A\u6D88\u3057\u53EF\u80FD\u306A\u64CD\u4F5C ('\u53C2\u7167\u3092\u3053\u3053\u306B\u8868\u793A' \u306A\u3069) \u3092\u5B9F\u884C\u3059\u308B\u304B\u3069\u3046\u304B"],"vs/editor/browser/editorExtensions":["\u5143\u306B\u623B\u3059(&&U)","\u5143\u306B\u623B\u3059","\u3084\u308A\u76F4\u3057(&&R)","\u3084\u308A\u76F4\u3057","\u3059\u3079\u3066\u9078\u629E(&&S)","\u3059\u3079\u3066\u3092\u9078\u629E"],"vs/editor/browser/widget/codeEditorWidget":["\u30AB\u30FC\u30BD\u30EB\u306E\u6570\u306F {0} \u500B\u306B\u5236\u9650\u3055\u308C\u3066\u3044\u307E\u3059\u3002"],"vs/editor/browser/widget/diffEditorWidget":["\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u633F\u5165\u3092\u793A\u3059\u7DDA\u306E\u88C5\u98FE\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u524A\u9664\u3092\u793A\u3059\u7DDA\u306E\u88C5\u98FE\u3002","\u4E00\u65B9\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u5927\u304D\u3059\u304E\u308B\u305F\u3081\u3001\u30D5\u30A1\u30A4\u30EB\u3092\u6BD4\u8F03\u3067\u304D\u307E\u305B\u3093\u3002"],"vs/editor/browser/widget/diffReview":["\u5DEE\u5206\u30EC\u30D3\u30E5\u30FC\u3067\u306E '\u633F\u5165' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u5DEE\u5206\u30EC\u30D3\u30E5\u30FC\u3067\u306E '\u524A\u9664' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u5DEE\u5206\u30EC\u30D3\u30E5\u30FC\u3067\u306E '\u9589\u3058\u308B' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u9589\u3058\u308B","\u5909\u66F4\u3055\u308C\u305F\u884C\u306F\u3042\u308A\u307E\u305B\u3093","1 \u884C\u304C\u5909\u66F4\u3055\u308C\u307E\u3057\u305F","{0} \u884C\u304C\u5909\u66F4\u3055\u308C\u307E\u3057\u305F","\u76F8\u9055 {0}/{1}: \u5143\u306E\u884C {2}\u3001{3}\u3002\u5909\u66F4\u3055\u308C\u305F\u884C {4}\u3001{5}","\u7A7A\u767D","{0} \u5909\u66F4\u3055\u308C\u3066\u3044\u306A\u3044\u884C {1}","{0} \u5143\u306E\u884C {1} \u5909\u66F4\u3055\u308C\u305F\u884C {2}","+ {0} \u5909\u66F4\u3055\u308C\u305F\u884C {1}","- {0} \u5143\u306E\u884C {1}","\u6B21\u306E\u5DEE\u5206\u306B\u79FB\u52D5","\u524D\u306E\u5DEE\u5206\u306B\u79FB\u52D5"],"vs/editor/browser/widget/inlineDiffMargin":["\u524A\u9664\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC","\u524A\u9664\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC","\u524A\u9664\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC ({0})","\u3053\u306E\u5909\u66F4\u3092\u5143\u306B\u623B\u3059","\u524A\u9664\u3055\u308C\u305F\u884C\u306E\u30B3\u30D4\u30FC ({0})"],"vs/editor/common/config/commonEditorConfig":["\u30A8\u30C7\u30A3\u30BF\u30FC","1 \u3064\u306E\u30BF\u30D6\u306B\u76F8\u5F53\u3059\u308B\u30B9\u30DA\u30FC\u30B9\u306E\u6570\u3002`#editor.detectIndentation#` \u304C\u30AA\u30F3\u306E\u5834\u5408\u3001\u3053\u306E\u8A2D\u5B9A\u306F\u30D5\u30A1\u30A4\u30EB \u30B3\u30F3\u30C6\u30F3\u30C4\u306B\u57FA\u3065\u3044\u3066\u4E0A\u66F8\u304D\u3055\u308C\u307E\u3059\u3002","`Tab` \u30AD\u30FC\u3092\u62BC\u3059\u3068\u30B9\u30DA\u30FC\u30B9\u304C\u633F\u5165\u3055\u308C\u307E\u3059\u3002`#editor.detectIndentation#` \u304C\u30AA\u30F3\u306E\u5834\u5408\u3001\u3053\u306E\u8A2D\u5B9A\u306F\u30D5\u30A1\u30A4\u30EB \u30B3\u30F3\u30C6\u30F3\u30C4\u306B\u57FA\u3065\u3044\u3066\u4E0A\u66F8\u304D\u3055\u308C\u307E\u3059\u3002","\u30D5\u30A1\u30A4\u30EB\u304C\u30D5\u30A1\u30A4\u30EB\u306E\u5185\u5BB9\u306B\u57FA\u3065\u3044\u3066\u958B\u304B\u308C\u308B\u5834\u5408\u3001`#editor.tabSize#` \u3068 `#editor.insertSpaces#` \u3092\u81EA\u52D5\u7684\u306B\u691C\u51FA\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u81EA\u52D5\u633F\u5165\u3055\u308C\u305F\u672B\u5C3E\u306E\u7A7A\u767D\u3092\u524A\u9664\u3057\u307E\u3059\u3002","\u5927\u304D\u306A\u30D5\u30A1\u30A4\u30EB\u3067\u30E1\u30E2\u30EA\u304C\u96C6\u4E2D\u3059\u308B\u7279\u5B9A\u306E\u6A5F\u80FD\u3092\u7121\u52B9\u306B\u3059\u308B\u305F\u3081\u306E\u7279\u5225\u306A\u51E6\u7406\u3002","\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5185\u306E\u5358\u8A9E\u306B\u57FA\u3065\u3044\u3066\u5165\u529B\u5019\u88DC\u3092\u8A08\u7B97\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u304B\u3089\u306E\u307F\u5358\u8A9E\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u540C\u3058\u8A00\u8A9E\u306E\u958B\u3044\u3066\u3044\u308B\u3059\u3079\u3066\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u304B\u3089\u5358\u8A9E\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u958B\u3044\u3066\u3044\u308B\u3059\u3079\u3066\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u304B\u3089\u5358\u8A9E\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u5358\u8A9E\u30D9\u30FC\u30B9\u306E\u88DC\u5B8C\u304C\u8A08\u7B97\u3055\u308C\u308B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u306E\u5F37\u8ABF\u8868\u793A\u304C\u3059\u3079\u3066\u306E\u914D\u8272\u30C6\u30FC\u30DE\u306B\u3064\u3044\u3066\u6709\u52B9\u306B\u306A\u308A\u307E\u3057\u305F\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u306E\u5F37\u8ABF\u8868\u793A\u304C\u3059\u3079\u3066\u306E\u914D\u8272\u30C6\u30FC\u30DE\u306B\u3064\u3044\u3066\u7121\u52B9\u306B\u306A\u308A\u307E\u3057\u305F\u3002","\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u306E\u5F37\u8ABF\u8868\u793A\u306F\u3001\u73FE\u5728\u306E\u914D\u8272\u30C6\u30FC\u30DE\u306E 'semanticHighlighting' \u8A2D\u5B9A\u306B\u3088\u3063\u3066\u69CB\u6210\u3055\u308C\u3066\u3044\u307E\u3059\u3002","semanticHighlighting \u3092\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u308B\u8A00\u8A9E\u3067\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u30C0\u30D6\u30EB\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u304B\u3001`Escape` \u30AD\u30FC\u3092\u62BC\u3057\u3066\u3082\u3001\u30D4\u30FC\u30AF \u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u958B\u3044\u305F\u307E\u307E\u306B\u3057\u307E\u3059\u3002","\u3053\u306E\u9577\u3055\u3092\u8D8A\u3048\u308B\u884C\u306F\u3001\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u4E0A\u306E\u7406\u7531\u306B\u3088\u308A\u30C8\u30FC\u30AF\u30F3\u5316\u3055\u308C\u307E\u305B\u3093\u3002","\u5DEE\u5206\u8A08\u7B97\u304C\u53D6\u308A\u6D88\u3055\u308C\u305F\u5F8C\u306E\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8 (\u30DF\u30EA\u79D2\u5358\u4F4D)\u3002\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u306A\u3057\u306B\u306F 0 \u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u5DEE\u5206\u3092\u6A2A\u306B\u4E26\u3079\u3066\u8868\u793A\u3059\u308B\u304B\u3001\u884C\u5185\u306B\u8868\u793A\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u5148\u982D\u307E\u305F\u306F\u672B\u5C3E\u306E\u7A7A\u767D\u6587\u5B57\u306E\u5909\u66F4\u3092\u7121\u8996\u3057\u307E\u3059\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u8FFD\u52A0/\u524A\u9664\u3055\u308C\u305F\u5909\u66F4\u306B +/- \u30A4\u30F3\u30B8\u30B1\u30FC\u30BF\u30FC\u3092\u793A\u3059\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 CodeLens \u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u884C\u3092\u6298\u308A\u8FD4\u3057\u307E\u305B\u3093\u3002","\u884C\u3092\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u306E\u5E45\u3067\u6298\u308A\u8FD4\u3057\u307E\u3059\u3002","\u884C\u306F\u3001`#editor.wordWrap#` \u8A2D\u5B9A\u306B\u5F93\u3063\u3066\u6298\u308A\u8FD4\u3055\u308C\u307E\u3059\u3002"],"vs/editor/common/config/editorOptions":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u304C\u3044\u3064\u63A5\u7D9A\u3055\u308C\u305F\u304B\u3092\u691C\u51FA\u3059\u308B\u305F\u3081\u306B\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0 API \u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u6C38\u7D9A\u7684\u306B\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u3067\u306E\u4F7F\u7528\u5411\u3051\u306B\u6700\u9069\u5316\u3055\u308C\u307E\u3059\u3002\u5358\u8A9E\u306E\u6298\u308A\u8FD4\u3057\u306F\u7121\u52B9\u306B\u306A\u308A\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u5411\u3051\u306B\u6700\u9069\u5316\u3055\u308C\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u306B\u6700\u9069\u5316\u3055\u308C\u305F\u30E2\u30FC\u30C9\u3067\u5B9F\u884C\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u30AA\u30F3\u306B\u8A2D\u5B9A\u3059\u308B\u3068\u5358\u8A9E\u306E\u6298\u308A\u8FD4\u3057\u304C\u7121\u52B9\u306B\u306A\u308A\u307E\u3059\u3002","\u30B3\u30E1\u30F3\u30C8\u6642\u306B\u7A7A\u767D\u6587\u5B57\u3092\u633F\u5165\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u8FFD\u52A0\u307E\u305F\u306F\u524A\u9664\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u5207\u308A\u66FF\u3048\u3067\u3001\u7A7A\u306E\u884C\u3092\u7121\u8996\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u9078\u629E\u7BC4\u56F2\u3092\u6307\u5B9A\u3057\u306A\u3044\u3067\u30B3\u30D4\u30FC\u3059\u308B\u5834\u5408\u306B\u73FE\u5728\u306E\u884C\u3092\u30B3\u30D4\u30FC\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5165\u529B\u4E2D\u306B\u4E00\u81F4\u3092\u691C\u7D22\u3059\u308B\u305F\u3081\u306B\u30AB\u30FC\u30BD\u30EB\u3092\u30B8\u30E3\u30F3\u30D7\u3055\u305B\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u304B\u3089\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E\u691C\u7D22\u6587\u5B57\u5217\u3092\u4E0E\u3048\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","[\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22] \u3092\u81EA\u52D5\u7684\u306B\u30AA\u30F3\u306B\u3057\u306A\u3044 (\u65E2\u5B9A)","[\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22] \u3092\u5E38\u306B\u81EA\u52D5\u7684\u306B\u30AA\u30F3\u306B\u3059\u308B","\u8907\u6570\u884C\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u3001\u81EA\u52D5\u7684\u306B [\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22] \u3092\u30AA\u30F3\u306B\u3057\u307E\u3059\u3002","[\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22] \u3092\u81EA\u52D5\u7684\u306B\u30AA\u30F3\u306B\u3059\u308B\u6761\u4EF6\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","macOS \u3067\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u5171\u6709\u306E\u691C\u7D22\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u3092\u8AAD\u307F\u53D6\u308A\u307E\u305F\u306F\u5909\u66F4\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E0A\u306B\u884C\u3092\u3055\u3089\u306B\u8FFD\u52A0\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002true \u306E\u5834\u5408\u3001\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u3068\u304D\u306B\u6700\u521D\u306E\u884C\u3092\u8D85\u3048\u3066\u30B9\u30AF\u30ED\u30FC\u30EB\u3067\u304D\u307E\u3059\u3002","\u4EE5\u964D\u3067\u4E00\u81F4\u304C\u898B\u3064\u304B\u3089\u306A\u3044\u5834\u5408\u306B\u3001\u691C\u7D22\u3092\u5148\u982D\u304B\u3089 (\u307E\u305F\u306F\u672B\u5C3E\u304B\u3089) \u81EA\u52D5\u7684\u306B\u518D\u5B9F\u884C\u3059\u308B\u304B\u3069\u3046\u304B\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8\u306E\u5408\u5B57 ('calt' \u304A\u3088\u3073 'liga' \u30D5\u30A9\u30F3\u30C8\u306E\u6A5F\u80FD) \u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3057\u307E\u3059\u3002'font-feature-settings' CSS \u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u8A73\u7D30\u306B\u5236\u5FA1\u3059\u308B\u306B\u306F\u3001\u3053\u308C\u3092\u6587\u5B57\u5217\u306B\u5909\u66F4\u3057\u307E\u3059\u3002","\u660E\u793A\u7684\u306A 'font-feature-settings' CSS \u30D7\u30ED\u30D1\u30C6\u30A3\u3002\u5408\u5B57\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u306E\u304C 1 \u3064\u3060\u3051\u3067\u3042\u308B\u5834\u5408\u306F\u3001\u4EE3\u308F\u308A\u306B\u30D6\u30FC\u30EB\u5024\u3092\u6E21\u3059\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8\u306E\u5408\u5B57\u3084\u30D5\u30A9\u30F3\u30C8\u306E\u6A5F\u80FD\u3092\u69CB\u6210\u3057\u307E\u3059\u3002\u5408\u5B57\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3059\u308B\u30D6\u30FC\u30EB\u5024\u307E\u305F\u306F CSS 'font-feature-settings' \u30D7\u30ED\u30D1\u30C6\u30A3\u306E\u5024\u306E\u6587\u5B57\u5217\u3092\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA (\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D) \u3092\u5236\u5FA1\u3057\u307E\u3059\u3002",'\u4F7F\u7528\u3067\u304D\u308B\u306E\u306F "\u6A19\u6E96" \u304A\u3088\u3073 "\u592A\u5B57" \u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u307E\u305F\u306F 1 \uFF5E 1000 \u306E\u6570\u5B57\u306E\u307F\u3067\u3059\u3002','\u30D5\u30A9\u30F3\u30C8\u306E\u592A\u3055\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002"\u6A19\u6E96" \u304A\u3088\u3073 "\u592A\u5B57" \u306E\u30AD\u30FC\u30EF\u30FC\u30C9\u307E\u305F\u306F 1 \uFF5E 1000 \u306E\u6570\u5B57\u3092\u53D7\u3051\u5165\u308C\u307E\u3059\u3002',"\u7D50\u679C\u306E\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u3092\u8868\u793A (\u65E2\u5B9A)","\u4E3B\u306A\u7D50\u679C\u306B\u79FB\u52D5\u3057\u3001\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u3092\u8868\u793A\u3057\u307E\u3059","\u30D7\u30E9\u30A4\u30DE\u30EA\u7D50\u679C\u306B\u79FB\u52D5\u3057\u3001\u4ED6\u306E\u30E6\u30FC\u30B6\u30FC\u3078\u306E\u30D4\u30FC\u30AF\u30EC\u30B9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3057\u307E\u3059","\u3053\u306E\u8A2D\u5B9A\u306F\u975E\u63A8\u5968\u3067\u3059\u3002\u4EE3\u308F\u308A\u306B\u3001'editor.editor.gotoLocation.multipleDefinitions' \u3084 'editor.editor.gotoLocation.multipleImplementations' \u306A\u3069\u306E\u500B\u5225\u306E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u8907\u6570\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u3042\u308B\u3068\u304D\u306E '\u5B9A\u7FA9\u3078\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8907\u6570\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u3042\u308B\u3068\u304D\u306E '\u578B\u5B9A\u7FA9\u3078\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8907\u6570\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u3042\u308B\u3068\u304D\u306E '\u5BA3\u8A00\u3078\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8907\u6570\u306E\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u3042\u308B\u3068\u304D\u306E '\u5B9F\u88C5\u306B\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30BF\u30FC\u30B2\u30C3\u30C8\u306E\u5834\u6240\u304C\u8907\u6570\u5B58\u5728\u3059\u308B\u5834\u5408\u306E '\u53C2\u7167\u3078\u79FB\u52D5' \u30B3\u30DE\u30F3\u30C9\u306E\u52D5\u4F5C\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","'\u5B9A\u7FA9\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","'\u578B\u5B9A\u7FA9\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","'\u5BA3\u8A00\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","'\u5B9F\u88C5\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","'\u53C2\u7167\u3078\u79FB\u52D5' \u306E\u7D50\u679C\u304C\u73FE\u5728\u306E\u5834\u6240\u3067\u3042\u308B\u5834\u5408\u306B\u5B9F\u884C\u3055\u308C\u308B\u4EE3\u66FF\u30B3\u30DE\u30F3\u30C9 ID\u3002","\u30DB\u30D0\u30FC\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DB\u30D0\u30FC\u3092\u8868\u793A\u5F8C\u306E\u5F85\u3061\u6642\u9593 (\u30DF\u30EA\u79D2) \u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DB\u30D0\u30FC\u306B\u30DE\u30A6\u30B9\u3092\u79FB\u52D5\u3057\u305F\u3068\u304D\u306B\u3001\u30DB\u30D0\u30FC\u3092\u8868\u793A\u3057\u7D9A\u3051\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u96FB\u7403\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002'0' \u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001`#editor.fontSize#` \u306E 90% \u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u30D5\u30A9\u30F3\u30C8 \u30D5\u30A1\u30DF\u30EA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u884C\u306E\u9AD8\u3055\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u306B\u57FA\u3065\u3044\u3066\u884C\u306E\u9AD8\u3055\u3092\u8A08\u7B97\u3059\u308B\u5834\u5408\u306B\u306F\u30010 \u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306E\u30B5\u30A4\u30BA\u306F\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u3068\u540C\u3058\u3067\u3059 (\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059)\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306F\u3001\u5FC5\u8981\u306B\u5FDC\u3058\u3066\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9AD8\u3055\u3092\u57CB\u3081\u308B\u305F\u3081\u3001\u62E1\u5927\u307E\u305F\u306F\u7E2E\u5C0F\u3057\u307E\u3059 (\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u307E\u305B\u3093)\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306F\u5FC5\u8981\u306B\u5FDC\u3058\u3066\u7E2E\u5C0F\u3057\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u3088\u308A\u5927\u304D\u304F\u306A\u308B\u3053\u3068\u306F\u3042\u308A\u307E\u305B\u3093 (\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u307E\u305B\u3093)\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306E\u30B5\u30A4\u30BA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u3092\u8868\u793A\u3059\u308B\u5834\u6240\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7 \u30B9\u30E9\u30A4\u30C0\u30FC\u3092\u8868\u793A\u3059\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306B\u63CF\u753B\u3055\u308C\u308B\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u30B9\u30B1\u30FC\u30EB: 1\u30012\u3001\u307E\u305F\u306F 3\u3002","\u884C\u306B\u30AB\u30E9\u30FC \u30D6\u30ED\u30C3\u30AF\u3067\u306F\u306A\u304F\u5B9F\u969B\u306E\u6587\u5B57\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u8868\u793A\u3059\u308B\u30DF\u30CB\u30DE\u30C3\u30D7\u306E\u6700\u5927\u5E45\u3092\u7279\u5B9A\u306E\u5217\u6570\u306B\u5236\u9650\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E0A\u7AEF\u3068\u6700\u521D\u306E\u884C\u306E\u9593\u306E\u4F59\u767D\u306E\u5927\u304D\u3055\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E0B\u7AEF\u3068\u6700\u5F8C\u306E\u884C\u306E\u9593\u306E\u4F59\u767D\u306E\u5927\u304D\u3055\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5165\u529B\u6642\u306B\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3068\u578B\u60C5\u5831\u3092\u8868\u793A\u3059\u308B\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8 \u30E1\u30CB\u30E5\u30FC\u3092\u5468\u56DE\u3059\u308B\u304B\u3001\u30EA\u30B9\u30C8\u306E\u6700\u5F8C\u3067\u9589\u3058\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6587\u5B57\u5217\u5185\u3067\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u30B3\u30E1\u30F3\u30C8\u5185\u3067\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u6587\u5B57\u5217\u304A\u3088\u3073\u30B3\u30E1\u30F3\u30C8\u5916\u3067\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u5165\u529B\u4E2D\u306B\u5019\u88DC\u3092\u81EA\u52D5\u7684\u306B\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u884C\u756A\u53F7\u306F\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002","\u884C\u756A\u53F7\u306F\u3001\u7D76\u5BFE\u5024\u3068\u3057\u3066\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u884C\u756A\u53F7\u306F\u3001\u30AB\u30FC\u30BD\u30EB\u4F4D\u7F6E\u307E\u3067\u306E\u884C\u6570\u3068\u3057\u3066\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u884C\u756A\u53F7\u306F 10 \u884C\u3054\u3068\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u884C\u756A\u53F7\u306E\u8868\u793A\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u3053\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30EB\u30FC\u30E9\u30FC\u304C\u30EC\u30F3\u30C0\u30EA\u30F3\u30B0\u3059\u308B\u5358\u4E00\u9818\u57DF\u306E\u6587\u5B57\u6570\u3002","\u3053\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30EB\u30FC\u30E9\u30FC\u306E\u8272\u3067\u3059\u3002","\u7279\u5B9A\u306E\u7B49\u5E45\u6587\u5B57\u6570\u306E\u5F8C\u306B\u5782\u76F4\u30EB\u30FC\u30E9\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u8907\u6570\u306E\u30EB\u30FC\u30E9\u30FC\u306B\u306F\u8907\u6570\u306E\u5024\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002\u914D\u5217\u304C\u7A7A\u306E\u5834\u5408\u306F\u30EB\u30FC\u30E9\u30FC\u3092\u8868\u793A\u3057\u307E\u305B\u3093\u3002","\u30AB\u30FC\u30BD\u30EB\u306E\u53F3\u306E\u30C6\u30AD\u30B9\u30C8\u3092\u4E0A\u66F8\u304D\u305B\u305A\u306B\u5019\u88DC\u3092\u633F\u5165\u3057\u307E\u3059\u3002","\u5019\u88DC\u3092\u633F\u5165\u3057\u3001\u30AB\u30FC\u30BD\u30EB\u306E\u53F3\u306E\u30C6\u30AD\u30B9\u30C8\u3092\u4E0A\u66F8\u304D\u3057\u307E\u3059\u3002","\u5165\u529B\u5019\u88DC\u3092\u53D7\u3051\u5165\u308C\u308B\u3068\u304D\u306B\u5358\u8A9E\u3092\u4E0A\u66F8\u304D\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u3053\u308C\u306F\u3001\u3053\u306E\u6A5F\u80FD\u306E\u5229\u7528\u3092\u9078\u629E\u3059\u308B\u62E1\u5F35\u6A5F\u80FD\u306B\u4F9D\u5B58\u3059\u308B\u3053\u3068\u306B\u3054\u6CE8\u610F\u304F\u3060\u3055\u3044\u3002","\u5019\u88DC\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u51E6\u7406\u3068\u4E26\u3073\u66FF\u3048\u3067\u3055\u3055\u3044\u306A\u5165\u529B\u30DF\u30B9\u3092\u8003\u616E\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4E26\u3079\u66FF\u3048\u304C\u30AB\u30FC\u30BD\u30EB\u4ED8\u8FD1\u306B\u8868\u793A\u3055\u308C\u308B\u5358\u8A9E\u3092\u512A\u5148\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4FDD\u5B58\u3055\u308C\u305F\u5019\u88DC\u30BB\u30AF\u30B7\u30E7\u30F3\u3092\u8907\u6570\u306E\u30EF\u30FC\u30AF\u30D7\u30EC\u30FC\u30B9\u3068\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u5171\u6709\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059 (`#editor.suggestSelection#` \u304C\u5FC5\u8981)\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6 \u30B9\u30CB\u30DA\u30C3\u30C8\u304C\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u3092\u9632\u6B62\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u63D0\u6848\u306E\u30A2\u30A4\u30B3\u30F3\u3092\u8868\u793A\u3059\u308B\u304B\u3001\u975E\u8868\u793A\u306B\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u4E0B\u90E8\u306B\u3042\u308B\u30B9\u30C6\u30FC\u30BF\u30B9 \u30D0\u30FC\u306E\u8868\u793A\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5019\u88DC\u306E\u8A73\u7D30\u3092\u30E9\u30D9\u30EB\u4ED8\u304D\u306E\u30A4\u30F3\u30E9\u30A4\u30F3\u3067\u8868\u793A\u3059\u308B\u304B\u3001\u8A73\u7D30\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u306E\u307F\u8868\u793A\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059","\u3053\u306E\u8A2D\u5B9A\u306F\u975E\u63A8\u5968\u3067\u3059\u3002\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30B5\u30A4\u30BA\u5909\u66F4\u304C\u3067\u304D\u308B\u3088\u3046\u306B\u306A\u308A\u307E\u3057\u305F\u3002","\u3053\u306E\u8A2D\u5B9A\u306F\u975E\u63A8\u5968\u3067\u3059\u3002\u4EE3\u308F\u308A\u306B\u3001'editor.suggest.showKeywords' \u3084 'editor.suggest.showSnippets' \u306A\u3069\u306E\u500B\u5225\u306E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30E1\u30BD\u30C3\u30C9` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u95A2\u6570` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u30FC` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30D5\u30A3\u30FC\u30EB\u30C9` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u5909\u6570` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B '\u30AF\u30E9\u30B9' \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u69CB\u9020\u4F53` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30E2\u30B8\u30E5\u30FC\u30EB` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30D7\u30ED\u30D1\u30C6\u30A3` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30A4\u30D9\u30F3\u30C8` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u6F14\u7B97\u5B50` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30E6\u30CB\u30C3\u30C8` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u5024` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u5B9A\u6570` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u5217\u6319\u578B` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `enumMember` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30AD\u30FC\u30EF\u30FC\u30C9` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B '\u30C6\u30AD\u30B9\u30C8' -\u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u8272` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B '\u30D5\u30A1\u30A4\u30EB' \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u53C2\u7167` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `customcolor` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30D5\u30A9\u30EB\u30C0\u30FC` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `typeParameter` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B `\u30B9\u30CB\u30DA\u30C3\u30C8` \u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306A\u5834\u5408\u3001IntelliSense \u306B\u3088\u3063\u3066 '\u30E6\u30FC\u30B6\u30FC' \u5019\u88DC\u304C\u793A\u3055\u308C\u307E\u3059\u3002","\u6709\u52B9\u306B\u3059\u308B\u3068\u3001IntelliSense \u306B\u3088\u3063\u3066 '\u554F\u984C' \u5019\u88DC\u304C\u793A\u3055\u308C\u307E\u3059\u3002","\u5148\u982D\u3068\u672B\u5C3E\u306E\u7A7A\u767D\u3092\u5E38\u306B\u9078\u629E\u3059\u308B\u304B\u3069\u3046\u304B\u3002","\u30B3\u30DF\u30C3\u30C8\u6587\u5B57\u3067\u5019\u88DC\u3092\u53D7\u3051\u5165\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u305F\u3068\u3048\u3070\u3001JavaScript \u3067\u306F\u30BB\u30DF\u30B3\u30ED\u30F3 (`;`) \u3092\u30B3\u30DF\u30C3\u30C8\u6587\u5B57\u306B\u3057\u3066\u3001\u5019\u88DC\u3092\u53D7\u3051\u5165\u308C\u3066\u305D\u306E\u6587\u5B57\u3092\u5165\u529B\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","\u30C6\u30AD\u30B9\u30C8\u306E\u5909\u66F4\u3092\u884C\u3046\u3068\u304D\u3001`Enter` \u3092\u4F7F\u7528\u3059\u308B\u5834\u5408\u306B\u306E\u307F\u5019\u88DC\u3092\u53D7\u3051\u4ED8\u3051\u307E\u3059\u3002","`Tab` \u30AD\u30FC\u306B\u52A0\u3048\u3066 `Enter` \u30AD\u30FC\u3067\u5019\u88DC\u3092\u53D7\u3051\u5165\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u6539\u884C\u306E\u633F\u5165\u3084\u5019\u88DC\u306E\u53CD\u6620\u306E\u9593\u3067\u3042\u3044\u307E\u3044\u3055\u3092\u89E3\u6D88\u3059\u308B\u306E\u306B\u5F79\u7ACB\u3061\u307E\u3059\u3002","\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u3067\u8AAD\u307F\u4E0A\u3052\u308B\u3053\u3068\u304C\u3067\u304D\u308B\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u884C\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u8B66\u544A: \u65E2\u5B9A\u5024\u3092\u4E0A\u56DE\u308B\u6570\u3092\u6307\u5B9A\u3059\u308B\u3068\u3001\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u306B\u5F71\u97FF\u3092\u4E0E\u3048\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4","\u8A00\u8A9E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u3001\u3044\u3064\u304B\u3063\u3053\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u304B\u6C7A\u5B9A\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u304C\u7A7A\u767D\u6587\u5B57\u306E\u5DE6\u306B\u3042\u308B\u3068\u304D\u3060\u3051\u3001\u304B\u3063\u3053\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5DE6\u89D2\u304B\u3063\u3053\u3092\u8FFD\u52A0\u3057\u305F\u5F8C\u306B\u81EA\u52D5\u7684\u306B\u53F3\u89D2\u304B\u3063\u3053\u3092\u633F\u5165\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u7D42\u308F\u308A\u5F15\u7528\u7B26\u307E\u305F\u306F\u62EC\u5F27\u304C\u81EA\u52D5\u7684\u306B\u633F\u5165\u3055\u308C\u305F\u5834\u5408\u306B\u306E\u307F\u3001\u305D\u308C\u3089\u3092\u4E0A\u66F8\u304D\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u7D42\u308F\u308A\u5F15\u7528\u7B26\u307E\u305F\u306F\u62EC\u5F27\u3092\u4E0A\u66F8\u304D\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8A00\u8A9E\u8A2D\u5B9A\u3092\u4F7F\u7528\u3057\u3066\u3001\u3044\u3064\u5F15\u7528\u7B26\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u304B\u6C7A\u5B9A\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u304C\u7A7A\u767D\u6587\u5B57\u306E\u5DE6\u306B\u3042\u308B\u3068\u304D\u3060\u3051\u3001\u5F15\u7528\u7B26\u3092\u81EA\u52D5\u30AF\u30ED\u30FC\u30BA\u3057\u307E\u3059\u3002","\u30E6\u30FC\u30B6\u30FC\u304C\u958B\u59CB\u5F15\u7528\u7B26\u3092\u8FFD\u52A0\u3057\u305F\u5F8C\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u81EA\u52D5\u7684\u306B\u5F15\u7528\u7B26\u3092\u9589\u3058\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u81EA\u52D5\u7684\u306B\u633F\u5165\u3057\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u73FE\u5728\u306E\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u4FDD\u6301\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u73FE\u5728\u306E\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u4FDD\u6301\u3057\u3001\u8A00\u8A9E\u304C\u5B9A\u7FA9\u3055\u308C\u305F\u304B\u3063\u3053\u3092\u512A\u5148\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u73FE\u5728\u306E\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u4FDD\u6301\u3057\u3001\u8A00\u8A9E\u304C\u5B9A\u7FA9\u3055\u308C\u305F\u304B\u3063\u3053\u3092\u512A\u5148\u3057\u3001\u8A00\u8A9E\u3067\u5B9A\u7FA9\u3055\u308C\u305F\u7279\u5225\u306A onEnterRules \u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u73FE\u5728\u306E\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u4FDD\u6301\u3057\u3001\u8A00\u8A9E\u304C\u5B9A\u7FA9\u3055\u308C\u305F\u304B\u3063\u3053\u3092\u512A\u5148\u3057\u3001\u8A00\u8A9E\u3067\u5B9A\u7FA9\u3055\u308C\u305F\u7279\u5225\u306A onEnterRules \u3092\u547C\u3073\u51FA\u3057\u3001\u8A00\u8A9E\u3067\u5B9A\u7FA9\u3055\u308C\u305F indentationRules \u3092\u512A\u5148\u3057\u307E\u3059\u3002","\u30E6\u30FC\u30B6\u30FC\u304C\u884C\u3092\u5165\u529B\u3001\u8CBC\u308A\u4ED8\u3051\u3001\u79FB\u52D5\u3001\u307E\u305F\u306F\u30A4\u30F3\u30C7\u30F3\u30C8\u3059\u308B\u3068\u304D\u306B\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u81EA\u52D5\u7684\u306B\u8ABF\u6574\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8A00\u8A9E\u69CB\u6210\u3092\u4F7F\u7528\u3057\u3066\u3001\u9078\u629E\u7BC4\u56F2\u3092\u3044\u3064\u81EA\u52D5\u7684\u306B\u56F2\u3080\u304B\u3092\u5224\u65AD\u3057\u307E\u3059\u3002","\u89D2\u304B\u3063\u3053\u3067\u306F\u306A\u304F\u3001\u5F15\u7528\u7B26\u3067\u56F2\u307F\u307E\u3059\u3002","\u5F15\u7528\u7B26\u3067\u306F\u306A\u304F\u3001\u89D2\u304B\u3063\u3053\u3067\u56F2\u307F\u307E\u3059\u3002","\u5F15\u7528\u7B26\u307E\u305F\u306F\u89D2\u304B\u3063\u3053\u3092\u5165\u529B\u3059\u308B\u3068\u304D\u306B\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u9078\u629E\u7BC4\u56F2\u3092\u81EA\u52D5\u7684\u306B\u56F2\u3080\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8\u306B\u30B9\u30DA\u30FC\u30B9\u3092\u4F7F\u7528\u3059\u308B\u3068\u304D\u306F\u3001\u30BF\u30D6\u6587\u5B57\u306E\u9078\u629E\u52D5\u4F5C\u3092\u30A8\u30DF\u30E5\u30EC\u30FC\u30C8\u3057\u307E\u3059\u3002\u9078\u629E\u7BC4\u56F2\u306F\u30BF\u30D6\u4F4D\u7F6E\u306B\u7559\u307E\u308A\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 CodeLens \u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","CodeLens \u306E\u30D5\u30A9\u30F3\u30C8 \u30D5\u30A1\u30DF\u30EA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","CodeLens \u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3092\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D\u3067\u5236\u5FA1\u3057\u307E\u3059\u3002'0' \u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001'#editor.fontSize#' \u306E 90% \u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30E9\u30A4\u30F3 \u30AB\u30E9\u30FC \u30C7\u30B3\u30EC\u30FC\u30BF\u30FC\u3068\u8272\u306E\u9078\u629E\u3092\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u3068\u30AD\u30FC\u3067\u306E\u9078\u629E\u306B\u3088\u308A\u5217\u306E\u9078\u629E\u3092\u5B9F\u884C\u3067\u304D\u308B\u3088\u3046\u306B\u3057\u307E\u3059\u3002","\u69CB\u6587\u30CF\u30A4\u30E9\u30A4\u30C8\u3092\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u30B3\u30D4\u30FC\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u306E\u30A2\u30CB\u30E1\u30FC\u30B7\u30E7\u30F3\u65B9\u5F0F\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6ED1\u3089\u304B\u306A\u30AD\u30E3\u30EC\u30C3\u30C8\u30A2\u30CB\u30E1\u30FC\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AB\u30FC\u30BD\u30EB\u524D\u5F8C\u306E\u8868\u793A\u53EF\u80FD\u306A\u5148\u982D\u3068\u672B\u5C3E\u306E\u884C\u306E\u6700\u5C0F\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u4ED6\u306E\u4E00\u90E8\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306F 'scrollOff' \u307E\u305F\u306F `scrollOffset` \u3068\u547C\u3070\u308C\u307E\u3059\u3002","`cursorSurroundingLines` \u306F\u3001\u30AD\u30FC\u30DC\u30FC\u30C9\u307E\u305F\u306F API \u3067\u30C8\u30EA\u30AC\u30FC\u3055\u308C\u305F\u5834\u5408\u306B\u306E\u307F\u5F37\u5236\u3055\u308C\u307E\u3059\u3002","`cursorSurroundingLines` \u306F\u5E38\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002","'\u30AB\u30FC\u30BD\u30EB\u306E\u5468\u56F2\u306E\u884C' \u3092\u9069\u7528\u3059\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","`#editor.cursorStyle#` \u304C `line` \u306B\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001\u30AB\u30FC\u30BD\u30EB\u306E\u5E45\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30C9\u30E9\u30C3\u30B0 \u30A2\u30F3\u30C9 \u30C9\u30ED\u30C3\u30D7\u306B\u3088\u308B\u9078\u629E\u7BC4\u56F2\u306E\u79FB\u52D5\u3092\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u8A31\u53EF\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","`Alt` \u3092\u62BC\u3059\u3068\u3001\u30B9\u30AF\u30ED\u30FC\u30EB\u901F\u5EA6\u304C\u500D\u5897\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30B3\u30FC\u30C9\u306E\u6298\u308A\u305F\u305F\u307F\u3092\u6709\u52B9\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5229\u7528\u53EF\u80FD\u306A\u5834\u5408\u306F\u8A00\u8A9E\u56FA\u6709\u306E\u6298\u308A\u305F\u305F\u307F\u65B9\u6CD5\u3092\u4F7F\u7528\u3057\u3001\u5229\u7528\u53EF\u80FD\u3067\u306F\u306A\u3044\u5834\u5408\u306F\u30A4\u30F3\u30C7\u30F3\u30C8\u30D9\u30FC\u30B9\u306E\u65B9\u6CD5\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8\u30D9\u30FC\u30B9\u306E\u6298\u308A\u305F\u305F\u307F\u65B9\u6CD5\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002","\u6298\u308A\u305F\u305F\u307F\u7BC4\u56F2\u306E\u8A08\u7B97\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u6298\u308A\u305F\u305F\u307E\u308C\u305F\u7BC4\u56F2\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3057\u307E\u3059\u3002","\u6298\u308A\u305F\u305F\u307E\u308C\u305F\u7DDA\u306E\u5F8C\u306E\u7A7A\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u3092\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u7DDA\u304C\u5C55\u958B\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D5\u30A9\u30F3\u30C8 \u30D5\u30A1\u30DF\u30EA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u8CBC\u308A\u4ED8\u3051\u305F\u5185\u5BB9\u304C\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u3088\u308A\u81EA\u52D5\u7684\u306B\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u30D5\u30A9\u30FC\u30DE\u30C3\u30BF\u3092\u4F7F\u7528\u53EF\u80FD\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u307E\u305F\u3001\u30D5\u30A9\u30FC\u30DE\u30C3\u30BF\u304C\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5185\u306E\u7BC4\u56F2\u3092\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3067\u304D\u306A\u3051\u308C\u3070\u306A\u308A\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5165\u529B\u5F8C\u306B\u81EA\u52D5\u7684\u306B\u884C\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3092\u884C\u3046\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u7E26\u306E\u30B0\u30EA\u30D5\u4F59\u767D\u304C\u8868\u793A\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u307B\u3068\u3093\u3069\u306E\u5834\u5408\u3001\u30B0\u30EA\u30D5\u4F59\u767D\u306F\u30C7\u30D0\u30C3\u30B0\u306B\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u3067\u30AB\u30FC\u30BD\u30EB\u3092\u975E\u8868\u793A\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A4\u30F3\u30C7\u30F3\u30C8\u306E\u30AC\u30A4\u30C9\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6587\u5B57\u9593\u9694 (\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D) \u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30EA\u30F3\u30AF\u3055\u308C\u305F\u7DE8\u96C6\u304C\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u6709\u52B9\u306B\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u8A00\u8A9E\u306B\u3088\u3063\u3066\u306F\u3001\u7DE8\u96C6\u4E2D\u306B HTML \u30BF\u30B0\u306A\u3069\u306E\u95A2\u9023\u3059\u308B\u8A18\u53F7\u304C\u66F4\u65B0\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u30EA\u30F3\u30AF\u3092\u691C\u51FA\u3057\u3066\u30AF\u30EA\u30C3\u30AF\u53EF\u80FD\u306A\u72B6\u614B\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5BFE\u5FDC\u3059\u308B\u304B\u3063\u3053\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30DE\u30A6\u30B9 \u30DB\u30A4\u30FC\u30EB \u30B9\u30AF\u30ED\u30FC\u30EB \u30A4\u30D9\u30F3\u30C8\u306E `deltaX` \u3068 `deltaY` \u3067\u4F7F\u7528\u3055\u308C\u308B\u4E57\u6570\u3002","`Ctrl` \u30AD\u30FC\u3092\u62BC\u3057\u306A\u304C\u3089\u30DE\u30A6\u30B9 \u30DB\u30A4\u30FC\u30EB\u3092\u4F7F\u7528\u3057\u3066\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8\u3092\u30BA\u30FC\u30E0\u3057\u307E\u3059\u3002","\u8907\u6570\u306E\u30AB\u30FC\u30BD\u30EB\u304C\u91CD\u306A\u3063\u3066\u3044\u308B\u3068\u304D\u306F\u3001\u30DE\u30FC\u30B8\u3057\u307E\u3059\u3002","Windows \u304A\u3088\u3073 Linux \u4E0A\u306E `Control` \u30AD\u30FC\u3068 macOS \u4E0A\u306E `Command` \u30AD\u30FC\u306B\u5272\u308A\u5F53\u3066\u307E\u3059\u3002","Windows \u304A\u3088\u3073 Linux \u4E0A\u306E `Alt` \u30AD\u30FC\u3068 macOS \u4E0A\u306E `Option` \u30AD\u30FC\u306B\u5272\u308A\u5F53\u3066\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u3092\u4F7F\u7528\u3057\u3066\u8907\u6570\u306E\u30AB\u30FC\u30BD\u30EB\u3092\u8FFD\u52A0\u3059\u308B\u3068\u304D\u306B\u4F7F\u7528\u3059\u308B\u4FEE\u98FE\u30AD\u30FC\u3067\u3059\u3002\u300C\u5B9A\u7FA9\u306B\u79FB\u52D5\u300D\u3084\u300C\u30EA\u30F3\u30AF\u3092\u958B\u304F\u300D\u306E\u30DE\u30A6\u30B9\u64CD\u4F5C\u306F\u3001\u30DE\u30EB\u30C1\u30AB\u30FC\u30BD\u30EB\u306E\u4FEE\u98FE\u30AD\u30FC\u3068\u7AF6\u5408\u3057\u306A\u3044\u3088\u3046\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002[\u8A73\u7D30](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier)","\u30AB\u30FC\u30BD\u30EB\u3054\u3068\u306B\u30C6\u30AD\u30B9\u30C8\u3092 1 \u884C\u305A\u3064\u8CBC\u308A\u4ED8\u3051\u307E\u3059\u3002","\u5404\u30AB\u30FC\u30BD\u30EB\u306F\u5168\u6587\u3092\u8CBC\u308A\u4ED8\u3051\u307E\u3059\u3002","\u8CBC\u308A\u4ED8\u3051\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u884C\u6570\u304C\u30AB\u30FC\u30BD\u30EB\u6570\u3068\u4E00\u81F4\u3059\u308B\u5834\u5408\u306E\u8CBC\u308A\u4ED8\u3051\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF \u30B7\u30F3\u30DC\u30EB\u306E\u51FA\u73FE\u7B87\u6240\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u5468\u56F2\u306B\u5883\u754C\u7DDA\u304C\u63CF\u753B\u3055\u308C\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D4\u30FC\u30AF\u3092\u958B\u304F\u3068\u304D\u306B\u30C4\u30EA\u30FC\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3059\u308B","\u30D4\u30FC\u30AF\u3092\u958B\u304F\u3068\u304D\u306B\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3059\u308B","\u30D4\u30FC\u30AF \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30A4\u30F3\u30E9\u30A4\u30F3 \u30A8\u30C7\u30A3\u30BF\u30FC\u307E\u305F\u306F\u30C4\u30EA\u30FC\u3092\u30D5\u30A9\u30FC\u30AB\u30B9\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","[\u5B9A\u7FA9\u3078\u79FB\u52D5] \u30DE\u30A6\u30B9 \u30B8\u30A7\u30B9\u30C1\u30E3\u30FC\u3067\u3001\u5E38\u306B\u30D4\u30FC\u30AF \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u3092\u958B\u304F\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30AF\u30A4\u30C3\u30AF\u5019\u88DC\u304C\u8868\u793A\u3055\u308C\u308B\u307E\u3067\u306E\u30DF\u30EA\u79D2\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u578B\u306E\u81EA\u52D5\u540D\u524D\u5909\u66F4\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u975E\u63A8\u5968\u3067\u3059\u3002\u4EE3\u308F\u308A\u306B\u3001`editor.linkedEditing` \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5236\u5FA1\u6587\u5B57\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30D5\u30A1\u30A4\u30EB\u306E\u672B\u5C3E\u304C\u6539\u884C\u306E\u5834\u5408\u306F\u3001\u6700\u5F8C\u306E\u884C\u756A\u53F7\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u4F59\u767D\u3068\u73FE\u5728\u306E\u884C\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u73FE\u5728\u306E\u884C\u3092\u3069\u306E\u3088\u3046\u306B\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308B\u5834\u5408\u306B\u306E\u307F\u73FE\u5728\u306E\u884C\u3092\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u5F37\u8ABF\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059","\u5358\u8A9E\u9593\u306E\u5358\u4E00\u30B9\u30DA\u30FC\u30B9\u4EE5\u5916\u306E\u7A7A\u767D\u6587\u5B57\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u9078\u629E\u3057\u305F\u30C6\u30AD\u30B9\u30C8\u306B\u306E\u307F\u7A7A\u767D\u6587\u5B57\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u672B\u5C3E\u306E\u7A7A\u767D\u6587\u5B57\u306E\u307F\u3092\u8868\u793A\u3059\u308B","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u7A7A\u767D\u6587\u5B57\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u9078\u629E\u7BC4\u56F2\u306E\u89D2\u3092\u4E38\u304F\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u6C34\u5E73\u65B9\u5411\u306B\u4F59\u5206\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u6587\u5B57\u6570\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u6700\u5F8C\u306E\u884C\u3092\u8D8A\u3048\u3066\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5782\u76F4\u304A\u3088\u3073\u6C34\u5E73\u65B9\u5411\u306E\u4E21\u65B9\u306B\u540C\u6642\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u5834\u5408\u306F\u3001\u4E3B\u8981\u306A\u8EF8\u306B\u6CBF\u3063\u3066\u30B9\u30AF\u30ED\u30FC\u30EB\u3057\u307E\u3059\u3002\u30C8\u30E9\u30C3\u30AF\u30D1\u30C3\u30C9\u4E0A\u3067\u5782\u76F4\u65B9\u5411\u306B\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u5834\u5408\u306F\u3001\u6C34\u5E73\u30C9\u30EA\u30D5\u30C8\u3092\u9632\u6B62\u3057\u307E\u3059\u3002","Linux \u306E PRIMARY \u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u3092\u30B5\u30DD\u30FC\u30C8\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u9078\u629E\u9805\u76EE\u3068\u985E\u4F3C\u306E\u4E00\u81F4\u9805\u76EE\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5E38\u306B\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u304C\u3068\u3058\u3057\u308D\u306E\u4E0A\u306B\u3042\u308B\u3068\u304D\u306B\u306E\u307F\u3001\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u3068\u3058\u3057\u308D\u306E\u306E\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u3092\u8868\u793A\u3059\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4F7F\u7528\u3055\u308C\u3066\u3044\u306A\u3044\u30B3\u30FC\u30C9\u306E\u30D5\u30A7\u30FC\u30C9\u30A2\u30A6\u30C8\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u975E\u63A8\u5968\u306E\u5909\u6570\u306E\u53D6\u308A\u6D88\u3057\u7DDA\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u4ED6\u306E\u5019\u88DC\u306E\u4E0A\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u4ED6\u306E\u5019\u88DC\u306E\u4E0B\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u4ED6\u306E\u5019\u88DC\u3068\u4E00\u7DD2\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u5019\u88DC\u3092\u8868\u793A\u3057\u307E\u305B\u3093\u3002","\u4ED6\u306E\u4FEE\u6B63\u5019\u88DC\u3068\u4E00\u7DD2\u306B\u30B9\u30CB\u30DA\u30C3\u30C8\u3092\u8868\u793A\u3059\u308B\u304B\u3069\u3046\u304B\u3001\u304A\u3088\u3073\u305D\u306E\u4E26\u3073\u66FF\u3048\u306E\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A2\u30CB\u30E1\u30FC\u30B7\u30E7\u30F3\u3067\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u30B9\u30AF\u30ED\u30FC\u30EB\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30D5\u30A9\u30F3\u30C8 \u30B5\u30A4\u30BA\u3002`0` \u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001`#editor.fontSize#` \u306E\u5024\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u884C\u306E\u9AD8\u3055\u3002`0` \u306B\u8A2D\u5B9A\u3059\u308B\u3068\u3001`#editor.lineHeight#` \u306E\u5024\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002\u6700\u5C0F\u5024\u306F 8 \u3067\u3059\u3002","\u30C8\u30EA\u30AC\u30FC\u6587\u5B57\u306E\u5165\u529B\u6642\u306B\u5019\u88DC\u304C\u81EA\u52D5\u7684\u306B\u8868\u793A\u3055\u308C\u308B\u3088\u3046\u306B\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u5E38\u306B\u6700\u521D\u306E\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u3059\u3002","`console.| -> console.log` \u306A\u3069\u3068\u9078\u629E\u5BFE\u8C61\u306B\u95A2\u3057\u3066\u5165\u529B\u3057\u306A\u3044\u9650\u308A\u306F\u3001\u6700\u8FD1\u306E\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u3059\u3002`log` \u306F\u6700\u8FD1\u5B8C\u4E86\u3057\u305F\u305F\u3081\u3067\u3059\u3002","\u3053\u308C\u3089\u306E\u5019\u88DC\u3092\u5B8C\u4E86\u3057\u305F\u4EE5\u524D\u306E\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u306B\u57FA\u3065\u3044\u3066\u5019\u88DC\u3092\u9078\u629E\u3057\u307E\u3059\u3002\u4F8B: `co -> console` \u304A\u3088\u3073 `con -> const`\u3002","\u5019\u88DC\u30EA\u30B9\u30C8\u3092\u8868\u793A\u3059\u308B\u3068\u304D\u306B\u5019\u88DC\u3092\u4E8B\u524D\u306B\u9078\u629E\u3059\u308B\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30BF\u30D6\u88DC\u5B8C\u306F\u3001tab \u30AD\u30FC\u3092\u62BC\u3057\u305F\u3068\u304D\u306B\u6700\u9069\u306A\u5019\u88DC\u3092\u633F\u5165\u3057\u307E\u3059\u3002","\u30BF\u30D6\u88DC\u5B8C\u3092\u7121\u52B9\u306B\u3057\u307E\u3059\u3002","\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u304C\u4E00\u81F4\u3059\u308B\u5834\u5408\u306B\u3001\u30BF\u30D6\u3067\u30B9\u30CB\u30DA\u30C3\u30C8\u3092\u88DC\u5B8C\u3057\u307E\u3059\u3002'quickSuggestions' \u304C\u7121\u52B9\u306A\u5834\u5408\u306B\u6700\u9069\u3067\u3059\u3002","\u30BF\u30D6\u88DC\u5B8C\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002","\u901A\u5E38\u3068\u306F\u7570\u306A\u308B\u884C\u306E\u7D42\u7AEF\u6587\u5B57\u306F\u81EA\u52D5\u7684\u306B\u524A\u9664\u3055\u308C\u308B\u3002","\u901A\u5E38\u3068\u306F\u7570\u306A\u308B\u884C\u306E\u7D42\u7AEF\u6587\u5B57\u306F\u7121\u8996\u3055\u308C\u308B\u3002","\u901A\u5E38\u3068\u306F\u7570\u306A\u308B\u884C\u306E\u7D42\u7AEF\u6587\u5B57\u306E\u524A\u9664\u30D7\u30ED\u30F3\u30D7\u30C8\u304C\u8868\u793A\u3055\u308C\u308B\u3002","\u554F\u984C\u3092\u8D77\u3053\u3059\u53EF\u80FD\u6027\u304C\u3042\u308B\u3001\u666E\u901A\u3067\u306F\u306A\u3044\u884C\u7D42\u7AEF\u8A18\u53F7\u306F\u524A\u9664\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u7A7A\u767D\u306E\u633F\u5165\u3084\u524A\u9664\u306F\u30BF\u30D6\u4F4D\u7F6E\u306B\u5F93\u3063\u3066\u884C\u308F\u308C\u307E\u3059\u3002","\u5358\u8A9E\u306B\u95A2\u9023\u3057\u305F\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u307E\u305F\u306F\u64CD\u4F5C\u3092\u5B9F\u884C\u3059\u308B\u3068\u304D\u306B\u3001\u5358\u8A9E\u306E\u533A\u5207\u308A\u6587\u5B57\u3068\u3057\u3066\u4F7F\u7528\u3055\u308C\u308B\u6587\u5B57\u3002","\u884C\u3092\u6298\u308A\u8FD4\u3057\u307E\u305B\u3093\u3002","\u884C\u3092\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u306E\u5E45\u3067\u6298\u308A\u8FD4\u3057\u307E\u3059\u3002","`#editor.wordWrapColumn#` \u3067\u884C\u3092\u6298\u308A\u8FD4\u3057\u307E\u3059\u3002","\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u3068 `#editor.wordWrapColumn#` \u306E\u6700\u5C0F\u5024\u3067\u884C\u3092\u6298\u308A\u8FD4\u3057\u307E\u3059\u3002","\u884C\u306E\u6298\u308A\u8FD4\u3057\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","`#editor.wordWrap#` \u304C `wordWrapColumn` \u307E\u305F\u306F `bounded` \u306E\u5834\u5408\u306B\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u6298\u308A\u8FD4\u3057\u6841\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8\u3057\u307E\u305B\u3093\u3002 \u6298\u308A\u8FD4\u3057\u884C\u306F\u5217 1 \u304B\u3089\u59CB\u307E\u308A\u307E\u3059\u3002","\u6298\u308A\u8FD4\u3057\u884C\u306F\u3001\u89AA\u3068\u540C\u3058\u30A4\u30F3\u30C7\u30F3\u30C8\u306B\u306A\u308A\u307E\u3059\u3002","\u6298\u308A\u8FD4\u3057\u884C\u306F\u3001\u89AA +1 \u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u306B\u306A\u308A\u307E\u3059\u3002","\u6298\u308A\u8FD4\u3057\u884C\u306F\u3001\u89AA +2 \u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u306B\u306A\u308A\u307E\u3059\u3002","\u6298\u308A\u8FD4\u3057\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u3059\u3079\u3066\u306E\u6587\u5B57\u306E\u5E45\u304C\u540C\u3058\u3067\u3042\u308B\u3068\u4EEE\u5B9A\u3057\u307E\u3059\u3002\u3053\u308C\u306F\u3001\u30E2\u30CE\u30B9\u30DA\u30FC\u30B9 \u30D5\u30A9\u30F3\u30C8\u3084\u3001\u30B0\u30EA\u30D5\u306E\u5E45\u304C\u7B49\u3057\u3044\u7279\u5B9A\u306E\u30B9\u30AF\u30EA\u30D7\u30C8 (\u30E9\u30C6\u30F3\u6587\u5B57\u306A\u3069) \u3067\u6B63\u3057\u304F\u52D5\u4F5C\u3059\u308B\u9AD8\u901F\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3067\u3059\u3002","\u6298\u308A\u8FD4\u3057\u30DD\u30A4\u30F3\u30C8\u306E\u8A08\u7B97\u3092\u30D6\u30E9\u30A6\u30B6\u30FC\u306B\u30C7\u30EA\u30B2\u30FC\u30C8\u3057\u307E\u3059\u3002\u3053\u308C\u306F\u3001\u5927\u304D\u306A\u30D5\u30A1\u30A4\u30EB\u306E\u30D5\u30EA\u30FC\u30BA\u3092\u5F15\u304D\u8D77\u3053\u3059\u53EF\u80FD\u6027\u304C\u3042\u308B\u3082\u306E\u306E\u3001\u3059\u3079\u3066\u306E\u30B1\u30FC\u30B9\u3067\u6B63\u3057\u304F\u52D5\u4F5C\u3059\u308B\u4F4E\u901F\u306A\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3067\u3059\u3002","\u6298\u308A\u8FD4\u3057\u30DD\u30A4\u30F3\u30C8\u3092\u8A08\u7B97\u3059\u308B\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002"],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read only","Whether the context is a diff editor","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/model/editStack":["\u5165\u529B\u3057\u3066\u3044\u307E\u3059"],"vs/editor/common/modes/modesRegistry":["\u30D7\u30EC\u30FC\u30F3\u30C6\u30AD\u30B9\u30C8"],"vs/editor/common/standaloneStrings":["\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093","\u884C {0}\u3001\u5217 {1} ({2} \u500B\u9078\u629E\u6E08\u307F)","\u884C {0}\u3001\u5217 {1}","{0} \u500B\u306E\u9078\u629E\u9805\u76EE ({1} \u6587\u5B57\u3092\u9078\u629E)","{0} \u500B\u306E\u9078\u629E\u9805\u76EE","`accessibilitySupport` \u8A2D\u5B9A\u3092 'on' \u306B\u5909\u66F4\u3057\u3066\u3044\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306B\u95A2\u9023\u3059\u308B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 \u30DA\u30FC\u30B8\u3092\u958B\u3044\u3066\u3044\u307E\u3059\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u30A6\u30A3\u30F3\u30C9\u30A6\u5185\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u5185\u3002","\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u30B3\u30FC\u30C9 \u30A8\u30C7\u30A3\u30BF\u30FC\u5185","\u30B3\u30FC\u30C9 \u30A8\u30C7\u30A3\u30BF\u30FC\u5185","\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u69CB\u6210\u3057\u3066\u30B9\u30AF\u30EA\u30FC\u30F3 \u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u4F7F\u7528\u3059\u308B\u3088\u3046\u306B\u6700\u9069\u5316\u3059\u308B\u306B\u306F\u3001Command+E \u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u69CB\u6210\u3057\u3066\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u3067\u4F7F\u7528\u3059\u308B\u3088\u3046\u306B\u6700\u9069\u5316\u3059\u308B\u306B\u306F\u3001Control+E \u3092\u62BC\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u3067\u4F7F\u7528\u3059\u308B\u3088\u3046\u6700\u9069\u5316\u3055\u308C\u308B\u3088\u3046\u306B\u69CB\u6210\u3055\u308C\u3066\u3044\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u3001\u30B9\u30AF\u30EA\u30FC\u30F3 \u30EA\u30FC\u30C0\u30FC\u3067\u4F7F\u7528\u3059\u308B\u3088\u3046\u6700\u9069\u5316\u3055\u308C\u306A\u3044\u3088\u3046\u306B\u69CB\u6210\u3055\u308C\u3066\u3044\u307E\u3059\u304C\u3001\u73FE\u6642\u70B9\u3067\u3053\u306E\u8A2D\u5B9A\u306F\u5F53\u3066\u306F\u307E\u308A\u307E\u305B\u3093\u3002","\u73FE\u5728\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u6B21\u306E\u30D5\u30A9\u30FC\u30AB\u30B9\u53EF\u80FD\u306A\u8981\u7D20\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3092\u79FB\u52D5\u3057\u307E\u3059\u3002{0} \u3092\u62BC\u3059\u3068\u3001\u3053\u306E\u52D5\u4F5C\u304C\u5207\u308A\u66FF\u308F\u308A\u307E\u3059\u3002","\u73FE\u5728\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u6B21\u306E\u30D5\u30A9\u30FC\u30AB\u30B9\u53EF\u80FD\u306A\u8981\u7D20\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3092\u79FB\u52D5\u3057\u307E\u3059\u3002\u30B3\u30DE\u30F3\u30C9 {0} \u306F\u3001\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9\u3067\u306F\u73FE\u5728\u30C8\u30EA\u30AC\u30FC\u3067\u304D\u307E\u305B\u3093\u3002","\u73FE\u5728\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u30BF\u30D6\u6587\u5B57\u304C\u633F\u5165\u3055\u308C\u307E\u3059\u3002{0} \u3092\u62BC\u3059\u3068\u3001\u3053\u306E\u52D5\u4F5C\u304C\u5207\u308A\u66FF\u308F\u308A\u307E\u3059\u3002","\u73FE\u5728\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u3067 Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u30BF\u30D6\u6587\u5B57\u304C\u633F\u5165\u3055\u308C\u307E\u3059\u3002\u30B3\u30DE\u30F3\u30C9 {0} \u306F\u3001\u30AD\u30FC \u30D0\u30A4\u30F3\u30C9\u3067\u306F\u73FE\u5728\u30C8\u30EA\u30AC\u30FC\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306B\u95A2\u3059\u308B\u8A73\u7D30\u60C5\u5831\u304C\u8A18\u3055\u308C\u305F\u30D6\u30E9\u30A6\u30B6\u30FC \u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u958B\u304F\u306B\u306F\u3001Command+H \u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306B\u95A2\u3059\u308B\u8A73\u7D30\u60C5\u5831\u304C\u8A18\u3055\u308C\u305F\u30D6\u30E9\u30A6\u30B6\u30FC \u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u958B\u304F\u306B\u306F\u3001Control+H \u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044\u3002","Esc \u30AD\u30FC \u304B Shift+Esc \u3092\u62BC\u3059\u3068\u3001\u30D2\u30F3\u30C8\u3092\u6D88\u3057\u3066\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u623B\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306E\u30D8\u30EB\u30D7\u3092\u8868\u793A\u3057\u307E\u3059","\u958B\u767A\u8005: \u30C8\u30FC\u30AF\u30F3\u306E\u691C\u67FB","\u884C/\u5217\u306B\u79FB\u52D5\u3059\u308B...","\u3059\u3079\u3066\u306E\u30AF\u30A4\u30C3\u30AF \u30A2\u30AF\u30BB\u30B9 \u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u3092\u8868\u793A","\u30B3\u30DE\u30F3\u30C9 \u30D1\u30EC\u30C3\u30C8","\u30B3\u30DE\u30F3\u30C9\u306E\u8868\u793A\u3068\u5B9F\u884C","\u30B7\u30F3\u30DC\u30EB\u306B\u79FB\u52D5...","\u30AB\u30C6\u30B4\u30EA\u5225\u306E\u30B7\u30F3\u30DC\u30EB\u3078\u79FB\u52D5...","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30F3\u30C4","\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3 \u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u8868\u793A\u3059\u308B\u306B\u306F\u3001Alt+F1 \u30AD\u30FC\u3092\u62BC\u3057\u307E\u3059\u3002","\u30CF\u30A4 \u30B3\u30F3\u30C8\u30E9\u30B9\u30C8 \u30C6\u30FC\u30DE\u306E\u5207\u308A\u66FF\u3048","{1} \u500B\u306E\u30D5\u30A1\u30A4\u30EB\u306B {0} \u500B\u306E\u7DE8\u96C6\u304C\u884C\u308F\u308C\u307E\u3057\u305F"],"vs/editor/common/view/editorColorRegistry":["\u30AB\u30FC\u30BD\u30EB\u4F4D\u7F6E\u306E\u884C\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u80CC\u666F\u8272\u3002","\u30AB\u30FC\u30BD\u30EB\u4F4D\u7F6E\u306E\u884C\u306E\u5883\u754C\u7DDA\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u80CC\u666F\u8272\u3002","(Quick Open \u3084\u691C\u51FA\u6A5F\u80FD\u306A\u3069\u306B\u3088\u308A) \u5F37\u8ABF\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u7BC4\u56F2\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u5F37\u8ABF\u8868\u793A\u3055\u308C\u305F\u7BC4\u56F2\u306E\u5883\u754C\u7DDA\u306E\u80CC\u666F\u8272\u3002","\u5F37\u8ABF\u8868\u793A\u3055\u308C\u305F\u8A18\u53F7\u306E\u80CC\u666F\u8272 (\u5B9A\u7FA9\u3078\u79FB\u52D5\u3001\u6B21\u307E\u305F\u306F\u524D\u306E\u8A18\u53F7\u3078\u79FB\u52D5\u306A\u3069)\u3002\u57FA\u306B\u306A\u308B\u88C5\u98FE\u304C\u8986\u308F\u308C\u306A\u3044\u3088\u3046\u306B\u3059\u308B\u305F\u3081\u3001\u8272\u3092\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u5F37\u8ABF\u8868\u793A\u3055\u308C\u305F\u8A18\u53F7\u306E\u5468\u308A\u306E\u5883\u754C\u7DDA\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30AB\u30FC\u30BD\u30EB\u306E\u8272\u3002","\u9078\u629E\u3055\u308C\u305F\u6587\u5B57\u5217\u306E\u80CC\u666F\u8272\u3067\u3059\u3002\u9078\u629E\u3055\u308C\u305F\u6587\u5B57\u5217\u306E\u80CC\u666F\u8272\u3092\u30AB\u30B9\u30BF\u30DE\u30A4\u30BA\u51FA\u6765\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B9\u30DA\u30FC\u30B9\u6587\u5B57\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u884C\u756A\u53F7\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u884C\u756A\u53F7\u306E\u8272","id \u306F\u4F7F\u7528\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002\u4EE3\u308F\u308A\u306B 'EditorLineNumber.activeForeground' \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u884C\u756A\u53F7\u306E\u8272","\u30A8\u30C7\u30A3\u30BF\u30FC \u30EB\u30FC\u30E9\u30FC\u306E\u8272\u3002","CodeLens \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u524D\u666F\u8272\u3002","\u4E00\u81F4\u3059\u308B\u304B\u3063\u3053\u306E\u80CC\u666F\u8272","\u4E00\u81F4\u3059\u308B\u304B\u3063\u3053\u5185\u306E\u30DC\u30C3\u30AF\u30B9\u306E\u8272","\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u5883\u754C\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u80CC\u666F\u8272\u3067\u3059\u3002\u30DF\u30CB\u30DE\u30C3\u30D7\u304C\u6709\u52B9\u3067\u3001\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u53F3\u5074\u306B\u914D\u7F6E\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306B\u306E\u307F\u4F7F\u7528\u3057\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4F59\u767D\u306E\u80CC\u666F\u8272\u3002\u4F59\u767D\u306B\u306F\u30B0\u30EA\u30D5 \u30DE\u30FC\u30B8\u30F3\u3068\u884C\u756A\u53F7\u304C\u542B\u307E\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u4E0D\u8981\u306A (\u672A\u4F7F\u7528\u306E) \u30BD\u30FC\u30B9 \u30B3\u30FC\u30C9\u306E\u7F6B\u7DDA\u306E\u8272\u3002",`\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u4E0D\u8981\u306A (\u672A\u4F7F\u7528\u306E) \u30BD\u30FC\u30B9 \u30B3\u30FC\u30C9\u306E\u4E0D\u900F\u660E\u5EA6\u3002\u305F\u3068\u3048\u3070\u3001"#000000c0" \u306F\u4E0D\u900F\u660E\u5EA6 75% \u3067\u30B3\u30FC\u30C9\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u30CF\u30A4 \u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u306E\u30C6\u30FC\u30DE\u306E\u5834\u5408\u3001'editorUnnecessaryCode.border' \u30C6\u30FC\u30DE\u8272\u3092\u4F7F\u7528\u3057\u3066\u3001\u4E0D\u8981\u306A\u30B3\u30FC\u30C9\u3092\u30D5\u30A7\u30FC\u30C9\u30A2\u30A6\u30C8\u3059\u308B\u306E\u3067\u306F\u306A\u304F\u4E0B\u7DDA\u3092\u4ED8\u3051\u307E\u3059\u3002`,"\u7BC4\u56F2\u5F37\u8ABF\u8868\u793A\u306E\u305F\u3081\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30E9\u30FC\u3092\u793A\u3059\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002","\u8B66\u544A\u3092\u793A\u3059\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002","\u60C5\u5831\u3092\u793A\u3059\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002"],"vs/editor/contrib/anchorSelect/anchorSelect":["\u9078\u629E\u30A2\u30F3\u30AB\u30FC","\u30A2\u30F3\u30AB\u30FC\u304C {0}:{1} \u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3057\u305F","\u9078\u629E\u30A2\u30F3\u30AB\u30FC\u306E\u8A2D\u5B9A","\u9078\u629E\u30A2\u30F3\u30AB\u30FC\u3078\u79FB\u52D5","\u30A2\u30F3\u30AB\u30FC\u304B\u3089\u30AB\u30FC\u30BD\u30EB\u3078\u9078\u629E","\u9078\u629E\u30A2\u30F3\u30AB\u30FC\u306E\u53D6\u308A\u6D88\u3057"],"vs/editor/contrib/bracketMatching/bracketMatching":["\u4E00\u81F4\u3059\u308B\u30D6\u30E9\u30B1\u30C3\u30C8\u3092\u793A\u3059\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002","\u30D6\u30E9\u30B1\u30C3\u30C8\u3078\u79FB\u52D5","\u30D6\u30E9\u30B1\u30C3\u30C8\u306B\u9078\u629E","\u30D6\u30E9\u30B1\u30C3\u30C8\u306B\u79FB\u52D5(&&B)"],"vs/editor/contrib/caretOperations/caretOperations":["\u9078\u629E\u3057\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u5DE6\u306B\u79FB\u52D5","\u9078\u629E\u3057\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u53F3\u306B\u79FB\u52D5"],"vs/editor/contrib/caretOperations/transpose":["\u6587\u5B57\u306E\u5165\u308C\u66FF\u3048"],"vs/editor/contrib/clipboard/clipboard":["\u5207\u308A\u53D6\u308A(&&T)","\u5207\u308A\u53D6\u308A","\u5207\u308A\u53D6\u308A","\u30B3\u30D4\u30FC(&&C)","\u30B3\u30D4\u30FC","\u30B3\u30D4\u30FC","\u8CBC\u308A\u4ED8\u3051(&&P)","\u8CBC\u308A\u4ED8\u3051","\u8CBC\u308A\u4ED8\u3051","\u69CB\u6587\u3092\u5F37\u8ABF\u8868\u793A\u3057\u3066\u30B3\u30D4\u30FC"],"vs/editor/contrib/codeAction/codeActionCommands":["\u5B9F\u884C\u3059\u308B\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u7A2E\u985E\u3002","\u8FD4\u3055\u308C\u305F\u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u9069\u7528\u3055\u308C\u308B\u30BF\u30A4\u30DF\u30F3\u30B0\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u6700\u521D\u306B\u8FD4\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u5E38\u306B\u9069\u7528\u3057\u307E\u3059\u3002","\u6700\u521D\u306B\u8FD4\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u4EE5\u5916\u306B\u8FD4\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u306A\u3044\u5834\u5408\u306F\u3001\u305D\u306E\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u9069\u7528\u3057\u307E\u3059\u3002","\u8FD4\u3055\u308C\u305F\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u9069\u7528\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002","\u512A\u5148\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u307F\u3092\u8FD4\u3059\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u9069\u7528\u4E2D\u306B\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F","\u30AF\u30A4\u30C3\u30AF \u30D5\u30A3\u30C3\u30AF\u30B9...","\u5229\u7528\u53EF\u80FD\u306A\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","\u5229\u7528\u53EF\u80FD\u306A\u30B3\u30FC\u30C9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093","\u30EA\u30D5\u30A1\u30AF\u30BF\u30FC...","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30EA\u30D5\u30A1\u30AF\u30BF\u30EA\u30F3\u30B0\u304C\u3042\u308A\u307E\u305B\u3093","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u30EA\u30D5\u30A1\u30AF\u30BF\u30EA\u30F3\u30B0\u304C\u3042\u308A\u307E\u305B\u3093","\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30EA\u30D5\u30A1\u30AF\u30BF\u30EA\u30F3\u30B0\u304C\u3042\u308A\u307E\u305B\u3093","\u5229\u7528\u53EF\u80FD\u306A\u30EA\u30D5\u30A1\u30AF\u30BF\u30EA\u30F3\u30B0\u306F\u3042\u308A\u307E\u305B\u3093","\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3...","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","'{0}' \u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u308B\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","\u4F7F\u7528\u3067\u304D\u308B\u512A\u5148\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093","\u5229\u7528\u53EF\u80FD\u306A\u30BD\u30FC\u30B9 \u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093","\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u6574\u7406","\u5229\u7528\u53EF\u80FD\u306A\u30A4\u30F3\u30DD\u30FC\u30C8\u306E\u6574\u7406\u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093","\u3059\u3079\u3066\u4FEE\u6B63","\u3059\u3079\u3066\u3092\u4FEE\u6B63\u3059\u308B\u30A2\u30AF\u30B7\u30E7\u30F3\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093","\u81EA\u52D5\u4FEE\u6B63...","\u5229\u7528\u53EF\u80FD\u306A\u81EA\u52D5\u4FEE\u6B63\u306F\u3042\u308A\u307E\u305B\u3093"],"vs/editor/contrib/codeAction/lightBulbWidget":["\u4FEE\u6B63\u30D7\u30ED\u30B0\u30E9\u30E0\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u63A8\u5968\u3055\u308C\u308B\u5229\u7528\u53EF\u80FD\u306A\u4FEE\u6B63\u30D7\u30ED\u30B0\u30E9\u30E0 ({0})","\u4FEE\u6B63\u30D7\u30ED\u30B0\u30E9\u30E0 ({0}) \u3092\u8868\u793A\u3059\u308B","\u4FEE\u6B63\u30D7\u30ED\u30B0\u30E9\u30E0\u3092\u8868\u793A\u3059\u308B"],"vs/editor/contrib/codelens/codelensController":["\u73FE\u5728\u306E\u884C\u306E\u30B3\u30FC\u30C9 \u30EC\u30F3\u30BA \u30B3\u30DE\u30F3\u30C9\u3092\u8868\u793A"],"vs/editor/contrib/comment/comment":["\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u5207\u308A\u66FF\u3048","\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u5207\u308A\u66FF\u3048(&&T)","\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u8FFD\u52A0","\u884C\u30B3\u30E1\u30F3\u30C8\u306E\u524A\u9664","\u30D6\u30ED\u30C3\u30AF \u30B3\u30E1\u30F3\u30C8\u306E\u5207\u308A\u66FF\u3048","\u30D6\u30ED\u30C3\u30AF \u30B3\u30E1\u30F3\u30C8\u306E\u5207\u308A\u66FF\u3048(&&B)"],"vs/editor/contrib/contextmenu/contextmenu":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 \u30E1\u30CB\u30E5\u30FC\u306E\u8868\u793A"],"vs/editor/contrib/cursorUndo/cursorUndo":["\u30AB\u30FC\u30BD\u30EB\u3092\u5143\u306B\u623B\u3059","\u30AB\u30FC\u30BD\u30EB\u306E\u3084\u308A\u76F4\u3057"],"vs/editor/contrib/find/findController":["\u691C\u7D22","\u691C\u7D22(&&F)","\u9078\u629E\u7BC4\u56F2\u3067\u691C\u7D22","\u6B21\u3092\u691C\u7D22","\u6B21\u3092\u691C\u7D22","\u524D\u3092\u691C\u7D22","\u524D\u3092\u691C\u7D22","\u6B21\u306E\u9078\u629E\u9805\u76EE\u3092\u691C\u7D22","\u524D\u306E\u9078\u629E\u9805\u76EE\u3092\u691C\u7D22","\u7F6E\u63DB","\u7F6E\u63DB(&&R)"],"vs/editor/contrib/find/findWidget":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u6298\u308A\u305F\u305F\u307E\u308C\u3066\u3044\u308B\u3053\u3068\u3092\u793A\u3059\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u304C\u5C55\u958B\u3055\u308C\u3066\u3044\u308B\u3053\u3068\u3092\u793A\u3059\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u7F6E\u63DB' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u3059\u3079\u3066\u7F6E\u63DB' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u524D\u3092\u691C\u7D22' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u691C\u7D22\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u306E '\u6B21\u3092\u691C\u7D22' \u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u691C\u7D22","\u691C\u7D22","\u524D\u306E\u691C\u7D22\u7D50\u679C","\u6B21\u306E\u4E00\u81F4\u9805\u76EE","\u9078\u629E\u7BC4\u56F2\u3092\u691C\u7D22","\u9589\u3058\u308B","\u7F6E\u63DB","\u7F6E\u63DB","\u7F6E\u63DB","\u3059\u3079\u3066\u7F6E\u63DB","\u7F6E\u63DB\u30E2\u30FC\u30C9\u306E\u5207\u308A\u66FF\u3048","\u6700\u521D\u306E {0} \u4EF6\u306E\u7D50\u679C\u3060\u3051\u304C\u5F37\u8ABF\u8868\u793A\u3055\u308C\u307E\u3059\u304C\u3001\u3059\u3079\u3066\u306E\u691C\u7D22\u64CD\u4F5C\u306F\u30C6\u30AD\u30B9\u30C8\u5168\u4F53\u3067\u6A5F\u80FD\u3057\u307E\u3059\u3002","{0} / {1} \u4EF6","\u7D50\u679C\u306F\u3042\u308A\u307E\u305B\u3093\u3002","{0} \u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{0} \u304C '{1}' \u3067\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{0} \u306F '{1}' \u3067 {2} \u306B\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{0} \u304C '{1}' \u3067\u898B\u3064\u304B\u308A\u307E\u3057\u305F","Ctrl + Enter \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u3059\u3079\u3066\u7F6E\u63DB\u3059\u308B\u306E\u3067\u306F\u306A\u304F\u3001\u6539\u884C\u304C\u633F\u5165\u3055\u308C\u308B\u3088\u3046\u306B\u306A\u308A\u307E\u3057\u305F\u3002editor.action.replaceAll \u306E\u30AD\u30FC\u30D0\u30A4\u30F3\u30C9\u3092\u5909\u66F4\u3057\u3066\u3001\u3053\u306E\u52D5\u4F5C\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3067\u304D\u307E\u3059\u3002"],"vs/editor/contrib/folding/folding":["\u5C55\u958B","\u518D\u5E30\u7684\u306B\u5C55\u958B\u3059\u308B","\u6298\u308A\u305F\u305F\u307F","\u6298\u308A\u305F\u305F\u307F\u306E\u5207\u308A\u66FF\u3048","\u518D\u5E30\u7684\u306B\u6298\u308A\u305F\u305F\u3080","\u3059\u3079\u3066\u306E\u30D6\u30ED\u30C3\u30AF \u30B3\u30E1\u30F3\u30C8\u306E\u6298\u308A\u305F\u305F\u307F","\u3059\u3079\u3066\u306E\u9818\u57DF\u3092\u6298\u308A\u305F\u305F\u3080","\u3059\u3079\u3066\u306E\u9818\u57DF\u3092\u5C55\u958B","\u3059\u3079\u3066\u6298\u308A\u305F\u305F\u307F","\u3059\u3079\u3066\u5C55\u958B","\u30EC\u30D9\u30EB {0} \u3067\u6298\u308A\u305F\u305F\u3080","\u6298\u308A\u66F2\u3052\u308B\u7BC4\u56F2\u306E\u80CC\u666F\u8272\u3002\u57FA\u306E\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u3088\u3046\u306B\u3001\u8272\u306F\u4E0D\u900F\u660E\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4F59\u767D\u306B\u3042\u308B\u6298\u308A\u305F\u305F\u307F\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u306E\u8272\u3002"],"vs/editor/contrib/folding/foldingDecorations":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B0\u30EA\u30D5\u4F59\u767D\u5185\u306E\u5C55\u958B\u3055\u308C\u305F\u7BC4\u56F2\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30B0\u30EA\u30D5\u4F59\u767D\u5185\u306E\u6298\u308A\u305F\u305F\u307E\u308C\u305F\u7BC4\u56F2\u306E\u30A2\u30A4\u30B3\u30F3\u3002"],"vs/editor/contrib/fontZoom/fontZoom":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8\u3092\u62E1\u5927","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8\u3092\u7E2E\u5C0F","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30D5\u30A9\u30F3\u30C8\u306E\u30BA\u30FC\u30E0\u3092\u30EA\u30BB\u30C3\u30C8"],"vs/editor/contrib/format/format":["\u884C {0} \u3067 1 \u3064\u306E\u66F8\u5F0F\u8A2D\u5B9A\u3092\u7DE8\u96C6","\u884C {1} \u3067 {0} \u500B\u306E\u66F8\u5F0F\u8A2D\u5B9A\u3092\u7DE8\u96C6","\u884C {0} \u3068 {1} \u306E\u9593\u3067 1 \u3064\u306E\u66F8\u5F0F\u8A2D\u5B9A\u3092\u7DE8\u96C6","\u884C {1} \u3068 {2} \u306E\u9593\u3067 {0} \u500B\u306E\u66F8\u5F0F\u8A2D\u5B9A\u3092\u7DE8\u96C6"],"vs/editor/contrib/format/formatActions":["\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8","\u9078\u629E\u7BC4\u56F2\u306E\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8"],"vs/editor/contrib/gotoError/gotoError":["\u6B21\u306E\u554F\u984C (\u30A8\u30E9\u30FC\u3001\u8B66\u544A\u3001\u60C5\u5831) \u3078\u79FB\u52D5","\u6B21\u306E\u30DE\u30FC\u30AB\u30FC\u3078\u79FB\u52D5\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u524D\u306E\u554F\u984C (\u30A8\u30E9\u30FC\u3001\u8B66\u544A\u3001\u60C5\u5831) \u3078\u79FB\u52D5","\u524D\u306E\u30DE\u30FC\u30AB\u30FC\u3078\u79FB\u52D5\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u30D5\u30A1\u30A4\u30EB\u5185\u306E\u6B21\u306E\u554F\u984C (\u30A8\u30E9\u30FC\u3001\u8B66\u544A\u3001\u60C5\u5831) \u3078\u79FB\u52D5","\u6B21\u306E\u554F\u984C\u7B87\u6240(&&P)","\u30D5\u30A1\u30A4\u30EB\u5185\u306E\u524D\u306E\u554F\u984C (\u30A8\u30E9\u30FC\u3001\u8B66\u544A\u3001\u60C5\u5831) \u3078\u79FB\u52D5","\u524D\u306E\u554F\u984C\u7B87\u6240(&&P)"],"vs/editor/contrib/gotoError/gotoErrorWidget":["\u30A8\u30E9\u30FC","\u8B66\u544A","\u60C5\u5831","\u30D2\u30F3\u30C8","{0} ({1})\u3002","{1} \u4EF6\u4E2D {0} \u4EF6\u306E\u554F\u984C","\u554F\u984C {0} / {1}","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30A8\u30E9\u30FC\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u8B66\u544A\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u60C5\u5831\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DE\u30FC\u30AB\u30FC \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u3002"],"vs/editor/contrib/gotoSymbol/goToCommands":["\u30D4\u30FC\u30AF","\u5B9A\u7FA9","'{0}' \u306E\u5B9A\u7FA9\u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5B9A\u7FA9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5B9A\u7FA9\u3078\u79FB\u52D5","\u5B9A\u7FA9\u306B\u79FB\u52D5(&&D)","\u5B9A\u7FA9\u3092\u6A2A\u306B\u958B\u304F","\u5B9A\u7FA9\u3092\u3053\u3053\u306B\u8868\u793A","\u5BA3\u8A00","'{0}' \u306E\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5BA3\u8A00\u3078\u79FB\u52D5","\u5BA3\u8A00\u3078\u79FB\u52D5(&&D)","'{0}' \u306E\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5BA3\u8A00\u3092\u3053\u3053\u306B\u8868\u793A","\u578B\u5B9A\u7FA9","'{0}' \u306E\u578B\u5B9A\u7FA9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u578B\u5B9A\u7FA9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u578B\u5B9A\u7FA9\u3078\u79FB\u52D5","\u578B\u5B9A\u7FA9\u306B\u79FB\u52D5(&&T)","\u578B\u5B9A\u7FA9\u3092\u8868\u793A","\u5B9F\u88C5","'{0}' \u306E\u5B9F\u88C5\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5B9F\u88C5\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u5B9F\u88C5\u3078\u79FB\u52D5","\u5B9F\u88C5\u7B87\u6240\u306B\u79FB\u52D5(&&I)","\u5B9F\u88C5\u306E\u30D4\u30FC\u30AF","'{0}' \u306E\u53C2\u7167\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u53C2\u7167\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093","\u53C2\u7167\u3078\u79FB\u52D5","\u53C2\u7167\u3078\u79FB\u52D5(&&R)","\u53C2\u7167\u8A2D\u5B9A","\u53C2\u7167\u3092\u3053\u3053\u306B\u8868\u793A","\u53C2\u7167\u8A2D\u5B9A","\u4EFB\u610F\u306E\u8A18\u53F7\u3078\u79FB\u52D5","\u5834\u6240","'{0}' \u306B\u4E00\u81F4\u3059\u308B\u7D50\u679C\u306F\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F","\u53C2\u7167\u8A2D\u5B9A"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u3001{0} \u306E\u5B9A\u7FA9\u3092\u8868\u793A\u3057\u307E\u3059\u3002"],"vs/editor/contrib/gotoSymbol/peek/referencesController":["\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} \u500B\u306E\u53C2\u7167","{0} \u500B\u306E\u53C2\u7167","\u53C2\u7167"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u8868\u793A\u3067\u304D\u307E\u305B\u3093","\u7D50\u679C\u306F\u3042\u308A\u307E\u305B\u3093\u3002","\u53C2\u7167\u8A2D\u5B9A"],"vs/editor/contrib/gotoSymbol/referencesModel":["\u5217 {2} \u306E {1} \u884C\u76EE\u306B {0} \u3064\u306E\u30B7\u30F3\u30DC\u30EB","\u5217 {2}\u3001{3} \u306E {1} \u884C\u76EE\u306E {0} \u306B\u3042\u308B\u8A18\u53F7","{0} \u306B 1 \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u3001\u5B8C\u5168\u306A\u30D1\u30B9 {1}","{1} \u306B {0} \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u3001\u5B8C\u5168\u306A\u30D1\u30B9 {2}","\u4E00\u81F4\u3059\u308B\u9805\u76EE\u306F\u3042\u308A\u307E\u305B\u3093","{0} \u306B 1 \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{1} \u306B {0} \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F","{1} \u500B\u306E\u30D5\u30A1\u30A4\u30EB\u306B {0} \u500B\u306E\u30B7\u30F3\u30DC\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["{1} \u306E\u30B7\u30F3\u30DC\u30EB {0}\u3001\u6B21\u306B {2}","\u30B7\u30F3\u30DC\u30EB {0}/{1}"],"vs/editor/contrib/hover/hover":["\u30DB\u30D0\u30FC\u306E\u8868\u793A","\u5B9A\u7FA9\u30D7\u30EC\u30D3\u30E5\u30FC\u306E\u30DB\u30D0\u30FC\u3092\u8868\u793A\u3059\u308B"],"vs/editor/contrib/hover/markdownHoverParticipant":["\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059..."],"vs/editor/contrib/hover/markerHoverParticipant":["View Problem","\u5229\u7528\u3067\u304D\u308B\u30AF\u30A4\u30C3\u30AF\u30D5\u30A3\u30C3\u30AF\u30B9\u306F\u3042\u308A\u307E\u305B\u3093","\u30AF\u30A4\u30C3\u30AF\u30D5\u30A3\u30C3\u30AF\u30B9\u3092\u78BA\u8A8D\u3057\u3066\u3044\u307E\u3059...","\u5229\u7528\u3067\u304D\u308B\u30AF\u30A4\u30C3\u30AF\u30D5\u30A3\u30C3\u30AF\u30B9\u306F\u3042\u308A\u307E\u305B\u3093","\u30AF\u30A4\u30C3\u30AF \u30D5\u30A3\u30C3\u30AF\u30B9..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["\u524D\u306E\u5024\u306B\u7F6E\u63DB","\u6B21\u306E\u5024\u306B\u7F6E\u63DB"],"vs/editor/contrib/indentation/indentation":["\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u30B9\u30DA\u30FC\u30B9\u306B\u5909\u63DB","\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u30BF\u30D6\u306B\u5909\u63DB","\u69CB\u6210\u3055\u308C\u305F\u30BF\u30D6\u306E\u30B5\u30A4\u30BA","\u73FE\u5728\u306E\u30D5\u30A1\u30A4\u30EB\u306E\u30BF\u30D6\u306E\u30B5\u30A4\u30BA\u3092\u9078\u629E","\u30BF\u30D6\u306B\u3088\u308B\u30A4\u30F3\u30C7\u30F3\u30C8","\u30B9\u30DA\u30FC\u30B9\u306B\u3088\u308B\u30A4\u30F3\u30C7\u30F3\u30C8","\u5185\u5BB9\u304B\u3089\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u691C\u51FA","\u884C\u306E\u518D\u30A4\u30F3\u30C7\u30F3\u30C8","\u9078\u629E\u884C\u3092\u518D\u30A4\u30F3\u30C7\u30F3\u30C8"],"vs/editor/contrib/linesOperations/linesOperations":["\u884C\u3092\u4E0A\u3078\u30B3\u30D4\u30FC","\u884C\u3092\u4E0A\u3078\u30B3\u30D4\u30FC(&&C)","\u884C\u3092\u4E0B\u3078\u30B3\u30D4\u30FC","\u884C\u3092\u4E0B\u3078\u30B3\u30D4\u30FC(&&P)","\u9078\u629E\u7BC4\u56F2\u306E\u8907\u88FD","\u9078\u629E\u7BC4\u56F2\u306E\u8907\u88FD(&&D)","\u884C\u3092\u4E0A\u3078\u79FB\u52D5","\u884C\u3092\u4E0A\u3078\u79FB\u52D5(&&V)","\u884C\u3092\u4E0B\u3078\u79FB\u52D5","\u884C\u3092\u4E0B\u3078\u79FB\u52D5(&&L)","\u884C\u3092\u6607\u9806\u306B\u4E26\u3079\u66FF\u3048","\u884C\u3092\u964D\u9806\u306B\u4E26\u3079\u66FF\u3048","\u672B\u5C3E\u306E\u7A7A\u767D\u306E\u30C8\u30EA\u30DF\u30F3\u30B0","\u884C\u306E\u524A\u9664","\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8","\u884C\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u89E3\u9664","\u884C\u3092\u4E0A\u306B\u633F\u5165","\u884C\u3092\u4E0B\u306B\u633F\u5165","\u5DE6\u5074\u3092\u3059\u3079\u3066\u524A\u9664","\u53F3\u5074\u3092\u3059\u3079\u3066\u524A\u9664","\u884C\u3092\u3064\u306A\u3052\u308B","\u30AB\u30FC\u30BD\u30EB\u306E\u5468\u56F2\u306E\u6587\u5B57\u3092\u5165\u308C\u66FF\u3048\u308B","\u5927\u6587\u5B57\u306B\u5909\u63DB","\u5C0F\u6587\u5B57\u306B\u5909\u63DB","\u5148\u982D\u6587\u5B57\u3092\u5927\u6587\u5B57\u306B\u5909\u63DB\u3059\u308B","\u30B9\u30CD\u30FC\u30AF \u30B1\u30FC\u30B9\u306B\u5909\u63DB\u3059\u308B"],"vs/editor/contrib/linkedEditing/linkedEditing":["\u30EA\u30F3\u30AF\u3055\u308C\u305F\u7DE8\u96C6\u306E\u958B\u59CB","\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u578B\u306E\u540D\u524D\u306E\u81EA\u52D5\u5909\u66F4\u3092\u884C\u3046\u3068\u304D\u306E\u80CC\u666F\u8272\u3067\u3059\u3002"],"vs/editor/contrib/links/links":["\u30B3\u30DE\u30F3\u30C9\u306E\u5B9F\u884C","\u30EA\u30F3\u30AF\u5148\u3092\u8868\u793A","cmd + \u30AF\u30EA\u30C3\u30AF","ctrl + \u30AF\u30EA\u30C3\u30AF","option + \u30AF\u30EA\u30C3\u30AF","alt + \u30AF\u30EA\u30C3\u30AF","\u30B3\u30DE\u30F3\u30C9 {0} \u306E\u5B9F\u884C","\u3053\u306E\u30EA\u30F3\u30AF\u306F\u5F62\u5F0F\u304C\u6B63\u3057\u304F\u306A\u3044\u305F\u3081\u958B\u304F\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F: {0}","\u3053\u306E\u30EA\u30F3\u30AF\u306F\u30BF\u30FC\u30B2\u30C3\u30C8\u304C\u5B58\u5728\u3057\u306A\u3044\u305F\u3081\u958B\u304F\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","\u30EA\u30F3\u30AF\u3092\u958B\u304F"],"vs/editor/contrib/message/messageController":["\u30A8\u30C7\u30A3\u30BF\u30FC\u306B\u73FE\u5728\u30A4\u30F3\u30E9\u30A4\u30F3 \u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u304B\u3069\u3046\u304B","\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u306F\u7DE8\u96C6\u3067\u304D\u307E\u305B\u3093"],"vs/editor/contrib/multicursor/multicursor":["\u30AB\u30FC\u30BD\u30EB\u3092\u4E0A\u306B\u633F\u5165","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0A\u306B\u633F\u5165(&&A)","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0B\u306B\u633F\u5165","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0B\u306B\u633F\u5165(&&D)","\u30AB\u30FC\u30BD\u30EB\u3092\u884C\u672B\u306B\u633F\u5165","\u30AB\u30FC\u30BD\u30EB\u3092\u884C\u672B\u306B\u633F\u5165(&&U)","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0B\u306B\u633F\u5165","\u30AB\u30FC\u30BD\u30EB\u3092\u4E0A\u306B\u633F\u5165","\u9078\u629E\u3057\u305F\u9805\u76EE\u3092\u6B21\u306E\u4E00\u81F4\u9805\u76EE\u306B\u8FFD\u52A0","\u6B21\u306E\u51FA\u73FE\u500B\u6240\u3092\u8FFD\u52A0(&&N)","\u9078\u629E\u9805\u76EE\u3092\u6B21\u306E\u4E00\u81F4\u9805\u76EE\u306B\u8FFD\u52A0","\u524D\u306E\u51FA\u73FE\u7B87\u6240\u3092\u8FFD\u52A0(&&R)","\u6700\u5F8C\u306B\u9078\u629E\u3057\u305F\u9805\u76EE\u3092\u6B21\u306E\u4E00\u81F4\u9805\u76EE\u306B\u79FB\u52D5","\u6700\u5F8C\u306B\u9078\u3093\u3060\u9805\u76EE\u3092\u524D\u306E\u4E00\u81F4\u9805\u76EE\u306B\u79FB\u52D5\u3059\u308B","\u4E00\u81F4\u3059\u308B\u3059\u3079\u3066\u306E\u51FA\u73FE\u7B87\u6240\u3092\u9078\u629E\u3057\u307E\u3059","\u3059\u3079\u3066\u306E\u51FA\u73FE\u7B87\u6240\u3092\u9078\u629E(&&O)","\u3059\u3079\u3066\u306E\u51FA\u73FE\u7B87\u6240\u3092\u5909\u66F4"],"vs/editor/contrib/parameterHints/parameterHints":["\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8\u3092\u30C8\u30EA\u30AC\u30FC"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["\u6B21\u306E\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8\u3092\u8868\u793A\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u524D\u306E\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC \u30D2\u30F3\u30C8\u3092\u8868\u793A\u3059\u308B\u305F\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3002","{0}\u3001\u30D2\u30F3\u30C8"],"vs/editor/contrib/peekView/peekView":["\u9589\u3058\u308B","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u306E\u30BF\u30A4\u30C8\u30EB\u9818\u57DF\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30BF\u30A4\u30C8\u30EB\u306E\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u306E\u30BF\u30A4\u30C8\u30EB\u60C5\u5831\u306E\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u306E\u5883\u754C\u3068\u77E2\u5370\u306E\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u30E9\u30A4\u30F3 \u30CE\u30FC\u30C9\u306E\u524D\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u30D5\u30A1\u30A4\u30EB \u30CE\u30FC\u30C9\u306E\u524D\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u9078\u629E\u6E08\u307F\u30A8\u30F3\u30C8\u30EA\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u9078\u629E\u6E08\u307F\u30A8\u30F3\u30C8\u30EA\u306E\u524D\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4F59\u767D\u306E\u80CC\u666F\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC\u7D50\u679C\u30EA\u30B9\u30C8\u306E\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u8868\u793A\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u8868\u793A\u8272\u3002","\u30D4\u30FC\u30AF \u30D3\u30E5\u30FC \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u5883\u754C\u8272\u3002"],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["\u6700\u521D\u306B\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u958B\u3044\u3066\u3001\u884C\u306B\u79FB\u52D5\u3057\u307E\u3059\u3002","\u884C {0}\u3001\u5217 {1} \u306B\u79FB\u52D5\u3057\u307E\u3059\u3002","{0} \u884C\u306B\u79FB\u52D5\u3057\u307E\u3059\u3002","\u73FE\u5728\u306E\u884C: {0}\u3001\u6587\u5B57: {1}\u3002\u79FB\u52D5\u5148\u3068\u306A\u308B\u30011 \u304B\u3089 {2} \u307E\u3067\u306E\u884C\u756A\u53F7\u3092\u5165\u529B\u3057\u307E\u3059\u3002","\u73FE\u5728\u306E\u884C: {0}\u3001\u6587\u5B57: {1}\u3002\u79FB\u52D5\u5148\u306E\u884C\u756A\u53F7\u3092\u5165\u529B\u3057\u307E\u3059\u3002"],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["\u30B7\u30F3\u30DC\u30EB\u306B\u79FB\u52D5\u3059\u308B\u306B\u306F\u3001\u307E\u305A\u30B7\u30F3\u30DC\u30EB\u60C5\u5831\u3092\u542B\u3080\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u958B\u304D\u307E\u3059\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306F\u3001\u30B7\u30F3\u30DC\u30EB\u60C5\u5831\u306F\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002","\u4E00\u81F4\u3059\u308B\u30A8\u30C7\u30A3\u30BF\u30FC \u30B7\u30F3\u30DC\u30EB\u304C\u3042\u308A\u307E\u305B\u3093","\u30A8\u30C7\u30A3\u30BF\u30FC \u30B7\u30F3\u30DC\u30EB\u304C\u3042\u308A\u307E\u305B\u3093","\u6A2A\u306B\u4E26\u3079\u3066\u958B\u304F","\u4E00\u756A\u4E0B\u3067\u958B\u304F","\u30B7\u30F3\u30DC\u30EB ({0})","\u30D7\u30ED\u30D1\u30C6\u30A3 ({0})","\u30E1\u30BD\u30C3\u30C9 ({0})","\u95A2\u6570 ({0})","\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u30FC ({0})","\u5909\u6570 ({0})","\u30AF\u30E9\u30B9 ({0})","\u69CB\u9020\u4F53 ({0})","\u30A4\u30D9\u30F3\u30C8 ({0})","\u6F14\u7B97\u5B50 ({0})","\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9 ({0})","\u540D\u524D\u7A7A\u9593 ({0})","\u30D1\u30C3\u30B1\u30FC\u30B8 ({0})","\u578B\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC ({0})","\u30E2\u30B8\u30E5\u30FC\u30EB ({0})","\u30D7\u30ED\u30D1\u30C6\u30A3 ({0})","\u5217\u6319\u578B ({0})","\u5217\u6319\u578B\u30E1\u30F3\u30D0\u30FC ({0})","\u6587\u5B57\u5217 ({0})","\u30D5\u30A1\u30A4\u30EB ({0})","\u914D\u5217 ({0})","\u6570\u5024 ({0})","\u30D6\u30FC\u30EB\u5024 ({0})","\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8 ({0})","\u30AD\u30FC ({0})","\u30D5\u30A3\u30FC\u30EB\u30C9 ({0})","\u5B9A\u6570 ({0})"],"vs/editor/contrib/rename/rename":["\u7D50\u679C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u540D\u524D\u5909\u66F4\u306E\u5834\u6240\u3092\u89E3\u6C7A\u3057\u3088\u3046\u3068\u3057\u3066\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F","'{0}' \u306E\u540D\u524D\u306E\u5909\u66F4\u4E2D","{0} \u306E\u540D\u524D\u3092\u5909\u66F4\u3057\u3066\u3044\u307E\u3059","'{0}' \u304B\u3089 '{1}' \u3078\u306E\u540D\u524D\u5909\u66F4\u304C\u6B63\u5E38\u306B\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002\u6982\u8981: {2}","\u540D\u524D\u306E\u5909\u66F4\u3067\u7DE8\u96C6\u3092\u9069\u7528\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u540D\u524D\u306E\u5909\u66F4\u306B\u3088\u3063\u3066\u7DE8\u96C6\u306E\u8A08\u7B97\u306B\u5931\u6557\u3057\u307E\u3057\u305F","\u30B7\u30F3\u30DC\u30EB\u306E\u540D\u524D\u5909\u66F4","\u540D\u524D\u3092\u5909\u66F4\u3059\u308B\u524D\u306B\u5909\u66F4\u3092\u30D7\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u6A5F\u80FD\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3059\u308B"],"vs/editor/contrib/rename/renameInputField":["\u540D\u524D\u5909\u66F4\u5165\u529B\u3002\u65B0\u3057\u3044\u540D\u524D\u3092\u5165\u529B\u3057\u3001Enter \u30AD\u30FC\u3092\u62BC\u3057\u3066\u30B3\u30DF\u30C3\u30C8\u3057\u3066\u304F\u3060\u3055\u3044\u3002","\u540D\u524D\u3092\u5909\u66F4\u3059\u308B\u306B\u306F {0}\u3001\u30D7\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u306B\u306F {1}"],"vs/editor/contrib/smartSelect/smartSelect":["\u9078\u629E\u7BC4\u56F2\u3092\u62E1\u5F35","\u9078\u629E\u7BC4\u56F2\u306E\u5C55\u958B(&&E)","\u9078\u629E\u7BC4\u56F2\u3092\u7E2E\u5C0F","\u9078\u629E\u7BC4\u56F2\u306E\u7E2E\u5C0F(&&S)"],"vs/editor/contrib/snippet/snippetVariables":["\u65E5\u66DC\u65E5","\u6708\u66DC\u65E5","\u706B\u66DC\u65E5","\u6C34\u66DC\u65E5","\u6728\u66DC\u65E5","\u91D1\u66DC\u65E5","\u571F\u66DC\u65E5","\u65E5","\u6708","\u706B","\u6C34","\u6728","\u91D1","\u571F","1 \u6708","2 \u6708","3 \u6708","4 \u6708","5 \u6708","6 \u6708","7 \u6708","8 \u6708","9 \u6708","10 \u6708","11 \u6708","12 \u6708","1 \u6708","2 \u6708","3 \u6708","4 \u6708","5 \u6708","6 \u6708","7 \u6708","8 \u6708","9 \u6708","10 \u6708","11 \u6708","12 \u6708"],"vs/editor/contrib/suggest/suggestController":["{1} \u304C\u8FFD\u52A0\u7DE8\u96C6\u3057\u305F '{0}' \u3092\u53D7\u3051\u5165\u308C\u308B","\u5019\u88DC\u3092\u30C8\u30EA\u30AC\u30FC","\u633F\u5165","\u633F\u5165","\u7F6E\u63DB","\u7F6E\u63DB","\u633F\u5165","\u8868\u793A\u3092\u6E1B\u3089\u3059","\u3055\u3089\u306B\u8868\u793A","\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30B5\u30A4\u30BA\u3092\u30EA\u30BB\u30C3\u30C8"],"vs/editor/contrib/suggest/suggestWidget":["\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u8272\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5883\u754C\u7DDA\u8272\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u524D\u666F\u8272\u3002","\u5019\u88DC\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u3067\u9078\u629E\u6E08\u307F\u30A8\u30F3\u30C8\u30EA\u306E\u80CC\u666F\u8272\u3002","\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u5185\u3067\u4E00\u81F4\u3057\u305F\u30CF\u30A4\u30E9\u30A4\u30C8\u306E\u8272\u3002","\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059...","\u5019\u88DC\u306F\u3042\u308A\u307E\u305B\u3093\u3002","{0}\u3001\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8: {1}","\u63D0\u6848"],"vs/editor/contrib/suggest/suggestWidgetDetails":["\u9589\u3058\u308B","\u8AAD\u307F\u8FBC\u3093\u3067\u3044\u307E\u3059..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["\u63D0\u6848\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u8A73\u7D30\u60C5\u5831\u306E\u30A2\u30A4\u30B3\u30F3\u3002","\u8A73\u7D30\u3092\u53C2\u7167"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["\u914D\u5217\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D6\u30FC\u30EB\u5024\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AF\u30E9\u30B9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u8272\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5B9A\u6570\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5217\u6319\u5B50\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5217\u6319\u5B50\u30E1\u30F3\u30D0\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30A4\u30D9\u30F3\u30C8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D5\u30A3\u30FC\u30EB\u30C9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D5\u30A1\u30A4\u30EB\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D5\u30A9\u30EB\u30C0\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u95A2\u6570\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AD\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AD\u30FC\u30EF\u30FC\u30C9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30E1\u30BD\u30C3\u30C9\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30E2\u30B8\u30E5\u30FC\u30EB\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u540D\u524D\u7A7A\u9593\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","Null \u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6570\u5024\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6F14\u7B97\u5B50\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D1\u30C3\u30B1\u30FC\u30B8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D7\u30ED\u30D1\u30C6\u30A3\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u53C2\u7167\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u6587\u5B57\u5217\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u69CB\u9020\u4F53\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30C6\u30AD\u30B9\u30C8\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u30D1\u30E9\u30E1\u30FC\u30BF\u30FC\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5358\u4F4D\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002","\u5909\u6570\u8A18\u53F7\u306E\u524D\u666F\u8272\u3002\u3053\u308C\u3089\u306E\u8A18\u53F7\u306F\u3001\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u3001\u968E\u5C64\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u5019\u88DC\u306E\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002"],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["Tab \u30AD\u30FC\u3092\u5207\u308A\u66FF\u3048\u308B\u3068\u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u79FB\u52D5\u3057\u307E\u3059","Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u6B21\u306E\u30D5\u30A9\u30FC\u30AB\u30B9\u53EF\u80FD\u306A\u8981\u7D20\u306B\u30D5\u30A9\u30FC\u30AB\u30B9\u3092\u79FB\u52D5\u3057\u307E\u3059","Tab \u30AD\u30FC\u3092\u62BC\u3059\u3068\u3001\u30BF\u30D6\u6587\u5B57\u304C\u633F\u5165\u3055\u308C\u307E\u3059"],"vs/editor/contrib/tokenization/tokenization":["\u958B\u767A\u8005: \u30C8\u30FC\u30AF\u30F3\u518D\u4F5C\u6210\u306E\u5F37\u5236"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["\u666E\u901A\u3067\u306F\u306A\u3044\u884C\u7D42\u7AEF\u8A18\u53F7","\u666E\u901A\u3067\u306F\u306A\u3044\u884C\u7D42\u7AEF\u8A18\u53F7\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F",`\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u306F\u3001\u884C\u533A\u5207\u308A\u6587\u5B57 (LS) \u3084\u6BB5\u843D\u533A\u5207\u308A\u8A18\u53F7 (PS) \u306A\u3069\u306E\u7279\u6B8A\u306A\u884C\u306E\u7D42\u7AEF\u6587\u5B57\u304C 1 \u3064\u4EE5\u4E0A\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\r +\r +\u305D\u308C\u3089\u306E\u7D42\u7AEF\u6587\u5B57\u306F\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u524A\u9664\u3059\u308B\u3053\u3068\u3092\u304A\u52E7\u3081\u3057\u307E\u3059\u3002\u3053\u308C\u306F 'editor.unusualLineTerminators' \u3092\u4F7F\u7528\u3057\u3066\u69CB\u6210\u3067\u304D\u307E\u3059\u3002`,"\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u4FEE\u6B63","\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3067\u306F\u554F\u984C\u3092\u7121\u8996\u3059\u308B"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["\u5909\u6570\u306E\u8AAD\u307F\u53D6\u308A\u306A\u3069\u3001\u8AAD\u307F\u53D6\u308A\u30A2\u30AF\u30BB\u30B9\u4E2D\u306E\u30B7\u30F3\u30DC\u30EB\u306E\u80CC\u666F\u8272\u3002\u4E0B\u306B\u3042\u308B\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u305F\u3081\u306B\u3001\u8272\u306F\u4E0D\u900F\u904E\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002","\u5909\u6570\u3078\u306E\u66F8\u304D\u8FBC\u307F\u306A\u3069\u3001\u66F8\u304D\u8FBC\u307F\u30A2\u30AF\u30BB\u30B9\u4E2D\u306E\u30B7\u30F3\u30DC\u30EB\u80CC\u666F\u8272\u3002\u4E0B\u306B\u3042\u308B\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u305F\u3081\u306B\u3001\u8272\u306F\u4E0D\u900F\u904E\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002","\u5909\u6570\u306E\u8AAD\u307F\u53D6\u308A\u306A\u3069\u8AAD\u307F\u53D6\u308A\u30A2\u30AF\u30BB\u30B9\u4E2D\u306E\u30B7\u30F3\u30DC\u30EB\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5909\u6570\u3078\u306E\u66F8\u304D\u8FBC\u307F\u306A\u3069\u66F8\u304D\u8FBC\u307F\u30A2\u30AF\u30BB\u30B9\u4E2D\u306E\u30B7\u30F3\u30DC\u30EB\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u30B7\u30F3\u30DC\u30EB\u306B\u3088\u3063\u3066\u5F37\u8ABF\u8868\u793A\u3055\u308C\u308B\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u30DE\u30FC\u30AB\u30FC\u306E\u8272\u306F\u3001\u57FA\u306B\u306A\u308B\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u3088\u3046\u306B\u4E0D\u900F\u660E\u4EE5\u5916\u306B\u3057\u307E\u3059\u3002","\u66F8\u304D\u8FBC\u307F\u30A2\u30AF\u30BB\u30B9 \u30B7\u30F3\u30DC\u30EB\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u6982\u8981\u30EB\u30FC\u30E9\u30FC\u306E\u30DE\u30FC\u30AB\u30FC\u8272\u3002\u4E0B\u306B\u3042\u308B\u88C5\u98FE\u3092\u96A0\u3055\u306A\u3044\u305F\u3081\u306B\u3001\u8272\u306F\u4E0D\u900F\u904E\u3067\u3042\u3063\u3066\u306F\u306A\u308A\u307E\u305B\u3093\u3002","\u6B21\u306E\u30B7\u30F3\u30DC\u30EB \u30CF\u30A4\u30E9\u30A4\u30C8\u306B\u79FB\u52D5","\u524D\u306E\u30B7\u30F3\u30DC\u30EB \u30CF\u30A4\u30E9\u30A4\u30C8\u306B\u79FB\u52D5","\u30B7\u30F3\u30DC\u30EB \u30CF\u30A4\u30E9\u30A4\u30C8\u3092\u30C8\u30EA\u30AC\u30FC"],"vs/editor/contrib/wordOperations/wordOperations":["\u5358\u8A9E\u306E\u524A\u9664"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["\u65E2\u5B9A\u306E\u8A00\u8A9E\u69CB\u6210\u306E\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9","\u8A00\u8A9E\u306B\u5BFE\u3057\u3066\u4E0A\u66F8\u304D\u3055\u308C\u308B\u30A8\u30C7\u30A3\u30BF\u30FC\u8A2D\u5B9A\u3092\u69CB\u6210\u3057\u307E\u3059\u3002","\u3053\u306E\u8A2D\u5B9A\u3067\u306F\u3001\u8A00\u8A9E\u3054\u3068\u306E\u69CB\u6210\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002","\u7A7A\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u306F\u767B\u9332\u3067\u304D\u307E\u305B\u3093","'{0}' \u3092\u767B\u9332\u3067\u304D\u307E\u305B\u3093\u3002\u3053\u308C\u306F\u3001\u8A00\u8A9E\u56FA\u6709\u306E\u30A8\u30C7\u30A3\u30BF\u30FC\u8A2D\u5B9A\u3092\u8A18\u8FF0\u3059\u308B\u30D7\u30ED\u30D1\u30C6\u30A3 \u30D1\u30BF\u30FC\u30F3 '\\\\[.*\\\\]$' \u306B\u4E00\u81F4\u3057\u3066\u3044\u307E\u3059\u3002'configurationDefaults' \u30B3\u30F3\u30C8\u30EA\u30D3\u30E5\u30FC\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002","'{0}' \u3092\u767B\u9332\u3067\u304D\u307E\u305B\u3093\u3002\u3053\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u306F\u65E2\u306B\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u3059\u3002"],"vs/platform/contextkey/browser/contextKeyService":["\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 \u30AD\u30FC\u306B\u95A2\u3059\u308B\u60C5\u5831\u3092\u8FD4\u3059\u30B3\u30DE\u30F3\u30C9"],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["({0}) \u304C\u6E21\u3055\u308C\u307E\u3057\u305F\u30022 \u756A\u76EE\u306E\u30AD\u30FC\u3092\u5F85\u3063\u3066\u3044\u307E\u3059...","\u30AD\u30FC\u306E\u7D44\u307F\u5408\u308F\u305B ({0}\u3001{1}) \u306F\u30B3\u30DE\u30F3\u30C9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002"],"vs/platform/list/browser/listService":["\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1","Windows \u304A\u3088\u3073 Linux \u4E0A\u306E `Control` \u30AD\u30FC\u3068 macOS \u4E0A\u306E `Command` \u30AD\u30FC\u306B\u5272\u308A\u5F53\u3066\u307E\u3059\u3002","Windows \u304A\u3088\u3073 Linux \u4E0A\u306E `Alt` \u30AD\u30FC\u3068 macOS \u4E0A\u306E `Option` \u30AD\u30FC\u306B\u5272\u308A\u5F53\u3066\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u3092\u4F7F\u7528\u3057\u3066\u9805\u76EE\u3092\u8907\u6570\u9078\u629E\u3059\u308B\u3068\u304D\u306B\u4F7F\u7528\u3059\u308B\u4FEE\u98FE\u30AD\u30FC\u3067\u3059 (\u305F\u3068\u3048\u3070\u3001\u30A8\u30AF\u30B9\u30D7\u30ED\u30FC\u30E9\u30FC\u3067\u30A8\u30C7\u30A3\u30BF\u30FC\u3068 scm \u30D3\u30E5\u30FC\u3092\u958B\u304F\u306A\u3069)\u3002'\u6A2A\u306B\u4E26\u3079\u3066\u958B\u304F' \u30DE\u30A6\u30B9 \u30B8\u30A7\u30B9\u30C1\u30E3\u30FC (\u304C\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u308B\u5834\u5408) \u306F\u3001\u8907\u6570\u9078\u629E\u306E\u4FEE\u98FE\u30AD\u30FC\u3068\u7AF6\u5408\u3057\u306A\u3044\u3088\u3046\u306B\u8ABF\u6574\u3055\u308C\u307E\u3059\u3002","\u30DE\u30A6\u30B9\u3092\u4F7F\u7528\u3057\u3066\u3001\u30C4\u30EA\u30FC\u3068\u30EA\u30B9\u30C8\u5185\u306E\u9805\u76EE\u3092\u958B\u304F\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059 (\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u308B\u5834\u5408)\u3002\u9069\u7528\u3067\u304D\u306A\u3044\u5834\u5408\u3001\u4E00\u90E8\u306E\u30C4\u30EA\u30FC\u3084\u30EA\u30B9\u30C8\u3067\u306F\u3053\u306E\u8A2D\u5B9A\u304C\u7121\u8996\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002","\u30EA\u30B9\u30C8\u3068\u30C4\u30EA\u30FC\u304C\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u3067\u6C34\u5E73\u30B9\u30AF\u30ED\u30FC\u30EB\u3092\u30B5\u30DD\u30FC\u30C8\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u8B66\u544A: \u3053\u306E\u8A2D\u5B9A\u3092\u30AA\u30F3\u306B\u3059\u308B\u3068\u3001\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u306B\u5F71\u97FF\u304C\u3042\u308A\u307E\u3059\u3002","\u30C4\u30EA\u30FC\u306E\u30A4\u30F3\u30C7\u30F3\u30C8\u3092\u30D4\u30AF\u30BB\u30EB\u5358\u4F4D\u3067\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30C4\u30EA\u30FC\u3067\u30A4\u30F3\u30B7\u30C7\u30F3\u30C8\u306E\u30AC\u30A4\u30C9\u3092\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u30EA\u30B9\u30C8\u3068\u30C4\u30EA\u30FC\u3067\u30B9\u30E0\u30FC\u30BA \u30B9\u30AF\u30ED\u30FC\u30EB\u3092\u4F7F\u7528\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002","\u7C21\u5358\u306A\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u306F\u3001\u30AD\u30FC\u30DC\u30FC\u30C9\u5165\u529B\u306B\u4E00\u81F4\u3059\u308B\u8981\u7D20\u306B\u7126\u70B9\u3092\u5F53\u3066\u307E\u3059\u3002\u4E00\u81F4\u51E6\u7406\u306F\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u3067\u306E\u307F\u5B9F\u884C\u3055\u308C\u307E\u3059\u3002","\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u306E\u5F37\u8ABF\u8868\u793A\u3092\u4F7F\u7528\u3059\u308B\u3068\u3001\u30AD\u30FC\u30DC\u30FC\u30C9\u5165\u529B\u306B\u4E00\u81F4\u3059\u308B\u8981\u7D20\u304C\u5F37\u8ABF\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u4E0A\u304A\u3088\u3073\u4E0B\u3078\u306E\u79FB\u52D5\u306F\u3001\u5F37\u8ABF\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u8981\u7D20\u306E\u307F\u3092\u79FB\u52D5\u3057\u307E\u3059\u3002","\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3067\u306F\u3001\u30AD\u30FC\u30DC\u30FC\u30C9\u5165\u529B\u306B\u4E00\u81F4\u3057\u306A\u3044\u3059\u3079\u3066\u306E\u8981\u7D20\u304C\u30D5\u30A3\u30EB\u30BF\u30FC\u51E6\u7406\u3055\u308C\u3001\u975E\u8868\u793A\u306B\u306A\u308A\u307E\u3059\u3002","\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u306E\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3 \u30B9\u30BF\u30A4\u30EB\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u5358\u7D14\u3001\u5F37\u8ABF\u8868\u793A\u3001\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002","\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u3067\u306E\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u3092\u3001\u5358\u306B\u5165\u529B\u3059\u308B\u3060\u3051\u3067\u81EA\u52D5\u7684\u306B\u30C8\u30EA\u30AC\u30FC\u3059\u308B\u304B\u3069\u3046\u304B\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002`false` \u306B\u8A2D\u5B9A\u3057\u305F\u5834\u5408\u3001\u30AD\u30FC\u30DC\u30FC\u30C9 \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u306F `list.toggleKeyboardNavigation` \u30B3\u30DE\u30F3\u30C9\u3092\u5B9F\u884C\u3057\u305F\u3068\u304D\u306B\u306E\u307F\u30C8\u30EA\u30AC\u30FC\u3055\u308C\u307E\u3059\u3002\u3053\u308C\u306B\u5BFE\u3057\u3066\u30AD\u30FC\u30DC\u30FC\u30C9 \u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u3092\u5272\u308A\u5F53\u3066\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002","\u30D5\u30A9\u30EB\u30C0\u30FC\u540D\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u305F\u3068\u304D\u306B\u30C4\u30EA\u30FC \u30D5\u30A9\u30EB\u30C0\u30FC\u304C\u5C55\u958B\u3055\u308C\u308B\u65B9\u6CD5\u3092\u5236\u5FA1\u3057\u307E\u3059\u3002\u9069\u7528\u3067\u304D\u306A\u3044\u5834\u5408\u3001\u4E00\u90E8\u306E\u30C4\u30EA\u30FC\u3084\u30EA\u30B9\u30C8\u3067\u306F\u3053\u306E\u8A2D\u5B9A\u304C\u7121\u8996\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002"],"vs/platform/markers/common/markers":["\u30A8\u30E9\u30FC","\u8B66\u544A","\u60C5\u5831"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","\u6700\u8FD1\u4F7F\u7528\u3057\u305F\u3082\u306E","\u305D\u306E\u4ED6\u306E\u30B3\u30DE\u30F3\u30C9","\u30B3\u30DE\u30F3\u30C9 '{0}' \u3067\u30A8\u30E9\u30FC ({1}) \u304C\u767A\u751F\u3057\u307E\u3057\u305F"],"vs/platform/quickinput/browser/helpQuickAccess":["\u30B0\u30ED\u30FC\u30D0\u30EB \u30B3\u30DE\u30F3\u30C9","\u30A8\u30C7\u30A3\u30BF\u30FC \u30B3\u30DE\u30F3\u30C9","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["\u5168\u4F53\u306E\u524D\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u3088\u3063\u3066\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u306B\u306E\u307F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30E9\u30FC \u30E1\u30C3\u30BB\u30FC\u30B8\u5168\u4F53\u306E\u524D\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u3088\u3063\u3066\u4E0A\u66F8\u304D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u306B\u306E\u307F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1\u306E\u30A2\u30A4\u30B3\u30F3\u306E\u65E2\u5B9A\u306E\u8272\u3002","\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u8981\u7D20\u306E\u5883\u754C\u7DDA\u5168\u4F53\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u3088\u3063\u3066\u4E0A\u66F8\u304D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u306B\u306E\u307F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u3092\u5F37\u3081\u308B\u305F\u3081\u306B\u3001\u4ED6\u306E\u8981\u7D20\u3068\u9694\u3066\u308B\u8FFD\u52A0\u306E\u5883\u754C\u7DDA\u3002","\u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u3092\u5F37\u3081\u308B\u305F\u3081\u306B\u3001\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u4ED6\u8981\u7D20\u3068\u9694\u3066\u308B\u8FFD\u52A0\u306E\u5883\u754C\u7DDA\u3002","\u30C6\u30AD\u30B9\u30C8\u5185\u306E\u30EA\u30F3\u30AF\u306E\u524D\u666F\u8272\u3002","\u30C6\u30AD\u30B9\u30C8\u5185\u306E\u30B3\u30FC\u30C9 \u30D6\u30ED\u30C3\u30AF\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u691C\u7D22/\u7F6E\u63DB\u7A93\u306A\u3069\u3001\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5F71\u306E\u8272\u3002","\u5165\u529B\u30DC\u30C3\u30AF\u30B9\u306E\u80CC\u666F\u3002","\u5165\u529B\u30DC\u30C3\u30AF\u30B9\u306E\u524D\u666F\u3002","\u5165\u529B\u30DC\u30C3\u30AF\u30B9\u306E\u5883\u754C\u7DDA\u3002","\u5165\u529B\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u30A2\u30AF\u30C6\u30A3\u30D6 \u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5165\u529B\u30D5\u30A3\u30FC\u30EB\u30C9\u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u5316\u3055\u308C\u305F\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u80CC\u666F\u8272\u3002","\u5165\u529B\u30D5\u30A3\u30FC\u30EB\u30C9\u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u5316\u3055\u308C\u305F\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u524D\u666F\u8272\u3002","\u60C5\u5831\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u80CC\u666F\u8272\u3002","\u60C5\u5831\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u524D\u666F\u8272\u3002","\u60C5\u5831\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u5883\u754C\u7DDA\u8272\u3002","\u8B66\u544A\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u80CC\u666F\u8272\u3002","\u8B66\u544A\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u524D\u666F\u8272\u3002","\u8B66\u544A\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30A8\u30E9\u30FC\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30E9\u30FC\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u524D\u666F\u8272\u3002","\u30A8\u30E9\u30FC\u306E\u91CD\u5927\u5EA6\u3092\u793A\u3059\u5165\u529B\u691C\u8A3C\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u306E\u80CC\u666F\u3002","\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u306E\u524D\u666F\u3002","\u30DC\u30BF\u30F3\u306E\u524D\u666F\u8272\u3002","\u30DC\u30BF\u30F3\u306E\u80CC\u666F\u8272\u3002","\u30DB\u30D0\u30FC\u6642\u306E\u30DC\u30BF\u30F3\u80CC\u666F\u8272\u3002","\u30D0\u30C3\u30B8\u306E\u80CC\u666F\u8272\u3002\u30D0\u30C3\u30B8\u3068\u306F\u5C0F\u3055\u306A\u60C5\u5831\u30E9\u30D9\u30EB\u306E\u3053\u3068\u3067\u3059\u3002\u4F8B:\u691C\u7D22\u7D50\u679C\u306E\u6570","\u30D0\u30C3\u30B8\u306E\u524D\u666F\u8272\u3002\u30D0\u30C3\u30B8\u3068\u306F\u5C0F\u3055\u306A\u60C5\u5831\u30E9\u30D9\u30EB\u306E\u3053\u3068\u3067\u3059\u3002\u4F8B:\u691C\u7D22\u7D50\u679C\u306E\u6570","\u30D3\u30E5\u30FC\u304C\u30B9\u30AF\u30ED\u30FC\u30EB\u3055\u308C\u305F\u3053\u3068\u3092\u793A\u3059\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC\u306E\u5F71\u3002","\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC\u306E\u30B9\u30E9\u30A4\u30C0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30DB\u30D0\u30FC\u6642\u306E\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC \u30B9\u30E9\u30A4\u30C0\u30FC\u80CC\u666F\u8272\u3002","\u30AF\u30EA\u30C3\u30AF\u6642\u306E\u30B9\u30AF\u30ED\u30FC\u30EB \u30D0\u30FC \u30B9\u30E9\u30A4\u30C0\u30FC\u80CC\u666F\u8272\u3002","\u6642\u9593\u306E\u304B\u304B\u308B\u64CD\u4F5C\u3067\u8868\u793A\u3059\u308B\u30D7\u30ED\u30B0\u30EC\u30B9 \u30D0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u30A8\u30E9\u30FC \u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30A8\u30E9\u30FC\u3092\u793A\u3059\u6CE2\u7DDA\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u30A8\u30E9\u30FC \u30DC\u30C3\u30AF\u30B9\u306E\u5883\u754C\u7DDA\u306E\u8272\u3067\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u8B66\u544A\u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u8B66\u544A\u3092\u793A\u3059\u6CE2\u7DDA\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u306E\u8B66\u544A\u30DC\u30C3\u30AF\u30B9\u306E\u5883\u754C\u7DDA\u306E\u8272\u3067\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u60C5\u5831\u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u60C5\u5831\u3092\u793A\u3059\u6CE2\u7DDA\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u60C5\u5831\u30DC\u30C3\u30AF\u30B9\u306E\u5883\u754C\u7DDA\u306E\u8272\u3067\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u30D2\u30F3\u30C8\u3092\u793A\u3059\u6CE2\u7DDA\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u5185\u306E\u30D2\u30F3\u30C8 \u30DC\u30C3\u30AF\u30B9\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u65E2\u5B9A\u306E\u524D\u666F\u8272\u3002","\u691C\u7D22/\u7F6E\u63DB\u7A93\u306A\u3069\u3001\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u8272\u3002","\u691C\u7D22/\u7F6E\u63DB\u306A\u3069\u3092\u884C\u3046\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u5883\u754C\u7DDA\u8272\u3002\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u5883\u754C\u7DDA\u304C\u3042\u308A\u3001\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u3088\u3063\u3066\u914D\u8272\u3092\u4E0A\u66F8\u304D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3067\u306E\u307F\u3053\u306E\u914D\u8272\u306F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30B5\u30A4\u30BA\u5909\u66F4\u30D0\u30FC\u306E\u5883\u754C\u7DDA\u8272\u3002\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u30B5\u30A4\u30BA\u5909\u66F4\u306E\u5883\u754C\u7DDA\u304C\u3042\u308A\u3001\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u3088\u3063\u3066\u914D\u8272\u3092\u4E0A\u66F8\u304D\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3067\u306E\u307F\u3053\u306E\u914D\u8272\u306F\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC\u306E\u80CC\u666F\u8272\u3002\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306F\u3001\u30B3\u30DE\u30F3\u30C9 \u30D1\u30EC\u30C3\u30C8\u306E\u3088\u3046\u306A\u30D4\u30C3\u30AB\u30FC\u306E\u30B3\u30F3\u30C6\u30CA\u30FC\u3067\u3059\u3002","\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC\u306E\u524D\u666F\u8272\u3002\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306F\u3001\u30B3\u30DE\u30F3\u30C9 \u30D1\u30EC\u30C3\u30C8\u306E\u3088\u3046\u306A\u30D4\u30C3\u30AB\u30FC\u306E\u30B3\u30F3\u30C6\u30CA\u30FC\u3067\u3059\u3002","\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC \u306E\u30BF\u30A4\u30C8\u30EB\u306E\u80CC\u666F\u8272\u3002\u30AF\u30A4\u30C3\u30AF \u30D4\u30C3\u30AB\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306F\u3001\u30B3\u30DE\u30F3\u30C9 \u30D1\u30EC\u30C3\u30C8\u306E\u3088\u3046\u306A\u30D4\u30C3\u30AB\u30FC\u306E\u30B3\u30F3\u30C6\u30CA\u30FC\u3067\u3059\u3002","\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30AF\u30A4\u30C3\u30AF\u9078\u629E\u306E\u80CC\u666F\u8272\u3002","\u30E9\u30D9\u30EB\u3092\u30B0\u30EB\u30FC\u30D7\u5316\u3059\u308B\u305F\u3081\u306E\u30AF\u30EA\u30C3\u30AF\u9078\u629E\u306E\u8272\u3002","\u5883\u754C\u7DDA\u3092\u30B0\u30EB\u30FC\u30D7\u5316\u3059\u308B\u305F\u3081\u306E\u30AF\u30A4\u30C3\u30AF\u9078\u629E\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u306E\u8272\u3002","\u30CF\u30A4 \u30B3\u30F3\u30C8\u30E9\u30B9\u30C8\u306E\u9078\u629E\u6E08\u307F\u30C6\u30AD\u30B9\u30C8\u306E\u8272\u3002","\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u9078\u629E\u7BC4\u56F2\u306E\u540C\u3058\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u9818\u57DF\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u9078\u629E\u7BC4\u56F2\u3068\u540C\u3058\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u73FE\u5728\u306E\u691C\u7D22\u4E00\u81F4\u9805\u76EE\u306E\u8272\u3002","\u305D\u306E\u4ED6\u306E\u691C\u7D22\u6761\u4EF6\u306B\u4E00\u81F4\u3059\u308B\u9805\u76EE\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u691C\u7D22\u3092\u5236\u9650\u3059\u308B\u7BC4\u56F2\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u73FE\u5728\u306E\u691C\u7D22\u4E00\u81F4\u9805\u76EE\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u4ED6\u306E\u691C\u7D22\u4E00\u81F4\u9805\u76EE\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u691C\u7D22\u3092\u5236\u9650\u3059\u308B\u7BC4\u56F2\u306E\u5883\u754C\u7DDA\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30DB\u30D0\u30FC\u304C\u8868\u793A\u3055\u308C\u3066\u3044\u308B\u8A9E\u306E\u4E0B\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30DB\u30D0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30DB\u30D0\u30FC\u306E\u524D\u666F\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC \u30DB\u30D0\u30FC\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u30DB\u30D0\u30FC\u306E\u30B9\u30C6\u30FC\u30BF\u30B9 \u30D0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30EA\u30F3\u30AF\u306E\u8272\u3002","\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u524D\u666F\u8272","\u30A4\u30F3\u30E9\u30A4\u30F3 \u30D2\u30F3\u30C8\u306E\u80CC\u666F\u8272","\u96FB\u7403\u30A2\u30AF\u30B7\u30E7\u30F3 \u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3059\u308B\u8272\u3002","\u81EA\u52D5\u4FEE\u6B63\u306E\u96FB\u7403\u30A2\u30AF\u30B7\u30E7\u30F3 \u30A2\u30A4\u30B3\u30F3\u3068\u3057\u3066\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002","\u633F\u5165\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u524A\u9664\u3057\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u80CC\u666F\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u633F\u5165\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u8F2A\u90ED\u306E\u8272\u3002","\u524A\u9664\u3055\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u306E\u8F2A\u90ED\u306E\u8272\u3002","2 \u3064\u306E\u30C6\u30AD\u30B9\u30C8 \u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9593\u306E\u5883\u754C\u7DDA\u306E\u8272\u3002","\u5DEE\u5206\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u5BFE\u89D2\u7DDA\u306E\u5857\u308A\u3064\u3076\u3057\u8272\u3002\u5BFE\u89D2\u7DDA\u306E\u5857\u308A\u3064\u3076\u3057\u306F\u3001\u6A2A\u306B\u4E26\u3079\u3066\u6BD4\u8F03\u3059\u308B\u30D3\u30E5\u30FC\u3067\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u5834\u5408\u306E\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u306B\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306B\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u9078\u629E\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306E\u3068\u304D\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u304C\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u5834\u5408\u306E\u3001\u30D5\u30A9\u30FC\u30AB\u30B9\u3055\u308C\u305F\u9805\u76EE\u306E\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u8272\u3002\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30EA\u30B9\u30C8\u3084\u30C4\u30EA\u30FC\u306B\u306F\u30AD\u30FC\u30DC\u30FC\u30C9 \u30D5\u30A9\u30FC\u30AB\u30B9\u304C\u3042\u308A\u3001\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u306B\u306F\u3053\u308C\u304C\u3042\u308A\u307E\u305B\u3093\u3002","\u30DE\u30A6\u30B9\u64CD\u4F5C\u3067\u9805\u76EE\u3092\u30DB\u30D0\u30FC\u3059\u308B\u3068\u304D\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u80CC\u666F\u3002","\u30DE\u30A6\u30B9\u64CD\u4F5C\u3067\u9805\u76EE\u3092\u30DB\u30D0\u30FC\u3059\u308B\u3068\u304D\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u3002","\u30DE\u30A6\u30B9\u64CD\u4F5C\u3067\u9805\u76EE\u3092\u79FB\u52D5\u3059\u308B\u3068\u304D\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8 \u30C9\u30E9\u30C3\u30B0 \u30A2\u30F3\u30C9 \u30C9\u30ED\u30C3\u30D7\u306E\u80CC\u666F\u3002","\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u5185\u3092\u691C\u7D22\u3057\u3066\u3044\u308B\u3068\u304D\u3001\u4E00\u81F4\u3057\u305F\u5F37\u8ABF\u306E\u30C4\u30EA\u30FC\u30EA\u30B9\u30C8\u524D\u666F\u8272\u3002","\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u578B\u30D5\u30A3\u30EB\u30BF\u30FC \u30A6\u30A7\u30B8\u30A7\u30C3\u30C8\u306E\u80CC\u666F\u8272\u3002","\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u578B\u30D5\u30A3\u30EB\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u8272\u3002","\u4E00\u81F4\u9805\u76EE\u304C\u306A\u3044\u5834\u5408\u306E\u3001\u30EA\u30B9\u30C8\u304A\u3088\u3073\u30C4\u30EA\u30FC\u306E\u578B\u30D5\u30A3\u30EB\u30BF\u30FC \u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306E\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u8272\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u30C4\u30EA\u30FC \u30B9\u30C8\u30ED\u30FC\u30AF\u306E\u8272\u3002","\u30A4\u30F3\u30C7\u30F3\u30C8 \u30AC\u30A4\u30C9\u306E\u30C4\u30EA\u30FC \u30B9\u30C8\u30ED\u30FC\u30AF\u306E\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u524D\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u80CC\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u3067\u9078\u629E\u3055\u308C\u305F\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u524D\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u3067\u9078\u629E\u3055\u308C\u305F\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u80CC\u666F\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u3067\u9078\u629E\u3055\u308C\u305F\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30E1\u30CB\u30E5\u30FC\u5185\u306E\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u306E\u5883\u754C\u7DDA\u8272\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8 tabstop \u306E\u80CC\u666F\u8272\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8 tabstop \u306E\u5883\u754C\u7DDA\u306E\u8272\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u6700\u5F8C\u306E tabstop \u306E\u80CC\u666F\u8272\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u30B9\u30CB\u30DA\u30C3\u30C8\u306E\u6700\u5F8C\u306E\u30BF\u30D6\u30B9\u30C8\u30C3\u30D7\u3067\u5883\u754C\u7DDA\u306E\u8272\u3092\u5F37\u8ABF\u8868\u793A\u3057\u307E\u3059\u3002","\u691C\u51FA\u3055\u308C\u305F\u4E00\u81F4\u9805\u76EE\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u9078\u629E\u7BC4\u56F2\u3092\u5F37\u8ABF\u8868\u793A\u3059\u308B\u305F\u3081\u306E\u6982\u8981\u30EB\u30FC\u30E9\u30FC \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002\u3053\u306E\u8272\u306F\u3001\u57FA\u672C\u88C5\u98FE\u304C\u975E\u8868\u793A\u306B\u306A\u3089\u306A\u3044\u3088\u3046\u4E0D\u900F\u660E\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002","\u4E00\u81F4\u3092\u691C\u7D22\u3059\u308B\u305F\u3081\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u30A8\u30C7\u30A3\u30BF\u30FC\u306E\u9078\u629E\u7BC4\u56F2\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u30A8\u30E9\u30FC\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u8B66\u544A\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30DE\u30FC\u30AB\u30FC\u306E\u8272\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7\u306E\u80CC\u666F\u8272\u3002","\u30DF\u30CB\u30DE\u30C3\u30D7 \u30B9\u30E9\u30A4\u30C0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30DB\u30D0\u30FC\u30EA\u30F3\u30B0\u6642\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30B9\u30E9\u30A4\u30C0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u30AF\u30EA\u30C3\u30AF\u3057\u305F\u3068\u304D\u306E\u30DF\u30CB\u30DE\u30C3\u30D7 \u30B9\u30E9\u30A4\u30C0\u30FC\u306E\u80CC\u666F\u8272\u3002","\u554F\u984C\u306E\u30A8\u30E9\u30FC \u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002","\u554F\u984C\u306E\u8B66\u544A\u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002","\u554F\u984C\u60C5\u5831\u30A2\u30A4\u30B3\u30F3\u306B\u4F7F\u7528\u3055\u308C\u308B\u8272\u3002"],"vs/platform/theme/common/iconRegistry":["\u4F7F\u7528\u3059\u308B\u30D5\u30A9\u30F3\u30C8\u306E ID\u3002\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u306F\u3001\u6700\u521D\u306B\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u308B\u30D5\u30A9\u30F3\u30C8\u304C\u4F7F\u7528\u3055\u308C\u307E\u3059\u3002","\u30A2\u30A4\u30B3\u30F3\u5B9A\u7FA9\u306B\u95A2\u9023\u4ED8\u3051\u3089\u308C\u305F\u30D5\u30A9\u30F3\u30C8\u6587\u5B57\u3002","\u30A6\u30A3\u30B8\u30A7\u30C3\u30C8\u306B\u3042\u308B\u9589\u3058\u308B\u30A2\u30AF\u30B7\u30E7\u30F3\u306E\u30A2\u30A4\u30B3\u30F3\u3002"],"vs/platform/undoRedo/common/undoRedoService":["\u6B21\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u9589\u3058\u3089\u308C\u3001\u30C7\u30A3\u30B9\u30AF\u4E0A\u3067\u5909\u66F4\u3055\u308C\u307E\u3057\u305F: {0}\u3002","\u4EE5\u4E0B\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u4E92\u63DB\u6027\u306E\u306A\u3044\u65B9\u6CD5\u3067\u5909\u66F4\u3055\u308C\u307E\u3057\u305F: {0}\u3002","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002{1}","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F\u3002{1}","{1} \u306B\u5909\u66F4\u304C\u52A0\u3048\u3089\u308C\u305F\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3067\u3057\u305F","{1} \u3067\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u65E2\u306B\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066 '{0}' \u3092\u5143\u306B\u623B\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u305D\u306E\u671F\u9593\u306B\u5B9F\u884C\u4E2D\u3067\u3042\u3063\u305F\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066 '{0}' \u3092\u5143\u306B\u623B\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u5143\u306B\u623B\u3057\u307E\u3059\u304B?","{0} \u500B\u306E\u30D5\u30A1\u30A4\u30EB\u3067\u5143\u306B\u623B\u3059","\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u5143\u306B\u623B\u3059","\u30AD\u30E3\u30F3\u30BB\u30EB","\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u65E2\u306B\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001'{0}' \u3092\u5143\u306B\u623B\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002","'{0}' \u3092\u5143\u306B\u623B\u3057\u307E\u3059\u304B?","\u5143\u306B\u623B\u3059","\u30AD\u30E3\u30F3\u30BB\u30EB","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u3084\u308A\u76F4\u3057\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002{1}","\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u3084\u308A\u76F4\u3057\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002{1}","{1} \u306B\u5909\u66F4\u304C\u52A0\u3048\u3089\u308C\u305F\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3067 '{0}' \u3092\u518D\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","{1} \u3067\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u65E2\u306B\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066 '{0}' \u3092\u3084\u308A\u76F4\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u305D\u306E\u671F\u9593\u306B\u5B9F\u884C\u4E2D\u3067\u3042\u3063\u305F\u305F\u3081\u3001\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u5BFE\u3057\u3066 '{0}' \u3092\u3084\u308A\u76F4\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F","\u5143\u306B\u623B\u3059\u307E\u305F\u306F\u3084\u308A\u76F4\u3057\u64CD\u4F5C\u304C\u65E2\u306B\u5B9F\u884C\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001'{0}' \u3092\u3084\u308A\u76F4\u3059\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002"]}); diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ja.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ja.js.gz new file mode 100644 index 0000000..d46b179 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ja.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.js new file mode 100644 index 0000000..2286f81 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.js @@ -0,0 +1 @@ +define("vs/editor/editor.main.nls",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["input"],"vs/base/browser/ui/findinput/findInputCheckboxes":["Match Case","Match Whole Word","Use Regular Expression"],"vs/base/browser/ui/findinput/replaceInput":["input","Preserve Case"],"vs/base/browser/ui/iconLabel/iconLabel":["Loading..."],"vs/base/browser/ui/inputbox/inputBox":["Error: {0}","Warning: {0}","Info: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["Unbound"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["Clear","Disable Filter on Type","Enable Filter on Type","No elements found","Matched {0} out of {1} elements"],"vs/base/common/actions":["(empty)"],"vs/base/common/errorMessage":["{0}: {1}","A system error occurred ({0})","An unknown error occurred. Please consult the log for more details.","An unknown error occurred. Please consult the log for more details.","{0} ({1} errors in total)","An unknown error occurred. Please consult the log for more details."],"vs/base/common/keybindingLabels":["Ctrl","Shift","Alt","Windows","Ctrl","Shift","Alt","Super","Control","Shift","Alt","Command","Control","Shift","Alt","Windows","Control","Shift","Alt","Super"],"vs/base/parts/quickinput/browser/quickInput":["Back","{0}/{1}","Type to narrow down results.","{0} Results","{0} Selected","OK","Custom","Back ({0})","Back"],"vs/base/parts/quickinput/browser/quickInputList":["Quick Input"],"vs/editor/browser/controller/coreCommands":["Stick to the end even when going to longer lines","Stick to the end even when going to longer lines"],"vs/editor/browser/controller/textAreaHandler":["editor","The editor is not accessible at this time. Press {0} for options."],"vs/editor/browser/core/keybindingCancellation":["Whether the editor runs a cancellable operation, e.g. like 'Peek References'"],"vs/editor/browser/editorExtensions":["&&Undo","Undo","&&Redo","Redo","&&Select All","Select All"],"vs/editor/browser/widget/codeEditorWidget":["The number of cursors has been limited to {0}."],"vs/editor/browser/widget/diffEditorWidget":["Line decoration for inserts in the diff editor.","Line decoration for removals in the diff editor.","Cannot compare files because one file is too large."],"vs/editor/browser/widget/diffReview":["Icon for 'Insert' in diff review.","Icon for 'Remove' in diff review.","Icon for 'Close' in diff review.","Close","no lines changed","1 line changed","{0} lines changed","Difference {0} of {1}: original line {2}, {3}, modified line {4}, {5}","blank","{0} unchanged line {1}","{0} original line {1} modified line {2}","+ {0} modified line {1}","- {0} original line {1}","Go to Next Difference","Go to Previous Difference"],"vs/editor/browser/widget/inlineDiffMargin":["Copy deleted lines","Copy deleted line","Copy deleted line ({0})","Revert this change","Copy deleted line ({0})"],"vs/editor/common/config/commonEditorConfig":["Editor","The number of spaces a tab is equal to. This setting is overridden based on the file contents when `#editor.detectIndentation#` is on.","Insert spaces when pressing `Tab`. This setting is overridden based on the file contents when `#editor.detectIndentation#` is on.","Controls whether `#editor.tabSize#` and `#editor.insertSpaces#` will be automatically detected when a file is opened based on the file contents.","Remove trailing auto inserted whitespace.","Special handling for large files to disable certain memory intensive features.","Controls whether completions should be computed based on words in the document.","Only suggest words from the active document.","Suggest words from all open documents of the same language.","Suggest words from all open documents.","Controls from what documents word based completions are computed.","Semantic highlighting enabled for all color themes.","Semantic highlighting disabled for all color themes.","Semantic highlighting is configured by the current color theme's `semanticHighlighting` setting.","Controls whether the semanticHighlighting is shown for the languages that support it.","Keep peek editors open even when double clicking their content or when hitting `Escape`.","Lines above this length will not be tokenized for performance reasons","Timeout in milliseconds after which diff computation is cancelled. Use 0 for no timeout.","Controls whether the diff editor shows the diff side by side or inline.","When enabled, the diff editor ignores changes in leading or trailing whitespace.","Controls whether the diff editor shows +/- indicators for added/removed changes.","Controls whether the editor shows CodeLens.","Lines will never wrap.","Lines will wrap at the viewport width.","Lines will wrap according to the `#editor.wordWrap#` setting."],"vs/editor/common/config/editorOptions":["The editor will use platform APIs to detect when a Screen Reader is attached.","The editor will be permanently optimized for usage with a Screen Reader. Word wrapping will be disabled.","The editor will never be optimized for usage with a Screen Reader.","Controls whether the editor should run in a mode where it is optimized for screen readers. Setting to on will disable word wrapping.","Controls whether a space character is inserted when commenting.","Controls if empty lines should be ignored with toggle, add or remove actions for line comments.","Controls whether copying without a selection copies the current line.","Controls whether the cursor should jump to find matches while typing.","Controls whether the search string in the Find Widget is seeded from the editor selection.","Never turn on Find in selection automatically (default)","Always turn on Find in selection automatically","Turn on Find in selection automatically when multiple lines of content are selected.","Controls the condition for turning on find in selection automatically.","Controls whether the Find Widget should read or modify the shared find clipboard on macOS.","Controls whether the Find Widget should add extra lines on top of the editor. When true, you can scroll beyond the first line when the Find Widget is visible.","Controls whether the search automatically restarts from the beginning (or the end) when no further matches can be found.","Enables/Disables font ligatures ('calt' and 'liga' font features). Change this to a string for fine-grained control of the 'font-feature-settings' CSS property.","Explicit 'font-feature-settings' CSS property. A boolean can be passed instead if one only needs to turn on/off ligatures.","Configures font ligatures or font features. Can be either a boolean to enable/disable ligatures or a string for the value of the CSS 'font-feature-settings' property.","Controls the font size in pixels.",'Only "normal" and "bold" keywords or numbers between 1 and 1000 are allowed.','Controls the font weight. Accepts "normal" and "bold" keywords or numbers between 1 and 1000.',"Show peek view of the results (default)","Go to the primary result and show a peek view","Go to the primary result and enable peek-less navigation to others","This setting is deprecated, please use separate settings like 'editor.editor.gotoLocation.multipleDefinitions' or 'editor.editor.gotoLocation.multipleImplementations' instead.","Controls the behavior the 'Go to Definition'-command when multiple target locations exist.","Controls the behavior the 'Go to Type Definition'-command when multiple target locations exist.","Controls the behavior the 'Go to Declaration'-command when multiple target locations exist.","Controls the behavior the 'Go to Implementations'-command when multiple target locations exist.","Controls the behavior the 'Go to References'-command when multiple target locations exist.","Alternative command id that is being executed when the result of 'Go to Definition' is the current location.","Alternative command id that is being executed when the result of 'Go to Type Definition' is the current location.","Alternative command id that is being executed when the result of 'Go to Declaration' is the current location.","Alternative command id that is being executed when the result of 'Go to Implementation' is the current location.","Alternative command id that is being executed when the result of 'Go to Reference' is the current location.","Controls whether the hover is shown.","Controls the delay in milliseconds after which the hover is shown.","Controls whether the hover should remain visible when mouse is moved over it.","Enables the code action lightbulb in the editor.","Enables the inline hints in the editor.","Controls font size of inline hints in the editor. When set to `0`, the 90% of `#editor.fontSize#` is used.","Controls font family of inline hints in the editor.","Controls the line height. Use 0 to compute the line height from the font size.","Controls whether the minimap is shown.","The minimap has the same size as the editor contents (and might scroll).","The minimap will stretch or shrink as necessary to fill the height of the editor (no scrolling).","The minimap will shrink as necessary to never be larger than the editor (no scrolling).","Controls the size of the minimap.","Controls the side where to render the minimap.","Controls when the minimap slider is shown.","Scale of content drawn in the minimap: 1, 2 or 3.","Render the actual characters on a line as opposed to color blocks.","Limit the width of the minimap to render at most a certain number of columns.","Controls the amount of space between the top edge of the editor and the first line.","Controls the amount of space between the bottom edge of the editor and the last line.","Enables a pop-up that shows parameter documentation and type information as you type.","Controls whether the parameter hints menu cycles or closes when reaching the end of the list.","Enable quick suggestions inside strings.","Enable quick suggestions inside comments.","Enable quick suggestions outside of strings and comments.","Controls whether suggestions should automatically show up while typing.","Line numbers are not rendered.","Line numbers are rendered as absolute number.","Line numbers are rendered as distance in lines to cursor position.","Line numbers are rendered every 10 lines.","Controls the display of line numbers.","Number of monospace characters at which this editor ruler will render.","Color of this editor ruler.","Render vertical rulers after a certain number of monospace characters. Use multiple values for multiple rulers. No rulers are drawn if array is empty.","Insert suggestion without overwriting text right of the cursor.","Insert suggestion and overwrite text right of the cursor.","Controls whether words are overwritten when accepting completions. Note that this depends on extensions opting into this feature.","Controls whether filtering and sorting suggestions accounts for small typos.","Controls whether sorting favours words that appear close to the cursor.","Controls whether remembered suggestion selections are shared between multiple workspaces and windows (needs `#editor.suggestSelection#`).","Controls whether an active snippet prevents quick suggestions.","Controls whether to show or hide icons in suggestions.","Controls the visibility of the status bar at the bottom of the suggest widget.","Controls whether suggest details show inline with the label or only in the details widget","This setting is deprecated. The suggest widget can now be resized.","This setting is deprecated, please use separate settings like 'editor.suggest.showKeywords' or 'editor.suggest.showSnippets' instead.","When enabled IntelliSense shows `method`-suggestions.","When enabled IntelliSense shows `function`-suggestions.","When enabled IntelliSense shows `constructor`-suggestions.","When enabled IntelliSense shows `field`-suggestions.","When enabled IntelliSense shows `variable`-suggestions.","When enabled IntelliSense shows `class`-suggestions.","When enabled IntelliSense shows `struct`-suggestions.","When enabled IntelliSense shows `interface`-suggestions.","When enabled IntelliSense shows `module`-suggestions.","When enabled IntelliSense shows `property`-suggestions.","When enabled IntelliSense shows `event`-suggestions.","When enabled IntelliSense shows `operator`-suggestions.","When enabled IntelliSense shows `unit`-suggestions.","When enabled IntelliSense shows `value`-suggestions.","When enabled IntelliSense shows `constant`-suggestions.","When enabled IntelliSense shows `enum`-suggestions.","When enabled IntelliSense shows `enumMember`-suggestions.","When enabled IntelliSense shows `keyword`-suggestions.","When enabled IntelliSense shows `text`-suggestions.","When enabled IntelliSense shows `color`-suggestions.","When enabled IntelliSense shows `file`-suggestions.","When enabled IntelliSense shows `reference`-suggestions.","When enabled IntelliSense shows `customcolor`-suggestions.","When enabled IntelliSense shows `folder`-suggestions.","When enabled IntelliSense shows `typeParameter`-suggestions.","When enabled IntelliSense shows `snippet`-suggestions.","When enabled IntelliSense shows `user`-suggestions.","When enabled IntelliSense shows `issues`-suggestions.","Whether leading and trailing whitespace should always be selected.","Controls whether suggestions should be accepted on commit characters. For example, in JavaScript, the semi-colon (`;`) can be a commit character that accepts a suggestion and types that character.","Only accept a suggestion with `Enter` when it makes a textual change.","Controls whether suggestions should be accepted on `Enter`, in addition to `Tab`. Helps to avoid ambiguity between inserting new lines or accepting suggestions.","Controls the number of lines in the editor that can be read out by a screen reader. Warning: this has a performance implication for numbers larger than the default.","Editor content","Use language configurations to determine when to autoclose brackets.","Autoclose brackets only when the cursor is to the left of whitespace.","Controls whether the editor should automatically close brackets after the user adds an opening bracket.","Type over closing quotes or brackets only if they were automatically inserted.","Controls whether the editor should type over closing quotes or brackets.","Use language configurations to determine when to autoclose quotes.","Autoclose quotes only when the cursor is to the left of whitespace.","Controls whether the editor should automatically close quotes after the user adds an opening quote.","The editor will not insert indentation automatically.","The editor will keep the current line's indentation.","The editor will keep the current line's indentation and honor language defined brackets.","The editor will keep the current line's indentation, honor language defined brackets and invoke special onEnterRules defined by languages.","The editor will keep the current line's indentation, honor language defined brackets, invoke special onEnterRules defined by languages, and honor indentationRules defined by languages.","Controls whether the editor should automatically adjust the indentation when users type, paste, move or indent lines.","Use language configurations to determine when to automatically surround selections.","Surround with quotes but not brackets.","Surround with brackets but not quotes.","Controls whether the editor should automatically surround selections when typing quotes or brackets.","Emulate selection behaviour of tab characters when using spaces for indentation. Selection will stick to tab stops.","Controls whether the editor shows CodeLens.","Controls the font family for CodeLens.","Controls the font size in pixels for CodeLens. When set to `0`, the 90% of `#editor.fontSize#` is used.","Controls whether the editor should render the inline color decorators and color picker.","Enable that the selection with the mouse and keys is doing column selection.","Controls whether syntax highlighting should be copied into the clipboard.","Control the cursor animation style.","Controls whether the smooth caret animation should be enabled.","Controls the cursor style.","Controls the minimal number of visible leading and trailing lines surrounding the cursor. Known as 'scrollOff' or 'scrollOffset' in some other editors.","`cursorSurroundingLines` is enforced only when triggered via the keyboard or API.","`cursorSurroundingLines` is enforced always.","Controls when `cursorSurroundingLines` should be enforced.","Controls the width of the cursor when `#editor.cursorStyle#` is set to `line`.","Controls whether the editor should allow moving selections via drag and drop.","Scrolling speed multiplier when pressing `Alt`.","Controls whether the editor has code folding enabled.","Use a language-specific folding strategy if available, else the indentation-based one.","Use the indentation-based folding strategy.","Controls the strategy for computing folding ranges.","Controls whether the editor should highlight folded ranges.","Controls whether clicking on the empty content after a folded line will unfold the line.","Controls the font family.","Controls whether the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.","Controls whether the editor should automatically format the line after typing.","Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.","Controls whether the cursor should be hidden in the overview ruler.","Controls whether the editor should highlight the active indent guide.","Controls the letter spacing in pixels.","Controls whether the editor has linked editing enabled. Depending on the language, related symbols, e.g. HTML tags, are updated while editing.","Controls whether the editor should detect links and make them clickable.","Highlight matching brackets.","A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.","Zoom the font of the editor when using mouse wheel and holding `Ctrl`.","Merge multiple cursors when they are overlapping.","Maps to `Control` on Windows and Linux and to `Command` on macOS.","Maps to `Alt` on Windows and Linux and to `Option` on macOS.","The modifier to be used to add multiple cursors with the mouse. The Go To Definition and Open Link mouse gestures will adapt such that they do not conflict with the multicursor modifier. [Read more](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","Each cursor pastes a single line of the text.","Each cursor pastes the full text.","Controls pasting when the line count of the pasted text matches the cursor count.","Controls whether the editor should highlight semantic symbol occurrences.","Controls whether a border should be drawn around the overview ruler.","Focus the tree when opening peek","Focus the editor when opening peek","Controls whether to focus the inline editor or the tree in the peek widget.","Controls whether the Go to Definition mouse gesture always opens the peek widget.","Controls the delay in milliseconds after which quick suggestions will show up.","Controls whether the editor auto renames on type.","Deprecated, use `editor.linkedEditing` instead.","Controls whether the editor should render control characters.","Controls whether the editor should render indent guides.","Render last line number when the file ends with a newline.","Highlights both the gutter and the current line.","Controls how the editor should render the current line highlight.","Controls if the editor should render the current line highlight only when the editor is focused","Render whitespace characters except for single spaces between words.","Render whitespace characters only on selected text.","Render only trailing whitespace characters","Controls how the editor should render whitespace characters.","Controls whether selections should have rounded corners.","Controls the number of extra characters beyond which the editor will scroll horizontally.","Controls whether the editor will scroll beyond the last line.","Scroll only along the predominant axis when scrolling both vertically and horizontally at the same time. Prevents horizontal drift when scrolling vertically on a trackpad.","Controls whether the Linux primary clipboard should be supported.","Controls whether the editor should highlight matches similar to the selection.","Always show the folding controls.","Only show the folding controls when the mouse is over the gutter.","Controls when the folding controls on the gutter are shown.","Controls fading out of unused code.","Controls strikethrough deprecated variables.","Show snippet suggestions on top of other suggestions.","Show snippet suggestions below other suggestions.","Show snippets suggestions with other suggestions.","Do not show snippet suggestions.","Controls whether snippets are shown with other suggestions and how they are sorted.","Controls whether the editor will scroll using an animation.","Font size for the suggest widget. When set to `0`, the value of `#editor.fontSize#` is used.","Line height for the suggest widget. When set to `0`, the value of `#editor.lineHeight#` is used. The minimum value is 8.","Controls whether suggestions should automatically show up when typing trigger characters.","Always select the first suggestion.","Select recent suggestions unless further typing selects one, e.g. `console.| -> console.log` because `log` has been completed recently.","Select suggestions based on previous prefixes that have completed those suggestions, e.g. `co -> console` and `con -> const`.","Controls how suggestions are pre-selected when showing the suggest list.","Tab complete will insert the best matching suggestion when pressing tab.","Disable tab completions.","Tab complete snippets when their prefix match. Works best when 'quickSuggestions' aren't enabled.","Enables tab completions.","Unusual line terminators are automatically removed.","Unusual line terminators are ignored.","Unusual line terminators prompt to be removed.","Remove unusual line terminators that might cause problems.","Inserting and deleting whitespace follows tab stops.","Characters that will be used as word separators when doing word related navigations or operations.","Lines will never wrap.","Lines will wrap at the viewport width.","Lines will wrap at `#editor.wordWrapColumn#`.","Lines will wrap at the minimum of viewport and `#editor.wordWrapColumn#`.","Controls how lines should wrap.","Controls the wrapping column of the editor when `#editor.wordWrap#` is `wordWrapColumn` or `bounded`.","No indentation. Wrapped lines begin at column 1.","Wrapped lines get the same indentation as the parent.","Wrapped lines get +1 indentation toward the parent.","Wrapped lines get +2 indentation toward the parent.","Controls the indentation of wrapped lines.","Assumes that all characters are of the same width. This is a fast algorithm that works correctly for monospace fonts and certain scripts (like Latin characters) where glyphs are of equal width.","Delegates wrapping points computation to the browser. This is a slow algorithm, that might cause freezes for large files, but it works correctly in all cases.","Controls the algorithm that computes wrapping points."],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read only","Whether the context is a diff editor","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/model/editStack":["Typing"],"vs/editor/common/modes/modesRegistry":["Plain Text"],"vs/editor/common/standaloneStrings":["No selection","Line {0}, Column {1} ({2} selected)","Line {0}, Column {1}","{0} selections ({1} characters selected)","{0} selections","Now changing the setting `accessibilitySupport` to 'on'.","Now opening the Editor Accessibility documentation page."," in a read-only pane of a diff editor."," in a pane of a diff editor."," in a read-only code editor"," in a code editor","To configure the editor to be optimized for usage with a Screen Reader press Command+E now.","To configure the editor to be optimized for usage with a Screen Reader press Control+E now.","The editor is configured to be optimized for usage with a Screen Reader.","The editor is configured to never be optimized for usage with a Screen Reader, which is not the case at this time.","Pressing Tab in the current editor will move focus to the next focusable element. Toggle this behavior by pressing {0}.","Pressing Tab in the current editor will move focus to the next focusable element. The command {0} is currently not triggerable by a keybinding.","Pressing Tab in the current editor will insert the tab character. Toggle this behavior by pressing {0}.","Pressing Tab in the current editor will insert the tab character. The command {0} is currently not triggerable by a keybinding.","Press Command+H now to open a browser window with more information related to editor accessibility.","Press Control+H now to open a browser window with more information related to editor accessibility.","You can dismiss this tooltip and return to the editor by pressing Escape or Shift+Escape.","Show Accessibility Help","Developer: Inspect Tokens","Go to Line/Column...","Show all Quick Access Providers","Command Palette","Show And Run Commands","Go to Symbol...","Go to Symbol by Category...","Editor content","Press Alt+F1 for Accessibility Options.","Toggle High Contrast Theme","Made {0} edits in {1} files"],"vs/editor/common/view/editorColorRegistry":["Background color for the highlight of line at the cursor position.","Background color for the border around the line at the cursor position.","Background color of highlighted ranges, like by quick open and find features. The color must not be opaque so as not to hide underlying decorations.","Background color of the border around highlighted ranges.","Background color of highlighted symbol, like for go to definition or go next/previous symbol. The color must not be opaque so as not to hide underlying decorations.","Background color of the border around highlighted symbols.","Color of the editor cursor.","The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.","Color of whitespace characters in the editor.","Color of the editor indentation guides.","Color of the active editor indentation guides.","Color of editor line numbers.","Color of editor active line number","Id is deprecated. Use 'editorLineNumber.activeForeground' instead.","Color of editor active line number","Color of the editor rulers.","Foreground color of editor CodeLens","Background color behind matching brackets","Color for matching brackets boxes","Color of the overview ruler border.","Background color of the editor overview ruler. Only used when the minimap is enabled and placed on the right side of the editor.","Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.","Border color of unnecessary (unused) source code in the editor.","Opacity of unnecessary (unused) source code in the editor. For example, \"#000000c0\" will render the code with 75% opacity. For high contrast themes, use the 'editorUnnecessaryCode.border' theme color to underline unnecessary code instead of fading it out.","Overview ruler marker color for range highlights. The color must not be opaque so as not to hide underlying decorations.","Overview ruler marker color for errors.","Overview ruler marker color for warnings.","Overview ruler marker color for infos."],"vs/editor/contrib/anchorSelect/anchorSelect":["Selection Anchor","Anchor set at {0}:{1}","Set Selection Anchor","Go to Selection Anchor","Select from Anchor to Cursor","Cancel Selection Anchor"],"vs/editor/contrib/bracketMatching/bracketMatching":["Overview ruler marker color for matching brackets.","Go to Bracket","Select to Bracket","Go to &&Bracket"],"vs/editor/contrib/caretOperations/caretOperations":["Move Selected Text Left","Move Selected Text Right"],"vs/editor/contrib/caretOperations/transpose":["Transpose Letters"],"vs/editor/contrib/clipboard/clipboard":["Cu&&t","Cut","Cut","&&Copy","Copy","Copy","&&Paste","Paste","Paste","Copy With Syntax Highlighting"],"vs/editor/contrib/codeAction/codeActionCommands":["Kind of the code action to run.","Controls when the returned actions are applied.","Always apply the first returned code action.","Apply the first returned code action if it is the only one.","Do not apply the returned code actions.","Controls if only preferred code actions should be returned.","An unknown error occurred while applying the code action","Quick Fix...","No code actions available","No preferred code actions for '{0}' available","No code actions for '{0}' available","No preferred code actions available","No code actions available","Refactor...","No preferred refactorings for '{0}' available","No refactorings for '{0}' available","No preferred refactorings available","No refactorings available","Source Action...","No preferred source actions for '{0}' available","No source actions for '{0}' available","No preferred source actions available","No source actions available","Organize Imports","No organize imports action available","Fix All","No fix all action available","Auto Fix...","No auto fixes available"],"vs/editor/contrib/codeAction/lightBulbWidget":["Show Fixes. Preferred Fix Available ({0})","Show Fixes ({0})","Show Fixes"],"vs/editor/contrib/codelens/codelensController":["Show CodeLens Commands For Current Line"],"vs/editor/contrib/comment/comment":["Toggle Line Comment","&&Toggle Line Comment","Add Line Comment","Remove Line Comment","Toggle Block Comment","Toggle &&Block Comment"],"vs/editor/contrib/contextmenu/contextmenu":["Show Editor Context Menu"],"vs/editor/contrib/cursorUndo/cursorUndo":["Cursor Undo","Cursor Redo"],"vs/editor/contrib/find/findController":["Find","&&Find","Find With Selection","Find Next","Find Next","Find Previous","Find Previous","Find Next Selection","Find Previous Selection","Replace","&&Replace"],"vs/editor/contrib/find/findWidget":["Icon for 'Find in Selection' in the editor find widget.","Icon to indicate that the editor find widget is collapsed.","Icon to indicate that the editor find widget is expanded.","Icon for 'Replace' in the editor find widget.","Icon for 'Replace All' in the editor find widget.","Icon for 'Find Previous' in the editor find widget.","Icon for 'Find Next' in the editor find widget.","Find","Find","Previous match","Next match","Find in selection","Close","Replace","Replace","Replace","Replace All","Toggle Replace mode","Only the first {0} results are highlighted, but all find operations work on the entire text.","{0} of {1}","No results","{0} found","{0} found for '{1}'","{0} found for '{1}', at {2}","{0} found for '{1}'","Ctrl+Enter now inserts line break instead of replacing all. You can modify the keybinding for editor.action.replaceAll to override this behavior."],"vs/editor/contrib/folding/folding":["Unfold","Unfold Recursively","Fold","Toggle Fold","Fold Recursively","Fold All Block Comments","Fold All Regions","Unfold All Regions","Fold All","Unfold All","Fold Level {0}","Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations.","Color of the folding control in the editor gutter."],"vs/editor/contrib/folding/foldingDecorations":["Icon for expanded ranges in the editor glyph margin.","Icon for collapsed ranges in the editor glyph margin."],"vs/editor/contrib/fontZoom/fontZoom":["Editor Font Zoom In","Editor Font Zoom Out","Editor Font Zoom Reset"],"vs/editor/contrib/format/format":["Made 1 formatting edit on line {0}","Made {0} formatting edits on line {1}","Made 1 formatting edit between lines {0} and {1}","Made {0} formatting edits between lines {1} and {2}"],"vs/editor/contrib/format/formatActions":["Format Document","Format Selection"],"vs/editor/contrib/gotoError/gotoError":["Go to Next Problem (Error, Warning, Info)","Icon for goto next marker.","Go to Previous Problem (Error, Warning, Info)","Icon for goto previous marker.","Go to Next Problem in Files (Error, Warning, Info)","Next &&Problem","Go to Previous Problem in Files (Error, Warning, Info)","Previous &&Problem"],"vs/editor/contrib/gotoError/gotoErrorWidget":["Error","Warning","Info","Hint","{0} at {1}. ","{0} of {1} problems","{0} of {1} problem","Editor marker navigation widget error color.","Editor marker navigation widget warning color.","Editor marker navigation widget info color.","Editor marker navigation widget background."],"vs/editor/contrib/gotoSymbol/goToCommands":["Peek","Definitions","No definition found for '{0}'","No definition found","Go to Definition","Go to &&Definition","Open Definition to the Side","Peek Definition","Declarations","No declaration found for '{0}'","No declaration found","Go to Declaration","Go to &&Declaration","No declaration found for '{0}'","No declaration found","Peek Declaration","Type Definitions","No type definition found for '{0}'","No type definition found","Go to Type Definition","Go to &&Type Definition","Peek Type Definition","Implementations","No implementation found for '{0}'","No implementation found","Go to Implementations","Go to &&Implementations","Peek Implementations","No references found for '{0}'","No references found","Go to References","Go to &&References","References","Peek References","References","Go To Any Symbol","Locations","No results for '{0}'","References"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["Click to show {0} definitions."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["Loading...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} references","{0} reference","References"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["no preview available","No results","References"],"vs/editor/contrib/gotoSymbol/referencesModel":["symbol in {0} on line {1} at column {2}","symbol in {0} on line {1} at column {2}, {3}","1 symbol in {0}, full path {1}","{0} symbols in {1}, full path {2}","No results found","Found 1 symbol in {0}","Found {0} symbols in {1}","Found {0} symbols in {1} files"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["Symbol {0} of {1}, {2} for next","Symbol {0} of {1}"],"vs/editor/contrib/hover/hover":["Show Hover","Show Definition Preview Hover"],"vs/editor/contrib/hover/markdownHoverParticipant":["Loading..."],"vs/editor/contrib/hover/markerHoverParticipant":["View Problem","No quick fixes available","Checking for quick fixes...","No quick fixes available","Quick Fix..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["Replace with Previous Value","Replace with Next Value"],"vs/editor/contrib/indentation/indentation":["Convert Indentation to Spaces","Convert Indentation to Tabs","Configured Tab Size","Select Tab Size for Current File","Indent Using Tabs","Indent Using Spaces","Detect Indentation from Content","Reindent Lines","Reindent Selected Lines"],"vs/editor/contrib/linesOperations/linesOperations":["Copy Line Up","&&Copy Line Up","Copy Line Down","Co&&py Line Down","Duplicate Selection","&&Duplicate Selection","Move Line Up","Mo&&ve Line Up","Move Line Down","Move &&Line Down","Sort Lines Ascending","Sort Lines Descending","Trim Trailing Whitespace","Delete Line","Indent Line","Outdent Line","Insert Line Above","Insert Line Below","Delete All Left","Delete All Right","Join Lines","Transpose characters around the cursor","Transform to Uppercase","Transform to Lowercase","Transform to Title Case","Transform to Snake Case"],"vs/editor/contrib/linkedEditing/linkedEditing":["Start Linked Editing","Background color when the editor auto renames on type."],"vs/editor/contrib/links/links":["Execute command","Follow link","cmd + click","ctrl + click","option + click","alt + click","Execute command {0}","Failed to open this link because it is not well-formed: {0}","Failed to open this link because its target is missing.","Open Link"],"vs/editor/contrib/message/messageController":["Whether the editor is currently showing an inline message","Cannot edit in read-only editor"],"vs/editor/contrib/multicursor/multicursor":["Add Cursor Above","&&Add Cursor Above","Add Cursor Below","A&&dd Cursor Below","Add Cursors to Line Ends","Add C&&ursors to Line Ends","Add Cursors To Bottom","Add Cursors To Top","Add Selection To Next Find Match","Add &&Next Occurrence","Add Selection To Previous Find Match","Add P&&revious Occurrence","Move Last Selection To Next Find Match","Move Last Selection To Previous Find Match","Select All Occurrences of Find Match","Select All &&Occurrences","Change All Occurrences"],"vs/editor/contrib/parameterHints/parameterHints":["Trigger Parameter Hints"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["Icon for show next parameter hint.","Icon for show previous parameter hint.","{0}, hint"],"vs/editor/contrib/peekView/peekView":["Close","Background color of the peek view title area.","Color of the peek view title.","Color of the peek view title info.","Color of the peek view borders and arrow.","Background color of the peek view result list.","Foreground color for line nodes in the peek view result list.","Foreground color for file nodes in the peek view result list.","Background color of the selected entry in the peek view result list.","Foreground color of the selected entry in the peek view result list.","Background color of the peek view editor.","Background color of the gutter in the peek view editor.","Match highlight color in the peek view result list.","Match highlight color in the peek view editor.","Match highlight border in the peek view editor."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["Open a text editor first to go to a line.","Go to line {0} and column {1}.","Go to line {0}.","Current Line: {0}, Character: {1}. Type a line number between 1 and {2} to navigate to.","Current Line: {0}, Character: {1}. Type a line number to navigate to."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["To go to a symbol, first open a text editor with symbol information.","The active text editor does not provide symbol information.","No matching editor symbols","No editor symbols","Open to the Side","Open to the Bottom","symbols ({0})","properties ({0})","methods ({0})","functions ({0})","constructors ({0})","variables ({0})","classes ({0})","structs ({0})","events ({0})","operators ({0})","interfaces ({0})","namespaces ({0})","packages ({0})","type parameters ({0})","modules ({0})","properties ({0})","enumerations ({0})","enumeration members ({0})","strings ({0})","files ({0})","arrays ({0})","numbers ({0})","booleans ({0})","objects ({0})","keys ({0})","fields ({0})","constants ({0})"],"vs/editor/contrib/rename/rename":["No result.","An unknown error occurred while resolving rename location","Renaming '{0}'","Renaming {0}","Successfully renamed '{0}' to '{1}'. Summary: {2}","Rename failed to apply edits","Rename failed to compute edits","Rename Symbol","Enable/disable the ability to preview changes before renaming"],"vs/editor/contrib/rename/renameInputField":["Rename input. Type new name and press Enter to commit.","{0} to Rename, {1} to Preview"],"vs/editor/contrib/smartSelect/smartSelect":["Expand Selection","&&Expand Selection","Shrink Selection","&&Shrink Selection"],"vs/editor/contrib/snippet/snippetVariables":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sun","Mon","Tue","Wed","Thu","Fri","Sat","January","February","March","April","May","June","July","August","September","October","November","December","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"vs/editor/contrib/suggest/suggestController":["Accepting '{0}' made {1} additional edits","Trigger Suggest","Insert","Insert","Replace","Replace","Insert","show less","show more","Reset Suggest Widget Size"],"vs/editor/contrib/suggest/suggestWidget":["Background color of the suggest widget.","Border color of the suggest widget.","Foreground color of the suggest widget.","Background color of the selected entry in the suggest widget.","Color of the match highlights in the suggest widget.","Loading...","No suggestions.","{0}, docs: {1}","Suggest"],"vs/editor/contrib/suggest/suggestWidgetDetails":["Close","Loading..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["Icon for more information in the suggest widget.","Read More"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["The foreground color for array symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for boolean symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for class symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for color symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for constant symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for constructor symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for enumerator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for enumerator member symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for event symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for field symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for file symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for folder symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for function symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for interface symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for key symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for keyword symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for method symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for module symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for namespace symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for null symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for number symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for object symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for operator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for package symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for property symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for reference symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for snippet symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for string symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for struct symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for text symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for type parameter symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for unit symbols. These symbols appear in the outline, breadcrumb, and suggest widget.","The foreground color for variable symbols. These symbols appear in the outline, breadcrumb, and suggest widget."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["Toggle Tab Key Moves Focus","Pressing Tab will now move focus to the next focusable element","Pressing Tab will now insert the tab character"],"vs/editor/contrib/tokenization/tokenization":["Developer: Force Retokenize"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["Unusual Line Terminators","Detected unusual line terminators","This file contains one or more unusual line terminator characters, like Line Separator (LS) or Paragraph Separator (PS).\n\nIt is recommended to remove them from the file. This can be configured via `editor.unusualLineTerminators`.","Fix this file","Ignore problem for this file"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["Background color of a symbol during read-access, like reading a variable. The color must not be opaque so as not to hide underlying decorations.","Background color of a symbol during write-access, like writing to a variable. The color must not be opaque so as not to hide underlying decorations.","Border color of a symbol during read-access, like reading a variable.","Border color of a symbol during write-access, like writing to a variable.","Overview ruler marker color for symbol highlights. The color must not be opaque so as not to hide underlying decorations.","Overview ruler marker color for write-access symbol highlights. The color must not be opaque so as not to hide underlying decorations.","Go to Next Symbol Highlight","Go to Previous Symbol Highlight","Trigger Symbol Highlight"],"vs/editor/contrib/wordOperations/wordOperations":["Delete Word"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["Default Language Configuration Overrides","Configure editor settings to be overridden for a language.","This setting does not support per-language configuration.","Cannot register an empty property","Cannot register '{0}'. This matches property pattern '\\\\[.*\\\\]$' for describing language specific editor settings. Use 'configurationDefaults' contribution.","Cannot register '{0}'. This property is already registered."],"vs/platform/contextkey/browser/contextKeyService":["A command that returns information about context keys"],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["({0}) was pressed. Waiting for second key of chord...","The key combination ({0}, {1}) is not a command."],"vs/platform/list/browser/listService":["Workbench","Maps to `Control` on Windows and Linux and to `Command` on macOS.","Maps to `Alt` on Windows and Linux and to `Option` on macOS.","The modifier to be used to add an item in trees and lists to a multi-selection with the mouse (for example in the explorer, open editors and scm view). The 'Open to Side' mouse gestures - if supported - will adapt such that they do not conflict with the multiselect modifier.","Controls how to open items in trees and lists using the mouse (if supported). Note that some trees and lists might choose to ignore this setting if it is not applicable.","Controls whether lists and trees support horizontal scrolling in the workbench. Warning: turning on this setting has a performance implication.","Controls tree indentation in pixels.","Controls whether the tree should render indent guides.","Controls whether lists and trees have smooth scrolling.","Simple keyboard navigation focuses elements which match the keyboard input. Matching is done only on prefixes.","Highlight keyboard navigation highlights elements which match the keyboard input. Further up and down navigation will traverse only the highlighted elements.","Filter keyboard navigation will filter out and hide all the elements which do not match the keyboard input.","Controls the keyboard navigation style for lists and trees in the workbench. Can be simple, highlight and filter.","Controls whether keyboard navigation in lists and trees is automatically triggered simply by typing. If set to `false`, keyboard navigation is only triggered when executing the `list.toggleKeyboardNavigation` command, for which you can assign a keyboard shortcut.","Controls how tree folders are expanded when clicking the folder names. Note that some trees and lists might choose to ignore this setting if it is not applicable."],"vs/platform/markers/common/markers":["Error","Warning","Info"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","recently used","other commands","Command '{0}' resulted in an error ({1})"],"vs/platform/quickinput/browser/helpQuickAccess":["global commands","editor commands","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["Overall foreground color. This color is only used if not overridden by a component.","Overall foreground color for error messages. This color is only used if not overridden by a component.","The default color for icons in the workbench.","Overall border color for focused elements. This color is only used if not overridden by a component.","An extra border around elements to separate them from others for greater contrast.","An extra border around active elements to separate them from others for greater contrast.","Foreground color for links in text.","Background color for code blocks in text.","Shadow color of widgets such as find/replace inside the editor.","Input box background.","Input box foreground.","Input box border.","Border color of activated options in input fields.","Background color of activated options in input fields.","Foreground color of activated options in input fields.","Input validation background color for information severity.","Input validation foreground color for information severity.","Input validation border color for information severity.","Input validation background color for warning severity.","Input validation foreground color for warning severity.","Input validation border color for warning severity.","Input validation background color for error severity.","Input validation foreground color for error severity.","Input validation border color for error severity.","Dropdown background.","Dropdown foreground.","Button foreground color.","Button background color.","Button background color when hovering.","Badge background color. Badges are small information labels, e.g. for search results count.","Badge foreground color. Badges are small information labels, e.g. for search results count.","Scrollbar shadow to indicate that the view is scrolled.","Scrollbar slider background color.","Scrollbar slider background color when hovering.","Scrollbar slider background color when clicked on.","Background color of the progress bar that can show for long running operations.","Background color of error text in the editor. The color must not be opaque so as not to hide underlying decorations.","Foreground color of error squigglies in the editor.","Border color of error boxes in the editor.","Background color of warning text in the editor. The color must not be opaque so as not to hide underlying decorations.","Foreground color of warning squigglies in the editor.","Border color of warning boxes in the editor.","Background color of info text in the editor. The color must not be opaque so as not to hide underlying decorations.","Foreground color of info squigglies in the editor.","Border color of info boxes in the editor.","Foreground color of hint squigglies in the editor.","Border color of hint boxes in the editor.","Editor background color.","Editor default foreground color.","Background color of editor widgets, such as find/replace.","Foreground color of editor widgets, such as find/replace.","Border color of editor widgets. The color is only used if the widget chooses to have a border and if the color is not overridden by a widget.","Border color of the resize bar of editor widgets. The color is only used if the widget chooses to have a resize border and if the color is not overridden by a widget.","Quick picker background color. The quick picker widget is the container for pickers like the command palette.","Quick picker foreground color. The quick picker widget is the container for pickers like the command palette.","Quick picker title background color. The quick picker widget is the container for pickers like the command palette.","Quick picker background color for the focused item.","Quick picker color for grouping labels.","Quick picker color for grouping borders.","Color of the editor selection.","Color of the selected text for high contrast.","Color of the selection in an inactive editor. The color must not be opaque so as not to hide underlying decorations.","Color for regions with the same content as the selection. The color must not be opaque so as not to hide underlying decorations.","Border color for regions with the same content as the selection.","Color of the current search match.","Color of the other search matches. The color must not be opaque so as not to hide underlying decorations.","Color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations.","Border color of the current search match.","Border color of the other search matches.","Border color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations.","Highlight below the word for which a hover is shown. The color must not be opaque so as not to hide underlying decorations.","Background color of the editor hover.","Foreground color of the editor hover.","Border color of the editor hover.","Background color of the editor hover status bar.","Color of active links.","Foreground color of inline hints","Background color of inline hints","The color used for the lightbulb actions icon.","The color used for the lightbulb auto fix actions icon.","Background color for text that got inserted. The color must not be opaque so as not to hide underlying decorations.","Background color for text that got removed. The color must not be opaque so as not to hide underlying decorations.","Outline color for the text that got inserted.","Outline color for text that got removed.","Border color between the two text editors.","Color of the diff editor's diagonal fill. The diagonal fill is used in side-by-side diff views.","List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree background color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","List/Tree background when hovering over items using the mouse.","List/Tree foreground when hovering over items using the mouse.","List/Tree drag and drop background when moving items around using the mouse.","List/Tree foreground color of the match highlights when searching inside the list/tree.","Background color of the type filter widget in lists and trees.","Outline color of the type filter widget in lists and trees.","Outline color of the type filter widget in lists and trees, when there are no matches.","Tree stroke color for the indentation guides.","Tree stroke color for the indentation guides.","Border color of menus.","Foreground color of menu items.","Background color of menu items.","Foreground color of the selected menu item in menus.","Background color of the selected menu item in menus.","Border color of the selected menu item in menus.","Color of a separator menu item in menus.","Highlight background color of a snippet tabstop.","Highlight border color of a snippet tabstop.","Highlight background color of the final tabstop of a snippet.","Highlight border color of the final tabstop of a snippet.","Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations.","Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations.","Minimap marker color for find matches.","Minimap marker color for the editor selection.","Minimap marker color for errors.","Minimap marker color for warnings.","Minimap background color.","Minimap slider background color.","Minimap slider background color when hovering.","Minimap slider background color when clicked on.","The color used for the problems error icon.","The color used for the problems warning icon.","The color used for the problems info icon."],"vs/platform/theme/common/iconRegistry":["The id of the font to use. If not set, the font that is defined first is used.","The font character associated with the icon definition.","Icon for the close action in widgets."],"vs/platform/undoRedo/common/undoRedoService":["The following files have been closed and modified on disk: {0}.","The following files have been modified in an incompatible way: {0}.","Could not undo '{0}' across all files. {1}","Could not undo '{0}' across all files. {1}","Could not undo '{0}' across all files because changes were made to {1}","Could not undo '{0}' across all files because there is already an undo or redo operation running on {1}","Could not undo '{0}' across all files because an undo or redo operation occurred in the meantime","Would you like to undo '{0}' across all files?","Undo in {0} Files","Undo this File","Cancel","Could not undo '{0}' because there is already an undo or redo operation running.","Would you like to undo '{0}'?","Undo","Cancel","Could not redo '{0}' across all files. {1}","Could not redo '{0}' across all files. {1}","Could not redo '{0}' across all files because changes were made to {1}","Could not redo '{0}' across all files because there is already an undo or redo operation running on {1}","Could not redo '{0}' across all files because an undo or redo operation occurred in the meantime","Could not redo '{0}' because there is already an undo or redo operation running."]}); \ No newline at end of file diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.js.gz new file mode 100644 index 0000000..b3523b5 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ko.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ko.js new file mode 100644 index 0000000..557cb4d --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ko.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.ko",{"vs/base/browser/ui/actionbar/actionViewItems":["{0}({1})"],"vs/base/browser/ui/findinput/findInput":["\uC785\uB825"],"vs/base/browser/ui/findinput/findInputCheckboxes":["\uB300/\uC18C\uBB38\uC790 \uAD6C\uBD84","\uB2E8\uC5B4 \uB2E8\uC704\uB85C","\uC815\uADDC\uC2DD \uC0AC\uC6A9"],"vs/base/browser/ui/findinput/replaceInput":["\uC785\uB825","\uB300/\uC18C\uBB38\uC790 \uBCF4\uC874"],"vs/base/browser/ui/iconLabel/iconLabel":["\uB85C\uB4DC \uC911..."],"vs/base/browser/ui/inputbox/inputBox":["\uC624\uB958: {0}","\uACBD\uACE0: {0}","\uC815\uBCF4: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\uBC14\uC778\uB529 \uC548 \uB428"],"vs/base/browser/ui/menu/menu":["{0}({1})"],"vs/base/browser/ui/tree/abstractTree":["\uC9C0\uC6B0\uAE30","\uD615\uC2DD\uC744 \uAE30\uC900\uC73C\uB85C \uD544\uD130\uB9C1 \uC0AC\uC6A9 \uC548 \uD568","\uD615\uC2DD\uC744 \uAE30\uC900\uC73C\uB85C \uD544\uD130\uB9C1 \uC0AC\uC6A9","\uCC3E\uC740 \uC694\uC18C \uC5C6\uC74C","{1}\uAC1C \uC694\uC18C \uC911 {0}\uAC1C \uC77C\uCE58"],"vs/base/common/actions":["(\uBE44\uC5B4 \uC788\uC74C)"],"vs/base/common/errorMessage":["{0}: {1}","\uC2DC\uC2A4\uD15C \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4({0}).","\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC740 \uB85C\uADF8\uB97C \uCC38\uC870\uD558\uC138\uC694.","\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC740 \uB85C\uADF8\uB97C \uCC38\uC870\uD558\uC138\uC694.","{0}(\uCD1D {1}\uAC1C\uC758 \uC624\uB958)","\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC740 \uB85C\uADF8\uB97C \uCC38\uC870\uD558\uC138\uC694."],"vs/base/common/keybindingLabels":["Ctrl","","","Windows","Ctrl","","","\uC288\uD37C","\uC81C\uC5B4","","","\uBA85\uB839","\uC81C\uC5B4","","","Windows","\uC81C\uC5B4","","","\uC288\uD37C"],"vs/base/parts/quickinput/browser/quickInput":["\uB4A4\uB85C","{0} / {1}","\uACB0\uACFC\uC758 \uBC94\uC704\uB97C \uCD95\uC18C\uD558\uB824\uBA74 \uC785\uB825\uD558\uC138\uC694.","{0}\uAC1C \uACB0\uACFC","{0} \uC120\uD0DD\uB428","\uD655\uC778","\uC0AC\uC6A9\uC790 \uC9C0\uC815","\uB4A4\uB85C({0})","\uB4A4\uB85C"],"vs/base/parts/quickinput/browser/quickInputList":["\uBE60\uB978 \uC785\uB825"],"vs/editor/browser/controller/coreCommands":["\uB354 \uAE34 \uC904\uB85C \uC774\uB3D9\uD558\uB294 \uACBD\uC6B0\uC5D0\uB3C4 \uB05D\uC5D0 \uACE0\uC815","\uB354 \uAE34 \uC904\uB85C \uC774\uB3D9\uD558\uB294 \uACBD\uC6B0\uC5D0\uB3C4 \uB05D\uC5D0 \uACE0\uC815"],"vs/editor/browser/controller/textAreaHandler":["\uD3B8\uC9D1\uAE30","\uD604\uC7AC \uD3B8\uC9D1\uAE30\uC5D0 \uC561\uC138\uC2A4\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC635\uC158\uC744 \uBCF4\uB824\uBA74 {0}\uC744(\uB97C) \uB204\uB985\uB2C8\uB2E4."],"vs/editor/browser/core/keybindingCancellation":["\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uCDE8\uC18C \uAC00\uB2A5\uD55C \uC791\uC5C5(\uC608: '\uCC38\uC870 \uD53C\uD0B9')\uC744 \uC2E4\uD589\uD558\uB294\uC9C0 \uC5EC\uBD80"],"vs/editor/browser/editorExtensions":["\uC2E4\uD589 \uCDE8\uC18C(&&U)","\uC2E4\uD589 \uCDE8\uC18C","\uB2E4\uC2DC \uC2E4\uD589(&&R)","\uB2E4\uC2DC \uC2E4\uD589","\uBAA8\uB450 \uC120\uD0DD(&&S)","\uBAA8\uB450 \uC120\uD0DD"],"vs/editor/browser/widget/codeEditorWidget":["\uCEE4\uC11C \uC218\uB294 {0}(\uC73C)\uB85C \uC81C\uD55C\uB418\uC5C8\uC2B5\uB2C8\uB2E4."],"vs/editor/browser/widget/diffEditorWidget":["diff \uD3B8\uC9D1\uAE30\uC758 \uC0BD\uC785\uC5D0 \uB300\uD55C \uC904 \uB370\uCF54\uB808\uC774\uC158\uC785\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC758 \uC81C\uAC70\uC5D0 \uB300\uD55C \uC904 \uB370\uCF54\uB808\uC774\uC158\uC785\uB2C8\uB2E4.","\uD30C\uC77C 1\uAC1C\uAC00 \uB108\uBB34 \uCEE4\uC11C \uD30C\uC77C\uC744 \uBE44\uAD50\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."],"vs/editor/browser/widget/diffReview":["Diff \uAC80\uD1A0\uC5D0\uC11C '\uC0BD\uC785'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","Diff \uAC80\uD1A0\uC5D0\uC11C '\uC81C\uAC70'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","Diff \uAC80\uD1A0\uC5D0\uC11C '\uB2EB\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uB2EB\uAE30","\uBCC0\uACBD\uB41C \uC904 \uC5C6\uC74C","\uC120 1\uAC1C \uBCC0\uACBD\uB428","\uC904 {0}\uAC1C \uBCC0\uACBD\uB428","\uCC28\uC774 {0}/{1}: \uC6D0\uB798 \uC904 {2}, {3}, \uC218\uC815\uB41C \uC904 {4}, {5}","\uBE44\uC5B4 \uC788\uC74C","{0} \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC740 \uC904 {1}","{0} \uC6D0\uB798 \uC904 {1} \uC218\uC815\uB41C \uC904 {2}","+ {0} \uC218\uC815\uB41C \uC904 {1}","- {0} \uC6D0\uB798 \uC904 {1}","\uB2E4\uC74C \uB2E4\uB978 \uD56D\uBAA9\uC73C\uB85C \uC774\uB3D9","\uB2E4\uC74C \uB2E4\uB978 \uD56D\uBAA9\uC73C\uB85C \uC774\uB3D9"],"vs/editor/browser/widget/inlineDiffMargin":["\uC0AD\uC81C\uB41C \uC904 \uBCF5\uC0AC","\uC0AD\uC81C\uB41C \uC904 \uBCF5\uC0AC","\uC0AD\uC81C\uB41C \uC904 \uBCF5\uC0AC({0})","\uC774 \uBCC0\uACBD \uB0B4\uC6A9 \uB418\uB3CC\uB9AC\uAE30","\uC0AD\uC81C\uB41C \uC904 \uBCF5\uC0AC({0})"],"vs/editor/common/config/commonEditorConfig":["\uD3B8\uC9D1\uAE30","\uD0ED \uD55C \uAC1C\uC5D0 \uD574\uB2F9\uD558\uB294 \uACF5\uBC31 \uC218\uC785\uB2C8\uB2E4. `#editor.detectIndentation#`\uC774 \uCF1C\uC838 \uC788\uB294 \uACBD\uC6B0 \uC774 \uC124\uC815\uC740 \uD30C\uC77C \uCF58\uD150\uCE20\uC5D0 \uB530\uB77C \uC7AC\uC815\uC758\uB429\uB2C8\uB2E4.","'\uD0ED' \uD0A4\uB97C \uB204\uB97C \uB54C \uACF5\uBC31\uC744 \uC0BD\uC785\uD569\uB2C8\uB2E4. `#editor.detectIndentation#`\uC774 \uCF1C\uC838 \uC788\uB294 \uACBD\uC6B0 \uC774 \uC124\uC815\uC740 \uD30C\uC77C \uCF58\uD150\uCE20\uC5D0 \uB530\uB77C \uC7AC\uC815\uC758\uB429\uB2C8\uB2E4.","\uD30C\uC77C\uC744 \uC5F4 \uB54C \uD30C\uC77C \uCF58\uD150\uCE20\uB97C \uAE30\uBC18\uC73C\uB85C `#editor.tabSize#`\uC640 `#editor.insertSpaces#`\uAC00 \uC790\uB3D9\uC73C\uB85C \uAC80\uC0C9\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB05D\uC5D0 \uC790\uB3D9 \uC0BD\uC785\uB41C \uACF5\uBC31\uC744 \uC81C\uAC70\uD569\uB2C8\uB2E4.","\uD070 \uD30C\uC77C\uC5D0 \uB300\uD55C \uD2B9\uC218 \uCC98\uB9AC\uB85C, \uBA54\uBAA8\uB9AC\uB97C \uB9CE\uC774 \uC0AC\uC6A9\uD558\uB294 \uD2B9\uC815 \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uBB38\uC11C \uB0B4 \uB2E8\uC5B4\uB97C \uAE30\uBC18\uC73C\uB85C \uC644\uC131\uC744 \uACC4\uC0B0\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD65C\uC131 \uBB38\uC11C\uC5D0\uC11C\uB9CC \uB2E8\uC5B4\uB97C \uC81C\uC548\uD569\uB2C8\uB2E4.","\uAC19\uC740 \uC5B8\uC5B4\uC758 \uBAA8\uB4E0 \uC5F4\uB9B0 \uBB38\uC11C\uC5D0\uC11C \uB2E8\uC5B4\uB97C \uC81C\uC548\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uC5F4\uB9B0 \uBB38\uC11C\uC5D0\uC11C \uB2E8\uC5B4\uB97C \uC81C\uC548\uD569\uB2C8\uB2E4.","\uB2E8\uC5B4 \uAE30\uBC18 \uC644\uC131\uC774 \uCEF4\uD4E8\uD305\uB418\uB294 \uBB38\uC11C\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uC0C9 \uD14C\uB9C8\uC5D0 \uB300\uD574 \uC758\uBBF8 \uCCB4\uACC4 \uAC15\uC870 \uD45C\uC2DC\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uC0C9 \uD14C\uB9C8\uC5D0 \uB300\uD574 \uC758\uBBF8 \uCCB4\uACC4 \uAC15\uC870 \uD45C\uC2DC\uB97C \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC758\uBBF8 \uCCB4\uACC4 \uAC15\uC870 \uD45C\uC2DC\uB294 \uD604\uC7AC \uC0C9 \uD14C\uB9C8\uC758 `semanticHighlighting` \uC124\uC815\uC5D0 \uB530\uB77C \uAD6C\uC131\uB429\uB2C8\uB2E4.","semanticHighlighting\uC774 \uC9C0\uC6D0\uD558\uB294 \uC5B8\uC5B4\uC5D0 \uB300\uD574 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD574\uB2F9 \uCF58\uD150\uCE20\uB97C \uB450 \uBC88 \uD074\uB9AD\uD558\uAC70\uB098 'Esc' \uD0A4\uB97C \uB204\uB974\uB354\uB77C\uB3C4 Peek \uD3B8\uC9D1\uAE30\uB97C \uC5F4\uB9B0 \uC0C1\uD0DC\uB85C \uC720\uC9C0\uD569\uB2C8\uB2E4.","\uC774 \uAE38\uC774\uB97C \uCD08\uACFC\uD558\uB294 \uC904\uC740 \uC131\uB2A5\uC0C1\uC758 \uC774\uC720\uB85C \uD1A0\uD070\uD654\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","diff \uACC4\uC0B0\uC774 \uCDE8\uC18C\uB41C \uD6C4 \uBC00\uB9AC\uCD08 \uB2E8\uC704\uB85C \uC2DC\uAC04\uC744 \uC81C\uD55C\uD569\uB2C8\uB2E4. \uC81C\uD55C \uC2DC\uAC04\uC774 \uC5C6\uB294 \uACBD\uC6B0 0\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C diff\uB97C \uB098\uB780\uD788 \uD45C\uC2DC\uD560\uC9C0 \uC778\uB77C\uC778\uC73C\uB85C \uD45C\uC2DC\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD558\uBA74 Diff \uD3B8\uC9D1\uAE30\uAC00 \uC120\uD589 \uB610\uB294 \uD6C4\uD589 \uACF5\uBC31\uC758 \uBCC0\uACBD \uB0B4\uC6A9\uC744 \uBB34\uC2DC\uD569\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uCD94\uAC00/\uC81C\uAC70\uB41C \uBCC0\uACBD \uB0B4\uC6A9\uC5D0 \uB300\uD574 +/- \uD45C\uC2DC\uAE30\uB97C \uD45C\uC2DC\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C CodeLens\uB97C \uD45C\uC2DC\uD560 \uAC83\uC778\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC904\uC774 \uBC14\uB00C\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBDF0\uD3EC\uD2B8 \uB108\uBE44\uC5D0\uC11C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4.","`#editor.wordWrap#` \uC124\uC815\uC5D0 \uB530\uB77C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4."],"vs/editor/common/config/editorOptions":["\uD3B8\uC9D1\uAE30\uAC00 \uC2A4\uD06C\uB9B0 \uB9AC\uB354\uAC00 \uC5F0\uACB0\uB418\uBA74 \uD50C\uB7AB\uD3FC API\uB97C \uC0AC\uC6A9\uD558\uC5EC \uAC10\uC9C0\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8\uACFC \uD568\uAED8 \uC0AC\uC6A9\uB418\uB3C4\uB85D \uC601\uAD6C\uC801\uC73C\uB85C \uCD5C\uC801\uD654\uB418\uBA70, \uC790\uB3D9 \uC904 \uBC14\uAFC8\uC774 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uC2A4\uD06C\uB9B0 \uB9AC\uB354 \uC0AC\uC6A9\uC744 \uC704\uD574 \uCD5C\uC801\uD654\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB97C \uD654\uBA74 \uC77D\uAE30 \uD504\uB85C\uADF8\uB7A8\uC5D0 \uCD5C\uC801\uD654\uB41C \uBAA8\uB4DC\uB85C \uC2E4\uD589\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD558\uBA74 \uC790\uB3D9 \uC904 \uBC14\uAFC8\uC774 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uB429\uB2C8\uB2E4.","\uC8FC\uC11D\uC744 \uB2EC \uB54C \uACF5\uBC31 \uBB38\uC790\uB97C \uC0BD\uC785\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBE48 \uC904\uC744 \uC904 \uC8FC\uC11D\uC5D0 \uB300\uD55C \uD1A0\uAE00, \uCD94\uAC00 \uB610\uB294 \uC81C\uAC70 \uC791\uC5C5\uC73C\uB85C \uBB34\uC2DC\uD574\uC57C \uD558\uB294\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED \uC5C6\uC774 \uD604\uC7AC \uC904 \uBCF5\uC0AC \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC785\uB825\uD558\uB294 \uB3D9\uC548 \uC77C\uCE58 \uD56D\uBAA9\uC744 \uCC3E\uAE30 \uC704\uD55C \uCEE4\uC11C \uC774\uB3D9 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC120\uD0DD\uC5D0\uC11C Find Widget\uC758 \uAC80\uC0C9 \uBB38\uC790\uC5F4\uC744 \uC2DC\uB529\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC120\uD0DD \uD56D\uBAA9\uC5D0\uC11C \uCC3E\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uCF1C\uC9C0 \uC54A\uC74C(\uAE30\uBCF8\uAC12)","\uC120\uD0DD \uD56D\uBAA9\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uD56D\uC0C1 \uCC3E\uAE30 \uCF1C\uAE30","\uC5EC\uB7EC \uC904\uC758 \uCF58\uD150\uCE20\uB97C \uC120\uD0DD\uD558\uBA74 \uC120\uD0DD \uD56D\uBAA9\uC5D0\uC11C \uCC3E\uAE30\uAC00 \uC790\uB3D9\uC73C\uB85C \uCF1C\uC9D1\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uCC3E\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uC124\uC815\uD558\uB294 \uC870\uAC74\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","macOS\uC5D0\uC11C Find Widget\uC774 \uACF5\uC720 \uD074\uB9BD\uBCF4\uB4DC \uCC3E\uAE30\uB97C \uC77D\uC744\uC9C0 \uC218\uC815\uD560\uC9C0 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC704\uC82F \uCC3E\uAE30\uC5D0\uC11C \uD3B8\uC9D1\uAE30 \uB9E8 \uC704\uC5D0 \uC904\uC744 \uCD94\uAC00\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. true\uC778 \uACBD\uC6B0 \uC704\uC82F \uCC3E\uAE30\uAC00 \uD45C\uC2DC\uB418\uBA74 \uCCAB \uBC88\uC9F8 \uC904 \uC704\uB85C \uC2A4\uD06C\uB864\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uB354 \uC774\uC0C1 \uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC774 \uC5C6\uC744 \uB54C \uAC80\uC0C9\uC744 \uCC98\uC74C\uC774\uB098 \uB05D\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uB2E4\uC2DC \uC2DC\uC791\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAE00\uAF34 \uD569\uC790('calt' \uBC0F 'liga' \uAE00\uAF34 \uAE30\uB2A5)\uB97C \uC0AC\uC6A9\uD558\uAC70\uB098 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4. 'font-feature-settings' CSS \uC18D\uC131\uC758 \uC138\uBD84\uD654\uB41C \uC81C\uC5B4\uB97C \uC704\uD574 \uBB38\uC790\uC5F4\uB85C \uBCC0\uACBD\uD569\uB2C8\uB2E4.","\uBA85\uC2DC\uC801 'font-feature-settings' CSS \uC18D\uC131\uC785\uB2C8\uB2E4. \uD569\uC790\uB97C \uCF1C\uAC70\uB098 \uAEBC\uC57C \uD558\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uBD80\uC6B8\uC744 \uB300\uC2E0 \uC804\uB2EC\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uAE00\uAF34 \uD569\uC790 \uB610\uB294 \uAE00\uAF34 \uAE30\uB2A5\uC744 \uAD6C\uC131\uD569\uB2C8\uB2E4. CSS 'font-feature-settings' \uC18D\uC131\uC758 \uAC12\uC5D0 \uB300\uD574 \uD569\uC790 \uB610\uB294 \uBB38\uC790\uC5F4\uC744 \uC0AC\uC6A9\uD558\uAC70\uB098 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD558\uAE30 \uC704\uD55C \uBD80\uC6B8\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uAE00\uAF34 \uD06C\uAE30(\uD53D\uC140)\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.",'"\uD45C\uC900" \uBC0F "\uAD75\uAC8C" \uD0A4\uC6CC\uB4DC \uB610\uB294 1~1000 \uC0AC\uC774\uC758 \uC22B\uC790\uB9CC \uD5C8\uC6A9\uB429\uB2C8\uB2E4.','\uAE00\uAF34 \uB450\uAED8\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. "\uD45C\uC900" \uBC0F "\uAD75\uAC8C" \uD0A4\uC6CC\uB4DC \uB610\uB294 1~1000 \uC0AC\uC774\uC758 \uC22B\uC790\uB97C \uD5C8\uC6A9\uD569\uB2C8\uB2E4.',"\uACB0\uACFC Peek \uBDF0 \uD45C\uC2DC(\uAE30\uBCF8)","\uAE30\uBCF8 \uACB0\uACFC\uB85C \uC774\uB3D9\uD558\uC5EC Peek \uBCF4\uAE30\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uAE30\uBCF8 \uACB0\uACFC\uB85C \uC774\uB3D9\uD558\uACE0 \uB2E4\uB978 \uD56D\uBAA9\uC5D0 \uB300\uD574 peek \uC5C6\uB294 \uD0D0\uC0C9\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815","\uC774 \uC124\uC815\uC740 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 'editor.editor.gotoLocation.multipleDefinitions' \uB610\uB294 'editor.editor.gotoLocation.multipleImplementations'\uC640 \uAC19\uC740 \uBCC4\uB3C4\uC758 \uC124\uC815\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 '\uC815\uC758\uB85C \uC774\uB3D9' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 '\uC720\uD615 \uC815\uC758\uB85C \uC774\uB3D9' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 'Go to Declaration' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 '\uAD6C\uD604\uC73C\uB85C \uC774\uB3D9' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uB300\uC0C1 \uC704\uCE58\uAC00 \uC788\uB294 \uACBD\uC6B0 '\uCC38\uC870\uB85C \uC774\uB3D9' \uBA85\uB839 \uB3D9\uC791\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","'\uC815\uC758\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","'\uD615\uC2DD \uC815\uC758\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","'\uC120\uC5B8\uC73C\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","'\uAD6C\uD604\uC73C\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","'\uCC38\uC870\uB85C \uC774\uB3D9'\uC758 \uACB0\uACFC\uAC00 \uD604\uC7AC \uC704\uCE58\uC77C \uB54C \uC2E4\uD589\uB418\uB294 \uB300\uCCB4 \uBA85\uB839 ID\uC785\uB2C8\uB2E4.","\uD638\uBC84 \uD45C\uC2DC \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD638\uBC84\uAC00 \uD45C\uC2DC\uB418\uAE30 \uC804\uAE4C\uC9C0\uC758 \uC9C0\uC5F0 \uC2DC\uAC04(\uBC00\uB9AC\uCD08)\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB97C \uD574\uB2F9 \uD56D\uBAA9 \uC704\uB85C \uC774\uB3D9\uD560 \uB54C \uD638\uBC84\uB97C \uACC4\uC18D \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uCF54\uB4DC \uB3D9\uC791 \uC804\uAD6C\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB77C\uC778 \uD78C\uD2B8\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uAE00\uAF34 \uD06C\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. `0`\uC73C\uB85C \uC124\uC815\uD558\uBA74 `#editor.fontSize#`\uC758 90%\uAC00 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uAE00\uAF34 \uD328\uBC00\uB9AC\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC904 \uB192\uC774\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uAE00\uAF34 \uD06C\uAE30\uC5D0\uC11C \uC904 \uB192\uC774\uB97C \uACC4\uC0B0\uD558\uB824\uBA74 0\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5 \uD45C\uC2DC \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5\uC758 \uD06C\uAE30\uB294 \uD3B8\uC9D1\uAE30 \uB0B4\uC6A9\uACFC \uB3D9\uC77C\uD558\uBA70 \uC2A4\uD06C\uB864\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uB192\uC774\uB97C \uB9DE\uCD94\uAE30 \uC704\uD574 \uD544\uC694\uC5D0 \uB530\uB77C \uBBF8\uB2C8\uB9F5\uC774 \uD655\uC7A5\uB418\uAC70\uB098 \uCD95\uC18C\uB429\uB2C8\uB2E4(\uC2A4\uD06C\uB864 \uC5C6\uC74C).","\uBBF8\uB2C8\uB9F5\uC744 \uD3B8\uC9D1\uAE30\uBCF4\uB2E4 \uC791\uAC8C \uC720\uC9C0\uD560 \uC218 \uC788\uB3C4\uB85D \uD544\uC694\uC5D0 \uB530\uB77C \uBBF8\uB2C8\uB9F5\uC774 \uCD95\uC18C\uB429\uB2C8\uB2E4(\uC2A4\uD06C\uB864 \uC5C6\uC74C).","\uBBF8\uB2C8\uB9F5\uC758 \uD06C\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5\uC744 \uB80C\uB354\uB9C1\uD560 \uCE21\uBA74\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5 \uC2AC\uB77C\uC774\uB354\uAC00 \uD45C\uC2DC\uB418\uB294 \uC2DC\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5\uC5D0 \uADF8\uB824\uC9C4 \uCF58\uD150\uCE20\uC758 \uBC30\uC728: 1, 2 \uB610\uB294 3.","\uC904\uC758 \uC2E4\uC81C \uBB38\uC790(\uC0C9 \uBE14\uB85D \uC544\uB2D8)\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uCD5C\uB300 \uD2B9\uC815 \uC218\uC758 \uC5F4\uC744 \uB80C\uB354\uB9C1\uD558\uB3C4\uB85D \uBBF8\uB2C8\uB9F5\uC758 \uB108\uBE44\uB97C \uC81C\uD55C\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uC704\uCABD \uAC00\uC7A5\uC790\uB9AC\uC640 \uCCAB \uBC88\uC9F8 \uC904 \uC0AC\uC774\uC758 \uACF5\uBC31\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uC544\uB798\uCABD \uAC00\uC7A5\uC790\uB9AC\uC640 \uB9C8\uC9C0\uB9C9 \uC904 \uC0AC\uC774\uC758 \uACF5\uBC31\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC785\uB825\uACFC \uB3D9\uC2DC\uC5D0 \uB9E4\uAC1C\uBCC0\uC218 \uBB38\uC11C\uC640 \uC720\uD615 \uC815\uBCF4\uB97C \uD45C\uC2DC\uD558\uB294 \uD31D\uC5C5\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uB9E4\uAC1C\uBCC0\uC218 \uD78C\uD2B8 \uBA54\uB274\uC758 \uC8FC\uAE30 \uD639\uC740 \uBAA9\uB85D\uC758 \uB05D\uC5D0 \uB3C4\uB2EC\uD558\uC600\uC744\uB54C \uC885\uB8CC\uD560 \uAC83\uC778\uC9C0 \uC5EC\uBD80\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uBB38\uC790\uC5F4 \uB0B4\uC5D0\uC11C \uBE60\uB978 \uC81C\uC548\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC8FC\uC11D \uB0B4\uC5D0\uC11C \uBE60\uB978 \uC81C\uC548\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uBB38\uC790\uC5F4 \uBC0F \uC8FC\uC11D \uC678\uBD80\uC5D0\uC11C \uBE60\uB978 \uC81C\uC548\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC785\uB825\uD558\uB294 \uB3D9\uC548 \uC81C\uC548\uC744 \uC790\uB3D9\uC73C\uB85C \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uB294 \uB80C\uB354\uB9C1\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uB294 \uC808\uB300\uAC12\uC73C\uB85C \uB80C\uB354\uB9C1 \uB429\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uB294 \uCEE4\uC11C \uC704\uCE58\uC5D0\uC11C \uC904 \uAC04\uACA9 \uAC70\uB9AC\uB85C \uB80C\uB354\uB9C1 \uB429\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uB294 \uB9E4 10 \uC904\uB9C8\uB2E4 \uB80C\uB354\uB9C1\uC774 \uC774\uB8E8\uC5B4\uC9D1\uB2C8\uB2E4.","\uC904 \uBC88\uD638\uC758 \uD45C\uC2DC \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC774 \uD3B8\uC9D1\uAE30 \uB208\uAE08\uC790\uC5D0\uC11C \uB80C\uB354\uB9C1\uD560 \uACE0\uC815 \uD3ED \uBB38\uC790 \uC218\uC785\uB2C8\uB2E4.","\uC774 \uD3B8\uC9D1\uAE30 \uB208\uAE08\uC790\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uD2B9\uC815 \uC218\uC758 \uACE0\uC815 \uD3ED \uBB38\uC790 \uB4A4\uC5D0 \uC138\uB85C \uB208\uAE08\uC790\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4. \uC5EC\uB7EC \uB208\uAE08\uC790\uC758 \uACBD\uC6B0 \uC5EC\uB7EC \uAC12\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4. \uBC30\uC5F4\uC774 \uBE44\uC5B4 \uC788\uB294 \uACBD\uC6B0 \uB208\uAE08\uC790\uAC00 \uADF8\uB824\uC9C0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uCEE4\uC11C\uC758 \uD14D\uC2A4\uD2B8 \uC624\uB978\uCABD\uC744 \uB36E\uC5B4 \uC4F0\uC9C0\uC54A\uACE0 \uC81C\uC548\uC744 \uC0BD\uC785\uD569\uB2C8\uB2E4.","\uC81C\uC548\uC744 \uC0BD\uC785\uD558\uACE0 \uCEE4\uC11C\uC758 \uC624\uB978\uCABD \uD14D\uC2A4\uD2B8\uB97C \uB36E\uC5B4\uC501\uB2C8\uB2E4.","\uC644\uB8CC\uB97C \uC218\uB77D\uD560 \uB54C \uB2E8\uC5B4\uB97C \uB36E\uC5B4\uC4F8\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC774\uAC83\uC740 \uC774 \uAE30\uB2A5\uC744 \uC120\uD0DD\uD558\uB294 \uD655\uC7A5\uC5D0 \uB530\uB77C \uB2E4\uB985\uB2C8\uB2E4.","\uC81C\uC548 \uD544\uD130\uB9C1 \uBC0F \uC815\uB82C\uC5D0\uC11C \uC791\uC740 \uC624\uD0C0\uB97C \uC124\uBA85\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC815\uB82C\uD560 \uB54C \uCEE4\uC11C \uADFC\uCC98\uC5D0 \uD45C\uC2DC\uB418\uB294 \uB2E8\uC5B4\uB97C \uC6B0\uC120\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC800\uC7A5\uB41C \uC81C\uC548 \uC0AC\uD56D \uC120\uD0DD \uD56D\uBAA9\uC744 \uC5EC\uB7EC \uC791\uC5C5 \uC601\uC5ED \uBC0F \uCC3D\uC5D0\uC11C \uACF5\uC720\uD560 \uAC83\uC778\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4(`#editor.suggestSelection#` \uD544\uC694).","\uD65C\uC131 \uCF54\uB4DC \uC870\uAC01\uC774 \uBE60\uB978 \uC81C\uC548\uC744 \uBC29\uC9C0\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC81C\uC548\uC758 \uC544\uC774\uCF58\uC744 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F \uD558\uB2E8\uC758 \uC0C1\uD0DC \uD45C\uC2DC\uC904 \uAC00\uC2DC\uC131\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC81C\uC548 \uC138\uBD80 \uC815\uBCF4\uAC00 \uB808\uC774\uBE14\uACFC \uD568\uAED8 \uC778\uB77C\uC778\uC5D0 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC544\uB2C8\uBA74 \uC138\uBD80 \uC815\uBCF4 \uC704\uC82F\uC5D0\uB9CC \uD45C\uC2DC\uB418\uB294\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC774 \uC124\uC815\uC740 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC774\uC81C \uC81C\uC548 \uC704\uC82F\uC758 \uD06C\uAE30\uB97C \uC870\uC815\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC774 \uC124\uC815\uC740 \uB354 \uC774\uC0C1 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 'editor.suggest.showKeywords'\uB610\uB294 'editor.suggest.showSnippets'\uC640 \uAC19\uC740 \uBCC4\uB3C4\uC758 \uC124\uC815\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 `\uBA54\uC11C\uB4DC` \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD568\uC218' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0DD\uC131\uC790' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD544\uB4DC' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uBCC0\uC218' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD074\uB798\uC2A4' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uAD6C\uC870' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC778\uD130\uD398\uC774\uC2A4' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uBAA8\uB4C8' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC18D\uC131' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC774\uBCA4\uD2B8' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 `\uC5F0\uC0B0\uC790` \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uB2E8\uC704' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uAC12' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0C1\uC218' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC5F4\uAC70\uD615' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 `enumMember` \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD0A4\uC6CC\uB4DC' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD14D\uC2A4\uD2B8' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0C9' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 `\uD30C\uC77C` \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uCC38\uC870' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uC0AC\uC6A9\uC790 \uC9C0\uC815 \uC0C9' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uD3F4\uB354' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB41C \uACBD\uC6B0 IntelliSense\uC5D0 'typeParameter' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uBA74 IntelliSense\uC5D0 '\uCF54\uB4DC \uC870\uAC01' \uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","IntelliSense\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD558\uBA74 `user`-\uC81C\uC548\uC774 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","IntelliSense\uB97C \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD55C \uACBD\uC6B0 `issues`-\uC81C\uC548\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC120\uD589 \uBC0F \uD6C4\uD589 \uACF5\uBC31\uC744 \uD56D\uC0C1 \uC120\uD0DD\uD574\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uC785\uB2C8\uB2E4.","\uCEE4\uBC0B \uBB38\uC790\uC5D0 \uB300\uD55C \uC81C\uC548\uC744 \uD5C8\uC6A9\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC608\uB97C \uB4E4\uC5B4 JavaScript\uC5D0\uC11C\uB294 \uC138\uBBF8\uCF5C\uB860(';')\uC774 \uC81C\uC548\uC744 \uD5C8\uC6A9\uD558\uACE0 \uD574\uB2F9 \uBB38\uC790\uB97C \uC785\uB825\uD558\uB294 \uCEE4\uBC0B \uBB38\uC790\uC77C \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8\uB97C \uBCC0\uACBD\uD560 \uB54C `Enter` \uD0A4\uB97C \uC0AC\uC6A9\uD55C \uC81C\uC548\uB9CC \uD5C8\uC6A9\uD569\uB2C8\uB2E4.","'Tab' \uD0A4 \uC678\uC5D0 'Enter' \uD0A4\uC5D0 \uB300\uD55C \uC81C\uC548\uB3C4 \uD5C8\uC6A9\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC0C8 \uC904\uC744 \uC0BD\uC785\uD558\uB294 \uB3D9\uC791\uACFC \uC81C\uC548\uC744 \uD5C8\uC6A9\uD558\uB294 \uB3D9\uC791 \uAC04\uC758 \uBAA8\uD638\uD568\uC744 \uC5C6\uC568 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD654\uBA74 \uD310\uB3C5\uAE30\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 \uD3B8\uC9D1\uAE30\uC758 \uC904 \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uACBD\uACE0: \uAE30\uBCF8\uAC12\uBCF4\uB2E4 \uD070 \uC22B\uC790\uC778 \uACBD\uC6B0 \uC131\uB2A5\uC5D0 \uC601\uD5A5\uC744 \uBBF8\uCE69\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCF58\uD150\uCE20","\uC5B8\uC5B4 \uAD6C\uC131\uC744 \uC0AC\uC6A9\uD558\uC5EC \uB300\uAD04\uD638\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744 \uACBD\uC6B0\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uCEE4\uC11C\uAC00 \uACF5\uBC31\uC758 \uC67C\uCABD\uC5D0 \uC788\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uB300\uAD04\uD638\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC2B5\uB2C8\uB2E4.","\uC0AC\uC6A9\uC790\uAC00 \uC5EC\uB294 \uAD04\uD638\uB97C \uCD94\uAC00\uD55C \uD6C4 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uAD04\uD638\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB2EB\uAE30 \uB530\uC634\uD45C \uB610\uB294 \uB300\uAD04\uD638\uAC00 \uC790\uB3D9\uC73C\uB85C \uC0BD\uC785\uB41C \uACBD\uC6B0\uC5D0\uB9CC \uD574\uB2F9 \uD56D\uBAA9 \uC704\uC5D0 \uC785\uB825\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uC790\uAC00 \uB2EB\uB294 \uB530\uC634\uD45C \uB610\uB294 \uB300\uAD04\uD638 \uC704\uC5D0 \uC785\uB825\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5B8\uC5B4 \uAD6C\uC131\uC744 \uC0AC\uC6A9\uD558\uC5EC \uB530\uC634\uD45C\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744 \uACBD\uC6B0\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uCEE4\uC11C\uAC00 \uACF5\uBC31\uC758 \uC67C\uCABD\uC5D0 \uC788\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uB530\uC634\uD45C\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC2B5\uB2C8\uB2E4.","\uC0AC\uC6A9\uC790\uAC00 \uC5EC\uB294 \uB530\uC634\uD45C\uB97C \uCD94\uAC00\uD55C \uD6C4 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB530\uC634\uD45C\uB97C \uC790\uB3D9\uC73C\uB85C \uB2EB\uC744\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uC0BD\uC785\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD604\uC7AC \uC904\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC720\uC9C0\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD604\uC7AC \uC904\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC720\uC9C0\uD558\uACE0 \uC5B8\uC5B4 \uC815\uC758 \uB300\uAD04\uD638\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD604\uC7AC \uC904\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC720\uC9C0\uD558\uACE0 \uC5B8\uC5B4 \uC815\uC758 \uB300\uAD04\uD638\uB97C \uC874\uC911\uD558\uBA70 \uC5B8\uC5B4\uBCC4\uB85C \uC815\uC758\uB41C \uD2B9\uBCC4 EnterRules\uB97C \uD638\uCD9C\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD604\uC7AC \uC904\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC720\uC9C0\uD558\uACE0, \uC5B8\uC5B4 \uC815\uC758 \uB300\uAD04\uD638\uB97C \uC874\uC911\uD558\uACE0, \uC5B8\uC5B4\uC5D0 \uC758\uD574 \uC815\uC758\uB41C \uD2B9\uBCC4 EnterRules\uB97C \uD638\uCD9C\uD558\uACE0, \uC5B8\uC5B4\uC5D0 \uC758\uD574 \uC815\uC758\uB41C \uB4E4\uC5EC\uC4F0\uAE30 \uADDC\uCE59\uC744 \uC874\uC911\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uC790\uAC00 \uC904\uC744 \uC785\uB825, \uBD99\uC5EC\uB123\uAE30, \uC774\uB3D9 \uB610\uB294 \uB4E4\uC5EC\uC4F0\uAE30 \uD560 \uB54C \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC790\uB3D9\uC73C\uB85C \uC870\uC815\uD558\uB3C4\uB85D \uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC5B8\uC5B4 \uAD6C\uC131\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC120\uD0DD \uD56D\uBAA9\uC744 \uC790\uB3D9\uC73C\uB85C \uB458\uB7EC\uC300 \uACBD\uC6B0\uB97C \uACB0\uC815\uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638\uAC00 \uC544\uB2CC \uB530\uC634\uD45C\uB85C \uB458\uB7EC\uC309\uB2C8\uB2E4.","\uB530\uC634\uD45C\uAC00 \uC544\uB2CC \uB300\uAD04\uD638\uB85C \uB458\uB7EC\uC309\uB2C8\uB2E4.","\uB530\uC634\uD45C \uB610\uB294 \uB300\uAD04\uD638 \uC785\uB825 \uC2DC \uD3B8\uC9D1\uAE30\uAC00 \uC790\uB3D9\uC73C\uB85C \uC120\uD0DD \uC601\uC5ED\uC744 \uB458\uB7EC\uC300\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30\uC5D0 \uACF5\uBC31\uC744 \uC0AC\uC6A9\uD560 \uB54C \uD0ED \uBB38\uC790\uC758 \uC120\uD0DD \uB3D9\uC791\uC744 \uC5D0\uBBAC\uB808\uC774\uD2B8\uD569\uB2C8\uB2E4. \uC120\uD0DD \uC601\uC5ED\uC774 \uD0ED \uC815\uC9C0\uC5D0 \uACE0\uC815\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C CodeLens\uB97C \uD45C\uC2DC\uD560 \uAC83\uC778\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","CodeLens\uC758 \uAE00\uAF34 \uD328\uBC00\uB9AC\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","CodeLens\uC758 \uAE00\uAF34 \uD06C\uAE30(\uD53D\uC140)\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. '0'\uC73C\uB85C \uC124\uC815\uD558\uBA74 `#editor.fontSize#`\uC758 90%\uAC00 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC778\uB77C\uC778 \uC0C9 \uB370\uCF54\uB808\uC774\uD130 \uBC0F \uC0C9 \uC120\uD0DD\uC744 \uB80C\uB354\uB9C1\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uC640 \uD0A4\uB85C \uC120\uD0DD\uD55C \uC601\uC5ED\uC5D0\uC11C \uC5F4\uC744 \uC120\uD0DD\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uAD6C\uBB38 \uAC15\uC870 \uD45C\uC2DC\uB97C \uD074\uB9BD\uBCF4\uB4DC\uB85C \uBCF5\uC0AC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCEE4\uC11C \uC560\uB2C8\uBA54\uC774\uC158 \uC2A4\uD0C0\uC77C\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB9E4\uB044\uB7EC\uC6B4 \uCE90\uB7FF \uC560\uB2C8\uBA54\uC774\uC158\uC758 \uC0AC\uC6A9 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCEE4\uC11C \uC2A4\uD0C0\uC77C\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCEE4\uC11C \uC8FC\uC704\uC5D0 \uD45C\uC2DC\uB418\uB294 \uC120\uD589 \uBC0F \uD6C4\uD589 \uC904\uC758 \uCD5C\uC18C \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC77C\uBD80 \uB2E4\uB978 \uD3B8\uC9D1\uAE30\uC5D0\uC11C\uB294 'scrollOff' \uB610\uB294 'scrollOffset'\uC774\uB77C\uACE0 \uD569\uB2C8\uB2E4.","'cursorSurroundingLines'\uB294 \uD0A4\uBCF4\uB4DC \uB098 API\uB97C \uD1B5\uD574 \uD2B8\uB9AC\uAC70\uB420 \uB54C\uB9CC \uC801\uC6A9\uB429\uB2C8\uB2E4.","`cursorSurroundingLines`\uB294 \uD56D\uC0C1 \uC801\uC6A9\uB429\uB2C8\uB2E4.","'cursorSurroundingLines'\uB97C \uC801\uC6A9\uD574\uC57C \uD558\uB294 \uACBD\uC6B0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","`#editor.cursorStyle#` \uC124\uC815\uC774 'line'\uC73C\uB85C \uC124\uC815\uB418\uC5B4 \uC788\uC744 \uB54C \uCEE4\uC11C\uC758 \uB113\uC774\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB04C\uC5B4\uC11C \uB193\uAE30\uB85C \uC120\uD0DD \uC601\uC5ED\uC744 \uC774\uB3D9\uD560 \uC218 \uC788\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","'Alt' \uD0A4\uB97C \uB204\uB97C \uB54C \uC2A4\uD06C\uB864 \uC18D\uB3C4 \uC2B9\uC218\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0 \uCF54\uB4DC \uC811\uAE30\uAC00 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uACBD\uC6B0 \uC5B8\uC5B4\uBCC4 \uC811\uAE30 \uC804\uB7B5\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4. \uADF8\uB807\uC9C0 \uC54A\uC740 \uACBD\uC6B0 \uB4E4\uC5EC\uC4F0\uAE30 \uAE30\uBC18 \uC804\uB7B5\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30 \uAE30\uBC18 \uC811\uAE30 \uC804\uB7B5\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.","\uC811\uAE30 \uBC94\uC704\uB97C \uACC4\uC0B0\uD558\uAE30 \uC704\uD55C \uC804\uB7B5\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC811\uD78C \uBC94\uC704\uB97C \uAC15\uC870 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC811\uD78C \uC904\uC774 \uC904\uC744 \uD3BC\uCE5C \uD6C4 \uBE48 \uCF58\uD150\uCE20\uB97C \uD074\uB9AD\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAE00\uAF34 \uD328\uBC00\uB9AC\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBD99\uC5EC\uB123\uC740 \uCF58\uD150\uCE20\uC758 \uC11C\uC2DD\uC744 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uC9C0\uC815\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uD3EC\uB9F7\uD130\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC5B4\uC57C \uD558\uBA70 \uD3EC\uB9F7\uD130\uAC00 \uBB38\uC11C\uC5D0\uC11C \uBC94\uC704\uC758 \uC11C\uC2DD\uC744 \uC9C0\uC815\uD560 \uC218 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4.","\uC785\uB825 \uD6C4 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uC904\uC758 \uC11C\uC2DD\uC744 \uC9C0\uC815\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC138\uB85C \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC744 \uB80C\uB354\uB9C1\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC740 \uC8FC\uB85C \uB514\uBC84\uAE45\uC5D0 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uCEE4\uC11C\uAC00 \uAC1C\uC694 \uB208\uAE08\uC790\uC5D0\uC11C \uAC00\uB824\uC838\uC57C \uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD65C\uC131 \uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uB97C \uAC15\uC870 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBB38\uC790 \uAC04\uACA9(\uD53D\uC140)\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC5F0\uACB0\uB41C \uD3B8\uC9D1\uC774 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uC5C8\uB294\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC5B8\uC5B4\uC5D0 \uB530\uB77C \uAD00\uB828 \uAE30\uD638(\uC608: HTML \uD0DC\uADF8)\uAC00 \uD3B8\uC9D1 \uC911\uC5D0 \uC5C5\uB370\uC774\uD2B8\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB9C1\uD06C\uB97C \uAC10\uC9C0\uD558\uACE0 \uD074\uB9AD\uD560 \uC218 \uC788\uAC8C \uB9CC\uB4E4\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uB300\uAD04\uD638\uB97C \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4 \uD720 \uC2A4\uD06C\uB864 \uC774\uBCA4\uD2B8\uC758 `deltaX` \uBC0F `deltaY`\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uC2B9\uC218\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4 \uD720\uC744 \uC0AC\uC6A9\uD560 \uB54C 'Ctrl' \uD0A4\uB97C \uB204\uB974\uACE0 \uC788\uC73C\uBA74 \uD3B8\uC9D1\uAE30\uC758 \uAE00\uAF34\uC744 \uD655\uB300/\uCD95\uC18C\uD569\uB2C8\uB2E4.","\uC5EC\uB7EC \uCEE4\uC11C\uAC00 \uACB9\uCE58\uB294 \uACBD\uC6B0 \uCEE4\uC11C\uB97C \uBCD1\uD569\uD569\uB2C8\uB2E4.","Windows\uC640 Linux\uC758 'Control'\uC744 macOS\uC758 'Command'\uB85C \uB9E4\uD551\uD569\uB2C8\uB2E4.","Windows\uC640 Linux\uC758 'Alt'\uB97C macOS\uC758 'Option'\uC73C\uB85C \uB9E4\uD551\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uC5EC\uB7EC \uCEE4\uC11C\uB97C \uCD94\uAC00\uD560 \uB54C \uC0AC\uC6A9\uD560 \uC218\uC815\uC790\uC785\uB2C8\uB2E4. [\uC815\uC758\uB85C \uC774\uB3D9] \uBC0F [\uB9C1\uD06C \uC5F4\uAE30] \uB9C8\uC6B0\uC2A4 \uC81C\uC2A4\uCC98\uAC00 \uBA40\uD2F0\uCEE4\uC11C \uC218\uC815\uC790\uC640 \uCDA9\uB3CC\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC870\uC815\uB429\uB2C8\uB2E4. [\uC790\uC138\uD55C \uC815\uBCF4](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).","\uAC01 \uCEE4\uC11C\uB294 \uD14D\uC2A4\uD2B8 \uD55C \uC904\uC744 \uBD99\uC5EC\uB123\uC2B5\uB2C8\uB2E4.","\uAC01 \uCEE4\uC11C\uB294 \uC804\uCCB4 \uD14D\uC2A4\uD2B8\uB97C \uBD99\uC5EC\uB123\uC2B5\uB2C8\uB2E4.","\uBD99\uC5EC\uB123\uC740 \uD14D\uC2A4\uD2B8\uC758 \uC904 \uC218\uAC00 \uCEE4\uC11C \uC218\uC640 \uC77C\uCE58\uD558\uB294 \uACBD\uC6B0 \uBD99\uC5EC\uB123\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC758\uBBF8 \uCCB4\uACC4 \uAE30\uD638 \uD56D\uBAA9\uC744 \uAC15\uC870 \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAC1C\uC694 \uB208\uAE08\uC790 \uC8FC\uC704\uC5D0 \uD14C\uB450\uB9AC\uB97C \uADF8\uB9B4\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","Peek\uB97C \uC5EC\uB294 \uB3D9\uC548 \uD2B8\uB9AC\uC5D0 \uD3EC\uCEE4\uC2A4","\uBBF8\uB9AC \uBCF4\uAE30\uB97C \uC5F4 \uB54C \uD3B8\uC9D1\uAE30\uC5D0 \uD3EC\uCEE4\uC2A4","\uBBF8\uB9AC \uBCF4\uAE30 \uC704\uC82F\uC5D0\uC11C \uC778\uB77C\uC778 \uD3B8\uC9D1\uAE30\uC5D0 \uD3EC\uCEE4\uC2A4\uB97C \uB458\uC9C0 \uB610\uB294 \uD2B8\uB9AC\uC5D0 \uD3EC\uCEE4\uC2A4\uB97C \uB458\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC774\uB3D9 \uC815\uC758 \uB9C8\uC6B0\uC2A4 \uC81C\uC2A4\uCC98\uAC00 \uD56D\uC0C1 \uBBF8\uB9AC \uBCF4\uAE30 \uC704\uC82F\uC744 \uC5F4\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBE60\uB978 \uC81C\uC548\uC744 \uD45C\uC2DC\uD558\uAE30 \uC804\uAE4C\uC9C0\uC758 \uC9C0\uC5F0 \uC2DC\uAC04(\uBC00\uB9AC\uCD08)\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uC720\uD615\uC5D0 \uB530\uB77C \uC790\uB3D9\uC73C\uB85C \uC774\uB984\uC744 \uBC14\uAFC0\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 `editor.linkedEditing`\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC81C\uC5B4 \uBB38\uC790\uB97C \uB80C\uB354\uB9C1\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uB97C \uB80C\uB354\uB9C1\uD560\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD30C\uC77C\uC774 \uC904 \uBC14\uAFC8\uC73C\uB85C \uB05D\uB098\uBA74 \uB9C8\uC9C0\uB9C9 \uC904 \uBC88\uD638\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uC81C\uBCF8\uC6A9 \uC5EC\uBC31\uACFC \uD604\uC7AC \uC904\uC744 \uBAA8\uB450 \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uD604\uC7AC \uC904 \uAC15\uC870 \uD45C\uC2DC\uB97C \uB80C\uB354\uB9C1\uD558\uB294 \uBC29\uC2DD\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD604\uC7AC \uC904 \uAC15\uC870 \uD45C\uC2DC\uB97C \uB80C\uB354\uB9C1\uD574\uC57C \uD558\uB294\uC9C0 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB2E8\uC5B4 \uC0AC\uC774\uC758 \uACF5\uBC31 \uD558\uB098\uB97C \uC81C\uC678\uD55C \uACF5\uBC31 \uBB38\uC790\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uC120\uD0DD\uD55C \uD14D\uC2A4\uD2B8\uC5D0\uC11C\uB9CC \uACF5\uBC31 \uBB38\uC790\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4.","\uD6C4\uD589 \uACF5\uBC31 \uBB38\uC790\uB9CC \uB80C\uB354\uB9C1","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACF5\uBC31 \uBB38\uC790\uB97C \uB80C\uB354\uB9C1\uD560 \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC120\uD0DD \uD56D\uBAA9\uC758 \uBAA8\uC11C\uB9AC\uB97C \uB465\uAE00\uAC8C \uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uAC00\uB85C\uB85C \uC2A4\uD06C\uB864\uB418\uB294 \uBC94\uC704\uB97C \uBC97\uC5B4\uB098\uB294 \uCD94\uAC00 \uBB38\uC790\uC758 \uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uB9C8\uC9C0\uB9C9 \uC904 \uC774\uD6C4\uB85C \uC2A4\uD06C\uB864\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC138\uB85C\uC640 \uAC00\uB85C\uB85C \uB3D9\uC2DC\uC5D0 \uC2A4\uD06C\uB864\uD560 \uB54C\uC5D0\uB9CC \uC8FC\uCD95\uC744 \uB530\uB77C\uC11C \uC2A4\uD06C\uB864\uD569\uB2C8\uB2E4. \uD2B8\uB799\uD328\uB4DC\uC5D0\uC11C \uC138\uB85C\uB85C \uC2A4\uD06C\uB864\uD560 \uB54C \uAC00\uB85C \uB4DC\uB9AC\uD504\uD2B8\uB97C \uBC29\uC9C0\uD569\uB2C8\uB2E4.","Linux \uC8FC \uD074\uB9BD\uBCF4\uB4DC\uC758 \uC9C0\uC6D0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uAC00 \uC120\uD0DD \uD56D\uBAA9\uACFC \uC720\uC0AC\uD55C \uC77C\uCE58 \uD56D\uBAA9\uC744 \uAC15\uC870 \uD45C\uC2DC\uD574\uC57C\uD558\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC811\uAE30 \uCEE8\uD2B8\uB864\uC744 \uD56D\uC0C1 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uAC00 \uC5EC\uBC31 \uC704\uC5D0 \uC788\uC744 \uB54C\uC5D0\uB9CC \uC811\uAE30 \uCEE8\uD2B8\uB864\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uC5EC\uBC31\uC758 \uC811\uAE30 \uCEE8\uD2B8\uB864\uC774 \uD45C\uC2DC\uB418\uB294 \uC2DC\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294 \uCF54\uB4DC\uC758 \uD398\uC774\uB4DC \uC544\uC6C3\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCDE8\uC18C\uC120 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uB294 \uBCC0\uC218\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB2E4\uB978 \uC81C\uC548 \uC704\uC5D0 \uC870\uAC01 \uC81C\uC548\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB2E4\uB978 \uC81C\uC548 \uC544\uB798\uC5D0 \uC870\uAC01 \uC81C\uC548\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB2E4\uB978 \uC81C\uC548\uACFC \uD568\uAED8 \uC870\uAC01 \uC81C\uC548\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uC81C\uC548\uC744 \uD45C\uC2DC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01\uC774 \uB2E4\uB978 \uCD94\uCC9C\uACFC \uD568\uAED8 \uD45C\uC2DC\uB418\uB294\uC9C0 \uC5EC\uBD80 \uBC0F \uC815\uB82C \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC560\uB2C8\uBA54\uC774\uC158\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC2A4\uD06C\uB864\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uAE00\uAF34 \uD06C\uAE30\uC785\uB2C8\uB2E4. '0'\uC73C\uB85C \uC124\uC815\uD558\uBA74 '#editor.fontSize#'\uC758 \uAC12\uC774 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uC904 \uB192\uC774\uC785\uB2C8\uB2E4. '0'\uC73C\uB85C \uC124\uC815\uD558\uBA74 `#editor.lineHeight#`\uC758 \uAC12\uC774 \uC0AC\uC6A9\uB429\uB2C8\uB2E4. \uCD5C\uC19F\uAC12\uC740 8\uC785\uB2C8\uB2E4.","\uD2B8\uB9AC\uAC70 \uBB38\uC790\uB97C \uC785\uB825\uD560 \uB54C \uC81C\uC548\uC744 \uC790\uB3D9\uC73C\uB85C \uD45C\uC2DC\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD56D\uC0C1 \uCCAB \uBC88\uC9F8 \uC81C\uC548\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4.","`log`\uAC00 \uCD5C\uADFC\uC5D0 \uC644\uB8CC\uB418\uC5C8\uC73C\uBBC0\uB85C \uCD94\uAC00 \uC785\uB825\uC5D0\uC11C \uC81C\uC548\uC744 \uC120\uD0DD\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0 \uCD5C\uADFC \uC81C\uC548\uC744 \uC120\uD0DD\uD558\uC138\uC694(\uC608: `console.| -> console.log`).","\uD574\uB2F9 \uC81C\uC548\uC744 \uC644\uB8CC\uD55C \uC774\uC804 \uC811\uB450\uC0AC\uC5D0 \uB530\uB77C \uC81C\uC548\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4(\uC608: `co -> console` \uBC0F `con -> const`).","\uC81C\uC548 \uBAA9\uB85D\uC744 \uD45C\uC2DC\uD560 \uB54C \uC81C\uD55C\uC774 \uBBF8\uB9AC \uC120\uD0DD\uB418\uB294 \uBC29\uC2DD\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD0ED \uC644\uB8CC\uB294 \uD0ED\uC744 \uB204\uB97C \uB54C \uAC00\uC7A5 \uC77C\uCE58\uD558\uB294 \uC81C\uC548\uC744 \uC0BD\uC785\uD569\uB2C8\uB2E4.","\uD0ED \uC644\uC131\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uC811\uB450\uC0AC\uAC00 \uC77C\uCE58\uD558\uB294 \uACBD\uC6B0 \uCF54\uB4DC \uC870\uAC01\uC744 \uD0ED \uC644\uB8CC\uD569\uB2C8\uB2E4. 'quickSuggestions'\uB97C \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC744 \uB54C \uAC00\uC7A5 \uC798 \uC791\uB3D9\uD569\uB2C8\uB2E4.","\uD0ED \uC644\uC131\uC744 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uD569\uB2C8\uB2E4.","\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790\uAC00 \uC790\uB3D9\uC73C\uB85C \uC81C\uAC70\uB429\uB2C8\uB2E4.","\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790\uAC00 \uBB34\uC2DC\uB429\uB2C8\uB2E4.","\uC81C\uAC70\uD560 \uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790 \uD504\uB86C\uD504\uD2B8\uC785\uB2C8\uB2E4.","\uBB38\uC81C\uB97C \uC77C\uC73C\uD0AC \uC218 \uC788\uB294 \uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790\uB97C \uC81C\uAC70\uD569\uB2C8\uB2E4.","\uD0ED \uC815\uC9C0 \uB4A4\uC5D0 \uACF5\uBC31\uC744 \uC0BD\uC785 \uBC0F \uC0AD\uC81C\uD569\uB2C8\uB2E4.","\uB2E8\uC5B4 \uAD00\uB828 \uD0D0\uC0C9 \uB610\uB294 \uC791\uC5C5\uC744 \uC218\uD589\uD560 \uB54C \uB2E8\uC5B4 \uAD6C\uBD84 \uAE30\uD638\uB85C \uC0AC\uC6A9\uD560 \uBB38\uC790\uC785\uB2C8\uB2E4.","\uC904\uC774 \uBC14\uB00C\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBDF0\uD3EC\uD2B8 \uB108\uBE44\uC5D0\uC11C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4.","`#editor.wordWrapColumn#`\uC5D0\uC11C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4.","\uBDF0\uD3EC\uD2B8\uC758 \uCD5C\uC18C\uAC12 \uBC0F `#editor.wordWrapColumn#`\uC5D0\uC11C \uC904\uC774 \uBC14\uB01D\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","`#editor.wordWrap#`\uC774 `wordWrapColumn` \uB610\uB294 'bounded'\uC778 \uACBD\uC6B0 \uD3B8\uC9D1\uAE30\uC758 \uC5F4 \uC904 \uBC14\uAFC8\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC904 \uBC14\uAFC8 \uD589\uC774 \uC5F4 1\uC5D0\uC11C \uC2DC\uC791\uB429\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uD589\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uAC00 \uBD80\uBAA8\uC640 \uB3D9\uC77C\uD569\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uD589\uC774 \uBD80\uBAA8 \uCABD\uC73C\uB85C +1\uB9CC\uD07C \uB4E4\uC5EC\uC4F0\uAE30\uB429\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uD589\uC774 \uBD80\uBAA8 \uCABD\uC73C\uB85C +2\uB9CC\uD07C \uB4E4\uC5EC\uC4F0\uAE30\uB429\uB2C8\uB2E4.","\uC904 \uBC14\uAFC8 \uD589\uC758 \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBAA8\uB4E0 \uBB38\uC790\uAC00 \uB3D9\uC77C\uD55C \uB108\uBE44\uB77C\uACE0 \uAC00\uC815\uD569\uB2C8\uB2E4. \uC774 \uC54C\uACE0\uB9AC\uC998\uC740 \uACE0\uC815 \uD3ED \uAE00\uAF34\uACFC \uBB38\uC790 \uBAA8\uC591\uC758 \uB108\uBE44\uAC00 \uAC19\uC740 \uD2B9\uC815 \uC2A4\uD06C\uB9BD\uD2B8(\uC608: \uB77C\uD2F4 \uBB38\uC790)\uC5D0 \uC801\uC808\uD788 \uC791\uB3D9\uD558\uB294 \uBE60\uB978 \uC54C\uACE0\uB9AC\uC998\uC785\uB2C8\uB2E4.","\uB798\uD551 \uC810 \uACC4\uC0B0\uC744 \uBE0C\uB77C\uC6B0\uC800\uC5D0 \uC704\uC784\uD569\uB2C8\uB2E4. \uC774 \uC54C\uACE0\uB9AC\uC998\uC740 \uB9E4\uC6B0 \uB290\uB824\uC11C \uB300\uC6A9\uB7C9 \uD30C\uC77C\uC758 \uACBD\uC6B0 \uC911\uB2E8\uB420 \uC218 \uC788\uC9C0\uB9CC \uBAA8\uB4E0 \uACBD\uC6B0\uC5D0 \uC801\uC808\uD788 \uC791\uB3D9\uD569\uB2C8\uB2E4.","\uB798\uD551 \uC810\uC744 \uACC4\uC0B0\uD558\uB294 \uC54C\uACE0\uB9AC\uC998\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4."],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read only","Whether the context is a diff editor","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/model/editStack":["\uC785\uB825\uD558\uB294 \uC911"],"vs/editor/common/modes/modesRegistry":["\uC77C\uBC18 \uD14D\uC2A4\uD2B8"],"vs/editor/common/standaloneStrings":["\uC5C6\uC74C \uC120\uD0DD","\uC904 {0}, \uC5F4 {1}({2} \uC120\uD0DD\uB428)\uC785\uB2C8\uB2E4.","\uD589 {0}, \uC5F4 {1}","{0} \uC120\uD0DD \uD56D\uBAA9({1}\uC790 \uC120\uD0DD\uB428)","{0} \uC120\uD0DD \uD56D\uBAA9","\uC774\uC81C 'accessibilitySupport' \uC124\uC815\uC744 'on'\uC73C\uB85C \uBCC0\uACBD\uD569\uB2C8\uB2E4.","\uC9C0\uAE08 \uD3B8\uC9D1\uAE30 \uC811\uADFC\uC131 \uBB38\uC11C \uD398\uC774\uC9C0\uB97C \uC5EC\uC138\uC694.","\uCC28\uC774 \uD3B8\uC9D1\uAE30\uC758 \uC77D\uAE30 \uC804\uC6A9 \uCC3D\uC5D0\uC11C.","diff \uD3B8\uC9D1\uAE30 \uCC3D\uC5D0\uC11C."," \uC77D\uAE30 \uC804\uC6A9 \uCF54\uB4DC \uD3B8\uC9D1\uAE30\uC5D0\uC11C"," \uCF54\uB4DC \uD3B8\uC9D1\uAE30\uC5D0\uC11C","\uD654\uBA74 \uD310\uB3C5\uAE30 \uC0AC\uC6A9\uC5D0 \uCD5C\uC801\uD654\uB418\uB3C4\uB85D \uD3B8\uC9D1\uAE30\uB97C \uAD6C\uC131\uD558\uB824\uBA74 \uC9C0\uAE08 Command+E\uB97C \uB204\uB974\uC138\uC694.","\uD654\uBA74 \uD310\uB3C5\uAE30\uC5D0 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB3C4\uB85D \uD3B8\uC9D1\uAE30\uB97C \uCD5C\uC801\uD654\uD558\uB824\uBA74 \uC9C0\uAE08 Ctrl+E\uB97C \uB204\uB974\uC138\uC694.","\uC5D0\uB514\uD130\uB97C \uD654\uBA74 \uD310\uB3C5\uAE30\uC640 \uD568\uAED8 \uC0AC\uC6A9\uD558\uAE30\uC5D0 \uC801\uD569\uD558\uB3C4\uB85D \uAD6C\uC131\uD588\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uB294 \uD654\uBA74 \uD310\uB3C5\uAE30 \uC0AC\uC6A9\uC744 \uC704\uD574 \uC808\uB300\uB85C \uCD5C\uC801\uD654\uB418\uC9C0 \uC54A\uB3C4\uB85D \uAD6C\uC131\uB429\uB2C8\uB2E4. \uD604\uC7AC\uB85C\uC11C\uB294 \uADF8\uB807\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uD604\uC7AC \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD0A4\uB97C \uB204\uB974\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uB2E4\uC74C \uD3EC\uCEE4\uC2A4 \uAC00\uB2A5\uD55C \uC694\uC18C\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4. {0}\uC744(\uB97C) \uB20C\uB7EC\uC11C \uC774 \uB3D9\uC791\uC744 \uC124\uC815/\uD574\uC81C\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD0A4\uB97C \uB204\uB974\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uB2E4\uC74C \uD3EC\uCEE4\uC2A4 \uAC00\uB2A5\uD55C \uC694\uC18C\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4. {0} \uBA85\uB839\uC740 \uD604\uC7AC \uD0A4 \uBC14\uC778\uB529\uC73C\uB85C \uD2B8\uB9AC\uAC70\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uD604\uC7AC \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD0A4\uB97C \uB204\uB974\uBA74 \uD0ED \uBB38\uC790\uAC00 \uC0BD\uC785\uB429\uB2C8\uB2E4. {0}\uC744(\uB97C) \uB20C\uB7EC\uC11C \uC774 \uB3D9\uC791\uC744 \uC124\uC815/\uD574\uC81C\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD0A4\uB97C \uB204\uB974\uBA74 \uD0ED \uBB38\uC790\uAC00 \uC0BD\uC785\uB429\uB2C8\uB2E4. {0} \uBA85\uB839\uC740 \uD604\uC7AC \uD0A4 \uBC14\uC778\uB529\uC73C\uB85C \uD2B8\uB9AC\uAC70\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","Command+H\uB97C \uB20C\uB7EC \uD3B8\uC9D1\uAE30 \uC811\uADFC\uC131\uACFC \uAD00\uB828\uB41C \uC790\uC138\uD55C \uC815\uBCF4\uAC00 \uC788\uB294 \uBE0C\uB77C\uC6B0\uC800 \uCC3D\uC744 \uC5EC\uC138\uC694.","Ctrl+H\uB97C \uB20C\uB7EC \uD3B8\uC9D1\uAE30 \uC811\uADFC\uC131\uACFC \uAD00\uB828\uB41C \uC790\uC138\uD55C \uC815\uBCF4\uAC00 \uC788\uB294 \uBE0C\uB77C\uC6B0\uC800 \uCC3D\uC744 \uC5FD\uB2C8\uB2E4.","\uC774 \uB3C4\uAD6C \uC124\uBA85\uC744 \uD574\uC81C\uD558\uACE0 Esc \uD0A4 \uB610\uB294 Shift+Esc\uB97C \uB20C\uB7EC\uC11C \uD3B8\uC9D1\uAE30\uB85C \uB3CC\uC544\uAC08 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC811\uADFC\uC131 \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC","\uAC1C\uBC1C\uC790: \uAC80\uC0AC \uD1A0\uD070","\uC904/\uC5F4\uB85C \uC774\uB3D9...","\uBE60\uB978 \uC561\uC138\uC2A4 \uACF5\uAE09\uC790 \uBAA8\uB450 \uD45C\uC2DC","\uBA85\uB839 \uD314\uB808\uD2B8","\uBA85\uB839 \uD45C\uC2DC \uBC0F \uC2E4\uD589","\uAE30\uD638\uB85C \uAC00\uC11C...","\uBC94\uC8FC\uBCC4 \uAE30\uD638\uB85C \uC774\uB3D9...","\uD3B8\uC9D1\uAE30 \uCF58\uD150\uCE20","\uC811\uADFC\uC131 \uC635\uC158\uC740 Alt+F1\uC744 \uB20C\uB7EC\uC5EC \uD569\uB2C8\uB2E4.","\uACE0\uB300\uBE44 \uD14C\uB9C8\uB85C \uC804\uD658","{1} \uD30C\uC77C\uC5D0\uC11C \uD3B8\uC9D1\uC744 {0}\uAC1C \uD588\uC2B5\uB2C8\uB2E4."],"vs/editor/common/view/editorColorRegistry":["\uCEE4\uC11C \uC704\uCE58\uC758 \uC904 \uAC15\uC870 \uD45C\uC2DC\uC5D0 \uB300\uD55C \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCEE4\uC11C \uC704\uCE58\uC758 \uC904 \uD14C\uB450\uB9AC\uC5D0 \uB300\uD55C \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBE60\uB978 \uC5F4\uAE30 \uBC0F \uCC3E\uAE30 \uAE30\uB2A5 \uB4F1\uC744 \uD1B5\uD574 \uAC15\uC870 \uD45C\uC2DC\uB41C \uC601\uC5ED\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uAC15\uC870 \uC601\uC5ED \uC8FC\uBCC0\uC758 \uD14C\uB450\uB9AC\uC5D0 \uB300\uD55C \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4","\uAC15\uC870 \uD45C\uC2DC\uB41C \uAE30\uD638(\uC608: \uC815\uC758\uB85C \uC774\uB3D9 \uB610\uB294 \uB2E4\uC74C/\uC774\uC804 \uAE30\uD638\uB85C \uC774\uB3D9)\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC0C1\uC740 \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uAC15\uC870 \uD45C\uC2DC\uB41C \uAE30\uD638 \uC8FC\uC704\uC758 \uD14C\uB450\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCEE4\uC11C \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCEE4\uC11C\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBE14\uB85D \uCEE4\uC11C\uC640 \uACB9\uCE58\uB294 \uAE00\uC790\uC758 \uC0C9\uC0C1\uC744 \uC0AC\uC6A9\uC790 \uC815\uC758\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uACF5\uBC31 \uBB38\uC790 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uD65C\uC131 \uD3B8\uC9D1\uAE30 \uB4E4\uC5EC\uC4F0\uAE30 \uC548\uB0B4\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC904 \uBC88\uD638 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD65C\uC131 \uC601\uC5ED \uC904\uBC88\uD638 \uC0C9\uC0C1","ID\uB294 \uC0AC\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB300\uC2E0 'editorLineNumber.activeForeground'\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.","\uD3B8\uC9D1\uAE30 \uD65C\uC131 \uC601\uC5ED \uC904\uBC88\uD638 \uC0C9\uC0C1","\uD3B8\uC9D1\uAE30 \uB208\uAE08\uC758 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCF54\uB4DC \uB80C\uC988\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uAD04\uD638 \uB4A4\uC758 \uBC30\uACBD\uC0C9","\uC77C\uCE58\uD558\uB294 \uBE0C\uB798\uD0B7 \uBC15\uC2A4\uC758 \uC0C9\uC0C1","\uAC1C\uC694 \uB208\uAE08 \uACBD\uACC4\uC758 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uAC1C\uC694 \uB208\uAE08\uC790\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBBF8\uB2C8\uB9F5\uC774 \uC0AC\uC6A9\uD558\uB3C4\uB85D \uC124\uC815\uB418\uC5B4 \uD3B8\uC9D1\uAE30\uC758 \uC624\uB978\uCABD\uC5D0 \uBC30\uCE58\uB41C \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uAC70\uD130\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAC70\uD130\uC5D0\uB294 \uAE00\uB9AC\uD504 \uC5EC\uBC31\uACFC \uD589 \uC218\uAC00 \uC788\uC2B5\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC758 \uBD88\uD544\uC694\uD55C(\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294) \uC18C\uC2A4 \uCF54\uB4DC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.",`\uD3B8\uC9D1\uAE30\uC758 \uBD88\uD544\uC694\uD55C(\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294) \uC18C\uC2A4 \uCF54\uB4DC \uBD88\uD22C\uBA85\uB3C4\uC785\uB2C8\uB2E4. \uC608\uB97C \uB4E4\uC5B4 "#000000c0"\uC740 75% \uBD88\uD22C\uBA85\uB3C4\uB85C \uCF54\uB4DC\uB97C \uB80C\uB354\uB9C1\uD569\uB2C8\uB2E4. \uACE0\uB300\uBE44 \uD14C\uB9C8\uC758 \uACBD\uC6B0 \uD398\uC774\uB4DC \uC544\uC6C3\uD558\uC9C0 \uC54A\uACE0 'editorUnnecessaryCode.border' \uD14C\uB9C8 \uC0C9\uC744 \uC0AC\uC6A9\uD558\uC5EC \uBD88\uD544\uC694\uD55C \uCF54\uB4DC\uC5D0 \uBC11\uC904\uC744 \uADF8\uC73C\uC138\uC694.`,"\uBC94\uC704\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC774 \uAC15\uC870 \uD45C\uC2DC\uB429\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC624\uB958\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4."],"vs/editor/contrib/anchorSelect/anchorSelect":["\uC120\uD0DD \uC575\uCEE4 \uC9C0\uC810","{0}\uC5D0 \uC124\uC815\uB41C \uC575\uCEE4: {1}","\uC120\uD0DD \uC575\uCEE4 \uC9C0\uC810 \uC124\uC815","\uC120\uD0DD \uC575\uCEE4 \uC9C0\uC810\uC73C\uB85C \uC774\uB3D9","\uC575\uCEE4\uC5D0\uC11C \uCEE4\uC11C\uB85C \uC120\uD0DD","\uC120\uD0DD \uC575\uCEE4 \uC9C0\uC810 \uCDE8\uC18C"],"vs/editor/contrib/bracketMatching/bracketMatching":["\uAD04\uD638\uC5D0 \uD574\uB2F9\uD558\uB294 \uC601\uC5ED\uC744 \uD45C\uC2DC\uC790\uC5D0 \uCC44\uC0C9\uD558\uC5EC \uD45C\uC2DC\uD569\uB2C8\uB2E4.","\uB300\uAD04\uD638\uB85C \uC774\uB3D9","\uAD04\uD638\uAE4C\uC9C0 \uC120\uD0DD","\uB300\uAD04\uD638\uB85C \uC774\uB3D9(&&B)"],"vs/editor/contrib/caretOperations/caretOperations":["\uC120\uD0DD\uD55C \uD14D\uC2A4\uD2B8\uB97C \uC67C\uCABD\uC73C\uB85C \uC774\uB3D9","\uC120\uD0DD\uD55C \uD14D\uC2A4\uD2B8\uB97C \uC624\uB978\uCABD\uC73C\uB85C \uC774\uB3D9"],"vs/editor/contrib/caretOperations/transpose":["\uBB38\uC790 \uBC14\uAFB8\uAE30"],"vs/editor/contrib/clipboard/clipboard":["\uC798\uB77C\uB0B4\uAE30(&&T)","\uC798\uB77C\uB0B4\uAE30","\uC798\uB77C\uB0B4\uAE30","\uBCF5\uC0AC(&&C)","\uBCF5\uC0AC","\uBCF5\uC0AC","\uBD99\uC5EC\uB123\uAE30(&&P)","\uBD99\uC5EC\uB123\uAE30","\uBD99\uC5EC\uB123\uAE30","\uAD6C\uBB38\uC744 \uAC15\uC870 \uD45C\uC2DC\uD558\uC5EC \uBCF5\uC0AC"],"vs/editor/contrib/codeAction/codeActionCommands":["\uC2E4\uD589\uD560 \uCF54\uB4DC \uC791\uC5C5\uC758 \uC885\uB958\uC785\uB2C8\uB2E4.","\uBC18\uD658\uB41C \uC791\uC5C5\uC774 \uC801\uC6A9\uB418\uB294 \uACBD\uC6B0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD56D\uC0C1 \uBC18\uD658\uB41C \uCCAB \uBC88\uC9F8 \uCF54\uB4DC \uC791\uC5C5\uC744 \uC801\uC6A9\uD569\uB2C8\uB2E4.","\uCCAB \uBC88\uC9F8 \uBC18\uD658\uB41C \uCF54\uB4DC \uC791\uC5C5\uC744 \uC801\uC6A9\uD569\uB2C8\uB2E4(\uC774 \uC791\uC5C5\uB9CC \uC788\uB294 \uACBD\uC6B0).","\uBC18\uD658\uB41C \uCF54\uB4DC \uC791\uC5C5\uC744 \uC801\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.","\uAE30\uBCF8 \uCF54\uB4DC \uC791\uC5C5\uB9CC \uBC18\uD658\uB418\uB3C4\uB85D \uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uCF54\uB4DC \uC791\uC5C5\uC744 \uC801\uC6A9\uD558\uB294 \uC911 \uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.","\uBE60\uB978 \uC218\uC815...","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCF54\uB4DC \uB3D9\uC791\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","'{0}'\uC5D0 \uB300\uD55C \uAE30\uBCF8 \uCF54\uB4DC \uC791\uC5C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","'{0}'\uC5D0 \uB300\uD55C \uCF54\uB4DC \uC791\uC5C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uAE30\uBCF8 \uCF54\uB4DC \uC791\uC5C5 \uC5C6\uC74C","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCF54\uB4DC \uB3D9\uC791\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uB9AC\uD329\uD130\uB9C1...","'{0}'\uC5D0 \uB300\uD55C \uAE30\uBCF8 \uB9AC\uD329\uD130\uB9C1 \uC5C6\uC74C","'{0}'\uC5D0 \uB300\uD55C \uB9AC\uD329\uD130\uB9C1 \uC5C6\uC74C","\uAE30\uBCF8 \uC124\uC815 \uB9AC\uD329\uD130\uB9C1\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB9AC\uD399\uD130\uB9C1\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC18C\uC2A4 \uC791\uC5C5...","'{0}'\uC5D0 \uB300\uD55C \uAE30\uBCF8 \uC18C\uC2A4 \uC791\uC5C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","'{0}'\uC5D0 \uB300\uD55C \uC18C\uC2A4 \uC791\uC5C5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uAE30\uBCF8 \uC6D0\uBCF8 \uC791\uC5C5 \uC5C6\uC74C","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uC18C\uC2A4 \uC791\uC5C5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uAC00\uC838\uC624\uAE30 \uAD6C\uC131","\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uAC00\uC838\uC624\uAE30 \uAD6C\uC131 \uC791\uC5C5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA8\uB450 \uC218\uC815","\uBAA8\uB4E0 \uC791\uC5C5 \uC218\uC815 \uC0AC\uC6A9 \uBD88\uAC00","\uC790\uB3D9 \uC218\uC815...","\uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uC790\uB3D9 \uC218\uC815 \uC5C6\uC74C"],"vs/editor/contrib/codeAction/lightBulbWidget":["\uC218\uC815 \uC0AC\uD56D\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4. \uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uAE30\uBCF8 \uC218\uC815({0})","\uC218\uC815 \uC0AC\uD56D \uD45C\uC2DC({0})","\uC218\uC815 \uC0AC\uD56D \uD45C\uC2DC"],"vs/editor/contrib/codelens/codelensController":["\uD604\uC7AC \uC904\uC5D0 \uB300\uD55C \uCF54\uB4DC \uB80C\uC988 \uBA85\uB839 \uD45C\uC2DC"],"vs/editor/contrib/comment/comment":["\uC904 \uC8FC\uC11D \uC124\uC815/\uD574\uC81C","\uC904 \uC8FC\uC11D \uC124\uC815/\uD574\uC81C(&&T)","\uC904 \uC8FC\uC11D \uCD94\uAC00","\uC904 \uC8FC\uC11D \uC81C\uAC70","\uBE14\uB85D \uC8FC\uC11D \uC124\uC815/\uD574\uC81C","\uBE14\uB85D \uC8FC\uC11D \uC124\uC815/\uD574\uC81C(&&B)"],"vs/editor/contrib/contextmenu/contextmenu":["\uD3B8\uC9D1\uAE30 \uC0C1\uD669\uC5D0 \uB9DE\uB294 \uBA54\uB274 \uD45C\uC2DC"],"vs/editor/contrib/cursorUndo/cursorUndo":["\uCEE4\uC11C \uC2E4\uD589 \uCDE8\uC18C","\uCEE4\uC11C \uB2E4\uC2DC \uC2E4\uD589"],"vs/editor/contrib/find/findController":["\uCC3E\uAE30","\uCC3E\uAE30(&&F)","\uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uCC3E\uAE30","\uB2E4\uC74C \uCC3E\uAE30","\uB2E4\uC74C \uCC3E\uAE30","\uC774\uC804 \uCC3E\uAE30","\uC774\uC804 \uCC3E\uAE30","\uB2E4\uC74C \uC120\uD0DD \uCC3E\uAE30","\uC774\uC804 \uC120\uD0DD \uCC3E\uAE30","\uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30(&&R)"],"vs/editor/contrib/find/findWidget":["\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uC120\uD0DD \uC601\uC5ED\uC5D0\uC11C \uCC3E\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC774 \uCD95\uC18C\uB418\uC5C8\uC74C\uC744 \uB098\uD0C0\uB0B4\uB294 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC774 \uD655\uC7A5\uB418\uC5C8\uC74C\uC744 \uB098\uD0C0\uB0B4\uB294 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uBC14\uAFB8\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uBAA8\uB450 \uBC14\uAFB8\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uC774\uC804 \uCC3E\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uCC3E\uAE30 \uC704\uC82F\uC5D0\uC11C '\uB2E4\uC74C \uCC3E\uAE30'\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uCC3E\uAE30","\uCC3E\uAE30","\uC774\uC804 \uC77C\uCE58","\uB2E4\uC74C \uC77C\uCE58 \uD56D\uBAA9","\uC120\uD0DD \uD56D\uBAA9\uC5D0\uC11C \uCC3E\uAE30","\uB2EB\uAE30","\uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30","\uBAA8\uB450 \uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30 \uBAA8\uB4DC \uC124\uC815/\uD574\uC81C","\uCC98\uC74C {0}\uAC1C\uC758 \uACB0\uACFC\uAC00 \uAC15\uC870 \uD45C\uC2DC\uB418\uC9C0\uB9CC \uBAA8\uB4E0 \uCC3E\uAE30 \uC791\uC5C5\uC740 \uC804\uCCB4 \uD14D\uC2A4\uD2B8\uC5D0 \uB300\uD574 \uC218\uD589\uB429\uB2C8\uB2E4.","{1}\uC758 {0}","\uACB0\uACFC \uC5C6\uC74C","{0}\uAC1C \uCC3E\uC74C","'{1}'\uC5D0 \uB300\uD55C {0}\uC744(\uB97C) \uCC3E\uC74C","{2}\uC5D0\uC11C '{1}'\uC5D0 \uB300\uD55C {0}\uC744(\uB97C) \uCC3E\uC74C","'{1}'\uC5D0 \uB300\uD55C {0}\uC744(\uB97C) \uCC3E\uC74C","Ctrl+Enter\uB97C \uB204\uB974\uBA74 \uC774\uC81C \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uBC14\uAFB8\uC9C0 \uC54A\uACE0 \uC904 \uBC14\uAFC8\uC744 \uC0BD\uC785\uD569\uB2C8\uB2E4. editor.action.replaceAll\uC758 \uD0A4 \uBC14\uC778\uB529\uC744 \uC218\uC815\uD558\uC5EC \uC774 \uB3D9\uC791\uC744 \uC7AC\uC815\uC758\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/folding/folding":["\uD3BC\uCE58\uAE30","\uC7AC\uADC0\uC801\uC73C\uB85C \uD3BC\uCE58\uAE30","\uC811\uAE30","\uC811\uAE30 \uC804\uD658","\uC7AC\uADC0\uC801\uC73C\uB85C \uC811\uAE30","\uBAA8\uB4E0 \uBE14\uB85D \uCF54\uBA58\uD2B8\uB97C \uC811\uAE30","\uBAA8\uB4E0 \uC601\uC5ED \uC811\uAE30","\uBAA8\uB4E0 \uC601\uC5ED \uD3BC\uCE58\uAE30","\uBAA8\uB450 \uC811\uAE30","\uBAA8\uB450 \uD3BC\uCE58\uAE30","\uC218\uC900 {0} \uC811\uAE30","\uC811\uD78C \uBC94\uC704\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC0C9\uC740 \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uAE30 \uC704\uD574 \uBD88\uD22C\uBA85\uD574\uC11C\uB294 \uC548 \uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC5EC\uBC31\uC758 \uC811\uAE30 \uCEE8\uD2B8\uB864 \uC0C9\uC785\uB2C8\uB2E4."],"vs/editor/contrib/folding/foldingDecorations":["\uD3B8\uC9D1\uAE30 \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC5D0\uC11C \uD655\uC7A5\uB41C \uBC94\uC704\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uBB38\uC790 \uBAA8\uC591 \uC5EC\uBC31\uC5D0\uC11C \uCD95\uC18C\uB41C \uBC94\uC704\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4."],"vs/editor/contrib/fontZoom/fontZoom":["\uD3B8\uC9D1\uAE30 \uAE00\uAF34 \uD655\uB300","\uD3B8\uC9D1\uAE30 \uAE00\uAF34 \uCD95\uC18C","\uD3B8\uC9D1\uAE30 \uAE00\uAF34 \uD655\uB300/\uCD95\uC18C \uB2E4\uC2DC \uC124\uC815"],"vs/editor/contrib/format/format":["\uC904 {0}\uC5D0\uC11C 1\uAC1C \uC11C\uC2DD \uD3B8\uC9D1\uC744 \uC218\uD589\uD588\uC2B5\uB2C8\uB2E4.","\uC904 {1}\uC5D0\uC11C {0}\uAC1C \uC11C\uC2DD \uD3B8\uC9D1\uC744 \uC218\uD589\uD588\uC2B5\uB2C8\uB2E4.","\uC904 {0}\uACFC(\uC640) {1} \uC0AC\uC774\uC5D0\uC11C 1\uAC1C \uC11C\uC2DD \uD3B8\uC9D1\uC744 \uC218\uD589\uD588\uC2B5\uB2C8\uB2E4.","\uC904 {1}\uACFC(\uC640) {2} \uC0AC\uC774\uC5D0\uC11C {0}\uAC1C \uC11C\uC2DD \uD3B8\uC9D1\uC744 \uC218\uD589\uD588\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/format/formatActions":["\uBB38\uC11C \uC11C\uC2DD","\uC120\uD0DD \uC601\uC5ED \uC11C\uC2DD"],"vs/editor/contrib/gotoError/gotoError":["\uB2E4\uC74C \uBB38\uC81C\uB85C \uC774\uB3D9 (\uC624\uB958, \uACBD\uACE0, \uC815\uBCF4)","\uB2E4\uC74C \uB9C8\uCEE4\uB85C \uC774\uB3D9\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uC774\uC804 \uBB38\uC81C\uB85C \uC774\uB3D9 (\uC624\uB958, \uACBD\uACE0, \uC815\uBCF4)","\uC774\uC804 \uB9C8\uCEE4\uB85C \uC774\uB3D9\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uD30C\uC77C\uC758 \uB2E4\uC74C \uBB38\uC81C\uB85C \uC774\uB3D9 (\uC624\uB958, \uACBD\uACE0, \uC815\uBCF4)","\uB2E4\uC74C \uBB38\uC81C(&&P)","\uD30C\uC77C\uC758 \uC774\uC804 \uBB38\uC81C\uB85C \uC774\uB3D9 (\uC624\uB958, \uACBD\uACE0, \uC815\uBCF4)","\uC774\uC804 \uBB38\uC81C(&&P)"],"vs/editor/contrib/gotoError/gotoErrorWidget":["\uC624\uB958","\uACBD\uACE0","\uC815\uBCF4","\uD78C\uD2B8","{1}\uC758 {0}\uC785\uB2C8\uB2E4. ","\uBB38\uC81C {1}\uAC1C \uC911 {0}\uAC1C","\uBB38\uC81C {1}\uAC1C \uC911 {0}\uAC1C","\uD3B8\uC9D1\uAE30 \uD45C\uC2DD \uD0D0\uC0C9 \uC704\uC82F \uC624\uB958 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD45C\uC2DD \uD0D0\uC0C9 \uC704\uC82F \uACBD\uACE0 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD45C\uC2DD \uD0D0\uC0C9 \uC704\uC82F \uC815\uBCF4 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD45C\uC2DD \uD0D0\uC0C9 \uC704\uC82F \uBC30\uACBD\uC785\uB2C8\uB2E4."],"vs/editor/contrib/gotoSymbol/goToCommands":["\uD53C\uD0B9","\uC815\uC758","'{0}'\uC5D0 \uB300\uD55C \uC815\uC758\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC815\uC758\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC815\uC758\uB85C \uC774\uB3D9","\uC815\uC758\uB85C \uC774\uB3D9(&&D)","\uCE21\uBA74\uC5D0\uC11C \uC815\uC758 \uC5F4\uAE30","\uC815\uC758 \uD53C\uD0B9","\uC120\uC5B8","'{0}'\uC5D0 \uB300\uD55C \uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC120\uC5B8\uC73C\uB85C \uC774\uB3D9","\uC120\uC5B8\uC73C\uB85C \uC774\uB3D9(&&D)","'{0}'\uC5D0 \uB300\uD55C \uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C","\uC120\uC5B8 \uBBF8\uB9AC \uBCF4\uAE30","\uD615\uC2DD \uC815\uC758","'{0}'\uC5D0 \uB300\uD55C \uD615\uC2DD \uC815\uC758\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uD615\uC2DD \uC815\uC758\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uD615\uC2DD \uC815\uC758\uB85C \uC774\uB3D9","\uD615\uC2DD \uC815\uC758\uB85C \uC774\uB3D9(&&T)","\uD615\uC2DD \uC815\uC758 \uBBF8\uB9AC \uBCF4\uAE30","\uAD6C\uD604","'{0}'\uC5D0 \uB300\uD55C \uAD6C\uD604\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uAD6C\uD604\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uAD6C\uD604\uC73C\uB85C \uC774\uB3D9","\uAD6C\uD604\uC73C\uB85C \uC774\uB3D9(&&I)","\uD53C\uD0B9 \uAD6C\uD604","'{0}'\uC5D0 \uB300\uD55C \uCC38\uC870\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uCC38\uC870\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uCC38\uC870\uB85C \uC774\uB3D9","\uCC38\uC870\uB85C \uC774\uB3D9(&&R)","\uCC38\uC870","\uCC38\uC870 \uBBF8\uB9AC \uBCF4\uAE30","\uCC38\uC870","\uAE30\uD638\uB85C \uC774\uB3D9","\uC704\uCE58","'{0}'\uC5D0 \uB300\uD55C \uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC74C","\uCC38\uC870"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["{0}\uAC1C \uC815\uC758\uB97C \uD45C\uC2DC\uD558\uB824\uBA74 \uD074\uB9AD\uD558\uC138\uC694."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["\uB85C\uB4DC \uC911...","{0}({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["\uCC38\uC870 {0}\uAC1C","\uCC38\uC870 {0}\uAC1C","\uCC38\uC870"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["\uBBF8\uB9AC \uBCF4\uAE30\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uACB0\uACFC \uC5C6\uC74C","\uCC38\uC870"],"vs/editor/contrib/gotoSymbol/referencesModel":["{2}\uC5F4, {1}\uC904, {0}\uC758 \uAE30\uD638","\uC5F4 {2}, {3}\uC758 \uC904 {1}\uC5D0 \uC788\uB294 {0}\uC758 \uAE30\uD638","{0}\uC758 \uAE30\uD638 1\uAC1C, \uC804\uCCB4 \uACBD\uB85C {1}","{1}\uC758 \uAE30\uD638 {0}\uAC1C, \uC804\uCCB4 \uACBD\uB85C {2}","\uACB0\uACFC \uC5C6\uC74C","{0}\uC5D0\uC11C \uAE30\uD638 1\uAC1C\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4.","{1}\uC5D0\uC11C \uAE30\uD638 {0}\uAC1C\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4.","{1}\uAC1C \uD30C\uC77C\uC5D0\uC11C \uAE30\uD638 {0}\uAC1C\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/gotoSymbol/symbolNavigation":["{1}\uC758 {0} \uAE30\uD638, \uB2E4\uC74C\uC758 \uACBD\uC6B0 {2}","{1}\uC758 \uAE30\uD638 {0}"],"vs/editor/contrib/hover/hover":["\uAC00\uB9AC\uD0A4\uAE30 \uD45C\uC2DC","\uC815\uC758 \uBBF8\uB9AC \uBCF4\uAE30 \uAC00\uB9AC\uD0A8 \uD56D\uBAA9 \uD45C\uC2DC"],"vs/editor/contrib/hover/markdownHoverParticipant":["\uB85C\uB4DC \uC911..."],"vs/editor/contrib/hover/markerHoverParticipant":["View Problem","\uBE60\uB978 \uC218\uC815\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uBE60\uB978 \uC218\uC815\uC744 \uD655\uC778\uD558\uB294 \uC911...","\uBE60\uB978 \uC218\uC815\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C","\uBE60\uB978 \uC218\uC815..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["\uC774\uC804 \uAC12\uC73C\uB85C \uBC14\uAFB8\uAE30","\uB2E4\uC74C \uAC12\uC73C\uB85C \uBC14\uAFB8\uAE30"],"vs/editor/contrib/indentation/indentation":["\uB4E4\uC5EC\uC4F0\uAE30\uB97C \uACF5\uBC31\uC73C\uB85C \uBCC0\uD658","\uB4E4\uC5EC\uC4F0\uAE30\uB97C \uD0ED\uC73C\uB85C \uBCC0\uD658","\uAD6C\uC131\uB41C \uD0ED \uD06C\uAE30","\uD604\uC7AC \uD30C\uC77C\uC758 \uD0ED \uD06C\uAE30 \uC120\uD0DD","\uD0ED\uC744 \uC0AC\uC6A9\uD55C \uB4E4\uC5EC\uC4F0\uAE30","\uACF5\uBC31\uC744 \uC0AC\uC6A9\uD55C \uB4E4\uC5EC\uC4F0\uAE30","\uCF58\uD150\uCE20\uC5D0\uC11C \uB4E4\uC5EC\uC4F0\uAE30 \uAC10\uC9C0","\uC904 \uB2E4\uC2DC \uB4E4\uC5EC\uC4F0\uAE30","\uC120\uD0DD\uD55C \uC904 \uB2E4\uC2DC \uB4E4\uC5EC\uC4F0\uAE30"],"vs/editor/contrib/linesOperations/linesOperations":["\uC704\uC5D0 \uC904 \uBCF5\uC0AC","\uC704\uC5D0 \uC904 \uBCF5\uC0AC(&&C)","\uC544\uB798\uC5D0 \uC904 \uBCF5\uC0AC","\uC544\uB798\uC5D0 \uC904 \uBCF5\uC0AC(&&P)","\uC911\uBCF5\uB41C \uC120\uD0DD \uC601\uC5ED","\uC911\uBCF5\uB41C \uC120\uD0DD \uC601\uC5ED(&&D)","\uC904 \uC704\uB85C \uC774\uB3D9","\uC904 \uC704\uB85C \uC774\uB3D9(&&V)","\uC904 \uC544\uB798\uB85C \uC774\uB3D9","\uC904 \uC544\uB798\uB85C \uC774\uB3D9(&&L)","\uC904\uC744 \uC624\uB984\uCC28\uC21C \uC815\uB82C","\uC904\uC744 \uB0B4\uB9BC\uCC28\uC21C\uC73C\uB85C \uC815\uB82C","\uD6C4\uD589 \uACF5\uBC31 \uC790\uB974\uAE30","\uC904 \uC0AD\uC81C","\uC904 \uB4E4\uC5EC\uC4F0\uAE30","\uC904 \uB0B4\uC5B4\uC4F0\uAE30","\uC704\uC5D0 \uC904 \uC0BD\uC785","\uC544\uB798\uC5D0 \uC904 \uC0BD\uC785","\uC67C\uCABD \uBAA8\uB450 \uC0AD\uC81C","\uC6B0\uCE21\uC5D0 \uC788\uB294 \uD56D\uBAA9 \uC0AD\uC81C","\uC904 \uC5F0\uACB0","\uCEE4\uC11C \uC8FC\uC704 \uBB38\uC790 \uBC14\uAFB8\uAE30","\uB300\uBB38\uC790\uB85C \uBCC0\uD658","\uC18C\uBB38\uC790\uB85C \uBCC0\uD658","\uB2E8\uC5B4\uC758 \uCCAB \uAE00\uC790\uB97C \uB300\uBB38\uC790\uB85C \uBCC0\uD658","\uC2A4\uB124\uC774\uD06C \uD45C\uAE30\uBC95\uC73C\uB85C \uBCC0\uD658"],"vs/editor/contrib/linkedEditing/linkedEditing":["\uC5F0\uACB0\uB41C \uD3B8\uC9D1 \uC2DC\uC791","\uD615\uC2DD\uC758 \uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C \uC774\uB984\uC744 \uBC14\uAFC0 \uB54C\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4."],"vs/editor/contrib/links/links":["\uBA85\uB839 \uC2E4\uD589","\uB9C1\uD06C\uB85C \uC774\uB3D9","Cmd+\uD074\uB9AD","Ctrl+\uD074\uB9AD","Option+\uD074\uB9AD","Alt+\uD074\uB9AD","\uBA85\uB839 {0} \uC2E4\uD589","{0} \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uC774 \uB9C1\uD06C\uB97C \uC5F4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4","\uB300\uC0C1\uC774 \uC5C6\uC73C\uBBC0\uB85C \uC774 \uB9C1\uD06C\uB97C \uC5F4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uB9C1\uD06C \uC5F4\uAE30"],"vs/editor/contrib/message/messageController":["\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD604\uC7AC \uC778\uB77C\uC778 \uBA54\uC2DC\uC9C0\uB97C \uD45C\uC2DC\uD558\uB294\uC9C0 \uC5EC\uBD80","\uC77D\uAE30 \uC804\uC6A9 \uD3B8\uC9D1\uAE30\uC5D0\uC11C\uB294 \uD3B8\uC9D1\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."],"vs/editor/contrib/multicursor/multicursor":["\uC704\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uC704\uC5D0 \uCEE4\uC11C \uCD94\uAC00(&&A)","\uC544\uB798\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uC544\uB798\uC5D0 \uCEE4\uC11C \uCD94\uAC00(&&D)","\uC904 \uB05D\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uC904 \uB05D\uC5D0 \uCEE4\uC11C \uCD94\uAC00(&&U)","\uB9E8 \uC544\uB798\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uB9E8 \uC704\uC5D0 \uCEE4\uC11C \uCD94\uAC00","\uB2E4\uC74C \uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uC5D0 \uC120\uD0DD \uD56D\uBAA9 \uCD94\uAC00","\uB2E4\uC74C \uD56D\uBAA9 \uCD94\uAC00(&&N)","\uC774\uC804 \uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uC5D0 \uC120\uD0DD \uD56D\uBAA9 \uCD94\uAC00","\uC774\uC804 \uD56D\uBAA9 \uCD94\uAC00(&&R)","\uB2E4\uC74C \uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uB85C \uB9C8\uC9C0\uB9C9 \uC120\uD0DD \uD56D\uBAA9 \uC774\uB3D9","\uB9C8\uC9C0\uB9C9 \uC120\uD0DD \uD56D\uBAA9\uC744 \uC774\uC804 \uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uB85C \uC774\uB3D9","\uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uC758 \uBAA8\uB4E0 \uD56D\uBAA9 \uC120\uD0DD","\uBAA8\uB4E0 \uD56D\uBAA9 \uC120\uD0DD(&&O)","\uBAA8\uB4E0 \uD56D\uBAA9 \uBCC0\uACBD"],"vs/editor/contrib/parameterHints/parameterHints":["\uB9E4\uAC1C \uBCC0\uC218 \uD78C\uD2B8 \uD2B8\uB9AC\uAC70"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["\uB2E4\uC74C \uB9E4\uAC1C \uBCC0\uC218 \uD78C\uD2B8 \uD45C\uC2DC\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uC774\uC804 \uB9E4\uAC1C \uBCC0\uC218 \uD78C\uD2B8 \uD45C\uC2DC\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","{0}, \uD78C\uD2B8"],"vs/editor/contrib/peekView/peekView":["\uB2EB\uAE30","Peek \uBDF0 \uC81C\uBAA9 \uC601\uC5ED\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uC81C\uBAA9 \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uC81C\uBAA9 \uC815\uBCF4 \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD14C\uB450\uB9AC \uBC0F \uD654\uC0B4\uD45C \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC5D0\uC11C \uB77C\uC778 \uB178\uB4DC\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC5D0\uC11C \uD30C\uC77C \uB178\uB4DC\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC5D0\uC11C \uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC5D0\uC11C \uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uAC70\uD130 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uACB0\uACFC \uBAA9\uB85D\uC758 \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC \uC0C9\uC785\uB2C8\uB2E4.","Peek \uBDF0 \uD3B8\uC9D1\uAE30\uC758 \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["\uC6B0\uC120 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30\uB97C \uC5F4\uACE0 \uC904\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","{0} \uC904 \uBC0F {1} \uC5F4\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","{0} \uC904\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uC904: {0}, \uBB38\uC790: {1} \uC774\uB3D9\uD560 \uC904 1~{2} \uC0AC\uC774\uC758 \uBC88\uD638\uB97C \uC785\uB825\uD569\uB2C8\uB2E4.","\uD604\uC7AC \uC904: {0}, \uBB38\uC790: {1}. \uC774\uB3D9\uD560 \uC904 \uBC88\uD638\uB97C \uC785\uB825\uD569\uB2C8\uB2E4."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["\uAE30\uD638\uB85C \uC774\uB3D9\uD558\uB824\uBA74 \uBA3C\uC800 \uAE30\uD638 \uC815\uBCF4\uAC00 \uC788\uB294 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30\uB97C \uC5FD\uB2C8\uB2E4.","\uD65C\uC131 \uC0C1\uD0DC\uC758 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30\uB294 \uAE30\uD638 \uC815\uBCF4\uB97C \uC81C\uACF5\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uD3B8\uC9D1\uAE30 \uAE30\uD638 \uC5C6\uC74C","\uD3B8\uC9D1\uAE30 \uAE30\uD638 \uC5C6\uC74C","\uCE21\uBA74\uC5D0\uC11C \uC5F4\uAE30","\uD558\uB2E8\uC5D0 \uC5F4\uAE30","\uAE30\uD638({0})","\uC18D\uC131({0})","\uBA54\uC11C\uB4DC({0})","\uD568\uC218({0})","\uC0DD\uC131\uC790({0})","\uBCC0\uC218({0})","\uD074\uB798\uC2A4({0})","\uAD6C\uC870\uCCB4({0})","\uC774\uBCA4\uD2B8({0})","\uC5F0\uC0B0\uC790({0})","\uC778\uD130\uD398\uC774\uC2A4({0})","\uB124\uC784\uC2A4\uD398\uC774\uC2A4({0})","\uD328\uD0A4\uC9C0({0})","\uD615\uC2DD \uB9E4\uAC1C \uBCC0\uC218({0})","\uBAA8\uB4C8({0})","\uC18D\uC131({0})","\uC5F4\uAC70\uD615({0})","\uC5F4\uAC70\uD615 \uBA64\uBC84({0})","\uBB38\uC790\uC5F4({0})","\uD30C\uC77C({0})","\uBC30\uC5F4({0})","\uC22B\uC790({0})","\uBD80\uC6B8({0})","\uAC1C\uCCB4({0})","\uD0A4({0})","\uD544\uB4DC({0})","\uC0C1\uC218({0})"],"vs/editor/contrib/rename/rename":["\uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC704\uCE58 \uC774\uB984\uC744 \uBC14\uAFB8\uB294 \uC911 \uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.","'{0}'\uC758 \uC774\uB984\uC744 \uBC14\uAFB8\uB294 \uC911","{0} \uC774\uB984 \uBC14\uAFB8\uAE30","'{0}'\uC744(\uB97C) '{1}'(\uC73C)\uB85C \uC774\uB984\uC744 \uBCC0\uACBD\uD588\uC2B5\uB2C8\uB2E4. \uC694\uC57D: {2}","\uC774\uB984 \uBC14\uAFB8\uAE30\uB97C \uD1B5\uD574 \uD3B8\uC9D1 \uB0B4\uC6A9\uC744 \uC801\uC6A9\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uC774\uB984 \uBC14\uAFB8\uAE30\uB97C \uD1B5\uD574 \uD3B8\uC9D1 \uB0B4\uC6A9\uC744 \uACC4\uC0B0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.","\uAE30\uD638 \uC774\uB984 \uBC14\uAFB8\uAE30","\uC774\uB984\uC744 \uBC14\uAFB8\uAE30 \uC804\uC5D0 \uBCC0\uACBD \uB0B4\uC6A9\uC744 \uBBF8\uB9AC \uBCFC \uC218 \uC788\uB294 \uAE30\uB2A5 \uC0AC\uC6A9/\uC0AC\uC6A9 \uC548 \uD568"],"vs/editor/contrib/rename/renameInputField":["\uC785\uB825 \uC774\uB984\uC744 \uBC14\uAFB8\uC138\uC694. \uC0C8 \uC774\uB984\uC744 \uC785\uB825\uD55C \uB2E4\uC74C [Enter] \uD0A4\uB97C \uB20C\uB7EC \uCEE4\uBC0B\uD558\uC138\uC694.","\uC774\uB984 \uBC14\uAFB8\uAE30 {0}, \uBBF8\uB9AC \uBCF4\uAE30 {1}"],"vs/editor/contrib/smartSelect/smartSelect":["\uC120\uD0DD \uC601\uC5ED \uD655\uC7A5","\uC120\uD0DD \uC601\uC5ED \uD655\uC7A5(&&E)","\uC120\uD0DD \uC601\uC5ED \uCD95\uC18C","\uC120\uD0DD \uC601\uC5ED \uCD95\uC18C(&&S)"],"vs/editor/contrib/snippet/snippetVariables":["\uC77C\uC694\uC77C","\uC6D4\uC694\uC77C","\uD654\uC694\uC77C","\uC218\uC694\uC77C","\uBAA9\uC694\uC77C","\uAE08\uC694\uC77C","\uD1A0\uC694\uC77C","\uC77C","\uC6D4","\uD654","\uC218","\uBAA9","\uAE08","\uD1A0","1\uC6D4","2\uC6D4","3\uC6D4","4\uC6D4","5\uC6D4","6\uC6D4","7\uC6D4","8\uC6D4","9\uC6D4","10\uC6D4","11\uC6D4","12\uC6D4","1\uC6D4","2\uC6D4","3\uC6D4","4\uC6D4","5\uC6D4","6\uC6D4","7\uC6D4","8\uC6D4","9\uC6D4","10\uC6D4","11\uC6D4","12\uC6D4"],"vs/editor/contrib/suggest/suggestController":["{0}\uC758 {1}\uAC1C\uC758 \uC218\uC815\uC0AC\uD56D\uC744 \uC218\uB77D\uD558\uB294 \uC911","\uC81C\uC548 \uD56D\uBAA9 \uD2B8\uB9AC\uAC70","\uC0BD\uC785","\uC0BD\uC785","\uBC14\uAFB8\uAE30","\uBC14\uAFB8\uAE30","\uC0BD\uC785","\uAC04\uB2E8\uD788 \uD45C\uC2DC","\uB354 \uBCF4\uAE30","\uC81C\uC548 \uC704\uC82F \uD06C\uAE30 \uB2E4\uC2DC \uC124\uC815"],"vs/editor/contrib/suggest/suggestWidget":["\uC81C\uC548 \uC704\uC82F\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uD55C \uC704\uC82F\uC5D0\uC11C \uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uC548 \uC704\uC82F\uC758 \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC \uC0C9\uC785\uB2C8\uB2E4.","\uB85C\uB4DC \uC911...","\uC81C\uC548 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.","{0}, \uBB38\uC11C: {1}","\uC81C\uC548"],"vs/editor/contrib/suggest/suggestWidgetDetails":["\uB2EB\uAE30","\uB85C\uB4DC \uC911..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["\uC81C\uC548 \uC704\uC82F\uC5D0\uC11C \uC790\uC138\uD55C \uC815\uBCF4\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4.","\uC790\uC138\uD55C \uC815\uBCF4"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["\uBC30\uC5F4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uBD80\uC6B8 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD074\uB798\uC2A4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC0C9 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC0C1\uC218 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC0DD\uC131\uC790 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC5F4\uAC70\uC790 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uC5F4\uAC70\uC790 \uBA64\uBC84 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC774\uBCA4\uD2B8 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD544\uB4DC \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD30C\uC77C \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD3F4\uB354 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD568\uC218 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC778\uD130\uD398\uC774\uC2A4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD0A4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD0A4\uC6CC\uB4DC \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uBA54\uC11C\uB4DC \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uBAA8\uB4C8 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uB124\uC784\uC2A4\uD398\uC774\uC2A4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","null \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC22B\uC790 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uAC1C\uCCB4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC5F0\uC0B0\uC790 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD328\uD0A4\uC9C0 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uC18D\uC131 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uCC38\uC870 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uBB38\uC790\uC5F4 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uAD6C\uC870 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uB098\uD0C0\uB0A9\uB2C8\uB2E4.","\uD615\uC2DD \uB9E4\uAC1C\uBCC0\uC218 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uB2E8\uC704 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4.","\uBCC0\uC218 \uAE30\uD638\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uAE30\uD638\uB294 \uAC1C\uC694, \uC774\uB3D9 \uACBD\uB85C \uBC0F \uC81C\uC548 \uC704\uC82F\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":[" \uD0A4\uB85C \uD3EC\uCEE4\uC2A4 \uC774\uB3D9 \uC124\uC815/\uD574\uC81C","\uC774\uC81C \uD0A4\uB97C \uB204\uB974\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uB2E4\uC74C \uD3EC\uCEE4\uC2A4 \uAC00\uB2A5\uD55C \uC694\uC18C\uB85C \uC774\uB3D9\uD569\uB2C8\uB2E4.","\uC774\uC81C \uD0A4\uB97C \uB204\uB974\uBA74 \uD0ED \uBB38\uC790\uAC00 \uC0BD\uC785\uB429\uB2C8\uB2E4."],"vs/editor/contrib/tokenization/tokenization":["\uAC1C\uBC1C\uC790: \uAC15\uC81C\uB85C \uB2E4\uC2DC \uD1A0\uD070\uD654"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790","\uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790\uAC00 \uAC80\uC0C9\uB428","\uC774 \uD30C\uC77C\uC5D0 LS(\uC904 \uAD6C\uBD84 \uAE30\uD638) \uB610\uB294 PS(\uB2E8\uB77D \uAD6C\uBD84 \uAE30\uD638) \uAC19\uC740 \uD558\uB098 \uC774\uC0C1\uC758 \uBE44\uC815\uC0C1\uC801\uC778 \uC904 \uC885\uACB0\uC790 \uBB38\uC790\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.\r\n\r\n\uD30C\uC77C\uC5D0\uC11C \uC81C\uAC70\uD558\uB294 \uAC83\uC774 \uC88B\uC2B5\uB2C8\uB2E4. `editor.unusualLineTerminators`\uB97C \uD1B5\uD574 \uAD6C\uC131\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC774 \uD30C\uC77C \uC218\uC815","\uC774 \uD30C\uC77C\uC758 \uBB38\uC81C \uBB34\uC2DC"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["\uBCC0\uC218 \uC77D\uAE30\uC640 \uAC19\uC740 \uC77D\uAE30 \uC561\uC138\uC2A4 \uC911 \uAE30\uD638\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uBCC0\uC218\uC5D0 \uC4F0\uAE30\uC640 \uAC19\uC740 \uC4F0\uAE30 \uC561\uC138\uC2A4 \uC911 \uAE30\uD638\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uBCC0\uC218 \uC77D\uAE30\uC640 \uAC19\uC740 \uC77D\uAE30 \uC561\uC138\uC2A4 \uC911 \uAE30\uD638\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uBCC0\uC218\uC5D0 \uC4F0\uAE30\uC640 \uAC19\uC740 \uC4F0\uAE30 \uC561\uC138\uC2A4 \uC911 \uAE30\uD638\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uAE30\uD638 \uAC15\uC870 \uD45C\uC2DC\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC4F0\uAE30 \uC561\uC138\uC2A4 \uAE30\uD638\uC5D0 \uB300\uD55C \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC774 \uAC15\uC870 \uD45C\uC2DC\uB429\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uB2E4\uC74C \uAC15\uC870 \uAE30\uD638\uB85C \uC774\uB3D9","\uC774\uC804 \uAC15\uC870 \uAE30\uD638\uB85C \uC774\uB3D9","\uAE30\uD638 \uAC15\uC870 \uD45C\uC2DC \uD2B8\uB9AC\uAC70"],"vs/editor/contrib/wordOperations/wordOperations":["\uB2E8\uC5B4 \uC0AD\uC81C"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0}({1})"],"vs/platform/configuration/common/configurationRegistry":["\uAE30\uBCF8 \uC5B8\uC5B4 \uAD6C\uC131 \uC7AC\uC815\uC758","\uC5B8\uC5B4\uC5D0 \uB300\uD574 \uC7AC\uC815\uC758\uD560 \uD3B8\uC9D1\uAE30 \uC124\uC815\uC744 \uAD6C\uC131\uD569\uB2C8\uB2E4.","\uC774 \uC124\uC815\uC740 \uC5B8\uC5B4\uBCC4 \uAD6C\uC131\uC744 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.","\uBE48 \uC18D\uC131\uC744 \uB4F1\uB85D\uD560 \uC218 \uC5C6\uC74C","'{0}'\uC744(\uB97C) \uB4F1\uB85D\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774\uB294 \uC5B8\uC5B4\uBCC4 \uD3B8\uC9D1\uAE30 \uC124\uC815\uC744 \uC124\uBA85\uD558\uB294 \uC18D\uC131 \uD328\uD134\uC778 '\\\\[.*\\\\]$'\uACFC(\uC640) \uC77C\uCE58\uD569\uB2C8\uB2E4. 'configurationDefaults' \uAE30\uC5EC\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.","'{0}'\uC744(\uB97C) \uB4F1\uB85D\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774 \uC18D\uC131\uC740 \uC774\uBBF8 \uB4F1\uB85D\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4."],"vs/platform/contextkey/browser/contextKeyService":["\uCEE8\uD14D\uC2A4\uD2B8 \uD0A4\uC5D0 \uB300\uD55C \uC815\uBCF4\uB97C \uBC18\uD658\uD558\uB294 \uBA85\uB839"],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["({0})\uC744(\uB97C) \uB20C\uB800\uC2B5\uB2C8\uB2E4. \uB458\uC9F8 \uD0A4\uB294 \uC7A0\uC2DC \uAE30\uB2E4\uB838\uB2E4\uAC00 \uB204\uB974\uC2ED\uC2DC\uC624...","\uD0A4 \uC870\uD569({0}, {1})\uC740 \uBA85\uB839\uC774 \uC544\uB2D9\uB2C8\uB2E4."],"vs/platform/list/browser/listService":["\uC6CC\uD06C\uBCA4\uCE58","Windows\uC640 Linux\uC758 'Control'\uC744 macOS\uC758 'Command'\uB85C \uB9E4\uD551\uD569\uB2C8\uB2E4.","Windows\uC640 Linux\uC758 'Alt'\uB97C macOS\uC758 'Option'\uC73C\uB85C \uB9E4\uD551\uD569\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uD2B8\uB9AC\uC640 \uBAA9\uB85D\uC758 \uD56D\uBAA9\uC744 \uB2E4\uC911 \uC120\uD0DD\uC5D0 \uCD94\uAC00\uD560 \uB54C \uC0AC\uC6A9\uD560 \uD55C\uC815\uC790\uC785\uB2C8\uB2E4(\uC608\uB97C \uB4E4\uC5B4 \uD0D0\uC0C9\uAE30\uC5D0\uC11C \uD3B8\uC9D1\uAE30\uC640 SCM \uBCF4\uAE30\uB97C \uC5EC\uB294 \uACBD\uC6B0). '\uC606\uC5D0\uC11C \uC5F4\uAE30' \uB9C8\uC6B0\uC2A4 \uC81C\uC2A4\uCC98(\uC9C0\uC6D0\uB418\uB294 \uACBD\uC6B0)\uB294 \uB2E4\uC911 \uC120\uD0DD \uD55C\uC815\uC790\uC640 \uCDA9\uB3CC\uD558\uC9C0 \uC54A\uB3C4\uB85D \uC870\uC815\uB429\uB2C8\uB2E4.","\uD2B8\uB9AC\uC640 \uBAA9\uB85D\uC5D0\uC11C \uB9C8\uC6B0\uC2A4\uB97C \uC0AC\uC6A9\uD558\uC5EC \uD56D\uBAA9\uC744 \uC5EC\uB294 \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4(\uC9C0\uC6D0\uB418\uB294 \uACBD\uC6B0). \uC77C\uBD80 \uD2B8\uB9AC\uC640 \uBAA9\uB85D\uC5D0\uC11C\uB294 \uC774 \uC124\uC815\uC744 \uC801\uC6A9\uD560 \uC218 \uC5C6\uB294 \uACBD\uC6B0 \uBB34\uC2DC\uD558\uB3C4\uB85D \uC120\uD0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58\uC5D0\uC11C \uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC758 \uAC00\uB85C \uC2A4\uD06C\uB864 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uACBD\uACE0: \uC774 \uC124\uC815\uC744 \uCF1C\uBA74 \uC131\uB2A5\uC5D0 \uC601\uD5A5\uC744 \uBBF8\uCE69\uB2C8\uB2E4.","\uD2B8\uB9AC \uB4E4\uC5EC\uC4F0\uAE30\uB97C \uD53D\uC140 \uB2E8\uC704\uB85C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uD2B8\uB9AC\uC5D0\uC11C \uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uB97C \uB80C\uB354\uB9C1\uD560\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uBAA9\uB85D\uACFC \uD2B8\uB9AC\uC5D0 \uBD80\uB4DC\uB7EC\uC6B4 \uD654\uBA74 \uC774\uB3D9 \uAE30\uB2A5\uC774 \uC788\uB294\uC9C0\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4.","\uAC04\uB2E8\uD55C \uD0A4\uBCF4\uB4DC \uD0D0\uC0C9\uC5D0\uC11C\uB294 \uD0A4\uBCF4\uB4DC \uC785\uB825\uACFC \uC77C\uCE58\uD558\uB294 \uC694\uC18C\uC5D0 \uC9D1\uC911\uD569\uB2C8\uB2E4. \uC77C\uCE58\uB294 \uC811\uB450\uC0AC\uC5D0\uC11C\uB9CC \uC218\uD589\uB429\uB2C8\uB2E4.","\uD0A4\uBCF4\uB4DC \uD0D0\uC0C9 \uAC15\uC870 \uD45C\uC2DC\uC5D0\uC11C\uB294 \uD0A4\uBCF4\uB4DC \uC785\uB825\uACFC \uC77C\uCE58\uD558\uB294 \uC694\uC18C\uB97C \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4. \uC774\uD6C4\uB85C \uD0D0\uC0C9\uC5D0\uC11C \uC704 \uBC0F \uC544\uB798\uB85C \uC774\uB3D9\uD558\uB294 \uACBD\uC6B0 \uAC15\uC870 \uD45C\uC2DC\uB41C \uC694\uC18C\uB9CC \uD2B8\uB798\uBC84\uC2A4\uD569\uB2C8\uB2E4.","\uD0A4\uBCF4\uB4DC \uD0D0\uC0C9 \uD544\uD130\uB9C1\uC5D0\uC11C\uB294 \uD0A4\uBCF4\uB4DC \uC785\uB825\uACFC \uC77C\uCE58\uD558\uC9C0 \uC54A\uB294 \uC694\uC18C\uB97C \uBAA8\uB450 \uD544\uD130\uB9C1\uD558\uC5EC \uC228\uAE41\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58\uC758 \uBAA9\uB85D \uBC0F \uD2B8\uB9AC \uD0A4\uBCF4\uB4DC \uD0D0\uC0C9 \uC2A4\uD0C0\uC77C\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uAC04\uC18C\uD654\uD558\uACE0, \uAC15\uC870 \uD45C\uC2DC\uD558\uACE0, \uD544\uD130\uB9C1\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uD0A4\uBCF4\uB4DC \uD0D0\uC0C9\uC774 \uC785\uB825\uB9CC\uC73C\uB85C \uC790\uB3D9 \uD2B8\uB9AC\uAC70\uB418\uB294\uC9C0 \uC5EC\uBD80\uB97C \uC81C\uC5B4\uD569\uB2C8\uB2E4. 'false'\uB85C \uC124\uC815\uD558\uBA74 'list.toggleKeyboardNavigation' \uBA85\uB839\uC744 \uC2E4\uD589\uD560 \uB54C\uB9CC \uD0A4\uBCF4\uB4DC \uD0D0\uC0C9\uC774 \uD2B8\uB9AC\uAC70\uB418\uC5B4 \uBC14\uB85C \uAC00\uAE30 \uD0A4\uB97C \uD560\uB2F9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.","\uD3F4\uB354 \uC774\uB984\uC744 \uD074\uB9AD\uD560 \uB54C \uD2B8\uB9AC \uD3F4\uB354\uAC00 \uD655\uC7A5\uB418\uB294 \uBC29\uBC95\uC744 \uC81C\uC5B4\uD569\uB2C8\uB2E4. \uC77C\uBD80 \uD2B8\uB9AC\uC640 \uBAA9\uB85D\uC5D0\uC11C\uB294 \uC774 \uC124\uC815\uC744 \uC801\uC6A9\uD560 \uC218 \uC5C6\uB294 \uACBD\uC6B0 \uBB34\uC2DC\uD558\uB3C4\uB85D \uC120\uD0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4."],"vs/platform/markers/common/markers":["\uC624\uB958","\uACBD\uACE0","\uC815\uBCF4"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","\uCD5C\uADFC\uC5D0 \uC0AC\uC6A9\uD55C \uD56D\uBAA9","\uAE30\uD0C0 \uBA85\uB839","\uBA85\uB839 '{0}'\uC5D0\uC11C \uC624\uB958({1})\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4."],"vs/platform/quickinput/browser/helpQuickAccess":["\uC804\uC5ED \uBA85\uB839","\uD3B8\uC9D1\uAE30 \uBA85\uB839","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["\uC804\uCCB4 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uAD6C\uC131 \uC694\uC18C\uC5D0\uC11C \uC7AC\uC815\uC758\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uC624\uB958 \uBA54\uC2DC\uC9C0\uC5D0 \uB300\uD55C \uC804\uCCB4 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uAD6C\uC131 \uC694\uC18C\uC5D0\uC11C \uC7AC\uC815\uC758\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uC6CC\uD06C\uBCA4\uCE58 \uC544\uC774\uCF58\uC758 \uAE30\uBCF8 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uC694\uC18C\uC758 \uC804\uCCB4 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uAD6C\uC131 \uC694\uC18C\uC5D0\uC11C \uC7AC\uC815\uC758\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uB354 \uB69C\uB837\uC774 \uB300\uBE44\uB418\uB3C4\uB85D \uC694\uC18C\uB97C \uB2E4\uB978 \uC694\uC18C\uC640 \uAD6C\uBD84\uD558\uB294 \uC694\uC18C \uC8FC\uC704\uC758 \uCD94\uAC00 \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4.","\uB354 \uB69C\uB837\uC774 \uB300\uBE44\uB418\uB3C4\uB85D \uC694\uC18C\uB97C \uB2E4\uB978 \uC694\uC18C\uC640 \uAD6C\uBD84\uD558\uB294 \uD65C\uC131 \uC694\uC18C \uC8FC\uC704\uC758 \uCD94\uAC00 \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uB0B4 \uB9C1\uD06C\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD14D\uC2A4\uD2B8 \uB0B4 \uCF54\uB4DC \uBE14\uB85D\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4\uC5D0\uC11C \uCC3E\uAE30/\uBC14\uAFB8\uAE30 \uAC19\uC740 \uC704\uC82F\uC758 \uADF8\uB9BC\uC790 \uC0C9\uC785\uB2C8\uB2E4.","\uC785\uB825 \uC0C1\uC790 \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uC785\uB825 \uC0C1\uC790 \uC804\uACBD\uC785\uB2C8\uB2E4.","\uC785\uB825 \uC0C1\uC790 \uD14C\uB450\uB9AC\uC785\uB2C8\uB2E4.","\uC785\uB825 \uD544\uB4DC\uC5D0\uC11C \uD65C\uC131\uD654\uB41C \uC635\uC158\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uC785\uB825 \uD544\uB4DC\uC5D0\uC11C \uD65C\uC131\uD654\uB41C \uC635\uC158\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC785\uB825 \uD544\uB4DC\uC5D0\uC11C \uD65C\uC131\uD654\uB41C \uC635\uC158\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC815\uBCF4 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uACBD\uACE0 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uC624\uB958 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC624\uB958 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC624\uB958 \uC2EC\uAC01\uB3C4\uC758 \uC785\uB825 \uC720\uD6A8\uC131 \uAC80\uC0AC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uB4DC\uB86D\uB2E4\uC6B4 \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uB4DC\uB86D\uB2E4\uC6B4 \uC804\uACBD\uC785\uB2C8\uB2E4.","\uB2E8\uCD94 \uAE30\uBCF8 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB2E8\uCD94 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0AC \uB54C \uB2E8\uCD94 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBC30\uC9C0 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBC30\uC9C0\uB294 \uAC80\uC0C9 \uACB0\uACFC \uC218\uC640 \uAC19\uC740 \uC18C\uB7C9\uC758 \uC815\uBCF4 \uB808\uC774\uBE14\uC785\uB2C8\uB2E4.","\uBC30\uC9C0 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBC30\uC9C0\uB294 \uAC80\uC0C9 \uACB0\uACFC \uC218\uC640 \uAC19\uC740 \uC18C\uB7C9\uC758 \uC815\uBCF4 \uB808\uC774\uBE14\uC785\uB2C8\uB2E4.","\uC2A4\uD06C\uB864\uB418\uB294 \uBCF4\uAE30\uB97C \uB098\uD0C0\uB0B4\uB294 \uC2A4\uD06C\uB864 \uB9C9\uB300 \uADF8\uB9BC\uC790\uC785\uB2C8\uB2E4.","\uC2A4\uD06C\uB864 \uB9C9\uB300 \uC2AC\uB77C\uC774\uBC84 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0AC \uB54C \uC2A4\uD06C\uB864 \uB9C9\uB300 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD074\uB9AD\uB41C \uC0C1\uD0DC\uC77C \uB54C \uC2A4\uD06C\uB864 \uB9C9\uB300 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC7A5\uAE30 \uC791\uC5C5\uC744 \uB300\uC0C1\uC73C\uB85C \uD45C\uC2DC\uB420 \uC218 \uC788\uB294 \uC9C4\uD589\uB960 \uD45C\uC2DC\uC904\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC624\uB958 \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4 \uC624\uB958 \uD45C\uC2DC\uC120\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC624\uB958 \uC0C1\uC790\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACBD\uACE0 \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4 \uACBD\uACE0 \uD45C\uC2DC\uC120\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uACBD\uACE0 \uC0C1\uC790\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC815\uBCF4 \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uB0B4 \uC815\uBCF4 \uD45C\uC2DC\uC120\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uC815\uBCF4 \uC0C1\uC790\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD78C\uD2B8 \uD45C\uC2DC\uC120\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30\uC5D0\uC11C \uD78C\uD2B8 \uC0C1\uC790\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uAE30\uBCF8 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCC3E\uAE30/\uBC14\uAFB8\uAE30 \uAC19\uC740 \uD3B8\uC9D1\uAE30 \uC704\uC82F\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCC3E\uAE30/\uBC14\uAFB8\uAE30\uC640 \uAC19\uC740 \uD3B8\uC9D1\uAE30 \uC704\uC82F\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC704\uC82F\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uC704\uC82F\uC5D0 \uD14C\uB450\uB9AC\uAC00 \uC788\uACE0 \uC704\uC82F\uC774 \uC0C9\uC0C1\uC744 \uBB34\uC2DC\uD558\uC9C0 \uC54A\uC744 \uB54C\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC704\uC82F \uD06C\uAE30 \uC870\uC815 \uB9C9\uB300\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uC774 \uC0C9\uC740 \uC704\uC82F\uC5D0\uC11C \uD06C\uAE30 \uC870\uC815 \uB9C9\uB300\uB97C \uD45C\uC2DC\uD558\uB3C4\uB85D \uC120\uD0DD\uD558\uACE0 \uC704\uC82F\uC5D0\uC11C \uC0C9\uC744 \uC7AC\uC9C0\uC815\uD558\uC9C0 \uC54A\uB294 \uACBD\uC6B0\uC5D0\uB9CC \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uBE60\uB978 \uC120\uD0DD\uAE30 \uBC30\uACBD\uC0C9. \uBE60\uB978 \uC120\uD0DD\uAE30 \uC704\uC82F\uC740 \uBA85\uB839 \uD314\uB808\uD2B8\uC640 \uAC19\uC740 \uC120\uD0DD\uAE30\uB97C \uC704\uD55C \uCEE8\uD14C\uC774\uB108\uC785\uB2C8\uB2E4.","\uBE60\uB978 \uC120\uD0DD\uAE30 \uC804\uACBD\uC0C9. \uC774 \uBE60\uB978 \uC120\uD0DD\uAE30 \uC704\uC82F\uC740 \uBA85\uB839 \uD314\uB808\uD2B8\uC640 \uAC19\uC740 \uC120\uD0DD\uAE30\uB97C \uC704\uD55C \uCEE8\uD14C\uC774\uB108\uC785\uB2C8\uB2E4.","\uBE60\uB978 \uC120\uD0DD\uAE30 \uC81C\uBAA9 \uBC30\uACBD\uC0C9. \uC774 \uBE60\uB978 \uC120\uD0DD\uAE30 \uC704\uC82F\uC740 \uBA85\uB839 \uD314\uB808\uD2B8\uC640 \uAC19\uC740 \uC120\uD0DD\uAE30\uB97C \uC704\uD55C \uCEE8\uD14C\uC774\uB108\uC785\uB2C8\uB2E4.","\uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBE60\uB978 \uC120\uD0DD\uAE30 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uADF8\uB8F9\uD654 \uB808\uC774\uBE14\uC5D0 \uB300\uD55C \uBE60\uB978 \uC120\uD0DD\uAE30 \uC0C9\uC785\uB2C8\uB2E4.","\uADF8\uB8F9\uD654 \uD14C\uB450\uB9AC\uC5D0 \uB300\uD55C \uBE60\uB978 \uC120\uD0DD\uAE30 \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC120\uD0DD \uC601\uC5ED\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uACE0\uB300\uBE44\uB97C \uC704\uD55C \uC120\uD0DD \uD14D\uC2A4\uD2B8\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uBE44\uD65C\uC131 \uD3B8\uC9D1\uAE30\uC758 \uC120\uD0DD \uD56D\uBAA9 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED\uACFC \uB3D9\uC77C\uD55C \uCF58\uD150\uCE20\uAC00 \uC788\uB294 \uC601\uC5ED\uC758 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC120\uD0DD \uC601\uC5ED\uACFC \uB3D9\uC77C\uD55C \uCF58\uD150\uCE20\uAC00 \uC788\uB294 \uC601\uC5ED\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD604\uC7AC \uAC80\uC0C9 \uC77C\uCE58 \uD56D\uBAA9\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uAE30\uD0C0 \uAC80\uC0C9 \uC77C\uCE58 \uD56D\uBAA9\uC758 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uAC80\uC0C9\uC744 \uC81C\uD55C\uD558\uB294 \uBC94\uC704\uC758 \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD604\uC7AC \uAC80\uC0C9\uACFC \uC77C\uCE58\uD558\uB294 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uB2E4\uB978 \uAC80\uC0C9\uACFC \uC77C\uCE58\uD558\uB294 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uAC80\uC0C9\uC744 \uC81C\uD55C\uD558\uB294 \uBC94\uC704\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD638\uBC84\uAC00 \uD45C\uC2DC\uB41C \uB2E8\uC5B4 \uC544\uB798\uB97C \uAC15\uC870 \uD45C\uC2DC\uD569\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD638\uBC84\uC758 \uBC30\uACBD\uC0C9.","\uD3B8\uC9D1\uAE30 \uD638\uBC84\uC758 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD638\uBC84\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uD638\uBC84 \uC0C1\uD0DC \uD45C\uC2DC\uC904\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD65C\uC131 \uB9C1\uD06C\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uC804\uACBD\uC0C9","\uC778\uB77C\uC778 \uD78C\uD2B8\uC758 \uBC30\uACBD\uC0C9","\uC804\uAD6C \uC791\uC5C5 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uC804\uAD6C \uC790\uB3D9 \uC218\uC815 \uC791\uC5C5 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uC0BD\uC785\uB41C \uD14D\uC2A4\uD2B8\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC81C\uAC70\uB41C \uD14D\uC2A4\uD2B8 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC0BD\uC785\uB41C \uD14D\uC2A4\uD2B8\uC758 \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uC81C\uAC70\uB41C \uD14D\uC2A4\uD2B8\uC758 \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uB450 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30 \uC0AC\uC774\uC758 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","diff \uD3B8\uC9D1\uAE30\uC758 \uB300\uAC01\uC120 \uCC44\uC6B0\uAE30 \uC0C9\uC785\uB2C8\uB2E4. \uB300\uAC01\uC120 \uCC44\uC6B0\uAE30\uB294 diff \uB098\uB780\uD788 \uBCF4\uAE30\uC5D0\uC11C \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uC120\uD0DD\uD55C \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC778 \uACBD\uC6B0 \uD3EC\uCEE4\uC2A4\uAC00 \uC788\uB294 \uD56D\uBAA9\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4. \uBAA9\uB85D/\uD2B8\uB9AC\uAC00 \uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uB97C \uAC00\uC9C0\uBA70, \uBE44\uD65C\uC131 \uC0C1\uD0DC\uC774\uBA74 \uD3EC\uCEE4\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uD56D\uBAA9\uC744 \uAC00\uB9AC\uD0AC \uB54C \uBAA9\uB85D/\uD2B8\uB9AC \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uD56D\uBAA9\uC744 \uAC00\uB9AC\uD0AC \uB54C \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uD56D\uBAA9\uC744 \uC774\uB3D9\uD560 \uB54C \uBAA9\uB85D/\uD2B8\uB9AC \uB04C\uC5B4\uC11C \uB193\uAE30 \uBC30\uACBD\uC785\uB2C8\uB2E4.","\uBAA9\uB85D/\uD2B8\uB9AC \uB0B4\uC5D0\uC11C \uAC80\uC0C9\uD560 \uB54C \uC77C\uCE58 \uD56D\uBAA9 \uAC15\uC870 \uD45C\uC2DC\uC758 \uBAA9\uB85D/\uD2B8\uB9AC \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uD615\uC2DD \uD544\uD130 \uC704\uC82F\uC758 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uD615\uC2DD \uD544\uD130 \uC704\uC82F\uC758 \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC774 \uC5C6\uC744 \uB54C \uBAA9\uB85D \uBC0F \uD2B8\uB9AC\uC5D0\uC11C \uD45C\uC2DC\uB418\uB294 \uD615\uC2DD \uD544\uD130 \uC704\uC82F\uC758 \uC724\uACFD\uC120 \uC0C9\uC785\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uC758 \uD2B8\uB9AC \uC2A4\uD2B8\uB85C\uD06C \uC0C9\uC785\uB2C8\uB2E4.","\uB4E4\uC5EC\uC4F0\uAE30 \uAC00\uC774\uB4DC\uC758 \uD2B8\uB9AC \uC2A4\uD2B8\uB85C\uD06C \uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274 \uD56D\uBAA9 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274 \uD56D\uBAA9 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274\uC758 \uC120\uD0DD\uB41C \uBA54\uB274 \uD56D\uBAA9 \uC804\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274\uC758 \uC120\uD0DD\uB41C \uBA54\uB274 \uD56D\uBAA9 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274\uC758 \uC120\uD0DD\uB41C \uBA54\uB274 \uD56D\uBAA9 \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uBA54\uB274\uC5D0\uC11C \uAD6C\uBD84 \uAE30\uD638 \uBA54\uB274 \uD56D\uBAA9\uC758 \uC0C9\uC785\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uD0ED \uC815\uC9C0\uC758 \uAC15\uC870 \uD45C\uC2DC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uD0ED \uC815\uC9C0\uC758 \uAC15\uC870 \uD45C\uC2DC \uD14C\uB450\uB9AC \uC0C9\uC785\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uB9C8\uC9C0\uB9C9 \uD0ED \uC815\uC9C0\uC758 \uAC15\uC870 \uD45C\uC2DC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uCF54\uB4DC \uC870\uAC01 \uB9C8\uC9C0\uB9C9 \uD0ED \uC815\uC9C0\uC758 \uAC15\uC870 \uD45C\uC2DC \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uC77C\uCE58 \uD56D\uBAA9 \uCC3E\uAE30\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC785\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC120\uD0DD \uD56D\uBAA9\uC758 \uAC1C\uC694 \uB208\uAE08\uC790 \uD45C\uC2DD \uC0C9\uC774 \uAC15\uC870 \uD45C\uC2DC\uB429\uB2C8\uB2E4. \uAE30\uBCF8 \uC7A5\uC2DD\uC744 \uC228\uAE30\uC9C0 \uC54A\uB3C4\uB85D \uC0C9\uC740 \uBD88\uD22C\uBA85\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4.","\uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC744 \uCC3E\uAE30 \uC704\uD55C \uBBF8\uB2C8\uB9F5 \uD45C\uC2DD \uC0C9\uC785\uB2C8\uB2E4.","\uD3B8\uC9D1\uAE30 \uC120\uD0DD \uC791\uC5C5\uC744 \uC704\uD55C \uBBF8\uB2C8\uB9F5 \uB9C8\uCEE4 \uC0C9\uC785\uB2C8\uB2E4.","\uC624\uB958\uC5D0 \uB300\uD55C \uBBF8\uB2C8\uB9F5 \uB9C8\uCEE4 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uACBD\uACE0\uC758 \uBBF8\uB2C8\uB9F5 \uB9C8\uCEE4 \uC0C9\uC0C1\uC785\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBBF8\uB2C8\uB9F5 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uB9C8\uC6B0\uC2A4\uB85C \uAC00\uB9AC\uD0AC \uB54C \uBBF8\uB2C8\uB9F5 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uD074\uB9AD\uD588\uC744 \uB54C \uBBF8\uB2C8\uB9F5 \uC2AC\uB77C\uC774\uB354 \uBC30\uACBD\uC0C9\uC785\uB2C8\uB2E4.","\uBB38\uC81C \uC624\uB958 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC785\uB2C8\uB2E4.","\uBB38\uC81C \uACBD\uACE0 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC785\uB2C8\uB2E4.","\uBB38\uC81C \uC815\uBCF4 \uC544\uC774\uCF58\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC0C9\uC785\uB2C8\uB2E4."],"vs/platform/theme/common/iconRegistry":["\uC0AC\uC6A9\uD560 \uAE00\uAF34\uC758 ID\uC785\uB2C8\uB2E4. \uC124\uC815\uD558\uC9C0 \uC54A\uC73C\uBA74 \uCCAB \uBC88\uC9F8\uB85C \uC815\uC758\uD55C \uAE00\uAF34\uC774 \uC0AC\uC6A9\uB429\uB2C8\uB2E4.","\uC544\uC774\uCF58 \uC815\uC758\uC640 \uC5F0\uACB0\uB41C \uAE00\uAF34 \uBB38\uC790\uC785\uB2C8\uB2E4.","\uC704\uC82F\uC5D0\uC11C \uB2EB\uAE30 \uC791\uC5C5\uC758 \uC544\uC774\uCF58\uC785\uB2C8\uB2E4."],"vs/platform/undoRedo/common/undoRedoService":["{0} \uD30C\uC77C\uC774 \uB2EB\uD788\uACE0 \uB514\uC2A4\uD06C\uC5D0\uC11C \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","{0} \uD30C\uC77C\uC740 \uD638\uD658\uB418\uC9C0 \uC54A\uB294 \uBC29\uC2DD\uC73C\uB85C \uC218\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. {1}","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. {1}","{1}\uC5D0 \uBCC0\uACBD \uB0B4\uC6A9\uC774 \uC801\uC6A9\uB418\uC5C8\uC73C\uBBC0\uB85C \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","{1}\uC5D0\uC11C \uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBBC0\uB85C \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uADF8\uB3D9\uC548 \uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uBC1C\uC0DD\uD588\uAE30 \uB54C\uBB38\uC5D0 \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?","{0}\uAC1C \uD30C\uC77C\uC5D0\uC11C \uC2E4\uD589 \uCDE8\uC18C","\uC774 \uD30C\uC77C \uC2E4\uD589 \uCDE8\uC18C","\uCDE8\uC18C","\uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBBC0\uB85C '{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","'{0}'\uC744(\uB97C) \uC2E4\uD589 \uCDE8\uC18C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?","\uC2E4\uD589 \uCDE8\uC18C","\uCDE8\uC18C","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. {1}","\uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. {1}","{1}\uC5D0 \uBCC0\uACBD \uB0B4\uC6A9\uC774 \uC801\uC6A9\uB418\uC5C8\uC73C\uBBC0\uB85C \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","{1}\uC5D0\uC11C \uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBBC0\uB85C \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uADF8\uB3D9\uC548 \uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uBC1C\uC0DD\uD588\uAE30 \uB54C\uBB38\uC5D0 \uBAA8\uB4E0 \uD30C\uC77C\uC5D0\uC11C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.","\uC2E4\uD589 \uCDE8\uC18C \uB610\uB294 \uB2E4\uC2DC \uC2E4\uD589 \uC791\uC5C5\uC774 \uC774\uBBF8 \uC2E4\uD589 \uC911\uC774\uBBC0\uB85C '{0}'\uC744(\uB97C) \uB2E4\uC2DC \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."]}); diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ko.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ko.js.gz new file mode 100644 index 0000000..220a92c Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ko.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ru.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ru.js new file mode 100644 index 0000000..205ebca --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ru.js @@ -0,0 +1,8 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.ru",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["\u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435"],"vs/base/browser/ui/findinput/findInputCheckboxes":["\u0421 \u0443\u0447\u0435\u0442\u043E\u043C \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430","\u0421\u043B\u043E\u0432\u043E \u0446\u0435\u043B\u0438\u043A\u043E\u043C","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435"],"vs/base/browser/ui/findinput/replaceInput":["\u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435","\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0440\u0435\u0433\u0438\u0441\u0442\u0440"],"vs/base/browser/ui/iconLabel/iconLabel":["\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430\u2026"],"vs/base/browser/ui/inputbox/inputBox":["\u041E\u0448\u0438\u0431\u043A\u0430: {0}","\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435: {0}","\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\u0441\u0432\u043E\u0431\u043E\u0434\u043D\u044B\u0439"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["\u0421\u0431\u0440\u043E\u0441","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440 \u043F\u043E \u0442\u0438\u043F\u0443","\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440 \u043F\u043E \u0442\u0438\u043F\u0443","\u042D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B","\u0421\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432: {0} \u0438\u0437 {1}"],"vs/base/common/actions":["(\u043F\u0443\u0441\u0442\u043E)"],"vs/base/common/errorMessage":["{0}: {1}","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 ({0})","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430. \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u044B\u0435 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0441\u043C. \u0432 \u0436\u0443\u0440\u043D\u0430\u043B\u0435.","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430. \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u044B\u0435 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0441\u043C. \u0432 \u0436\u0443\u0440\u043D\u0430\u043B\u0435.","{0} (\u0432\u0441\u0435\u0433\u043E \u043E\u0448\u0438\u0431\u043E\u043A: {1})","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430. \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u044B\u0435 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0441\u043C. \u0432 \u0436\u0443\u0440\u043D\u0430\u043B\u0435."],"vs/base/common/keybindingLabels":["CTRL","SHIFT","ALT","Windows","CTRL","SHIFT","ALT","\u041F\u0440\u0435\u0432\u043E\u0441\u0445\u043E\u0434\u043D\u043E","CTRL","SHIFT","ALT","\u041A\u043E\u043C\u0430\u043D\u0434\u0430","CTRL","SHIFT","ALT","Windows","CTRL","SHIFT","ALT","\u041F\u0440\u0435\u0432\u043E\u0441\u0445\u043E\u0434\u043D\u043E"],"vs/base/parts/quickinput/browser/quickInput":["\u041D\u0430\u0437\u0430\u0434","{0} / {1}","\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442, \u0447\u0442\u043E\u0431\u044B \u0443\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u0447\u0438\u0441\u043B\u043E \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432.","\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B: {0}","{0} \u0432\u044B\u0431\u0440\u0430\u043D\u043E","OK","\u0414\u0440\u0443\u0433\u043E\u0439","\u041D\u0430\u0437\u0430\u0434 ({0})","\u041D\u0430\u0437\u0430\u0434"],"vs/base/parts/quickinput/browser/quickInputList":["\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u0432\u0432\u043E\u0434"],"vs/editor/browser/controller/coreCommands":["\u0420\u0430\u0437\u043C\u0435\u0449\u0430\u0442\u044C \u043D\u0430 \u043A\u043E\u043D\u0446\u0435 \u0434\u0430\u0436\u0435 \u0434\u043B\u044F \u0431\u043E\u043B\u0435\u0435 \u0434\u043B\u0438\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A","\u0420\u0430\u0437\u043C\u0435\u0449\u0430\u0442\u044C \u043D\u0430 \u043A\u043E\u043D\u0446\u0435 \u0434\u0430\u0436\u0435 \u0434\u043B\u044F \u0431\u043E\u043B\u0435\u0435 \u0434\u043B\u0438\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A"],"vs/editor/browser/controller/textAreaHandler":["\u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440","\u0421\u0435\u0439\u0447\u0430\u0441 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D. \u041D\u0430\u0436\u043C\u0438\u0442\u0435 {0} \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432."],"vs/editor/browser/core/keybindingCancellation":['\u0412\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438, \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u044E\u0449\u0438\u0435 \u043E\u0442\u043C\u0435\u043D\u0443, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0438"'],"vs/editor/browser/editorExtensions":["&&\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C","&&\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C","\u0412\u0435\u0440\u043D\u0443\u0442\u044C","&&\u0412\u044B\u0434\u0435\u043B\u0438\u0442\u044C \u0432\u0441\u0435","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435"],"vs/editor/browser/widget/codeEditorWidget":["\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u043E {0}."],"vs/editor/browser/widget/diffEditorWidget":["\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u043B\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u041D\u0435\u043B\u044C\u0437\u044F \u0441\u0440\u0430\u0432\u043D\u0438\u0442\u044C \u0444\u0430\u0439\u043B\u044B, \u043F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u043E\u0434\u0438\u043D \u0438\u0437 \u0444\u0430\u0439\u043B\u043E\u0432 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0439."],"vs/editor/browser/widget/diffReview":['\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C" \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0423\u0434\u0430\u043B\u0438\u0442\u044C" \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0417\u0430\u043A\u0440\u044B\u0442\u044C" \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.',"\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u043D\u0435\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A","1 \u0441\u0442\u0440\u043E\u043A\u0430 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0430","\u0421\u0442\u0440\u043E\u043A \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043E: {0}","\u0420\u0430\u0437\u043B\u0438\u0447\u0438\u0435 {0} \u0438\u0437 {1}: \u0438\u0441\u0445\u043E\u0434\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {2}, {3}, \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {4}, {5}","\u043F\u0443\u0441\u0442\u043E\u0439","{0} \u043D\u0435\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {1}","{0} \u0438\u0441\u0445\u043E\u0434\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {1} \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {2}","+ {0} \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {1}","- {0} \u0438\u0441\u0445\u043E\u0434\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 {1}","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u044E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u044E"],"vs/editor/browser/widget/inlineDiffMargin":["\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 ({0})","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u044D\u0442\u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 ({0})"],"vs/editor/common/config/commonEditorConfig":["\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440",'\u0427\u0438\u0441\u043B\u043E \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u0432 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438. \u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430, \u0435\u0441\u043B\u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "#editor.detectIndentation#".','\u0412\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u043F\u0440\u043E\u0431\u0435\u043B\u044B \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB. \u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430, \u0435\u0441\u043B\u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "#editor.detectIndentation#". ','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0431\u0443\u0434\u0443\u0442 \u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B "#editor.tabSize#" \u0438 "#editor.insertSpaces#" \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0442\u044C\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438 \u0444\u0430\u0439\u043B\u0430 \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430.',"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u043C\u044B\u0439 \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0439 \u043F\u0440\u043E\u0431\u0435\u043B.","\u0421\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u0430\u044F \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0430 \u0434\u043B\u044F \u0431\u043E\u043B\u044C\u0448\u0438\u0445 \u0444\u0430\u0439\u043B\u043E\u0432 \u0441 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435\u043C \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0444\u0443\u043D\u043A\u0446\u0438\u0439, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0438\u043D\u0442\u0435\u043D\u0441\u0438\u0432\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442 \u043F\u0430\u043C\u044F\u0442\u044C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u043E\u0446\u0435\u043D\u0438\u0432\u0430\u0442\u044C \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043B\u043E\u0432 \u0432 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0435.","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u043E\u0432 \u0442\u043E\u043B\u044C\u043A\u043E \u0438\u0437 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430.","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u043E\u0432 \u0438\u0437 \u0432\u0441\u0435\u0445 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u043D\u0430 \u043E\u0434\u043D\u043E\u043C \u044F\u0437\u044B\u043A\u0435.","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0441\u043B\u043E\u0432 \u0438\u0437 \u0432\u0441\u0435\u0445 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0438\u0437 \u043A\u0430\u043A\u0438\u0445 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432 \u0431\u0443\u0434\u0443\u0442 \u0432\u044B\u0447\u0438\u0441\u043B\u044F\u0442\u044C\u0441\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u0441\u043B\u043E\u0432.","\u0421\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0446\u0432\u0435\u0442\u043E\u0432\u044B\u0445 \u0442\u0435\u043C.","\u0421\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0446\u0432\u0435\u0442\u043E\u0432\u044B\u0445 \u0442\u0435\u043C.",'\u0421\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 "semanticHighlighting" \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0446\u0432\u0435\u0442\u043E\u0432\u043E\u0439 \u0442\u0435\u043C\u044B.',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043F\u043E\u043A\u0430\u0437 \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0439 \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0438 \u0434\u043B\u044F \u044F\u0437\u044B\u043A\u043E\u0432, \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0449\u0438\u0445 \u0435\u0435.","\u041E\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u0434\u0430\u0436\u0435 \u043F\u0440\u0438 \u0434\u0432\u043E\u0439\u043D\u043E\u043C \u0449\u0435\u043B\u0447\u043A\u0435 \u043F\u043E \u0435\u0433\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u043C\u0443 \u0438 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 ESC.","\u0421\u0442\u0440\u043E\u043A\u0438, \u0434\u043B\u0438\u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u043F\u0440\u0435\u0432\u044B\u0448\u0430\u0435\u0442 \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435, \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043C\u0435\u0447\u0435\u043D\u044B \u0438\u0437 \u0441\u043E\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438","\u0412\u0440\u0435\u043C\u044F \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u0432 \u043C\u0438\u043B\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445, \u043F\u043E \u0438\u0441\u0442\u0435\u0447\u0435\u043D\u0438\u0438 \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u0435 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043E\u0442\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F. \u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 0, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u0440\u0435\u043C\u044F \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u0430\u043A \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043E\u0442\u043B\u0438\u0447\u0438\u044F: \u0440\u044F\u0434\u043E\u043C \u0438\u043B\u0438 \u0432 \u0442\u0435\u043A\u0441\u0442\u0435.","\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0438\u043B\u0438 \u043A\u043E\u043D\u0435\u0447\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0431\u0435\u043B\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0438\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440\u044B +/- \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0445 \u0438\u043B\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0445 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 CodeLens \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0421\u0442\u0440\u043E\u043A\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043D\u0438\u043A\u043E\u0433\u0434\u0430.","\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043F\u043E \u0448\u0438\u0440\u0438\u043D\u0435 \u043E\u043A\u043D\u0430 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430.",'\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u0432 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u043C "#editor.wordWrap#".'],"vs/editor/common/config/editorOptions":["\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0442\u044C, \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u043B\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430, \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E API-\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432 \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u044B.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u043E \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430 \u0432 \u043F\u043E\u0441\u0442\u043E\u044F\u043D\u043D\u043E\u043C \u0440\u0435\u0436\u0438\u043C\u0435. \u041F\u0435\u0440\u0435\u043D\u043E\u0441 \u0442\u0435\u043A\u0441\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0431\u0443\u0434\u0435\u0442 \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u043E \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043B\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430. \u0415\u0441\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u043F\u0435\u0440\u0435\u043D\u043E\u0441 \u0441\u0442\u0440\u043E\u043A \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B \u043F\u0440\u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u043F\u0443\u0441\u0442\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F, \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0438\u043B\u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432 \u043A \u0441\u0442\u0440\u043E\u043A\u0430\u043C.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043A\u043E\u043F\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u0442\u0435\u043A\u0443\u0449\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u043F\u0440\u0438 \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0438 \u0431\u0435\u0437 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043C\u043E\u0436\u043D\u043E \u043B\u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0438\u0437 \u0442\u0435\u043A\u0441\u0442\u0430, \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.",'\u041D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u0444\u0443\u043D\u043A\u0446\u0438\u044E "\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438" \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E)','\u0412\u0441\u0435\u0433\u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0430\u0442\u044C \u0444\u0443\u043D\u043A\u0446\u0438\u044E "\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438" \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438','\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0438 "\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438" \u043F\u0440\u0438 \u0432\u044B\u0431\u043E\u0440\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0441\u0442\u0440\u043E\u043A \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E.',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0443\u0441\u043B\u043E\u0432\u0438\u0435\u043C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u043E \u043B\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0441\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u0438\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u044F\u0442\u044C \u043E\u0431\u0449\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 macOS.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u043E \u043B\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0442\u044C \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u043D\u0430\u0447\u0430\u043B\u0435 \u043E\u043A\u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 true, \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u044C \u043F\u0435\u0440\u0432\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u0440\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u043E\u043C \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u043F\u043E\u0438\u0441\u043A \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0442\u044C\u0441\u044F \u0441 \u043D\u0430\u0447\u0430\u043B\u0430 (\u0438\u043B\u0438 \u0441 \u043A\u043E\u043D\u0446\u0430), \u0435\u0441\u043B\u0438 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043D\u0438\u043A\u0430\u043A\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439.",'\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u043B\u0438\u0433\u0430\u0442\u0443\u0440\u044B \u0448\u0440\u0438\u0444\u0442\u043E\u0432 (\u0445\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043A\u0438 \u0448\u0440\u0438\u0444\u0442\u0430 "calt" \u0438 "liga"). \u0418\u0437\u043C\u0435\u043D\u0438\u0442\u0435 \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 \u0434\u043B\u044F \u0434\u0435\u0442\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E\u043C CSS "font-feature-settings".','\u042F\u0432\u043D\u043E\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E CSS "font-feature-settings". \u0415\u0441\u043B\u0438 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043B\u0438\u0433\u0430\u0442\u0443\u0440\u044B, \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0435\u0433\u043E \u043C\u043E\u0436\u043D\u043E \u043F\u0435\u0440\u0435\u0434\u0430\u0442\u044C \u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435.','\u041D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043B\u0438\u0433\u0430\u0442\u0443\u0440\u044B \u0438\u043B\u0438 \u0445\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043A\u0438 \u0448\u0440\u0438\u0444\u0442\u0430. \u041C\u043E\u0436\u043D\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435, \u0447\u0442\u043E\u0431\u044B \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043B\u0438\u0433\u0430\u0442\u0443\u0440\u044B, \u0438\u043B\u0438 \u0441\u0442\u0440\u043E\u043A\u0443 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 CSS "font-feature-settings".',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445.",'\u0414\u043E\u043F\u0443\u0441\u043A\u0430\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u0441\u043B\u043E\u0432\u0430 "normal" \u0438\u043B\u0438 "bold" \u0438 \u0447\u0438\u0441\u043B\u0430 \u0432 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0435 \u043E\u0442 1 \u0434\u043E 1000.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043D\u0430\u0441\u044B\u0449\u0435\u043D\u043D\u043E\u0441\u0442\u044C\u044E \u0448\u0440\u0438\u0444\u0442\u0430. \u0414\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F: \u043A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u0441\u043B\u043E\u0432\u0430 "normal" \u0438\u043B\u0438 "bold", \u0430 \u0442\u0430\u043A\u0436\u0435 \u0447\u0438\u0441\u043B\u0430 \u0432 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0435 \u043E\u0442 1 \u0434\u043E 1000.',"\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E)","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u043C\u0443 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0443 \u0438 \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440","\u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043A \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u043C\u0443 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0443 \u0438 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0431\u044B\u0441\u0442\u0440\u0443\u044E \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044E \u0434\u043B\u044F \u043E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u0445","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0443\u0441\u0442\u0430\u0440\u0435\u043B. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0435\u0433\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, 'editor.editor.gotoLocation.multipleDefinitions' \u0438\u043B\u0438 'editor.editor.gotoLocation.multipleImplementations'.",'\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0442\u0438\u043F\u0430" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044E" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u043C" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0441\u044B\u043B\u043A\u0430\u043C" \u043F\u0440\u0438 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0446\u0435\u043B\u0435\u0432\u044B\u0445 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0439.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u043E\u0439 \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u043A\u043E\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0442\u0438\u043F\u0430" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u043E\u0439 \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u043A\u043E\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044E" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u043E\u0439, \u043A\u043E\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u043A\u043E\u043C\u0430\u043D\u0434\u044B "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.','\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0439 \u043A\u043E\u043C\u0430\u043D\u0434\u044B, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u043E\u0439 \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u043A\u043E\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u043C \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0441\u044B\u043B\u043A\u0435" \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0435 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435.',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0432\u0440\u0435\u043C\u044F \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0438 \u0432 \u043C\u0438\u043B\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445 \u043F\u0435\u0440\u0435\u0434 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044F.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0434\u043E\u043B\u0436\u043D\u043E \u043B\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u043E\u0441\u0442\u0430\u0432\u0430\u0442\u044C\u0441\u044F \u0432\u0438\u0434\u0438\u043C\u044B\u043C \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043D\u0430 \u043D\u0435\u0433\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438.","\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0438\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "0", \u0442\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F 90\xA0% \u043E\u0442 "#editor.fontSize#".',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0435\u043C\u0435\u0439\u0441\u0442\u0432\u043E\u043C \u0448\u0440\u0438\u0444\u0442\u043E\u0432 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u044B\u0441\u043E\u0442\u043E\u0439 \u0441\u0442\u0440\u043E\u043A. \u0423\u043A\u0430\u0436\u0438\u0442\u0435 0 \u0434\u043B\u044F \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F \u0432\u044B\u0441\u043E\u0442\u044B \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E \u0440\u0430\u0437\u043C\u0435\u0440\u0443 \u0448\u0440\u0438\u0444\u0442\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430.","\u041C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430 \u0438\u043C\u0435\u0435\u0442 \u0442\u0430\u043A\u043E\u0439 \u0436\u0435 \u0440\u0430\u0437\u043C\u0435\u0440, \u0447\u0442\u043E \u0438 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430).","\u041C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0442\u044F\u0433\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u0438\u043B\u0438 \u0441\u0436\u0438\u043C\u0430\u0442\u044C\u0441\u044F \u043F\u043E \u043C\u0435\u0440\u0435 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438, \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043F\u043E \u0432\u044B\u0441\u043E\u0442\u0435 (\u0431\u0435\u0437 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438).","\u041C\u0438\u043D\u0438\u043A\u0430\u0440\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u043C\u0435\u043D\u044C\u0448\u0430\u0442\u044C\u0441\u044F \u043F\u043E \u043C\u0435\u0440\u0435 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438, \u0447\u0442\u043E\u0431\u044B \u043D\u0438\u043A\u043E\u0433\u0434\u0430 \u043D\u0435 \u0431\u044B\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435, \u0447\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 (\u0431\u0435\u0437 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438).","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440\u043E\u043C \u043C\u0438\u043D\u0438\u043A\u0430\u0440\u0442\u044B.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441 \u043A\u0430\u043A\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043F\u043E\u043B\u0437\u0443\u043D\u043E\u043A \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B.","\u041C\u0430\u0441\u0448\u0442\u0430\u0431 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E, \u043D\u0430\u0440\u0438\u0441\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u043D\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0435: 1, 2 \u0438\u043B\u0438 3.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0444\u0430\u043A\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u0446\u0432\u0435\u0442\u043D\u044B\u0445 \u0431\u043B\u043E\u043A\u043E\u0432.","\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0448\u0438\u0440\u0438\u043D\u0443 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B, \u0447\u0442\u043E\u0431\u044B \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u044B\u0445 \u0441\u0442\u043E\u043B\u0431\u0446\u043E\u0432 \u043D\u0435 \u043F\u0440\u0435\u0432\u044B\u0448\u0430\u043B\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E.","\u0417\u0430\u0434\u0430\u0435\u0442 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u043C\u0435\u0436\u0434\u0443 \u0432\u0435\u0440\u0445\u043D\u0438\u043C \u043A\u0440\u0430\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0438 \u043F\u0435\u0440\u0432\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439.","\u0417\u0430\u0434\u0430\u0435\u0442 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u043C\u0435\u0436\u0434\u0443 \u043D\u0438\u0436\u043D\u0438\u043C \u043A\u0440\u0430\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0438 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439.","\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0432\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0449\u0435\u0435 \u043E\u043A\u043D\u043E \u0441 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0435\u0439 \u043F\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0443 \u0438 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F\u043C\u0438 \u043E \u0442\u0438\u043F\u0435, \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043D\u0430\u0431\u043E\u0440\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043C\u0435\u043D\u044E \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A \u043E\u0441\u0442\u0430\u0435\u0442\u0441\u044F \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u0438\u043B\u0438 \u0437\u0430\u043A\u0440\u043E\u0435\u0442\u0441\u044F \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0438\u0436\u0435\u043D\u0438\u0438 \u043A\u043E\u043D\u0446\u0430 \u0441\u043F\u0438\u0441\u043A\u0430.","\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u043A\u0440\u0430\u0442\u043A\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0432 \u0441\u0442\u0440\u043E\u043A\u0430\u0445.","\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u043A\u0440\u0430\u0442\u043A\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0432 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u044F\u0445.","\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u043A\u0440\u0430\u0442\u043A\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0432\u043D\u0435 \u0441\u0442\u0440\u043E\u043A \u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F.","\u041D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A \u043D\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u044B\u0435 \u043D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u043C\u044B\u0435 \u043D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A \u0432\u044B\u0447\u0438\u0441\u043B\u044F\u044E\u0442\u0441\u044F \u043A\u0430\u043A \u0440\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0432 \u0441\u0442\u0440\u043E\u043A\u0430\u0445 \u0434\u043E \u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u041D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043A\u0430\u0436\u0434\u044B\u0435 10 \u0441\u0442\u0440\u043E\u043A.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u043D\u043E\u043C\u0435\u0440\u043E\u0432 \u0441\u0442\u0440\u043E\u043A.","\u0427\u0438\u0441\u043B\u043E \u043C\u043E\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432, \u043F\u0440\u0438 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u0431\u0443\u0434\u0435\u0442 \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u044B\u0432\u0430\u0442\u044C\u0441\u044F \u043B\u0438\u043D\u0435\u0439\u043A\u0430 \u044D\u0442\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u044D\u0442\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u043F\u043E\u0441\u043B\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0447\u0438\u0441\u043B\u0430 \u043C\u043E\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432. \u0414\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u043B\u0438\u043D\u0435\u0435\u043A \u0443\u043A\u0430\u0436\u0438\u0442\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439. \u0415\u0441\u043B\u0438 \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u043E \u043D\u0438 \u043E\u0434\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F, \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0435 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043D\u0435 \u0431\u0443\u0434\u0443\u0442.","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u0435\u0437 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u0438 \u0442\u0435\u043A\u0441\u0442\u0430 \u0441\u043F\u0440\u0430\u0432\u0430 \u043E\u0442 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0438 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u0441\u043F\u0440\u0430\u0432\u0430 \u043E\u0442 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0443\u0442 \u043B\u0438 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u044B\u0432\u0430\u0442\u044C\u0441\u044F \u0441\u043B\u043E\u0432\u0430 \u043F\u0440\u0438 \u043F\u0440\u0438\u043D\u044F\u0442\u0438\u0438 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435, \u0447\u0442\u043E \u044D\u0442\u043E \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043E\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0439, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0449\u0438\u0445 \u044D\u0442\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u044E.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u044E\u0442\u0441\u044F \u043B\u0438 \u043D\u0435\u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u043E\u043F\u0435\u0447\u0430\u0442\u043A\u0438 \u0432 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u0445 \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u043F\u0440\u0438 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0435 \u0441\u043B\u043E\u0432\u0430, \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u0440\u044F\u0434\u043E\u043C \u0441 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u043B\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043D\u044B\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B \u0432\u044B\u0431\u043E\u0440\u0430 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u043D\u043E \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u043C\u0438 \u0440\u0430\u0431\u043E\u0447\u0438\u043C\u0438 \u043E\u0431\u043B\u0430\u0441\u0442\u044F\u043C\u0438 \u0438 \u043E\u043A\u043D\u0430\u043C\u0438 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F "#editor.suggestSelection#").',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0437\u0430\u043F\u0440\u0435\u0449\u0430\u0435\u0442 \u043B\u0438 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442 \u043A\u043E\u0434\u0430 \u044D\u043A\u0441\u043F\u0440\u0435\u0441\u0441-\u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F.","\u0423\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442, \u043D\u0443\u0436\u043D\u043E \u043B\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0437\u043D\u0430\u0447\u043A\u0438 \u0432 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u0445.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0432\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0438 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u0432 \u043D\u0438\u0436\u043D\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043B\u0438 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u043C\u0435\u0442\u043A\u043E\u0439 \u0438\u043B\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439.","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043D\u0435\u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u043C\u044B\u043C. \u0422\u0435\u043F\u0435\u0440\u044C \u0440\u0430\u0437\u043C\u0435\u0440 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u043C\u043E\u0436\u043D\u043E \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C.","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0443\u0441\u0442\u0430\u0440\u0435\u043B. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0435\u0433\u043E \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, 'editor.suggest.showKeywords' \u0438\u043B\u0438 'editor.suggest.showSnippets'.",'\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "method".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "function".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "constructor".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "field".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "variable".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "class".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "struct".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "interface".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "module".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "property".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "event".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "operator".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "unit".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "value".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "constant".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "enum".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "enumMember".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "keyword".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "text".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "color".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "file".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "reference".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "customcolor".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "folder".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "typeParameter".','\u041A\u043E\u0433\u0434\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D, \u0432 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F "snippet".','\u0412\u043E \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 IntelliSense \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0442\u0438\u043F\u0430 "\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438".','\u0412\u043E \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438 IntelliSense \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0442\u0438\u043F\u0430 "\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B".',"\u0414\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044B\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u044B \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u044B\u0439 \u0438 \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0439 \u043F\u0440\u043E\u0431\u0435\u043B\u044B.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0443\u0442 \u043B\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0444\u0438\u043A\u0441\u0430\u0446\u0438\u0438. \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 JavaScript \u0442\u043E\u0447\u043A\u0430 \u0441 \u0437\u0430\u043F\u044F\u0442\u043E\u0439 (";") \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C \u0444\u0438\u043A\u0441\u0430\u0446\u0438\u0438, \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442\u0441\u044F.',"\u041F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 \u0412\u0412\u041E\u0414 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043E\u043D\u043E \u0438\u0437\u043C\u0435\u043D\u044F\u0435\u0442 \u0442\u0435\u043A\u0441\u0442.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0443\u0442 \u043B\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0442\u044C\u0441\u044F \u043A\u043B\u0430\u0432\u0438\u0448\u0435\u0439 \u0412\u0412\u041E\u0414 \u0432 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043A \u043A\u043B\u0430\u0432\u0438\u0448\u0435 TAB. \u042D\u0442\u043E \u043F\u043E\u043C\u043E\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044C \u043D\u0435\u043E\u0434\u043D\u043E\u0437\u043D\u0430\u0447\u043D\u043E\u0441\u0442\u0438 \u043C\u0435\u0436\u0434\u0443 \u0432\u0441\u0442\u0430\u0432\u043A\u043E\u0439 \u043D\u043E\u0432\u044B\u0445 \u0441\u0442\u0440\u043E\u043A \u0438 \u043F\u0440\u0438\u043D\u044F\u0442\u0438\u0435\u043C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0417\u0430\u0434\u0430\u0435\u0442 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0441\u0442\u0440\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043C\u043E\u0433\u0443\u0442 \u0431\u044B\u0442\u044C \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u044B \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430. \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435: \u0438\u0437-\u0437\u0430 \u0442\u0435\u0445\u043D\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u0439 \u044D\u0442\u043E \u0447\u0438\u0441\u043B\u043E \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u043F\u0440\u0435\u0432\u044B\u0448\u0430\u0442\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.","\u0421\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F \u0441\u043A\u043E\u0431\u043E\u043A.","\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0441\u043A\u043E\u0431\u043A\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0441\u043B\u0435\u0432\u0430 \u043E\u0442 \u043F\u0440\u043E\u0431\u0435\u043B\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0442\u044C \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0443\u044E \u0441\u043A\u043E\u0431\u043A\u0443 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u043C \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0439 \u0441\u043A\u043E\u0431\u043A\u0438.","\u0417\u0430\u043C\u0435\u043D\u044F\u0442\u044C \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0438 \u0441\u043A\u043E\u0431\u043A\u0438 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0438\u043B\u0438 \u0441\u043A\u043E\u0431\u043A\u0438 \u0431\u044B\u043B\u0438 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u044B \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0437\u0430\u043C\u0435\u043D\u044F\u0442\u044C\u0441\u044F \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0438\u043B\u0438 \u0441\u043A\u043E\u0431\u043A\u0438 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F \u043A\u0430\u0432\u044B\u0447\u0435\u043A.","\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043A\u0430\u0432\u044B\u0447\u043A\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0441\u043B\u0435\u0432\u0430 \u043E\u0442 \u043F\u0440\u043E\u0431\u0435\u043B\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043A\u0430\u0432\u044B\u0447\u043A\u0438, \u0435\u0441\u043B\u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0434\u043E\u0431\u0430\u0432\u0438\u043B \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0443\u044E \u043A\u0430\u0432\u044B\u0447\u043A\u0443.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0438 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u0441\u043A\u043E\u0431\u043A\u0438 \u0432 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u043E\u043C \u044F\u0437\u044B\u043A\u0430.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438, \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 \u044F\u0437\u044B\u043A\u043E\u043C \u0441\u043A\u043E\u0431\u043A\u0438 \u0438 \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 onEnterRules, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0435 \u044F\u0437\u044B\u043A\u0430\u043C\u0438.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438, \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 \u044F\u0437\u044B\u043A\u043E\u043C \u0441\u043A\u043E\u0431\u043A\u0438, \u0432\u044B\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 onEnterRules, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0435 \u044F\u0437\u044B\u043A\u0430\u043C\u0438 \u0438 \u0443\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u043E\u0442\u0441\u0442\u0443\u043F\u0430 indentationRules, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0435 \u044F\u0437\u044B\u043A\u0430\u043C\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0438\u0437\u043C\u0435\u043D\u044F\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B, \u043A\u043E\u0433\u0434\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438 \u0432\u0432\u043E\u0434\u044F\u0442, \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u044E\u0442 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u044E\u0442 \u0442\u0435\u043A\u0441\u0442 \u0438\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u044F\u044E\u0442 \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0441\u0442\u0440\u043E\u043A.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u043E\u0431\u0440\u0430\u043C\u043B\u0435\u043D\u0438\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0439.","\u041E\u0431\u0440\u0430\u043C\u043B\u044F\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u0430\u0432\u044B\u0447\u0435\u043A, \u0430 \u043D\u0435 \u0441\u043A\u043E\u0431\u043E\u043A.","\u041E\u0431\u0440\u0430\u043C\u043B\u044F\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u0441\u043A\u043E\u0431\u043E\u043A, \u0430 \u043D\u0435 \u043A\u0430\u0432\u044B\u0447\u0435\u043A.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0431\u0440\u0430\u043C\u043B\u044F\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u043A\u0430\u0432\u044B\u0447\u0435\u043A \u0438\u043B\u0438 \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A.","\u042D\u043C\u0443\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u043F\u0440\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u0430. \u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u043E \u043A \u043F\u043E\u0437\u0438\u0446\u0438\u044F\u043C \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 CodeLens \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0435\u043C\u0435\u0439\u0441\u0442\u0432\u043E\u043C \u0448\u0440\u0438\u0444\u0442\u043E\u0432 \u0434\u043B\u044F CodeLens.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445 \u0434\u043B\u044F CodeLens. \u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "0", \u0442\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F 90% \u043E\u0442 "#editor.fontSize#".',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0435 \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u043E\u0440\u044B \u0446\u0432\u0435\u0442\u0430 \u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0446\u0432\u0435\u0442\u0430.","\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0442\u043E\u0433\u043E, \u0447\u0442\u043E \u0432\u044B\u0431\u043E\u0440 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0438 \u043C\u044B\u0448\u0438 \u043F\u0440\u0438\u0432\u043E\u0434\u0438\u0442 \u043A \u0432\u044B\u0431\u043E\u0440\u0443 \u0441\u0442\u043E\u043B\u0431\u0446\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0442\u0435\u043A\u0441\u0442 \u0441\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D \u0432 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 \u0441 \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u043E\u0439 \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0438\u043B\u0435\u043C \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u043B\u0430\u0432\u043D\u0443\u044E \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044E \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0438\u043B\u0435\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u0430.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0447\u0438\u0441\u043B\u043E \u0432\u0438\u0434\u0438\u043C\u044B\u0445 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u044B\u0445 \u0438 \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0445 \u043B\u0438\u043D\u0438\u0439, \u043E\u043A\u0440\u0443\u0436\u0430\u044E\u0449\u0438\u0445 \u043A\u0443\u0440\u0441\u043E\u0440. \u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0438\u043C\u0435\u0435\u0442 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 "scrollOff" \u0438\u043B\u0438 "scrollOffset" \u0432 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430\u0445.','"cursorSurroundingLines" \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0435 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0438\u043B\u0438 API.','"cursorSurroundingLines" \u043F\u0440\u0438\u043D\u0443\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u0432\u043E \u0432\u0441\u0435\u0445 \u0441\u043B\u0443\u0447\u0430\u044F\u0445.','\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u044C "cursorSurroundingLines".',`\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0448\u0438\u0440\u0438\u043D\u043E\u0439 \u043A\u0443\u0440\u0441\u043E\u0440\u0430, \u043A\u043E\u0433\u0434\u0430 \u0434\u043B\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 "#editor.cursorStyle#" \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 'line'`,"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0443 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043F\u0435\u0440\u0435\u0442\u0430\u0441\u043A\u0438\u0432\u0430\u043D\u0438\u044F.","\u041A\u043E\u044D\u0444\u0444\u0438\u0446\u0438\u0435\u043D\u0442 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u044F \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 ALT.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u043B\u0438 \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435 \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044E \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u044F\u0437\u044B\u043A\u0430, \u0435\u0441\u043B\u0438 \u043E\u043D\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430, \u0432 \u043F\u0440\u043E\u0442\u0438\u0432\u043D\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044E \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432.","\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044E \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439 \u0434\u043B\u044F \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u0435\u043C\u044B\u0445 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u044B.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043F\u0443\u0441\u0442\u043E\u0433\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u043F\u043E\u0441\u043B\u0435 \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u0442\u044C \u0435\u0435.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0441\u0435\u043C\u0435\u0439\u0441\u0442\u0432\u043E \u0448\u0440\u0438\u0444\u0442\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435. \u041C\u043E\u0434\u0443\u043B\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0438 \u0438\u043C\u0435\u0442\u044C \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D \u0432 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u043C, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u044E\u0449\u0438\u043C, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u043E\u0441\u043B\u0435 \u0432\u0432\u043E\u0434\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u043B\u0435\u0439 \u0433\u043B\u0438\u0444\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u041F\u043E\u043B\u044F \u0433\u043B\u0438\u0444\u0430 \u0432 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u043C \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u0434\u043B\u044F \u043E\u0442\u043B\u0430\u0434\u043A\u0438.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u043A\u0440\u044B\u0442\u0438\u0435\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u0432 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0434\u043E\u043B\u0436\u043D\u0430 \u043B\u0438 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C\u0441\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0430\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0438\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u043E\u043C \u043C\u0435\u0436\u0434\u0443 \u0431\u0443\u043A\u0432\u0430\u043C\u0438 \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u043B\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u0430 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 \u043E\u0442 \u044F\u0437\u044B\u043A\u0430, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0442\u0435\u0433\u0438 HTML, \u043E\u0431\u043D\u043E\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u043F\u0440\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0438 \u0438 \u0434\u0435\u043B\u0430\u0442\u044C \u0438\u0445 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u043C\u0438 \u0434\u043B\u044F \u0449\u0435\u043B\u0447\u043A\u0430.","\u0412\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0441\u043A\u043E\u0431\u043A\u0438.","\u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 deltaX \u0438 deltaY \u0441\u043E\u0431\u044B\u0442\u0438\u0439 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043A\u043E\u043B\u0435\u0441\u0438\u043A\u0430 \u043C\u044B\u0448\u0438.","\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u043E\u0439 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 CTRL \u0438 \u0434\u0432\u0438\u0436\u0435\u043D\u0438\u0438 \u043A\u043E\u043B\u0435\u0441\u0438\u043A\u0430 \u043C\u044B\u0448\u0438.","\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432, \u043A\u043E\u0433\u0434\u0430 \u043E\u043D\u0438 \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u044E\u0442\u0441\u044F.","\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 CTRL \u0432 Windows \u0438 Linux \u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 COMMAND \u0432 macOS.","\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 ALT \u0432 Windows \u0438 Linux \u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 OPTION \u0432 macOS.",'\u041C\u043E\u0434\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438. \u0416\u0435\u0441\u0442\u044B \u043C\u044B\u0448\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E" \u0438 "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443" \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u0442\u0430\u043A, \u0447\u0442\u043E\u0431\u044B \u043E\u043D\u0438 \u043D\u0435 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u043E\u0432\u0430\u043B\u0438 \u0441 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u043C\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430\u043C\u0438. [\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier). ',"\u041A\u0430\u0436\u0434\u044B\u0439 \u043A\u0443\u0440\u0441\u043E\u0440 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0434\u043D\u0443 \u0441\u0442\u0440\u043E\u043A\u0443 \u0442\u0435\u043A\u0441\u0442\u0430.","\u041A\u0430\u0436\u0434\u044B\u0439 \u043A\u0443\u0440\u0441\u043E\u0440 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u043E\u043B\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043A\u043E\u0439, \u043A\u043E\u0433\u0434\u0430 \u0447\u0438\u0441\u043B\u043E \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u043C\u044B\u0445 \u0441\u0442\u0440\u043E\u043A \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0447\u0438\u0441\u043B\u0443 \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440\u044B \u0441\u0435\u043C\u0430\u043D\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u0430 \u043B\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u043D\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0435.","\u0424\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u043A\u0430 \u043D\u0430 \u0434\u0435\u0440\u0435\u0432\u0435 \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438 \u043E\u0431\u0437\u043E\u0440\u0430","\u0424\u043E\u043A\u0443\u0441\u0438\u0440\u043E\u0432\u043A\u0430 \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u0440\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u0438\u0438 \u043E\u0431\u0437\u043E\u0440\u0430","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u043F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0438\u043B\u0438 \u0434\u0435\u0440\u0435\u0432\u043E \u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u0435 \u043E\u0431\u0437\u043E\u0440\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u0441\u0435\u0433\u0434\u0430 \u043B\u0438 \u0436\u0435\u0441\u0442 \u043C\u044B\u0448\u044C\u044E \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C\u044E \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0438 (\u0432 \u043C\u0441) \u043F\u0435\u0440\u0435\u0434 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u043A\u0440\u0430\u0442\u043A\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u043E \u0442\u0438\u043F\u0443.",'\u041D\u0435 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F; \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u044D\u0442\u043E\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "editor.linkedEditing".',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0443\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u043E\u043C\u0435\u0440\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438, \u043A\u043E\u0433\u0434\u0430 \u0444\u0430\u0439\u043B \u0437\u0430\u043A\u0430\u043D\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u043D\u043E\u0432\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439.","\u0412\u044B\u0434\u0435\u043B\u044F\u0435\u0442 \u043F\u043E\u043B\u0435 \u0438 \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043E\u0442\u0440\u0438\u0441\u043E\u0432\u044B\u0432\u0430\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438, \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u0433\u0434\u0430 \u043E\u043D \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435","\u041E\u0442\u0440\u0438\u0441\u043E\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432, \u043A\u0440\u043E\u043C\u0435 \u043E\u0434\u0438\u043D\u043E\u0447\u043D\u044B\u0445 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0441\u043B\u043E\u0432\u0430\u043C\u0438.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u043E\u0431\u0435\u043B\u044B \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C \u0442\u0435\u043A\u0441\u0442\u0435.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u044B","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u044B.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u043B\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0441\u043A\u0440\u0443\u0433\u043B\u0435\u043D\u043D\u044B\u0435 \u0443\u0433\u043B\u044B \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\u043C \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u043F\u043E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0438.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u0437\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044E\u044E \u0441\u0442\u0440\u043E\u043A\u0443.","\u041F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u0434\u043E\u043B\u044C \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u043E\u0441\u0438 \u043F\u0440\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0435 \u043F\u043E \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u0438 \u0438 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0438 \u043E\u0434\u043D\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E. \u041F\u0440\u0435\u0434\u043E\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043C\u0435\u0449\u0435\u043D\u0438\u0435 \u043F\u043E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0438 \u043F\u0440\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0435 \u043F\u043E \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u0438 \u043D\u0430 \u0442\u0440\u0435\u043A\u043F\u0430\u0434\u0435.","\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u0438\u0440\u0443\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u0438\u0447\u043D\u044B\u0439 \u0431\u0443\u0444\u0435\u0440 \u043E\u0431\u043C\u0435\u043D\u0430 Linux.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u044B\u0434\u0435\u043B\u044F\u0442\u044C \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u044F, \u0430\u043D\u0430\u043B\u043E\u0433\u0438\u0447\u043D\u044B\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u043C\u0443 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0443.","\u0412\u0441\u0435\u0433\u0434\u0430 \u043F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u0435\u043C\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F.","\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F, \u043A\u043E\u0433\u0434\u0430 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044C \u043C\u044B\u0448\u0438 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043D\u0430\u0434 \u043F\u0435\u0440\u0435\u043F\u043B\u0435\u0442\u043E\u043C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043D\u0430 \u043F\u0435\u0440\u0435\u043F\u043B\u0435\u0442\u0435.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u043A\u0440\u044B\u0442\u0438\u0435\u043C \u043D\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0433\u043E \u043A\u043E\u0434\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u0435\u0440\u0435\u0447\u0435\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u0435\u043C \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0445 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0445.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u043E\u0432\u0435\u0440\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u043F\u043E\u0434 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438.","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u0440\u044F\u0434\u043E\u043C \u0441 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438.","\u041D\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u0432 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438 \u0438 \u0438\u0445 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u043E\u0439.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043B\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0430\u043D\u0438\u043C\u0430\u0446\u0438\u044F \u043F\u0440\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430",'\u0420\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0441 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438. \u0415\u0441\u043B\u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "0", \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "#editor.fontSize#".','\u0412\u044B\u0441\u043E\u0442\u0430 \u0441\u0442\u0440\u043E\u043A\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0441 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u043C\u0438. \u0415\u0441\u043B\u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "0", \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "#editor.lineHeight#". \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\xA0\u2014 8.',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0434\u043E\u043B\u0436\u043D\u044B \u043B\u0438 \u043F\u0440\u0438 \u0432\u0432\u043E\u0434\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F.","\u0412\u0441\u0435\u0433\u0434\u0430 \u0432\u044B\u0431\u0438\u0440\u0430\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435.",'\u0412\u044B\u0431\u043E\u0440 \u043D\u0435\u0434\u0430\u0432\u043D\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439, \u0435\u0441\u043B\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u0430\u043B\u044C\u043D\u0435\u0439\u0448\u0438\u0439 \u0432\u0432\u043E\u0434 \u043D\u0435 \u043F\u0440\u0438\u0432\u043E\u0434\u0438\u0442 \u043A \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044E \u043E\u0434\u043D\u043E\u0433\u043E \u0438\u0437 \u043D\u0438\u0445, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 "console.| -> console.log", \u0442\u0430\u043A \u043A\u0430\u043A "log" \u043D\u0435\u0434\u0430\u0432\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043B\u0441\u044F \u0434\u043B\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F.','\u0412\u044B\u0431\u043E\u0440 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0441 \u0443\u0447\u0435\u0442\u043E\u043C \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0445 \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u043E\u0432, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u0434\u043B\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u044D\u0442\u0438\u0445 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 "co -> console" \u0438 "con -> const".',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u043C \u0432\u044B\u0431\u043E\u0440\u043E\u043C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0438 \u0441\u043F\u0438\u0441\u043A\u0430 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041F\u0440\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0438 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u043E TAB \u0431\u0443\u0434\u0435\u0442 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0442\u044C\u0441\u044F \u043D\u0430\u0438\u043B\u0443\u0447\u0448\u0435\u0435 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB.","\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043F\u043E TAB.",'\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0439 \u043F\u043E TAB \u043F\u0440\u0438 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0438 \u0438\u0445 \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u043E\u0432. \u0424\u0443\u043D\u043A\u0446\u0438\u044F \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043E\u043F\u0442\u0438\u043C\u0430\u043B\u044C\u043D\u043E, \u0435\u0441\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "quickSuggestions" \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D.',"\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u043E TAB.","\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0443\u0434\u0430\u043B\u044F\u044E\u0442\u0441\u044F.","\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u044E\u0442\u0441\u044F.","\u0414\u043B\u044F \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0437\u0430\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435.","\u0423\u0434\u0430\u043B\u0438\u0442\u0435 \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043C\u043E\u0433\u0443\u0442 \u0432\u044B\u0437\u0432\u0430\u0442\u044C \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B.","\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u0421\u0438\u043C\u0432\u043E\u043B\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u043A\u0430\u043A \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u0438 \u0441\u043B\u043E\u0432 \u043F\u0440\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438\u043B\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0445 \u0441\u043E \u0441\u043B\u043E\u0432\u0430\u043C\u0438.","\u0421\u0442\u0440\u043E\u043A\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043D\u0438\u043A\u043E\u0433\u0434\u0430.","\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043F\u043E \u0448\u0438\u0440\u0438\u043D\u0435 \u043E\u043A\u043D\u0430 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430.",'\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C\u0441\u044F \u043F\u043E "#editor.wordWrapColumn#".','\u0421\u0442\u0440\u043E\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u043F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u044B \u043F\u043E \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u043C\u0443 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044E \u0438\u0437 \u0434\u0432\u0443\u0445: \u0448\u0438\u0440\u0438\u043D\u0430 \u043E\u043A\u043D\u0430 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0438 "#editor.wordWrapColumn#".',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043A\u0430\u043A \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0438.",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0441\u0442\u043E\u043B\u0431\u0435\u0446 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0435\u0441\u043B\u0438 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "#editor.wordWrap#" \u2014 "wordWrapColumn" \u0438\u043B\u0438 "bounded".',"\u0411\u0435\u0437 \u043E\u0442\u0441\u0442\u0443\u043F\u0430. \u041F\u0435\u0440\u0435\u043D\u043E\u0441 \u0441\u0442\u0440\u043E\u043A \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u0441\u043E \u0441\u0442\u043E\u043B\u0431\u0446\u0430 1.","\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0442 \u0442\u043E\u0442 \u0436\u0435 \u043E\u0442\u0441\u0442\u0443\u043F, \u0447\u0442\u043E \u0438 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430.","\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0442 \u043E\u0442\u0441\u0442\u0443\u043F, \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u043D\u044B\u0439 \u043D\u0430 \u0435\u0434\u0438\u043D\u0438\u0446\u0443 \u043F\u043E \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044E \u0441 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439. ","\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E\u043B\u0443\u0447\u0430\u0442 \u043E\u0442\u0441\u0442\u0443\u043F, \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u043D\u044B\u0439 \u043D\u0430 \u0434\u0432\u0430 \u043F\u043E \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044E \u0441 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u043E\u0439.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u043C \u0441\u0442\u0440\u043E\u043A \u0441 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u043E\u043C \u043F\u043E \u0441\u043B\u043E\u0432\u0430\u043C.","\u041F\u0440\u0435\u0434\u043F\u043E\u043B\u0430\u0433\u0430\u0435\u0442, \u0447\u0442\u043E \u0432\u0441\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0438\u043C\u0435\u044E\u0442 \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u0443\u044E \u0448\u0438\u0440\u0438\u043D\u0443. \u042D\u0442\u043E \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u0434\u043B\u044F \u043C\u043E\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0448\u0440\u0438\u0444\u0442\u043E\u0432 \u0438 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0441\u043A\u0440\u0438\u043F\u0442\u043E\u0432 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043B\u0430\u0442\u0438\u043D\u0441\u043A\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432), \u0433\u0434\u0435 \u0433\u043B\u0438\u0444\u044B \u0438\u043C\u0435\u044E\u0442 \u043E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u0443\u044E \u0448\u0438\u0440\u0438\u043D\u0443.","\u0414\u0435\u043B\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u0435 \u0442\u043E\u0447\u0435\u043A \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443. \u042D\u0442\u043E \u043C\u0435\u0434\u043B\u0435\u043D\u043D\u044B\u0439 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043C\u043E\u0436\u0435\u0442 \u043F\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043A \u0437\u0430\u0432\u0438\u0441\u0430\u043D\u0438\u044F\u043C \u043F\u0440\u0438 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0435 \u0431\u043E\u043B\u044C\u0448\u0438\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u043D\u043E \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u0432\u043E \u0432\u0441\u0435\u0445 \u0441\u043B\u0443\u0447\u0430\u044F\u0445.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u043E\u043C, \u0432\u044B\u0447\u0438\u0441\u043B\u044F\u044E\u0449\u0438\u043C \u0442\u043E\u0447\u043A\u0438 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u0430."],"vs/editor/common/editorContextKeys":["\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0442\u0435\u043A\u0441\u0442\u0435 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 (\u043A\u0443\u0440\u0441\u043E\u0440 \u043C\u0438\u0433\u0430\u0435\u0442)","\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0438\u043B\u0438 \u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0444\u043E\u043A\u0443\u0441 \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430)","\u041D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0438\u043B\u0438 \u043D\u0430 \u043F\u043E\u043B\u0435 \u0432\u0432\u043E\u0434\u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 (\u043A\u0443\u0440\u0441\u043E\u0440 \u043C\u0438\u0433\u0430\u0435\u0442)","\u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u043E\u043C \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439",'\u0412\u043A\u043B\u044E\u0447\u0435\u043D \u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 "editor.columnSelection"',"\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439 \u0432\u044B\u0431\u043E\u0440","\u041F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u0444\u043E\u043A\u0443\u0441 \u0441 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0435 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0432\u0438\u0434\u0438\u043C\u044B\u043C","\u042F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0447\u0430\u0441\u0442\u044C\u044E \u0431\u043E\u043B\u044C\u0448\u0435\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0437\u0430\u043F\u0438\u0441\u043D\u044B\u0445 \u043A\u043D\u0438\u0436\u0435\u043A)","\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u044F\u0437\u044B\u043A\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441 \u043A\u043E\u0434\u043E\u043C","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A CodeLens","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0439","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0439","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0439 \u0442\u0438\u043F\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044F","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0441\u0441\u044B\u043B\u043E\u043A","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0441\u043F\u0440\u0430\u0432\u043A\u0438 \u043F\u043E \u0441\u0438\u0433\u043D\u0430\u0442\u0443\u0440\u0430\u043C","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A\u043E\u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432","\u0415\u0441\u0442\u044C \u043B\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A\u043E\u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u0432"],"vs/editor/common/model/editStack":["\u0412\u0432\u043E\u0434"],"vs/editor/common/modes/modesRegistry":["\u041F\u0440\u043E\u0441\u0442\u043E\u0439 \u0442\u0435\u043A\u0441\u0442"],"vs/editor/common/standaloneStrings":["\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u043E","\u0421\u0442\u0440\u043E\u043A\u0430 {0}, \u0441\u0442\u043E\u043B\u0431\u0435\u0446 {1} (\u0432\u044B\u0431\u0440\u0430\u043D\u043E: {2})","\u0421\u0442\u0440\u043E\u043A\u0430 {0}, \u0441\u0442\u043E\u043B\u0431\u0435\u0446 {1}","\u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0439: {0} (\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043E \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432: {1})","\u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0439: {0}",'\u0422\u0435\u043F\u0435\u0440\u044C \u0434\u043B\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 "accessibilitySupport" \u0443\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "\u0432\u043A\u043B".',"\u041E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438 \u043E \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044F\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0432 \u043F\u0430\u043D\u0435\u043B\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439."," \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043A\u043E\u0434\u0430 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F"," \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u043A\u043E\u0434\u0430","\u0427\u0442\u043E\u0431\u044B \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u043E \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430, \u043D\u0430\u0436\u043C\u0438\u0442\u0435 COMMAND+E.","\u0427\u0442\u043E\u0431\u044B \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u043E \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430, \u043D\u0430\u0436\u043C\u0438\u0442\u0435 CTRL+E.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D \u0434\u043B\u044F \u043E\u043F\u0442\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0439 \u0440\u0430\u0431\u043E\u0442\u044B \u0441\u043E \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043E\u043C \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430.","\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D \u0431\u0435\u0437 \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0447\u0442\u0435\u043D\u0438\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u0430, \u0447\u0442\u043E \u043D\u0435 \u043F\u043E\u0434\u0445\u043E\u0434\u0438\u0442 \u0432 \u0434\u0430\u043D\u043D\u043E\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.","\u041F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0444\u043E\u043A\u0443\u0441 \u0432\u0432\u043E\u0434\u0430 \u043F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u0441\u044F \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442, \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u044B\u0439 \u0435\u0433\u043E \u043F\u0440\u0438\u043D\u044F\u0442\u044C. \u0427\u0442\u043E\u0431\u044B \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u044D\u0442\u043E \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435, \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0443 {0}.","\u041F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0444\u043E\u043A\u0443\u0441 \u0432\u0432\u043E\u0434\u0430 \u043F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u0441\u044F \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442, \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u044B\u0439 \u0435\u0433\u043E \u043F\u0440\u0438\u043D\u044F\u0442\u044C. \u041A\u043E\u043C\u0430\u043D\u0434\u0443 {0} \u0441\u0435\u0439\u0447\u0430\u0441 \u043D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448.","\u041F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D \u0441\u0438\u043C\u0432\u043E\u043B \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438. \u0427\u0442\u043E\u0431\u044B \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u044D\u0442\u043E \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435, \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0443 {0}.","\u041F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D \u0441\u0438\u043C\u0432\u043E\u043B \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438. \u041A\u043E\u043C\u0430\u043D\u0434\u0443 {0} \u0441\u0435\u0439\u0447\u0430\u0441 \u043D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F \u043A\u043B\u0430\u0432\u0438\u0448.","\u041D\u0430\u0436\u043C\u0438\u0442\u0435 COMMAND+H, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043E\u043A\u043D\u043E \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0441 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0435\u0439 \u043E \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044F\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u041D\u0430\u0436\u043C\u0438\u0442\u0435 CTRL+H, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u043E\u043A\u043D\u043E \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0441 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0435\u0439 \u043E \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044F\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u044C \u044D\u0442\u0443 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0443 \u0438 \u0432\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440, \u043D\u0430\u0436\u0430\u0432 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 ESCAPE \u0438\u043B\u0438 SHIFT+ESCAPE.","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u043F\u0440\u0430\u0432\u043A\u0443 \u043F\u043E \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u043C \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044F\u043C","\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A: \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u0442\u043E\u043A\u0435\u043D\u044B","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0442\u0440\u043E\u043A\u0435/\u0441\u0442\u043E\u043B\u0431\u0446\u0443...","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432\u0441\u0435\u0445 \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0443\u043F\u0430","\u041F\u0430\u043B\u0438\u0442\u0440\u0430 \u043A\u043E\u043C\u0430\u043D\u0434","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u044B","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0438\u043C\u0432\u043E\u043B\u0443...","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0438\u043C\u0432\u043E\u043B\u0443 \u043F\u043E \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F\u043C...","\u0421\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041D\u0430\u0436\u043C\u0438\u0442\u0435 ALT+F1 \u0434\u043B\u044F \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C \u0441\u043F\u0435\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0445 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0435\u0439.","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0441\u043E\u043A\u043E\u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u043D\u0443\u044E \u0442\u0435\u043C\u0443","\u0412\u043D\u0435\u0441\u0435\u043D\u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439 \u0432 \u0444\u0430\u0439\u043B\u0430\u0445 ({1}): {0}."],"vs/editor/common/view/editorColorRegistry":["\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0433\u0440\u0430\u043D\u0438\u0446 \u0432\u043E\u043A\u0440\u0443\u0433 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \u043F\u0440\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0438 \u0444\u0443\u043D\u043A\u0446\u0438\u0439 Quick Open \u0438\u043B\u0438 \u043F\u043E\u0438\u0441\u043A\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043E\u0431\u0432\u043E\u0434\u043A\u0438 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F.",'\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0441\u0438\u043C\u0432\u043E\u043B\u0430, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 \u0444\u0443\u043D\u043A\u0446\u0438\u044F\u0445 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E" \u0438\u043B\u0438 "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443/\u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0441\u0438\u043C\u0432\u043E\u043B\u0443". \u0426\u0432\u0435\u0442 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 \u043F\u043E\u0434 \u043D\u0438\u043C.',"\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0432\u043E\u043A\u0440\u0443\u0433 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432.","\u0426\u0432\u0435\u0442 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u041F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044C \u0446\u0432\u0435\u0442 \u0441\u0438\u043C\u0432\u043E\u043B\u0430, \u043F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u044B\u043C \u043A\u0443\u0440\u0441\u043E\u0440\u043E\u043C.","\u0426\u0432\u0435\u0442 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u0434\u043B\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u043E\u0432 \u0441\u0442\u0440\u043E\u043A \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 'Id' \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043C. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0432\u043C\u0435\u0441\u0442\u043E \u043D\u0435\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 'editorLineNumber.activeForeground'.","\u0426\u0432\u0435\u0442 \u043D\u043E\u043C\u0435\u0440\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0426\u0432\u0435\u0442 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 CodeLens \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A","\u0426\u0432\u0435\u0442 \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u0438\u043A\u043E\u0432 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u043A\u043E\u0431\u043E\u043A","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F, \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u0438 \u0440\u0430\u0437\u043C\u0435\u0449\u0435\u043D\u0430 \u0432 \u043F\u0440\u0430\u0432\u043E\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0412 \u043F\u043E\u043B\u0435 \u0440\u0430\u0437\u043C\u0435\u0449\u0430\u044E\u0442\u0441\u044F \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0433\u043B\u0438\u0444\u043E\u0432 \u0438 \u043D\u043E\u043C\u0435\u0440\u0430 \u0441\u0442\u0440\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043D\u0435\u043D\u0443\u0436\u043D\u043E\u0433\u043E (\u043D\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0433\u043E) \u0438\u0441\u0445\u043E\u0434\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.",'\u041D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C \u043D\u0435\u043D\u0443\u0436\u043D\u043E\u0433\u043E (\u043D\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0433\u043E) \u0438\u0441\u0445\u043E\u0434\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, "#000000c0" \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043A\u043E\u0434 \u0441 \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u043E\u0441\u0442\u044C\u044E 75 %. \u0412 \u0432\u044B\u0441\u043E\u043A\u043E\u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u043D\u044B\u0445 \u0442\u0435\u043C\u0430\u0445 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u043D\u0443\u0436\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432\u043C\u0435\u0441\u0442\u043E \u0437\u0430\u0442\u0435\u043D\u0435\u043D\u0438\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0446\u0432\u0435\u0442 \u0442\u0435\u043C\u044B "editorUnnecessaryCode.border".',"\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043C\u0435\u0442\u043A\u0438 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043B\u044F \u043E\u0448\u0438\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043C\u0435\u0442\u043A\u0438 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043C\u0435\u0442\u043A\u0438 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043B\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439."],"vs/editor/contrib/anchorSelect/anchorSelect":["\u041D\u0430\u0447\u0430\u043B\u044C\u043D\u0430\u044F \u0442\u043E\u0447\u043A\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F","\u041D\u0430\u0447\u0430\u043B\u044C\u043D\u0430\u044F \u0442\u043E\u0447\u043A\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0430 \u0432 {0}:{1}","\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E \u0442\u043E\u0447\u043A\u0443 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0439 \u0442\u043E\u0447\u043A\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F","\u0412\u044B\u0434\u0435\u043B\u0438\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u043E\u0442 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E\u0439 \u0442\u043E\u0447\u043A\u0438 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0434\u043E \u043A\u0443\u0440\u0441\u043E\u0440\u0430","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E \u0442\u043E\u0447\u043A\u0443 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F"],"vs/editor/contrib/bracketMatching/bracketMatching":["\u0426\u0432\u0435\u0442 \u043C\u0435\u0442\u043A\u0438 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0432 \u043E\u043A\u043D\u0435 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0434\u043B\u044F \u043F\u0430\u0440 \u0441\u043A\u043E\u0431\u043E\u043A.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043A\u043E\u0431\u043A\u0435","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0441\u043A\u043E\u0431\u043A\u0443","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u0441\u043A\u043E\u0431\u043A\u0435"],"vs/editor/contrib/caretOperations/caretOperations":["\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0432\u043B\u0435\u0432\u043E","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0432\u043F\u0440\u0430\u0432\u043E"],"vs/editor/contrib/caretOperations/transpose":["\u0422\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0431\u0443\u043A\u0432\u044B"],"vs/editor/contrib/clipboard/clipboard":["&&\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C","\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C","\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C","&&\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435","&&\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u043C \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u0430"],"vs/editor/contrib/codeAction/codeActionCommands":["\u0422\u0438\u043F \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u043C\u043E\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043A\u043E\u0433\u0434\u0430 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u044E\u0442\u0441\u044F \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F.","\u0412\u0441\u0435\u0433\u0434\u0430 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u043D\u043E\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043A\u043E\u0434\u0430.","\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0435\u0440\u0432\u043E\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430, \u0435\u0441\u043B\u0438 \u043E\u043D\u043E \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u043C.","\u041D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430.","\u041F\u0440\u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430","\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435...","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442",'\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043A\u043E\u0434\u0430 \u0434\u043B\u044F "{0}".','\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u0434\u043B\u044F "{0}" \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B',"\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043A\u043E\u0434\u0430","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u043E\u0434\u0430 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u0420\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433...",'\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0440\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433\u043E\u0432 \u0434\u043B\u044F "{0}"','\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0433\u043E \u0440\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433\u0430 \u0434\u043B\u044F "{0}"',"\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0440\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433\u043E\u0432","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0444\u0430\u043A\u0442\u043E\u0440\u0438\u043D\u0433\u0430 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u043C \u043A\u043E\u0434\u043E\u043C...","\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0430 \u0434\u043B\u044F '{0}'",'\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043B\u044F "{0}"',"\u041F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0430 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B","\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u041E\u0440\u0433\u0430\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u0438\u043C\u043F\u043E\u0440\u0442\u043E\u0432","\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0434\u043B\u044F \u0443\u043F\u043E\u0440\u044F\u0434\u043E\u0447\u0435\u043D\u0438\u044F \u0438\u043C\u043F\u043E\u0440\u0442\u043E\u0432 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442","\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0432\u0441\u0435","\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0433\u043E \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043F\u043E \u043E\u0431\u0449\u0435\u043C\u0443 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044E","\u0410\u0432\u0442\u043E\u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435...","\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u0430\u0432\u0442\u043E\u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0439"],"vs/editor/contrib/codeAction/lightBulbWidget":["\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0439. \u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0438\u0442\u0430\u0435\u043C\u043E\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 ({0})","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F ({0})","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F"],"vs/editor/contrib/codelens/codelensController":["\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u044B CodeLens \u0434\u043B\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043E\u043A\u0438"],"vs/editor/contrib/comment/comment":["\u0417\u0430\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u043B\u0438 \u0440\u0430\u0441\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 &&\u0441\u0442\u0440\u043E\u043A\u0438","\u0417\u0430\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u0420\u0430\u0441\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u0417\u0430\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0438\u043B\u0438 \u0440\u0430\u0441\u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0431\u043B\u043E\u043A","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 &&\u0431\u043B\u043E\u043A\u0430"],"vs/editor/contrib/contextmenu/contextmenu":["\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u043D\u043E\u0435 \u043C\u0435\u043D\u044E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430"],"vs/editor/contrib/cursorUndo/cursorUndo":["\u041E\u0442\u043C\u0435\u043D\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430","\u041F\u043E\u0432\u0442\u043E\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430"],"vs/editor/contrib/find/findController":["\u041D\u0430\u0439\u0442\u0438","&&\u041D\u0430\u0439\u0442\u0438","\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u043C","\u041D\u0430\u0439\u0442\u0438 \u0434\u0430\u043B\u0435\u0435","\u041D\u0430\u0439\u0442\u0438 \u0434\u0430\u043B\u0435\u0435","\u041D\u0430\u0439\u0442\u0438 \u0440\u0430\u043D\u0435\u0435","\u041D\u0430\u0439\u0442\u0438 \u0440\u0430\u043D\u0435\u0435","\u041D\u0430\u0439\u0442\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u041D\u0430\u0439\u0442\u0438 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","&&\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C"],"vs/editor/contrib/find/findWidget":['\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u043C" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.',"\u0417\u043D\u0430\u0447\u043E\u043A, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0438\u0439, \u0447\u0442\u043E \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u043E.","\u0417\u043D\u0430\u0447\u043E\u043A, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0438\u0439, \u0447\u0442\u043E \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u043E.",'\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u0430\u0439\u0442\u0438 \u0440\u0430\u043D\u0435\u0435" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.','\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043A\u043D\u043E\u043F\u043A\u0438 "\u041D\u0430\u0439\u0442\u0438 \u0434\u0430\u043B\u0435\u0435" \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.',"\u041D\u0430\u0439\u0442\u0438","\u041D\u0430\u0439\u0442\u0438","\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435","\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435","\u041D\u0430\u0439\u0442\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438","\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435",'\u0420\u0435\u0436\u0438\u043C "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0437\u0430\u043C\u0435\u043D\u044B"',"\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0435\u0440\u0432\u044B\u0435 {0} \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432, \u043D\u043E \u0432\u0441\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u043F\u043E\u0438\u0441\u043A\u0430 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u0441\u043E \u0432\u0441\u0435\u043C \u0442\u0435\u043A\u0441\u0442\u043E\u043C.","{0} \u0438\u0437 {1}","\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","{0} \u043E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E",'{0} \u043D\u0430\u0439\u0434\u0435\u043D \u0434\u043B\u044F "{1}"','{0} \u043D\u0430\u0439\u0434\u0435\u043D \u0434\u043B\u044F "{1}", \u0432 {2}','{0} \u043D\u0430\u0439\u0434\u0435\u043D \u0434\u043B\u044F "{1}"',"\u0422\u0435\u043F\u0435\u0440\u044C \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448 CTRL+\u0412\u0412\u041E\u0414 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0441\u0438\u043C\u0432\u043E\u043B \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043D\u0430 \u043D\u043E\u0432\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u043C\u0435\u0441\u0442\u043E \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u0441\u0435\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430. \u0412\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 editor.action.replaceAll, \u0447\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442\u044C \u044D\u0442\u043E \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435."],"vs/editor/contrib/folding/folding":["\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C","\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C","\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435 \u0431\u043B\u043E\u043A\u0438 \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0435\u0432","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435 \u0440\u0435\u0433\u0438\u043E\u043D\u044B","\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435 \u0440\u0435\u0433\u0438\u043E\u043D\u044B","\u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435","\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u0441\u0435","\u0423\u0440\u043E\u0432\u0435\u043D\u044C \u043F\u0430\u043F\u043A\u0438 {0}","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0437\u0430 \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u043C\u0438 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0430\u043C\u0438. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u0434\u0435\u043A\u043E\u0440\u0430\u0442\u0438\u0432\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B.","\u0426\u0432\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u0432\u0435\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0435\u043C \u0432\u043E \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u043C \u043F\u043E\u043B\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430."],"vs/editor/contrib/folding/foldingDecorations":["\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0445 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432 \u043D\u0430 \u043F\u043E\u043B\u0435 \u0433\u043B\u0438\u0444\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0445 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u043E\u0432 \u043D\u0430 \u043F\u043E\u043B\u0435 \u0433\u043B\u0438\u0444\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430."],"vs/editor/contrib/fontZoom/fontZoom":["\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C \u0448\u0440\u0438\u0444\u0442 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u0448\u0440\u0438\u0444\u0442 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043C\u0430\u0441\u0448\u0442\u0430\u0431 \u0448\u0440\u0438\u0444\u0442\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430"],"vs/editor/contrib/format/format":["\u0412\u043D\u0435\u0441\u0435\u043D\u0430 \u043E\u0434\u043D\u0430 \u043F\u0440\u0430\u0432\u043A\u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 {0}.","\u0412\u043D\u0435\u0441\u0435\u043D\u044B \u043F\u0440\u0430\u0432\u043A\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F ({0}) \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 {1}.","\u0412\u043D\u0435\u0441\u0435\u043D\u0430 \u043E\u0434\u043D\u0430 \u043F\u0440\u0430\u0432\u043A\u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043C\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043E\u043A\u0430\u043C\u0438 {0} \u0438 {1}.","\u0412\u043D\u0435\u0441\u0435\u043D\u044B \u043F\u0440\u0430\u0432\u043A\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F ({0}) \u043C\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043E\u043A\u0430\u043C\u0438 {1} \u0438 {2}."],"vs/editor/contrib/format/formatActions":["\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442","\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442"],"vs/editor/contrib/gotoError/gotoError":["\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439 \u041F\u0440\u043E\u0431\u043B\u0435\u043C\u0435 (\u041E\u0448\u0438\u0431\u043A\u0435, \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044E, \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438)","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u043C\u0430\u0440\u043A\u0435\u0440\u0443.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0439 \u041F\u0440\u043E\u0431\u043B\u0435\u043C\u0435 (\u041E\u0448\u0438\u0431\u043A\u0435, \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044E, \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438)","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u043C\u0430\u0440\u043A\u0435\u0440\u0443.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435 \u0432 \u0444\u0430\u0439\u043B\u0430\u0445 (\u043E\u0448\u0438\u0431\u043A\u0438, \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F, \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F)","\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0430\u044F &&\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0439 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435 \u0432 \u0444\u0430\u0439\u043B\u0430\u0445 (\u043E\u0448\u0438\u0431\u043A\u0438, \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F, \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F)","\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0430\u044F &&\u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430"],"vs/editor/contrib/gotoError/gotoErrorWidget":["\u041E\u0448\u0438\u0431\u043A\u0430","\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435","\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F","\u0423\u043A\u0430\u0437\u0430\u043D\u0438\u0435","{0} \u0432 {1}. ","\u041F\u0440\u043E\u0431\u043B\u0435\u043C\u044B: {0} \u0438\u0437 {1}","\u041F\u0440\u043E\u0431\u043B\u0435\u043C\u044B: {0} \u0438\u0437 {1}","\u0426\u0432\u0435\u0442 \u043E\u0448\u0438\u0431\u043A\u0438 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0424\u043E\u043D \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043F\u043E \u043C\u0435\u0442\u043A\u0430\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430."],"vs/editor/contrib/gotoSymbol/goToCommands":["\u041E\u0431\u0437\u043E\u0440","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F",'\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E.',"\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0431\u043E\u043A\u0443","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044F",'\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E.',"\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044E","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044E",'\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E.',"\u041E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E","\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u0435","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0442\u0438\u043F\u043E\u0432",'\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0438\u043F\u0430 \u0434\u043B\u044F "{0}".',"\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0438\u043F\u0430.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0442\u0438\u043F\u0430","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0442\u0438\u043F\u0430","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u0438\u043F\u0430","\u0420\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438",'\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430 \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0434\u043B\u044F "{0}".',"\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430 \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u043C","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F\u043C","\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438",'\u0421\u0441\u044B\u043B\u043A\u0438 \u0434\u043B\u044F "{0}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B',"\u0421\u0441\u044B\u043B\u043A\u0438 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0441\u044B\u043B\u043A\u0430\u043C","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A &&\u0441\u0441\u044B\u043B\u043A\u0430\u043C","\u0421\u0441\u044B\u043B\u043A\u0438","\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0438","\u0421\u0441\u044B\u043B\u043A\u0438","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043B\u044E\u0431\u043E\u043C\u0443 \u0441\u0438\u043C\u0432\u043E\u043B\u0443","\u0420\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F",'\u041D\u0435\u0442 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0434\u043B\u044F "{0}"',"\u0421\u0441\u044B\u043B\u043A\u0438"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["\u0429\u0435\u043B\u043A\u043D\u0438\u0442\u0435, \u0447\u0442\u043E\u0431\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0437\u0438\u0442\u044C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F ({0})."],"vs/editor/contrib/gotoSymbol/peek/referencesController":["\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["\u0421\u0441\u044B\u043B\u043E\u043A: {0}","{0} \u0441\u0441\u044B\u043B\u043A\u0430","\u0421\u0441\u044B\u043B\u043A\u0438"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["\u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D","\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442","\u0421\u0441\u044B\u043B\u043A\u0438"],"vs/editor/contrib/gotoSymbol/referencesModel":["\u0441\u0441\u044B\u043B\u043A\u0430 \u0432 {0} \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 {1} \u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0435 {2}","\u0441\u0438\u043C\u0432\u043E\u043B \u0432 {0} \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 {1} \u0438 \u0441\u0442\u043E\u043B\u0431\u0446\u0435 {2}, {3}","1 \u0441\u0438\u043C\u0432\u043E\u043B \u0432 {0}, \u043F\u043E\u043B\u043D\u044B\u0439 \u043F\u0443\u0442\u044C: {1}","{0} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 {1}, \u043F\u043E\u043B\u043D\u044B\u0439 \u043F\u0443\u0442\u044C: {2} ","\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B","\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D 1 \u0441\u0438\u043C\u0432\u043E\u043B \u0432 {0}","\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E {0} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 {1}","\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u043E {0} \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 {1} \u0444\u0430\u0439\u043B\u0430\u0445"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["\u0421\u0438\u043C\u0432\u043E\u043B {0} \u0438\u0437 {1}, {2} \u0434\u043B\u044F \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E","\u0421\u0438\u043C\u0432\u043E\u043B {0} \u0438\u0437 {1}"],"vs/editor/contrib/hover/hover":["\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438","\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438"],"vs/editor/contrib/hover/markdownHoverParticipant":["\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430..."],"vs/editor/contrib/hover/markerHoverParticipant":["\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443","\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B","\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u044F \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0439...","\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B","\u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u043C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u043C \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C"],"vs/editor/contrib/indentation/indentation":["\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0432 \u043F\u0440\u043E\u0431\u0435\u043B\u044B","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F \u0432 \u0448\u0430\u0433\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u041D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0430\u0433\u0430 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0440 \u0448\u0430\u0433\u0430 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0434\u043B\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0444\u0430\u0439\u043B\u0430","\u041E\u0442\u0441\u0442\u0443\u043F \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438","\u041E\u0442\u0441\u0442\u0443\u043F \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u0430 \u043E\u0442 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0433\u043E","\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u043E \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0441\u0442\u0440\u043E\u043A","\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u043E \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F\u044B \u0434\u043B\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A"],"vs/editor/contrib/linesOperations/linesOperations":["\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0441\u0432\u0435\u0440\u0445\u0443","&&\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u044B\u0448\u0435","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0441\u043D\u0438\u0437\u0443","\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 &&\u043D\u0438\u0436\u0435","\u0414\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0435","&&\u0414\u0443\u0431\u043B\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0435","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u0432\u0435\u0440\u0445","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043D\u0430 \u0441&&\u0442\u0440\u043E\u043A\u0443 \u0432\u044B\u0448\u0435","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u043D\u0438\u0437","&&\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443 \u043D\u0438\u0436\u0435","\u0421\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0441\u0442\u0440\u043E\u043A \u043F\u043E \u0432\u043E\u0437\u0440\u0430\u0441\u0442\u0430\u043D\u0438\u044E","\u0421\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0441\u0442\u0440\u043E\u043A \u043F\u043E \u0443\u0431\u044B\u0432\u0430\u043D\u0438\u044E","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u043E\u043D\u0435\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B-\u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u0438","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443","\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F","\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0432\u044B\u0448\u0435","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u043D\u0438\u0436\u0435","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u0441\u0435 \u0441\u043B\u0435\u0432\u0430","\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u0441\u0435 \u0441\u043F\u0440\u0430\u0432\u0430","_\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0438","\u0422\u0440\u0430\u043D\u0441\u043F\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0432\u043E\u043A\u0440\u0443\u0433 \u043A\u0443\u0440\u0441\u043E\u0440\u0430","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u0432\u0435\u0440\u0445\u043D\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u043D\u0438\u0436\u043D\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u0437\u0430\u0433\u043B\u0430\u0432\u043D\u044B\u0435 \u0431\u0443\u043A\u0432\u044B","\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u043D\u0430\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0441 \u043F\u043E\u0434\u0447\u0435\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u044F\u043C\u0438"],"vs/editor/contrib/linkedEditing/linkedEditing":["\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u0440\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u043C \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0438 \u0442\u0438\u043F\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u043E\u043C."],"vs/editor/contrib/links/links":["\u0412\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u0443","\u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435","\u041A\u043D\u043E\u043F\u043A\u0430 OPTION \u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043B\u0435\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438","\u041A\u043D\u043E\u043F\u043A\u0430 CTRL \u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043B\u0435\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438","\u041A\u043D\u043E\u043F\u043A\u0430 OPTION \u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043B\u0435\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438","\u041A\u043D\u043E\u043F\u043A\u0430 ALT \u0438 \u0449\u0435\u043B\u0447\u043E\u043A \u043B\u0435\u0432\u043E\u0439 \u043A\u043D\u043E\u043F\u043A\u043E\u0439 \u043C\u044B\u0448\u0438","\u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B {0}","\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443, \u0442\u0430\u043A \u043A\u0430\u043A \u043E\u043D\u0430 \u0438\u043C\u0435\u0435\u0442 \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442: {0}","\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443, \u0443 \u043D\u0435\u0435 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0446\u0435\u043B\u0435\u0432\u043E\u0439 \u043E\u0431\u044A\u0435\u043A\u0442.","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443"],"vs/editor/contrib/message/messageController":["\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043B\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435","\u041D\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435 \u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F \u0447\u0442\u0435\u043D\u0438\u044F"],"vs/editor/contrib/multicursor/multicursor":["\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440 \u0432\u044B\u0448\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440 &&\u0432\u044B\u0448\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440 \u043D\u0438\u0436\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440 &&\u043D\u0438\u0436\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u043A \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F\u043C \u0441\u0442\u0440\u043E\u043A","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u0432 &&\u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u043D\u0438\u0436\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u043E\u0440\u044B \u0432\u044B\u0448\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C &&\u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442 \u0432 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C &&\u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u0435","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0432 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0439 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442 \u0432 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u043E\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0435","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u043D\u0430\u0439\u0434\u0435\u043D\u043D\u044B\u0445 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439","\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0432\u0441\u0435 &&\u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F","\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F"],"vs/editor/contrib/parameterHints/parameterHints":["\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u043A \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430.","{0}, \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0435"],"vs/editor/contrib/peekView/peekView":["\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439 \u043E \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0438 \u043C\u0430\u0441\u0441\u0438\u0432\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0443\u0437\u043B\u043E\u0432 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0443\u0437\u043B\u043E\u0432 \u0444\u0430\u0439\u043B\u0430 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u044F \u0432 \u043E\u043A\u043D\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u0432 \u0431\u044B\u0441\u0442\u0440\u043E\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435."],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["\u0427\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0442\u0440\u043E\u043A\u0435, \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043A \u0441\u0442\u0440\u043E\u043A\u0435 {0} \u0438 \u0441\u0442\u043E\u043B\u0431\u0446\u0443 {1}.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0442\u0440\u043E\u043A\u0435 {0}.","\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: {0}, \u0441\u0438\u043C\u0432\u043E\u043B: {1}. \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u043E\u043C\u0435\u0440 \u0441\u0442\u0440\u043E\u043A\u0438 \u043C\u0435\u0436\u0434\u0443 1 \u0438 {2} \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430.","\u0422\u0435\u043A\u0443\u0449\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: {0}, \u0441\u0438\u043C\u0432\u043E\u043B: {1}. \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u043E\u043C\u0435\u0440 \u0441\u0442\u0440\u043E\u043A\u0438 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u043E\u0434\u0430."],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["\u0427\u0442\u043E\u0431\u044B \u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u0438\u043C\u0432\u043E\u043B\u0443, \u0441\u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0441 \u0441\u0438\u043C\u0432\u043E\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0435\u0439.","\u0410\u043A\u0442\u0438\u0432\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043D\u0435 \u043F\u0440\u0435\u0434\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0438\u043C\u0432\u043E\u043B\u044C\u043D\u0443\u044E \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E.","\u041D\u0435\u0442 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0449\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041D\u0435\u0442 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0431\u043E\u043A\u0443","\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432\u043D\u0438\u0437\u0443","\u0441\u0438\u043C\u0432\u043E\u043B\u044B ({0})","\u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 ({0})","\u043C\u0435\u0442\u043E\u0434\u044B ({0})","\u0444\u0443\u043D\u043A\u0446\u0438\u0438 ({0})","\u043A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440\u044B ({0})","\u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435 ({0})","\u043A\u043B\u0430\u0441\u0441\u044B ({0})","\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u044B ({0})","\u0441\u043E\u0431\u044B\u0442\u0438\u044F ({0})","\u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u044B ({0})","\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044B ({0})","\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 \u0438\u043C\u0435\u043D ({0})","\u043F\u0430\u043A\u0435\u0442\u044B ({0})","\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0442\u0438\u043F\u0430 ({0})","\u043C\u043E\u0434\u0443\u043B\u0438 ({0})","\u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 ({0})","\u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F ({0})","\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0435\u043D\u0438\u044F ({0})","\u0441\u0442\u0440\u043E\u043A\u0438 ({0})","\u0444\u0430\u0439\u043B\u044B ({0})","\u043C\u0430\u0441\u0441\u0438\u0432\u044B ({0})","\u0447\u0438\u0441\u043B\u0430 ({0})","\u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F ({0})","\u043E\u0431\u044A\u0435\u043A\u0442\u044B ({0})","\u043A\u043B\u044E\u0447\u0438 ({0})","\u043F\u043E\u043B\u044F ({0})","\u043A\u043E\u043D\u0441\u0442\u0430\u043D\u0442\u044B ({0})"],"vs/editor/contrib/rename/rename":["\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442.","\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0438 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u043E\u0441\u043B\u0435 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F",'\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435 "{0}"',"\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435 {0}","\xAB{0}\xBB \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D \u0432 \xAB{1}\xBB. \u0421\u0432\u043E\u0434\u043A\u0430: {2}","\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0440\u0430\u0432\u043A\u0438","\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0438 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0432\u044B\u0447\u0438\u0441\u043B\u0438\u0442\u044C \u043F\u0440\u0430\u0432\u043A\u0438","\u041F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B","\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C/\u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u044C \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439 \u043F\u0435\u0440\u0435\u0434 \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435\u043C"],"vs/editor/contrib/rename/renameInputField":["\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043D\u043E\u0432\u043E\u0435 \u0438\u043C\u044F \u0434\u043B\u044F \u0432\u0445\u043E\u0434\u043D\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445 \u0438 \u043D\u0430\u0436\u043C\u0438\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0443 \u0412\u0412\u041E\u0414 \u0434\u043B\u044F \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F.","\u041D\u0430\u0436\u043C\u0438\u0442\u0435 {0} \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u044F, {1} \u0434\u043B\u044F \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430."],"vs/editor/contrib/smartSelect/smartSelect":["\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442","&&\u0420\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435","\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442","&&\u0421\u0436\u0430\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435"],"vs/editor/contrib/snippet/snippetVariables":["\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435","\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A","\u0432\u0442\u043E\u0440\u043D\u0438\u043A","\u0441\u0440\u0435\u0434\u0430","\u0447\u0435\u0442\u0432\u0435\u0440\u0433","\u043F\u044F\u0442\u043D\u0438\u0446\u0430","\u0441\u0443\u0431\u0431\u043E\u0442\u0430","\u0412\u0441","\u041F\u043D","\u0412\u0442","\u0421\u0440","\u0427\u0442","\u041F\u0442","\u0421\u0431","\u042F\u043D\u0432\u0430\u0440\u044C","\u0424\u0435\u0432\u0440\u0430\u043B\u044C","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440\u0435\u043B\u044C","\u041C\u0430\u0439","\u0418\u044E\u043D\u044C","\u0418\u044E\u043B\u044C","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C","\u041E\u043A\u0442\u044F\u0431\u0440\u044C","\u041D\u043E\u044F\u0431\u0440\u044C","\u0414\u0435\u043A\u0430\u0431\u0440\u044C","\u042F\u043D\u0432","\u0424\u0435\u0432","\u041C\u0430\u0440","\u0410\u043F\u0440","\u041C\u0430\u0439","\u0418\u044E\u043D","\u0418\u044E\u043B","\u0410\u0432\u0433","\u0421\u0435\u043D","\u041E\u043A\u0442","\u041D\u043E\u044F","\u0414\u0435\u043A"],"vs/editor/contrib/suggest/suggestController":['\u041F\u0440\u0438\u043D\u044F\u0442\u0438\u0435 "{0}" \u043F\u0440\u0438\u0432\u0435\u043B\u043E \u043A \u0432\u043D\u0435\u0441\u0435\u043D\u0438\u044E \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u0440\u0430\u0432\u043E\u043A ({1})',"\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0435","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C","\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C","\u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043C\u0435\u043D\u044C\u0448\u0435","\u043F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435","\u0421\u0431\u0440\u043E\u0441 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F"],"vs/editor/contrib/suggest/suggestWidget":["\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430...","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442.","{0}, \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u044B: {1}","\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0438\u0442\u044C"],"vs/editor/contrib/suggest/suggestWidgetDetails":["\u0417\u0430\u043A\u0440\u044B\u0442\u044C","\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439 \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043C\u0430\u0441\u0441\u0438\u0432\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u043B\u043E\u0433\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043B\u0430\u0441\u0441\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0446\u0432\u0435\u0442\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043E\u043D\u0441\u0442\u0430\u043D\u0442\u044B. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0438\u0442\u0435\u043B\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0447\u043B\u0435\u043D\u0430 \u043F\u0435\u0440\u0435\u0447\u0438\u0441\u043B\u0438\u0442\u0435\u043B\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u043E\u0431\u044B\u0442\u0438\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u043E\u043B\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0444\u0430\u0439\u043B\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0430\u043F\u043A\u0438. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0444\u0443\u043D\u043A\u0446\u0438\u0438. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043B\u044E\u0447\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043A\u043B\u044E\u0447\u0435\u0432\u043E\u0433\u043E \u0441\u043B\u043E\u0432\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043C\u0435\u0442\u043E\u0434\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043C\u043E\u0434\u0443\u043B\u044F. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430 \u0438\u043C\u0435\u043D. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 NULL. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0447\u0438\u0441\u043B\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043E\u0431\u044A\u0435\u043A\u0442\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0430\u043A\u0435\u0442\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0441\u044B\u043B\u043A\u0438. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430 \u043A\u043E\u0434\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0442\u0440\u043E\u043A\u0438. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u044B. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0442\u0435\u043A\u0441\u0442\u0430. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0442\u0438\u043F\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0435\u0434\u0438\u043D\u0438\u0446. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439. \u042D\u0442\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435, \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0439."],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0430\u0435\u0442 \u0444\u043E\u043A\u0443\u0441.","\u041F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0444\u043E\u043A\u0443\u0441 \u043F\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0444\u043E\u043A\u0443\u0441","\u0422\u0435\u043F\u0435\u0440\u044C \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 TAB \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D \u0441\u0438\u043C\u0432\u043E\u043B \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438"],"vs/editor/contrib/tokenization/tokenization":["\u0420\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A: \u043F\u0440\u0438\u043D\u0443\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u0430\u044F \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u0442\u043E\u043A\u0435\u043D\u043E\u0432"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["\u041D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438","\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u043D\u044B \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438",`\u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u043E\u0434\u0438\u043D \u0438\u043B\u0438 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u043D\u0435\u043E\u0431\u044B\u0447\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0441\u0442\u0440\u043E\u043A (LS) \u0438\u043B\u0438 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0430\u0431\u0437\u0430\u0446\u0435\u0432 (PS).\r +\r +\u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u0438\u0445 \u0438\u0437 \u0444\u0430\u0439\u043B\u0430. \u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u044D\u0442\u0438\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043C\u043E\u0436\u043D\u043E \u043D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 "editor.unusualLineTerminators".`,"\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B","\u0418\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0443 \u0434\u043B\u044F \u044D\u0442\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u043D\u0430 \u0447\u0442\u0435\u043D\u0438\u0435, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043F\u0440\u0438 \u0447\u0442\u0435\u043D\u0438\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043D\u0430 \u0437\u0430\u043F\u0438\u0441\u044C, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440 \u043F\u0440\u0438 \u0437\u0430\u043F\u0438\u0441\u0438 \u0432 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u0443\u044E. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u043D\u0430 \u0447\u0442\u0435\u043D\u0438\u0435, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043F\u0440\u0438 \u0441\u0447\u0438\u0442\u044B\u0432\u0430\u043D\u0438\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u043D\u0430 \u0437\u0430\u043F\u0438\u0441\u044C, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043F\u0440\u0438 \u0437\u0430\u043F\u0438\u0441\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439. ","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043D\u0430 \u0437\u0430\u043F\u0438\u0441\u044C. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C\u0443 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432","\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u043C\u0443 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044E \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432","\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0438\u043B\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432"],"vs/editor/contrib/wordOperations/wordOperations":["\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u043B\u043E\u0432\u043E"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["\u041F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044F\u0437\u044B\u043A\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E","\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0445 \u0434\u043B\u044F \u044F\u0437\u044B\u043A\u0430.","\u042D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 \u0434\u043B\u044F \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0445 \u044F\u0437\u044B\u043A\u043E\u0432.","\u041D\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044F \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0443\u0441\u0442\u043E\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E",`\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C "{0}". \u041E\u043D\u043E \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0448\u0430\u0431\u043B\u043E\u043D\u0443 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430 '\\\\[.*\\\\]$' \u0434\u043B\u044F \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u043C\u044B\u0445 \u044F\u0437\u044B\u043A\u043E\u043C. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0443\u0447\u0430\u0441\u0442\u0438\u0435 configurationDefaults.`,'\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C "{0}". \u042D\u0442\u043E \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u043E \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043E.'],"vs/platform/contextkey/browser/contextKeyService":["\u041A\u043E\u043C\u0430\u043D\u0434\u0430, \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u044E\u0449\u0430\u044F \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u043E \u043A\u043B\u044E\u0447\u0430\u0445 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430"],"vs/platform/contextkey/common/contextkeys":["\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u043E\u043D\u043D\u0430\u044F \u0441\u0438\u0441\u0442\u0435\u043C\u0430 Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["\u0411\u044B\u043B\u0430 \u043D\u0430\u0436\u0430\u0442\u0430 \u043A\u043B\u0430\u0432\u0438\u0448\u0430 {0}. \u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043D\u0430\u0436\u0430\u0442\u0438\u044F \u0432\u0442\u043E\u0440\u043E\u0439 \u043A\u043B\u0430\u0432\u0438\u0448\u0438 \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u044F...","\u0421\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 ({0} \u0438 {1}) \u043D\u0435 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u0439."],"vs/platform/list/browser/listService":["\u0420\u0430\u0431\u043E\u0447\u0435\u0435 \u043C\u0435\u0441\u0442\u043E","\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 CTRL \u0432 Windows \u0438 Linux \u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 COMMAND \u0432 macOS.","\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 ALT \u0432 Windows \u0438 Linux \u0438 \u043A\u043B\u0430\u0432\u0438\u0448\u0435 OPTION \u0432 macOS.",'\u041C\u043E\u0434\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0432 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0438 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0432 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438 (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0432 \u043F\u0440\u043E\u0432\u043E\u0434\u043D\u0438\u043A\u0435, \u0432 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430\u0445 \u0438 \u0432 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0438 scm). \u0416\u0435\u0441\u0442\u044B \u043C\u044B\u0448\u0438 "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0431\u043E\u043A\u0443" (\u0435\u0441\u043B\u0438 \u043E\u043D\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0442\u0441\u044F) \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u0442\u0430\u043A\u0438\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C, \u0447\u0442\u043E\u0431\u044B \u043E\u043D\u0438 \u043D\u0435 \u043A\u043E\u043D\u0444\u043B\u0438\u043A\u0442\u043E\u0432\u0430\u043B\u0438 \u0441 \u043C\u043E\u0434\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u043C\u043D\u043E\u0436\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430.',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043A\u0430\u043A \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u0432 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0438 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438 (\u0435\u0441\u043B\u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F). \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435, \u0447\u0442\u043E \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043C\u043E\u0436\u0435\u0442 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0432 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0438 \u0441\u043F\u0438\u0441\u043A\u0430\u0445, \u0435\u0441\u043B\u0438 \u043E\u043D \u043D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u043A \u043D\u0438\u043C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044E\u0442 \u043B\u0438 \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0443\u044E \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0443 \u0441\u043F\u0438\u0441\u043A\u0438 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F \u043D\u0430 \u0440\u0430\u0431\u043E\u0447\u0435\u043C \u043C\u0435\u0441\u0442\u0435. \u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435! \u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u044D\u0442\u043E\u0433\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430 \u043C\u043E\u0436\u0435\u0442 \u043F\u043E\u0432\u043B\u0438\u044F\u0442\u044C \u043D\u0430 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043E\u0442\u0441\u0442\u0443\u043F \u0434\u043B\u044F \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043F\u0438\u043A\u0441\u0435\u043B\u044F\u0445.","\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u043D\u0443\u0436\u043D\u043E \u043B\u0438 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0435 \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u043B\u0430\u0432\u043D\u0430\u044F \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0430 \u0434\u043B\u044F \u0441\u043F\u0438\u0441\u043A\u043E\u0432 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432.","\u041F\u0440\u043E \u043F\u0440\u043E\u0441\u0442\u043E\u0439 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0432\u044B\u0431\u0438\u0440\u0430\u044E\u0442\u0441\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0432\u0432\u043E\u0434\u0438\u043C\u044B\u043C \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0434\u0430\u043D\u043D\u044B\u043C. \u0421\u043E\u043F\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043E\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u043E \u043F\u0440\u0435\u0444\u0438\u043A\u0441\u0430\u043C.","\u0424\u0443\u043D\u043A\u0446\u0438\u044F \u043F\u043E\u0434\u0441\u0432\u0435\u0442\u043A\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0432\u044B\u0434\u0435\u043B\u044F\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0432\u0432\u043E\u0434\u0438\u043C\u044B\u043C \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0434\u0430\u043D\u043D\u044B\u043C. \u041F\u0440\u0438 \u0434\u0430\u043B\u044C\u043D\u0435\u0439\u0448\u0435\u0439 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0440\u0445 \u0438 \u0432\u043D\u0438\u0437 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u0431\u0445\u043E\u0434 \u0442\u043E\u043B\u044C\u043A\u043E \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432.","\u0424\u0438\u043B\u044C\u0442\u0440 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u043E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u043E\u0432\u0430\u0442\u044C \u0438 \u0441\u043A\u0440\u044B\u0442\u044C \u0432\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u043D\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0432\u0432\u043E\u0434\u0438\u043C\u044B\u043C \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0434\u0430\u043D\u043D\u044B\u043C.","\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0441\u0442\u0438\u043B\u0435\u043C \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0434\u043B\u044F \u0441\u043F\u0438\u0441\u043A\u043E\u0432 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u0435\u0432 \u0432 Workbench. \u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u0440\u043E\u0441\u0442\u043E\u0439 \u0440\u0435\u0436\u0438\u043C, \u0440\u0435\u0436\u0438\u043C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0438 \u0440\u0435\u0436\u0438\u043C \u0444\u0438\u043B\u044C\u0442\u0440\u0430\u0446\u0438\u0438.",'\u0423\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442, \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u043B\u0438 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u0440\u043E\u0441\u0442\u044B\u043C \u0432\u0432\u043E\u0434\u043E\u043C. \u0415\u0441\u043B\u0438 \u0437\u0430\u0434\u0430\u043D\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 "false", \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F \u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u044B "list.toggleKeyboardNavigation", \u0434\u043B\u044F \u043A\u043E\u0442\u043E\u0440\u043E\u0439 \u043C\u043E\u0436\u043D\u043E \u043D\u0430\u0437\u043D\u0430\u0447\u0438\u0442\u044C \u0441\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448.',"\u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0435\u043C, \u043A\u0430\u043A \u043F\u0430\u043F\u043A\u0438 \u0434\u0435\u0440\u0435\u0432\u0430 \u0440\u0430\u0437\u0432\u043E\u0440\u0430\u0447\u0438\u0432\u0430\u044E\u0442\u0441\u044F \u043F\u0440\u0438 \u043D\u0430\u0436\u0430\u0442\u0438\u0438 \u043D\u0430 \u0438\u043C\u0435\u043D\u0430 \u043F\u0430\u043F\u043E\u043A. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435, \u0447\u0442\u043E \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043C\u043E\u0436\u0435\u0442 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0432 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u0438 \u0441\u043F\u0438\u0441\u043A\u0430\u0445, \u0435\u0441\u043B\u0438 \u043E\u043D \u043D\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u043A \u043D\u0438\u043C."],"vs/platform/markers/common/markers":["\u041E\u0448\u0438\u0431\u043A\u0430","\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435","\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","\u043D\u0435\u0434\u0430\u0432\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043D\u044B\u0435","\u0434\u0440\u0443\u0433\u0438\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B",'\u041A\u043E\u043C\u0430\u043D\u0434\u0430 "{0}" \u043F\u0440\u0438\u0432\u0435\u043B\u0430 \u043A \u043E\u0448\u0438\u0431\u043A\u0435 ({1})'],"vs/platform/quickinput/browser/helpQuickAccess":["\u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B","\u043A\u043E\u043C\u0430\u043D\u0434\u044B \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["\u041E\u0431\u0449\u0438\u0439 \u0446\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F, \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0435\u0433\u043E \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442.","\u041E\u0431\u0449\u0438\u0439 \u0446\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0430\u0445. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0435\u0433\u043E \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442.","\u0426\u0432\u0435\u0442 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u043E\u0432 \u043D\u0430 \u0440\u0430\u0431\u043E\u0447\u0435\u043C \u043C\u0435\u0441\u0442\u0435.","\u041E\u0431\u0449\u0438\u0439 \u0446\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0434\u043B\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0441 \u0444\u043E\u043A\u0443\u0441\u043E\u043C. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u0432 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0435.","\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u0432\u043E\u043A\u0440\u0443\u0433 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u043E\u0442\u0434\u0435\u043B\u044F\u0435\u0442 \u0438\u0445 \u043E\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0434\u043B\u044F \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u0430.","\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u0432\u043E\u043A\u0440\u0443\u0433 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u043E\u0442\u0434\u0435\u043B\u044F\u0435\u0442 \u0438\u0445 \u043E\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 \u0434\u043B\u044F \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0441\u044B\u043B\u043E\u043A \u0432 \u0442\u0435\u043A\u0441\u0442\u0435.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0432 \u0442\u0435\u043A\u0441\u0442\u0435.",'\u0426\u0432\u0435\u0442 \u0442\u0435\u043D\u0438 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A "\u041D\u0430\u0439\u0442\u0438/\u0437\u0430\u043C\u0435\u043D\u0438\u0442\u044C".',"\u0424\u043E\u043D \u043F\u043E\u043B\u044F \u0432\u0432\u043E\u0434\u0430.","\u041F\u0435\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u043B\u0430\u043D \u043F\u043E\u043B\u044F \u0432\u0432\u043E\u0434\u0430.","\u0413\u0440\u0430\u043D\u0438\u0446\u0430 \u043F\u043E\u043B\u044F \u0432\u0432\u043E\u0434\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0432 \u043F\u043E\u043B\u044F\u0445 \u0432\u0432\u043E\u0434\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0432 \u043F\u043E\u043B\u044F\u0445 \u0432\u0432\u043E\u0434\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u0432 \u043F\u043E\u043B\u044F\u0445 \u0432\u0432\u043E\u0434\u0430.",'\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u0421\u0432\u0435\u0434\u0435\u043D\u0438\u044F".','\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u0421\u0432\u0435\u0434\u0435\u043D\u0438\u044F".','\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u0421\u0432\u0435\u0434\u0435\u043D\u0438\u044F".','\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435".','\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435".','\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0435".','\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041E\u0448\u0438\u0431\u043A\u0430".','\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041E\u0448\u0438\u0431\u043A\u0430".','\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0435\u0440\u044C\u0435\u0437\u043D\u043E\u0441\u0442\u0438 "\u041E\u0448\u0438\u0431\u043A\u0430".',"\u0424\u043E\u043D \u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E\u0441\u044F \u0441\u043F\u0438\u0441\u043A\u0430.","\u041F\u0435\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u043B\u0430\u043D \u0440\u0430\u0441\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E\u0441\u044F \u0441\u043F\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0431\u044D\u0434\u0436\u0430. \u0411\u044D\u0434\u0436\u0438 - \u043D\u0435\u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0449\u0438\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430 \u0431\u044D\u0434\u0436\u0430. \u0411\u044D\u0434\u0436\u0438 - \u043D\u0435\u0431\u043E\u043B\u044C\u0448\u0438\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B, \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u044E\u0449\u0438\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043D\u0438 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043B\u044C\u0441\u0442\u0432\u0443\u0435\u0442 \u043E \u0442\u043E\u043C, \u0447\u0442\u043E \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438 \u043F\u0440\u0438 \u0449\u0435\u043B\u0447\u043A\u0435 \u043F\u043E \u043D\u0435\u043C\u0443.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0438\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440\u0430 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043C\u043E\u0436\u0435\u0442 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u043E\u0448\u0438\u0431\u043A\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0432\u043E\u043B\u043D\u0438\u0441\u0442\u043E\u0439 \u043B\u0438\u043D\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043E\u0448\u0438\u0431\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043E\u043A\u043E\u043D \u043E\u0448\u0438\u0431\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0432\u043E\u043B\u043D\u0438\u0441\u0442\u043E\u0439 \u043B\u0438\u043D\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043E\u043A\u043E\u043D \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0432\u043E\u043B\u043D\u0438\u0441\u0442\u043E\u0439 \u043B\u0438\u043D\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u044B\u0445 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043E\u043A\u043E\u043D \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0432\u043E\u043B\u043D\u0438\u0441\u0442\u043E\u0439 \u043B\u0438\u043D\u0438\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043E\u043A \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u043E\u043A\u043E\u043D \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u043E\u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A \u043D\u0430\u0439\u0442\u0438/\u0437\u0430\u043C\u0435\u043D\u0438\u0442\u044C.",'\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A "\u041F\u043E\u0438\u0441\u043A/\u0437\u0430\u043C\u0435\u043D\u0430".',"\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u0443 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0435\u0441\u0442\u044C \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u0438 \u0435\u0441\u043B\u0438 \u044D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043F\u0430\u043D\u0435\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430. \u042D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0435, \u0435\u0441\u043B\u0438 \u0443 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0435\u0441\u0442\u044C \u0433\u0440\u0430\u043D\u0438\u0446\u0430 \u0434\u043B\u044F \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u0438 \u0435\u0441\u043B\u0438 \u044D\u0442\u043E\u0442 \u0446\u0432\u0435\u0442 \u043D\u0435 \u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430. \u041C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u043E\u043C \u0434\u043B\u044F \u0442\u0430\u043A\u0438\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0432\u044B\u0431\u043E\u0440\u0430, \u043A\u0430\u043A \u043F\u0430\u043B\u0438\u0442\u0440\u0430 \u043A\u043E\u043C\u0430\u043D\u0434.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430. \u041C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u043E\u043C \u0434\u043B\u044F \u0442\u0430\u043A\u0438\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0432\u044B\u0431\u043E\u0440\u0430, \u043A\u0430\u043A \u043F\u0430\u043B\u0438\u0442\u0440\u0430 \u043A\u043E\u043C\u0430\u043D\u0434.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430. \u041C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u043E\u043C \u0434\u043B\u044F \u0442\u0430\u043A\u0438\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0432\u044B\u0431\u043E\u0440\u0430, \u043A\u0430\u043A \u043F\u0430\u043B\u0438\u0442\u0440\u0430 \u043A\u043E\u043C\u0430\u043D\u0434.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0434\u043B\u044F \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0444\u043E\u043A\u0443\u0441.","\u0426\u0432\u0435\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0434\u043B\u044F \u0433\u0440\u0443\u043F\u043F\u0438\u0440\u043E\u0432\u043A\u0438 \u043C\u0435\u0442\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0434\u043B\u044F \u0433\u0440\u0443\u043F\u043F\u0438\u0440\u043E\u0432\u043A\u0438 \u0433\u0440\u0430\u043D\u0438\u0446.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 \u0432\u044B\u0441\u043E\u043A\u043E\u0433\u043E \u043A\u043E\u043D\u0442\u0440\u0430\u0441\u0442\u0430.","\u0426\u0432\u0435\u0442 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0434\u043B\u044F \u043E\u0431\u043B\u0430\u0441\u0442\u0435\u0439, \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442 \u0441 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u043C \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u043E\u043C. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0440\u0435\u0433\u0438\u043E\u043D\u043E\u0432 \u0441 \u0442\u0435\u043C \u0436\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u044B\u043C, \u0447\u0442\u043E \u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0438.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u043F\u043E\u0438\u0441\u043A\u0430 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0430, \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043F\u043E\u0438\u0441\u043A. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E\u0438\u0441\u043A\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\u0430, \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043F\u043E\u0438\u0441\u043A. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043F\u043E\u0434 \u0441\u043B\u043E\u0432\u043E\u043C, \u0434\u043B\u044F \u043A\u043E\u0442\u043E\u0440\u043E\u0433\u043E \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044F \u043C\u0435\u043D\u044E \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u044F \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F \u043D\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0438 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0435.","\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u0441\u0441\u044B\u043B\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u0439","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043C\u0435\u043D\u044E \u043B\u0430\u043C\u043F\u043E\u0447\u043A\u0438.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0432 \u043C\u0435\u043D\u044E \u043B\u0430\u043C\u043F\u043E\u0447\u043A\u0438.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u0434\u043B\u044F \u0443\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u043C\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043C\u044F \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u043C\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430\u043C\u0438.","\u0426\u0432\u0435\u0442 \u0434\u0438\u0430\u0433\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0439 \u0437\u0430\u043B\u0438\u0432\u043A\u0438 \u0434\u043B\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439. \u0414\u0438\u0430\u0433\u043E\u043D\u0430\u043B\u044C\u043D\u0430\u044F \u0437\u0430\u043B\u0438\u0432\u043A\u0430 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0432 \u0440\u0430\u0437\u043C\u0435\u0449\u0430\u0435\u043C\u044B\u0445 \u0440\u044F\u0434\u043E\u043C \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F\u0445 \u043D\u0435\u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C\xA0\u2014 \u043D\u0435\u0442.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u2014 \u043D\u0435\u0442.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u043D\u0430\u0445\u043E\u0434\u044F\u0449\u0435\u0433\u043E\u0441\u044F \u0432 \u0444\u043E\u043A\u0443\u0441\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430 List/Tree, \u043A\u043E\u0433\u0434\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 List/Tree \u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u0435\u043D. \u041D\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0435 List/Tree \u0435\u0441\u0442\u044C \u0444\u043E\u043A\u0443\u0441 \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044B, \u043D\u0430 \u043D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C\xA0\u2014 \u043D\u0435\u0442.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 List/Tree \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 List/Tree \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043C\u044B\u0448\u0438.","\u0424\u043E\u043D\u043E\u0432\u044B\u0439 \u0446\u0432\u0435\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432 List/Tree \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0438 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043C\u044B\u0448\u0438.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044F \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435 \u043F\u043E \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0443 List/Tree.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0438\u043B\u044C\u0442\u0440\u0430 \u0442\u0438\u043F\u043E\u0432 \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u0434\u043B\u044F \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0438\u043B\u044C\u0442\u0440\u0430 \u0442\u0438\u043F\u043E\u0432 \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445.","\u0426\u0432\u0435\u0442 \u043A\u043E\u043D\u0442\u0443\u0440\u0430 \u0434\u043B\u044F \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0444\u0438\u043B\u044C\u0442\u0440\u0430 \u0442\u0438\u043F\u043E\u0432 \u0432 \u0441\u043F\u0438\u0441\u043A\u0430\u0445 \u0438 \u0434\u0435\u0440\u0435\u0432\u044C\u044F\u0445 \u043F\u0440\u0438 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0448\u0442\u0440\u0438\u0445\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043B\u044F \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u0426\u0432\u0435\u0442 \u0448\u0442\u0440\u0438\u0445\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043B\u044F \u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0449\u0438\u0445 \u043E\u0442\u0441\u0442\u0443\u043F\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u043F\u0443\u043D\u043A\u0442\u043E\u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u0443\u043D\u043A\u0442\u043E\u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u043F\u0435\u0440\u0435\u0434\u043D\u0435\u0433\u043E \u043F\u043B\u0430\u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0443\u043D\u043A\u0442\u0430 \u043C\u0435\u043D\u044E \u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0434\u043B\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0443\u043D\u043A\u0442\u0430 \u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043B\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0443\u043D\u043A\u0442\u0430 \u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044F \u043C\u0435\u043D\u044E \u0432 \u043C\u0435\u043D\u044E.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430.","\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430.","\u0412\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0446\u0432\u0435\u0442\u043E\u043C \u0433\u0440\u0430\u043D\u0438\u0446\u044B \u0432 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0438\u0438 \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439 \u043F\u0440\u0438 \u043F\u043E\u0438\u0441\u043A\u0435. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u041C\u0430\u0440\u043A\u0435\u0440 \u043E\u0431\u0437\u043E\u0440\u043D\u043E\u0439 \u043B\u0438\u043D\u0435\u0439\u043A\u0438 \u0434\u043B\u044F \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430. \u0426\u0432\u0435\u0442 \u043D\u0435 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0440\u043E\u0437\u0440\u0430\u0447\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043A\u0440\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0438\u0436\u0435 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u044F.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u0432\u044B\u0431\u043E\u0440\u0430 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u043E\u0448\u0438\u0431\u043E\u043A.","\u0426\u0432\u0435\u0442 \u043C\u0430\u0440\u043A\u0435\u0440\u0430 \u043C\u0438\u043D\u0438\u043A\u0430\u0440\u0442\u044B \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0435\u043D\u0438\u0439.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438 \u043D\u0430 \u043D\u0435\u0433\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u044F.","\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430 \u043F\u043E\u043B\u0437\u0443\u043D\u043A\u0430 \u043C\u0438\u043D\u0438-\u043A\u0430\u0440\u0442\u044B \u043F\u0440\u0438 \u0435\u0433\u043E \u0449\u0435\u043B\u0447\u043A\u0435.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0437\u043D\u0430\u0447\u043A\u0430 \u043E\u0448\u0438\u0431\u043A\u0438, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043D\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u0443\u043F\u0440\u0435\u0436\u0434\u0430\u044E\u0449\u0435\u0433\u043E \u0437\u043D\u0430\u0447\u043A\u0430, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043D\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C.","\u0426\u0432\u0435\u0442, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0439 \u0434\u043B\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u043A\u0430, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u043D\u0430 \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C."],"vs/platform/theme/common/iconRegistry":["\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0433\u043E \u0448\u0440\u0438\u0444\u0442\u0430. \u0415\u0441\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u043D\u0435 \u0437\u0430\u0434\u0430\u043D, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u0448\u0440\u0438\u0444\u0442, \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u043F\u0435\u0440\u0432\u044B\u043C.","\u0421\u0438\u043C\u0432\u043E\u043B \u0448\u0440\u0438\u0444\u0442\u0430, \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0439 \u0441 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u043C \u0437\u043D\u0430\u0447\u043A\u0430.","\u0417\u043D\u0430\u0447\u043E\u043A \u0434\u043B\u044F \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F \u0432 \u043C\u0438\u043D\u0438-\u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F\u0445."],"vs/platform/undoRedo/common/undoRedoService":["\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B \u0431\u044B\u043B\u0438 \u0437\u0430\u043A\u0440\u044B\u0442\u044B \u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u043D\u0430 \u0434\u0438\u0441\u043A\u0435: {0}.","\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B \u0431\u044B\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B \u043D\u0435\u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C: {0}.",'\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432. {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432. {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0431\u044B\u043B\u0438 \u0432\u043D\u0435\u0441\u0435\u043D\u044B \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0432 {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0432 {1} \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u043B\u0430\u0441\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F','\u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432?',"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u0444\u0430\u0439\u043B\u0430\u0445 ({0})","\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u044D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B","\u041E\u0442\u043C\u0435\u043D\u0430",'\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}", \u0442\u0430\u043A \u043A\u0430\u043A \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F','\u0412\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C "{0}"?',"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C","\u041E\u0442\u043C\u0435\u043D\u0430",'\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432. {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432. {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044E "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0431\u044B\u043B\u0438 \u0432\u043D\u0435\u0441\u0435\u043D\u044B \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0432 {1}','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0434\u043B\u044F {1} \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F.','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}" \u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043B\u043E\u0432, \u0442\u0430\u043A \u043A\u0430\u043A \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u043B\u0430\u0441\u044C \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F','\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 "{0}", \u0442\u0430\u043A \u043A\u0430\u043A \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0442\u043C\u0435\u043D\u044B \u0438\u043B\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F']}); diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ru.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ru.js.gz new file mode 100644 index 0000000..52d15ec Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.ru.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-cn.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-cn.js new file mode 100644 index 0000000..036ba6b --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-cn.js @@ -0,0 +1,8 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.zh-cn",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["\u8F93\u5165"],"vs/base/browser/ui/findinput/findInputCheckboxes":["\u533A\u5206\u5927\u5C0F\u5199","\u5168\u5B57\u5339\u914D","\u4F7F\u7528\u6B63\u5219\u8868\u8FBE\u5F0F"],"vs/base/browser/ui/findinput/replaceInput":["\u8F93\u5165","\u4FDD\u7559\u5927\u5C0F\u5199"],"vs/base/browser/ui/iconLabel/iconLabel":["\u6B63\u5728\u52A0\u8F7D\u2026"],"vs/base/browser/ui/inputbox/inputBox":["\u9519\u8BEF: {0}","\u8B66\u544A: {0}","\u4FE1\u606F: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\u672A\u7ED1\u5B9A"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["\u6E05\u9664","\u7981\u7528\u8F93\u5165\u65F6\u7B5B\u9009","\u542F\u7528\u8F93\u5165\u65F6\u7B5B\u9009","\u672A\u627E\u5230\u5143\u7D20","\u5DF2\u5339\u914D {0} \u4E2A\u5143\u7D20(\u5171 {1} \u4E2A)"],"vs/base/common/actions":["(\u7A7A)"],"vs/base/common/errorMessage":["{0}: {1}","\u53D1\u751F\u4E86\u7CFB\u7EDF\u9519\u8BEF ({0})","\u51FA\u73B0\u672A\u77E5\u9519\u8BEF\u3002\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u8BF7\u53C2\u9605\u65E5\u5FD7\u3002","\u51FA\u73B0\u672A\u77E5\u9519\u8BEF\u3002\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u8BF7\u53C2\u9605\u65E5\u5FD7\u3002","{0} \u4E2A(\u5171 {1} \u4E2A\u9519\u8BEF)","\u51FA\u73B0\u672A\u77E5\u9519\u8BEF\u3002\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u8BF7\u53C2\u9605\u65E5\u5FD7\u3002"],"vs/base/common/keybindingLabels":["Ctrl","Shift","Alt","Windows","Ctrl","Shift","Alt","\u8D85\u952E","Control","Shift","Alt","Command","Control","Shift","Alt","Windows","Control","Shift","Alt","\u8D85\u952E"],"vs/base/parts/quickinput/browser/quickInput":["\u4E0A\u4E00\u6B65","{0}/{1}","\u5728\u6B64\u8F93\u5165\u53EF\u7F29\u5C0F\u7ED3\u679C\u8303\u56F4\u3002","{0} \u4E2A\u7ED3\u679C","\u5DF2\u9009 {0} \u9879","\u786E\u5B9A","\u81EA\u5B9A\u4E49","\u540E\u9000 ({0})","\u4E0A\u4E00\u6B65"],"vs/base/parts/quickinput/browser/quickInputList":["\u5FEB\u901F\u8F93\u5165"],"vs/editor/browser/controller/coreCommands":["\u5373\u4F7F\u8F6C\u5230\u8F83\u957F\u7684\u884C\uFF0C\u4E5F\u4E00\u76F4\u5230\u672B\u5C3E","\u5373\u4F7F\u8F6C\u5230\u8F83\u957F\u7684\u884C\uFF0C\u4E5F\u4E00\u76F4\u5230\u672B\u5C3E"],"vs/editor/browser/controller/textAreaHandler":["\u7F16\u8F91\u5668","\u73B0\u5728\u65E0\u6CD5\u8BBF\u95EE\u7F16\u8F91\u5668\u3002\u6309 {0} \u83B7\u53D6\u9009\u9879\u3002"],"vs/editor/browser/core/keybindingCancellation":["Whether the editor runs a cancellable operation, e.g. like 'Peek References'"],"vs/editor/browser/editorExtensions":["\u64A4\u6D88(&&U)","\u64A4\u6D88","\u6062\u590D(&&R)","\u6062\u590D","\u5168\u9009(&&S)","\u9009\u62E9\u5168\u90E8"],"vs/editor/browser/widget/codeEditorWidget":["\u5149\u6807\u6570\u91CF\u88AB\u9650\u5236\u4E3A {0}\u3002"],"vs/editor/browser/widget/diffEditorWidget":["\u5DEE\u5F02\u7F16\u8F91\u5668\u4E2D\u63D2\u5165\u9879\u7684\u7EBF\u6761\u4FEE\u9970\u3002","\u5DEE\u5F02\u7F16\u8F91\u5668\u4E2D\u5220\u9664\u9879\u7684\u7EBF\u6761\u4FEE\u9970\u3002","\u6587\u4EF6\u8FC7\u5927\uFF0C\u65E0\u6CD5\u6BD4\u8F83\u3002"],"vs/editor/browser/widget/diffReview":["\u5DEE\u5F02\u8BC4\u5BA1\u4E2D\u7684\u201C\u63D2\u5165\u201D\u56FE\u6807\u3002","\u5DEE\u5F02\u8BC4\u5BA1\u4E2D\u7684\u201C\u5220\u9664\u201D\u56FE\u6807\u3002","\u5DEE\u5F02\u8BC4\u5BA1\u4E2D\u7684\u201C\u5173\u95ED\u201D\u56FE\u6807\u3002","\u5173\u95ED","\u672A\u66F4\u6539\u884C","\u66F4\u6539\u4E86 1 \u884C","\u66F4\u6539\u4E86 {0} \u884C","\u5DEE\u5F02 {0}/ {1}: \u539F\u59CB\u884C {2}\uFF0C{3}\uFF0C\u4FEE\u6539\u540E\u7684\u884C {4}\uFF0C{5}","\u7A7A\u767D","{0} \u672A\u66F4\u6539\u7684\u884C {1}","{0}\u539F\u59CB\u884C{1}\u4FEE\u6539\u7684\u884C{2}","+ {0}\u4FEE\u6539\u7684\u884C{1}","- {0}\u539F\u59CB\u884C{1}","\u8F6C\u81F3\u4E0B\u4E00\u4E2A\u5DEE\u5F02","\u8F6C\u81F3\u4E0A\u4E00\u4E2A\u5DEE\u5F02"],"vs/editor/browser/widget/inlineDiffMargin":["\u590D\u5236\u5DF2\u5220\u9664\u7684\u884C","\u590D\u5236\u5DF2\u5220\u9664\u7684\u884C","\u590D\u5236\u5DF2\u5220\u9664\u7684\u884C({0})","\u8FD8\u539F\u6B64\u66F4\u6539","\u590D\u5236\u5DF2\u5220\u9664\u7684\u884C({0})"],"vs/editor/common/config/commonEditorConfig":["\u7F16\u8F91\u5668","\u4E00\u4E2A\u5236\u8868\u7B26\u7B49\u4E8E\u7684\u7A7A\u683C\u6570\u3002\u5728 `#editor.detectIndentation#` \u542F\u7528\u65F6\uFF0C\u6839\u636E\u6587\u4EF6\u5185\u5BB9\uFF0C\u8BE5\u8BBE\u7F6E\u53EF\u80FD\u4F1A\u88AB\u8986\u76D6\u3002","\u6309 `Tab` \u952E\u65F6\u63D2\u5165\u7A7A\u683C\u3002\u8BE5\u8BBE\u7F6E\u5728 `#editor.detectIndentation#` \u542F\u7528\u65F6\u6839\u636E\u6587\u4EF6\u5185\u5BB9\u53EF\u80FD\u4F1A\u88AB\u8986\u76D6\u3002","\u63A7\u5236\u662F\u5426\u5728\u6253\u5F00\u6587\u4EF6\u65F6\uFF0C\u57FA\u4E8E\u6587\u4EF6\u5185\u5BB9\u81EA\u52A8\u68C0\u6D4B `#editor.tabSize#` \u548C `#editor.insertSpaces#`\u3002","\u5220\u9664\u81EA\u52A8\u63D2\u5165\u7684\u5C3E\u968F\u7A7A\u767D\u7B26\u53F7\u3002","\u5BF9\u5927\u578B\u6587\u4EF6\u8FDB\u884C\u7279\u6B8A\u5904\u7406\uFF0C\u7981\u7528\u67D0\u4E9B\u5185\u5B58\u5BC6\u96C6\u578B\u529F\u80FD\u3002","\u63A7\u5236\u662F\u5426\u6839\u636E\u6587\u6863\u4E2D\u7684\u6587\u5B57\u8BA1\u7B97\u81EA\u52A8\u5B8C\u6210\u5217\u8868\u3002","\u4EC5\u5EFA\u8BAE\u6D3B\u52A8\u6587\u6863\u4E2D\u7684\u5B57\u8BCD\u3002","\u5EFA\u8BAE\u4F7F\u7528\u540C\u4E00\u8BED\u8A00\u7684\u6240\u6709\u6253\u5F00\u7684\u6587\u6863\u4E2D\u7684\u5B57\u8BCD\u3002","\u5EFA\u8BAE\u6240\u6709\u6253\u5F00\u7684\u6587\u6863\u4E2D\u7684\u5B57\u8BCD\u3002","\u63A7\u5236\u901A\u8FC7\u4EC0\u4E48\u6587\u6863\u8BA1\u7B97\u57FA\u4E8E\u5B57\u8BCD\u7684\u5B8C\u6210\u6570\u3002","\u5BF9\u6240\u6709\u989C\u8272\u4E3B\u9898\u542F\u7528\u8BED\u4E49\u7A81\u51FA\u663E\u793A\u3002","\u5BF9\u6240\u6709\u989C\u8272\u4E3B\u9898\u7981\u7528\u8BED\u4E49\u7A81\u51FA\u663E\u793A\u3002",'\u8BED\u4E49\u7A81\u51FA\u663E\u793A\u662F\u7531\u5F53\u524D\u989C\u8272\u4E3B\u9898\u7684 "semanticHighlighting" \u8BBE\u7F6E\u914D\u7F6E\u7684\u3002',"\u63A7\u5236\u662F\u5426\u4E3A\u652F\u6301\u5B83\u7684\u8BED\u8A00\u663E\u793A\u8BED\u4E49\u7A81\u51FA\u663E\u793A\u3002","\u5728\u901F\u89C8\u7F16\u8F91\u5668\u4E2D\uFF0C\u5373\u4F7F\u53CC\u51FB\u5176\u4E2D\u7684\u5185\u5BB9\u6216\u8005\u6309 `Esc` \u952E\uFF0C\u4E5F\u4FDD\u6301\u5176\u6253\u5F00\u72B6\u6001\u3002","\u7531\u4E8E\u6027\u80FD\u539F\u56E0\uFF0C\u8D85\u8FC7\u8FD9\u4E2A\u957F\u5EA6\u7684\u884C\u5C06\u4E0D\u4F1A\u88AB\u6807\u8BB0","\u8D85\u65F6(\u4EE5\u6BEB\u79D2\u4E3A\u5355\u4F4D)\uFF0C\u4E4B\u540E\u5C06\u53D6\u6D88\u5DEE\u5F02\u8BA1\u7B97\u3002\u4F7F\u75280\u8868\u793A\u6CA1\u6709\u8D85\u65F6\u3002","\u63A7\u5236\u5DEE\u5F02\u7F16\u8F91\u5668\u7684\u663E\u793A\u65B9\u5F0F\u662F\u5E76\u6392\u8FD8\u662F\u5185\u8054\u3002","\u542F\u7528\u540E\uFF0C\u5DEE\u5F02\u7F16\u8F91\u5668\u5C06\u5FFD\u7565\u524D\u5BFC\u7A7A\u683C\u6216\u5C3E\u968F\u7A7A\u683C\u4E2D\u7684\u66F4\u6539\u3002","\u63A7\u5236\u5DEE\u5F02\u7F16\u8F91\u5668\u662F\u5426\u4E3A\u6DFB\u52A0/\u5220\u9664\u7684\u66F4\u6539\u663E\u793A +/- \u6307\u793A\u7B26\u53F7\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u663E\u793A CodeLens\u3002","\u6C38\u4E0D\u6362\u884C\u3002","\u5C06\u5728\u89C6\u533A\u5BBD\u5EA6\u5904\u6362\u884C\u3002","\u5C06\u6839\u636E `#editor.wordWrap#` \u8BBE\u7F6E\u6362\u884C\u3002"],"vs/editor/common/config/editorOptions":["\u7F16\u8F91\u5668\u5C06\u4F7F\u7528\u5E73\u53F0 API \u4EE5\u68C0\u6D4B\u662F\u5426\u9644\u52A0\u4E86\u5C4F\u5E55\u9605\u8BFB\u5668\u3002","\u7F16\u8F91\u5668\u5C06\u9488\u5BF9\u4E0E\u5C4F\u5E55\u9605\u8BFB\u5668\u642D\u914D\u4F7F\u7528\u8FDB\u884C\u6C38\u4E45\u4F18\u5316\u3002\u5C06\u7981\u7528\u81EA\u52A8\u6362\u884C\u3002","\u7F16\u8F91\u5668\u5C06\u4E0D\u518D\u5BF9\u5C4F\u5E55\u9605\u8BFB\u5668\u7684\u4F7F\u7528\u8FDB\u884C\u4F18\u5316\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u5728\u5BF9\u5C4F\u5E55\u9605\u8BFB\u5668\u8FDB\u884C\u4E86\u4F18\u5316\u7684\u6A21\u5F0F\u4E0B\u8FD0\u884C\u3002\u8BBE\u7F6E\u4E3A\u201C\u5F00\u201D\u5C06\u7981\u7528\u81EA\u52A8\u6362\u884C\u3002","\u63A7\u5236\u5728\u6CE8\u91CA\u65F6\u662F\u5426\u63D2\u5165\u7A7A\u683C\u5B57\u7B26\u3002","\u63A7\u5236\u5728\u5BF9\u884C\u6CE8\u91CA\u6267\u884C\u5207\u6362\u3001\u6DFB\u52A0\u6216\u5220\u9664\u64CD\u4F5C\u65F6\uFF0C\u662F\u5426\u5E94\u5FFD\u7565\u7A7A\u884C\u3002","\u63A7\u5236\u5728\u6CA1\u6709\u9009\u62E9\u5185\u5BB9\u65F6\u8FDB\u884C\u590D\u5236\u662F\u5426\u590D\u5236\u5F53\u524D\u884C\u3002","\u63A7\u5236\u5728\u952E\u5165\u65F6\u5149\u6807\u662F\u5426\u5E94\u8DF3\u8F6C\u4EE5\u67E5\u627E\u5339\u914D\u9879\u3002","\u63A7\u5236\u662F\u5426\u5C06\u7F16\u8F91\u5668\u9009\u4E2D\u5185\u5BB9\u4F5C\u4E3A\u641C\u7D22\u8BCD\u586B\u5165\u5230\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u5207\u52FF\u81EA\u52A8\u6253\u5F00\u201C\u9009\u62E9\u4E2D\u67E5\u627E\u201D(\u9ED8\u8BA4)","\u59CB\u7EC8\u81EA\u52A8\u6253\u5F00\u201C\u5728\u9009\u62E9\u4E2D\u67E5\u627E\u201D","\u9009\u62E9\u591A\u884C\u5185\u5BB9\u65F6\uFF0C\u81EA\u52A8\u6253\u5F00\u201C\u5728\u9009\u62E9\u4E2D\u67E5\u627E\u201D\u3002","\u63A7\u5236\u5728\u6240\u9009\u5185\u5BB9\u4E2D\u81EA\u52A8\u5F00\u542F\u67E5\u627E\u7684\u6761\u4EF6\u3002","\u63A7\u5236\u201C\u67E5\u627E\u201D\u5C0F\u7EC4\u4EF6\u662F\u5426\u8BFB\u53D6\u6216\u4FEE\u6539 macOS \u7684\u5171\u4EAB\u67E5\u627E\u526A\u8D34\u677F\u3002",'\u63A7\u5236 "\u67E5\u627E\u5C0F\u90E8\u4EF6" \u662F\u5426\u5E94\u5728\u7F16\u8F91\u5668\u9876\u90E8\u6DFB\u52A0\u989D\u5916\u7684\u884C\u3002\u5982\u679C\u4E3A true, \u5219\u53EF\u4EE5\u5728 "\u67E5\u627E\u5C0F\u5DE5\u5177" \u53EF\u89C1\u65F6\u6EDA\u52A8\u5230\u7B2C\u4E00\u884C\u4E4B\u5916\u3002',"\u63A7\u5236\u5728\u627E\u4E0D\u5230\u5176\u4ED6\u5339\u914D\u9879\u65F6\uFF0C\u662F\u5426\u81EA\u52A8\u4ECE\u5F00\u5934(\u6216\u7ED3\u5C3E)\u91CD\u65B0\u5F00\u59CB\u641C\u7D22\u3002",'\u542F\u7528/\u7981\u7528\u5B57\u4F53\u8FDE\u5B57("calt" \u548C "liga" \u5B57\u4F53\u7279\u6027)\u3002\u5C06\u6B64\u66F4\u6539\u4E3A\u5B57\u7B26\u4E32\uFF0C\u53EF\u5BF9 "font-feature-settings" CSS \u5C5E\u6027\u8FDB\u884C\u7CBE\u7EC6\u63A7\u5236\u3002','\u663E\u5F0F "font-feature-settings" CSS \u5C5E\u6027\u3002\u5982\u679C\u53EA\u9700\u6253\u5F00/\u5173\u95ED\u8FDE\u5B57\uFF0C\u53EF\u4EE5\u6539\u4E3A\u4F20\u9012\u5E03\u5C14\u503C\u3002','\u914D\u7F6E\u5B57\u4F53\u8FDE\u5B57\u6216\u5B57\u4F53\u7279\u6027\u3002\u53EF\u4EE5\u662F\u7528\u4E8E\u542F\u7528/\u7981\u7528\u8FDE\u5B57\u7684\u5E03\u5C14\u503C\uFF0C\u6216\u7528\u4E8E\u8BBE\u7F6E CSS "font-feature-settings" \u5C5E\u6027\u503C\u7684\u5B57\u7B26\u4E32\u3002',"\u63A7\u5236\u5B57\u4F53\u5927\u5C0F(\u50CF\u7D20)\u3002","\u4EC5\u5141\u8BB8\u4F7F\u7528\u5173\u952E\u5B57\u201C\u6B63\u5E38\u201D\u548C\u201C\u52A0\u7C97\u201D\uFF0C\u6216\u4F7F\u7528\u4ECB\u4E8E 1 \u81F3 1000 \u4E4B\u95F4\u7684\u6570\u5B57\u3002","\u63A7\u5236\u5B57\u4F53\u7C97\u7EC6\u3002\u63A5\u53D7\u5173\u952E\u5B57\u201C\u6B63\u5E38\u201D\u548C\u201C\u52A0\u7C97\u201D\uFF0C\u6216\u8005\u63A5\u53D7\u4ECB\u4E8E 1 \u81F3 1000 \u4E4B\u95F4\u7684\u6570\u5B57\u3002","\u663E\u793A\u7ED3\u679C\u7684\u9884\u89C8\u89C6\u56FE (\u9ED8\u8BA4\u503C)","\u8F6C\u5230\u4E3B\u7ED3\u679C\u5E76\u663E\u793A\u9884\u89C8\u89C6\u56FE","\u8F6C\u5230\u4E3B\u7ED3\u679C\uFF0C\u5E76\u5BF9\u5176\u4ED6\u4EBA\u542F\u7528\u9632\u5077\u7AA5\u5BFC\u822A",'\u6B64\u8BBE\u7F6E\u5DF2\u5F03\u7528\uFF0C\u8BF7\u6539\u7528\u5355\u72EC\u7684\u8BBE\u7F6E\uFF0C\u5982"editor.editor.gotoLocation.multipleDefinitions"\u6216"editor.editor.gotoLocation.multipleImplementations"\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u5B9A\u4E49"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u7C7B\u578B\u5B9A\u4E49"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u58F0\u660E"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u5B9E\u73B0"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u63A7\u5236\u5B58\u5728\u591A\u4E2A\u76EE\u6807\u4F4D\u7F6E\u65F6"\u8F6C\u5230\u5F15\u7528"\u547D\u4EE4\u7684\u884C\u4E3A\u3002','\u5F53"\u8F6C\u5230\u5B9A\u4E49"\u7684\u7ED3\u679C\u4E3A\u5F53\u524D\u4F4D\u7F6E\u65F6\u5C06\u8981\u6267\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u7684 ID\u3002','\u5F53"\u8F6C\u5230\u7C7B\u578B\u5B9A\u4E49"\u7684\u7ED3\u679C\u662F\u5F53\u524D\u4F4D\u7F6E\u65F6\u6B63\u5728\u6267\u884C\u7684\u5907\u7528\u547D\u4EE4 ID\u3002','\u5F53"\u8F6C\u5230\u58F0\u660E"\u7684\u7ED3\u679C\u4E3A\u5F53\u524D\u4F4D\u7F6E\u65F6\u5C06\u8981\u6267\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u7684 ID\u3002','\u5F53"\u8F6C\u5230\u5B9E\u73B0"\u7684\u7ED3\u679C\u4E3A\u5F53\u524D\u4F4D\u7F6E\u65F6\u5C06\u8981\u6267\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u7684 ID\u3002','\u5F53"\u8F6C\u5230\u5F15\u7528"\u7684\u7ED3\u679C\u662F\u5F53\u524D\u4F4D\u7F6E\u65F6\u6B63\u5728\u6267\u884C\u7684\u66FF\u4EE3\u547D\u4EE4 ID\u3002',"\u63A7\u5236\u662F\u5426\u663E\u793A\u60AC\u505C\u63D0\u793A\u3002","\u63A7\u5236\u663E\u793A\u60AC\u505C\u63D0\u793A\u524D\u7684\u7B49\u5F85\u65F6\u95F4 (\u6BEB\u79D2)\u3002","\u63A7\u5236\u5F53\u9F20\u6807\u79FB\u52A8\u5230\u60AC\u505C\u63D0\u793A\u4E0A\u65F6\uFF0C\u5176\u662F\u5426\u4FDD\u6301\u53EF\u89C1\u3002","\u5728\u7F16\u8F91\u5668\u4E2D\u542F\u7528\u4EE3\u7801\u64CD\u4F5C\u5C0F\u706F\u6CE1\u63D0\u793A\u3002","\u5728\u7F16\u8F91\u5668\u4E2D\u542F\u7528\u5185\u8054\u63D0\u793A\u3002","\u5728\u7F16\u8F91\u5668\u4E2D\u63A7\u5236\u5185\u8054\u63D0\u793A\u7684\u5B57\u53F7\u3002\u8BBE\u7F6E\u4E3A `0` \u65F6\uFF0C\u5C06\u4F7F\u7528 `#editor.fontSize#` \u7684 90%\u3002","\u5728\u7F16\u8F91\u5668\u4E2D\u63A7\u5236\u5185\u8054\u63D0\u793A\u7684\u5B57\u4F53\u7CFB\u5217\u3002","\u63A7\u5236\u884C\u9AD8\u3002\u4E3A 0 \u65F6\u5219\u901A\u8FC7\u5B57\u4F53\u5927\u5C0F\u81EA\u52A8\u8BA1\u7B97\u3002","\u63A7\u5236\u662F\u5426\u663E\u793A\u7F29\u7565\u56FE\u3002","\u8FF7\u4F60\u5730\u56FE\u7684\u5927\u5C0F\u4E0E\u7F16\u8F91\u5668\u5185\u5BB9\u76F8\u540C(\u5E76\u4E14\u53EF\u80FD\u6EDA\u52A8)\u3002","\u8FF7\u4F60\u5730\u56FE\u5C06\u6839\u636E\u9700\u8981\u62C9\u4F38\u6216\u7F29\u5C0F\u4EE5\u586B\u5145\u7F16\u8F91\u5668\u7684\u9AD8\u5EA6(\u4E0D\u6EDA\u52A8)\u3002","\u8FF7\u4F60\u5730\u56FE\u5C06\u6839\u636E\u9700\u8981\u7F29\u5C0F\uFF0C\u6C38\u8FDC\u4E0D\u4F1A\u5927\u4E8E\u7F16\u8F91\u5668(\u4E0D\u6EDA\u52A8)\u3002","\u63A7\u5236\u8FF7\u4F60\u5730\u56FE\u7684\u5927\u5C0F\u3002","\u63A7\u5236\u5728\u54EA\u4E00\u4FA7\u663E\u793A\u7F29\u7565\u56FE\u3002","\u63A7\u5236\u4F55\u65F6\u663E\u793A\u8FF7\u4F60\u5730\u56FE\u6ED1\u5757\u3002","\u5728\u8FF7\u4F60\u5730\u56FE\u4E2D\u7ED8\u5236\u7684\u5185\u5BB9\u6BD4\u4F8B: 1\u30012 \u6216 3\u3002","\u6E32\u67D3\u6BCF\u884C\u7684\u5B9E\u9645\u5B57\u7B26\uFF0C\u800C\u4E0D\u662F\u8272\u5757\u3002","\u9650\u5236\u7F29\u7565\u56FE\u7684\u5BBD\u5EA6\uFF0C\u63A7\u5236\u5176\u6700\u591A\u663E\u793A\u7684\u5217\u6570\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u7684\u9876\u8FB9\u548C\u7B2C\u4E00\u884C\u4E4B\u95F4\u7684\u95F4\u8DDD\u91CF\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u7684\u5E95\u8FB9\u548C\u6700\u540E\u4E00\u884C\u4E4B\u95F4\u7684\u95F4\u8DDD\u91CF\u3002","\u5728\u8F93\u5165\u65F6\u663E\u793A\u542B\u6709\u53C2\u6570\u6587\u6863\u548C\u7C7B\u578B\u4FE1\u606F\u7684\u5C0F\u9762\u677F\u3002","\u63A7\u5236\u53C2\u6570\u63D0\u793A\u83DC\u5355\u5728\u5230\u8FBE\u5217\u8868\u672B\u5C3E\u65F6\u8FDB\u884C\u5FAA\u73AF\u8FD8\u662F\u5173\u95ED\u3002","\u5728\u5B57\u7B26\u4E32\u5185\u542F\u7528\u5FEB\u901F\u5EFA\u8BAE\u3002","\u5728\u6CE8\u91CA\u5185\u542F\u7528\u5FEB\u901F\u5EFA\u8BAE\u3002","\u5728\u5B57\u7B26\u4E32\u548C\u6CE8\u91CA\u5916\u542F\u7528\u5FEB\u901F\u5EFA\u8BAE\u3002","\u63A7\u5236\u662F\u5426\u5728\u952E\u5165\u65F6\u81EA\u52A8\u663E\u793A\u5EFA\u8BAE\u3002","\u4E0D\u663E\u793A\u884C\u53F7\u3002","\u5C06\u884C\u53F7\u663E\u793A\u4E3A\u7EDD\u5BF9\u884C\u6570\u3002","\u5C06\u884C\u53F7\u663E\u793A\u4E3A\u4E0E\u5149\u6807\u76F8\u9694\u7684\u884C\u6570\u3002","\u6BCF 10 \u884C\u663E\u793A\u4E00\u6B21\u884C\u53F7\u3002","\u63A7\u5236\u884C\u53F7\u7684\u663E\u793A\u3002","\u6B64\u7F16\u8F91\u5668\u6807\u5C3A\u5C06\u6E32\u67D3\u7684\u7B49\u5BBD\u5B57\u7B26\u6570\u3002","\u6B64\u7F16\u8F91\u5668\u6807\u5C3A\u7684\u989C\u8272\u3002","\u5728\u4E00\u5B9A\u6570\u91CF\u7684\u7B49\u5BBD\u5B57\u7B26\u540E\u663E\u793A\u5782\u76F4\u6807\u5C3A\u3002\u8F93\u5165\u591A\u4E2A\u503C\uFF0C\u663E\u793A\u591A\u4E2A\u6807\u5C3A\u3002\u82E5\u6570\u7EC4\u4E3A\u7A7A\uFF0C\u5219\u4E0D\u7ED8\u5236\u6807\u5C3A\u3002","\u63D2\u5165\u5EFA\u8BAE\u800C\u4E0D\u8986\u76D6\u5149\u6807\u53F3\u4FA7\u7684\u6587\u672C\u3002","\u63D2\u5165\u5EFA\u8BAE\u5E76\u8986\u76D6\u5149\u6807\u53F3\u4FA7\u7684\u6587\u672C\u3002","\u63A7\u5236\u63A5\u53D7\u8865\u5168\u65F6\u662F\u5426\u8986\u76D6\u5355\u8BCD\u3002\u8BF7\u6CE8\u610F\uFF0C\u8FD9\u53D6\u51B3\u4E8E\u6269\u5C55\u9009\u62E9\u4F7F\u7528\u6B64\u529F\u80FD\u3002","\u63A7\u5236\u5BF9\u5EFA\u8BAE\u7684\u7B5B\u9009\u548C\u6392\u5E8F\u662F\u5426\u8003\u8651\u5C0F\u7684\u62FC\u5199\u9519\u8BEF\u3002","\u63A7\u5236\u6392\u5E8F\u65F6\u662F\u5426\u63D0\u9AD8\u9760\u8FD1\u5149\u6807\u7684\u8BCD\u8BED\u7684\u4F18\u5148\u7EA7\u3002","\u63A7\u5236\u662F\u5426\u5728\u591A\u4E2A\u5DE5\u4F5C\u533A\u548C\u7A97\u53E3\u95F4\u5171\u4EAB\u8BB0\u5FC6\u7684\u5EFA\u8BAE\u9009\u9879(\u9700\u8981 `#editor.suggestSelection#`)\u3002","\u63A7\u5236\u6D3B\u52A8\u4EE3\u7801\u6BB5\u662F\u5426\u963B\u6B62\u5FEB\u901F\u5EFA\u8BAE\u3002","\u63A7\u5236\u662F\u5426\u5728\u5EFA\u8BAE\u4E2D\u663E\u793A\u6216\u9690\u85CF\u56FE\u6807\u3002","\u63A7\u5236\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u5E95\u90E8\u7684\u72B6\u6001\u680F\u7684\u53EF\u89C1\u6027\u3002","\u63A7\u5236\u5EFA\u8BAE\u8BE6\u7EC6\u4FE1\u606F\u662F\u968F\u6807\u7B7E\u4E00\u8D77\u663E\u793A\u8FD8\u662F\u4EC5\u663E\u793A\u5728\u8BE6\u7EC6\u4FE1\u606F\u5C0F\u7EC4\u4EF6\u4E2D","\u6B64\u8BBE\u7F6E\u5DF2\u5F03\u7528\u3002\u73B0\u5728\u53EF\u4EE5\u8C03\u6574\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u5927\u5C0F\u3002",'\u6B64\u8BBE\u7F6E\u5DF2\u5F03\u7528\uFF0C\u8BF7\u6539\u7528\u5355\u72EC\u7684\u8BBE\u7F6E\uFF0C\u5982"editor.suggest.showKeywords"\u6216"editor.suggest.showSnippets"\u3002',"\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u65B9\u6CD5\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u51FD\u6570\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6784\u9020\u51FD\u6570\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5B57\u6BB5\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u53D8\u91CF\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u7C7B\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u7ED3\u6784\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u63A5\u53E3\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6A21\u5757\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5C5E\u6027\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u4E8B\u4EF6\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u64CD\u4F5C\u7B26\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5355\u4F4D\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u503C\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5E38\u91CF\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u679A\u4E3E\u201D\u5EFA\u8BAE\u3002",'\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A "enumMember" \u5EFA\u8BAE\u3002',"\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u5173\u952E\u5B57\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6587\u672C\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u989C\u8272\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6587\u4EF6\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u53C2\u8003\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u81EA\u5B9A\u4E49\u989C\u8272\u201D\u5EFA\u8BAE\u3002","\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u6587\u4EF6\u5939\u201D\u5EFA\u8BAE\u3002",'\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A "typeParameter" \u5EFA\u8BAE\u3002',"\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A\u201C\u7247\u6BB5\u201D\u5EFA\u8BAE\u3002",'\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A"\u7528\u6237"\u5EFA\u8BAE\u3002','\u542F\u7528\u540E\uFF0CIntelliSense \u5C06\u663E\u793A"\u95EE\u9898"\u5EFA\u8BAE\u3002',"\u662F\u5426\u5E94\u59CB\u7EC8\u9009\u62E9\u524D\u5BFC\u548C\u5C3E\u968F\u7A7A\u683C\u3002","\u63A7\u5236\u662F\u5426\u5E94\u5728\u9047\u5230\u63D0\u4EA4\u5B57\u7B26\u65F6\u63A5\u53D7\u5EFA\u8BAE\u3002\u4F8B\u5982\uFF0C\u5728 JavaScript \u4E2D\uFF0C\u534A\u89D2\u5206\u53F7 (`;`) \u53EF\u4EE5\u4E3A\u63D0\u4EA4\u5B57\u7B26\uFF0C\u80FD\u591F\u5728\u63A5\u53D7\u5EFA\u8BAE\u7684\u540C\u65F6\u952E\u5165\u8BE5\u5B57\u7B26\u3002","\u4EC5\u5F53\u5EFA\u8BAE\u5305\u542B\u6587\u672C\u6539\u52A8\u65F6\u624D\u53EF\u4F7F\u7528 `Enter` \u952E\u8FDB\u884C\u63A5\u53D7\u3002","\u63A7\u5236\u9664\u4E86 `Tab` \u952E\u4EE5\u5916\uFF0C `Enter` \u952E\u662F\u5426\u540C\u6837\u53EF\u4EE5\u63A5\u53D7\u5EFA\u8BAE\u3002\u8FD9\u80FD\u51CF\u5C11\u201C\u63D2\u5165\u65B0\u884C\u201D\u548C\u201C\u63A5\u53D7\u5EFA\u8BAE\u201D\u547D\u4EE4\u4E4B\u95F4\u7684\u6B67\u4E49\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u4E2D\u53EF\u7531\u5C4F\u5E55\u9605\u8BFB\u5668\u8BFB\u53D6\u7684\u884C\u6570\u3002\u8B66\u544A: \u5BF9\u4E8E\u5927\u4E8E\u9ED8\u8BA4\u503C\u7684\u6570\u5B57\uFF0C\u8FD9\u4F1A\u5F71\u54CD\u6027\u80FD\u3002","\u7F16\u8F91\u5668\u5185\u5BB9","\u4F7F\u7528\u8BED\u8A00\u914D\u7F6E\u786E\u5B9A\u4F55\u65F6\u81EA\u52A8\u95ED\u5408\u62EC\u53F7\u3002","\u4EC5\u5F53\u5149\u6807\u4F4D\u4E8E\u7A7A\u767D\u5B57\u7B26\u5DE6\u4FA7\u65F6\uFF0C\u624D\u81EA\u52A8\u95ED\u5408\u62EC\u53F7\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5728\u5DE6\u62EC\u53F7\u540E\u81EA\u52A8\u63D2\u5165\u53F3\u62EC\u53F7\u3002","\u4EC5\u5728\u81EA\u52A8\u63D2\u5165\u65F6\u624D\u6539\u5199\u53F3\u5F15\u53F7\u6216\u53F3\u62EC\u53F7\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u6539\u5199\u53F3\u5F15\u53F7\u6216\u53F3\u62EC\u53F7\u3002","\u4F7F\u7528\u8BED\u8A00\u914D\u7F6E\u786E\u5B9A\u4F55\u65F6\u81EA\u52A8\u95ED\u5408\u5F15\u53F7\u3002","\u4EC5\u5F53\u5149\u6807\u4F4D\u4E8E\u7A7A\u767D\u5B57\u7B26\u5DE6\u4FA7\u65F6\uFF0C\u624D\u81EA\u52A8\u95ED\u5408\u5F15\u53F7\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5728\u5DE6\u5F15\u53F7\u540E\u81EA\u52A8\u63D2\u5165\u53F3\u5F15\u53F7\u3002","\u7F16\u8F91\u5668\u4E0D\u4F1A\u81EA\u52A8\u63D2\u5165\u7F29\u8FDB\u3002","\u7F16\u8F91\u5668\u5C06\u4FDD\u7559\u5F53\u524D\u884C\u7684\u7F29\u8FDB\u3002","\u7F16\u8F91\u5668\u5C06\u4FDD\u7559\u5F53\u524D\u884C\u7684\u7F29\u8FDB\u5E76\u9075\u5FAA\u8BED\u8A00\u5B9A\u4E49\u7684\u62EC\u53F7\u3002","\u7F16\u8F91\u5668\u5C06\u4FDD\u7559\u5F53\u524D\u884C\u7684\u7F29\u8FDB\u3001\u4F7F\u7528\u8BED\u8A00\u5B9A\u4E49\u7684\u62EC\u53F7\u5E76\u8C03\u7528\u8BED\u8A00\u5B9A\u4E49\u7684\u7279\u5B9A onEnterRules\u3002","\u7F16\u8F91\u5668\u5C06\u4FDD\u7559\u5F53\u524D\u884C\u7684\u7F29\u8FDB\uFF0C\u4F7F\u7528\u8BED\u8A00\u5B9A\u4E49\u7684\u62EC\u53F7\uFF0C\u8C03\u7528\u7531\u8BED\u8A00\u5B9A\u4E49\u7684\u7279\u6B8A\u8F93\u5165\u89C4\u5219\uFF0C\u5E76\u9075\u5FAA\u7531\u8BED\u8A00\u5B9A\u4E49\u7684\u7F29\u8FDB\u89C4\u5219\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u5728\u7528\u6237\u952E\u5165\u3001\u7C98\u8D34\u3001\u79FB\u52A8\u6216\u7F29\u8FDB\u884C\u65F6\u81EA\u52A8\u8C03\u6574\u7F29\u8FDB\u3002","\u4F7F\u7528\u8BED\u8A00\u914D\u7F6E\u786E\u5B9A\u4F55\u65F6\u81EA\u52A8\u5305\u4F4F\u6240\u9009\u5185\u5BB9\u3002","\u4F7F\u7528\u5F15\u53F7\u800C\u975E\u62EC\u53F7\u6765\u5305\u4F4F\u6240\u9009\u5185\u5BB9\u3002","\u4F7F\u7528\u62EC\u53F7\u800C\u975E\u5F15\u53F7\u6765\u5305\u4F4F\u6240\u9009\u5185\u5BB9\u3002","\u63A7\u5236\u5728\u952E\u5165\u5F15\u53F7\u6216\u65B9\u62EC\u53F7\u65F6\uFF0C\u7F16\u8F91\u5668\u662F\u5426\u5E94\u81EA\u52A8\u5C06\u6240\u9009\u5185\u5BB9\u62EC\u8D77\u6765\u3002","\u5728\u4F7F\u7528\u7A7A\u683C\u8FDB\u884C\u7F29\u8FDB\u65F6\u6A21\u62DF\u5236\u8868\u7B26\u7684\u9009\u62E9\u884C\u4E3A\u3002\u6240\u9009\u5185\u5BB9\u5C06\u59CB\u7EC8\u4F7F\u7528\u5236\u8868\u7B26\u505C\u6B62\u4F4D\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u663E\u793A CodeLens\u3002","\u63A7\u5236 CodeLens \u7684\u5B57\u4F53\u7CFB\u5217\u3002","\u63A7\u5236 CodeLens \u7684\u5B57\u4F53\u5927\u5C0F(\u50CF\u7D20)\u3002\u8BBE\u7F6E\u4E3A `0` \u65F6\uFF0C\u5C06\u4F7F\u7528 `#editor.fontSize#` \u7684 90%\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u663E\u793A\u5185\u8054\u989C\u8272\u4FEE\u9970\u5668\u548C\u989C\u8272\u9009\u53D6\u5668\u3002","\u542F\u7528\u4F7F\u7528\u9F20\u6807\u548C\u952E\u8FDB\u884C\u5217\u9009\u62E9\u3002","\u63A7\u5236\u5728\u590D\u5236\u65F6\u662F\u5426\u540C\u65F6\u590D\u5236\u8BED\u6CD5\u9AD8\u4EAE\u3002","\u63A7\u5236\u5149\u6807\u7684\u52A8\u753B\u6837\u5F0F\u3002","\u63A7\u5236\u662F\u5426\u542F\u7528\u5E73\u6ED1\u63D2\u5165\u52A8\u753B\u3002","\u63A7\u5236\u5149\u6807\u6837\u5F0F\u3002",'\u63A7\u5236\u5149\u6807\u5468\u56F4\u53EF\u89C1\u7684\u524D\u7F6E\u884C\u548C\u5C3E\u968F\u884C\u7684\u6700\u5C0F\u6570\u76EE\u3002\u5728\u5176\u4ED6\u4E00\u4E9B\u7F16\u8F91\u5668\u4E2D\u79F0\u4E3A "scrollOff" \u6216 "scrollOffset"\u3002','\u4EC5\u5F53\u901A\u8FC7\u952E\u76D8\u6216 API \u89E6\u53D1\u65F6\uFF0C\u624D\u4F1A\u5F3A\u5236\u6267\u884C"\u5149\u6807\u73AF\u7ED5\u884C"\u3002','\u59CB\u7EC8\u5F3A\u5236\u6267\u884C "cursorSurroundingLines"','\u63A7\u5236\u4F55\u65F6\u5E94\u5F3A\u5236\u6267\u884C"\u5149\u6807\u73AF\u7ED5\u884C"\u3002',"\u5F53 `#editor.cursorStyle#` \u8BBE\u7F6E\u4E3A `line` \u65F6\uFF0C\u63A7\u5236\u5149\u6807\u7684\u5BBD\u5EA6\u3002","\u63A7\u5236\u5728\u7F16\u8F91\u5668\u4E2D\u662F\u5426\u5141\u8BB8\u901A\u8FC7\u62D6\u653E\u6765\u79FB\u52A8\u9009\u4E2D\u5185\u5BB9\u3002",'\u6309\u4E0B"Alt"\u65F6\u6EDA\u52A8\u901F\u5EA6\u500D\u589E\u3002',"\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u542F\u7528\u4E86\u4EE3\u7801\u6298\u53E0\u3002","\u4F7F\u7528\u7279\u5B9A\u4E8E\u8BED\u8A00\u7684\u6298\u53E0\u7B56\u7565(\u5982\u679C\u53EF\u7528)\uFF0C\u5426\u5219\u4F7F\u7528\u57FA\u4E8E\u7F29\u8FDB\u7684\u7B56\u7565\u3002","\u4F7F\u7528\u57FA\u4E8E\u7F29\u8FDB\u7684\u6298\u53E0\u7B56\u7565\u3002","\u63A7\u5236\u8BA1\u7B97\u6298\u53E0\u8303\u56F4\u7684\u7B56\u7565\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u7A81\u51FA\u663E\u793A\u6298\u53E0\u8303\u56F4\u3002","\u63A7\u5236\u5355\u51FB\u5DF2\u6298\u53E0\u7684\u884C\u540E\u9762\u7684\u7A7A\u5185\u5BB9\u662F\u5426\u4F1A\u5C55\u5F00\u8BE5\u884C\u3002","\u63A7\u5236\u5B57\u4F53\u7CFB\u5217\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u81EA\u52A8\u683C\u5F0F\u5316\u7C98\u8D34\u7684\u5185\u5BB9\u3002\u683C\u5F0F\u5316\u7A0B\u5E8F\u5FC5\u987B\u53EF\u7528\uFF0C\u5E76\u4E14\u80FD\u9488\u5BF9\u6587\u6863\u4E2D\u7684\u67D0\u4E00\u8303\u56F4\u8FDB\u884C\u683C\u5F0F\u5316\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u5728\u952E\u5165\u4E00\u884C\u540E\u662F\u5426\u81EA\u52A8\u683C\u5F0F\u5316\u8BE5\u884C\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u5448\u73B0\u5782\u76F4\u5B57\u5F62\u8FB9\u8DDD\u3002\u5B57\u5F62\u8FB9\u8DDD\u6700\u5E38\u7528\u4E8E\u8C03\u8BD5\u3002","\u63A7\u5236\u662F\u5426\u5728\u6982\u89C8\u6807\u5C3A\u4E2D\u9690\u85CF\u5149\u6807\u3002","\u63A7\u5236\u662F\u5426\u7A81\u51FA\u663E\u793A\u7F16\u8F91\u5668\u4E2D\u6D3B\u52A8\u7684\u7F29\u8FDB\u53C2\u8003\u7EBF\u3002","\u63A7\u5236\u5B57\u6BCD\u95F4\u8DDD(\u50CF\u7D20)\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5DF2\u542F\u7528\u94FE\u63A5\u7F16\u8F91\u3002\u76F8\u5173\u7B26\u53F7(\u5982 HTML \u6807\u8BB0)\u5728\u7F16\u8F91\u65F6\u8FDB\u884C\u66F4\u65B0\uFF0C\u5177\u4F53\u7531\u8BED\u8A00\u800C\u5B9A\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u68C0\u6D4B\u94FE\u63A5\u5E76\u4F7F\u5176\u53EF\u88AB\u70B9\u51FB\u3002","\u7A81\u51FA\u663E\u793A\u5339\u914D\u7684\u62EC\u53F7\u3002","\u5BF9\u9F20\u6807\u6EDA\u8F6E\u6EDA\u52A8\u4E8B\u4EF6\u7684 `deltaX` \u548C `deltaY` \u4E58\u4E0A\u7684\u7CFB\u6570\u3002","\u6309\u4F4F `Ctrl` \u952E\u5E76\u6EDA\u52A8\u9F20\u6807\u6EDA\u8F6E\u65F6\u5BF9\u7F16\u8F91\u5668\u5B57\u4F53\u5927\u5C0F\u8FDB\u884C\u7F29\u653E\u3002","\u5F53\u591A\u4E2A\u5149\u6807\u91CD\u53E0\u65F6\u8FDB\u884C\u5408\u5E76\u3002","\u6620\u5C04\u4E3A `Ctrl` (Windows \u548C Linux) \u6216 `Command` (macOS)\u3002","\u6620\u5C04\u4E3A `Alt` (Windows \u548C Linux) \u6216 `Option` (macOS)\u3002","\u5728\u901A\u8FC7\u9F20\u6807\u6DFB\u52A0\u591A\u4E2A\u5149\u6807\u65F6\u4F7F\u7528\u7684\u4FEE\u6539\u952E\u3002\u201C\u8F6C\u5230\u5B9A\u4E49\u201D\u548C\u201C\u6253\u5F00\u94FE\u63A5\u201D\u529F\u80FD\u6240\u9700\u7684\u9F20\u6807\u52A8\u4F5C\u5C06\u4F1A\u76F8\u5E94\u8C03\u6574\uFF0C\u4E0D\u4E0E\u591A\u5149\u6807\u4FEE\u6539\u952E\u51B2\u7A81\u3002[\u9605\u8BFB\u8BE6\u7EC6\u4FE1\u606F](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier)\u3002","\u6BCF\u4E2A\u5149\u6807\u7C98\u8D34\u4E00\u884C\u6587\u672C\u3002","\u6BCF\u4E2A\u5149\u6807\u7C98\u8D34\u5168\u6587\u3002","\u63A7\u5236\u7C98\u8D34\u65F6\u7C98\u8D34\u6587\u672C\u7684\u884C\u8BA1\u6570\u4E0E\u5149\u6807\u8BA1\u6570\u76F8\u5339\u914D\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u7A81\u51FA\u663E\u793A\u8BED\u4E49\u7B26\u53F7\u7684\u5339\u914D\u9879\u3002","\u63A7\u5236\u662F\u5426\u5728\u6982\u89C8\u6807\u5C3A\u5468\u56F4\u7ED8\u5236\u8FB9\u6846\u3002","\u6253\u5F00\u901F\u89C8\u65F6\u805A\u7126\u6811","\u6253\u5F00\u9884\u89C8\u65F6\u5C06\u7126\u70B9\u653E\u5728\u7F16\u8F91\u5668\u4E0A","\u63A7\u5236\u662F\u5C06\u7126\u70B9\u653E\u5728\u5185\u8054\u7F16\u8F91\u5668\u4E0A\u8FD8\u662F\u653E\u5728\u9884\u89C8\u5C0F\u90E8\u4EF6\u4E2D\u7684\u6811\u4E0A\u3002",'\u63A7\u5236"\u8F6C\u5230\u5B9A\u4E49"\u9F20\u6807\u624B\u52BF\u662F\u5426\u59CB\u7EC8\u6253\u5F00\u9884\u89C8\u5C0F\u90E8\u4EF6\u3002',"\u63A7\u5236\u663E\u793A\u5FEB\u901F\u5EFA\u8BAE\u524D\u7684\u7B49\u5F85\u65F6\u95F4 (\u6BEB\u79D2)\u3002","\u63A7\u5236\u662F\u5426\u5728\u7F16\u8F91\u5668\u4E2D\u8F93\u5165\u65F6\u81EA\u52A8\u91CD\u547D\u540D\u3002",'\u5DF2\u5F03\u7528\uFF0C\u8BF7\u6539\u7528 "editor.linkedEditing"\u3002',"\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u663E\u793A\u63A7\u5236\u5B57\u7B26\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u663E\u793A\u7F29\u8FDB\u53C2\u8003\u7EBF\u3002","\u5F53\u6587\u4EF6\u4EE5\u6362\u884C\u7B26\u7ED3\u675F\u65F6, \u5448\u73B0\u6700\u540E\u4E00\u884C\u7684\u884C\u53F7\u3002","\u540C\u65F6\u7A81\u51FA\u663E\u793A\u5BFC\u822A\u7EBF\u548C\u5F53\u524D\u884C\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u7684\u5F53\u524D\u884C\u8FDB\u884C\u9AD8\u4EAE\u663E\u793A\u7684\u65B9\u5F0F\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u4EC5\u5728\u7126\u70B9\u5728\u7F16\u8F91\u5668\u65F6\u7A81\u51FA\u663E\u793A\u5F53\u524D\u884C","\u5448\u73B0\u7A7A\u683C\u5B57\u7B26(\u5B57\u8BCD\u4E4B\u95F4\u7684\u5355\u4E2A\u7A7A\u683C\u9664\u5916)\u3002","\u4EC5\u5728\u9009\u5B9A\u6587\u672C\u4E0A\u5448\u73B0\u7A7A\u767D\u5B57\u7B26\u3002","\u4EC5\u5448\u73B0\u5C3E\u968F\u7A7A\u683C\u5B57\u7B26","\u63A7\u5236\u7F16\u8F91\u5668\u5728\u7A7A\u767D\u5B57\u7B26\u4E0A\u663E\u793A\u7B26\u53F7\u7684\u65B9\u5F0F\u3002","\u63A7\u5236\u9009\u533A\u662F\u5426\u6709\u5706\u89D2\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u6C34\u5E73\u6EDA\u52A8\u65F6\u53EF\u4EE5\u8D85\u8FC7\u8303\u56F4\u7684\u5B57\u7B26\u6570\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u53EF\u4EE5\u6EDA\u52A8\u5230\u6700\u540E\u4E00\u884C\u4E4B\u540E\u3002","\u540C\u65F6\u5782\u76F4\u548C\u6C34\u5E73\u6EDA\u52A8\u65F6\uFF0C\u4EC5\u6CBF\u4E3B\u8F74\u6EDA\u52A8\u3002\u5728\u89E6\u63A7\u677F\u4E0A\u5782\u76F4\u6EDA\u52A8\u65F6\uFF0C\u53EF\u9632\u6B62\u6C34\u5E73\u6F02\u79FB\u3002","\u63A7\u5236\u662F\u5426\u652F\u6301 Linux \u4E3B\u526A\u8D34\u677F\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5E94\u7A81\u51FA\u663E\u793A\u4E0E\u6240\u9009\u5185\u5BB9\u7C7B\u4F3C\u7684\u5339\u914D\u9879\u3002","\u59CB\u7EC8\u663E\u793A\u6298\u53E0\u63A7\u4EF6\u3002","\u4EC5\u5728\u9F20\u6807\u4F4D\u4E8E\u88C5\u8BA2\u7EBF\u4E0A\u65B9\u65F6\u663E\u793A\u6298\u53E0\u63A7\u4EF6\u3002","\u63A7\u5236\u4F55\u65F6\u663E\u793A\u884C\u53F7\u69FD\u4E0A\u7684\u6298\u53E0\u63A7\u4EF6\u3002","\u63A7\u5236\u662F\u5426\u6DE1\u5316\u672A\u4F7F\u7528\u7684\u4EE3\u7801\u3002","\u63A7\u5236\u52A0\u5220\u9664\u7EBF\u88AB\u5F03\u7528\u7684\u53D8\u91CF\u3002","\u5728\u5176\u4ED6\u5EFA\u8BAE\u4E0A\u65B9\u663E\u793A\u4EE3\u7801\u7247\u6BB5\u5EFA\u8BAE\u3002","\u5728\u5176\u4ED6\u5EFA\u8BAE\u4E0B\u65B9\u663E\u793A\u4EE3\u7801\u7247\u6BB5\u5EFA\u8BAE\u3002","\u5728\u5176\u4ED6\u5EFA\u8BAE\u4E2D\u7A7F\u63D2\u663E\u793A\u4EE3\u7801\u7247\u6BB5\u5EFA\u8BAE\u3002","\u4E0D\u663E\u793A\u4EE3\u7801\u7247\u6BB5\u5EFA\u8BAE\u3002","\u63A7\u5236\u4EE3\u7801\u7247\u6BB5\u662F\u5426\u4E0E\u5176\u4ED6\u5EFA\u8BAE\u4E00\u8D77\u663E\u793A\u53CA\u5176\u6392\u5217\u7684\u4F4D\u7F6E\u3002","\u63A7\u5236\u7F16\u8F91\u5668\u662F\u5426\u5728\u6EDA\u52A8\u65F6\u4F7F\u7528\u52A8\u753B\u3002","\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u7684\u5B57\u53F7\u3002\u5982\u679C\u8BBE\u7F6E\u4E3A `0`\uFF0C\u5219\u4F7F\u7528 `#editor.fontSize#` \u7684\u503C\u3002","\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u7684\u884C\u9AD8\u3002\u5982\u679C\u8BBE\u7F6E\u4E3A `0`\uFF0C\u5219\u4F7F\u7528 `#editor.lineHeight#` \u7684\u503C\u3002\u6700\u5C0F\u503C\u4E3A 8\u3002","\u63A7\u5236\u5728\u952E\u5165\u89E6\u53D1\u5B57\u7B26\u540E\u662F\u5426\u81EA\u52A8\u663E\u793A\u5EFA\u8BAE\u3002","\u59CB\u7EC8\u9009\u62E9\u7B2C\u4E00\u4E2A\u5EFA\u8BAE\u3002","\u9009\u62E9\u6700\u8FD1\u7684\u5EFA\u8BAE\uFF0C\u9664\u975E\u8FDB\u4E00\u6B65\u952E\u5165\u9009\u62E9\u5176\u4ED6\u9879\u3002\u4F8B\u5982 `console. -> console.log`\uFF0C\u56E0\u4E3A\u6700\u8FD1\u8865\u5168\u8FC7 `log`\u3002","\u6839\u636E\u4E4B\u524D\u8865\u5168\u8FC7\u7684\u5EFA\u8BAE\u7684\u524D\u7F00\u6765\u8FDB\u884C\u9009\u62E9\u3002\u4F8B\u5982\uFF0C`co -> console`\u3001`con -> const`\u3002","\u63A7\u5236\u5728\u5EFA\u8BAE\u5217\u8868\u4E2D\u5982\u4F55\u9884\u5148\u9009\u62E9\u5EFA\u8BAE\u3002","\u5728\u6309\u4E0B Tab \u952E\u65F6\u8FDB\u884C Tab \u8865\u5168\uFF0C\u5C06\u63D2\u5165\u6700\u4F73\u5339\u914D\u5EFA\u8BAE\u3002","\u7981\u7528 Tab \u8865\u5168\u3002",'\u5728\u524D\u7F00\u5339\u914D\u65F6\u8FDB\u884C Tab \u8865\u5168\u3002\u5728 "quickSuggestions" \u672A\u542F\u7528\u65F6\u4F53\u9A8C\u6700\u597D\u3002',"\u542F\u7528 Tab \u8865\u5168\u3002","\u81EA\u52A8\u5220\u9664\u5F02\u5E38\u7684\u884C\u7EC8\u6B62\u7B26\u3002","\u5FFD\u7565\u5F02\u5E38\u7684\u884C\u7EC8\u6B62\u7B26\u3002","\u63D0\u793A\u5220\u9664\u5F02\u5E38\u7684\u884C\u7EC8\u6B62\u7B26\u3002","\u5220\u9664\u53EF\u80FD\u5BFC\u81F4\u95EE\u9898\u7684\u5F02\u5E38\u884C\u7EC8\u6B62\u7B26\u3002","\u6839\u636E\u5236\u8868\u4F4D\u63D2\u5165\u548C\u5220\u9664\u7A7A\u683C\u3002","\u6267\u884C\u5355\u8BCD\u76F8\u5173\u7684\u5BFC\u822A\u6216\u64CD\u4F5C\u65F6\u4F5C\u4E3A\u5355\u8BCD\u5206\u9694\u7B26\u7684\u5B57\u7B26\u3002","\u6C38\u4E0D\u6362\u884C\u3002","\u5C06\u5728\u89C6\u533A\u5BBD\u5EA6\u5904\u6362\u884C\u3002","\u5728 `#editor.wordWrapColumn#` \u5904\u6298\u884C\u3002","\u5728\u89C6\u533A\u5BBD\u5EA6\u548C `#editor.wordWrapColumn#` \u4E2D\u7684\u8F83\u5C0F\u503C\u5904\u6298\u884C\u3002","\u63A7\u5236\u6298\u884C\u7684\u65B9\u5F0F\u3002","\u5728 `#editor.wordWrap#` \u4E3A `wordWrapColumn` \u6216 `bounded` \u65F6\uFF0C\u63A7\u5236\u7F16\u8F91\u5668\u7684\u6298\u884C\u5217\u3002","\u6CA1\u6709\u7F29\u8FDB\u3002\u6298\u884C\u4ECE\u7B2C 1 \u5217\u5F00\u59CB\u3002","\u6298\u884C\u7684\u7F29\u8FDB\u91CF\u4E0E\u5176\u7236\u7EA7\u76F8\u540C\u3002","\u6298\u884C\u7684\u7F29\u8FDB\u91CF\u6BD4\u5176\u7236\u7EA7\u591A 1\u3002","\u6298\u884C\u7684\u7F29\u8FDB\u91CF\u6BD4\u5176\u7236\u7EA7\u591A 2\u3002","\u63A7\u5236\u6298\u884C\u7684\u7F29\u8FDB\u3002","\u5047\u5B9A\u6240\u6709\u5B57\u7B26\u7684\u5BBD\u5EA6\u76F8\u540C\u3002\u8FD9\u662F\u4E00\u79CD\u5FEB\u901F\u7B97\u6CD5\uFF0C\u9002\u7528\u4E8E\u7B49\u5BBD\u5B57\u4F53\u548C\u67D0\u4E9B\u5B57\u5F62\u5BBD\u5EA6\u76F8\u7B49\u7684\u6587\u5B57(\u5982\u62C9\u4E01\u5B57\u7B26)\u3002","\u5C06\u5305\u88C5\u70B9\u8BA1\u7B97\u59D4\u6258\u7ED9\u6D4F\u89C8\u5668\u3002\u8FD9\u662F\u4E00\u4E2A\u7F13\u6162\u7B97\u6CD5\uFF0C\u53EF\u80FD\u4F1A\u5BFC\u81F4\u5927\u578B\u6587\u4EF6\u88AB\u51BB\u7ED3\uFF0C\u4F46\u5B83\u5728\u6240\u6709\u60C5\u51B5\u4E0B\u90FD\u6B63\u5E38\u5DE5\u4F5C\u3002","\u63A7\u5236\u8BA1\u7B97\u5305\u88F9\u70B9\u7684\u7B97\u6CD5\u3002"],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read only","Whether the context is a diff editor","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/model/editStack":["\u8F93\u5165"],"vs/editor/common/modes/modesRegistry":["\u7EAF\u6587\u672C"],"vs/editor/common/standaloneStrings":["\u65E0\u9009\u62E9","\u884C {0}, \u5217 {1} (\u9009\u4E2D {2})","\u884C {0}, \u5217 {1}","{0} \u9009\u62E9(\u5DF2\u9009\u62E9 {1} \u4E2A\u5B57\u7B26)","{0} \u9009\u62E9",'\u73B0\u5728\u5C06 "\u8F85\u52A9\u529F\u80FD\u652F\u6301" \u8BBE\u7F6E\u66F4\u6539\u4E3A "\u6253\u5F00"\u3002',"\u73B0\u5728\u6B63\u5728\u6253\u5F00\u201C\u7F16\u8F91\u5668\u8F85\u52A9\u529F\u80FD\u201D\u6587\u6863\u9875\u3002","\u5728\u5DEE\u5F02\u7F16\u8F91\u5668\u7684\u53EA\u8BFB\u7A97\u683C\u4E2D\u3002","\u5728\u4E00\u4E2A\u5DEE\u5F02\u7F16\u8F91\u5668\u7684\u7A97\u683C\u4E2D\u3002","\u5728\u53EA\u8BFB\u4EE3\u7801\u7F16\u8F91\u5668\u4E2D","\u5728\u4EE3\u7801\u7F16\u8F91\u5668\u4E2D","\u82E5\u8981\u914D\u7F6E\u7F16\u8F91\u5668\uFF0C\u5C06\u5176\u8FDB\u884C\u4F18\u5316\u4EE5\u6700\u597D\u5730\u914D\u5408\u5C4F\u5E55\u9605\u8BFB\u5668\u7684\u4F7F\u7528\uFF0C\u8BF7\u7ACB\u5373\u6309 Command+E\u3002","\u82E5\u8981\u914D\u7F6E\u7F16\u8F91\u5668\uFF0C\u5C06\u5176\u8FDB\u884C\u4F18\u5316\u4EE5\u6700\u9AD8\u6548\u5730\u914D\u5408\u5C4F\u5E55\u9605\u8BFB\u5668\u7684\u4F7F\u7528\uFF0C\u6309\u4E0B Ctrl+E\u3002","\u914D\u7F6E\u7F16\u8F91\u5668\uFF0C\u5C06\u5176\u8FDB\u884C\u4F18\u5316\u4EE5\u6700\u597D\u5730\u914D\u5408\u5C4F\u5E55\u8BFB\u53D6\u5668\u7684\u4F7F\u7528\u3002","\u7F16\u8F91\u5668\u88AB\u914D\u7F6E\u4E3A\u6C38\u8FDC\u4E0D\u8FDB\u884C\u4F18\u5316\u4EE5\u914D\u5408\u5C4F\u5E55\u8BFB\u53D6\u5668\u7684\u4F7F\u7528, \u800C\u5F53\u524D\u4E0D\u662F\u8FD9\u79CD\u60C5\u51B5\u3002","\u5728\u5F53\u524D\u7F16\u8F91\u5668\u4E2D\u6309 Tab \u4F1A\u5C06\u7126\u70B9\u79FB\u52A8\u5230\u4E0B\u4E00\u4E2A\u53EF\u805A\u7126\u7684\u5143\u7D20\u3002\u901A\u8FC7\u6309 {0} \u5207\u6362\u6B64\u884C\u4E3A\u3002","\u5728\u5F53\u524D\u7F16\u8F91\u5668\u4E2D\u6309 Tab \u4F1A\u5C06\u7126\u70B9\u79FB\u52A8\u5230\u4E0B\u4E00\u4E2A\u53EF\u805A\u7126\u7684\u5143\u7D20\u3002\u5F53\u524D\u65E0\u6CD5\u901A\u8FC7\u6309\u952E\u7ED1\u5B9A\u89E6\u53D1\u547D\u4EE4 {0}\u3002","\u5728\u5F53\u524D\u7F16\u8F91\u5668\u4E2D\u6309 Tab \u5C06\u63D2\u5165\u5236\u8868\u7B26\u3002\u901A\u8FC7\u6309 {0} \u5207\u6362\u6B64\u884C\u4E3A\u3002","\u5728\u5F53\u524D\u7F16\u8F91\u5668\u4E2D\u6309 Tab \u4F1A\u63D2\u5165\u5236\u8868\u7B26\u3002\u5F53\u524D\u65E0\u6CD5\u901A\u8FC7\u952E\u7ED1\u5B9A\u89E6\u53D1\u547D\u4EE4 {0}\u3002","\u73B0\u5728\u6309 Command+H \u6253\u5F00\u4E00\u4E2A\u6D4F\u89C8\u5668\u7A97\u53E3, \u5176\u4E2D\u5305\u542B\u6709\u5173\u7F16\u8F91\u5668\u8F85\u52A9\u529F\u80FD\u7684\u8BE6\u7EC6\u4FE1\u606F\u3002","\u73B0\u5728\u6309 Ctrl+H \u6253\u5F00\u4E00\u4E2A\u6D4F\u89C8\u5668\u7A97\u53E3, \u5176\u4E2D\u5305\u542B\u6709\u5173\u7F16\u8F91\u5668\u8F85\u52A9\u529F\u80FD\u7684\u66F4\u591A\u4FE1\u606F\u3002","\u4F60\u53EF\u4EE5\u6309 Esc \u6216 Shift+Esc \u6D88\u9664\u6B64\u5DE5\u5177\u63D0\u793A\u5E76\u8FD4\u56DE\u5230\u7F16\u8F91\u5668\u3002","\u663E\u793A\u8F85\u52A9\u529F\u80FD\u5E2E\u52A9","\u5F00\u53D1\u4EBA\u5458: \u68C0\u67E5\u4EE4\u724C","\u8F6C\u5230\u884C/\u5217...","\u663E\u793A\u6240\u6709\u5FEB\u901F\u8BBF\u95EE\u63D0\u4F9B\u7A0B\u5E8F","\u547D\u4EE4\u9762\u677F","\u663E\u793A\u5E76\u8FD0\u884C\u547D\u4EE4","\u8F6C\u5230\u7B26\u53F7...","\u6309\u7C7B\u522B\u8F6C\u5230\u7B26\u53F7...","\u7F16\u8F91\u5668\u5185\u5BB9","\u6309 Alt+F1 \u53EF\u6253\u5F00\u8F85\u52A9\u529F\u80FD\u9009\u9879\u3002","\u5207\u6362\u9AD8\u5BF9\u6BD4\u5EA6\u4E3B\u9898","\u5728 {1} \u4E2A\u6587\u4EF6\u4E2D\u8FDB\u884C\u4E86 {0} \u6B21\u7F16\u8F91"],"vs/editor/common/view/editorColorRegistry":["\u5149\u6807\u6240\u5728\u884C\u9AD8\u4EAE\u5185\u5BB9\u7684\u80CC\u666F\u989C\u8272\u3002","\u5149\u6807\u6240\u5728\u884C\u56DB\u5468\u8FB9\u6846\u7684\u80CC\u666F\u989C\u8272\u3002","\u80CC\u666F\u989C\u8272\u7684\u9AD8\u4EAE\u8303\u56F4\uFF0C\u559C\u6B22\u901A\u8FC7\u5FEB\u901F\u6253\u5F00\u548C\u67E5\u627E\u529F\u80FD\u3002\u989C\u8272\u4E0D\u80FD\u4E0D\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u5E95\u5C42\u88C5\u9970\u3002","\u9AD8\u4EAE\u533A\u57DF\u8FB9\u6846\u7684\u80CC\u666F\u989C\u8272\u3002","\u9AD8\u4EAE\u663E\u793A\u7B26\u53F7\u7684\u80CC\u666F\u989C\u8272\uFF0C\u4F8B\u5982\u8F6C\u5230\u5B9A\u4E49\u6216\u8F6C\u5230\u4E0B\u4E00\u4E2A/\u4E0A\u4E00\u4E2A\u7B26\u53F7\u3002\u989C\u8272\u4E0D\u80FD\u662F\u4E0D\u900F\u660E\u7684\uFF0C\u4EE5\u514D\u9690\u85CF\u5E95\u5C42\u88C5\u9970\u3002","\u9AD8\u4EAE\u663E\u793A\u7B26\u53F7\u5468\u56F4\u7684\u8FB9\u6846\u7684\u80CC\u666F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5149\u6807\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5149\u6807\u7684\u80CC\u666F\u8272\u3002\u53EF\u4EE5\u81EA\u5B9A\u4E49\u5757\u578B\u5149\u6807\u8986\u76D6\u5B57\u7B26\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u7A7A\u767D\u5B57\u7B26\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u7F29\u8FDB\u53C2\u8003\u7EBF\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6D3B\u52A8\u7F29\u8FDB\u53C2\u8003\u7EBF\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u884C\u53F7\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6D3B\u52A8\u884C\u53F7\u7684\u989C\u8272",'"Id" \u5DF2\u88AB\u5F03\u7528\uFF0C\u8BF7\u6539\u7528 "editorLineNumber.activeForeground"\u3002',"\u7F16\u8F91\u5668\u6D3B\u52A8\u884C\u53F7\u7684\u989C\u8272","\u7F16\u8F91\u5668\u6807\u5C3A\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668 CodeLens \u7684\u524D\u666F\u8272","\u5339\u914D\u62EC\u53F7\u7684\u80CC\u666F\u8272","\u5339\u914D\u62EC\u53F7\u5916\u6846\u7684\u989C\u8272","\u6982\u89C8\u6807\u5C3A\u8FB9\u6846\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6982\u8FF0\u6807\u5C3A\u7684\u80CC\u666F\u8272\u3002\u4EC5\u5F53\u7F29\u7565\u56FE\u5DF2\u542F\u7528\u4E14\u7F6E\u4E8E\u7F16\u8F91\u5668\u53F3\u4FA7\u65F6\u624D\u4F7F\u7528\u3002","\u7F16\u8F91\u5668\u5BFC\u822A\u7EBF\u7684\u80CC\u666F\u8272\u3002\u5BFC\u822A\u7EBF\u5305\u62EC\u8FB9\u7F18\u7B26\u53F7\u548C\u884C\u53F7\u3002","\u7F16\u8F91\u5668\u4E2D\u4E0D\u5FC5\u8981(\u672A\u4F7F\u7528)\u7684\u6E90\u4EE3\u7801\u7684\u8FB9\u6846\u989C\u8272\u3002",'\u975E\u5FC5\u987B(\u672A\u4F7F\u7528)\u4EE3\u7801\u7684\u5728\u7F16\u8F91\u5668\u4E2D\u663E\u793A\u7684\u4E0D\u900F\u660E\u5EA6\u3002\u4F8B\u5982\uFF0C"#000000c0" \u5C06\u4EE5 75% \u7684\u4E0D\u900F\u660E\u5EA6\u663E\u793A\u4EE3\u7801\u3002\u5BF9\u4E8E\u9AD8\u5BF9\u6BD4\u5EA6\u4E3B\u9898\uFF0C\u8BF7\u4F7F\u7528 \u201DeditorUnnecessaryCode.border\u201C \u4E3B\u9898\u6765\u4E3A\u975E\u5FC5\u987B\u4EE3\u7801\u6DFB\u52A0\u4E0B\u5212\u7EBF\uFF0C\u4EE5\u907F\u514D\u989C\u8272\u6DE1\u5316\u3002',"\u7528\u4E8E\u7A81\u51FA\u663E\u793A\u8303\u56F4\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u6982\u89C8\u6807\u5C3A\u4E2D\u9519\u8BEF\u6807\u8BB0\u7684\u989C\u8272\u3002","\u6982\u89C8\u6807\u5C3A\u4E2D\u8B66\u544A\u6807\u8BB0\u7684\u989C\u8272\u3002","\u6982\u89C8\u6807\u5C3A\u4E2D\u4FE1\u606F\u6807\u8BB0\u7684\u989C\u8272\u3002"],"vs/editor/contrib/anchorSelect/anchorSelect":["\u9009\u62E9\u5B9A\u4F4D\u70B9","\u5B9A\u4F4D\u70B9\u8BBE\u7F6E\u4E3A {0}:{1}","\u8BBE\u7F6E\u9009\u62E9\u5B9A\u4F4D\u70B9","\u8F6C\u5230\u9009\u62E9\u5B9A\u4F4D\u70B9","\u9009\u62E9\u4ECE\u5B9A\u4F4D\u70B9\u5230\u5149\u6807","\u53D6\u6D88\u9009\u62E9\u5B9A\u4F4D\u70B9"],"vs/editor/contrib/bracketMatching/bracketMatching":["\u6982\u89C8\u6807\u5C3A\u4E0A\u8868\u793A\u5339\u914D\u62EC\u53F7\u7684\u6807\u8BB0\u989C\u8272\u3002","\u8F6C\u5230\u62EC\u53F7","\u9009\u62E9\u62EC\u53F7\u6240\u6709\u5185\u5BB9","\u8F6C\u5230\u62EC\u53F7(&&B)"],"vs/editor/contrib/caretOperations/caretOperations":["\u5411\u5DE6\u79FB\u52A8\u6240\u9009\u6587\u672C","\u5411\u53F3\u79FB\u52A8\u6240\u9009\u6587\u672C"],"vs/editor/contrib/caretOperations/transpose":["\u8F6C\u7F6E\u5B57\u6BCD"],"vs/editor/contrib/clipboard/clipboard":["\u526A\u5207(&&T)","\u526A\u5207","\u526A\u5207","\u590D\u5236(&&C)","\u590D\u5236","\u590D\u5236","\u7C98\u8D34(&&P)","\u7C98\u8D34","\u7C98\u8D34","\u590D\u5236\u5E76\u7A81\u51FA\u663E\u793A\u8BED\u6CD5"],"vs/editor/contrib/codeAction/codeActionCommands":["\u8981\u8FD0\u884C\u7684\u4EE3\u7801\u64CD\u4F5C\u7684\u79CD\u7C7B\u3002","\u63A7\u5236\u4F55\u65F6\u5E94\u7528\u8FD4\u56DE\u7684\u64CD\u4F5C\u3002","\u59CB\u7EC8\u5E94\u7528\u7B2C\u4E00\u4E2A\u8FD4\u56DE\u7684\u4EE3\u7801\u64CD\u4F5C\u3002","\u5982\u679C\u4EC5\u8FD4\u56DE\u7684\u7B2C\u4E00\u4E2A\u4EE3\u7801\u64CD\u4F5C\uFF0C\u5219\u5E94\u7528\u8BE5\u64CD\u4F5C\u3002","\u4E0D\u8981\u5E94\u7528\u8FD4\u56DE\u7684\u4EE3\u7801\u64CD\u4F5C\u3002","\u5982\u679C\u53EA\u5E94\u8FD4\u56DE\u9996\u9009\u4EE3\u7801\u64CD\u4F5C\uFF0C\u5219\u5E94\u8FD4\u56DE\u63A7\u4EF6\u3002","\u5E94\u7528\u4EE3\u7801\u64CD\u4F5C\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF","\u5FEB\u901F\u4FEE\u590D...","\u6CA1\u6709\u53EF\u7528\u7684\u4EE3\u7801\u64CD\u4F5C",'\u6CA1\u6709\u9002\u7528\u4E8E"{0}"\u7684\u9996\u9009\u4EE3\u7801\u64CD\u4F5C','\u6CA1\u6709\u9002\u7528\u4E8E"{0}"\u7684\u4EE3\u7801\u64CD\u4F5C',"\u6CA1\u6709\u53EF\u7528\u7684\u9996\u9009\u4EE3\u7801\u64CD\u4F5C","\u6CA1\u6709\u53EF\u7528\u7684\u4EE3\u7801\u64CD\u4F5C","\u91CD\u6784...",'\u6CA1\u6709\u9002\u7528\u4E8E"{0}"\u7684\u9996\u9009\u91CD\u6784','\u6CA1\u6709\u53EF\u7528\u7684"{0}"\u91CD\u6784',"\u6CA1\u6709\u53EF\u7528\u7684\u9996\u9009\u91CD\u6784","\u6CA1\u6709\u53EF\u7528\u7684\u91CD\u6784\u64CD\u4F5C","\u6E90\u4EE3\u7801\u64CD\u4F5C...",'\u6CA1\u6709\u9002\u7528\u4E8E"{0}"\u7684\u9996\u9009\u6E90\u64CD\u4F5C',"\u6CA1\u6709\u9002\u7528\u4E8E\u201C {0}\u201D\u7684\u6E90\u64CD\u4F5C","\u6CA1\u6709\u53EF\u7528\u7684\u9996\u9009\u6E90\u64CD\u4F5C","\u6CA1\u6709\u53EF\u7528\u7684\u6E90\u4EE3\u7801\u64CD\u4F5C","\u6574\u7406 import \u8BED\u53E5","\u6CA1\u6709\u53EF\u7528\u7684\u6574\u7406 import \u8BED\u53E5\u64CD\u4F5C","\u5168\u90E8\u4FEE\u590D","\u6CA1\u6709\u53EF\u7528\u7684\u201C\u5168\u90E8\u4FEE\u590D\u201D\u64CD\u4F5C","\u81EA\u52A8\u4FEE\u590D...","\u6CA1\u6709\u53EF\u7528\u7684\u81EA\u52A8\u4FEE\u590D\u7A0B\u5E8F"],"vs/editor/contrib/codeAction/lightBulbWidget":["\u663E\u793A\u4FEE\u590D\u7A0B\u5E8F\u3002\u9996\u9009\u53EF\u7528\u4FEE\u590D\u7A0B\u5E8F ({0})","\u663E\u793A\u4FEE\u8865\u7A0B\u5E8F({0})","\u663E\u793A\u4FEE\u8865\u7A0B\u5E8F"],"vs/editor/contrib/codelens/codelensController":["\u663E\u793A\u5F53\u524D\u884C\u7684 Code Lens \u547D\u4EE4"],"vs/editor/contrib/comment/comment":["\u5207\u6362\u884C\u6CE8\u91CA","\u5207\u6362\u884C\u6CE8\u91CA(&&T)","\u6DFB\u52A0\u884C\u6CE8\u91CA","\u5220\u9664\u884C\u6CE8\u91CA","\u5207\u6362\u5757\u6CE8\u91CA","\u5207\u6362\u5757\u6CE8\u91CA(&&B)"],"vs/editor/contrib/contextmenu/contextmenu":["\u663E\u793A\u7F16\u8F91\u5668\u4E0A\u4E0B\u6587\u83DC\u5355"],"vs/editor/contrib/cursorUndo/cursorUndo":["\u5149\u6807\u64A4\u6D88","\u5149\u6807\u91CD\u505A"],"vs/editor/contrib/find/findController":["\u67E5\u627E","\u67E5\u627E(&&F)","\u67E5\u627E\u9009\u5B9A\u5185\u5BB9","\u67E5\u627E\u4E0B\u4E00\u4E2A","\u67E5\u627E\u4E0B\u4E00\u4E2A","\u67E5\u627E\u4E0A\u4E00\u4E2A","\u67E5\u627E\u4E0A\u4E00\u4E2A","\u67E5\u627E\u4E0B\u4E00\u4E2A\u9009\u62E9","\u67E5\u627E\u4E0A\u4E00\u4E2A\u9009\u62E9","\u66FF\u6362","\u66FF\u6362(&&R)"],"vs/editor/contrib/find/findWidget":["\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u5728\u9009\u5B9A\u5185\u5BB9\u4E2D\u67E5\u627E\u201D\u56FE\u6807\u3002","\u7528\u4E8E\u6307\u793A\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u5DF2\u6298\u53E0\u7684\u56FE\u6807\u3002","\u7528\u4E8E\u6307\u793A\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u5DF2\u5C55\u5F00\u7684\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u66FF\u6362\u201D\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u5168\u90E8\u66FF\u6362\u201D\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u67E5\u627E\u4E0A\u4E00\u4E2A\u201D\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u67E5\u627E\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u201C\u67E5\u627E\u4E0B\u4E00\u4E2A\u201D\u56FE\u6807\u3002","\u67E5\u627E","\u67E5\u627E","\u4E0A\u4E00\u4E2A\u5339\u914D\u9879","\u4E0B\u4E00\u4E2A\u5339\u914D\u9879","\u5728\u9009\u5B9A\u5185\u5BB9\u4E2D\u67E5\u627E","\u5173\u95ED","\u66FF\u6362","\u66FF\u6362","\u66FF\u6362","\u5168\u90E8\u66FF\u6362","\u5207\u6362\u66FF\u6362\u6A21\u5F0F","\u4EC5\u9AD8\u4EAE\u4E86\u524D {0} \u4E2A\u7ED3\u679C\uFF0C\u4F46\u6240\u6709\u67E5\u627E\u64CD\u4F5C\u5747\u9488\u5BF9\u5168\u6587\u3002","{1} \u4E2D\u7684 {0}","\u65E0\u7ED3\u679C","\u627E\u5230 {0}","\u4E3A\u201C{1}\u201D\u627E\u5230 {0}","\u5728 {2} \u5904\u627E\u5230\u201C{1}\u201D\u7684 {0}","\u4E3A\u201C{1}\u201D\u627E\u5230 {0}","Ctrl+Enter \u73B0\u5728\u7531\u5168\u90E8\u66FF\u6362\u6539\u4E3A\u63D2\u5165\u6362\u884C\u3002\u4F60\u53EF\u4EE5\u4FEE\u6539editor.action.replaceAll \u7684\u6309\u952E\u7ED1\u5B9A\u4EE5\u8986\u76D6\u6B64\u884C\u4E3A\u3002"],"vs/editor/contrib/folding/folding":["\u5C55\u5F00","\u4EE5\u9012\u5F52\u65B9\u5F0F\u5C55\u5F00","\u6298\u53E0","\u5207\u6362\u6298\u53E0","\u4EE5\u9012\u5F52\u65B9\u5F0F\u6298\u53E0","\u6298\u53E0\u6240\u6709\u5757\u6CE8\u91CA","\u6298\u53E0\u6240\u6709\u533A\u57DF","\u5C55\u5F00\u6240\u6709\u533A\u57DF","\u5168\u90E8\u6298\u53E0","\u5168\u90E8\u5C55\u5F00","\u6298\u53E0\u7EA7\u522B {0}","\u6298\u53E0\u8303\u56F4\u540E\u9762\u7684\u80CC\u666F\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u8BBE\u4E3A\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u5E95\u5C42\u88C5\u9970\u3002","\u7F16\u8F91\u5668\u88C5\u8BA2\u7EBF\u4E2D\u6298\u53E0\u63A7\u4EF6\u7684\u989C\u8272\u3002"],"vs/editor/contrib/folding/foldingDecorations":["\u7F16\u8F91\u5668\u5B57\u5F62\u8FB9\u8DDD\u4E2D\u5DF2\u5C55\u5F00\u7684\u8303\u56F4\u7684\u56FE\u6807\u3002","\u7F16\u8F91\u5668\u5B57\u5F62\u8FB9\u8DDD\u4E2D\u5DF2\u6298\u53E0\u7684\u8303\u56F4\u7684\u56FE\u6807\u3002"],"vs/editor/contrib/fontZoom/fontZoom":["\u653E\u5927\u7F16\u8F91\u5668\u5B57\u4F53","\u7F29\u5C0F\u7F16\u8F91\u5668\u5B57\u4F53","\u91CD\u7F6E\u7F16\u8F91\u5668\u5B57\u4F53\u5927\u5C0F"],"vs/editor/contrib/format/format":["\u5728\u7B2C {0} \u884C\u8FDB\u884C\u4E86 1 \u6B21\u683C\u5F0F\u7F16\u8F91","\u5728\u7B2C {1} \u884C\u8FDB\u884C\u4E86 {0} \u6B21\u683C\u5F0F\u7F16\u8F91","\u7B2C {0} \u884C\u5230\u7B2C {1} \u884C\u95F4\u8FDB\u884C\u4E86 1 \u6B21\u683C\u5F0F\u7F16\u8F91","\u7B2C {1} \u884C\u5230\u7B2C {2} \u884C\u95F4\u8FDB\u884C\u4E86 {0} \u6B21\u683C\u5F0F\u7F16\u8F91"],"vs/editor/contrib/format/formatActions":["\u683C\u5F0F\u5316\u6587\u6863","\u683C\u5F0F\u5316\u9009\u5B9A\u5185\u5BB9"],"vs/editor/contrib/gotoError/gotoError":["\u8F6C\u5230\u4E0B\u4E00\u4E2A\u95EE\u9898 (\u9519\u8BEF\u3001\u8B66\u544A\u3001\u4FE1\u606F)","\u201C\u8F6C\u5230\u4E0B\u4E00\u4E2A\u201D\u6807\u8BB0\u7684\u56FE\u6807\u3002","\u8F6C\u5230\u4E0A\u4E00\u4E2A\u95EE\u9898 (\u9519\u8BEF\u3001\u8B66\u544A\u3001\u4FE1\u606F)","\u201C\u8F6C\u5230\u4E0A\u4E00\u4E2A\u201D\u6807\u8BB0\u7684\u56FE\u6807\u3002","\u8F6C\u5230\u6587\u4EF6\u4E2D\u7684\u4E0B\u4E00\u4E2A\u95EE\u9898 (\u9519\u8BEF\u3001\u8B66\u544A\u3001\u4FE1\u606F)","\u4E0B\u4E00\u4E2A\u95EE\u9898(&&P)","\u8F6C\u5230\u6587\u4EF6\u4E2D\u7684\u4E0A\u4E00\u4E2A\u95EE\u9898 (\u9519\u8BEF\u3001\u8B66\u544A\u3001\u4FE1\u606F)","\u4E0A\u4E00\u4E2A\u95EE\u9898(&&P)"],"vs/editor/contrib/gotoError/gotoErrorWidget":["\u9519\u8BEF","\u8B66\u544A","\u4FE1\u606F","\u63D0\u793A","{1} \u4E2D\u7684 {0}","{0} \u4E2A\u95EE\u9898(\u5171 {1} \u4E2A)","{0} \u4E2A\u95EE\u9898(\u5171 {1} \u4E2A)","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u9519\u8BEF\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u8B66\u544A\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u4FE1\u606F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6807\u8BB0\u5BFC\u822A\u5C0F\u7EC4\u4EF6\u80CC\u666F\u8272\u3002"],"vs/editor/contrib/gotoSymbol/goToCommands":["\u5FEB\u901F\u67E5\u770B","\u5B9A\u4E49","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u4EFB\u4F55\u5B9A\u4E49","\u627E\u4E0D\u5230\u5B9A\u4E49","\u8F6C\u5230\u5B9A\u4E49","\u8F6C\u5230\u5B9A\u4E49(&&D)","\u6253\u5F00\u4FA7\u8FB9\u7684\u5B9A\u4E49","\u901F\u89C8\u5B9A\u4E49","\u58F0\u660E","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u58F0\u660E","\u672A\u627E\u5230\u58F0\u660E","\u8F6C\u5230\u58F0\u660E",'\u8F6C\u5230"\u58F0\u660E"(&&D)',"\u672A\u627E\u5230\u201C{0}\u201D\u7684\u58F0\u660E","\u672A\u627E\u5230\u58F0\u660E","\u67E5\u770B\u58F0\u660E","\u7C7B\u578B\u5B9A\u4E49","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u7C7B\u578B\u5B9A\u4E49","\u672A\u627E\u5230\u7C7B\u578B\u5B9A\u4E49","\u8F6C\u5230\u7C7B\u578B\u5B9A\u4E49","\u8F6C\u5230\u7C7B\u578B\u5B9A\u4E49(&&T)","\u5FEB\u901F\u67E5\u770B\u7C7B\u578B\u5B9A\u4E49","\u5B9E\u73B0","\u672A\u627E\u5230\u201C{0}\u201D\u7684\u5B9E\u73B0","\u672A\u627E\u5230\u5B9E\u73B0","\u8F6C\u5230\u5B9E\u73B0","\u8DF3\u8F6C\u5230\u5B9E\u73B0(&&I)","\u67E5\u770B\u5B9E\u73B0",'\u672A\u627E\u5230"{0}"\u7684\u5F15\u7528',"\u672A\u627E\u5230\u5F15\u7528","\u8F6C\u5230\u5F15\u7528","\u8F6C\u5230\u5F15\u7528(&&R)","\u5F15\u7528","\u67E5\u770B\u5F15\u7528","\u5F15\u7528","\u8F6C\u5230\u4EFB\u4F55\u7B26\u53F7","\u4F4D\u7F6E","\u65E0\u201C{0}\u201D\u7684\u7ED3\u679C","\u5F15\u7528"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["\u5355\u51FB\u663E\u793A {0} \u4E2A\u5B9A\u4E49\u3002"],"vs/editor/contrib/gotoSymbol/peek/referencesController":["\u6B63\u5728\u52A0\u8F7D...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} \u4E2A\u5F15\u7528","{0} \u4E2A\u5F15\u7528","\u5F15\u7528"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["\u65E0\u53EF\u7528\u9884\u89C8","\u65E0\u7ED3\u679C","\u5F15\u7528"],"vs/editor/contrib/gotoSymbol/referencesModel":["\u5728\u6587\u4EF6 {0} \u7684 {1} \u884C {2} \u5217\u7684\u7B26\u53F7","{0} \u4E2D {1} \u884C {2} \u5217\u7684\u7B26\u53F7\uFF0C{3}","{0} \u4E2D\u6709 1 \u4E2A\u7B26\u53F7\uFF0C\u5B8C\u6574\u8DEF\u5F84: {1}","{1} \u4E2D\u6709 {0} \u4E2A\u7B26\u53F7\uFF0C\u5B8C\u6574\u8DEF\u5F84: {2}","\u672A\u627E\u5230\u7ED3\u679C","\u5728 {0} \u4E2D\u627E\u5230 1 \u4E2A\u7B26\u53F7","\u5728 {1} \u4E2D\u627E\u5230 {0} \u4E2A\u7B26\u53F7","\u5728 {1} \u4E2A\u6587\u4EF6\u4E2D\u627E\u5230 {0} \u4E2A\u7B26\u53F7"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["{1} \u7684\u7B26\u53F7 {0}\uFF0C\u4E0B\u4E00\u4E2A\u4F7F\u7528 {2}","{1} \u7684\u7B26\u53F7 {0}"],"vs/editor/contrib/hover/hover":["\u663E\u793A\u60AC\u505C","\u663E\u793A\u5B9A\u4E49\u9884\u89C8\u60AC\u505C"],"vs/editor/contrib/hover/markdownHoverParticipant":["\u6B63\u5728\u52A0\u8F7D..."],"vs/editor/contrib/hover/markerHoverParticipant":["View Problem","\u6CA1\u6709\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u590D","\u6B63\u5728\u68C0\u67E5\u5FEB\u901F\u4FEE\u590D...","\u6CA1\u6709\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u590D","\u5FEB\u901F\u4FEE\u590D..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["\u66FF\u6362\u4E3A\u4E0A\u4E00\u4E2A\u503C","\u66FF\u6362\u4E3A\u4E0B\u4E00\u4E2A\u503C"],"vs/editor/contrib/indentation/indentation":["\u5C06\u7F29\u8FDB\u8F6C\u6362\u4E3A\u7A7A\u683C","\u5C06\u7F29\u8FDB\u8F6C\u6362\u4E3A\u5236\u8868\u7B26","\u5DF2\u914D\u7F6E\u5236\u8868\u7B26\u5927\u5C0F","\u9009\u62E9\u5F53\u524D\u6587\u4EF6\u7684\u5236\u8868\u7B26\u5927\u5C0F",'\u4F7F\u7528 "Tab" \u7F29\u8FDB',"\u4F7F\u7528\u7A7A\u683C\u7F29\u8FDB","\u4ECE\u5185\u5BB9\u4E2D\u68C0\u6D4B\u7F29\u8FDB\u65B9\u5F0F","\u91CD\u65B0\u7F29\u8FDB\u884C","\u91CD\u65B0\u7F29\u8FDB\u6240\u9009\u884C"],"vs/editor/contrib/linesOperations/linesOperations":["\u5411\u4E0A\u590D\u5236\u884C","\u5411\u4E0A\u590D\u5236\u884C(&&C)","\u5411\u4E0B\u590D\u5236\u884C","\u5411\u4E0B\u590D\u5236\u4E00\u884C(&&P)","\u91CD\u590D\u9009\u62E9","\u91CD\u590D\u9009\u62E9(&&D)","\u5411\u4E0A\u79FB\u52A8\u884C","\u5411\u4E0A\u79FB\u52A8\u4E00\u884C(&&V)","\u5411\u4E0B\u79FB\u52A8\u884C","\u5411\u4E0B\u79FB\u52A8\u4E00\u884C(&&L)","\u6309\u5347\u5E8F\u6392\u5217\u884C","\u6309\u964D\u5E8F\u6392\u5217\u884C","\u88C1\u526A\u5C3E\u968F\u7A7A\u683C","\u5220\u9664\u884C","\u884C\u7F29\u8FDB","\u884C\u51CF\u5C11\u7F29\u8FDB","\u5728\u4E0A\u9762\u63D2\u5165\u884C","\u5728\u4E0B\u9762\u63D2\u5165\u884C","\u5220\u9664\u5DE6\u4FA7\u6240\u6709\u5185\u5BB9","\u5220\u9664\u53F3\u4FA7\u6240\u6709\u5185\u5BB9","\u5408\u5E76\u884C","\u8F6C\u7F6E\u5149\u6807\u5904\u7684\u5B57\u7B26","\u8F6C\u6362\u4E3A\u5927\u5199","\u8F6C\u6362\u4E3A\u5C0F\u5199","\u8F6C\u6362\u4E3A\u8BCD\u9996\u5B57\u6BCD\u5927\u5199","\u8F6C\u6362\u4E3A\u86C7\u5F62\u547D\u540D\u6CD5"],"vs/editor/contrib/linkedEditing/linkedEditing":["\u542F\u52A8\u94FE\u63A5\u7F16\u8F91","\u7F16\u8F91\u5668\u6839\u636E\u7C7B\u578B\u81EA\u52A8\u91CD\u547D\u540D\u65F6\u7684\u80CC\u666F\u8272\u3002"],"vs/editor/contrib/links/links":["\u6267\u884C\u547D\u4EE4","\u5173\u6CE8\u94FE\u63A5","cmd + \u5355\u51FB","ctrl + \u5355\u51FB","option + \u5355\u51FB","alt + \u5355\u51FB","\u6267\u884C\u547D\u4EE4 {0}","\u6B64\u94FE\u63A5\u683C\u5F0F\u4E0D\u6B63\u786E\uFF0C\u65E0\u6CD5\u6253\u5F00: {0}","\u6B64\u94FE\u63A5\u76EE\u6807\u5DF2\u4E22\u5931\uFF0C\u65E0\u6CD5\u6253\u5F00\u3002","\u6253\u5F00\u94FE\u63A5"],"vs/editor/contrib/message/messageController":["Whether the editor is currently showing an inline message","\u65E0\u6CD5\u5728\u53EA\u8BFB\u7F16\u8F91\u5668\u4E2D\u7F16\u8F91"],"vs/editor/contrib/multicursor/multicursor":["\u5728\u4E0A\u9762\u6DFB\u52A0\u5149\u6807","\u5728\u4E0A\u9762\u6DFB\u52A0\u5149\u6807(&&A)","\u5728\u4E0B\u9762\u6DFB\u52A0\u5149\u6807","\u5728\u4E0B\u9762\u6DFB\u52A0\u5149\u6807(&&D)","\u5728\u884C\u5C3E\u6DFB\u52A0\u5149\u6807","\u5728\u884C\u5C3E\u6DFB\u52A0\u5149\u6807(&&U)","\u5728\u5E95\u90E8\u6DFB\u52A0\u5149\u6807","\u5728\u9876\u90E8\u6DFB\u52A0\u5149\u6807","\u5C06\u4E0B\u4E00\u4E2A\u67E5\u627E\u5339\u914D\u9879\u6DFB\u52A0\u5230\u9009\u62E9","\u6DFB\u52A0\u4E0B\u4E00\u4E2A\u5339\u914D\u9879(&&N)","\u5C06\u9009\u62E9\u5185\u5BB9\u6DFB\u52A0\u5230\u4E0A\u4E00\u67E5\u627E\u5339\u914D\u9879","\u6DFB\u52A0\u4E0A\u4E00\u4E2A\u5339\u914D\u9879(&&R)","\u5C06\u4E0A\u6B21\u9009\u62E9\u79FB\u52A8\u5230\u4E0B\u4E00\u4E2A\u67E5\u627E\u5339\u914D\u9879","\u5C06\u4E0A\u4E2A\u9009\u62E9\u5185\u5BB9\u79FB\u52A8\u5230\u4E0A\u4E00\u67E5\u627E\u5339\u914D\u9879","\u9009\u62E9\u6240\u6709\u627E\u5230\u7684\u67E5\u627E\u5339\u914D\u9879","\u9009\u62E9\u6240\u6709\u5339\u914D\u9879(&&O)","\u66F4\u6539\u6240\u6709\u5339\u914D\u9879"],"vs/editor/contrib/parameterHints/parameterHints":["\u89E6\u53D1\u53C2\u6570\u63D0\u793A"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["\u201C\u663E\u793A\u4E0B\u4E00\u4E2A\u53C2\u6570\u201D\u63D0\u793A\u7684\u56FE\u6807\u3002","\u201C\u663E\u793A\u4E0A\u4E00\u4E2A\u53C2\u6570\u201D\u63D0\u793A\u7684\u56FE\u6807\u3002","{0}\uFF0C\u63D0\u793A"],"vs/editor/contrib/peekView/peekView":["\u5173\u95ED","\u901F\u89C8\u89C6\u56FE\u6807\u9898\u533A\u57DF\u80CC\u666F\u989C\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u6807\u9898\u989C\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u6807\u9898\u4FE1\u606F\u989C\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u8FB9\u6846\u548C\u7BAD\u5934\u989C\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u80CC\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u884C\u8282\u70B9\u7684\u524D\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u6587\u4EF6\u8282\u70B9\u7684\u524D\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u6240\u9009\u6761\u76EE\u7684\u80CC\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u6240\u9009\u6761\u76EE\u7684\u524D\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u80CC\u666F\u8272\u3002","\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u4E2D\u88C5\u8BA2\u7EBF\u7684\u80CC\u666F\u8272\u3002","\u5728\u901F\u89C8\u89C6\u56FE\u7ED3\u679C\u5217\u8868\u4E2D\u5339\u914D\u7A81\u51FA\u663E\u793A\u989C\u8272\u3002","\u5728\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u4E2D\u5339\u914D\u7A81\u51FA\u663E\u793A\u989C\u8272\u3002","\u5728\u901F\u89C8\u89C6\u56FE\u7F16\u8F91\u5668\u4E2D\u5339\u914D\u9879\u7684\u7A81\u51FA\u663E\u793A\u8FB9\u6846\u3002"],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["\u5148\u6253\u5F00\u6587\u672C\u7F16\u8F91\u5668\u7136\u540E\u8DF3\u8F6C\u5230\u884C\u3002","\u8F6C\u5230\u7B2C {0} \u884C\u3001\u7B2C {1} \u5217\u3002","\u8F6C\u5230\u884C {0}\u3002","\u5F53\u524D\u884C: {0}\uFF0C\u5B57\u7B26: {1}\u3002\u952E\u5165\u8981\u5BFC\u822A\u5230\u7684\u884C\u53F7(\u4ECB\u4E8E 1 \u81F3 {2} \u4E4B\u95F4)\u3002","\u5F53\u524D\u884C: {0}\uFF0C\u5B57\u7B26: {1}\u3002 \u952E\u5165\u8981\u5BFC\u822A\u5230\u7684\u884C\u53F7\u3002"],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["\u8981\u8F6C\u5230\u7B26\u53F7\uFF0C\u9996\u5148\u6253\u5F00\u5177\u6709\u7B26\u53F7\u4FE1\u606F\u7684\u6587\u672C\u7F16\u8F91\u5668\u3002","\u6D3B\u52A8\u6587\u672C\u7F16\u8F91\u5668\u4E0D\u63D0\u4F9B\u7B26\u53F7\u4FE1\u606F\u3002","\u6CA1\u6709\u5339\u914D\u7684\u7F16\u8F91\u5668\u7B26\u53F7","\u6CA1\u6709\u7F16\u8F91\u5668\u7B26\u53F7","\u5728\u4FA7\u8FB9\u6253\u5F00","\u5728\u5E95\u90E8\u6253\u5F00","\u7B26\u53F7({0})","\u5C5E\u6027({0})","\u65B9\u6CD5({0})","\u51FD\u6570({0})","\u6784\u9020\u51FD\u6570 ({0})","\u53D8\u91CF({0})","\u7C7B({0})","\u7ED3\u6784({0})","\u4E8B\u4EF6({0})","\u8FD0\u7B97\u7B26({0})","\u63A5\u53E3({0})","\u547D\u540D\u7A7A\u95F4({0})","\u5305({0})","\u7C7B\u578B\u53C2\u6570({0})","\u6A21\u5757({0})","\u5C5E\u6027({0})","\u679A\u4E3E({0})","\u679A\u4E3E\u6210\u5458({0})","\u5B57\u7B26\u4E32({0})","\u6587\u4EF6({0})","\u6570\u7EC4({0})","\u6570\u5B57({0})","\u5E03\u5C14\u503C({0})","\u5BF9\u8C61({0})","\u952E({0})","\u5B57\u6BB5({0})","\u5E38\u91CF({0})"],"vs/editor/contrib/rename/rename":["\u65E0\u7ED3\u679C\u3002","\u89E3\u6790\u91CD\u547D\u540D\u4F4D\u7F6E\u65F6\u53D1\u751F\u672A\u77E5\u9519\u8BEF","\u6B63\u5728\u91CD\u547D\u540D\u201C{0}\u201D","\u91CD\u547D\u540D {0}","\u6210\u529F\u5C06\u201C{0}\u201D\u91CD\u547D\u540D\u4E3A\u201C{1}\u201D\u3002\u6458\u8981: {2}","\u91CD\u547D\u540D\u65E0\u6CD5\u5E94\u7528\u4FEE\u6539","\u91CD\u547D\u540D\u65E0\u6CD5\u8BA1\u7B97\u4FEE\u6539","\u91CD\u547D\u540D\u7B26\u53F7","\u542F\u7528/\u7981\u7528\u91CD\u547D\u540D\u4E4B\u524D\u9884\u89C8\u66F4\u6539\u7684\u529F\u80FD"],"vs/editor/contrib/rename/renameInputField":['\u91CD\u547D\u540D\u8F93\u5165\u3002\u952E\u5165\u65B0\u540D\u79F0\u5E76\u6309 "Enter" \u63D0\u4EA4\u3002',"\u6309 {0} \u8FDB\u884C\u91CD\u547D\u540D\uFF0C\u6309 {1} \u8FDB\u884C\u9884\u89C8"],"vs/editor/contrib/smartSelect/smartSelect":["\u5C55\u5F00\u9009\u62E9","\u5C55\u5F00\u9009\u5B9A\u5185\u5BB9(&&E)","\u6536\u8D77\u9009\u62E9","\u7F29\u5C0F\u9009\u5B9A\u8303\u56F4(&&S)"],"vs/editor/contrib/snippet/snippetVariables":["\u661F\u671F\u5929","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D","\u5468\u65E5","\u5468\u4E00","\u5468\u4E8C","\u5468\u4E09","\u5468\u56DB","\u5468\u4E94","\u5468\u516D","\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","5\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708","1\u6708","2\u6708","3\u6708","4\u6708","5\u6708","6\u6708","7\u6708","8\u6708","9\u6708","10\u6708","11 \u6708","12\u6708"],"vs/editor/contrib/suggest/suggestController":["\u9009\u62E9\u201C{0}\u201D\u540E\u8FDB\u884C\u4E86\u5176\u4ED6 {1} \u6B21\u7F16\u8F91","\u89E6\u53D1\u5EFA\u8BAE","\u63D2\u5165","\u63D2\u5165","\u66FF\u6362","\u66FF\u6362","\u63D2\u5165","\u663E\u793A\u66F4\u5C11","\u663E\u793A\u66F4\u591A","\u91CD\u7F6E\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u5927\u5C0F"],"vs/editor/contrib/suggest/suggestWidget":["\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u80CC\u666F\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u7684\u524D\u666F\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u6240\u9009\u6761\u76EE\u7684\u80CC\u666F\u8272\u3002","\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u5339\u914D\u5185\u5BB9\u7684\u9AD8\u4EAE\u989C\u8272\u3002","\u6B63\u5728\u52A0\u8F7D...","\u65E0\u5EFA\u8BAE\u3002","{0}\uFF0C\u6587\u6863: {1}","\u5EFA\u8BAE"],"vs/editor/contrib/suggest/suggestWidgetDetails":["\u5173\u95ED","\u6B63\u5728\u52A0\u8F7D\u2026"],"vs/editor/contrib/suggest/suggestWidgetRenderer":["\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u7684\u8BE6\u7EC6\u4FE1\u606F\u7684\u56FE\u6807\u3002","\u4E86\u89E3\u8BE6\u7EC6\u4FE1\u606F"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["\u6570\u7EC4\u7B26\u53F7\u7684\u524D\u666F\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u5C06\u663E\u793A\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u5E03\u5C14\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7C7B\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u989C\u8272\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5E38\u91CF\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6784\u9020\u51FD\u6570\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u679A\u4E3E\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u679A\u4E3E\u5668\u6210\u5458\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u4E8B\u4EF6\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5B57\u6BB5\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6587\u4EF6\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6587\u4EF6\u5939\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u51FD\u6570\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u63A5\u53E3\u7B26\u53F7\u7684\u524D\u666F\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u5C06\u663E\u793A\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u952E\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5173\u952E\u5B57\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u65B9\u6CD5\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6A21\u5757\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u547D\u540D\u7A7A\u95F4\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u8F6E\u5ED3\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7A7A\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6570\u5B57\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5BF9\u8C61\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u8FD0\u7B97\u7B26\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5305\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5C5E\u6027\u7B26\u53F7\u7684\u524D\u666F\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u7EC4\u4EF6\u4E2D\u3002","\u53C2\u8003\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7247\u6BB5\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5B57\u7B26\u4E32\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u8F6E\u5ED3\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7ED3\u6784\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u6587\u672C\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u7C7B\u578B\u53C2\u6570\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u5355\u4F4D\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002","\u53D8\u91CF\u7B26\u53F7\u7684\u524D\u666F\u989C\u8272\u3002\u8FD9\u4E9B\u7B26\u53F7\u51FA\u73B0\u5728\u5927\u7EB2\u3001\u75D5\u8FF9\u5BFC\u822A\u680F\u548C\u5EFA\u8BAE\u5C0F\u90E8\u4EF6\u4E2D\u3002"],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["\u5207\u6362 Tab \u952E\u79FB\u52A8\u7126\u70B9","Tab \u952E\u5C06\u79FB\u52A8\u5230\u4E0B\u4E00\u53EF\u805A\u7126\u7684\u5143\u7D20","Tab \u952E\u5C06\u63D2\u5165\u5236\u8868\u7B26"],"vs/editor/contrib/tokenization/tokenization":["\u5F00\u53D1\u4EBA\u5458: \u5F3A\u5236\u91CD\u65B0\u8FDB\u884C\u6807\u8BB0"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["\u5F02\u5E38\u884C\u7EC8\u6B62\u7B26","\u68C0\u6D4B\u5230\u5F02\u5E38\u884C\u7EC8\u6B62\u7B26",`\u6B64\u6587\u4EF6\u5305\u542B\u4E00\u4E2A\u6216\u591A\u4E2A\u5F02\u5E38\u7684\u884C\u7EC8\u6B62\u7B26\uFF0C\u4F8B\u5982\u884C\u5206\u9694\u7B26(LS)\u6216\u6BB5\u843D\u5206\u9694\u7B26(PS)\u3002\r +\r +\u5EFA\u8BAE\u4ECE\u6587\u4EF6\u4E2D\u5220\u9664\u5B83\u4EEC\u3002\u53EF\u901A\u8FC7 "editor.unusualLineTerminators" \u8FDB\u884C\u914D\u7F6E\u3002`,"\u4FEE\u590D\u6B64\u6587\u4EF6","\u5FFD\u7565\u6B64\u6587\u4EF6\u7684\u95EE\u9898"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["\u8BFB\u53D6\u8BBF\u95EE\u671F\u95F4\u7B26\u53F7\u7684\u80CC\u666F\u8272\uFF0C\u4F8B\u5982\u8BFB\u53D6\u53D8\u91CF\u65F6\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5199\u5165\u8BBF\u95EE\u8FC7\u7A0B\u4E2D\u7B26\u53F7\u7684\u80CC\u666F\u8272\uFF0C\u4F8B\u5982\u5199\u5165\u53D8\u91CF\u65F6\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7B26\u53F7\u5728\u8FDB\u884C\u8BFB\u53D6\u8BBF\u95EE\u64CD\u4F5C\u65F6\u7684\u8FB9\u6846\u989C\u8272\uFF0C\u4F8B\u5982\u8BFB\u53D6\u53D8\u91CF\u3002","\u7B26\u53F7\u5728\u8FDB\u884C\u5199\u5165\u8BBF\u95EE\u64CD\u4F5C\u65F6\u7684\u8FB9\u6846\u989C\u8272\uFF0C\u4F8B\u5982\u5199\u5165\u53D8\u91CF\u3002","\u7528\u4E8E\u7A81\u51FA\u663E\u793A\u7B26\u53F7\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7528\u4E8E\u7A81\u51FA\u663E\u793A\u5199\u6743\u9650\u7B26\u53F7\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u8F6C\u5230\u4E0B\u4E00\u4E2A\u7A81\u51FA\u663E\u793A\u7684\u7B26\u53F7","\u8F6C\u5230\u4E0A\u4E00\u4E2A\u7A81\u51FA\u663E\u793A\u7684\u7B26\u53F7","\u89E6\u53D1\u7B26\u53F7\u9AD8\u4EAE"],"vs/editor/contrib/wordOperations/wordOperations":["\u5220\u9664 Word"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["\u9ED8\u8BA4\u8BED\u8A00\u914D\u7F6E\u66FF\u4EE3","\u9488\u5BF9\u67D0\u79CD\u8BED\u8A00\uFF0C\u914D\u7F6E\u66FF\u4EE3\u7F16\u8F91\u5668\u8BBE\u7F6E\u3002","\u6B64\u8BBE\u7F6E\u4E0D\u652F\u6301\u6309\u8BED\u8A00\u914D\u7F6E\u3002","\u65E0\u6CD5\u6CE8\u518C\u7A7A\u5C5E\u6027",'\u65E0\u6CD5\u6CE8\u518C\u201C{0}\u201D\u3002\u5176\u7B26\u5408\u63CF\u8FF0\u7279\u5B9A\u8BED\u8A00\u7F16\u8F91\u5668\u8BBE\u7F6E\u7684\u8868\u8FBE\u5F0F "\\\\[.*\\\\]$"\u3002\u8BF7\u4F7F\u7528 "configurationDefaults"\u3002',"\u65E0\u6CD5\u6CE8\u518C\u201C{0}\u201D\u3002\u6B64\u5C5E\u6027\u5DF2\u6CE8\u518C\u3002"],"vs/platform/contextkey/browser/contextKeyService":["A command that returns information about context keys"],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["({0})\u5DF2\u6309\u4E0B\u3002\u6B63\u5728\u7B49\u5F85\u6309\u4E0B\u7B2C\u4E8C\u4E2A\u952E...","\u7EC4\u5408\u952E({0}\uFF0C{1})\u4E0D\u662F\u547D\u4EE4\u3002"],"vs/platform/list/browser/listService":["\u5DE5\u4F5C\u53F0","\u6620\u5C04\u4E3A `Ctrl` (Windows \u548C Linux) \u6216 `Command` (macOS)\u3002","\u6620\u5C04\u4E3A `Alt` (Windows \u548C Linux) \u6216 `Option` (macOS)\u3002","\u5728\u901A\u8FC7\u9F20\u6807\u591A\u9009\u6811\u548C\u5217\u8868\u6761\u76EE\u65F6\u4F7F\u7528\u7684\u4FEE\u6539\u952E (\u4F8B\u5982\u201C\u8D44\u6E90\u7BA1\u7406\u5668\u201D\u3001\u201C\u6253\u5F00\u7684\u7F16\u8F91\u5668\u201D\u548C\u201C\u6E90\u4EE3\u7801\u7BA1\u7406\u201D\u89C6\u56FE)\u3002\u201C\u5728\u4FA7\u8FB9\u6253\u5F00\u201D\u529F\u80FD\u6240\u9700\u7684\u9F20\u6807\u52A8\u4F5C (\u82E5\u53EF\u7528) \u5C06\u4F1A\u76F8\u5E94\u8C03\u6574\uFF0C\u4E0D\u4E0E\u591A\u9009\u4FEE\u6539\u952E\u51B2\u7A81\u3002","\u63A7\u5236\u5728\u6811\u548C\u5217\u8868\u4E2D\u600E\u6837\u4F7F\u7528\u9F20\u6807\u6765\u5C55\u5F00\u5B50\u9879(\u82E5\u652F\u6301)\u3002\u5BF9\u4E8E\u6811\u4E2D\u7684\u7236\u8282\u70B9\uFF0C\u6B64\u8BBE\u7F6E\u5C06\u63A7\u5236\u662F\u4F7F\u7528\u5355\u51FB\u8FD8\u662F\u53CC\u51FB\u6765\u5C55\u5F00\u3002\u6CE8\u610F\uFF0C\u67D0\u4E9B\u4E0D\u9002\u7528\u4E8E\u6B64\u8BBE\u7F6E\u7684\u6811\u6216\u5217\u8868\u53EF\u80FD\u4F1A\u5FFD\u7565\u6B64\u9879\u3002 ","\u63A7\u5236\u5217\u8868\u548C\u6811\u662F\u5426\u652F\u6301\u5DE5\u4F5C\u53F0\u4E2D\u7684\u6C34\u5E73\u6EDA\u52A8\u3002\u8B66\u544A: \u6253\u5F00\u6B64\u8BBE\u7F6E\u5F71\u54CD\u4F1A\u5F71\u54CD\u6027\u80FD\u3002","\u63A7\u5236\u6811\u7F29\u8FDB(\u4EE5\u50CF\u7D20\u4E3A\u5355\u4F4D)\u3002","\u63A7\u5236\u6811\u662F\u5426\u5E94\u5448\u73B0\u7F29\u8FDB\u53C2\u8003\u7EBF\u3002","\u63A7\u5236\u5217\u8868\u548C\u6811\u662F\u5426\u5177\u6709\u5E73\u6ED1\u6EDA\u52A8\u3002","\u7B80\u5355\u952E\u76D8\u5BFC\u822A\u805A\u7126\u4E0E\u952E\u76D8\u8F93\u5165\u76F8\u5339\u914D\u7684\u5143\u7D20\u3002\u4EC5\u5BF9\u524D\u7F00\u8FDB\u884C\u5339\u914D\u3002","\u9AD8\u4EAE\u952E\u76D8\u5BFC\u822A\u4F1A\u7A81\u51FA\u663E\u793A\u4E0E\u952E\u76D8\u8F93\u5165\u76F8\u5339\u914D\u7684\u5143\u7D20\u3002\u8FDB\u4E00\u6B65\u5411\u4E0A\u548C\u5411\u4E0B\u5BFC\u822A\u5C06\u4EC5\u904D\u5386\u7A81\u51FA\u663E\u793A\u7684\u5143\u7D20\u3002","\u7B5B\u9009\u5668\u952E\u76D8\u5BFC\u822A\u5C06\u7B5B\u9009\u51FA\u5E76\u9690\u85CF\u4E0E\u952E\u76D8\u8F93\u5165\u4E0D\u5339\u914D\u7684\u6240\u6709\u5143\u7D20\u3002","\u63A7\u5236\u5DE5\u4F5C\u53F0\u4E2D\u7684\u5217\u8868\u548C\u6811\u7684\u952E\u76D8\u5BFC\u822A\u6837\u5F0F\u3002\u5B83\u53EF\u4E3A\u201C\u7B80\u5355\u201D\u3001\u201C\u7A81\u51FA\u663E\u793A\u201D\u6216\u201C\u7B5B\u9009\u201D\u3002","\u63A7\u5236\u5217\u8868\u548C\u6811\u4E2D\u7684\u952E\u76D8\u5BFC\u822A\u662F\u5426\u4EC5\u901A\u8FC7\u952E\u5165\u81EA\u52A8\u89E6\u53D1\u3002\u5982\u679C\u8BBE\u7F6E\u4E3A `false` \uFF0C\u952E\u76D8\u5BFC\u822A\u53EA\u5728\u6267\u884C `list.toggleKeyboardNavigation` \u547D\u4EE4\u65F6\u89E6\u53D1\uFF0C\u60A8\u53EF\u4EE5\u4E3A\u8BE5\u547D\u4EE4\u6307\u5B9A\u952E\u76D8\u5FEB\u6377\u65B9\u5F0F\u3002","\u63A7\u5236\u5355\u51FB\u6587\u4EF6\u5939\u540D\u79F0\u65F6\u5982\u4F55\u5C55\u5F00\u6811\u6587\u4EF6\u5939\u3002"],"vs/platform/markers/common/markers":["\u9519\u8BEF","\u8B66\u544A","\u4FE1\u606F"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","\u6700\u8FD1\u4F7F\u7528","\u5176\u4ED6\u547D\u4EE4",'\u547D\u4EE4"{0}"\u5BFC\u81F4\u9519\u8BEF ({1})'],"vs/platform/quickinput/browser/helpQuickAccess":["\u5168\u5C40\u547D\u4EE4","\u7F16\u8F91\u5668\u547D\u4EE4","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["\u6574\u4F53\u524D\u666F\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u4E0D\u88AB\u7EC4\u4EF6\u8986\u76D6\u65F6\u9002\u7528\u3002","\u9519\u8BEF\u4FE1\u606F\u7684\u6574\u4F53\u524D\u666F\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u4E0D\u88AB\u7EC4\u4EF6\u8986\u76D6\u65F6\u9002\u7528\u3002","\u5DE5\u4F5C\u53F0\u4E2D\u56FE\u6807\u7684\u9ED8\u8BA4\u989C\u8272\u3002","\u7126\u70B9\u5143\u7D20\u7684\u6574\u4F53\u8FB9\u6846\u989C\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u4E0D\u88AB\u5176\u4ED6\u7EC4\u4EF6\u8986\u76D6\u65F6\u9002\u7528\u3002","\u5728\u5143\u7D20\u5468\u56F4\u989D\u5916\u7684\u4E00\u5C42\u8FB9\u6846\uFF0C\u7528\u6765\u63D0\u9AD8\u5BF9\u6BD4\u5EA6\u4ECE\u800C\u533A\u522B\u5176\u4ED6\u5143\u7D20\u3002","\u5728\u6D3B\u52A8\u5143\u7D20\u5468\u56F4\u989D\u5916\u7684\u4E00\u5C42\u8FB9\u6846\uFF0C\u7528\u6765\u63D0\u9AD8\u5BF9\u6BD4\u5EA6\u4ECE\u800C\u533A\u522B\u5176\u4ED6\u5143\u7D20\u3002","\u6587\u672C\u4E2D\u94FE\u63A5\u7684\u524D\u666F\u8272\u3002","\u6587\u672C\u4E2D\u4EE3\u7801\u5757\u7684\u80CC\u666F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5185\u5C0F\u7EC4\u4EF6(\u5982\u67E5\u627E/\u66FF\u6362)\u7684\u9634\u5F71\u989C\u8272\u3002","\u8F93\u5165\u6846\u80CC\u666F\u8272\u3002","\u8F93\u5165\u6846\u524D\u666F\u8272\u3002","\u8F93\u5165\u6846\u8FB9\u6846\u3002","\u8F93\u5165\u5B57\u6BB5\u4E2D\u5DF2\u6FC0\u6D3B\u9009\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u8F93\u5165\u5B57\u6BB5\u4E2D\u6FC0\u6D3B\u9009\u9879\u7684\u80CC\u666F\u989C\u8272\u3002","\u8F93\u5165\u5B57\u6BB5\u4E2D\u5DF2\u6FC0\u6D3B\u7684\u9009\u9879\u7684\u524D\u666F\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u4FE1\u606F\u7EA7\u522B\u65F6\u7684\u80CC\u666F\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u4FE1\u606F\u7EA7\u522B\u65F6\u7684\u524D\u666F\u8272\u3002","\u4E25\u91CD\u6027\u4E3A\u4FE1\u606F\u65F6\u8F93\u5165\u9A8C\u8BC1\u7684\u8FB9\u6846\u989C\u8272\u3002","\u4E25\u91CD\u6027\u4E3A\u8B66\u544A\u65F6\u8F93\u5165\u9A8C\u8BC1\u7684\u80CC\u666F\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u8B66\u544A\u7EA7\u522B\u65F6\u7684\u524D\u666F\u8272\u3002","\u4E25\u91CD\u6027\u4E3A\u8B66\u544A\u65F6\u8F93\u5165\u9A8C\u8BC1\u7684\u8FB9\u6846\u989C\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u9519\u8BEF\u7EA7\u522B\u65F6\u7684\u80CC\u666F\u8272\u3002","\u8F93\u5165\u9A8C\u8BC1\u7ED3\u679C\u4E3A\u9519\u8BEF\u7EA7\u522B\u65F6\u7684\u524D\u666F\u8272\u3002","\u4E25\u91CD\u6027\u4E3A\u9519\u8BEF\u65F6\u8F93\u5165\u9A8C\u8BC1\u7684\u8FB9\u6846\u989C\u8272\u3002","\u4E0B\u62C9\u5217\u8868\u80CC\u666F\u8272\u3002","\u4E0B\u62C9\u5217\u8868\u524D\u666F\u8272\u3002","\u6309\u94AE\u524D\u666F\u8272\u3002","\u6309\u94AE\u80CC\u666F\u8272\u3002","\u6309\u94AE\u5728\u60AC\u505C\u65F6\u7684\u80CC\u666F\u989C\u8272\u3002","Badge \u80CC\u666F\u8272\u3002Badge \u662F\u5C0F\u578B\u7684\u4FE1\u606F\u6807\u7B7E\uFF0C\u5982\u8868\u793A\u641C\u7D22\u7ED3\u679C\u6570\u91CF\u7684\u6807\u7B7E\u3002","Badge \u524D\u666F\u8272\u3002Badge \u662F\u5C0F\u578B\u7684\u4FE1\u606F\u6807\u7B7E\uFF0C\u5982\u8868\u793A\u641C\u7D22\u7ED3\u679C\u6570\u91CF\u7684\u6807\u7B7E\u3002","\u8868\u793A\u89C6\u56FE\u88AB\u6EDA\u52A8\u7684\u6EDA\u52A8\u6761\u9634\u5F71\u3002","\u6EDA\u52A8\u6761\u6ED1\u5757\u80CC\u666F\u8272","\u6EDA\u52A8\u6761\u6ED1\u5757\u5728\u60AC\u505C\u65F6\u7684\u80CC\u666F\u8272","\u6EDA\u52A8\u6761\u6ED1\u5757\u5728\u88AB\u70B9\u51FB\u65F6\u7684\u80CC\u666F\u8272\u3002","\u8868\u793A\u957F\u65F6\u95F4\u64CD\u4F5C\u7684\u8FDB\u5EA6\u6761\u7684\u80CC\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u9519\u8BEF\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7F16\u8F91\u5668\u4E2D\u9519\u8BEF\u6CE2\u6D6A\u7EBF\u7684\u524D\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u9519\u8BEF\u6846\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u8B66\u544A\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7F16\u8F91\u5668\u4E2D\u8B66\u544A\u6CE2\u6D6A\u7EBF\u7684\u524D\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u8B66\u544A\u6846\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u4FE1\u606F\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7F16\u8F91\u5668\u4E2D\u4FE1\u606F\u6CE2\u6D6A\u7EBF\u7684\u524D\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u4FE1\u606F\u6846\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u63D0\u793A\u6CE2\u6D6A\u7EBF\u7684\u524D\u666F\u8272\u3002","\u7F16\u8F91\u5668\u4E2D\u63D0\u793A\u6846\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u80CC\u666F\u8272\u3002","\u7F16\u8F91\u5668\u9ED8\u8BA4\u524D\u666F\u8272\u3002","\u7F16\u8F91\u5668\u7EC4\u4EF6(\u5982\u67E5\u627E/\u66FF\u6362)\u80CC\u666F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u5C0F\u90E8\u4EF6\u7684\u524D\u666F\u8272\uFF0C\u5982\u67E5\u627E/\u66FF\u6362\u3002","\u7F16\u8F91\u5668\u5C0F\u90E8\u4EF6\u7684\u8FB9\u6846\u989C\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u5C0F\u90E8\u4EF6\u6709\u8FB9\u6846\u4E14\u4E0D\u88AB\u5C0F\u90E8\u4EF6\u91CD\u5199\u65F6\u9002\u7528\u3002","\u7F16\u8F91\u5668\u5C0F\u90E8\u4EF6\u5927\u5C0F\u8C03\u6574\u6761\u7684\u8FB9\u6846\u989C\u8272\u3002\u6B64\u989C\u8272\u4EC5\u5728\u5C0F\u90E8\u4EF6\u6709\u8C03\u6574\u8FB9\u6846\u4E14\u4E0D\u88AB\u5C0F\u90E8\u4EF6\u989C\u8272\u8986\u76D6\u65F6\u4F7F\u7528\u3002","\u80CC\u666F\u989C\u8272\u5FEB\u901F\u9009\u53D6\u5668\u3002\u5FEB\u901F\u9009\u53D6\u5668\u5C0F\u90E8\u4EF6\u662F\u9009\u53D6\u5668(\u5982\u547D\u4EE4\u8C03\u8272\u677F)\u7684\u5BB9\u5668\u3002","\u524D\u666F\u989C\u8272\u5FEB\u901F\u9009\u53D6\u5668\u3002\u5FEB\u901F\u9009\u53D6\u5668\u5C0F\u90E8\u4EF6\u662F\u547D\u4EE4\u8C03\u8272\u677F\u7B49\u9009\u53D6\u5668\u7684\u5BB9\u5668\u3002","\u6807\u9898\u80CC\u666F\u989C\u8272\u5FEB\u901F\u9009\u53D6\u5668\u3002\u5FEB\u901F\u9009\u53D6\u5668\u5C0F\u90E8\u4EF6\u662F\u547D\u4EE4\u8C03\u8272\u677F\u7B49\u9009\u53D6\u5668\u7684\u5BB9\u5668\u3002","Quick picker background color for the focused item.","\u5FEB\u901F\u9009\u53D6\u5668\u5206\u7EC4\u6807\u7B7E\u7684\u989C\u8272\u3002","\u5FEB\u901F\u9009\u53D6\u5668\u5206\u7EC4\u8FB9\u6846\u7684\u989C\u8272\u3002","\u7F16\u8F91\u5668\u6240\u9009\u5185\u5BB9\u7684\u989C\u8272\u3002","\u7528\u4EE5\u5F70\u663E\u9AD8\u5BF9\u6BD4\u5EA6\u7684\u6240\u9009\u6587\u672C\u7684\u989C\u8272\u3002","\u975E\u6D3B\u52A8\u7F16\u8F91\u5668\u4E2D\u6240\u9009\u5185\u5BB9\u7684\u989C\u8272\uFF0C\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u88C5\u9970\u6548\u679C\u3002","\u5177\u6709\u4E0E\u6240\u9009\u9879\u76F8\u5173\u5185\u5BB9\u7684\u533A\u57DF\u7684\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u4E0E\u6240\u9009\u9879\u5185\u5BB9\u76F8\u540C\u7684\u533A\u57DF\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5F53\u524D\u641C\u7D22\u5339\u914D\u9879\u7684\u989C\u8272\u3002","\u5176\u4ED6\u641C\u7D22\u5339\u914D\u9879\u7684\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u9650\u5236\u641C\u7D22\u8303\u56F4\u7684\u989C\u8272\u3002\u989C\u8272\u4E0D\u80FD\u4E0D\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u5E95\u5C42\u88C5\u9970\u3002","\u5F53\u524D\u641C\u7D22\u5339\u914D\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5176\u4ED6\u641C\u7D22\u5339\u914D\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u9650\u5236\u641C\u7D22\u7684\u8303\u56F4\u7684\u8FB9\u6846\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5728\u4E0B\u9762\u7A81\u51FA\u663E\u793A\u60AC\u505C\u7684\u5B57\u8BCD\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7F16\u8F91\u5668\u60AC\u505C\u63D0\u793A\u7684\u80CC\u666F\u989C\u8272\u3002","\u7F16\u8F91\u5668\u60AC\u505C\u7684\u524D\u666F\u989C\u8272\u3002","\u5149\u6807\u60AC\u505C\u65F6\u7F16\u8F91\u5668\u7684\u8FB9\u6846\u989C\u8272\u3002","\u7F16\u8F91\u5668\u60AC\u505C\u72B6\u6001\u680F\u7684\u80CC\u666F\u8272\u3002","\u6D3B\u52A8\u94FE\u63A5\u989C\u8272\u3002","\u5185\u8054\u63D0\u793A\u7684\u524D\u666F\u8272","\u5185\u8054\u63D0\u793A\u7684\u80CC\u666F\u8272","\u7528\u4E8E\u706F\u6CE1\u64CD\u4F5C\u56FE\u6807\u7684\u989C\u8272\u3002","\u7528\u4E8E\u706F\u6CE1\u81EA\u52A8\u4FEE\u590D\u64CD\u4F5C\u56FE\u6807\u7684\u989C\u8272\u3002","\u5DF2\u63D2\u5165\u7684\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u5DF2\u5220\u9664\u7684\u6587\u672C\u7684\u80CC\u666F\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u63D2\u5165\u7684\u6587\u672C\u7684\u8F6E\u5ED3\u989C\u8272\u3002","\u88AB\u5220\u9664\u6587\u672C\u7684\u8F6E\u5ED3\u989C\u8272\u3002","\u4E24\u4E2A\u6587\u672C\u7F16\u8F91\u5668\u4E4B\u95F4\u7684\u8FB9\u6846\u989C\u8272\u3002","\u5DEE\u5F02\u7F16\u8F91\u5668\u7684\u5BF9\u89D2\u7EBF\u586B\u5145\u989C\u8272\u3002\u5BF9\u89D2\u7EBF\u586B\u5145\u7528\u4E8E\u5E76\u6392\u5DEE\u5F02\u89C6\u56FE\u3002","\u7126\u70B9\u9879\u5728\u5217\u8868\u6216\u6811\u6D3B\u52A8\u65F6\u7684\u80CC\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u7126\u70B9\u9879\u5728\u5217\u8868\u6216\u6811\u6D3B\u52A8\u65F6\u7684\u524D\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.","\u5DF2\u9009\u9879\u5728\u5217\u8868\u6216\u6811\u6D3B\u52A8\u65F6\u7684\u80CC\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5DF2\u9009\u9879\u5728\u5217\u8868\u6216\u6811\u6D3B\u52A8\u65F6\u7684\u524D\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5DF2\u9009\u9879\u5728\u5217\u8868\u6216\u6811\u975E\u6D3B\u52A8\u65F6\u7684\u80CC\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u5DF2\u9009\u9879\u5728\u5217\u8868\u6216\u6811\u975E\u6D3B\u52A8\u65F6\u7684\u524D\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","\u975E\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u63A7\u4EF6\u4E2D\u7126\u70B9\u9879\u7684\u80CC\u666F\u989C\u8272\u3002\u6D3B\u52A8\u7684\u5217\u8868\u6216\u6811\u5177\u6709\u952E\u76D8\u7126\u70B9\uFF0C\u975E\u6D3B\u52A8\u7684\u6CA1\u6709\u3002","List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.","\u4F7F\u7528\u9F20\u6807\u79FB\u52A8\u9879\u76EE\u65F6\uFF0C\u5217\u8868\u6216\u6811\u7684\u80CC\u666F\u989C\u8272\u3002","\u9F20\u6807\u5728\u9879\u76EE\u4E0A\u60AC\u505C\u65F6\uFF0C\u5217\u8868\u6216\u6811\u7684\u524D\u666F\u989C\u8272\u3002","\u4F7F\u7528\u9F20\u6807\u79FB\u52A8\u9879\u76EE\u65F6\uFF0C\u5217\u8868\u6216\u6811\u8FDB\u884C\u62D6\u653E\u7684\u80CC\u666F\u989C\u8272\u3002","\u5728\u5217\u8868\u6216\u6811\u4E2D\u641C\u7D22\u65F6\uFF0C\u5176\u4E2D\u5339\u914D\u5185\u5BB9\u7684\u9AD8\u4EAE\u989C\u8272\u3002","\u5217\u8868\u548C\u6811\u4E2D\u7C7B\u578B\u7B5B\u9009\u5668\u5C0F\u7EC4\u4EF6\u7684\u80CC\u666F\u8272\u3002","\u5217\u8868\u548C\u6811\u4E2D\u7C7B\u578B\u7B5B\u9009\u5668\u5C0F\u7EC4\u4EF6\u7684\u8F6E\u5ED3\u989C\u8272\u3002","\u5F53\u6CA1\u6709\u5339\u914D\u9879\u65F6\uFF0C\u5217\u8868\u548C\u6811\u4E2D\u7C7B\u578B\u7B5B\u9009\u5668\u5C0F\u7EC4\u4EF6\u7684\u8F6E\u5ED3\u989C\u8272\u3002","\u7F29\u8FDB\u53C2\u8003\u7EBF\u7684\u6811\u63CF\u8FB9\u989C\u8272\u3002","\u7F29\u8FDB\u53C2\u8003\u7EBF\u7684\u6811\u63CF\u8FB9\u989C\u8272\u3002","\u83DC\u5355\u7684\u8FB9\u6846\u989C\u8272\u3002","\u83DC\u5355\u9879\u7684\u524D\u666F\u989C\u8272\u3002","\u83DC\u5355\u9879\u7684\u80CC\u666F\u989C\u8272\u3002","\u83DC\u5355\u4E2D\u9009\u5B9A\u83DC\u5355\u9879\u7684\u524D\u666F\u8272\u3002","\u83DC\u5355\u4E2D\u6240\u9009\u83DC\u5355\u9879\u7684\u80CC\u666F\u8272\u3002","\u83DC\u5355\u4E2D\u6240\u9009\u83DC\u5355\u9879\u7684\u8FB9\u6846\u989C\u8272\u3002","\u83DC\u5355\u4E2D\u5206\u9694\u7EBF\u7684\u989C\u8272\u3002","\u4EE3\u7801\u7247\u6BB5 Tab \u4F4D\u7684\u9AD8\u4EAE\u80CC\u666F\u8272\u3002","\u4EE3\u7801\u7247\u6BB5 Tab \u4F4D\u7684\u9AD8\u4EAE\u8FB9\u6846\u989C\u8272\u3002","\u4EE3\u7801\u7247\u6BB5\u4E2D\u6700\u540E\u7684 Tab \u4F4D\u7684\u9AD8\u4EAE\u80CC\u666F\u8272\u3002","\u4EE3\u7801\u7247\u6BB5\u4E2D\u6700\u540E\u7684\u5236\u8868\u4F4D\u7684\u9AD8\u4EAE\u8FB9\u6846\u989C\u8272\u3002","\u7528\u4E8E\u67E5\u627E\u5339\u914D\u9879\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7528\u4E8E\u7A81\u51FA\u663E\u793A\u6240\u9009\u5185\u5BB9\u7684\u6982\u8FF0\u6807\u5C3A\u6807\u8BB0\u989C\u8272\u3002\u989C\u8272\u5FC5\u987B\u900F\u660E\uFF0C\u4EE5\u514D\u9690\u85CF\u4E0B\u9762\u7684\u4FEE\u9970\u6548\u679C\u3002","\u7528\u4E8E\u67E5\u627E\u5339\u914D\u9879\u7684\u8FF7\u4F60\u5730\u56FE\u6807\u8BB0\u989C\u8272\u3002","\u7F16\u8F91\u5668\u9009\u533A\u5728\u8FF7\u4F60\u5730\u56FE\u4E2D\u5BF9\u5E94\u7684\u6807\u8BB0\u989C\u8272\u3002","\u7528\u4E8E\u9519\u8BEF\u7684\u8FF7\u4F60\u5730\u56FE\u6807\u8BB0\u989C\u8272\u3002","\u7528\u4E8E\u8B66\u544A\u7684\u8FF7\u4F60\u5730\u56FE\u6807\u8BB0\u989C\u8272\u3002","\u8FF7\u4F60\u5730\u56FE\u80CC\u666F\u989C\u8272\u3002","\u8FF7\u4F60\u5730\u56FE\u6ED1\u5757\u80CC\u666F\u989C\u8272\u3002","\u60AC\u505C\u65F6\uFF0C\u8FF7\u4F60\u5730\u56FE\u6ED1\u5757\u7684\u80CC\u666F\u989C\u8272\u3002","\u5355\u51FB\u65F6\uFF0C\u8FF7\u4F60\u5730\u56FE\u6ED1\u5757\u7684\u80CC\u666F\u989C\u8272\u3002","\u7528\u4E8E\u95EE\u9898\u9519\u8BEF\u56FE\u6807\u7684\u989C\u8272\u3002","\u7528\u4E8E\u95EE\u9898\u8B66\u544A\u56FE\u6807\u7684\u989C\u8272\u3002","\u7528\u4E8E\u95EE\u9898\u4FE1\u606F\u56FE\u6807\u7684\u989C\u8272\u3002"],"vs/platform/theme/common/iconRegistry":["\u8981\u4F7F\u7528\u7684\u5B57\u4F53\u7684 ID\u3002\u5982\u679C\u672A\u8BBE\u7F6E\uFF0C\u5219\u4F7F\u7528\u6700\u5148\u5B9A\u4E49\u7684\u5B57\u4F53\u3002","\u4E0E\u56FE\u6807\u5B9A\u4E49\u5173\u8054\u7684\u5B57\u4F53\u5B57\u7B26\u3002","\u5C0F\u7EC4\u4EF6\u4E2D\u201C\u5173\u95ED\u201D\u64CD\u4F5C\u7684\u56FE\u6807\u3002"],"vs/platform/undoRedo/common/undoRedoService":["\u4EE5\u4E0B\u6587\u4EF6\u5DF2\u5173\u95ED\u5E76\u4E14\u5DF2\u5728\u78C1\u76D8\u4E0A\u4FEE\u6539: {0}\u3002","\u4EE5\u4E0B\u6587\u4EF6\u5DF2\u4EE5\u4E0D\u517C\u5BB9\u7684\u65B9\u5F0F\u4FEE\u6539: {0}\u3002","\u65E0\u6CD5\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u64A4\u6D88\u201C{0}\u201D\u3002{1}","\u65E0\u6CD5\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u64A4\u6D88\u201C{0}\u201D\u3002{1}","\u65E0\u6CD5\u64A4\u6D88\u6240\u6709\u6587\u4EF6\u7684\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u5DF2\u66F4\u6539 {1}","\u65E0\u6CD5\u8DE8\u6240\u6709\u6587\u4EF6\u64A4\u9500\u201C{0}\u201D\uFF0C\u56E0\u4E3A {1} \u4E0A\u5DF2\u6709\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C\u6B63\u5728\u8FD0\u884C","\u65E0\u6CD5\u8DE8\u6240\u6709\u6587\u4EF6\u64A4\u9500\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u540C\u65F6\u53D1\u751F\u4E86\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C","\u662F\u5426\u8981\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u64A4\u6D88\u201C{0}\u201D?","\u5728 {0} \u4E2A\u6587\u4EF6\u4E2D\u64A4\u6D88","\u64A4\u6D88\u6B64\u6587\u4EF6","\u53D6\u6D88","\u65E0\u6CD5\u64A4\u9500\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u5DF2\u6709\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C\u6B63\u5728\u8FD0\u884C\u3002","\u662F\u5426\u8981\u64A4\u6D88\u201C{0}\u201D?","\u64A4\u6D88","\u53D6\u6D88","\u65E0\u6CD5\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u91CD\u505A\u201C{0}\u201D\u3002{1}","\u65E0\u6CD5\u5728\u6240\u6709\u6587\u4EF6\u4E2D\u91CD\u505A\u201C{0}\u201D\u3002{1}","\u65E0\u6CD5\u5BF9\u6240\u6709\u6587\u4EF6\u91CD\u505A\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u5DF2\u66F4\u6539 {1}","\u65E0\u6CD5\u8DE8\u6240\u6709\u6587\u4EF6\u91CD\u505A\u201C{0}\u201D\uFF0C\u56E0\u4E3A {1} \u4E0A\u5DF2\u6709\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C\u6B63\u5728\u8FD0\u884C","\u65E0\u6CD5\u8DE8\u6240\u6709\u6587\u4EF6\u91CD\u505A\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u540C\u65F6\u53D1\u751F\u4E86\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C","\u65E0\u6CD5\u91CD\u505A\u201C{0}\u201D\uFF0C\u56E0\u4E3A\u5DF2\u6709\u4E00\u9879\u64A4\u6D88\u6216\u91CD\u505A\u64CD\u4F5C\u6B63\u5728\u8FD0\u884C\u3002"]}); diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-cn.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-cn.js.gz new file mode 100644 index 0000000..2a3ed8c Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-cn.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-tw.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-tw.js new file mode 100644 index 0000000..e3349d6 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-tw.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.23.0(82e8ea39fc101d639262435542c7d43bc20d8aa2) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/define("vs/editor/editor.main.nls.zh-tw",{"vs/base/browser/ui/actionbar/actionViewItems":["{0} ({1})"],"vs/base/browser/ui/findinput/findInput":["\u8F38\u5165"],"vs/base/browser/ui/findinput/findInputCheckboxes":["\u5927\u5C0F\u5BEB\u9808\u76F8\u7B26","\u5168\u5B57\u62FC\u5BEB\u9808\u76F8\u7B26","\u4F7F\u7528\u898F\u5247\u904B\u7B97\u5F0F"],"vs/base/browser/ui/findinput/replaceInput":["\u8F38\u5165","\u4FDD\u7559\u6848\u4F8B"],"vs/base/browser/ui/iconLabel/iconLabel":["\u6B63\u5728\u8F09\u5165..."],"vs/base/browser/ui/inputbox/inputBox":["\u932F\u8AA4: {0}","\u8B66\u544A: {0}","\u8CC7\u8A0A: {0}"],"vs/base/browser/ui/keybindingLabel/keybindingLabel":["\u672A\u7E6B\u7D50"],"vs/base/browser/ui/menu/menu":["{0} ({1})"],"vs/base/browser/ui/tree/abstractTree":["\u6E05\u9664","\u5728\u985E\u578B\u4E0A\u505C\u7528\u7BE9\u9078","\u5728\u985E\u578B\u4E0A\u555F\u7528\u7BE9\u9078","\u627E\u4E0D\u5230\u4EFB\u4F55\u5143\u7D20","{1} \u9805\u5143\u7D20\u4E2D\u6709 {0} \u9805\u76F8\u7B26"],"vs/base/common/actions":["(\u7A7A\u7684)"],"vs/base/common/errorMessage":["{0}: {1}","\u767C\u751F\u7CFB\u7D71\u932F\u8AA4 ({0})","\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4\u3002\u5982\u9700\u8A73\u7D30\u8CC7\u8A0A\uFF0C\u8ACB\u53C3\u95B1\u8A18\u9304\u6A94\u3002","\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4\u3002\u5982\u9700\u8A73\u7D30\u8CC7\u8A0A\uFF0C\u8ACB\u53C3\u95B1\u8A18\u9304\u6A94\u3002","{0} (\u7E3D\u8A08 {1} \u500B\u932F\u8AA4)","\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4\u3002\u5982\u9700\u8A73\u7D30\u8CC7\u8A0A\uFF0C\u8ACB\u53C3\u95B1\u8A18\u9304\u6A94\u3002"],"vs/base/common/keybindingLabels":["Ctrl","Shift","Alt","Windows","Ctrl","Shift","Alt","\u8D85\u7D1A\u9375","Control","Shift","Alt","\u547D\u4EE4","Control","Shift","Alt","Windows","Control","Shift","Alt","\u8D85\u7D1A\u9375"],"vs/base/parts/quickinput/browser/quickInput":["\u4E0A\u4E00\u9801","{0}/{1}","\u8F38\u5165\u4EE5\u7E2E\u5C0F\u7D50\u679C\u7BC4\u570D\u3002","{0} \u500B\u7D50\u679C","\u5DF2\u9078\u64C7 {0}","\u78BA\u5B9A","\u81EA\u8A02","\u80CC\u9762 ({0})","\u4E0A\u4E00\u9801"],"vs/base/parts/quickinput/browser/quickInputList":["\u5FEB\u901F\u8F38\u5165"],"vs/editor/browser/controller/coreCommands":["\u5373\u4F7F\u884C\u7684\u9577\u5EA6\u904E\u9577\uFF0C\u4ECD\u8981\u5805\u6301\u81F3\u7D50\u5C3E","\u5373\u4F7F\u884C\u7684\u9577\u5EA6\u904E\u9577\uFF0C\u4ECD\u8981\u5805\u6301\u81F3\u7D50\u5C3E"],"vs/editor/browser/controller/textAreaHandler":["\u7DE8\u8F2F\u5668","\u76EE\u524D\u7121\u6CD5\u5B58\u53D6\u6B64\u7DE8\u8F2F\u5668\u3002\u8ACB\u6309 {0} \u53D6\u5F97\u9078\u9805\u3002"],"vs/editor/browser/core/keybindingCancellation":["\u7DE8\u8F2F\u5668\u662F\u5426\u57F7\u884C\u53EF\u53D6\u6D88\u7684\u4F5C\u696D\uFF0C\u4F8B\u5982\u300C\u9810\u89BD\u53C3\u8003\u300D"],"vs/editor/browser/editorExtensions":["\u5FA9\u539F(&&U)","\u5FA9\u539F","\u53D6\u6D88\u5FA9\u539F(&&R)","\u91CD\u505A","\u5168\u9078(&&S)","\u5168\u9078"],"vs/editor/browser/widget/codeEditorWidget":["\u6E38\u6A19\u6578\u5DF2\u9650\u5236\u70BA {0} \u500B\u3002"],"vs/editor/browser/widget/diffEditorWidget":["Diff \u7DE8\u8F2F\u5668\u4E2D\u7528\u65BC\u63D2\u5165\u7684\u7DDA\u689D\u88DD\u98FE\u3002","Diff \u7DE8\u8F2F\u5668\u4E2D\u7528\u65BC\u79FB\u9664\u7684\u7DDA\u689D\u88DD\u98FE\u3002","\u56E0\u5176\u4E2D\u4E00\u500B\u6A94\u6848\u904E\u5927\u800C\u7121\u6CD5\u6BD4\u8F03\u3002"],"vs/editor/browser/widget/diffReview":["Diff \u6AA2\u95B1\u4E2D [\u63D2\u5165] \u7684\u5716\u793A\u3002","Diff \u6AA2\u95B1\u4E2D [\u79FB\u9664] \u7684\u5716\u793A\u3002","Diff \u6AA2\u95B1\u4E2D [\u95DC\u9589] \u7684\u5716\u793A\u3002","\u95DC\u9589","\u672A\u8B8A\u66F4\u4EFB\u4E00\u884C","\u5DF2\u8B8A\u66F4 1 \u884C","\u5DF2\u8B8A\u66F4 {0} \u884C","{1} \u9805\u5DEE\u7570\u4E2D\u7684\u7B2C {0} \u9805: \u539F\u59CB\u884C {2}\u3001{3}\uFF0C\u4FEE\u6539\u884C {4}\u3001{5}","\u7A7A\u767D","{0} \u672A\u8B8A\u66F4\u884C {1}","{0} \u539F\u59CB\u884C {1} \u4FEE\u6539\u7684\u884C {2}","+ {0} \u4FEE\u6539\u884C {1}","- {0} \u539F\u59CB\u884C {1}","\u79FB\u81F3\u4E0B\u4E00\u500B\u5DEE\u7570","\u79FB\u81F3\u4E0A\u4E00\u500B\u5DEE\u7570"],"vs/editor/browser/widget/inlineDiffMargin":["\u8907\u88FD\u5DF2\u522A\u9664\u7684\u884C","\u8907\u88FD\u5DF2\u522A\u9664\u7684\u884C","\u8907\u88FD\u5DF2\u522A\u9664\u7684\u884C \uFF08{0}\uFF09","\u9084\u539F\u6B64\u8B8A\u66F4","\u8907\u88FD\u5DF2\u522A\u9664\u7684\u884C \uFF08{0}\uFF09"],"vs/editor/common/config/commonEditorConfig":["\u7DE8\u8F2F\u5668","\u8207 Tab \u76F8\u7B49\u7684\u7A7A\u683C\u6578\u91CF\u3002\u7576 `#editor.detectIndentation#` \u5DF2\u958B\u555F\u6642\uFF0C\u6703\u6839\u64DA\u6A94\u6848\u5167\u5BB9\u8986\u5BEB\u6B64\u8A2D\u5B9A\u3002","\u5728\u6309 `Tab` \u6642\u63D2\u5165\u7A7A\u683C\u3002\u7576 `#editor.detectIndentation#` \u958B\u555F\u6642\uFF0C\u6703\u6839\u64DA\u6A94\u6848\u5167\u5BB9\u8986\u5BEB\u6B64\u8A2D\u5B9A\u3002","\u6839\u64DA\u6A94\u6848\u5167\u5BB9\uFF0C\u63A7\u5236\u7576\u6A94\u6848\u958B\u555F\u6642\uFF0C\u662F\u5426\u81EA\u52D5\u5075\u6E2C `#editor.tabSize#` \u548C `#editor.insertSpaces#`\u3002","\u79FB\u9664\u5C3E\u7AEF\u81EA\u52D5\u63D2\u5165\u7684\u7A7A\u767D\u5B57\u5143\u3002","\u91DD\u5C0D\u5927\u578B\u6A94\u6848\u505C\u7528\u90E8\u5206\u9AD8\u8A18\u61B6\u9AD4\u9700\u6C42\u529F\u80FD\u7684\u7279\u6B8A\u8655\u7406\u65B9\u5F0F\u3002","\u63A7\u5236\u662F\u5426\u61C9\u6839\u64DA\u6587\u4EF6\u4E2D\u7684\u55AE\u5B57\u8A08\u7B97\u81EA\u52D5\u5B8C\u6210\u3002","\u50C5\u5EFA\u8B70\u4F86\u81EA\u4F7F\u7528\u4E2D\u6587\u4EF6\u4E2D\u7684\u5B57\u7D44\u3002","\u5EFA\u8B70\u4F86\u81EA\u6240\u6709\u5DF2\u958B\u555F\u6587\u4EF6\u4E2D\uFF0C\u8A9E\u8A00\u76F8\u540C\u7684\u5B57\u7D44\u3002","\u5EFA\u8B70\u4F86\u81EA\u6240\u6709\u5DF2\u958B\u555F\u6587\u4EF6\u4E2D\u7684\u5B57\u7D44\u3002","\u63A7\u5236\u8981\u5F9E\u54EA\u4E9B\u6587\u4EF6\u8A08\u7B97\u4EE5\u5B57\u7D44\u70BA\u57FA\u790E\u7684\u5B8C\u6210\u4F5C\u696D\u3002","\u6240\u6709\u5F69\u8272\u4E3B\u984C\u7686\u5DF2\u555F\u7528\u8A9E\u610F\u9192\u76EE\u63D0\u793A\u3002","\u6240\u6709\u5F69\u8272\u4E3B\u984C\u7686\u5DF2\u505C\u7528\u8A9E\u610F\u9192\u76EE\u63D0\u793A\u3002","\u8A9E\u610F\u9192\u76EE\u63D0\u793A\u7531\u76EE\u524D\u4E4B\u5F69\u8272\u4F48\u666F\u4E3B\u984C\u7684 'semanticHighlighting' \u8A2D\u5B9A\u6240\u8A2D\u5B9A\u3002","\u63A7\u5236 semanticHighlighting \u662F\u5426\u6703\u70BA\u652F\u63F4\u7684\u8A9E\u8A00\u986F\u793A\u3002","\u5373\u4F7F\u6309\u5169\u4E0B\u5167\u5BB9\u6216\u6309 `Escape`\uFF0C\u4ECD\u4FDD\u6301\u7784\u5B54\u7DE8\u8F2F\u5668\u958B\u555F\u3002","\u56E0\u6548\u80FD\u7684\u7DE3\u6545\uFF0C\u4E0D\u6703\u5C07\u8D85\u904E\u6B64\u9AD8\u5EA6\u7684\u884C Token \u5316","\u53D6\u6D88 Diff \u8A08\u7B97\u524D\u7684\u903E\u6642\u9650\u5236 (\u6BEB\u79D2)\u3002\u82E5\u7121\u903E\u6642\uFF0C\u8ACB\u4F7F\u7528 0\u3002","\u63A7\u5236 Diff \u7DE8\u8F2F\u5668\u8981\u4E26\u6392\u6216\u5167\u5D4C\u986F\u793A Diff\u3002","\u555F\u7528\u6642\uFF0CDiff \u7DE8\u8F2F\u5668\u6703\u5FFD\u7565\u524D\u7F6E\u6216\u5F8C\u7F6E\u7A7A\u683C\u7684\u8B8A\u66F4\u3002","\u63A7\u5236 Diff \u7DE8\u8F2F\u5668\u662F\u5426\u8981\u70BA\u65B0\u589E/\u79FB\u9664\u7684\u8B8A\u66F4\u986F\u793A +/- \u6A19\u8A18\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u986F\u793A codelens\u3002","\u4E00\u5F8B\u4E0D\u63DB\u884C\u3002","\u4F9D\u6AA2\u8996\u5340\u5BEC\u5EA6\u63DB\u884C\u3002","\u5C07\u4F9D\u64DA `#editor.wordWrap#` \u8A2D\u5B9A\u81EA\u52D5\u63DB\u884C\u3002"],"vs/editor/common/config/editorOptions":["\u7DE8\u8F2F\u5668\u5C07\u4F7F\u7528\u5E73\u53F0 API \u4EE5\u5075\u6E2C\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u9644\u52A0\u3002","\u7DE8\u8F2F\u5668\u5C07\u4E00\u5F8B\u6700\u4F73\u5316\u4EE5\u7528\u65BC\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u3002\u81EA\u52D5\u63DB\u884C\u5C07\u6703\u505C\u7528\u3002","\u7DE8\u8F2F\u5668\u4E0D\u6703\u70BA\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u7684\u4F7F\u7528\u65B9\u5F0F\u9032\u884C\u6700\u4F73\u5316\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u65BC\u5DF2\u70BA\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u6700\u4F73\u5316\u7684\u6A21\u5F0F\u4E2D\u57F7\u884C\u3002\u8A2D\u5B9A\u70BA\u958B\u555F\u6703\u505C\u7528\u81EA\u52D5\u63DB\u884C\u3002","\u63A7\u5236\u662F\u5426\u8981\u5728\u8A3B\u89E3\u6642\u63D2\u5165\u7A7A\u767D\u5B57\u5143\u3002","\u63A7\u5236\u662F\u5426\u61C9\u4EE5\u884C\u8A3B\u89E3\u7684\u5207\u63DB\u3001\u65B0\u589E\u6216\u79FB\u9664\u52D5\u4F5C\uFF0C\u5FFD\u7565\u7A7A\u767D\u7684\u884C\u3002","\u63A7\u5236\u8907\u88FD\u6642\u4E0D\u9078\u53D6\u4EFB\u4F55\u9805\u76EE\u662F\u5426\u6703\u8907\u88FD\u76EE\u524D\u7A0B\u5F0F\u884C\u3002","\u63A7\u5236\u5728\u8F38\u5165\u671F\u9593\u662F\u5426\u8981\u8DF3\u904E\u6E38\u6A19\u4F86\u5C0B\u627E\u76F8\u7B26\u7684\u9805\u76EE\u3002","\u63A7\u5236 [\u5C0B\u627E\u5C0F\u5DE5\u5177] \u4E2D\u7684\u641C\u5C0B\u5B57\u4E32\u662F\u5426\u4F86\u81EA\u7DE8\u8F2F\u5668\u9078\u53D6\u9805\u76EE\u3002","\u6C38\u4E0D\u81EA\u52D5\u958B\u555F [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E] (\u9810\u8A2D)","\u4E00\u5F8B\u81EA\u52D5\u958B\u555F [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E]","\u9078\u53D6\u591A\u884C\u5167\u5BB9\u6642\uFF0C\u81EA\u52D5\u958B\u555F [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E]\u3002","\u63A7\u5236\u81EA\u52D5\u958B\u555F\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E\u7684\u689D\u4EF6\u3002","\u63A7\u5236\u5C0B\u627E\u5C0F\u5DE5\u5177\u662F\u5426\u5728 macOS \u4E0A\u8B80\u53D6\u6216\u4FEE\u6539\u5171\u7528\u5C0B\u627E\u526A\u8CBC\u7C3F\u3002","\u63A7\u5236\u5C0B\u627E\u5C0F\u5DE5\u5177\u662F\u5426\u61C9\u5728\u7DE8\u8F2F\u5668\u9802\u7AEF\u984D\u5916\u65B0\u589E\u884C\u3002\u82E5\u70BA true\uFF0C\u7576\u60A8\u53EF\u770B\u5230\u5C0B\u627E\u5C0F\u5DE5\u5177\u6642\uFF0C\u60A8\u7684\u6372\u52D5\u7BC4\u570D\u6703\u8D85\u904E\u7B2C\u4E00\u884C\u3002","\u7576\u518D\u4E5F\u627E\u4E0D\u5230\u5176\u4ED6\u76F8\u7B26\u9805\u76EE\u6642\uFF0C\u63A7\u5236\u662F\u5426\u81EA\u52D5\u5F9E\u958B\u982D (\u6216\u7D50\u5C3E) \u91CD\u65B0\u958B\u59CB\u641C\u5C0B\u3002","\u555F\u7528/\u505C\u7528\u9023\u5B57\u5B57\u578B ('calt' \u548C 'liga' \u5B57\u578B\u529F\u80FD)\u3002\u5C07\u6B64\u9805\u8B8A\u66F4\u70BA\u5B57\u4E32\uFF0C\u4EE5\u7CBE\u78BA\u63A7\u5236 'font-feature-settings' CSS \u5C6C\u6027\u3002","\u660E\u78BA\u7684 'font-feature-settings' CSS \u5C6C\u6027\u3002\u5982\u679C\u53EA\u9700\u8981\u958B\u555F/\u95DC\u9589\u9023\u5B57\uFF0C\u53EF\u4EE5\u6539\u70BA\u50B3\u905E\u5E03\u6797\u503C\u3002","\u8A2D\u5B9A\u9023\u5B57\u5B57\u578B\u6216\u5B57\u578B\u529F\u80FD\u3002\u53EF\u4EE5\u662F\u5E03\u6797\u503C\u4EE5\u555F\u7528/\u505C\u7528\u9023\u5B57\uFF0C\u6216\u4EE3\u8868 CSS 'font-feature-settings' \u5C6C\u6027\u7684\u5B57\u4E32\u3002","\u63A7\u5236\u5B57\u578B\u5927\u5C0F (\u50CF\u7D20)\u3002","\u53EA\u5141\u8A31\u300C\u4E00\u822C\u300D\u53CA\u300C\u7C97\u9AD4\u300D\u95DC\u9375\u5B57\uFF0C\u6216\u4ECB\u65BC 1 \u5230 1000 \u4E4B\u9593\u7684\u6578\u503C\u3002","\u63A7\u5236\u5B57\u578B\u7C97\u7D30\u3002\u63A5\u53D7\u300C\u4E00\u822C\u300D\u53CA\u300C\u7C97\u9AD4\u300D\u95DC\u9375\u5B57\uFF0C\u6216\u4ECB\u65BC 1 \u5230 1000 \u4E4B\u9593\u7684\u6578\u503C\u3002","\u986F\u793A\u7D50\u679C\u7684\u9810\u89BD\u6AA2\u8996 (\u9810\u8A2D)","\u79FB\u81F3\u4E3B\u8981\u7D50\u679C\u4E26\u986F\u793A\u9810\u89BD\u6AA2\u8996","\u524D\u5F80\u4E3B\u8981\u7D50\u679C\uFF0C\u4E26\u5C0D\u5176\u4ED6\u4EBA\u555F\u7528\u7121\u9810\u89BD\u700F\u89BD","\u6B64\u8A2D\u5B9A\u5DF2\u6DD8\u6C70\uFF0C\u8ACB\u6539\u7528 'editor.editor.gotoLocation.multipleDefinitions' \u6216 'editor.editor.gotoLocation.multipleImplementations' \u7B49\u55AE\u7368\u8A2D\u5B9A\u3002","\u63A7\u5236 'Go to Definition' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u63A7\u5236 'Go to Type Definition' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u63A7\u5236 'Go to Declaration' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u63A7\u5236 'Go to Implementations' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u63A7\u5236 'Go to References' \u547D\u4EE4\u5728\u6709\u591A\u500B\u76EE\u6A19\u4F4D\u7F6E\u5B58\u5728\u6642\u7684\u884C\u70BA\u3002","\u7576 'Go to Definition' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u7576 'Go to Type Definition' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u7576 'Go to Declaration' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u7576 'Go to Implementation' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u7576 'Go to Reference' \u7684\u7D50\u679C\u70BA\u76EE\u524D\u4F4D\u7F6E\u6642\uFF0C\u6B63\u5728\u57F7\u884C\u7684\u66FF\u4EE3\u547D\u4EE4\u8B58\u5225\u78BC\u3002","\u63A7\u5236\u662F\u5426\u986F\u793A\u66AB\u7559\u3002","\u63A7\u5236\u66AB\u7559\u986F\u793A\u7684\u5EF6\u9072\u6642\u9593 (\u4EE5\u6BEB\u79D2\u70BA\u55AE\u4F4D)\u3002","\u63A7\u5236\u7576\u6ED1\u9F20\u79FB\u904E\u6642\uFF0C\u662F\u5426\u61C9\u4FDD\u6301\u986F\u793A\u66AB\u7559\u3002","\u5728\u7DE8\u8F2F\u5668\u4E2D\u555F\u7528\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u71C8\u6CE1\u3002","\u555F\u7528\u7DE8\u8F2F\u5668\u4E2D\u7684\u5167\u5D4C\u63D0\u793A\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E2D\u7684\u5167\u5D4C\u63D0\u793A\u5B57\u578B\u5927\u5C0F\u3002\u8A2D\u5B9A\u70BA `0` \u6642\uFF0C\u6703\u4F7F\u7528 90% \u7684 `#editor.fontSize#`\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E2D\u7684\u5167\u5D4C\u63D0\u793A\u5B57\u578B\u5BB6\u65CF\u3002","\u63A7\u5236\u884C\u9AD8\u3002\u4F7F\u7528 0 \u6703\u5F9E\u5B57\u578B\u5927\u5C0F\u8A08\u7B97\u884C\u9AD8\u3002","\u63A7\u5236\u662F\u5426\u6703\u986F\u793A\u7E2E\u5716","\u7E2E\u5716\u5927\u5C0F\u8207\u7DE8\u8F2F\u5668\u5167\u5BB9\u76F8\u540C (\u4E14\u53EF\u80FD\u6703\u6372\u52D5)\u3002","\u7E2E\u5716\u6703\u8996\u9700\u8981\u4F38\u7E2E\uFF0C\u4EE5\u586B\u6EFF\u8A72\u7DE8\u8F2F\u5668\u7684\u9AD8\u5EA6 (\u7121\u6372\u52D5)\u3002","\u7E2E\u5716\u5C07\u8996\u9700\u8981\u7E2E\u5C0F\uFF0C\u4E00\u5F8B\u4E0D\u6703\u5927\u65BC\u8A72\u7DE8\u8F2F\u5668 (\u7121\u6372\u52D5)\u3002","\u63A7\u5236\u7E2E\u5716\u7684\u5927\u5C0F\u3002","\u63A7\u5236\u8981\u5728\u54EA\u7AEF\u5448\u73FE\u7E2E\u5716\u3002","\u63A7\u5236\u4F55\u6642\u986F\u793A\u8FF7\u4F60\u5730\u5716\u6ED1\u687F\u3002","\u7E2E\u5716\u5167\u6240\u7E6A\u88FD\u7684\u5167\u5BB9\u5927\u5C0F: 1\u30012 \u6216 3\u3002","\u986F\u793A\u884C\u4E2D\u7684\u5BE6\u969B\u5B57\u5143\uFF0C\u800C\u4E0D\u662F\u8272\u5F69\u5340\u584A\u3002","\u9650\u5236\u7E2E\u5716\u7684\u5BEC\u5EA6\uFF0C\u6700\u591A\u986F\u793A\u67D0\u500B\u6578\u76EE\u7684\u5217\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E0A\u908A\u7DE3\u8207\u7B2C\u4E00\u884C\u4E4B\u9593\u7684\u7A7A\u683C\u6578\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E0B\u908A\u7DE3\u8207\u6700\u5F8C\u4E00\u884C\u4E4B\u9593\u7684\u7A7A\u683C\u6578\u3002","\u555F\u7528\u5FEB\u986F\uFF0C\u5728\u60A8\u9375\u5165\u7684\u540C\u6642\u986F\u793A\u53C3\u6578\u6587\u4EF6\u548C\u985E\u578B\u8CC7\u8A0A\u3002","\u63A7\u5236\u63D0\u793A\u529F\u80FD\u8868\u662F\u5426\u5728\u6E05\u55AE\u7D50\u5C3E\u6642\u5FAA\u74B0\u6216\u95DC\u9589\u3002","\u5141\u8A31\u5728\u5B57\u4E32\u5167\u986F\u793A\u5373\u6642\u5EFA\u8B70\u3002","\u5141\u8A31\u5728\u8A3B\u89E3\u4E2D\u986F\u793A\u5373\u6642\u5EFA\u8B70\u3002","\u5141\u8A31\u5728\u5B57\u4E32\u8207\u8A3B\u89E3\u4EE5\u5916\u4E4B\u8655\u986F\u793A\u5373\u6642\u5EFA\u8B70\u3002","\u63A7\u5236\u662F\u5426\u61C9\u5728\u9375\u5165\u6642\u81EA\u52D5\u986F\u793A\u5EFA\u8B70\u3002","\u4E0D\u986F\u793A\u884C\u865F\u3002","\u884C\u865F\u4EE5\u7D55\u5C0D\u503C\u986F\u793A\u3002","\u884C\u865F\u4EE5\u76EE\u524D\u6E38\u6A19\u7684\u76F8\u5C0D\u503C\u986F\u793A\u3002","\u6BCF 10 \u884C\u986F\u793A\u884C\u865F\u3002","\u63A7\u5236\u884C\u865F\u7684\u986F\u793A\u3002","\u9019\u500B\u7DE8\u8F2F\u5668\u5C3A\u898F\u6703\u8F49\u8B6F\u7684\u7B49\u5BEC\u5B57\u5143\u6578\u3002","\u6B64\u7DE8\u8F2F\u5668\u5C3A\u898F\u7684\u8272\u5F69\u3002","\u5728\u67D0\u500B\u6578\u76EE\u7684\u7B49\u5BEC\u5B57\u5143\u4E4B\u5F8C\u986F\u793A\u5782\u76F4\u5C3A\u898F\u3002\u5982\u6709\u591A\u500B\u5C3A\u898F\uFF0C\u5C31\u6703\u4F7F\u7528\u591A\u500B\u503C\u3002\u82E5\u9663\u5217\u7A7A\u767D\uFF0C\u5C31\u4E0D\u6703\u7E6A\u88FD\u4EFB\u4F55\u5C3A\u898F\u3002","\u63D2\u5165\u5EFA\u8B70\u800C\u4E0D\u8986\u5BEB\u6E38\u6A19\u65C1\u7684\u6587\u5B57\u3002","\u63D2\u5165\u5EFA\u8B70\u4E26\u8986\u5BEB\u6E38\u6A19\u65C1\u7684\u6587\u5B57\u3002","\u63A7\u5236\u662F\u5426\u8981\u5728\u63A5\u53D7\u5B8C\u6210\u6642\u8986\u5BEB\u5B57\u7D44\u3002\u8ACB\u6CE8\u610F\uFF0C\u9019\u53D6\u6C7A\u65BC\u52A0\u5165\u6B64\u529F\u80FD\u7684\u5EF6\u4F38\u6A21\u7D44\u3002","\u63A7\u5236\u5C0D\u65BC\u62DA\u932F\u5B57\u662F\u5426\u9032\u884C\u7BE9\u9078\u548C\u6392\u5E8F\u5176\u5EFA\u8B70","\u63A7\u5236\u6392\u5E8F\u662F\u5426\u6703\u504F\u597D\u6E38\u6A19\u9644\u8FD1\u51FA\u73FE\u7684\u5B57\u7D44\u3002","\u63A7\u5236\u8A18\u9304\u7684\u5EFA\u8B70\u9078\u53D6\u9805\u76EE\u662F\u5426\u5728\u591A\u500B\u5DE5\u4F5C\u5340\u548C\u8996\u7A97\u9593\u5171\u7528 (\u9700\u8981 `#editor.suggestSelection#`)\u3002","\u63A7\u5236\u6B63\u5728\u4F7F\u7528\u7684\u7A0B\u5F0F\u78BC\u7247\u6BB5\u662F\u5426\u6703\u907F\u514D\u5FEB\u901F\u5EFA\u8B70\u3002","\u63A7\u5236\u8981\u5728\u5EFA\u8B70\u4E2D\u986F\u793A\u6216\u96B1\u85CF\u5716\u793A\u3002","\u63A7\u5236\u5EFA\u8B70\u5C0F\u5DE5\u5177\u5E95\u4E0B\u7684\u72C0\u614B\u5217\u53EF\u898B\u5EA6\u3002","\u63A7\u5236\u5EFA\u8B70\u8A73\u7D30\u8CC7\u6599\u662F\u4EE5\u5167\u5D4C\u65BC\u6A19\u7C64\u7684\u65B9\u5F0F\u986F\u793A\uFF0C\u9084\u662F\u53EA\u5728\u8A73\u7D30\u8CC7\u6599\u5C0F\u5DE5\u5177\u4E2D\u986F\u793A","\u6B64\u8A2D\u5B9A\u5DF2\u6DD8\u6C70\u3002\u5EFA\u8B70\u5C0F\u5DE5\u5177\u73FE\u53EF\u8ABF\u6574\u5927\u5C0F\u3002","\u6B64\u8A2D\u5B9A\u5DF2\u6DD8\u6C70\uFF0C\u8ACB\u6539\u7528 'editor.suggest.showKeywords' \u6216 'editor.suggest.showSnippets' \u7B49\u55AE\u7368\u8A2D\u5B9A\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u65B9\u6CD5\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u51FD\u5F0F\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5EFA\u69CB\u51FD\u5F0F\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u6B04\u4F4D\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u8B8A\u6578\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u985E\u5225\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u7D50\u69CB\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u4ECB\u9762\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u6A21\u7D44\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5C6C\u6027\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u4E8B\u4EF6\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u904B\u7B97\u5B50\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u55AE\u4F4D\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u503C\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5E38\u6578\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u5217\u8209\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300CenumMember\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u95DC\u9375\u5B57\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u6587\u5B57\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u8272\u5F69\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u6A94\u6848\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u53C3\u8003\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300Ccustomcolor\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u8CC7\u6599\u593E\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300CtypeParameter\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u986F\u793A\u300C\u7A0B\u5F0F\u78BC\u7247\u6BB5\u300D\u5EFA\u8B70\u3002","\u555F\u7528\u4E4B\u5F8C\uFF0CIntelliSense \u6703\u986F\u793A `user`-suggestions\u3002","\u555F\u7528\u6642\uFF0CIntelliSense \u6703\u986F\u793A `issues`-suggestions\u3002","\u662F\u5426\u61C9\u4E00\u5F8B\u9078\u53D6\u524D\u7F6E\u548C\u5F8C\u7F6E\u7684\u7A7A\u767D\u5B57\u5143\u3002","\u63A7\u5236\u662F\u5426\u900F\u904E\u8A8D\u53EF\u5B57\u5143\u63A5\u53D7\u5EFA\u8B70\u3002\u4F8B\u5982\u5728 JavaScript \u4E2D\uFF0C\u5206\u865F (';') \u53EF\u4EE5\u662F\u63A5\u53D7\u5EFA\u8B70\u4E26\u9375\u5165\u8A72\u5B57\u5143\u7684\u8A8D\u53EF\u5B57\u5143\u3002","\u5728\u5EFA\u8B70\u9032\u884C\u6587\u5B57\u8B8A\u66F4\u6642\uFF0C\u50C5\u900F\u904E `Enter` \u63A5\u53D7\u5EFA\u8B70\u3002","\u63A7\u5236\u9664\u4E86 'Tab' \u5916\uFF0C\u662F\u5426\u4E5F\u900F\u904E 'Enter' \u63A5\u53D7\u5EFA\u8B70\u3002\u9019\u6709\u52A9\u65BC\u907F\u514D\u6DF7\u6DC6\u8981\u63D2\u5165\u65B0\u884C\u6216\u63A5\u53D7\u5EFA\u8B70\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u4E2D\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u53EF\u8B80\u51FA\u7684\u884C\u6578\u3002\u8B66\u544A: \u5927\u65BC\u9810\u8A2D\u7684\u6578\u76EE\u6703\u5C0D\u6548\u80FD\u7522\u751F\u5F71\u97FF\u3002","\u7DE8\u8F2F\u5668\u5167\u5BB9","\u4F7F\u7528\u8A9E\u8A00\u914D\u7F6E\u78BA\u5B9A\u4F55\u6642\u81EA\u52D5\u95DC\u9589\u62EC\u865F\u3002","\u50C5\u7576\u6E38\u6A19\u4F4D\u65BC\u7A7A\u767D\u7684\u5DE6\u5074\u6642\u81EA\u52D5\u95DC\u9589\u62EC\u865F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u4F7F\u7528\u8005\u65B0\u589E\u5DE6\u62EC\u5F27\u5F8C\uFF0C\u81EA\u52D5\u52A0\u4E0A\u53F3\u62EC\u5F27\u3002","\u50C5\u5728\u81EA\u52D5\u63D2\u5165\u53F3\u5F15\u865F\u6216\u62EC\u865F\u6642\uFF0C\u624D\u5728\u5176\u4E0A\u65B9\u9375\u5165\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u53F3\u5F15\u865F\u6216\u62EC\u865F\u4E0A\u9375\u5165\u3002","\u4F7F\u7528\u8A9E\u8A00\u914D\u7F6E\u78BA\u5B9A\u4F55\u6642\u81EA\u52D5\u95DC\u9589\u5F15\u865F\u3002","\u50C5\u7576\u6E38\u6A19\u4F4D\u65BC\u7A7A\u767D\u7684\u5DE6\u5074\u6642\u81EA\u52D5\u95DC\u9589\u5F15\u865F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u4F7F\u7528\u8005\u65B0\u589E\u958B\u59CB\u5F15\u865F\u5F8C\uFF0C\u81EA\u52D5\u52A0\u4E0A\u95DC\u9589\u5F15\u865F\u3002","\u7DE8\u8F2F\u5668\u4E0D\u6703\u81EA\u52D5\u63D2\u5165\u7E2E\u6392\u3002","\u7DE8\u8F2F\u5668\u6703\u4FDD\u7559\u76EE\u524D\u884C\u7684\u7E2E\u6392\u3002","\u7DE8\u8F2F\u5668\u6703\u4FDD\u7559\u76EE\u524D\u884C\u7684\u7E2E\u6392\u4E26\u63A5\u53D7\u8A9E\u8A00\u5B9A\u7FA9\u7684\u62EC\u865F\u3002","\u7DE8\u8F2F\u5668\u6703\u76EE\u524D\u884C\u7684\u7E2E\u6392\u3001\u63A5\u53D7\u8A9E\u8A00\u5B9A\u7FA9\u7684\u62EC\u865F\u4E26\u53EB\u7528\u8A9E\u8A00\u5B9A\u7FA9\u7684\u7279\u6B8A onEnterRules\u3002","\u7DE8\u8F2F\u5668\u6703\u4FDD\u7559\u76EE\u524D\u884C\u7684\u7E2E\u6392\u3001\u63A5\u53D7\u8A9E\u8A00\u5B9A\u7FA9\u7684\u62EC\u865F\u4E26\u53EB\u7528\u8A9E\u8A00\u5B9A\u7FA9\u7684\u7279\u6B8A onEnterRules \u4E26\u63A5\u53D7\u8A9E\u8A00\u5B9A\u7FA9\u7684 indentationRules\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u4F7F\u7528\u8005\u9375\u5165\u3001\u8CBC\u4E0A\u3001\u79FB\u52D5\u6216\u7E2E\u6392\u884C\u6642\u81EA\u52D5\u8ABF\u6574\u7E2E\u6392\u3002","\u4F7F\u7528\u8A9E\u8A00\u7D44\u614B\u4F86\u6C7A\u5B9A\u4F55\u6642\u81EA\u52D5\u74B0\u7E5E\u9078\u53D6\u9805\u76EE\u3002","\u7528\u5F15\u865F\u62EC\u4F4F\uFF0C\u800C\u975E\u4F7F\u7528\u62EC\u5F27\u3002","\u7528\u62EC\u5F27\u62EC\u4F4F\uFF0C\u800C\u975E\u4F7F\u7528\u5F15\u865F\u3002 ","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5728\u9375\u5165\u5F15\u865F\u6216\u62EC\u5F27\u6642\u81EA\u52D5\u5305\u570D\u9078\u53D6\u7BC4\u570D\u3002","\u7576\u4F7F\u7528\u7A7A\u683C\u9032\u884C\u7E2E\u6392\u6642\uFF0C\u6703\u6A21\u64EC\u5B9A\u4F4D\u5B57\u5143\u7684\u9078\u53D6\u884C\u70BA\u3002\u9078\u53D6\u7BC4\u570D\u6703\u4F9D\u5FAA\u5B9A\u4F4D\u505C\u99D0\u9EDE\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u986F\u793A codelens\u3002","\u63A7\u5236 CodeLens \u7684\u5B57\u578B\u5BB6\u65CF\u3002","\u63A7\u5236 CodeLens \u7684\u5B57\u578B\u5927\u5C0F (\u50CF\u7D20)\u3002\u8A2D\u5B9A\u70BA `0` \u6642\uFF0C\u6703\u4F7F\u7528 90% \u7684 `#editor.fontSize#`\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u8F49\u8B6F\u5167\u5D4C\u8272\u5F69\u88DD\u98FE\u9805\u76EE\u8207\u8272\u5F69\u9078\u64C7\u5668\u3002","\u555F\u7528\u5373\u53EF\u4EE5\u6ED1\u9F20\u8207\u6309\u9375\u9078\u53D6\u9032\u884C\u8CC7\u6599\u884C\u9078\u53D6\u3002","\u63A7\u5236\u8A9E\u6CD5\u9192\u76EE\u63D0\u793A\u662F\u5426\u61C9\u8907\u88FD\u5230\u526A\u8CBC\u7C3F\u3002","\u63A7\u5236\u8CC7\u6599\u6307\u6A19\u52D5\u756B\u6A23\u5F0F\u3002","\u63A7\u5236\u662F\u5426\u61C9\u555F\u7528\u5E73\u6ED1\u63D2\u5165\u9EDE\u52D5\u756B\u3002 ","\u63A7\u5236\u8CC7\u6599\u6307\u6A19\u6A23\u5F0F\u3002","\u63A7\u5236\u6E38\u6A19\u4E0A\u4E0B\u5468\u570D\u53EF\u986F\u793A\u7684\u6700\u5C11\u884C\u6578\u3002\u5728\u67D0\u4E9B\u7DE8\u8F2F\u5668\u4E2D\u7A31\u70BA 'scrollOff' \u6216 'scrollOffset'\u3002","\u53EA\u6709\u901A\u904E\u9375\u76E4\u6216 API \u89F8\u767C\u6642\uFF0C\u624D\u6703\u65BD\u884C `cursorSurroundingLines`\u3002","\u4E00\u5F8B\u5F37\u5236\u57F7\u884C `cursorSurroundingLines`","\u63A7\u5236\u61C9\u65BD\u884C `cursorSurroundingLines` \u7684\u6642\u6A5F\u3002","\u63A7\u5236\u6E38\u6A19\u5BEC\u5EA6\uFF0C\u7576 `#editor.cursorStyle#` \u8A2D\u5B9A\u70BA `line` \u6642\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u5141\u8A31\u900F\u904E\u62D6\u653E\u4F86\u79FB\u52D5\u9078\u53D6\u9805\u76EE\u3002","\u6309\u4E0B `Alt` \u6642\u7684\u6372\u52D5\u901F\u5EA6\u4E58\u6578\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u555F\u7528\u7A0B\u5F0F\u78BC\u647A\u758A\u529F\u80FD\u3002","\u4F7F\u7528\u8A9E\u8A00\u7279\u5B9A\u647A\u758A\u7B56\u7565 (\u5982\u679C\u53EF\u7528)\uFF0C\u5426\u5247\u4F7F\u7528\u7E2E\u6392\u5F0F\u7B56\u7565\u3002","\u4F7F\u7528\u7E2E\u6392\u5F0F\u647A\u758A\u7B56\u7565\u3002","\u63A7\u5236\u8A08\u7B97\u8CC7\u6599\u593E\u7BC4\u570D\u7684\u7B56\u7565\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5C07\u6298\u758A\u7684\u7BC4\u570D\u9192\u76EE\u63D0\u793A\u3002","\u63A7\u5236\u6309\u4E00\u4E0B\u5DF2\u6298\u758A\u884C\u5F8C\u65B9\u7684\u7A7A\u767D\u5167\u5BB9\u662F\u5426\u6703\u5C55\u958B\u884C\u3002","\u63A7\u5236\u5B57\u578B\u5BB6\u65CF\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u81EA\u52D5\u70BA\u8CBC\u4E0A\u7684\u5167\u5BB9\u8A2D\u5B9A\u683C\u5F0F\u3002\u5FC5\u9808\u6709\u53EF\u7528\u7684\u683C\u5F0F\u5668\uFF0C\u800C\u4E14\u683C\u5F0F\u5668\u61C9\u80FD\u5920\u70BA\u6587\u4EF6\u4E2D\u7684\u4E00\u500B\u7BC4\u570D\u8A2D\u5B9A\u683C\u5F0F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u81EA\u52D5\u5728\u9375\u5165\u5F8C\u8A2D\u5B9A\u884C\u7684\u683C\u5F0F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u8F49\u8B6F\u5782\u76F4\u5B57\u7B26\u908A\u754C\u3002\u5B57\u7B26\u908A\u754C\u6700\u5E38\u7528\u4F86\u9032\u884C\u5075\u932F\u3002","\u63A7\u5236\u6E38\u6A19\u662F\u5426\u61C9\u96B1\u85CF\u5728\u6982\u89C0\u5C3A\u898F\u4E2D\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u9192\u76EE\u63D0\u793A\u4F7F\u7528\u4E2D\u7684\u7E2E\u6392\u8F14\u52A9\u7DDA\u3002","\u63A7\u5236\u5B57\u6BCD\u9593\u8DDD (\u50CF\u7D20)\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u5DF2\u555F\u7528\u9023\u7D50\u7DE8\u8F2F\u3002\u76F8\u95DC\u7B26\u865F (\u4F8B\u5982 HTML \u6A19\u7C64) \u6703\u6839\u64DA\u8A9E\u8A00\u5728\u7DE8\u8F2F\u6642\u66F4\u65B0\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u5075\u6E2C\u9023\u7D50\u4E26\u4F7F\u5176\u53EF\u4F9B\u9EDE\u9078\u3002","\u5C07\u7B26\u5408\u7684\u62EC\u865F\u9192\u76EE\u63D0\u793A\u3002","\u8981\u7528\u65BC\u6ED1\u9F20\u6EFE\u8F2A\u6372\u52D5\u4E8B\u4EF6 `deltaX` \u548C `deltaY` \u7684\u4E58\u6578\u3002","\u4F7F\u7528\u6ED1\u9F20\u6EFE\u8F2A\u4E26\u6309\u4F4F `Ctrl` \u6642\uFF0C\u7E2E\u653E\u7DE8\u8F2F\u5668\u7684\u5B57\u578B","\u5728\u591A\u500B\u6E38\u6A19\u91CD\u758A\u6642\u5C07\u5176\u5408\u4F75\u3002","\u5C0D\u61C9Windows\u548CLinux\u7684'Control'\u8207\u5C0D\u61C9 macOS \u7684'Command'\u3002","\u5C0D\u61C9Windows\u548CLinux\u7684'Alt'\u8207\u5C0D\u61C9macOS\u7684'Option'\u3002","\u7528\u65BC\u5728\u6ED1\u9F20\u65B0\u589E\u591A\u500B\u6E38\u6A19\u7684\u4E58\u6578\u3002\u300C\u79FB\u81F3\u5B9A\u7FA9\u300D\u548C\u300C\u958B\u555F\u9023\u7D50\u300D\u6ED1\u9F20\u624B\u52E2\u6703\u52A0\u4EE5\u9069\u61C9\uFF0C\u4EE5\u907F\u514D\u8207\u591A\u500B\u6E38\u6A19\u7684\u4E58\u6578\u76F8\u885D\u7A81\u3002[\u6DF1\u5165\u4E86\u89E3](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier)\u3002","\u6BCF\u500B\u6E38\u6A19\u90FD\u6703\u8CBC\u4E0A\u4E00\u884C\u6587\u5B57\u3002","\u6BCF\u500B\u6E38\u6A19\u90FD\u6703\u8CBC\u4E0A\u5168\u6587\u3002","\u7576\u5DF2\u8CBC\u4E0A\u6587\u5B57\u7684\u884C\u6578\u8207\u6E38\u6A19\u6578\u76F8\u7B26\u6642\u63A7\u5236\u8CBC\u4E0A\u529F\u80FD\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u9192\u76EE\u986F\u793A\u51FA\u73FE\u7684\u8A9E\u610F\u7B26\u865F\u3002","\u63A7\u5236\u662F\u5426\u61C9\u5728\u6982\u89C0\u5C3A\u898F\u5468\u570D\u7E6A\u88FD\u6846\u7DDA\u3002","\u958B\u555F\u9810\u89BD\u6642\u7126\u9EDE\u6A39\u72C0","\u958B\u555F\u6642\u805A\u7126\u7DE8\u8F2F\u5668","\u63A7\u5236\u8981\u805A\u7126\u5167\u5D4C\u7DE8\u8F2F\u5668\u6216\u9810\u89BD\u5C0F\u5DE5\u5177\u4E2D\u7684\u6A39\u7CFB\u3002","\u63A7\u5236\u300C\u524D\u5F80\u5B9A\u7FA9\u300D\u6ED1\u9F20\u624B\u52E2\uFF0C\u662F\u5426\u4E00\u5F8B\u958B\u555F\u7784\u6838\u5C0F\u5DE5\u5177\u3002","\u63A7\u5236\u5728\u5FEB\u901F\u5EFA\u8B70\u986F\u793A\u5F8C\u7684\u5EF6\u9072 (\u4EE5\u6BEB\u79D2\u70BA\u55AE\u4F4D)\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u6703\u81EA\u52D5\u4F9D\u985E\u578B\u91CD\u65B0\u547D\u540D\u3002","\u5DF2\u6DD8\u6C70\uFF0C\u8ACB\u6539\u7528 `editor.linkedEditing`\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u986F\u793A\u63A7\u5236\u5B57\u5143\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u986F\u793A\u7E2E\u6392\u8F14\u52A9\u7DDA\u3002","\u5728\u6A94\u6848\u7D50\u5C3E\u70BA\u65B0\u884C\u6642\uFF0C\u5448\u73FE\u6700\u5F8C\u4E00\u884C\u7684\u865F\u78BC\u3002","\u9192\u76EE\u63D0\u793A\u88DD\u8A02\u908A\u548C\u76EE\u524D\u7684\u884C\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u5982\u4F55\u986F\u793A\u76EE\u524D\u884C\u7684\u9192\u76EE\u63D0\u793A\u3002","\u7576\u7126\u9EDE\u70BA\u8A72\u7DE8\u8F2F\u5668\u6642\uFF0C\u63A7\u5236\u8A72\u7DE8\u8F2F\u5668\u662F\u5426\u50C5\u61C9\u8F49\u8B6F\u76EE\u524D\u884C\u7684\u9192\u76EE\u63D0\u793A","\u8F49\u8B6F\u7A7A\u767D\u5B57\u5143\uFF0C\u4F46\u6587\u5B57\u4E4B\u9593\u7684\u55AE\u4E00\u7A7A\u683C\u9664\u5916\u3002","\u53EA\u8F49\u8B6F\u6240\u9078\u6587\u5B57\u7684\u7A7A\u767D\u5B57\u5143\u3002","\u53EA\u8F49\u8B6F\u7D50\u5C3E\u7A7A\u767D\u5B57\u5143","\u63A7\u5236\u7DE8\u8F2F\u5668\u61C9\u5982\u4F55\u8F49\u8B6F\u7A7A\u767D\u5B57\u5143\u3002","\u63A7\u5236\u9078\u53D6\u7BC4\u570D\u662F\u5426\u6709\u5713\u89D2","\u63A7\u5236\u7DE8\u8F2F\u5668\u6C34\u5E73\u6372\u52D5\u7684\u984D\u5916\u5B57\u5143\u6578\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u6372\u52D5\u5230\u6700\u5F8C\u4E00\u884C\u4E4B\u5916\u3002","\u540C\u6642\u9032\u884C\u5782\u76F4\u8207\u6C34\u5E73\u6372\u52D5\u6642\uFF0C\u50C5\u6CBF\u4E3B\u8EF8\u6372\u52D5\u3002\u907F\u514D\u5728\u8ECC\u8DE1\u677F\u4E0A\u9032\u884C\u5782\u76F4\u6372\u52D5\u6642\u767C\u751F\u6C34\u5E73\u6F02\u79FB\u3002","\u63A7\u5236\u662F\u5426\u652F\u63F4 Linux \u4E3B\u8981\u526A\u8CBC\u7C3F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u61C9\u9192\u76EE\u63D0\u793A\u8207\u9078\u53D6\u9805\u76EE\u985E\u4F3C\u7684\u76F8\u7B26\u9805\u76EE\u3002","\u4E00\u5F8B\u986F\u793A\u647A\u758A\u63A7\u5236\u9805\u3002","\u50C5\u7576\u6ED1\u9F20\u61F8\u505C\u5728\u6D3B\u52D5\u5217\u4E0A\u6642\uFF0C\u624D\u986F\u793A\u6298\u758A\u529F\u80FD\u3002","\u63A7\u5236\u647A\u758A\u63A7\u5236\u9805\u5728\u88DD\u8A02\u908A\u4E0A\u7684\u986F\u793A\u6642\u6A5F\u3002","\u63A7\u5236\u672A\u4F7F\u7528\u7A0B\u5F0F\u78BC\u7684\u6DE1\u51FA\u3002","\u63A7\u5236\u5DF2\u522A\u9664\u7684\u6DD8\u6C70\u8B8A\u6578\u3002","\u5C07\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5EFA\u8B70\u986F\u793A\u65BC\u5176\u4ED6\u5EFA\u8B70\u7684\u9802\u7AEF\u3002","\u5C07\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5EFA\u8B70\u986F\u793A\u65BC\u5176\u4ED6\u5EFA\u8B70\u7684\u4E0B\u65B9\u3002","\u5C07\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5EFA\u8B70\u8207\u5176\u4ED6\u5EFA\u8B70\u4E00\u540C\u986F\u793A\u3002","\u4E0D\u986F\u793A\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5EFA\u8B70\u3002","\u63A7\u5236\u7A0B\u5F0F\u78BC\u7247\u6BB5\u662F\u5426\u96A8\u5176\u4ED6\u5EFA\u8B70\u986F\u793A\uFF0C\u4EE5\u53CA\u5176\u6392\u5E8F\u65B9\u5F0F\u3002","\u63A7\u5236\u7DE8\u8F2F\u5668\u662F\u5426\u6703\u4F7F\u7528\u52D5\u756B\u6372\u52D5","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u5B57\u578B\u5927\u5C0F\u3002\u7576\u8A2D\u5B9A\u70BA `0` \u6642\uFF0C\u5247\u4F7F\u7528 `#editor.fontSize#` \u503C.","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u884C\u9AD8\u3002\u7576\u8A2D\u5B9A\u70BA `0` \u6642\uFF0C\u5247\u4F7F\u7528 `#editor.lineHeight#` \u7684\u503C\u3002\u6700\u5C0F\u503C\u70BA 8\u3002","\u63A7\u5236\u5EFA\u8B70\u662F\u5426\u61C9\u5728\u9375\u5165\u89F8\u767C\u5B57\u5143\u6642\u81EA\u52D5\u986F\u793A\u3002","\u4E00\u5F8B\u9078\u53D6\u7B2C\u4E00\u500B\u5EFA\u8B70\u3002","\u9664\u975E\u9032\u4E00\u6B65\u9375\u5165\u9078\u53D6\u4E86\u5EFA\u8B70\uFF0C\u5426\u5247\u9078\u53D6\u6700\u8FD1\u7684\u5EFA\u8B70\uFF0C\u4F8B\u5982 `console.| -> console.log`\uFF0C\u539F\u56E0\u662F\u6700\u8FD1\u5B8C\u6210\u4E86 `log`\u3002","\u6839\u64DA\u5148\u524D\u5DF2\u5B8C\u6210\u8A72\u5EFA\u8B70\u7684\u524D\u7F6E\u8A5E\u9078\u53D6\u5EFA\u8B70\uFF0C\u4F8B\u5982 `co -> console` \u548C `con -> const`\u3002","\u63A7\u5236\u5728\u986F\u793A\u5EFA\u8B70\u6E05\u55AE\u6642\u5982\u4F55\u9810\u5148\u9078\u53D6\u5EFA\u8B70\u3002","\u6309 Tab \u6642\uFF0CTab \u5B8C\u6210\u6703\u63D2\u5165\u6700\u7B26\u5408\u7684\u5EFA\u8B70\u3002","\u505C\u7528 tab \u9375\u81EA\u52D5\u5B8C\u6210\u3002","\u5728\u7A0B\u5F0F\u78BC\u7247\u6BB5\u7684\u9996\u78BC\u76F8\u7B26\u6642\u4F7F\u7528 Tab \u5B8C\u6210\u3002\u672A\u555F\u7528 'quickSuggestions' \u6642\u6548\u679C\u6700\u4F73\u3002","\u555F\u7528 tab \u9375\u81EA\u52D5\u5B8C\u6210\u3002","\u81EA\u52D5\u79FB\u9664\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143\u3002","\u5FFD\u7565\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143\u3002","\u8981\u79FB\u9664\u4E4B\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143\u63D0\u793A\u3002","\u79FB\u9664\u53EF\u80FD\u5C0E\u81F4\u554F\u984C\u7684\u7570\u5E38\u884C\u7D50\u675F\u5B57\u5143\u3002","\u63D2\u5165\u548C\u522A\u9664\u63A5\u5728\u5B9A\u4F4D\u505C\u99D0\u9EDE\u5F8C\u7684\u7A7A\u767D\u5B57\u5143\u3002","\u5728\u57F7\u884C\u6587\u5B57\u76F8\u95DC\u5C0E\u89BD\u6216\u4F5C\u696D\u6642\u8981\u7528\u4F5C\u6587\u5B57\u5206\u9694\u7B26\u865F\u7684\u5B57\u5143","\u4E00\u5F8B\u4E0D\u63DB\u884C\u3002","\u4F9D\u6AA2\u8996\u5340\u5BEC\u5EA6\u63DB\u884C\u3002","\u65BC '#editor.wordWrapColumn#' \u63DB\u884C\u3002","\u7576\u6AA2\u8996\u5340\u7E2E\u81F3\u6700\u5C0F\u4E26\u8A2D\u5B9A '#editor.wordWrapColumn#' \u6642\u63DB\u884C\u3002","\u63A7\u5236\u5982\u4F55\u63DB\u884C\u3002","\u7576 `#editor.wordWrap#` \u70BA `wordWrapColumn` \u6216 `bounded` \u6642\uFF0C\u63A7\u5236\u7DE8\u8F2F\u5668\u4E2D\u7684\u8CC7\u6599\u884C\u63DB\u884C\u3002","\u7121\u7E2E\u6392\u3002\u63DB\u884C\u5F9E\u7B2C 1 \u5217\u958B\u59CB\u3002","\u63DB\u884C\u7684\u7E2E\u6392\u6703\u8207\u7236\u884C\u76F8\u540C\u3002","\u63DB\u884C\u7684\u7E2E\u6392\u70BA\u7236\u884C +1\u3002","\u63DB\u884C\u7E2E\u6392\u70BA\u7236\u884C +2\u3002","\u63A7\u5236\u63DB\u884C\u7684\u7E2E\u6392\u3002","\u5047\u8A2D\u6240\u6709\u5B57\u5143\u7684\u5BEC\u5EA6\u5747\u76F8\u540C\u3002\u9019\u662F\u4E00\u7A2E\u5FEB\u901F\u7684\u6F14\u7B97\u6CD5\uFF0C\u9069\u7528\u65BC\u7B49\u5BEC\u5B57\u578B\uFF0C\u4EE5\u53CA\u5B57\u7B26\u5BEC\u5EA6\u76F8\u540C\u7684\u90E8\u5206\u6307\u4EE4\u78BC (\u4F8B\u5982\u62C9\u4E01\u6587\u5B57\u5143)\u3002","\u5C07\u5916\u570D\u9EDE\u8A08\u7B97\u59D4\u6D3E\u7D66\u700F\u89BD\u5668\u3002\u9019\u662F\u7DE9\u6162\u7684\u6F14\u7B97\u6CD5\uFF0C\u5982\u679C\u6A94\u6848\u8F03\u5927\u53EF\u80FD\u6703\u5C0E\u81F4\u51CD\u7D50\uFF0C\u4F46\u5728\u6240\u6709\u60C5\u6CC1\u4E0B\u90FD\u6B63\u5E38\u904B\u4F5C\u3002","\u63A7\u5236\u8A08\u7B97\u5916\u570D\u9EDE\u7684\u6F14\u7B97\u6CD5\u3002"],"vs/editor/common/editorContextKeys":["Whether the editor text has focus (cursor is blinking)","Whether the editor or an editor widget has focus (e.g. focus is in the find widget)","Whether an editor or a rich text input has focus (cursor is blinking)","Whether the editor is read only","Whether the context is a diff editor","Whether `editor.columnSelection` is enabled","Whether the editor has text selected","Whether the editor has multiple selections","Whether `Tab` will move focus out of the editor","Whether the editor hover is visible","Whether the editor is part of a larger editor (e.g. notebooks)","The language identifier of the editor","Whether the editor has a completion item provider","Whether the editor has a code actions provider","Whether the editor has a code lens provider","Whether the editor has a definition provider","Whether the editor has a declaration provider","Whether the editor has an implementation provider","Whether the editor has a type definition provider","Whether the editor has a hover provider","Whether the editor has a document highlight provider","Whether the editor has a document symbol provider","Whether the editor has a reference provider","Whether the editor has a rename provider","Whether the editor has a signature help provider","Whether the editor has an inline hints provider","Whether the editor has a document formatting provider","Whether the editor has a document selection formatting provider","Whether the editor has multiple document formatting providers","Whether the editor has multiple document selection formatting providers"],"vs/editor/common/model/editStack":["\u6B63\u5728\u9375\u5165"],"vs/editor/common/modes/modesRegistry":["\u7D14\u6587\u5B57"],"vs/editor/common/standaloneStrings":["\u7121\u9078\u53D6\u9805\u76EE","\u7B2C {0} \u884C\uFF0C\u7B2C {1} \u6B04 (\u5DF2\u9078\u53D6 {2})","\u7B2C {0} \u884C\uFF0C\u7B2C {1} \u6B04","{0} \u500B\u9078\u53D6\u9805\u76EE (\u5DF2\u9078\u53D6 {1} \u500B\u5B57\u5143)","{0} \u500B\u9078\u53D6\u9805\u76EE","\u7ACB\u5373\u5C07\u8A2D\u5B9A `accessibilitySupport` \u8B8A\u66F4\u70BA 'on\u2019\u3002","\u7ACB\u5373\u958B\u555F\u7DE8\u8F2F\u5668\u5354\u52A9\u5DE5\u5177\u6587\u4EF6\u9801\u9762\u3002","\u5728 Diff \u7DE8\u8F2F\u5668\u7684\u552F\u8B80\u7A97\u683C\u4E2D\u3002","\u5728 Diff \u7DE8\u8F2F\u5668\u7684\u7A97\u683C\u4E2D\u3002","\u5728\u552F\u8B80\u7A0B\u5F0F\u78BC\u7DE8\u8F2F\u5668\u4E2D","\u5728\u7A0B\u5F0F\u78BC\u7DE8\u8F2F\u5668\u4E2D","\u82E5\u8981\u70BA\u7DE8\u8F2F\u5668\u9032\u884C\u6700\u80FD\u642D\u914D\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u4F7F\u7528\u7684\u8A2D\u5B9A\uFF0C\u8ACB\u7ACB\u5373\u6309 Command+E\u3002","\u82E5\u8981\u5C07\u7DE8\u8F2F\u5668\u8A2D\u5B9A\u70BA\u91DD\u5C0D\u642D\u914D\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u4F7F\u7528\u6700\u4F73\u5316\uFF0C\u8ACB\u7ACB\u5373\u6309 Control+E\u3002","\u7DE8\u8F2F\u5668\u5DF2\u8A2D\u5B9A\u70BA\u91DD\u5C0D\u642D\u914D\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u4F7F\u7528\u6700\u4F73\u5316\u3002","\u5DF2\u5C07\u6B64\u7DE8\u8F2F\u5668\u8A2D\u5B9A\u70BA\u6C38\u9060\u4E0D\u91DD\u5C0D\u642D\u914D\u87A2\u5E55\u52A9\u8B80\u7A0B\u5F0F\u4F7F\u7528\u6700\u4F73\u5316\uFF0C\u4F46\u76EE\u524D\u4E0D\u662F\u6B64\u60C5\u6CC1\u3002","\u5728\u76EE\u524D\u7684\u7DE8\u8F2F\u5668\u4E2D\u6309 Tab \u9375\u6703\u5C07\u7126\u9EDE\u79FB\u81F3\u4E0B\u4E00\u500B\u53EF\u8A2D\u5B9A\u7126\u9EDE\u7684\u5143\u7D20\u3002\u6309 {0} \u53EF\u5207\u63DB\u6B64\u884C\u70BA\u3002","\u5728\u76EE\u524D\u7684\u7DE8\u8F2F\u5668\u4E2D\u6309 Tab \u9375\u6703\u5C07\u7126\u9EDE\u79FB\u81F3\u4E0B\u4E00\u500B\u53EF\u8A2D\u5B9A\u7126\u9EDE\u7684\u5143\u7D20\u3002\u547D\u4EE4 {0} \u76EE\u524D\u7121\u6CD5\u7531\u6309\u9375\u7E6B\u7D50\u95DC\u4FC2\u89F8\u767C\u3002","\u5728\u76EE\u524D\u7684\u7DE8\u8F2F\u5668\u4E2D\u6309 Tab \u9375\u6703\u63D2\u5165\u5B9A\u4F4D\u5B57\u5143\u3002\u6309 {0} \u53EF\u5207\u63DB\u6B64\u884C\u70BA\u3002","\u5728\u76EE\u524D\u7684\u7DE8\u8F2F\u5668\u4E2D\u6309 Tab \u9375\u6703\u63D2\u5165\u5B9A\u4F4D\u5B57\u5143\u3002\u547D\u4EE4 {0} \u76EE\u524D\u7121\u6CD5\u7531\u6309\u9375\u7E6B\u7D50\u95DC\u4FC2\u89F8\u767C\u3002","\u7ACB\u5373\u6309 Command+H\uFF0C\u4EE5\u958B\u555F\u63D0\u4F9B\u7DE8\u8F2F\u5668\u5354\u52A9\u5DE5\u5177\u76F8\u95DC\u8A73\u7D30\u8CC7\u8A0A\u7684\u700F\u89BD\u5668\u8996\u7A97\u3002","\u7ACB\u5373\u6309 Control+H\uFF0C\u4EE5\u958B\u555F\u63D0\u4F9B\u7DE8\u8F2F\u5668\u5354\u52A9\u5DE5\u5177\u76F8\u95DC\u8A73\u7D30\u8CC7\u8A0A\u7684\u700F\u89BD\u5668\u8996\u7A97\u3002","\u60A8\u53EF\u4EE5\u6309 Esc \u9375\u6216 Shift+Esc \u9375\u4F86\u89E3\u9664\u6B64\u5DE5\u5177\u63D0\u793A\u4E26\u8FD4\u56DE\u7DE8\u8F2F\u5668\u3002","\u986F\u793A\u5354\u52A9\u5DE5\u5177\u8AAA\u660E","\u958B\u767C\u4EBA\u54E1: \u6AA2\u67E5\u6B0A\u6756","\u524D\u5F80\u884C/\u6B04...","\u986F\u793A\u6240\u6709\u5FEB\u901F\u5B58\u53D6\u63D0\u4F9B\u8005","\u547D\u4EE4\u9078\u64C7\u5340","\u986F\u793A\u4E26\u57F7\u884C\u547D\u4EE4","\u79FB\u81F3\u7B26\u865F...","\u524D\u5F80\u7B26\u865F (\u4F9D\u985E\u5225)...","\u7DE8\u8F2F\u5668\u5167\u5BB9","\u6309 Alt+F1 \u53EF\u53D6\u5F97\u5354\u52A9\u5DE5\u5177\u9078\u9805\u3002","\u5207\u63DB\u9AD8\u5C0D\u6BD4\u4F48\u666F\u4E3B\u984C","\u5DF2\u5728 {1} \u6A94\u6848\u4E2D\u9032\u884C {0} \u9805\u7DE8\u8F2F"],"vs/editor/common/view/editorColorRegistry":["\u76EE\u524D\u6E38\u6A19\u4F4D\u7F6E\u884C\u7684\u53CD\u767D\u986F\u793A\u80CC\u666F\u8272\u5F69\u3002","\u76EE\u524D\u6E38\u6A19\u4F4D\u7F6E\u884C\u4E4B\u5468\u570D\u6846\u7DDA\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9192\u76EE\u63D0\u793A\u7BC4\u570D\u7684\u80CC\u666F\u8272\u5F69\uFF0C\u4F8B\u5982\u5FEB\u901F\u958B\u555F\u4E26\u5C0B\u627E\u529F\u80FD\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u53CD\u767D\u986F\u793A\u7BC4\u570D\u5468\u570D\u908A\u6846\u7684\u80CC\u666F\u984F\u8272\u3002","\u9192\u76EE\u63D0\u793A\u7B26\u865F\u7684\u80CC\u666F\u8272\u5F69\uFF0C\u76F8\u4F3C\u65BC\u524D\u5F80\u4E0B\u4E00\u500B\u5B9A\u7FA9\u6216\u524D\u5F80\u4E0B\u4E00\u500B/\u4E0A\u4E00\u500B\u7B26\u865F\u3002\u8272\u5F69\u5FC5\u9808\u900F\u660E\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u9192\u76EE\u63D0\u793A\u5468\u570D\u7684\u908A\u754C\u80CC\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u6E38\u6A19\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u6E38\u6A19\u7684\u80CC\u666F\u8272\u5F69\u3002\u5141\u8A31\u81EA\u8A02\u5340\u584A\u6E38\u6A19\u91CD\u758A\u7684\u5B57\u5143\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u7A7A\u767D\u5B57\u5143\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69\u3002","\u4F7F\u7528\u4E2D\u7DE8\u8F2F\u5668\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u884C\u865F\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4F7F\u7528\u4E2D\u884C\u865F\u7684\u8272\u5F69","Id \u5DF2\u53D6\u4EE3\u3002\u8ACB\u6539\u7528 'editorLineNumber.activeForeground' \u3002","\u7DE8\u8F2F\u5668\u4F7F\u7528\u4E2D\u884C\u865F\u7684\u8272\u5F69","\u7DE8\u8F2F\u5668\u5C3A\u898F\u7684\u8272\u5F69","\u7DE8\u8F2F\u5668\u7A0B\u5F0F\u78BC\u6FFE\u93E1\u7684\u524D\u666F\u8272\u5F69","\u6210\u5C0D\u62EC\u865F\u80CC\u666F\u8272\u5F69","\u6210\u5C0D\u62EC\u865F\u908A\u6846\u8272\u5F69","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u5C3A\u898F\u7684\u908A\u6846\u8272\u5F69.","\u7DE8\u8F2F\u5668\u6982\u89C0\u5C3A\u898F\u7684\u80CC\u666F\u8272\u5F69\u3002\u50C5\u5728\u555F\u7528\u7E2E\u5716\u4E26\u5C07\u5176\u7F6E\u65BC\u7DE8\u8F2F\u5668\u53F3\u5074\u6642\u4F7F\u7528\u3002","\u7DE8\u8F2F\u5668\u908A\u6846\u7684\u80CC\u666F\u984F\u8272,\u5305\u542B\u884C\u865F\u8207\u5B57\u5F62\u5716\u793A\u7684\u908A\u6846.","\u7DE8\u8F2F\u5668\u4E2D\u4E0D\u5FC5\u8981 (\u672A\u4F7F\u7528) \u539F\u59CB\u7A0B\u5F0F\u78BC\u7684\u6846\u7DDA\u8272\u5F69\u3002",`\u7DE8\u8F2F\u5668\u4E2D\u4E0D\u5FC5\u8981 (\u672A\u4F7F\u7528) \u539F\u59CB\u7A0B\u5F0F\u78BC\u7684\u4E0D\u900F\u660E\u5EA6\u3002\u4F8B\u5982 "#000000c0\u201D \u6703\u4EE5 75% \u7684\u4E0D\u900F\u660E\u5EA6\u8F49\u8B6F\u7A0B\u5F0F\u78BC\u3002\u91DD\u5C0D\u9AD8\u5C0D\u6BD4\u4E3B\u984C\uFF0C\u4F7F\u7528 'editorUnnecessaryCode.border' \u4E3B\u984C\u8272\u5F69\u53EF\u70BA\u4E0D\u5FC5\u8981\u7684\u7A0B\u5F0F\u78BC\u52A0\u4E0A\u5E95\u7DDA\uFF0C\u800C\u4E0D\u662F\u5C07\u5176\u8B8A\u6DE1\u3002`,"\u7BC4\u570D\u9192\u76EE\u63D0\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u932F\u8AA4\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002","\u8B66\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002","\u8CC7\u8A0A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002"],"vs/editor/contrib/anchorSelect/anchorSelect":["\u9078\u53D6\u7BC4\u570D\u9328\u9EDE","\u8A2D\u5B9A\u9328\u9EDE\u70BA {0}:{1}","\u8A2D\u5B9A\u9078\u53D6\u7BC4\u570D\u9328\u9EDE","\u524D\u5F80\u9078\u53D6\u7BC4\u570D\u9328\u9EDE","\u9078\u53D6\u5F9E\u9328\u9EDE\u5230\u6E38\u6A19\u4E4B\u9593\u7684\u7BC4\u570D","\u53D6\u6D88\u9078\u53D6\u7BC4\u570D\u9328\u9EDE"],"vs/editor/contrib/bracketMatching/bracketMatching":["\u6210\u5C0D\u62EC\u5F27\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002","\u79FB\u81F3\u65B9\u62EC\u5F27","\u9078\u53D6\u81F3\u62EC\u5F27","\u524D\u5F80\u62EC\u5F27(&&B)"],"vs/editor/contrib/caretOperations/caretOperations":["\u5C07\u6240\u9078\u6587\u5B57\u5411\u5DE6\u79FB\u52D5","\u5C07\u6240\u9078\u6587\u5B57\u5411\u53F3\u79FB\u52D5"],"vs/editor/contrib/caretOperations/transpose":["\u8ABF\u63DB\u5B57\u6BCD"],"vs/editor/contrib/clipboard/clipboard":["\u526A\u4E0B(&&T)","\u526A\u4E0B","\u526A\u4E0B","\u8907\u88FD(&&C)","\u8907\u88FD","\u8907\u88FD","\u8CBC\u4E0A(&&P)","\u8CBC\u4E0A","\u8CBC\u4E0A","\u96A8\u8A9E\u6CD5\u9192\u76EE\u63D0\u793A\u8907\u88FD"],"vs/editor/contrib/codeAction/codeActionCommands":["\u8981\u57F7\u884C\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u7684\u7A2E\u985E\u3002","\u63A7\u5236\u8981\u5957\u7528\u50B3\u56DE\u52D5\u4F5C\u7684\u6642\u6A5F\u3002","\u4E00\u5F8B\u5957\u7528\u7B2C\u4E00\u500B\u50B3\u56DE\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u3002","\u5982\u679C\u50B3\u56DE\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u662F\u552F\u4E00\u52D5\u4F5C\uFF0C\u5247\u52A0\u4EE5\u5957\u7528\u3002","\u4E0D\u8981\u5957\u7528\u50B3\u56DE\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u3002","\u63A7\u5236\u662F\u5426\u50C5\u61C9\u50B3\u56DE\u504F\u597D\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u3002","\u5957\u7528\u7A0B\u5F0F\u78BC\u52D5\u4F5C\u6642\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4","\u5FEB\u901F\u4FEE\u5FA9...","\u6C92\u6709\u53EF\u7528\u7684\u7A0B\u5F0F\u78BC\u64CD\u4F5C",'\u6C92\u6709 "{0}" \u7684\u504F\u597D\u7A0B\u5F0F\u78BC\u52D5\u4F5C','\u6C92\u6709 "{0}" \u53EF\u7528\u7684\u7A0B\u5F0F\u78BC\u52D5\u4F5C',"\u6C92\u6709\u53EF\u7528\u7684\u504F\u597D\u7A0B\u5F0F\u78BC\u52D5\u4F5C","\u6C92\u6709\u53EF\u7528\u7684\u7A0B\u5F0F\u78BC\u64CD\u4F5C","\u91CD\u69CB...","\u6C92\u6709\u9069\u7528\u65BC '{0}' \u7684\u504F\u597D\u91CD\u69CB\u3002",'\u6C92\u6709\u53EF\u7528\u7684 "{0}" \u91CD\u69CB',"\u6C92\u6709\u53EF\u7528\u7684\u504F\u597D\u91CD\u69CB","\u6C92\u6709\u53EF\u7528\u7684\u91CD\u69CB","\u4F86\u6E90\u52D5\u4F5C...","\u6C92\u6709\u9069\u7528\u65BC '{0}' \u7684\u504F\u597D\u4F86\u6E90\u52D5\u4F5C",'\u6C92\u6709 "{0}" \u53EF\u7528\u7684\u4F86\u6E90\u52D5\u4F5C',"\u6C92\u6709\u53EF\u7528\u7684\u504F\u597D\u4F86\u6E90\u52D5\u4F5C","\u6C92\u6709\u53EF\u7528\u7684\u4F86\u6E90\u52D5\u4F5C","\u7D44\u7E54\u532F\u5165","\u6C92\u6709\u4EFB\u4F55\u53EF\u7528\u7684\u7D44\u7E54\u532F\u5165\u52D5\u4F5C","\u5168\u90E8\u4FEE\u6B63","\u6C92\u6709\u5168\u90E8\u4FEE\u6B63\u52D5\u4F5C\u53EF\u7528","\u81EA\u52D5\u4FEE\u6B63...","\u6C92\u6709\u53EF\u7528\u7684\u81EA\u52D5\u4FEE\u6B63"],"vs/editor/contrib/codeAction/lightBulbWidget":["\u986F\u793A\u4FEE\u6B63\u7A0B\u5F0F\u3002\u504F\u597D\u7684\u4FEE\u6B63\u7A0B\u5F0F\u53EF\u7528 ({0})","\u986F\u793A\u4FEE\u6B63 ({0})","\u986F\u793A\u4FEE\u6B63"],"vs/editor/contrib/codelens/codelensController":["\u986F\u793A\u76EE\u524D\u884C\u7684 Code Lens \u547D\u4EE4"],"vs/editor/contrib/comment/comment":["\u5207\u63DB\u884C\u8A3B\u89E3","\u5207\u63DB\u884C\u8A3B\u89E3(&&T)","\u52A0\u5165\u884C\u8A3B\u89E3","\u79FB\u9664\u884C\u8A3B\u89E3","\u5207\u63DB\u5340\u584A\u8A3B\u89E3","\u5207\u63DB\u5340\u584A\u8A3B\u89E3(&&B)"],"vs/editor/contrib/contextmenu/contextmenu":["\u986F\u793A\u7DE8\u8F2F\u5668\u5167\u5BB9\u529F\u80FD\u8868"],"vs/editor/contrib/cursorUndo/cursorUndo":["\u6E38\u6A19\u5FA9\u539F","\u6E38\u6A19\u91CD\u505A"],"vs/editor/contrib/find/findController":["\u5C0B\u627E","\u5C0B\u627E(&&F)","\u5C0B\u627E\u9078\u53D6\u9805\u76EE","\u5C0B\u627E\u4E0B\u4E00\u500B","\u5C0B\u627E\u4E0B\u4E00\u500B","\u5C0B\u627E\u4E0A\u4E00\u500B","\u5C0B\u627E\u4E0A\u4E00\u500B","\u5C0B\u627E\u4E0B\u4E00\u500B\u9078\u53D6\u9805\u76EE","\u5C0B\u627E\u4E0A\u4E00\u500B\u9078\u53D6\u9805\u76EE","\u53D6\u4EE3","\u53D6\u4EE3(&&R)"],"vs/editor/contrib/find/findWidget":["\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E] \u7684\u5716\u793A\u3002","\u8868\u793A\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u5DF2\u647A\u758A\u7684\u5716\u793A\u3002","\u8868\u793A\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u5DF2\u5C55\u958B\u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u53D6\u4EE3] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u5168\u90E8\u53D6\u4EE3] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u5C0B\u627E\u4E0A\u4E00\u500B] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5C0B\u627E\u5C0F\u5DE5\u5177\u4E2D [\u5C0B\u627E\u4E0B\u4E00\u500B] \u7684\u5716\u793A\u3002","\u5C0B\u627E","\u5C0B\u627E","\u4E0A\u4E00\u500B\u7B26\u5408\u9805\u76EE","\u4E0B\u4E00\u500B\u7B26\u5408\u9805\u76EE","\u5728\u9078\u53D6\u7BC4\u570D\u4E2D\u5C0B\u627E","\u95DC\u9589","\u53D6\u4EE3","\u53D6\u4EE3","\u53D6\u4EE3","\u5168\u90E8\u53D6\u4EE3","\u5207\u63DB\u53D6\u4EE3\u6A21\u5F0F","\u50C5\u53CD\u767D\u986F\u793A\u524D {0} \u7B46\u7D50\u679C\uFF0C\u4F46\u6240\u6709\u5C0B\u627E\u4F5C\u696D\u6703\u5728\u5B8C\u6574\u6587\u5B57\u4E0A\u57F7\u884C\u3002","{1} \u7684 {0}","\u67E5\u7121\u7D50\u679C","\u627E\u5230 {0}","\u4EE5 '{1}' \u627E\u5230 {0}","\u4EE5 '{1}' \u627E\u5230 {0}\uFF0C\u4F4D\u65BC {2}","\u5DF2\u4EE5 '{1}' \u627E\u5230 {0}","Ctrl+Enter \u73FE\u5728\u6703\u63D2\u5165\u5206\u884C\u7B26\u865F\uFF0C\u800C\u4E0D\u6703\u5168\u90E8\u53D6\u4EE3\u3002\u60A8\u53EF\u4EE5\u4FEE\u6539 editor.action.replaceAll \u7684\u6309\u9375\u7E6B\u7D50\u95DC\u4FC2\uFF0C\u4EE5\u8986\u5BEB\u6B64\u884C\u70BA\u3002"],"vs/editor/contrib/folding/folding":["\u5C55\u958B","\u4EE5\u905E\u8FF4\u65B9\u5F0F\u5C55\u958B","\u647A\u758A","\u5207\u63DB\u647A\u758A","\u4EE5\u905E\u8FF4\u65B9\u5F0F\u647A\u758A","\u647A\u758A\u5168\u90E8\u5340\u584A\u8A3B\u89E3","\u647A\u758A\u6240\u6709\u5340\u57DF","\u5C55\u958B\u6240\u6709\u5340\u57DF","\u5168\u90E8\u647A\u758A","\u5168\u90E8\u5C55\u958B","\u647A\u758A\u5C64\u7D1A {0}","\u5DF2\u647A\u758A\u7BC4\u570D\u5F8C\u7684\u80CC\u666F\u8272\u5F69\u3002\u8272\u5F69\u4E0D\u5F97\u8655\u65BC\u4E0D\u900F\u660E\u72C0\u614B\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u88DD\u8A02\u908A\u7684\u647A\u758A\u63A7\u5236\u9805\u8272\u5F69\u3002"],"vs/editor/contrib/folding/foldingDecorations":["\u7DE8\u8F2F\u5668\u5B57\u7B26\u908A\u754C\u4E2D [\u5C55\u958B\u7684\u7BC4\u570D] \u7684\u5716\u793A\u3002","\u7DE8\u8F2F\u5668\u5B57\u7B26\u908A\u754C\u4E2D [\u647A\u758A\u7684\u7BC4\u570D] \u7684\u5716\u793A\u3002"],"vs/editor/contrib/fontZoom/fontZoom":["\u7DE8\u8F2F\u5668\u5B57\u9AD4\u653E\u5927","\u7DE8\u8F2F\u5668\u5B57\u578B\u7E2E\u5C0F","\u7DE8\u8F2F\u5668\u5B57\u9AD4\u91CD\u8A2D\u7E2E\u653E"],"vs/editor/contrib/format/format":["\u5728\u884C {0} \u7DE8\u8F2F\u4E86 1 \u9805\u683C\u5F0F","\u5728\u884C {1} \u7DE8\u8F2F\u4E86 {0} \u9805\u683C\u5F0F","\u5728\u884C {0} \u8207\u884C {1} \u4E4B\u9593\u7DE8\u8F2F\u4E86 1 \u9805\u683C\u5F0F","\u5728\u884C {1} \u8207\u884C {2} \u4E4B\u9593\u7DE8\u8F2F\u4E86 {0} \u9805\u683C\u5F0F"],"vs/editor/contrib/format/formatActions":["\u683C\u5F0F\u5316\u6587\u4EF6","\u683C\u5F0F\u5316\u9078\u53D6\u7BC4\u570D"],"vs/editor/contrib/gotoError/gotoError":["\u79FB\u81F3\u4E0B\u4E00\u500B\u554F\u984C (\u932F\u8AA4, \u8B66\u544A, \u8CC7\u8A0A)","[\u524D\u5F80\u4E0B\u4E00\u500B\u6A19\u8A18] \u7684\u5716\u793A\u3002","\u79FB\u81F3\u4E0A\u4E00\u500B\u554F\u984C (\u932F\u8AA4, \u8B66\u544A, \u8CC7\u8A0A)","[\u524D\u5F80\u4E0A\u4E00\u500B\u6A19\u8A18] \u7684\u5716\u793A\u3002","\u79FB\u81F3\u6A94\u6848\u88E1\u9762\u7684\u4E0B\u4E00\u500B\u554F\u984C (\u932F\u8AA4, \u8B66\u544A, \u8CC7\u8A0A)","\u4E0B\u4E00\u500B\u554F\u984C(&&P)","\u79FB\u81F3\u6A94\u6848\u88E1\u9762\u7684\u4E0A\u4E00\u500B\u554F\u984C (\u932F\u8AA4, \u8B66\u544A, \u8CC7\u8A0A)","\u524D\u4E00\u500B\u554F\u984C(&&P)"],"vs/editor/contrib/gotoError/gotoErrorWidget":["\u932F\u8AA4","\u8B66\u544A","\u8CC7\u8A0A","\u63D0\u793A","{0} \u65BC {1}\u3002","{0} \u500B\u554F\u984C (\u5171 {1} \u500B)","{0} \u500B\u554F\u984C (\u5171 {1} \u500B)","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u932F\u8AA4\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u8B66\u544A\u7684\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u8CC7\u8A0A\u7684\u8272\u5F69","\u7DE8\u8F2F\u5668\u6A19\u8A18\u5C0E\u89BD\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u3002"],"vs/editor/contrib/gotoSymbol/goToCommands":["\u67E5\u770B","\u5B9A\u7FA9","\u627E\u4E0D\u5230 '{0}' \u7684\u5B9A\u7FA9","\u627E\u4E0D\u5230\u4EFB\u4F55\u5B9A\u7FA9","\u79FB\u81F3\u5B9A\u7FA9","\u79FB\u81F3\u5B9A\u7FA9(&&D)","\u5728\u4E00\u5074\u958B\u555F\u5B9A\u7FA9","\u7784\u6838\u5B9A\u7FA9","\u5BA3\u544A","\u627E\u4E0D\u5230 '{0}' \u7684\u5BA3\u544A ","\u627E\u4E0D\u5230\u4EFB\u4F55\u5BA3\u544A","\u79FB\u81F3\u5BA3\u544A","\u524D\u5F80\u5BA3\u544A(&&D)","\u627E\u4E0D\u5230 '{0}' \u7684\u5BA3\u544A ","\u627E\u4E0D\u5230\u4EFB\u4F55\u5BA3\u544A","\u9810\u89BD\u5BA3\u544A","\u985E\u578B\u5B9A\u7FA9","\u627E\u4E0D\u5230 '{0}' \u7684\u4EFB\u4F55\u985E\u578B\u5B9A\u7FA9","\u627E\u4E0D\u5230\u4EFB\u4F55\u985E\u578B\u5B9A\u7FA9","\u79FB\u81F3\u985E\u578B\u5B9A\u7FA9","\u524D\u5F80\u985E\u578B\u5B9A\u7FA9(&&T)","\u9810\u89BD\u985E\u578B\u5B9A\u7FA9","\u5BE6\u4F5C","\u627E\u4E0D\u5230 '{0}' \u7684\u4EFB\u4F55\u5BE6\u4F5C","\u627E\u4E0D\u5230\u4EFB\u4F55\u5BE6\u4F5C","\u524D\u5F80\u5BE6\u4F5C","\u524D\u5F80\u5BE6\u4F5C(&&I)","\u67E5\u770B\u5BE6\u4F5C",'\u672A\u627E\u5230 "{0}" \u7684\u53C3\u8003',"\u672A\u627E\u5230\u53C3\u8003","\u524D\u5F80\u53C3\u8003","\u524D\u5F80\u53C3\u8003(&&R)","\u53C3\u8003","\u9810\u89BD\u53C3\u8003","\u53C3\u8003","\u79FB\u81F3\u4EFB\u4F55\u7B26\u865F","\u4F4D\u7F6E","'{0}' \u6C92\u6709\u7D50\u679C","\u53C3\u8003"],"vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition":["\u6309\u4E00\u4E0B\u4EE5\u986F\u793A {0} \u9805\u5B9A\u7FA9\u3002"],"vs/editor/contrib/gotoSymbol/peek/referencesController":["\u6B63\u5728\u8F09\u5165...","{0} ({1})"],"vs/editor/contrib/gotoSymbol/peek/referencesTree":["{0} \u500B\u53C3\u8003","{0} \u500B\u53C3\u8003","\u53C3\u8003"],"vs/editor/contrib/gotoSymbol/peek/referencesWidget":["\u7121\u6CD5\u9810\u89BD","\u67E5\u7121\u7D50\u679C","\u53C3\u8003"],"vs/editor/contrib/gotoSymbol/referencesModel":["\u500B\u7B26\u865F\u4F4D\u65BC {0} \u4E2D\u7684\u7B2C {1} \u884C\u7B2C {2} \u6B04","\u7B26\u865F\u4F4D\u65BC {0} \u4E2D\u7684\u7B2C {1} \u884C\u7B2C {2}\u3001{3} \u6B04","1 \u500B\u7B26\u865F\u4F4D\u65BC {0}, \u5B8C\u6574\u8DEF\u5F91 {1}","{0} \u500B\u7B26\u865F\u4F4D\u65BC {1}, \u5B8C\u6574\u8DEF\u5F91 {2}","\u627E\u4E0D\u5230\u7D50\u679C","\u5728 {0} \u4E2D\u627E\u5230 1 \u500B\u7B26\u865F","\u5728 {1} \u4E2D\u627E\u5230 {0} \u500B\u7B26\u865F","\u5728 {1} \u500B\u6A94\u6848\u4E2D\u627E\u5230 {0} \u500B\u7B26\u865F"],"vs/editor/contrib/gotoSymbol/symbolNavigation":["{1} \u7684\u7B26\u865F {0}\uFF0C{2} \u70BA\u4E0B\u4E00\u500B","{1} \u7684\u7B26\u865F {0}"],"vs/editor/contrib/hover/hover":["\u52D5\u614B\u986F\u793A","\u986F\u793A\u5B9A\u7FA9\u9810\u89BD\u61F8\u505C"],"vs/editor/contrib/hover/markdownHoverParticipant":["\u6B63\u5728\u8F09\u5165..."],"vs/editor/contrib/hover/markerHoverParticipant":["View Problem","\u6C92\u6709\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u6B63","\u6B63\u5728\u6AA2\u67E5\u5FEB\u901F\u4FEE\u6B63...","\u6C92\u6709\u53EF\u7528\u7684\u5FEB\u901F\u4FEE\u6B63","\u5FEB\u901F\u4FEE\u5FA9..."],"vs/editor/contrib/inPlaceReplace/inPlaceReplace":["\u4EE5\u4E0A\u4E00\u500B\u503C\u53D6\u4EE3","\u4EE5\u4E0B\u4E00\u500B\u503C\u53D6\u4EE3"],"vs/editor/contrib/indentation/indentation":["\u5C07\u7E2E\u6392\u8F49\u63DB\u6210\u7A7A\u683C","\u5C07\u7E2E\u6392\u8F49\u63DB\u6210\u5B9A\u4F4D\u9EDE","\u5DF2\u8A2D\u5B9A\u7684\u5B9A\u4F4D\u9EDE\u5927\u5C0F","\u9078\u53D6\u76EE\u524D\u6A94\u6848\u7684\u5B9A\u4F4D\u9EDE\u5927\u5C0F","\u4F7F\u7528 Tab \u9032\u884C\u7E2E\u6392","\u4F7F\u7528\u7A7A\u683C\u9375\u9032\u884C\u7E2E\u6392","\u5075\u6E2C\u5167\u5BB9\u4E2D\u7684\u7E2E\u6392","\u91CD\u65B0\u5C07\u884C\u7E2E\u6392","\u91CD\u65B0\u5C07\u9078\u53D6\u7684\u884C\u7E2E\u6392"],"vs/editor/contrib/linesOperations/linesOperations":["\u5C07\u884C\u5411\u4E0A\u8907\u88FD","\u5C07\u884C\u5411\u4E0A\u8907\u88FD(&&C)","\u5C07\u884C\u5411\u4E0B\u8907\u88FD","\u5C07\u884C\u5411\u4E0B\u8907\u88FD(&&P)","\u91CD\u8907\u9078\u53D6\u9805\u76EE","\u91CD\u8907\u9078\u53D6\u9805\u76EE(&&D)","\u4E0A\u79FB\u4E00\u884C","\u4E0A\u79FB\u4E00\u884C(&&V)","\u4E0B\u79FB\u4E00\u884C","\u4E0B\u79FB\u4E00\u884C(&&L)","\u905E\u589E\u6392\u5E8F\u884C","\u905E\u6E1B\u6392\u5E8F\u884C","\u4FEE\u526A\u5C3E\u7AEF\u7A7A\u767D","\u522A\u9664\u884C","\u7E2E\u6392\u884C","\u51F8\u6392\u884C","\u5728\u4E0A\u65B9\u63D2\u5165\u884C","\u5728\u4E0B\u65B9\u63D2\u5165\u884C","\u5DE6\u908A\u5168\u90E8\u522A\u9664","\u522A\u9664\u6240\u6709\u53F3\u65B9\u9805\u76EE","\u9023\u63A5\u7DDA","\u8F49\u7F6E\u6E38\u6A19\u5468\u570D\u7684\u5B57\u5143\u6578","\u8F49\u63DB\u5230\u5927\u5BEB","\u8F49\u63DB\u5230\u5C0F\u5BEB","\u8F49\u63DB\u70BA\u5B57\u9996\u5927\u5BEB","\u8F49\u63DB\u70BA\u5E95\u7DDA\u9023\u63A5\u5B57"],"vs/editor/contrib/linkedEditing/linkedEditing":["\u958B\u59CB\u9023\u7D50\u7684\u7DE8\u8F2F","\u7576\u7DE8\u8F2F\u5668\u81EA\u52D5\u91CD\u65B0\u547D\u540D\u985E\u578B\u6642\u7684\u80CC\u666F\u8272\u5F69\u3002"],"vs/editor/contrib/links/links":["\u57F7\u884C\u547D\u4EE4","\u8FFD\u8E64\u9023\u7D50","cmd + \u6309\u4E00\u4E0B","ctrl + \u6309\u4E00\u4E0B","\u9078\u9805 + \u6309\u4E00\u4E0B","alt + \u6309\u4E00\u4E0B","\u57F7\u884C\u547D\u4EE4 {0}","\u56E0\u70BA\u6B64\u9023\u7D50\u7684\u683C\u5F0F\u4E0D\u6B63\u78BA\uFF0C\u6240\u4EE5\u7121\u6CD5\u958B\u555F: {0}","\u56E0\u70BA\u6B64\u9023\u7D50\u76EE\u6A19\u907A\u5931\uFF0C\u6240\u4EE5\u7121\u6CD5\u958B\u555F\u3002","\u958B\u555F\u9023\u7D50"],"vs/editor/contrib/message/messageController":["\u7DE8\u8F2F\u5668\u76EE\u524D\u662F\u5426\u6B63\u5728\u986F\u793A\u5167\u5D4C\u8A0A\u606F","\u7121\u6CD5\u5728\u552F\u8B80\u7DE8\u8F2F\u5668\u4E2D\u7DE8\u8F2F"],"vs/editor/contrib/multicursor/multicursor":["\u5728\u4E0A\u65B9\u52A0\u5165\u6E38\u6A19","\u5728\u4E0A\u65B9\u65B0\u589E\u6E38\u6A19(&&A)","\u5728\u4E0B\u65B9\u52A0\u5165\u6E38\u6A19","\u5728\u4E0B\u65B9\u65B0\u589E\u6E38\u6A19(&&D)","\u5728\u884C\u5C3E\u65B0\u589E\u6E38\u6A19","\u5728\u884C\u5C3E\u65B0\u589E\u6E38\u6A19(&&U)","\u5C07\u6E38\u6A19\u65B0\u589E\u5230\u5E95\u90E8 ","\u5C07\u6E38\u6A19\u65B0\u589E\u5230\u9802\u90E8","\u5C07\u9078\u53D6\u9805\u76EE\u52A0\u5165\u4E0B\u4E00\u500B\u627E\u5230\u7684\u76F8\u7B26\u9805","\u65B0\u589E\u4E0B\u4E00\u500B\u9805\u76EE(&&N)","\u5C07\u9078\u53D6\u9805\u76EE\u52A0\u5165\u524D\u4E00\u500B\u627E\u5230\u7684\u76F8\u7B26\u9805\u4E2D","\u65B0\u589E\u4E0A\u4E00\u500B\u9805\u76EE(&&R)","\u5C07\u6700\u5F8C\u4E00\u500B\u9078\u64C7\u9805\u76EE\u79FB\u81F3\u4E0B\u4E00\u500B\u627E\u5230\u7684\u76F8\u7B26\u9805","\u5C07\u6700\u5F8C\u4E00\u500B\u9078\u64C7\u9805\u76EE\u79FB\u81F3\u524D\u4E00\u500B\u627E\u5230\u7684\u76F8\u7B26\u9805","\u9078\u53D6\u6240\u6709\u627E\u5230\u7684\u76F8\u7B26\u9805\u76EE","\u9078\u53D6\u6240\u6709\u9805\u76EE(&&O)","\u8B8A\u66F4\u6240\u6709\u767C\u751F\u6B21\u6578"],"vs/editor/contrib/parameterHints/parameterHints":["\u89F8\u767C\u53C3\u6578\u63D0\u793A"],"vs/editor/contrib/parameterHints/parameterHintsWidget":["[\u986F\u793A\u4E0B\u4E00\u500B\u53C3\u6578\u63D0\u793A] \u7684\u5716\u793A\u3002","[\u986F\u793A\u4E0A\u4E00\u500B\u53C3\u6578\u63D0\u793A] \u7684\u5716\u793A\u3002","{0}\uFF0C\u63D0\u793A"],"vs/editor/contrib/peekView/peekView":["\u95DC\u9589","\u9810\u89BD\u6AA2\u8996\u6A19\u984C\u5340\u57DF\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u6A19\u984C\u7684\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u6A19\u984C\u8CC7\u8A0A\u7684\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u4E4B\u6846\u7DDA\u8207\u7BAD\u982D\u7684\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u4E2D\u7D50\u679C\u6E05\u55AE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7D50\u679C\u5217\u8868\u4E2D\u884C\u7BC0\u9EDE\u7684\u524D\u666F\u8272\u5F69","\u9810\u89BD\u6AA2\u8996\u7D50\u679C\u5217\u8868\u4E2D\u6A94\u6848\u7BC0\u9EDE\u7684\u524D\u666F\u8272\u5F69","\u5728\u9810\u89BD\u6AA2\u8996\u4E4B\u7D50\u679C\u6E05\u55AE\u4E2D\u9078\u53D6\u9805\u76EE\u6642\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5728\u9810\u89BD\u6AA2\u8996\u4E4B\u7D50\u679C\u6E05\u55AE\u4E2D\u9078\u53D6\u9805\u76EE\u6642\u7684\u524D\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u7684\u80CC\u666F\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u908A\u6846(\u542B\u884C\u865F\u6216\u5B57\u5F62\u5716\u793A)\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5728\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u4E2D\u6BD4\u5C0D\u6642\u7684\u53CD\u767D\u986F\u793A\u8272\u5F69\u3002","\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u4E2D\u6BD4\u5C0D\u6642\u7684\u53CD\u767D\u986F\u793A\u8272\u5F69\u3002","\u5728\u9810\u89BD\u6AA2\u8996\u7DE8\u8F2F\u5668\u4E2D\u6BD4\u5C0D\u6642\u7684\u53CD\u767D\u986F\u793A\u908A\u754C\u3002"],"vs/editor/contrib/quickAccess/gotoLineQuickAccess":["\u5148\u958B\u555F\u6587\u5B57\u7DE8\u8F2F\u5668\uFF0C\u524D\u5F80\u67D0\u4E00\u884C\u3002","\u524D\u5F80\u7B2C {0} \u884C\u548C\u7B2C {1} \u6B04\u3002","\u524D\u5F80\u7B2C {0} \u884C\u3002","\u76EE\u524D\u884C: {0}\uFF0C\u5B57\u5143: {1}\u3002\u8ACB\u9375\u5165\u4ECB\u65BC 1 \u5230 {2} \u4E4B\u9593\u884C\u865F\uFF0C\u5C0E\u89BD\u81F3\u8A72\u884C\u3002","\u76EE\u524D\u884C: {0}\uFF0C\u5B57\u5143: {1}\u3002\u8ACB\u9375\u5165\u8981\u5C0E\u89BD\u81F3\u7684\u884C\u865F\u3002"],"vs/editor/contrib/quickAccess/gotoSymbolQuickAccess":["\u82E5\u8981\u524D\u5F80\u7B26\u865F\uFF0C\u8ACB\u5148\u958B\u555F\u5305\u542B\u7B26\u865F\u8CC7\u8A0A\u7684\u6587\u5B57\u7DE8\u8F2F\u5668\u3002","\u4F7F\u7528\u4E2D\u7684\u6587\u5B57\u7DE8\u8F2F\u5668\u4E0D\u63D0\u4F9B\u7B26\u865F\u8CC7\u8A0A\u3002","\u6C92\u6709\u76F8\u7B26\u7684\u7DE8\u8F2F\u5668\u7B26\u865F","\u6C92\u6709\u7DE8\u8F2F\u5668\u7B26\u865F","\u958B\u81F3\u5074\u908A","\u958B\u555F\u5230\u5E95\u90E8","\u7B26\u865F ({0})","\u5C6C\u6027 ({0})","\u65B9\u6CD5 ({0})","\u51FD\u5F0F ({0})","\u5EFA\u69CB\u51FD\u5F0F ({0})","\u8B8A\u6578 ({0})","\u985E\u5225 ({0})","\u7D50\u69CB ({0})","\u4E8B\u4EF6 ({0})","\u904B\u7B97\u5B50 ({0})","\u4ECB\u9762 ({0})","\u547D\u540D\u7A7A\u9593 ({0})","\u5957\u4EF6 ({0})","\u578B\u5225\u53C3\u6578 ({0})","\u6A21\u7D44 ({0})","\u5C6C\u6027 ({0})","\u5217\u8209 ({0})","\u5217\u8209\u6210\u54E1 ({0})","\u5B57\u4E32 ({0})","\u6A94\u6848 ({0})","\u9663\u5217 ({0})","\u6578\u5B57 ({0})","\u5E03\u6797\u503C ({0})","\u7269\u4EF6 ({0})","\u7D22\u5F15\u9375 ({0})","\u6B04\u4F4D ({0})","\u5E38\u6578 ({0})"],"vs/editor/contrib/rename/rename":["\u6C92\u6709\u7D50\u679C\u3002","\u89E3\u6790\u91CD\u65B0\u547D\u540D\u4F4D\u7F6E\u6642\u767C\u751F\u672A\u77E5\u7684\u932F\u8AA4","\u6B63\u5728\u70BA '{0}' \u91CD\u65B0\u547D\u540D","\u6B63\u5728\u91CD\u65B0\u547D\u540D {0}","\u5DF2\u6210\u529F\u5C07 '{0}' \u91CD\u65B0\u547D\u540D\u70BA '{1}'\u3002\u6458\u8981: {2}","\u91CD\u547D\u540D\u7121\u6CD5\u5957\u7528\u7DE8\u8F2F","\u91CD\u65B0\u547D\u540D\u7121\u6CD5\u8A08\u7B97\u7DE8\u8F2F","\u91CD\u65B0\u547D\u540D\u7B26\u865F","\u555F\u7528/\u505C\u7528\u91CD\u65B0\u547D\u540D\u524D\u5148\u9810\u89BD\u8B8A\u66F4\u7684\u529F\u80FD"],"vs/editor/contrib/rename/renameInputField":["\u70BA\u8F38\u5165\u91CD\u65B0\u547D\u540D\u3002\u8ACB\u9375\u5165\u65B0\u540D\u7A31\uFF0C\u7136\u5F8C\u6309 Enter \u4EE5\u8A8D\u53EF\u3002","\u6309 {0} \u9032\u884C\u91CD\u65B0\u547D\u540D\uFF0C\u6309 {1} \u9032\u884C\u9810\u89BD"],"vs/editor/contrib/smartSelect/smartSelect":["\u5C55\u958B\u9078\u53D6\u9805\u76EE","\u5C55\u958B\u9078\u53D6\u7BC4\u570D(&&E)","\u7E2E\u5C0F\u9078\u53D6\u9805\u76EE","\u58D3\u7E2E\u9078\u53D6\u7BC4\u570D(&&S)"],"vs/editor/contrib/snippet/snippetVariables":["\u661F\u671F\u5929","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D","\u9031\u65E5","\u9031\u4E00","\u9031\u4E8C","\u9031\u4E09","\u9031\u56DB","\u9031\u4E94","\u9031\u516D","\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708","1\u6708","2\u6708","3 \u6708","4\u6708","\u4E94\u6708","6\u6708","7 \u6708","8 \u6708","9 \u6708","10 \u6708","11 \u6708","12 \u6708"],"vs/editor/contrib/suggest/suggestController":["\u63A5\u53D7 \u2018{0}\u2019 \u9032\u884C\u4E86\u5176\u4ED6 {1} \u9805\u7DE8\u8F2F","\u89F8\u767C\u5EFA\u8B70","\u63D2\u5165","\u63D2\u5165","\u53D6\u4EE3","\u53D6\u4EE3","\u63D2\u5165","\u986F\u793A\u66F4\u5C11","\u986F\u793A\u66F4\u591A","\u91CD\u8A2D\u5EFA\u8B70\u5C0F\u5DE5\u5177\u5927\u5C0F"],"vs/editor/contrib/suggest/suggestWidget":["\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u908A\u754C\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u7684\u524D\u666F\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u6240\u9078\u9805\u76EE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u76F8\u7B26\u9192\u76EE\u63D0\u793A\u7684\u8272\u5F69\u3002","\u6B63\u5728\u8F09\u5165...","\u7121\u5EFA\u8B70\u3002","{0}\uFF0C\u6587\u4EF6: {1}","\u5EFA\u8B70"],"vs/editor/contrib/suggest/suggestWidgetDetails":["\u95DC\u9589","\u6B63\u5728\u8F09\u5165..."],"vs/editor/contrib/suggest/suggestWidgetRenderer":["\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D [\u66F4\u591A\u8A73\u7D30\u8CC7\u8A0A] \u7684\u5716\u793A\u3002","\u95B1\u8B80\u66F4\u591A"],"vs/editor/contrib/suggest/suggestWidgetStatus":["{0} ({1})"],"vs/editor/contrib/symbolIcons/symbolIcons":["\u9663\u5217\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5E03\u6797\u503C\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u985E\u5225\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u8272\u5F69\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5E38\u6578\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5EFA\u69CB\u51FD\u5F0F\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5217\u8209\u503C\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5217\u8209\u503C\u6210\u54E1\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u4E8B\u4EF6\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6B04\u4F4D\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6A94\u6848\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u8CC7\u6599\u593E\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u51FD\u5F0F\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u4ECB\u9762\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u7D22\u5F15\u9375\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u95DC\u9375\u5B57\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u65B9\u6CD5\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6A21\u7D44\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u547D\u540D\u7A7A\u9593\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","Null \u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6578\u5B57\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u7269\u4EF6\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u904B\u7B97\u5B50\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5957\u4EF6\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5C6C\u6027\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u53C3\u8003\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u5B57\u4E32\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u7D50\u69CB\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u6587\u5B57\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u578B\u5225\u53C3\u6578\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u55AE\u4F4D\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002","\u8B8A\u6578\u7B26\u865F\u7684\u524D\u666F\u8272\u5F69\u3002\u9019\u4E9B\u7B26\u865F\u6703\u51FA\u73FE\u5728\u5927\u7DB1\u3001\u968E\u5C64\u9023\u7D50\u548C\u5EFA\u8B70\u5C0F\u5DE5\u5177\u4E2D\u3002"],"vs/editor/contrib/toggleTabFocusMode/toggleTabFocusMode":["\u5207\u63DB TAB \u9375\u79FB\u52D5\u7126\u9EDE","\u6309 Tab \u73FE\u5728\u6703\u5C07\u7126\u9EDE\u79FB\u81F3\u4E0B\u4E00\u500B\u53EF\u8A2D\u5B9A\u7126\u9EDE\u7684\u5143\u7D20\u3002","\u6309 Tab \u73FE\u5728\u6703\u63D2\u5165\u5B9A\u4F4D\u5B57\u5143\u3002"],"vs/editor/contrib/tokenization/tokenization":["\u958B\u767C\u4EBA\u54E1: \u5F37\u5236\u91CD\u65B0\u7F6E\u653E"],"vs/editor/contrib/unusualLineTerminators/unusualLineTerminators":["\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143","\u5075\u6E2C\u5230\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143","\u6B64\u6A94\u6848\u5305\u542B\u4E00\u6216\u591A\u500B\u7570\u5E38\u7684\u884C\u7D50\u675F\u5B57\u5143\uFF0C\u4F8B\u5982\u884C\u5206\u9694\u7B26\u865F (LS) \u6216\u6BB5\u843D\u5206\u9694\u7B26\u865F (PS)\u3002\r\n\r\n\u5EFA\u8B70\u60A8\u5C07\u5176\u5F9E\u6A94\u6848\u4E2D\u79FB\u9664\u3002\u9019\u53EF\u4EE5\u900F\u904E `editor.unusualLineTerminators` \u9032\u884C\u8A2D\u5B9A\u3002","\u4FEE\u6B63\u6B64\u6A94\u6848","\u5FFD\u7565\u6B64\u6A94\u6848\u7684\u554F\u984C"],"vs/editor/contrib/wordHighlighter/wordHighlighter":["\u8B80\u53D6\u6B0A\u9650\u671F\u9593 (\u5982\u8B80\u53D6\u8B8A\u6578) \u7B26\u865F\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5BEB\u5165\u6B0A\u9650\u671F\u9593 (\u5982\u5BEB\u5165\u8B8A\u6578) \u7B26\u865F\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u8B80\u53D6\u5B58\u53D6\u671F\u9593 (\u4F8B\u5982\u8B80\u53D6\u8B8A\u6578\u6642) \u7B26\u865F\u7684\u908A\u6846\u984F\u8272\u3002","\u5BEB\u5165\u5B58\u53D6\u671F\u9593 (\u4F8B\u5982\u5BEB\u5165\u8B8A\u6578\u6642) \u7B26\u865F\u7684\u908A\u6846\u984F\u8272\u3002 ","\u7B26\u865F\u9192\u76EE\u63D0\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5BEB\u5165\u6B0A\u9650\u7B26\u865F\u9192\u76EE\u63D0\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u79FB\u81F3\u4E0B\u4E00\u500B\u53CD\u767D\u7B26\u865F","\u79FB\u81F3\u4E0A\u4E00\u500B\u53CD\u767D\u7B26\u865F","\u89F8\u767C\u7B26\u865F\u53CD\u767D\u986F\u793A"],"vs/editor/contrib/wordOperations/wordOperations":["\u522A\u9664\u5B57\u7D44"],"vs/platform/actions/browser/menuEntryActionViewItem":["{0} ({1})"],"vs/platform/configuration/common/configurationRegistry":["\u9810\u8A2D\u8A9E\u8A00\u7D44\u614B\u8986\u5BEB","\u8A2D\u5B9A\u8981\u91DD\u5C0D\u8A9E\u8A00\u8986\u5BEB\u7684\u7DE8\u8F2F\u5668\u8A2D\u5B9A\u3002","\u9019\u500B\u8A2D\u5B9A\u4E0D\u652F\u63F4\u4EE5\u8A9E\u8A00\u70BA\u6839\u64DA\u7684\u7D44\u614B\u3002","\u7121\u6CD5\u8A3B\u518A\u7A7A\u767D\u5C6C\u6027","\u7121\u6CD5\u8A3B\u518A '{0}'\u3002\u9019\u7B26\u5408\u7528\u65BC\u63CF\u8FF0\u8A9E\u8A00\u5C08\u7528\u7DE8\u8F2F\u5668\u8A2D\u5B9A\u7684\u5C6C\u6027\u6A21\u5F0F '\\\\[.*\\\\]$'\u3002\u8ACB\u4F7F\u7528 'configurationDefaults' \u8CA2\u737B\u3002","\u7121\u6CD5\u8A3B\u518A '{0}'\u3002\u6B64\u5C6C\u6027\u5DF2\u7D93\u8A3B\u518A\u3002"],"vs/platform/contextkey/browser/contextKeyService":["\u50B3\u56DE\u6709\u95DC\u5167\u5BB9\u7D22\u5F15\u9375\u8CC7\u8A0A\u7684\u547D\u4EE4"],"vs/platform/contextkey/common/contextkeys":["Whether the operating system is Windows"],"vs/platform/keybinding/common/abstractKeybindingService":["\u5DF2\u6309\u4E0B ({0})\u3002\u7B49\u5F85\u7B2C\u4E8C\u500B\u5957\u7D22\u9375...","\u6309\u9375\u7D44\u5408 ({0}, {1}) \u4E0D\u662F\u547D\u4EE4\u3002"],"vs/platform/list/browser/listService":["\u5DE5\u4F5C\u53F0","\u5C0D\u61C9Windows\u548CLinux\u7684'Control'\u8207\u5C0D\u61C9 macOS \u7684'Command'\u3002","\u5C0D\u61C9Windows\u548CLinux\u7684'Alt'\u8207\u5C0D\u61C9macOS\u7684'Option'\u3002","\u900F\u904E\u6ED1\u9F20\u591A\u9078\uFF0C\u7528\u65BC\u5728\u6A39\u72C0\u76EE\u9304\u8207\u6E05\u55AE\u4E2D\u65B0\u589E\u9805\u76EE\u7684\u8F14\u52A9\u6309\u9375 (\u4F8B\u5982\u5728\u7E3D\u7BA1\u4E2D\u958B\u555F\u7DE8\u8F2F\u5668 \u53CA SCM \u6AA2\u8996)\u3002'\u5728\u5074\u908A\u958B\u555F' \u6ED1\u9F20\u624B\u52E2 (\u82E5\u652F\u63F4) \u5C07\u6703\u9069\u61C9\u4EE5\u907F\u514D\u548C\u591A\u9078\u8F14\u52A9\u6309\u9375\u885D\u7A81\u3002","\u63A7\u5236\u5982\u4F55\u4F7F\u7528\u6ED1\u9F20 (\u5982\u652F\u63F4\u6B64\u7528\u6CD5) \u958B\u555F\u6A39\u72C0\u76EE\u9304\u8207\u6E05\u55AE\u4E2D\u7684\u9805\u76EE\u3002\u82E5\u4E0D\u9069\u7528\uFF0C\u67D0\u4E9B\u6A39\u72C0\u76EE\u9304\u8207\u6E05\u55AE\u53EF\u80FD\u6703\u9078\u64C7\u5FFD\u7565\u6B64\u8A2D\u5B9A\u3002","\u63A7\u5236\u5728\u5DE5\u4F5C\u53F0\u4E2D\uFF0C\u6E05\u55AE\u8207\u6A39\u72C0\u7D50\u69CB\u662F\u5426\u652F\u63F4\u6C34\u5E73\u6372\u52D5\u3002\u8B66\u544A: \u958B\u555F\u6B64\u8A2D\u5B9A\u5C07\u6703\u5F71\u97FF\u6548\u80FD\u3002","\u63A7\u5236\u6A39\u72C0\u7D50\u69CB\u7E2E\u6392 (\u50CF\u7D20)\u3002","\u63A7\u5236\u6A39\u7CFB\u662F\u5426\u61C9\u8F49\u8B6F\u7E2E\u6392\u8F14\u52A9\u7DDA\u3002","\u63A7\u5236\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u662F\u5426\u5177\u6709\u5E73\u6ED1\u6372\u52D5\u3002","\u6BD4\u5C0D\u6309\u9375\u8F38\u5165\u7684\u7C21\u6613\u6309\u9375\u700F\u89BD\u7126\u9EDE\u5143\u7D20\u3002\u50C5\u6BD4\u5C0D\u524D\u7F6E\u8A5E\u3002","\u9192\u76EE\u63D0\u793A\u9375\u76E4\u700F\u89BD\u6703\u9192\u76EE\u63D0\u793A\u7B26\u5408\u9375\u76E4\u8F38\u5165\u7684\u5143\u7D20\u3002\u9032\u4E00\u6B65\u5411\u4E0A\u6216\u5411\u4E0B\u700F\u89BD\u53EA\u6703\u5468\u904A\u9192\u76EE\u63D0\u793A\u7684\u5143\u7D20\u3002","\u7BE9\u9078\u9375\u76E4\u700F\u89BD\u6703\u7BE9\u6389\u4E26\u96B1\u85CF\u4E0D\u7B26\u5408\u9375\u76E4\u8F38\u5165\u7684\u6240\u6709\u5143\u7D20\u3002","\u63A7\u5236 Workbench \u4E2D\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u7684\u9375\u76E4\u700F\u89BD\u6A23\u5F0F\u3002\u53EF\u4EE5\u662F\u7C21\u6613\u7684\u3001\u9192\u76EE\u63D0\u793A\u548C\u7BE9\u9078\u3002","\u63A7\u5236\u662F\u5426\u53EA\u8981\u9375\u5165\u5373\u53EF\u81EA\u52D5\u89F8\u767C\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u4E2D\u7684\u9375\u76E4\u700F\u89BD\u3002\u82E5\u8A2D\u70BA `false`\uFF0C\u53EA\u6709\u5728\u57F7\u884C `list.toggleKeyboardNavigation` \u547D\u4EE4\u6642\uFF0C\u624D\u6703\u89F8\u767C\u9375\u76E4\u700F\u89BD\uFF0C\u60A8\u53EF\u70BA\u5176\u6307\u5B9A\u9375\u76E4\u5FEB\u901F\u9375\u3002","\u63A7\u5236\u7576\u6309\u4E0B\u8CC7\u6599\u593E\u540D\u7A31\u6642\uFF0C\u6A39\u72C0\u76EE\u9304\u8CC7\u6599\u593E\u7684\u5C55\u958B\u65B9\u5F0F\u3002\u8ACB\u6CE8\u610F\uFF0C\u82E5\u4E0D\u9069\u7528\uFF0C\u67D0\u4E9B\u6A39\u72C0\u76EE\u9304\u548C\u6E05\u55AE\u53EF\u80FD\u6703\u9078\u64C7\u5FFD\u7565\u6B64\u8A2D\u5B9A\u3002"],"vs/platform/markers/common/markers":["\u932F\u8AA4","\u8B66\u544A","\u8CC7\u8A0A"],"vs/platform/quickinput/browser/commandsQuickAccess":["{0}, {1}","\u6700\u8FD1\u4F7F\u7528\u7684","\u5176\u4ED6\u547D\u4EE4","\u547D\u4EE4 '{0}' \u9020\u6210\u932F\u8AA4 ({1})"],"vs/platform/quickinput/browser/helpQuickAccess":["\u5168\u57DF\u547D\u4EE4","\u7DE8\u8F2F\u5668\u547D\u4EE4","{0}, {1}"],"vs/platform/theme/common/colorRegistry":["\u6574\u9AD4\u7684\u524D\u666F\u8272\u5F69\u3002\u50C5\u7576\u672A\u88AB\u4EFB\u4F55\u5143\u4EF6\u8986\u758A\u6642\uFF0C\u624D\u6703\u4F7F\u7528\u6B64\u8272\u5F69\u3002","\u6574\u9AD4\u932F\u8AA4\u8A0A\u606F\u7684\u524D\u666F\u8272\u5F69\u3002\u50C5\u7576\u672A\u88AB\u4EFB\u4F55\u5143\u4EF6\u8986\u84CB\u6642\uFF0C\u624D\u6703\u4F7F\u7528\u6B64\u8272\u5F69\u3002","\u5DE5\u4F5C\u53F0\u4E2D\u5716\u793A\u7684\u9810\u8A2D\u8272\u5F69\u3002","\u7126\u9EDE\u9805\u76EE\u7684\u6574\u9AD4\u6846\u7DDA\u8272\u5F69\u3002\u53EA\u5728\u6C92\u6709\u4EFB\u4F55\u5143\u4EF6\u8986\u5BEB\u6B64\u8272\u5F69\u6642\uFF0C\u624D\u6703\u52A0\u4EE5\u4F7F\u7528\u3002","\u9805\u76EE\u5468\u570D\u7684\u984D\u5916\u6846\u7DDA\uFF0C\u53EF\u5C07\u9805\u76EE\u5F9E\u5176\u4ED6\u9805\u76EE\u4E2D\u5340\u9694\u51FA\u4F86\u4EE5\u63D0\u9AD8\u5C0D\u6BD4\u3002","\u4F7F\u7528\u4E2D\u9805\u76EE\u5468\u570D\u7684\u984D\u5916\u908A\u754C\uFF0C\u53EF\u5C07\u9805\u76EE\u5F9E\u5176\u4ED6\u9805\u76EE\u4E2D\u5340\u9694\u51FA\u4F86\u4EE5\u63D0\u9AD8\u5C0D\u6BD4\u3002","\u5167\u6587\u9023\u7D50\u7684\u524D\u666F\u8272\u5F69","\u6587\u5B57\u5340\u584A\u7684\u80CC\u666F\u984F\u8272\u3002","\u5C0F\u5DE5\u5177\u7684\u9670\u5F71\u8272\u5F69\uFF0C\u4F8B\u5982\u7DE8\u8F2F\u5668\u4E2D\u7684\u5C0B\u627E/\u53D6\u4EE3\u3002","\u8F38\u5165\u65B9\u584A\u7684\u80CC\u666F\u3002","\u8F38\u5165\u65B9\u584A\u7684\u524D\u666F\u3002","\u8F38\u5165\u65B9\u584A\u7684\u6846\u7DDA\u3002","\u8F38\u5165\u6B04\u4F4D\u4E2D\u53EF\u4F7F\u7528\u4E4B\u9805\u76EE\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u5728\u8F38\u5165\u6B04\u4F4D\u4E2D\u6240\u555F\u52D5\u9078\u9805\u7684\u80CC\u666F\u8272\u5F69\u3002","\u5728\u8F38\u5165\u6B04\u4F4D\u4E2D\u6240\u555F\u52D5\u9078\u9805\u7684\u524D\u666F\u8272\u5F69\u3002","\u8CC7\u8A0A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u80CC\u666F\u8272\u5F69\u3002","\u8CC7\u8A0A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u524D\u666F\u8272\u5F69\u3002","\u8CC7\u8A0A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u908A\u754C\u8272\u5F69\u3002","\u8B66\u544A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u80CC\u666F\u8272\u5F69\u3002","\u8B66\u544A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u524D\u666F\u8272\u5F69\u3002","\u8B66\u544A\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u908A\u754C\u8272\u5F69\u3002","\u932F\u8AA4\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u80CC\u666F\u8272\u5F69\u3002","\u932F\u8AA4\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u524D\u666F\u8272\u5F69\u3002","\u932F\u8AA4\u56B4\u91CD\u6027\u7684\u8F38\u5165\u9A57\u8B49\u908A\u754C\u8272\u5F69\u3002","\u4E0B\u62C9\u5F0F\u6E05\u55AE\u7684\u80CC\u666F\u3002","\u4E0B\u62C9\u5F0F\u6E05\u55AE\u7684\u524D\u666F\u3002","\u6309\u9215\u524D\u666F\u8272\u5F69\u3002","\u6309\u9215\u80CC\u666F\u8272\u5F69\u3002","\u66AB\u7559\u6642\u7684\u6309\u9215\u80CC\u666F\u8272\u5F69\u3002","\u6A19\u8A18\u7684\u80CC\u666F\u984F\u8272\u3002\u6A19\u8A18\u70BA\u5C0F\u578B\u7684\u8A0A\u606F\u6A19\u7C64,\u4F8B\u5982\u641C\u5C0B\u7D50\u679C\u7684\u6578\u91CF\u3002","\u6A19\u8A18\u7684\u524D\u666F\u984F\u8272\u3002\u6A19\u8A18\u70BA\u5C0F\u578B\u7684\u8A0A\u606F\u6A19\u7C64,\u4F8B\u5982\u641C\u5C0B\u7D50\u679C\u7684\u6578\u91CF\u3002","\u6307\u51FA\u5728\u6372\u52D5\u8A72\u6AA2\u8996\u7684\u6372\u8EF8\u9670\u5F71\u3002","\u6372\u8EF8\u6ED1\u687F\u7684\u80CC\u666F\u984F\u8272\u3002","\u52D5\u614B\u986F\u793A\u6642\u6372\u8EF8\u6ED1\u687F\u7684\u80CC\u666F\u984F\u8272\u3002","\u7576\u9EDE\u64CA\u6642\u6372\u8EF8\u6ED1\u687F\u7684\u80CC\u666F\u984F\u8272\u3002","\u9577\u6642\u9593\u904B\u884C\u9032\u5EA6\u689D\u7684\u80CC\u666F\u8272\u5F69.","\u7DE8\u8F2F\u5668\u4E2D\u932F\u8AA4\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u5167\u932F\u8AA4\u63D0\u793A\u7DDA\u7684\u524D\u666F\u8272\u5F69.","\u7DE8\u8F2F\u5668\u4E2D\u932F\u8AA4\u65B9\u584A\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u8B66\u544A\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u5167\u8B66\u544A\u63D0\u793A\u7DDA\u7684\u524D\u666F\u8272\u5F69.","\u7DE8\u8F2F\u5668\u4E2D\u7684\u8B66\u544A\u65B9\u584A\u6846\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u4E2D\u8CC7\u8A0A\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u5167\u8CC7\u8A0A\u63D0\u793A\u7DDA\u7684\u524D\u666F\u8272\u5F69","\u7DE8\u8F2F\u5668\u4E2D\u7684\u8CC7\u8A0A\u65B9\u584A\u6846\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5167\u63D0\u793A\u8A0A\u606F\u7684\u63D0\u793A\u7DDA\u524D\u666F\u8272\u5F69","\u7DE8\u8F2F\u5668\u4E2D\u7684\u63D0\u793A\u65B9\u584A\u6846\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u7684\u80CC\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u7684\u9810\u8A2D\u524D\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u8272\u5F69\uFF0C\u4F8B\u5982\u5C0B\u627E/\u53D6\u4EE3\u3002","\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177 (\u4F8B\u5982\u5C0B\u627E/\u53D6\u4EE3) \u7684\u524D\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177\u7684\u908A\u754C\u8272\u5F69\u3002\u5C0F\u5DE5\u5177\u9078\u64C7\u64C1\u6709\u908A\u754C\u6216\u8272\u5F69\u672A\u88AB\u5C0F\u5DE5\u5177\u8986\u5BEB\u6642\uFF0C\u624D\u6703\u4F7F\u7528\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u5C0F\u5DE5\u5177\u4E4B\u8ABF\u6574\u5927\u5C0F\u5217\u7684\u908A\u754C\u8272\u5F69\u3002\u53EA\u5728\u5C0F\u5DE5\u5177\u9078\u64C7\u5177\u6709\u8ABF\u6574\u5927\u5C0F\u908A\u754C\u4E14\u672A\u8986\u5BEB\u8A72\u8272\u5F69\u6642\uFF0C\u624D\u4F7F\u7528\u8A72\u8272\u5F69\u3002","\u5FEB\u901F\u9078\u64C7\u5668\u80CC\u666F\u8272\u5F69\u3002\u8A72\u5FEB\u901F\u9078\u64C7\u5668\u5C0F\u5DE5\u5177\u662F\u985E\u4F3C\u547D\u4EE4\u9078\u64C7\u5340\u7684\u9078\u64C7\u5668\u5BB9\u5668\u3002","\u5FEB\u901F\u9078\u64C7\u5668\u524D\u666F\u8272\u5F69\u3002\u5FEB\u901F\u9078\u64C7\u5668\u5C0F\u5DE5\u5177\u662F\u985E\u4F3C\u547D\u4EE4\u9078\u64C7\u5340\u7B49\u9078\u64C7\u5668\u7684\u5BB9\u5668\u3002","\u5FEB\u901F\u9078\u64C7\u5668\u6A19\u984C\u80CC\u666F\u8272\u5F69\u3002\u5FEB\u901F\u9078\u64C7\u5668\u5C0F\u5DE5\u5177\u662F\u985E\u4F3C\u547D\u4EE4\u9078\u64C7\u5340\u7684\u9078\u64C7\u5668\u5BB9\u5668\u3002","\u7126\u9EDE\u9805\u76EE\u7684\u5FEB\u901F\u9078\u64C7\u5668\u80CC\u666F\u8272\u5F69\u3002","\u5206\u7D44\u6A19\u7C64\u7684\u5FEB\u901F\u9078\u64C7\u5668\u8272\u5F69\u3002","\u5206\u7D44\u908A\u754C\u7684\u5FEB\u901F\u9078\u64C7\u5668\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u9078\u53D6\u7BC4\u570D\u7684\u8272\u5F69\u3002","\u70BA\u9078\u53D6\u7684\u6587\u5B57\u984F\u8272\u9AD8\u5C0D\u6BD4\u5316","\u975E\u4F7F\u7528\u4E2D\u7DE8\u8F2F\u5668\u5167\u7684\u9078\u53D6\u9805\u76EE\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u8207\u9078\u53D6\u9805\u76EE\u5167\u5BB9\u76F8\u540C\u4E4B\u5340\u57DF\u7684\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u9078\u53D6\u6642\uFF0C\u5167\u5BB9\u76F8\u540C\u4E4B\u5340\u57DF\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7B26\u5408\u76EE\u524D\u641C\u5C0B\u7684\u8272\u5F69\u3002","\u5176\u4ED6\u641C\u5C0B\u76F8\u7B26\u9805\u76EE\u7684\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u9650\u5236\u641C\u5C0B\u4E4B\u7BC4\u570D\u7684\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7B26\u5408\u76EE\u524D\u641C\u5C0B\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7B26\u5408\u5176\u4ED6\u641C\u5C0B\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u9650\u5236\u641C\u5C0B\u4E4B\u7BC4\u570D\u7684\u6846\u7DDA\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5728\u986F\u793A\u52D5\u614B\u986F\u793A\u7684\u6587\u5B57\u4E0B\u9192\u76EE\u63D0\u793A\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7DE8\u8F2F\u5668\u52D5\u614B\u986F\u793A\u7684\u80CC\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u52D5\u614B\u986F\u793A\u7684\u524D\u666F\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u52D5\u614B\u986F\u793A\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u66AB\u7559\u72C0\u614B\u5217\u7684\u80CC\u666F\u8272\u5F69\u3002","\u4F7F\u7528\u4E2D\u4E4B\u9023\u7D50\u7684\u8272\u5F69\u3002","\u5167\u5D4C\u63D0\u793A\u7684\u524D\u666F\u8272\u5F69","\u5167\u5D4C\u63D0\u793A\u7684\u80CC\u666F\u8272\u5F69","\u7528\u65BC\u71C8\u6CE1\u52D5\u4F5C\u5716\u793A\u7684\u8272\u5F69\u3002","\u7528\u65BC\u71C8\u6CE1\u81EA\u52D5\u4FEE\u6B63\u52D5\u4F5C\u5716\u793A\u7684\u8272\u5F69\u3002","\u5DF2\u63D2\u5165\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u5DF2\u79FB\u9664\u6587\u5B57\u7684\u80CC\u666F\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u63D2\u5165\u7684\u6587\u5B57\u5916\u6846\u8272\u5F69\u3002","\u79FB\u9664\u7684\u6587\u5B57\u5916\u6846\u8272\u5F69\u3002","\u5169\u500B\u6587\u5B57\u7DE8\u8F2F\u5668\u4E4B\u9593\u7684\u6846\u7DDA\u8272\u5F69\u3002","Diff \u7DE8\u8F2F\u5668\u7684\u659C\u7D0B\u586B\u6EFF\u8272\u5F69\u3002\u659C\u7D0B\u586B\u6EFF\u7528\u65BC\u4E26\u6392 Diff \u6AA2\u8996\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u5916\u6846\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u975E\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u6240\u9078\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u70BA\u975E\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u7576\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u70BA\u975E\u4F7F\u7528\u4E2D\u72C0\u614B\u6642\uFF0C\u7126\u9EDE\u9805\u76EE\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u5916\u6846\u8272\u5F69\u3002\u4F7F\u7528\u4E2D\u7684\u6E05\u55AE/\u6A39\u72C0\u76EE\u9304\u6709\u9375\u76E4\u7126\u9EDE\uFF0C\u975E\u4F7F\u7528\u4E2D\u8005\u5247\u6C92\u6709\u3002","\u4F7F\u7528\u6ED1\u9F20\u66AB\u7559\u5728\u9805\u76EE\u6642\u7684\u6E05\u55AE/\u6A39\u72C0\u80CC\u666F\u3002","\u6ED1\u9F20\u66AB\u7559\u5728\u9805\u76EE\u6642\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u3002","\u4F7F\u7528\u6ED1\u9F20\u56DB\u8655\u79FB\u52D5\u9805\u76EE\u6642\u7684\u6E05\u55AE/\u6A39\u72C0\u62D6\u653E\u80CC\u666F\u3002","\u5728\u6E05\u55AE/\u6A39\u72C0\u5167\u641C\u5C0B\u6642\uFF0C\u76F8\u7B26\u9192\u76EE\u63D0\u793A\u7684\u6E05\u55AE/\u6A39\u72C0\u524D\u666F\u8272\u5F69\u3002","\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u4E2D\u985E\u578B\u7BE9\u9078\u5C0F\u5DE5\u5177\u7684\u80CC\u666F\u8272\u5F69\u3002","\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u4E2D\u985E\u578B\u7BE9\u9078\u5C0F\u5DE5\u5177\u7684\u5927\u7DB1\u8272\u5F69\u3002","\u5728\u6C92\u6709\u76F8\u7B26\u9805\u76EE\u6642\uFF0C\u6E05\u55AE\u548C\u6A39\u72C0\u7D50\u69CB\u4E2D\u985E\u578B\u7BE9\u9078\u5C0F\u5DE5\u5177\u7684\u5927\u7DB1\u8272\u5F69\u3002","\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u6A39\u72C0\u7B46\u89F8\u8272\u5F69\u3002","\u7E2E\u6392\u8F14\u52A9\u7DDA\u7684\u6A39\u72C0\u7B46\u89F8\u8272\u5F69\u3002","\u529F\u80FD\u8868\u7684\u908A\u6846\u8272\u5F69\u3002","\u529F\u80FD\u8868\u9805\u76EE\u7684\u524D\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u9805\u76EE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u4E2D\u6240\u9078\u529F\u80FD\u8868\u9805\u76EE\u7684\u524D\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u4E2D\u6240\u9078\u529F\u80FD\u8868\u9805\u76EE\u7684\u80CC\u666F\u8272\u5F69\u3002","\u529F\u80FD\u8868\u4E2D\u6240\u9078\u529F\u80FD\u8868\u9805\u76EE\u7684\u6846\u7DDA\u8272\u5F69\u3002","\u529F\u80FD\u8868\u4E2D\u5206\u9694\u7DDA\u529F\u80FD\u8868\u9805\u76EE\u7684\u8272\u5F69\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5B9A\u4F4D\u505C\u99D0\u9EDE\u7684\u53CD\u767D\u986F\u793A\u80CC\u666F\u8272\u5F69\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u5B9A\u4F4D\u505C\u99D0\u9EDE\u7684\u53CD\u767D\u986F\u793A\u908A\u754C\u8272\u5F69\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u6700\u7D42\u5B9A\u4F4D\u505C\u99D0\u9EDE\u7684\u53CD\u767D\u986F\u793A\u80CC\u666F\u8272\u5F69\u3002","\u7A0B\u5F0F\u78BC\u7247\u6BB5\u6700\u7D42\u5B9A\u4F4D\u505C\u99D0\u9EDE\u7684\u9192\u76EE\u63D0\u793A\u6846\u7DDA\u8272\u5F69\u3002","\u5C0B\u627E\u76F8\u7B26\u9805\u76EE\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u8272\u5F69\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u9078\u53D6\u9805\u76EE\u9192\u76EE\u63D0\u793A\u7684\u6982\u89C0\u5C3A\u898F\u6A19\u8A18\u3002\u5176\u4E0D\u5F97\u70BA\u4E0D\u900F\u660E\u8272\u5F69\uFF0C\u4EE5\u514D\u96B1\u85CF\u5E95\u5C64\u88DD\u98FE\u3002","\u7528\u65BC\u5C0B\u627E\u76F8\u7B26\u9805\u76EE\u7684\u7E2E\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u7DE8\u8F2F\u5668\u9078\u53D6\u7BC4\u570D\u7684\u8FF7\u4F60\u5730\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u932F\u8AA4\u7684\u7E2E\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u8B66\u544A\u7684\u7E2E\u5716\u6A19\u8A18\u8272\u5F69\u3002","\u7E2E\u5716\u80CC\u666F\u8272\u5F69\u3002","\u7E2E\u5716\u6ED1\u687F\u80CC\u666F\u8272\u5F69\u3002","\u66AB\u7559\u6642\u7684\u7E2E\u5716\u6ED1\u687F\u80CC\u666F\u8272\u5F69\u3002","\u6309\u4E00\u4E0B\u6642\u7684\u7E2E\u5716\u6ED1\u687F\u80CC\u666F\u8272\u5F69\u3002","\u7528\u65BC\u554F\u984C\u932F\u8AA4\u5716\u793A\u7684\u8272\u5F69\u3002","\u7528\u65BC\u554F\u984C\u8B66\u544A\u5716\u793A\u7684\u8272\u5F69\u3002","\u7528\u65BC\u554F\u984C\u8CC7\u8A0A\u5716\u793A\u7684\u8272\u5F69\u3002"],"vs/platform/theme/common/iconRegistry":["\u8981\u4F7F\u7528\u7684\u5B57\u578B\u8B58\u5225\u78BC\u3002\u5982\u672A\u8A2D\u5B9A\uFF0C\u5C31\u6703\u4F7F\u7528\u6700\u5148\u5B9A\u7FA9\u7684\u5B57\u578B\u3002","\u8207\u5716\u793A\u5B9A\u7FA9\u5EFA\u7ACB\u95DC\u806F\u7684\u5B57\u578B\u5B57\u5143\u3002","\u5C0F\u5DE5\u5177\u4E2D\u95DC\u9589\u52D5\u4F5C\u7684\u5716\u793A\u3002"],"vs/platform/undoRedo/common/undoRedoService":["\u5DF2\u5728\u78C1\u789F\u4E0A\u95DC\u9589\u4E26\u4FEE\u6539\u4EE5\u4E0B\u6A94\u6848: {0}\u3002","\u4E0B\u5217\u6A94\u6848\u5DF2\u4F7F\u7528\u4E0D\u76F8\u5BB9\u7684\u65B9\u5F0F\u4FEE\u6539: {0}\u3002","\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'\u3002{1}","\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'\u3002{1}","\u56E0\u70BA\u5DF2\u5C0D {1} \u9032\u884C\u8B8A\u66F4\uFF0C\u6240\u4EE5\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'","\u56E0\u70BA {1} \u4E2D\u5DF2\u7D93\u6709\u6B63\u5728\u57F7\u884C\u7684\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u70BA\u6240\u6709\u6A94\u6848\u5FA9\u539F '{0}'","\u56E0\u70BA\u540C\u6642\u767C\u751F\u5176\u4ED6\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u70BA\u6240\u6709\u6A94\u6848\u5FA9\u539F '{0}'","\u8981\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}' \u55CE?","\u5728 {0} \u500B\u6A94\u6848\u4E2D\u5FA9\u539F","\u5FA9\u539F\u6B64\u6A94\u6848","\u53D6\u6D88","\u56E0\u70BA\u5DF2\u7D93\u6709\u6B63\u5728\u57F7\u884C\u7684\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u5FA9\u539F '{0}'\u3002","\u8981\u5FA9\u539F '{0}' \u55CE?","\u5FA9\u539F","\u53D6\u6D88","\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'\u3002{1}","\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'\u3002{1}","\u56E0\u70BA\u5DF2\u5C0D {1} \u9032\u884C\u8B8A\u66F4\uFF0C\u6240\u4EE5\u7121\u6CD5\u5FA9\u539F\u6240\u6709\u6A94\u6848\u7684 '{0}'","\u56E0\u70BA {1} \u4E2D\u5DF2\u7D93\u6709\u6B63\u5728\u57F7\u884C\u7684\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u70BA\u6240\u6709\u6A94\u6848\u91CD\u505A '{0}'","\u56E0\u70BA\u540C\u6642\u767C\u751F\u5176\u4ED6\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u70BA\u6240\u6709\u6A94\u6848\u91CD\u505A '{0}'","\u56E0\u70BA\u5DF2\u7D93\u6709\u6B63\u5728\u57F7\u884C\u7684\u5FA9\u539F\u6216\u91CD\u505A\u4F5C\u696D\uFF0C\u6240\u4EE5\u7121\u6CD5\u91CD\u505A '{0}'\u3002"]}); diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-tw.js.gz b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-tw.js.gz new file mode 100644 index 0000000..0577909 Binary files /dev/null and b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/editor/editor.main.nls.zh-tw.js.gz differ diff --git a/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/language/css/cssMode.js b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/language/css/cssMode.js new file mode 100644 index 0000000..c4b71c0 --- /dev/null +++ b/joju-server/src/main/resources/admin-ui/libs/monaco-editor/vs/language/css/cssMode.js @@ -0,0 +1,7 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * monaco-css version: 3.3.0(ed57760e69ec24098de2b4e49fa5be7f48be019a) + * Released under the MIT license + * https://github.com/Microsoft/monaco-css/blob/master/LICENSE.md + *-----------------------------------------------------------------------------*/ +define("vs/language/css/workerManager",["require","exports","./fillers/monaco-editor-core"],(function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkerManager=void 0;var r=function(){function e(e){var t=this;this._defaults=e,this._worker=null,this._idleCheckInterval=window.setInterval((function(){return t._checkIfIdle()}),3e4),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange((function(){return t._stopWorker()}))}return e.prototype._stopWorker=function(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null},e.prototype.dispose=function(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()},e.prototype._checkIfIdle=function(){this._worker&&(Date.now()-this._lastUsedTime>12e4&&this._stopWorker())},e.prototype._getClient=function(){return this._lastUsedTime=Date.now(),this._client||(this._worker=n.editor.createWebWorker({moduleId:"vs/language/css/cssWorker",label:this._defaults.languageId,createData:{languageSettings:this._defaults.diagnosticsOptions,languageId:this._defaults.languageId}}),this._client=this._worker.getProxy()),this._client},e.prototype.getLanguageServiceWorker=function(){for(var e,t=this,n=[],r=0;rthis.source.length)return!1;for(var t=0;t=d&&e<=p&&(this.stream.advance(t+1),this.stream.advanceWhileChar((function(e){return e>=d&&e<=p||0===t&&e===V})),!0)},e.prototype._newline=function(e){var t=this.stream.peekChar();switch(t){case _:case P:case R:return this.stream.advance(1),e.push(String.fromCharCode(t)),t===_&&this.stream.advanceIfChar(R)&&e.push("\n"),!0}return!1},e.prototype._escape=function(e,t){var n=this.stream.peekChar();if(n===F){this.stream.advance(1),n=this.stream.peekChar();for(var r=0;r<6&&(n>=d&&n<=p||n>=i&&n<=o||n>=a&&n<=l);)this.stream.advance(1),n=this.stream.peekChar(),r++;if(r>0){try{var s=parseInt(this.stream.substring(this.stream.pos()-r),16);s&&e.push(String.fromCharCode(s))}catch(e){}return n===N||n===M?this.stream.advance(1):this._newline([]),!0}if(n!==_&&n!==P&&n!==R)return this.stream.advance(1),e.push(String.fromCharCode(n)),!0;if(t)return this._newline(e)}return!1},e.prototype._stringChar=function(e,t){var n=this.stream.peekChar();return 0!==n&&n!==e&&n!==F&&n!==_&&n!==P&&n!==R&&(this.stream.advance(1),t.push(String.fromCharCode(n)),!0)},e.prototype._string=function(e){if(this.stream.peekChar()===I||this.stream.peekChar()===z){var t=this.stream.nextChar();for(e.push(String.fromCharCode(t));this._stringChar(t,e)||this._escape(e,!0););return this.stream.peekChar()===t?(this.stream.nextChar(),e.push(String.fromCharCode(t)),n.String):n.BadString}return null},e.prototype._unquotedChar=function(e){var t=this.stream.peekChar();return 0!==t&&t!==F&&t!==I&&t!==z&&t!==w&&t!==x&&t!==N&&t!==M&&t!==R&&t!==P&&t!==_&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)},e.prototype._unquotedString=function(e){for(var t=!1;this._unquotedChar(e)||this._escape(e);)t=!0;return t},e.prototype._whitespace=function(){return this.stream.advanceWhileChar((function(e){return e===N||e===M||e===R||e===P||e===_}))>0},e.prototype._name=function(e){for(var t=!1;this._identChar(e)||this._escape(e);)t=!0;return t},e.prototype.ident=function(e){var t=this.stream.pos();if(this._minus(e)&&this._minus(e)){if(this._identFirstChar(e)||this._escape(e)){for(;this._identChar(e)||this._escape(e););return!0}}else if(this._identFirstChar(e)||this._escape(e)){for(;this._identChar(e)||this._escape(e););return!0}return this.stream.goBackTo(t),!1},e.prototype._identFirstChar=function(e){var t=this.stream.peekChar();return(t===b||t>=i&&t<=s||t>=a&&t<=c||t>=128&&t<=65535)&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)},e.prototype._minus=function(e){var t=this.stream.peekChar();return t===g&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)},e.prototype._identChar=function(e){var t=this.stream.peekChar();return(t===b||t===g||t>=i&&t<=s||t>=a&&t<=c||t>=d&&t<=p||t>=128&&t<=65535)&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)},e}();t.Scanner=G})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/utils/strings",["require","exports"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.trim=t.getLimitedString=t.difference=t.endsWith=t.startsWith=void 0,t.startsWith=function(e,t){if(e.length0?e.lastIndexOf(t)===n:0===n&&e===t},t.difference=function(e,t,n){void 0===n&&(n=4);var r=Math.abs(e.length-t.length);if(r>n)return 0;var i,o,s=[],a=[];for(i=0;ie.end?null:(e.accept((function(e){return-1===e.offset&&-1===e.length||e.offset<=t&&e.end>=t&&(n?e.length<=n.length&&(n=e):n=e,!0)})),n)}!function(e){e[e.Undefined=0]="Undefined",e[e.Identifier=1]="Identifier",e[e.Stylesheet=2]="Stylesheet",e[e.Ruleset=3]="Ruleset",e[e.Selector=4]="Selector",e[e.SimpleSelector=5]="SimpleSelector",e[e.SelectorInterpolation=6]="SelectorInterpolation",e[e.SelectorCombinator=7]="SelectorCombinator",e[e.SelectorCombinatorParent=8]="SelectorCombinatorParent",e[e.SelectorCombinatorSibling=9]="SelectorCombinatorSibling",e[e.SelectorCombinatorAllSiblings=10]="SelectorCombinatorAllSiblings",e[e.SelectorCombinatorShadowPiercingDescendant=11]="SelectorCombinatorShadowPiercingDescendant",e[e.Page=12]="Page",e[e.PageBoxMarginBox=13]="PageBoxMarginBox",e[e.ClassSelector=14]="ClassSelector",e[e.IdentifierSelector=15]="IdentifierSelector",e[e.ElementNameSelector=16]="ElementNameSelector",e[e.PseudoSelector=17]="PseudoSelector",e[e.AttributeSelector=18]="AttributeSelector",e[e.Declaration=19]="Declaration",e[e.Declarations=20]="Declarations",e[e.Property=21]="Property",e[e.Expression=22]="Expression",e[e.BinaryExpression=23]="BinaryExpression",e[e.Term=24]="Term",e[e.Operator=25]="Operator",e[e.Value=26]="Value",e[e.StringLiteral=27]="StringLiteral",e[e.URILiteral=28]="URILiteral",e[e.EscapedValue=29]="EscapedValue",e[e.Function=30]="Function",e[e.NumericValue=31]="NumericValue",e[e.HexColorValue=32]="HexColorValue",e[e.MixinDeclaration=33]="MixinDeclaration",e[e.MixinReference=34]="MixinReference",e[e.VariableName=35]="VariableName",e[e.VariableDeclaration=36]="VariableDeclaration",e[e.Prio=37]="Prio",e[e.Interpolation=38]="Interpolation",e[e.NestedProperties=39]="NestedProperties",e[e.ExtendsReference=40]="ExtendsReference",e[e.SelectorPlaceholder=41]="SelectorPlaceholder",e[e.Debug=42]="Debug",e[e.If=43]="If",e[e.Else=44]="Else",e[e.For=45]="For",e[e.Each=46]="Each",e[e.While=47]="While",e[e.MixinContentReference=48]="MixinContentReference",e[e.MixinContentDeclaration=49]="MixinContentDeclaration",e[e.Media=50]="Media",e[e.Keyframe=51]="Keyframe",e[e.FontFace=52]="FontFace",e[e.Import=53]="Import",e[e.Namespace=54]="Namespace",e[e.Invocation=55]="Invocation",e[e.FunctionDeclaration=56]="FunctionDeclaration",e[e.ReturnStatement=57]="ReturnStatement",e[e.MediaQuery=58]="MediaQuery",e[e.FunctionParameter=59]="FunctionParameter",e[e.FunctionArgument=60]="FunctionArgument",e[e.KeyframeSelector=61]="KeyframeSelector",e[e.ViewPort=62]="ViewPort",e[e.Document=63]="Document",e[e.AtApplyRule=64]="AtApplyRule",e[e.CustomPropertyDeclaration=65]="CustomPropertyDeclaration",e[e.CustomPropertySet=66]="CustomPropertySet",e[e.ListEntry=67]="ListEntry",e[e.Supports=68]="Supports",e[e.SupportsCondition=69]="SupportsCondition",e[e.NamespacePrefix=70]="NamespacePrefix",e[e.GridLine=71]="GridLine",e[e.Plugin=72]="Plugin",e[e.UnknownAtRule=73]="UnknownAtRule",e[e.Use=74]="Use",e[e.ModuleConfiguration=75]="ModuleConfiguration",e[e.Forward=76]="Forward",e[e.ForwardVisibility=77]="ForwardVisibility",e[e.Module=78]="Module"}(n=t.NodeType||(t.NodeType={})),function(e){e[e.Mixin=0]="Mixin",e[e.Rule=1]="Rule",e[e.Variable=2]="Variable",e[e.Function=3]="Function",e[e.Keyframe=4]="Keyframe",e[e.Unknown=5]="Unknown",e[e.Module=6]="Module",e[e.Forward=7]="Forward",e[e.ForwardVisibility=8]="ForwardVisibility"}(t.ReferenceType||(t.ReferenceType={})),t.getNodeAtOffset=i,t.getNodePath=function(e,t){for(var n=i(e,t),r=[];n;)r.unshift(n),n=n.parent;return r},t.getParentDeclaration=function(e){var t=e.findParent(n.Declaration),r=t&&t.getValue();return r&&r.encloses(e)?t:null};var o=function(){function e(e,t,n){void 0===e&&(e=-1),void 0===t&&(t=-1),this.parent=null,this.offset=e,this.length=t,n&&(this.nodeType=n)}return Object.defineProperty(e.prototype,"end",{get:function(){return this.offset+this.length},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"type",{get:function(){return this.nodeType||n.Undefined},set:function(e){this.nodeType=e},enumerable:!1,configurable:!0}),e.prototype.getTextProvider=function(){for(var e=this;e&&!e.textProvider;)e=e.parent;return e?e.textProvider:function(){return"unknown"}},e.prototype.getText=function(){return this.getTextProvider()(this.offset,this.length)},e.prototype.matches=function(e){return this.length===e.length&&this.getTextProvider()(this.offset,this.length)===e},e.prototype.startsWith=function(e){return this.length>=e.length&&this.getTextProvider()(this.offset,e.length)===e},e.prototype.endsWith=function(e){return this.length>=e.length&&this.getTextProvider()(this.end-e.length,e.length)===e},e.prototype.accept=function(e){if(e(this)&&this.children)for(var t=0,n=this.children;t=0&&e.parent.children.splice(n,1)}e.parent=this;var r=this.children;return r||(r=this.children=[]),-1!==t?r.splice(t,0,e):r.push(e),e},e.prototype.attachTo=function(e,t){return void 0===t&&(t=-1),e&&e.adoptChild(this,t),this},e.prototype.collectIssues=function(e){this.issues&&e.push.apply(e,this.issues)},e.prototype.addIssue=function(e){this.issues||(this.issues=[]),this.issues.push(e)},e.prototype.hasIssue=function(e){return Array.isArray(this.issues)&&this.issues.some((function(t){return t.getRule()===e}))},e.prototype.isErroneous=function(e){return void 0===e&&(e=!1),!!(this.issues&&this.issues.length>0)||e&&Array.isArray(this.children)&&this.children.some((function(e){return e.isErroneous(!0)}))},e.prototype.setNode=function(e,t,n){return void 0===n&&(n=-1),!!t&&(t.attachTo(this,n),this[e]=t,!0)},e.prototype.addChild=function(e){return!!e&&(this.children||(this.children=[]),e.attachTo(this),this.updateOffsetAndLength(e),!0)},e.prototype.updateOffsetAndLength=function(e){(e.offsetthis.end||-1===this.length)&&(this.length=t-this.offset)},e.prototype.hasChildren=function(){return!!this.children&&this.children.length>0},e.prototype.getChildren=function(){return this.children?this.children.slice(0):[]},e.prototype.getChild=function(e){return this.children&&e=0;n--)if((t=this.children[n]).offset<=e)return t;return null},e.prototype.findChildAtOffset=function(e,t){var n=this.findFirstChildBeforeOffset(e);return n&&n.end>=e?t&&n.findChildAtOffset(e,!0)||n:null},e.prototype.encloses=function(e){return this.offset<=e.offset&&this.offset+this.length>=e.offset+e.length},e.prototype.getParent=function(){for(var e=this.parent;e instanceof s;)e=e.parent;return e},e.prototype.findParent=function(e){for(var t=this;t&&t.type!==e;)t=t.parent;return t},e.prototype.findAParent=function(){for(var e=[],t=0;t/g,">")}function i(e,t){if(!e.description||""===e.description)return"";if("string"!=typeof e.description)return e.description.value;var r="";if(!1!==(null==t?void 0:t.documentation)){e.status&&(r+=n(e.status)),r+=e.description;var i=s(e.browsers);i&&(r+="\n("+i+")"),"syntax"in e&&(r+="\n\nSyntax: "+e.syntax)}return e.references&&e.references.length>0&&!1!==(null==t?void 0:t.references)&&(r.length>0&&(r+="\n\n"),r+=e.references.map((function(e){return e.name+": "+e.url})).join(" | ")),r}function o(e,t){if(!e.description||""===e.description)return"";var i="";if(!1!==(null==t?void 0:t.documentation)){e.status&&(i+=n(e.status)),i+=r("string"==typeof e.description?e.description:e.description.value);var o=s(e.browsers);o&&(i+="\n\n("+r(o)+")"),"syntax"in e&&e.syntax&&(i+="\n\nSyntax: "+r(e.syntax))}return e.references&&e.references.length>0&&!1!==(null==t?void 0:t.references)&&(i.length>0&&(i+="\n\n"),i+=e.references.map((function(e){return"["+e.name+"]("+e.url+")"})).join(" | ")),i}function s(e){return void 0===e&&(e=[]),0===e.length?null:e.map((function(e){var n="",r=e.match(/([A-Z]+)(\d+)?/),i=r[1],o=r[2];return i in t.browserNames&&(n+=t.browserNames[i]),o&&(n+=" "+o),n})).join(", ")}Object.defineProperty(t,"__esModule",{value:!0}),t.getBrowserLabel=t.textToMarkedString=t.getEntryDescription=t.browserNames=void 0,t.browserNames={E:"Edge",FF:"Firefox",S:"Safari",C:"Chrome",IE:"IE",O:"Opera"},t.getEntryDescription=function(e,t,n){var r;if(""!==(r=t?{kind:"markdown",value:o(e,n)}:{kind:"plaintext",value:i(e,n)}).value)return r},t.textToMarkedString=r,t.getBrowserLabel=s})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/languageFacts/colors",["require","exports","../parser/cssNodes","vscode-nls"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getColorValue=t.hslFromColor=t.colorFromHSL=t.colorFrom256RGB=t.colorFromHex=t.hexDigit=t.isColorValue=t.isColorConstructor=t.colorKeywords=t.colors=t.colorFunctions=void 0;var n=e("../parser/cssNodes"),r=e("vscode-nls").loadMessageBundle();function i(e,t){var n=e.getText().match(/^([-+]?[0-9]*\.?[0-9]+)(%?)$/);if(n){n[2]&&(t=100);var r=parseFloat(n[1])/t;if(r>=0&&r<=1)return r}throw new Error}function o(e){var t=e.getName();return!!t&&/^(rgb|rgba|hsl|hsla)$/gi.test(t)}t.colorFunctions=[{func:"rgb($red, $green, $blue)",desc:r("css.builtin.rgb","Creates a Color from red, green, and blue values.")},{func:"rgba($red, $green, $blue, $alpha)",desc:r("css.builtin.rgba","Creates a Color from red, green, blue, and alpha values.")},{func:"hsl($hue, $saturation, $lightness)",desc:r("css.builtin.hsl","Creates a Color from hue, saturation, and lightness values.")},{func:"hsla($hue, $saturation, $lightness, $alpha)",desc:r("css.builtin.hsla","Creates a Color from hue, saturation, lightness, and alpha values.")}],t.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},t.colorKeywords={currentColor:"The value of the 'color' property. The computed value of the 'currentColor' keyword is the computed value of the 'color' property. If the 'currentColor' keyword is set on the 'color' property itself, it is treated as 'color:inherit' at parse time.",transparent:"Fully transparent. This keyword can be considered a shorthand for rgba(0,0,0,0) which is its computed value."},t.isColorConstructor=o,t.isColorValue=function(e){if(e.type===n.NodeType.HexColorValue)return!0;if(e.type===n.NodeType.Function)return o(e);if(e.type===n.NodeType.Identifier){if(e.parent&&e.parent.type!==n.NodeType.Term)return!1;var r=e.getText().toLowerCase();if("none"===r)return!1;if(t.colors[r])return!0}return!1};function s(e){return e<48?0:e<=57?e-48:(e<97&&(e+=32),e>=97&&e<=102?e-97+10:0)}function a(e){if("#"!==e[0])return null;switch(e.length){case 4:return{red:17*s(e.charCodeAt(1))/255,green:17*s(e.charCodeAt(2))/255,blue:17*s(e.charCodeAt(3))/255,alpha:1};case 5:return{red:17*s(e.charCodeAt(1))/255,green:17*s(e.charCodeAt(2))/255,blue:17*s(e.charCodeAt(3))/255,alpha:17*s(e.charCodeAt(4))/255};case 7:return{red:(16*s(e.charCodeAt(1))+s(e.charCodeAt(2)))/255,green:(16*s(e.charCodeAt(3))+s(e.charCodeAt(4)))/255,blue:(16*s(e.charCodeAt(5))+s(e.charCodeAt(6)))/255,alpha:1};case 9:return{red:(16*s(e.charCodeAt(1))+s(e.charCodeAt(2)))/255,green:(16*s(e.charCodeAt(3))+s(e.charCodeAt(4)))/255,blue:(16*s(e.charCodeAt(5))+s(e.charCodeAt(6)))/255,alpha:(16*s(e.charCodeAt(7))+s(e.charCodeAt(8)))/255}}return null}function l(e,t,n,r){if(void 0===r&&(r=1),0===t)return{red:n,green:n,blue:n,alpha:r};var i=function(e,t,n){for(;n<0;)n+=6;for(;n>=6;)n-=6;return n<1?(t-e)*n+e:n<3?t:n<4?(t-e)*(4-n)+e:e},o=n<=.5?n*(t+1):n+t-n*t,s=2*n-o;return{red:i(s,o,(e/=60)+2),green:i(s,o,e),blue:i(s,o,e-2),alpha:r}}t.hexDigit=s,t.colorFromHex=a,t.colorFrom256RGB=function(e,t,n,r){return void 0===r&&(r=1),{red:e/255,green:t/255,blue:n/255,alpha:r}},t.colorFromHSL=l,t.hslFromColor=function(e){var t=e.red,n=e.green,r=e.blue,i=e.alpha,o=Math.max(t,n,r),s=Math.min(t,n,r),a=0,l=0,c=(s+o)/2,d=o-s;if(d>0){switch(l=Math.min(c<=.5?d/(2*c):d/(2-2*c),1),o){case t:a=(n-r)/d+(n4)return null;try{var c=4===s.length?i(s[3],1):1;if("rgb"===o||"rgba"===o)return{red:i(s[0],255),green:i(s[1],255),blue:i(s[2],255),alpha:c};if("hsl"===o||"hsla"===o)return l(function(e){var t=e.getText();if(t.match(/^([-+]?[0-9]*\.?[0-9]+)(deg)?$/))return parseFloat(t)%360;throw new Error}(s[0]),i(s[1],100),i(s[2],100),c)}catch(e){return null}}else if(e.type===n.NodeType.Identifier){if(e.parent&&e.parent.type!==n.NodeType.Term)return null;var d=e.parent;if(d&&d.parent&&d.parent.type===n.NodeType.BinaryExpression){var p=d.parent;if(p.parent&&p.parent.type===n.NodeType.ListEntry&&p.parent.key===p)return null}var h=e.getText().toLowerCase();if("none"===h)return null;var u=t.colors[h];if(u)return a(u)}return null}})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/languageFacts/builtinData",["require","exports"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.pageBoxDirectives=t.svgElements=t.html5Tags=t.units=t.basicShapeFunctions=t.transitionTimingFunctions=t.imageFunctions=t.cssWideKeywords=t.geometryBoxKeywords=t.boxKeywords=t.lineWidthKeywords=t.lineStyleKeywords=t.repeatStyleKeywords=t.positionKeywords=void 0,t.positionKeywords={bottom:"Computes to ‘100%’ for the vertical position if one or two values are given, otherwise specifies the bottom edge as the origin for the next offset.",center:"Computes to ‘50%’ (‘left 50%’) for the horizontal position if the horizontal position is not otherwise specified, or ‘50%’ (‘top 50%’) for the vertical position if it is.",left:"Computes to ‘0%’ for the horizontal position if one or two values are given, otherwise specifies the left edge as the origin for the next offset.",right:"Computes to ‘100%’ for the horizontal position if one or two values are given, otherwise specifies the right edge as the origin for the next offset.",top:"Computes to ‘0%’ for the vertical position if one or two values are given, otherwise specifies the top edge as the origin for the next offset."},t.repeatStyleKeywords={"no-repeat":"Placed once and not repeated in this direction.",repeat:"Repeated in this direction as often as needed to cover the background painting area.","repeat-x":"Computes to ‘repeat no-repeat’.","repeat-y":"Computes to ‘no-repeat repeat’.",round:"Repeated as often as will fit within the background positioning area. If it doesn’t fit a whole number of times, it is rescaled so that it does.",space:"Repeated as often as will fit within the background positioning area without being clipped and then the images are spaced out to fill the area."},t.lineStyleKeywords={dashed:"A series of square-ended dashes.",dotted:"A series of round dots.",double:"Two parallel solid lines with some space between them.",groove:"Looks as if it were carved in the canvas.",hidden:"Same as ‘none’, but has different behavior in the border conflict resolution rules for border-collapsed tables.",inset:"Looks as if the content on the inside of the border is sunken into the canvas.",none:"No border. Color and width are ignored.",outset:"Looks as if the content on the inside of the border is coming out of the canvas.",ridge:"Looks as if it were coming out of the canvas.",solid:"A single line segment."},t.lineWidthKeywords=["medium","thick","thin"],t.boxKeywords={"border-box":"The background is painted within (clipped to) the border box.","content-box":"The background is painted within (clipped to) the content box.","padding-box":"The background is painted within (clipped to) the padding box."},t.geometryBoxKeywords={"margin-box":"Uses the margin box as reference box.","fill-box":"Uses the object bounding box as reference box.","stroke-box":"Uses the stroke bounding box as reference box.","view-box":"Uses the nearest SVG viewport as reference box."},t.cssWideKeywords={initial:"Represents the value specified as the property’s initial value.",inherit:"Represents the computed value of the property on the element’s parent.",unset:"Acts as either `inherit` or `initial`, depending on whether the property is inherited or not."},t.imageFunctions={"url()":"Reference an image file by URL","image()":"Provide image fallbacks and annotations.","-webkit-image-set()":"Provide multiple resolutions. Remember to use unprefixed image-set() in addition.","image-set()":"Provide multiple resolutions of an image and const the UA decide which is most appropriate in a given situation.","-moz-element()":"Use an element in the document as an image. Remember to use unprefixed element() in addition.","element()":"Use an element in the document as an image.","cross-fade()":"Indicates the two images to be combined and how far along in the transition the combination is.","-webkit-gradient()":"Deprecated. Use modern linear-gradient() or radial-gradient() instead.","-webkit-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","-moz-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","-o-linear-gradient()":"Linear gradient. Remember to use unprefixed version in addition.","linear-gradient()":"A linear gradient is created by specifying a straight gradient line, and then several colors placed along that line.","-webkit-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","-moz-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","-o-repeating-linear-gradient()":"Repeating Linear gradient. Remember to use unprefixed version in addition.","repeating-linear-gradient()":"Same as linear-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop’s position and the first specified color-stop’s position.","-webkit-radial-gradient()":"Radial gradient. Remember to use unprefixed version in addition.","-moz-radial-gradient()":"Radial gradient. Remember to use unprefixed version in addition.","radial-gradient()":"Colors emerge from a single point and smoothly spread outward in a circular or elliptical shape.","-webkit-repeating-radial-gradient()":"Repeating radial gradient. Remember to use unprefixed version in addition.","-moz-repeating-radial-gradient()":"Repeating radial gradient. Remember to use unprefixed version in addition.","repeating-radial-gradient()":"Same as radial-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop’s position and the first specified color-stop’s position."},t.transitionTimingFunctions={ease:"Equivalent to cubic-bezier(0.25, 0.1, 0.25, 1.0).","ease-in":"Equivalent to cubic-bezier(0.42, 0, 1.0, 1.0).","ease-in-out":"Equivalent to cubic-bezier(0.42, 0, 0.58, 1.0).","ease-out":"Equivalent to cubic-bezier(0, 0, 0.58, 1.0).",linear:"Equivalent to cubic-bezier(0.0, 0.0, 1.0, 1.0).","step-end":"Equivalent to steps(1, end).","step-start":"Equivalent to steps(1, start).","steps()":"The first parameter specifies the number of intervals in the function. The second parameter, which is optional, is either the value “start” or “end”.","cubic-bezier()":"Specifies a cubic-bezier curve. The four values specify points P1 and P2 of the curve as (x1, y1, x2, y2).","cubic-bezier(0.6, -0.28, 0.735, 0.045)":"Ease-in Back. Overshoots.","cubic-bezier(0.68, -0.55, 0.265, 1.55)":"Ease-in-out Back. Overshoots.","cubic-bezier(0.175, 0.885, 0.32, 1.275)":"Ease-out Back. Overshoots.","cubic-bezier(0.6, 0.04, 0.98, 0.335)":"Ease-in Circular. Based on half circle.","cubic-bezier(0.785, 0.135, 0.15, 0.86)":"Ease-in-out Circular. Based on half circle.","cubic-bezier(0.075, 0.82, 0.165, 1)":"Ease-out Circular. Based on half circle.","cubic-bezier(0.55, 0.055, 0.675, 0.19)":"Ease-in Cubic. Based on power of three.","cubic-bezier(0.645, 0.045, 0.355, 1)":"Ease-in-out Cubic. Based on power of three.","cubic-bezier(0.215, 0.610, 0.355, 1)":"Ease-out Cubic. Based on power of three.","cubic-bezier(0.95, 0.05, 0.795, 0.035)":"Ease-in Exponential. Based on two to the power ten.","cubic-bezier(1, 0, 0, 1)":"Ease-in-out Exponential. Based on two to the power ten.","cubic-bezier(0.19, 1, 0.22, 1)":"Ease-out Exponential. Based on two to the power ten.","cubic-bezier(0.47, 0, 0.745, 0.715)":"Ease-in Sine.","cubic-bezier(0.445, 0.05, 0.55, 0.95)":"Ease-in-out Sine.","cubic-bezier(0.39, 0.575, 0.565, 1)":"Ease-out Sine.","cubic-bezier(0.55, 0.085, 0.68, 0.53)":"Ease-in Quadratic. Based on power of two.","cubic-bezier(0.455, 0.03, 0.515, 0.955)":"Ease-in-out Quadratic. Based on power of two.","cubic-bezier(0.25, 0.46, 0.45, 0.94)":"Ease-out Quadratic. Based on power of two.","cubic-bezier(0.895, 0.03, 0.685, 0.22)":"Ease-in Quartic. Based on power of four.","cubic-bezier(0.77, 0, 0.175, 1)":"Ease-in-out Quartic. Based on power of four.","cubic-bezier(0.165, 0.84, 0.44, 1)":"Ease-out Quartic. Based on power of four.","cubic-bezier(0.755, 0.05, 0.855, 0.06)":"Ease-in Quintic. Based on power of five.","cubic-bezier(0.86, 0, 0.07, 1)":"Ease-in-out Quintic. Based on power of five.","cubic-bezier(0.23, 1, 0.320, 1)":"Ease-out Quintic. Based on power of five."},t.basicShapeFunctions={"circle()":"Defines a circle.","ellipse()":"Defines an ellipse.","inset()":"Defines an inset rectangle.","polygon()":"Defines a polygon."},t.units={length:["em","rem","ex","px","cm","mm","in","pt","pc","ch","vw","vh","vmin","vmax"],angle:["deg","rad","grad","turn"],time:["ms","s"],frequency:["Hz","kHz"],resolution:["dpi","dpcm","dppx"],percentage:["%","fr"]},t.html5Tags=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","const","video","wbr"],t.svgElements=["circle","clipPath","cursor","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","foreignObject","g","hatch","hatchpath","image","line","linearGradient","marker","mask","mesh","meshpatch","meshrow","metadata","mpath","path","pattern","polygon","polyline","radialGradient","rect","set","solidcolor","stop","svg","switch","symbol","text","textPath","tspan","use","view"],t.pageBoxDirectives=["@bottom-center","@bottom-left","@bottom-left-corner","@bottom-right","@bottom-right-corner","@left-bottom","@left-middle","@left-top","@right-bottom","@right-middle","@right-top","@top-center","@top-left","@top-left-corner","@top-right","@top-right-corner"]}));var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),__exportStar=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||__createBinding(t,e,n)};!function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/languageFacts/facts",["require","exports","./entry","./colors","./builtinData"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),__exportStar(e("./entry"),t),__exportStar(e("./colors"),t),__exportStar(e("./builtinData"),t)})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/utils/objects",["require","exports"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isDefined=t.values=void 0,t.values=function(e){return Object.keys(e).map((function(t){return e[t]}))},t.isDefined=function(e){return void 0!==e}})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/parser/cssParser",["require","exports","./cssScanner","./cssNodes","./cssErrors","../languageFacts/facts","../utils/objects"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Parser=void 0;var n=e("./cssScanner"),r=e("./cssNodes"),i=e("./cssErrors"),o=e("../languageFacts/facts"),s=e("../utils/objects"),a=function(){function e(e){void 0===e&&(e=new n.Scanner),this.keyframeRegex=/^@(\-(webkit|ms|moz|o)\-)?keyframes$/i,this.scanner=e,this.token={type:n.TokenType.EOF,offset:-1,len:0,text:""},this.prevToken=void 0}return e.prototype.peekIdent=function(e){return n.TokenType.Ident===this.token.type&&e.length===this.token.text.length&&e===this.token.text.toLowerCase()},e.prototype.peekKeyword=function(e){return n.TokenType.AtKeyword===this.token.type&&e.length===this.token.text.length&&e===this.token.text.toLowerCase()},e.prototype.peekDelim=function(e){return n.TokenType.Delim===this.token.type&&e===this.token.text},e.prototype.peek=function(e){return e===this.token.type},e.prototype.peekOne=function(e){return-1!==e.indexOf(this.token.type)},e.prototype.peekRegExp=function(e,t){return e===this.token.type&&t.test(this.token.text)},e.prototype.hasWhitespace=function(){return!!this.prevToken&&this.prevToken.offset+this.prevToken.len!==this.token.offset},e.prototype.consumeToken=function(){this.prevToken=this.token,this.token=this.scanner.scan()},e.prototype.mark=function(){return{prev:this.prevToken,curr:this.token,pos:this.scanner.pos()}},e.prototype.restoreAtMark=function(e){this.prevToken=e.prev,this.token=e.curr,this.scanner.goBackTo(e.pos)},e.prototype.try=function(e){var t=this.mark(),n=e();return n||(this.restoreAtMark(t),null)},e.prototype.acceptOneKeyword=function(e){if(n.TokenType.AtKeyword===this.token.type)for(var t=0,r=e;te.offset?o-e.offset:0}return e},e.prototype.markError=function(e,t,n,i){this.token!==this.lastErrorToken&&(e.addIssue(new r.Marker(e,t,r.Level.Error,void 0,this.token.offset,this.token.len)),this.lastErrorToken=this.token),(n||i)&&this.resync(n,i)},e.prototype.parseStylesheet=function(e){var t=e.version,n=e.getText();return this.internalParse(n,this._parseStylesheet,(function(r,i){if(e.version!==t)throw new Error("Underlying model has changed, AST is no longer valid");return n.substr(r,i)}))},e.prototype.internalParse=function(e,t,n){this.scanner.setSource(e),this.token=this.scanner.scan();var r=t.bind(this)();return r&&(r.textProvider=n||function(t,n){return e.substr(t,n)}),r},e.prototype._parseStylesheet=function(){for(var e=this.create(r.Stylesheet);e.addChild(this._parseStylesheetStart()););var t=!1;do{var o=!1;do{o=!1;var s=this._parseStylesheetStatement();for(s&&(e.addChild(s),o=!0,t=!1,this.peek(n.TokenType.EOF)||!this._needsSemicolonAfter(s)||this.accept(n.TokenType.SemiColon)||this.markError(e,i.ParseError.SemiColonExpected));this.accept(n.TokenType.SemiColon)||this.accept(n.TokenType.CDO)||this.accept(n.TokenType.CDC);)o=!0,t=!1}while(o);if(this.peek(n.TokenType.EOF))break;t||(this.peek(n.TokenType.AtKeyword)?this.markError(e,i.ParseError.UnknownAtRule):this.markError(e,i.ParseError.RuleOrSelectorExpected),t=!0),this.consumeToken()}while(!this.peek(n.TokenType.EOF));return this.finish(e)},e.prototype._parseStylesheetStart=function(){return this._parseCharset()},e.prototype._parseStylesheetStatement=function(e){return void 0===e&&(e=!1),this.peek(n.TokenType.AtKeyword)?this._parseStylesheetAtStatement(e):this._parseRuleset(e)},e.prototype._parseStylesheetAtStatement=function(e){return void 0===e&&(e=!1),this._parseImport()||this._parseMedia(e)||this._parsePage()||this._parseFontFace()||this._parseKeyframe()||this._parseSupports(e)||this._parseViewPort()||this._parseNamespace()||this._parseDocument()||this._parseUnknownAtRule()},e.prototype._tryParseRuleset=function(e){var t=this.mark();if(this._parseSelector(e)){for(;this.accept(n.TokenType.Comma)&&this._parseSelector(e););if(this.accept(n.TokenType.CurlyL))return this.restoreAtMark(t),this._parseRuleset(e)}return this.restoreAtMark(t),null},e.prototype._parseRuleset=function(e){void 0===e&&(e=!1);var t=this.create(r.RuleSet),o=t.getSelectors();if(!o.addChild(this._parseSelector(e)))return null;for(;this.accept(n.TokenType.Comma);)if(!o.addChild(this._parseSelector(e)))return this.finish(t,i.ParseError.SelectorExpected);return this._parseBody(t,this._parseRuleSetDeclaration.bind(this))},e.prototype._parseRuleSetDeclarationAtStatement=function(){return this._parseAtApply()||this._parseUnknownAtRule()},e.prototype._parseRuleSetDeclaration=function(){return this.peek(n.TokenType.AtKeyword)?this._parseRuleSetDeclarationAtStatement():this._parseDeclaration()},e.prototype._parseAtApply=function(){if(!this.peekKeyword("@apply"))return null;var e=this.create(r.AtApplyRule);return this.consumeToken(),e.setIdentifier(this._parseIdent([r.ReferenceType.Variable]))?this.finish(e):this.finish(e,i.ParseError.IdentifierExpected)},e.prototype._needsSemicolonAfter=function(e){switch(e.type){case r.NodeType.Keyframe:case r.NodeType.ViewPort:case r.NodeType.Media:case r.NodeType.Ruleset:case r.NodeType.Namespace:case r.NodeType.If:case r.NodeType.For:case r.NodeType.Each:case r.NodeType.While:case r.NodeType.MixinDeclaration:case r.NodeType.FunctionDeclaration:case r.NodeType.MixinContentDeclaration:return!1;case r.NodeType.ExtendsReference:case r.NodeType.MixinContentReference:case r.NodeType.ReturnStatement:case r.NodeType.MediaQuery:case r.NodeType.Debug:case r.NodeType.Import:case r.NodeType.AtApplyRule:case r.NodeType.CustomPropertyDeclaration:return!0;case r.NodeType.VariableDeclaration:return e.needsSemicolon;case r.NodeType.MixinReference:return!e.getContent();case r.NodeType.Declaration:return!e.getNestedProperties()}return!1},e.prototype._parseDeclarations=function(e){var t=this.create(r.Declarations);if(!this.accept(n.TokenType.CurlyL))return null;for(var o=e();t.addChild(o)&&!this.peek(n.TokenType.CurlyR);){if(this._needsSemicolonAfter(o)&&!this.accept(n.TokenType.SemiColon))return this.finish(t,i.ParseError.SemiColonExpected,[n.TokenType.SemiColon,n.TokenType.CurlyR]);for(o&&this.prevToken&&this.prevToken.type===n.TokenType.SemiColon&&(o.semicolonPosition=this.prevToken.offset);this.accept(n.TokenType.SemiColon););o=e()}return this.accept(n.TokenType.CurlyR)?this.finish(t):this.finish(t,i.ParseError.RightCurlyExpected,[n.TokenType.CurlyR,n.TokenType.SemiColon])},e.prototype._parseBody=function(e,t){return e.setDeclarations(this._parseDeclarations(t))?this.finish(e):this.finish(e,i.ParseError.LeftCurlyExpected,[n.TokenType.CurlyR,n.TokenType.SemiColon])},e.prototype._parseSelector=function(e){var t=this.create(r.Selector),n=!1;for(e&&(n=t.addChild(this._parseCombinator()));t.addChild(this._parseSimpleSelector());)n=!0,t.addChild(this._parseCombinator());return n?this.finish(t):null},e.prototype._parseDeclaration=function(e){var t=this._tryParseCustomPropertyDeclaration(e);if(t)return t;var o=this.create(r.Declaration);return o.setProperty(this._parseProperty())?this.accept(n.TokenType.Colon)?(this.prevToken&&(o.colonPosition=this.prevToken.offset),o.setValue(this._parseExpr())?(o.addChild(this._parsePrio()),this.peek(n.TokenType.SemiColon)&&(o.semicolonPosition=this.token.offset),this.finish(o)):this.finish(o,i.ParseError.PropertyValueExpected)):this.finish(o,i.ParseError.ColonExpected,[n.TokenType.Colon],e||[n.TokenType.SemiColon]):null},e.prototype._tryParseCustomPropertyDeclaration=function(e){if(!this.peekRegExp(n.TokenType.Ident,/^--/))return null;var t=this.create(r.CustomPropertyDeclaration);if(!t.setProperty(this._parseProperty()))return null;if(!this.accept(n.TokenType.Colon))return this.finish(t,i.ParseError.ColonExpected,[n.TokenType.Colon]);this.prevToken&&(t.colonPosition=this.prevToken.offset);var o=this.mark();if(this.peek(n.TokenType.CurlyL)){var a=this.create(r.CustomPropertySet),l=this._parseDeclarations(this._parseRuleSetDeclaration.bind(this));if(a.setDeclarations(l)&&!l.isErroneous(!0)&&(a.addChild(this._parsePrio()),this.peek(n.TokenType.SemiColon)))return this.finish(a),t.setPropertySet(a),t.semicolonPosition=this.token.offset,this.finish(t);this.restoreAtMark(o)}var c=this._parseExpr();return c&&!c.isErroneous(!0)&&(this._parsePrio(),this.peekOne(e||[n.TokenType.SemiColon]))?(t.setValue(c),t.semicolonPosition=this.token.offset,this.finish(t)):(this.restoreAtMark(o),t.addChild(this._parseCustomPropertyValue(e)),t.addChild(this._parsePrio()),s.isDefined(t.colonPosition)&&this.token.offset===t.colonPosition+1?this.finish(t,i.ParseError.PropertyValueExpected):this.finish(t))},e.prototype._parseCustomPropertyValue=function(e){var t=this;void 0===e&&(e=[n.TokenType.CurlyR]);var o=this.create(r.Node),s=function(){return 0===l&&0===c&&0===d},a=function(){return-1!==e.indexOf(t.token.type)},l=0,c=0,d=0;e:for(;;){switch(this.token.type){case n.TokenType.SemiColon:case n.TokenType.Exclamation:if(s())break e;break;case n.TokenType.CurlyL:l++;break;case n.TokenType.CurlyR:if(--l<0){if(a()&&0===c&&0===d)break e;return this.finish(o,i.ParseError.LeftCurlyExpected)}break;case n.TokenType.ParenthesisL:c++;break;case n.TokenType.ParenthesisR:if(--c<0){if(a()&&0===d&&0===l)break e;return this.finish(o,i.ParseError.LeftParenthesisExpected)}break;case n.TokenType.BracketL:d++;break;case n.TokenType.BracketR:if(--d<0)return this.finish(o,i.ParseError.LeftSquareBracketExpected);break;case n.TokenType.BadString:break e;case n.TokenType.EOF:var p=i.ParseError.RightCurlyExpected;return d>0?p=i.ParseError.RightSquareBracketExpected:c>0&&(p=i.ParseError.RightParenthesisExpected),this.finish(o,p)}this.consumeToken()}return this.finish(o)},e.prototype._tryToParseDeclaration=function(e){var t=this.mark();return this._parseProperty()&&this.accept(n.TokenType.Colon)?(this.restoreAtMark(t),this._parseDeclaration(e)):(this.restoreAtMark(t),null)},e.prototype._parseProperty=function(){var e=this.create(r.Property),t=this.mark();return(this.acceptDelim("*")||this.acceptDelim("_"))&&this.hasWhitespace()?(this.restoreAtMark(t),null):e.setIdentifier(this._parsePropertyIdentifier())?this.finish(e):null},e.prototype._parsePropertyIdentifier=function(){return this._parseIdent()},e.prototype._parseCharset=function(){if(!this.peek(n.TokenType.Charset))return null;var e=this.create(r.Node);return this.consumeToken(),this.accept(n.TokenType.String)?this.accept(n.TokenType.SemiColon)?this.finish(e):this.finish(e,i.ParseError.SemiColonExpected):this.finish(e,i.ParseError.IdentifierExpected)},e.prototype._parseImport=function(){if(!this.peekKeyword("@import"))return null;var e=this.create(r.Import);return this.consumeToken(),e.addChild(this._parseURILiteral())||e.addChild(this._parseStringLiteral())?(this.peek(n.TokenType.SemiColon)||this.peek(n.TokenType.EOF)||e.setMedialist(this._parseMediaQueryList()),this.finish(e)):this.finish(e,i.ParseError.URIOrStringExpected)},e.prototype._parseNamespace=function(){if(!this.peekKeyword("@namespace"))return null;var e=this.create(r.Namespace);return this.consumeToken(),e.addChild(this._parseURILiteral())||(e.addChild(this._parseIdent()),e.addChild(this._parseURILiteral())||e.addChild(this._parseStringLiteral()))?this.accept(n.TokenType.SemiColon)?this.finish(e):this.finish(e,i.ParseError.SemiColonExpected):this.finish(e,i.ParseError.URIExpected,[n.TokenType.SemiColon])},e.prototype._parseFontFace=function(){if(!this.peekKeyword("@font-face"))return null;var e=this.create(r.FontFace);return this.consumeToken(),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},e.prototype._parseViewPort=function(){if(!this.peekKeyword("@-ms-viewport")&&!this.peekKeyword("@-o-viewport")&&!this.peekKeyword("@viewport"))return null;var e=this.create(r.ViewPort);return this.consumeToken(),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},e.prototype._parseKeyframe=function(){if(!this.peekRegExp(n.TokenType.AtKeyword,this.keyframeRegex))return null;var e=this.create(r.Keyframe),t=this.create(r.Node);return this.consumeToken(),e.setKeyword(this.finish(t)),t.matches("@-ms-keyframes")&&this.markError(t,i.ParseError.UnknownKeyword),e.setIdentifier(this._parseKeyframeIdent())?this._parseBody(e,this._parseKeyframeSelector.bind(this)):this.finish(e,i.ParseError.IdentifierExpected,[n.TokenType.CurlyR])},e.prototype._parseKeyframeIdent=function(){return this._parseIdent([r.ReferenceType.Keyframe])},e.prototype._parseKeyframeSelector=function(){var e=this.create(r.KeyframeSelector);if(!e.addChild(this._parseIdent())&&!this.accept(n.TokenType.Percentage))return null;for(;this.accept(n.TokenType.Comma);)if(!e.addChild(this._parseIdent())&&!this.accept(n.TokenType.Percentage))return this.finish(e,i.ParseError.PercentageExpected);return this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},e.prototype._tryParseKeyframeSelector=function(){var e=this.create(r.KeyframeSelector),t=this.mark();if(!e.addChild(this._parseIdent())&&!this.accept(n.TokenType.Percentage))return null;for(;this.accept(n.TokenType.Comma);)if(!e.addChild(this._parseIdent())&&!this.accept(n.TokenType.Percentage))return this.restoreAtMark(t),null;return this.peek(n.TokenType.CurlyL)?this._parseBody(e,this._parseRuleSetDeclaration.bind(this)):(this.restoreAtMark(t),null)},e.prototype._parseSupports=function(e){if(void 0===e&&(e=!1),!this.peekKeyword("@supports"))return null;var t=this.create(r.Supports);return this.consumeToken(),t.addChild(this._parseSupportsCondition()),this._parseBody(t,this._parseSupportsDeclaration.bind(this,e))},e.prototype._parseSupportsDeclaration=function(e){return void 0===e&&(e=!1),e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)},e.prototype._parseSupportsCondition=function(){var e=this.create(r.SupportsCondition);if(this.acceptIdent("not"))e.addChild(this._parseSupportsConditionInParens());else if(e.addChild(this._parseSupportsConditionInParens()),this.peekRegExp(n.TokenType.Ident,/^(and|or)$/i))for(var t=this.token.text.toLowerCase();this.acceptIdent(t);)e.addChild(this._parseSupportsConditionInParens());return this.finish(e)},e.prototype._parseSupportsConditionInParens=function(){var e=this.create(r.SupportsCondition);if(this.accept(n.TokenType.ParenthesisL))return this.prevToken&&(e.lParent=this.prevToken.offset),e.addChild(this._tryToParseDeclaration([n.TokenType.ParenthesisR]))||this._parseSupportsCondition()?this.accept(n.TokenType.ParenthesisR)?(this.prevToken&&(e.rParent=this.prevToken.offset),this.finish(e)):this.finish(e,i.ParseError.RightParenthesisExpected,[n.TokenType.ParenthesisR],[]):this.finish(e,i.ParseError.ConditionExpected);if(this.peek(n.TokenType.Ident)){var t=this.mark();if(this.consumeToken(),!this.hasWhitespace()&&this.accept(n.TokenType.ParenthesisL)){for(var o=1;this.token.type!==n.TokenType.EOF&&0!==o;)this.token.type===n.TokenType.ParenthesisL?o++:this.token.type===n.TokenType.ParenthesisR&&o--,this.consumeToken();return this.finish(e)}this.restoreAtMark(t)}return this.finish(e,i.ParseError.LeftParenthesisExpected,[],[n.TokenType.ParenthesisL])},e.prototype._parseMediaDeclaration=function(e){return void 0===e&&(e=!1),e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)},e.prototype._parseMedia=function(e){if(void 0===e&&(e=!1),!this.peekKeyword("@media"))return null;var t=this.create(r.Media);return this.consumeToken(),t.addChild(this._parseMediaQueryList())?this._parseBody(t,this._parseMediaDeclaration.bind(this,e)):this.finish(t,i.ParseError.MediaQueryExpected)},e.prototype._parseMediaQueryList=function(){var e=this.create(r.Medialist);if(!e.addChild(this._parseMediaQuery([n.TokenType.CurlyL])))return this.finish(e,i.ParseError.MediaQueryExpected);for(;this.accept(n.TokenType.Comma);)if(!e.addChild(this._parseMediaQuery([n.TokenType.CurlyL])))return this.finish(e,i.ParseError.MediaQueryExpected);return this.finish(e)},e.prototype._parseMediaQuery=function(e){var t=this.create(r.MediaQuery),o=!0,s=!1;if(!this.peek(n.TokenType.ParenthesisL)){if(this.acceptIdent("only")||this.acceptIdent("not"),!t.addChild(this._parseIdent()))return null;s=!0,o=this.acceptIdent("and")}for(;o;)if(t.addChild(this._parseMediaContentStart()))o=this.acceptIdent("and");else{if(!this.accept(n.TokenType.ParenthesisL))return s?this.finish(t,i.ParseError.LeftParenthesisExpected,[],e):null;if(!t.addChild(this._parseMediaFeatureName()))return this.finish(t,i.ParseError.IdentifierExpected,[],e);if(this.accept(n.TokenType.Colon)&&!t.addChild(this._parseExpr()))return this.finish(t,i.ParseError.TermExpected,[],e);if(!this.accept(n.TokenType.ParenthesisR))return this.finish(t,i.ParseError.RightParenthesisExpected,[],e);o=this.acceptIdent("and")}return this.finish(t)},e.prototype._parseMediaContentStart=function(){return null},e.prototype._parseMediaFeatureName=function(){return this._parseIdent()},e.prototype._parseMedium=function(){var e=this.create(r.Node);return e.addChild(this._parseIdent())?this.finish(e):null},e.prototype._parsePageDeclaration=function(){return this._parsePageMarginBox()||this._parseRuleSetDeclaration()},e.prototype._parsePage=function(){if(!this.peekKeyword("@page"))return null;var e=this.create(r.Page);if(this.consumeToken(),e.addChild(this._parsePageSelector()))for(;this.accept(n.TokenType.Comma);)if(!e.addChild(this._parsePageSelector()))return this.finish(e,i.ParseError.IdentifierExpected);return this._parseBody(e,this._parsePageDeclaration.bind(this))},e.prototype._parsePageMarginBox=function(){if(!this.peek(n.TokenType.AtKeyword))return null;var e=this.create(r.PageBoxMarginBox);return this.acceptOneKeyword(o.pageBoxDirectives)||this.markError(e,i.ParseError.UnknownAtRule,[],[n.TokenType.CurlyL]),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},e.prototype._parsePageSelector=function(){if(!this.peek(n.TokenType.Ident)&&!this.peek(n.TokenType.Colon))return null;var e=this.create(r.Node);return e.addChild(this._parseIdent()),this.accept(n.TokenType.Colon)&&!e.addChild(this._parseIdent())?this.finish(e,i.ParseError.IdentifierExpected):this.finish(e)},e.prototype._parseDocument=function(){if(!this.peekKeyword("@-moz-document"))return null;var e=this.create(r.Document);return this.consumeToken(),this.resync([],[n.TokenType.CurlyL]),this._parseBody(e,this._parseStylesheetStatement.bind(this))},e.prototype._parseUnknownAtRule=function(){if(!this.peek(n.TokenType.AtKeyword))return null;var e=this.create(r.UnknownAtRule);e.addChild(this._parseUnknownAtRuleName());var t=0,o=0,s=0,a=0;e:for(;;){switch(this.token.type){case n.TokenType.SemiColon:if(0===o&&0===s&&0===a)break e;break;case n.TokenType.EOF:return o>0?this.finish(e,i.ParseError.RightCurlyExpected):a>0?this.finish(e,i.ParseError.RightSquareBracketExpected):s>0?this.finish(e,i.ParseError.RightParenthesisExpected):this.finish(e);case n.TokenType.CurlyL:t++,o++;break;case n.TokenType.CurlyR:if(o--,t>0&&0===o){if(this.consumeToken(),a>0)return this.finish(e,i.ParseError.RightSquareBracketExpected);if(s>0)return this.finish(e,i.ParseError.RightParenthesisExpected);break e}if(o<0){if(0===s&&0===a)break e;return this.finish(e,i.ParseError.LeftCurlyExpected)}break;case n.TokenType.ParenthesisL:s++;break;case n.TokenType.ParenthesisR:if(--s<0)return this.finish(e,i.ParseError.LeftParenthesisExpected);break;case n.TokenType.BracketL:a++;break;case n.TokenType.BracketR:if(--a<0)return this.finish(e,i.ParseError.LeftSquareBracketExpected)}this.consumeToken()}return e},e.prototype._parseUnknownAtRuleName=function(){var e=this.create(r.Node);return this.accept(n.TokenType.AtKeyword)?this.finish(e):e},e.prototype._parseOperator=function(){if(this.peekDelim("/")||this.peekDelim("*")||this.peekDelim("+")||this.peekDelim("-")||this.peek(n.TokenType.Dashmatch)||this.peek(n.TokenType.Includes)||this.peek(n.TokenType.SubstringOperator)||this.peek(n.TokenType.PrefixOperator)||this.peek(n.TokenType.SuffixOperator)||this.peekDelim("=")){var e=this.createNode(r.NodeType.Operator);return this.consumeToken(),this.finish(e)}return null},e.prototype._parseUnaryOperator=function(){if(!this.peekDelim("+")&&!this.peekDelim("-"))return null;var e=this.create(r.Node);return this.consumeToken(),this.finish(e)},e.prototype._parseCombinator=function(){if(this.peekDelim(">")){var e=this.create(r.Node);this.consumeToken();var t=this.mark();if(!this.hasWhitespace()&&this.acceptDelim(">")){if(!this.hasWhitespace()&&this.acceptDelim(">"))return e.type=r.NodeType.SelectorCombinatorShadowPiercingDescendant,this.finish(e);this.restoreAtMark(t)}return e.type=r.NodeType.SelectorCombinatorParent,this.finish(e)}if(this.peekDelim("+")){e=this.create(r.Node);return this.consumeToken(),e.type=r.NodeType.SelectorCombinatorSibling,this.finish(e)}if(this.peekDelim("~")){e=this.create(r.Node);return this.consumeToken(),e.type=r.NodeType.SelectorCombinatorAllSiblings,this.finish(e)}if(this.peekDelim("/")){e=this.create(r.Node);this.consumeToken();t=this.mark();if(!this.hasWhitespace()&&this.acceptIdent("deep")&&!this.hasWhitespace()&&this.acceptDelim("/"))return e.type=r.NodeType.SelectorCombinatorShadowPiercingDescendant,this.finish(e);this.restoreAtMark(t)}return null},e.prototype._parseSimpleSelector=function(){var e=this.create(r.SimpleSelector),t=0;for(e.addChild(this._parseElementName())&&t++;(0===t||!this.hasWhitespace())&&e.addChild(this._parseSimpleSelectorBody());)t++;return t>0?this.finish(e):null},e.prototype._parseSimpleSelectorBody=function(){return this._parsePseudo()||this._parseHash()||this._parseClass()||this._parseAttrib()},e.prototype._parseSelectorIdent=function(){return this._parseIdent()},e.prototype._parseHash=function(){if(!this.peek(n.TokenType.Hash)&&!this.peekDelim("#"))return null;var e=this.createNode(r.NodeType.IdentifierSelector);if(this.acceptDelim("#")){if(this.hasWhitespace()||!e.addChild(this._parseSelectorIdent()))return this.finish(e,i.ParseError.IdentifierExpected)}else this.consumeToken();return this.finish(e)},e.prototype._parseClass=function(){if(!this.peekDelim("."))return null;var e=this.createNode(r.NodeType.ClassSelector);return this.consumeToken(),this.hasWhitespace()||!e.addChild(this._parseSelectorIdent())?this.finish(e,i.ParseError.IdentifierExpected):this.finish(e)},e.prototype._parseElementName=function(){var e=this.mark(),t=this.createNode(r.NodeType.ElementNameSelector);return t.addChild(this._parseNamespacePrefix()),t.addChild(this._parseSelectorIdent())||this.acceptDelim("*")?this.finish(t):(this.restoreAtMark(e),null)},e.prototype._parseNamespacePrefix=function(){var e=this.mark(),t=this.createNode(r.NodeType.NamespacePrefix);return!t.addChild(this._parseIdent())&&this.acceptDelim("*"),this.acceptDelim("|")?this.finish(t):(this.restoreAtMark(e),null)},e.prototype._parseAttrib=function(){if(!this.peek(n.TokenType.BracketL))return null;var e=this.create(r.AttributeSelector);return this.consumeToken(),e.setNamespacePrefix(this._parseNamespacePrefix()),e.setIdentifier(this._parseIdent())?(e.setOperator(this._parseOperator())&&(e.setValue(this._parseBinaryExpr()),this.acceptIdent("i")),this.accept(n.TokenType.BracketR)?this.finish(e):this.finish(e,i.ParseError.RightSquareBracketExpected)):this.finish(e,i.ParseError.IdentifierExpected)},e.prototype._parsePseudo=function(){var e=this,t=this._tryParsePseudoIdentifier();if(t){if(!this.hasWhitespace()&&this.accept(n.TokenType.ParenthesisL)){if(t.addChild(this.try((function(){var t=e.create(r.Node);if(!t.addChild(e._parseSelector(!1)))return null;for(;e.accept(n.TokenType.Comma)&&t.addChild(e._parseSelector(!1)););return e.peek(n.TokenType.ParenthesisR)?e.finish(t):null}))||this._parseBinaryExpr()),!this.accept(n.TokenType.ParenthesisR))return this.finish(t,i.ParseError.RightParenthesisExpected)}return this.finish(t)}return null},e.prototype._tryParsePseudoIdentifier=function(){if(!this.peek(n.TokenType.Colon))return null;var e=this.mark(),t=this.createNode(r.NodeType.PseudoSelector);return this.consumeToken(),this.hasWhitespace()?(this.restoreAtMark(e),null):(this.accept(n.TokenType.Colon),this.hasWhitespace()||!t.addChild(this._parseIdent())?this.finish(t,i.ParseError.IdentifierExpected):this.finish(t))},e.prototype._tryParsePrio=function(){var e=this.mark(),t=this._parsePrio();return t||(this.restoreAtMark(e),null)},e.prototype._parsePrio=function(){if(!this.peek(n.TokenType.Exclamation))return null;var e=this.createNode(r.NodeType.Prio);return this.accept(n.TokenType.Exclamation)&&this.acceptIdent("important")?this.finish(e):null},e.prototype._parseExpr=function(e){void 0===e&&(e=!1);var t=this.create(r.Expression);if(!t.addChild(this._parseBinaryExpr()))return null;for(;;){if(this.peek(n.TokenType.Comma)){if(e)return this.finish(t);this.consumeToken()}if(!t.addChild(this._parseBinaryExpr()))break}return this.finish(t)},e.prototype._parseNamedLine=function(){if(!this.peek(n.TokenType.BracketL))return null;var e=this.createNode(r.NodeType.GridLine);for(this.consumeToken();e.addChild(this._parseIdent()););return this.accept(n.TokenType.BracketR)?this.finish(e):this.finish(e,i.ParseError.RightSquareBracketExpected)},e.prototype._parseBinaryExpr=function(e,t){var n=this.create(r.BinaryExpression);if(!n.setLeft(e||this._parseTerm()))return null;if(!n.setOperator(t||this._parseOperator()))return this.finish(n);if(!n.setRight(this._parseTerm()))return this.finish(n,i.ParseError.TermExpected);n=this.finish(n);var o=this._parseOperator();return o&&(n=this._parseBinaryExpr(n,o)),this.finish(n)},e.prototype._parseTerm=function(){var e=this.create(r.Term);return e.setOperator(this._parseUnaryOperator()),e.setExpression(this._parseTermExpression())?this.finish(e):null},e.prototype._parseTermExpression=function(){return this._parseURILiteral()||this._parseFunction()||this._parseIdent()||this._parseStringLiteral()||this._parseNumeric()||this._parseHexColor()||this._parseOperation()||this._parseNamedLine()},e.prototype._parseOperation=function(){if(!this.peek(n.TokenType.ParenthesisL))return null;var e=this.create(r.Node);return this.consumeToken(),e.addChild(this._parseExpr()),this.accept(n.TokenType.ParenthesisR)?this.finish(e):this.finish(e,i.ParseError.RightParenthesisExpected)},e.prototype._parseNumeric=function(){if(this.peek(n.TokenType.Num)||this.peek(n.TokenType.Percentage)||this.peek(n.TokenType.Resolution)||this.peek(n.TokenType.Length)||this.peek(n.TokenType.EMS)||this.peek(n.TokenType.EXS)||this.peek(n.TokenType.Angle)||this.peek(n.TokenType.Time)||this.peek(n.TokenType.Dimension)||this.peek(n.TokenType.Freq)){var e=this.create(r.NumericValue);return this.consumeToken(),this.finish(e)}return null},e.prototype._parseStringLiteral=function(){if(!this.peek(n.TokenType.String)&&!this.peek(n.TokenType.BadString))return null;var e=this.createNode(r.NodeType.StringLiteral);return this.consumeToken(),this.finish(e)},e.prototype._parseURILiteral=function(){if(!this.peekRegExp(n.TokenType.Ident,/^url(-prefix)?$/i))return null;var e=this.mark(),t=this.createNode(r.NodeType.URILiteral);return this.accept(n.TokenType.Ident),this.hasWhitespace()||!this.peek(n.TokenType.ParenthesisL)?(this.restoreAtMark(e),null):(this.scanner.inURL=!0,this.consumeToken(),t.addChild(this._parseURLArgument()),this.scanner.inURL=!1,this.accept(n.TokenType.ParenthesisR)?this.finish(t):this.finish(t,i.ParseError.RightParenthesisExpected))},e.prototype._parseURLArgument=function(){var e=this.create(r.Node);return this.accept(n.TokenType.String)||this.accept(n.TokenType.BadString)||this.acceptUnquotedString()?this.finish(e):null},e.prototype._parseIdent=function(e){if(!this.peek(n.TokenType.Ident))return null;var t=this.create(r.Identifier);return e&&(t.referenceTypes=e),t.isCustomProperty=this.peekRegExp(n.TokenType.Ident,/^--/),this.consumeToken(),this.finish(t)},e.prototype._parseFunction=function(){var e=this.mark(),t=this.create(r.Function);if(!t.setIdentifier(this._parseFunctionIdentifier()))return null;if(this.hasWhitespace()||!this.accept(n.TokenType.ParenthesisL))return this.restoreAtMark(e),null;if(t.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(n.TokenType.Comma)&&!this.peek(n.TokenType.ParenthesisR);)t.getArguments().addChild(this._parseFunctionArgument())||this.markError(t,i.ParseError.ExpressionExpected);return this.accept(n.TokenType.ParenthesisR)?this.finish(t):this.finish(t,i.ParseError.RightParenthesisExpected)},e.prototype._parseFunctionIdentifier=function(){if(!this.peek(n.TokenType.Ident))return null;var e=this.create(r.Identifier);if(e.referenceTypes=[r.ReferenceType.Function],this.acceptIdent("progid")){if(this.accept(n.TokenType.Colon))for(;this.accept(n.TokenType.Ident)&&this.acceptDelim("."););return this.finish(e)}return this.consumeToken(),this.finish(e)},e.prototype._parseFunctionArgument=function(){var e=this.create(r.FunctionArgument);return e.setValue(this._parseExpr(!0))?this.finish(e):null},e.prototype._parseHexColor=function(){if(this.peekRegExp(n.TokenType.Hash,/^#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/g)){var e=this.create(r.HexColorValue);return this.consumeToken(),this.finish(e)}return null},e}();t.Parser=a})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/utils/arrays",["require","exports"],e)}((function(e,t){"use strict";function n(e,t){return-1!==e.indexOf(t)}Object.defineProperty(t,"__esModule",{value:!0}),t.union=t.includes=t.findFirst=void 0,t.findFirst=function(e,t){var n=0,r=e.length;if(0===r)return 0;for(;ne+t||this.offset===e&&this.length===t?this.findInScope(e,t):null},e.prototype.findInScope=function(e,t){void 0===t&&(t=0);var n=e+t,i=r.findFirst(this.children,(function(e){return e.offset>n}));if(0===i)return this;var o=this.children[i-1];return o.offset<=e&&o.offset+o.length>=e+t?o.findInScope(e,t):this},e.prototype.addSymbol=function(e){this.symbols.push(e)},e.prototype.getSymbol=function(e,t){for(var n=0;n0&&(i.arguments=n),i},e.is=function(e){var t=e;return E.defined(t)&&E.string(t.title)&&E.string(t.command)}}(c=t.Command||(t.Command={})),function(e){e.replace=function(e,t){return{range:e,newText:t}},e.insert=function(e,t){return{range:{start:e,end:e},newText:t}},e.del=function(e){return{range:e,newText:""}},e.is=function(e){var t=e;return E.objectLiteral(t)&&E.string(t.newText)&&i.is(t.range)}}(d=t.TextEdit||(t.TextEdit={})),function(e){e.create=function(e,t,n){var r={label:e};return void 0!==t&&(r.needsConfirmation=t),void 0!==n&&(r.description=n),r},e.is=function(e){var t=e;return void 0!==t&&E.objectLiteral(t)&&E.string(t.label)&&(E.boolean(t.needsConfirmation)||void 0===t.needsConfirmation)&&(E.string(t.description)||void 0===t.description)}}(p=t.ChangeAnnotation||(t.ChangeAnnotation={})),function(e){e.is=function(e){return"string"==typeof e}}(h=t.ChangeAnnotationIdentifier||(t.ChangeAnnotationIdentifier={})),function(e){e.replace=function(e,t,n){return{range:e,newText:t,annotationId:n}},e.insert=function(e,t,n){return{range:{start:e,end:e},newText:t,annotationId:n}},e.del=function(e,t){return{range:e,newText:"",annotationId:t}},e.is=function(e){var t=e;return d.is(t)&&(p.is(t.annotationId)||h.is(t.annotationId))}}(u=t.AnnotatedTextEdit||(t.AnnotatedTextEdit={})),function(e){e.create=function(e,t){return{textDocument:e,edits:t}},e.is=function(e){var t=e;return E.defined(t)&&v.is(t.textDocument)&&Array.isArray(t.edits)}}(m=t.TextDocumentEdit||(t.TextDocumentEdit={})),function(e){e.create=function(e,t,n){var r={kind:"create",uri:e};return void 0===t||void 0===t.overwrite&&void 0===t.ignoreIfExists||(r.options=t),void 0!==n&&(r.annotationId=n),r},e.is=function(e){var t=e;return t&&"create"===t.kind&&E.string(t.uri)&&(void 0===t.options||(void 0===t.options.overwrite||E.boolean(t.options.overwrite))&&(void 0===t.options.ignoreIfExists||E.boolean(t.options.ignoreIfExists)))&&(void 0===t.annotationId||h.is(t.annotationId))}}(f=t.CreateFile||(t.CreateFile={})),function(e){e.create=function(e,t,n,r){var i={kind:"rename",oldUri:e,newUri:t};return void 0===n||void 0===n.overwrite&&void 0===n.ignoreIfExists||(i.options=n),void 0!==r&&(i.annotationId=r),i},e.is=function(e){var t=e;return t&&"rename"===t.kind&&E.string(t.oldUri)&&E.string(t.newUri)&&(void 0===t.options||(void 0===t.options.overwrite||E.boolean(t.options.overwrite))&&(void 0===t.options.ignoreIfExists||E.boolean(t.options.ignoreIfExists)))&&(void 0===t.annotationId||h.is(t.annotationId))}}(g=t.RenameFile||(t.RenameFile={})),function(e){e.create=function(e,t,n){var r={kind:"delete",uri:e};return void 0===t||void 0===t.recursive&&void 0===t.ignoreIfNotExists||(r.options=t),void 0!==n&&(r.annotationId=n),r},e.is=function(e){var t=e;return t&&"delete"===t.kind&&E.string(t.uri)&&(void 0===t.options||(void 0===t.options.recursive||E.boolean(t.options.recursive))&&(void 0===t.options.ignoreIfNotExists||E.boolean(t.options.ignoreIfNotExists)))&&(void 0===t.annotationId||h.is(t.annotationId))}}(b=t.DeleteFile||(t.DeleteFile={})),function(e){e.is=function(e){var t=e;return t&&(void 0!==t.changes||void 0!==t.documentChanges)&&(void 0===t.documentChanges||t.documentChanges.every((function(e){return E.string(e.kind)?f.is(e)||g.is(e)||b.is(e):m.is(e)})))}}(y=t.WorkspaceEdit||(t.WorkspaceEdit={}));var v,w,x,S,k=function(){function e(e,t){this.edits=e,this.changeAnnotations=t}return e.prototype.insert=function(e,t,n){var r,i;if(void 0===n?r=d.insert(e,t):h.is(n)?(i=n,r=u.insert(e,t,n)):(this.assertChangeAnnotations(this.changeAnnotations),i=this.changeAnnotations.manage(n),r=u.insert(e,t,i)),this.edits.push(r),void 0!==i)return i},e.prototype.replace=function(e,t,n){var r,i;if(void 0===n?r=d.replace(e,t):h.is(n)?(i=n,r=u.replace(e,t,n)):(this.assertChangeAnnotations(this.changeAnnotations),i=this.changeAnnotations.manage(n),r=u.replace(e,t,i)),this.edits.push(r),void 0!==i)return i},e.prototype.delete=function(e,t){var n,r;if(void 0===t?n=d.del(e):h.is(t)?(r=t,n=u.del(e,t)):(this.assertChangeAnnotations(this.changeAnnotations),r=this.changeAnnotations.manage(t),n=u.del(e,r)),this.edits.push(n),void 0!==r)return r},e.prototype.add=function(e){this.edits.push(e)},e.prototype.all=function(){return this.edits},e.prototype.clear=function(){this.edits.splice(0,this.edits.length)},e.prototype.assertChangeAnnotations=function(e){if(void 0===e)throw new Error("Text edit change is not configured to manage change annotations.")},e}(),C=function(){function e(e){this._annotations=void 0===e?Object.create(null):e,this._counter=0,this._size=0}return e.prototype.all=function(){return this._annotations},Object.defineProperty(e.prototype,"size",{get:function(){return this._size},enumerable:!1,configurable:!0}),e.prototype.manage=function(e,t){var n;if(h.is(e)?n=e:(n=this.nextId(),t=e),void 0!==this._annotations[n])throw new Error("Id "+n+" is already in use.");if(void 0===t)throw new Error("No annotation provided for id "+n);return this._annotations[n]=t,this._size++,n},e.prototype.nextId=function(){return this._counter++,this._counter.toString()},e}(),T=function(){function e(e){var t=this;this._textEditChanges=Object.create(null),void 0!==e?(this._workspaceEdit=e,e.documentChanges?(this._changeAnnotations=new C(e.changeAnnotations),e.changeAnnotations=this._changeAnnotations.all(),e.documentChanges.forEach((function(e){if(m.is(e)){var n=new k(e.edits,t._changeAnnotations);t._textEditChanges[e.textDocument.uri]=n}}))):e.changes&&Object.keys(e.changes).forEach((function(n){var r=new k(e.changes[n]);t._textEditChanges[n]=r}))):this._workspaceEdit={}}return Object.defineProperty(e.prototype,"edit",{get:function(){return this.initDocumentChanges(),void 0!==this._changeAnnotations&&(0===this._changeAnnotations.size?this._workspaceEdit.changeAnnotations=void 0:this._workspaceEdit.changeAnnotations=this._changeAnnotations.all()),this._workspaceEdit},enumerable:!1,configurable:!0}),e.prototype.getTextEditChange=function(e){if(v.is(e)){if(this.initDocumentChanges(),void 0===this._workspaceEdit.documentChanges)throw new Error("Workspace edit is not configured for document changes.");var t={uri:e.uri,version:e.version};if(!(r=this._textEditChanges[t.uri])){var n={textDocument:t,edits:i=[]};this._workspaceEdit.documentChanges.push(n),r=new k(i,this._changeAnnotations),this._textEditChanges[t.uri]=r}return r}if(this.initChanges(),void 0===this._workspaceEdit.changes)throw new Error("Workspace edit is not configured for normal text edit changes.");var r;if(!(r=this._textEditChanges[e])){var i=[];this._workspaceEdit.changes[e]=i,r=new k(i),this._textEditChanges[e]=r}return r},e.prototype.initDocumentChanges=function(){void 0===this._workspaceEdit.documentChanges&&void 0===this._workspaceEdit.changes&&(this._changeAnnotations=new C,this._workspaceEdit.documentChanges=[],this._workspaceEdit.changeAnnotations=this._changeAnnotations.all())},e.prototype.initChanges=function(){void 0===this._workspaceEdit.documentChanges&&void 0===this._workspaceEdit.changes&&(this._workspaceEdit.changes=Object.create(null))},e.prototype.createFile=function(e,t,n){if(this.initDocumentChanges(),void 0===this._workspaceEdit.documentChanges)throw new Error("Workspace edit is not configured for document changes.");var r,i,o;if(p.is(t)||h.is(t)?r=t:n=t,void 0===r?i=f.create(e,n):(o=h.is(r)?r:this._changeAnnotations.manage(r),i=f.create(e,n,o)),this._workspaceEdit.documentChanges.push(i),void 0!==o)return o},e.prototype.renameFile=function(e,t,n,r){if(this.initDocumentChanges(),void 0===this._workspaceEdit.documentChanges)throw new Error("Workspace edit is not configured for document changes.");var i,o,s;if(p.is(n)||h.is(n)?i=n:r=n,void 0===i?o=g.create(e,t,r):(s=h.is(i)?i:this._changeAnnotations.manage(i),o=g.create(e,t,r,s)),this._workspaceEdit.documentChanges.push(o),void 0!==s)return s},e.prototype.deleteFile=function(e,t,n){if(this.initDocumentChanges(),void 0===this._workspaceEdit.documentChanges)throw new Error("Workspace edit is not configured for document changes.");var r,i,o;if(p.is(t)||h.is(t)?r=t:n=t,void 0===r?i=b.create(e,n):(o=h.is(r)?r:this._changeAnnotations.manage(r),i=b.create(e,n,o)),this._workspaceEdit.documentChanges.push(i),void 0!==o)return o},e}();t.WorkspaceChange=T,function(e){e.create=function(e){return{uri:e}},e.is=function(e){var t=e;return E.defined(t)&&E.string(t.uri)}}(t.TextDocumentIdentifier||(t.TextDocumentIdentifier={})),function(e){e.create=function(e,t){return{uri:e,version:t}},e.is=function(e){var t=e;return E.defined(t)&&E.string(t.uri)&&E.integer(t.version)}}(t.VersionedTextDocumentIdentifier||(t.VersionedTextDocumentIdentifier={})),function(e){e.create=function(e,t){return{uri:e,version:t}},e.is=function(e){var t=e;return E.defined(t)&&E.string(t.uri)&&(null===t.version||E.integer(t.version))}}(v=t.OptionalVersionedTextDocumentIdentifier||(t.OptionalVersionedTextDocumentIdentifier={})),function(e){e.create=function(e,t,n,r){return{uri:e,languageId:t,version:n,text:r}},e.is=function(e){var t=e;return E.defined(t)&&E.string(t.uri)&&E.string(t.languageId)&&E.integer(t.version)&&E.string(t.text)}}(t.TextDocumentItem||(t.TextDocumentItem={})),function(e){e.PlainText="plaintext",e.Markdown="markdown"}(w=t.MarkupKind||(t.MarkupKind={})),function(e){e.is=function(t){var n=t;return n===e.PlainText||n===e.Markdown}}(w=t.MarkupKind||(t.MarkupKind={})),function(e){e.is=function(e){var t=e;return E.objectLiteral(e)&&w.is(t.kind)&&E.string(t.value)}}(x=t.MarkupContent||(t.MarkupContent={})),function(e){e.Text=1,e.Method=2,e.Function=3,e.Constructor=4,e.Field=5,e.Variable=6,e.Class=7,e.Interface=8,e.Module=9,e.Property=10,e.Unit=11,e.Value=12,e.Enum=13,e.Keyword=14,e.Snippet=15,e.Color=16,e.File=17,e.Reference=18,e.Folder=19,e.EnumMember=20,e.Constant=21,e.Struct=22,e.Event=23,e.Operator=24,e.TypeParameter=25}(t.CompletionItemKind||(t.CompletionItemKind={})),function(e){e.PlainText=1,e.Snippet=2}(t.InsertTextFormat||(t.InsertTextFormat={})),function(e){e.Deprecated=1}(t.CompletionItemTag||(t.CompletionItemTag={})),function(e){e.create=function(e,t,n){return{newText:e,insert:t,replace:n}},e.is=function(e){var t=e;return t&&E.string(t.newText)&&i.is(t.insert)&&i.is(t.replace)}}(t.InsertReplaceEdit||(t.InsertReplaceEdit={})),function(e){e.asIs=1,e.adjustIndentation=2}(t.InsertTextMode||(t.InsertTextMode={})),function(e){e.create=function(e){return{label:e}}}(t.CompletionItem||(t.CompletionItem={})),function(e){e.create=function(e,t){return{items:e||[],isIncomplete:!!t}}}(t.CompletionList||(t.CompletionList={})),function(e){e.fromPlainText=function(e){return e.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")},e.is=function(e){var t=e;return E.string(t)||E.objectLiteral(t)&&E.string(t.language)&&E.string(t.value)}}(S=t.MarkedString||(t.MarkedString={})),function(e){e.is=function(e){var t=e;return!!t&&E.objectLiteral(t)&&(x.is(t.contents)||S.is(t.contents)||E.typedArray(t.contents,S.is))&&(void 0===e.range||i.is(e.range))}}(t.Hover||(t.Hover={})),function(e){e.create=function(e,t){return t?{label:e,documentation:t}:{label:e}}}(t.ParameterInformation||(t.ParameterInformation={})),function(e){e.create=function(e,t){for(var n=[],r=2;r=0;s--){var a=i[s],l=e.offsetAt(a.range.start),c=e.offsetAt(a.range.end);if(!(c<=o))throw new Error("Overlapping edit");r=r.substring(0,l)+a.newText+r.substring(c,r.length),o=l}return r}}(t.TextDocument||(t.TextDocument={}));var E,F=function(){function e(e,t,n,r){this._uri=e,this._languageId=t,this._version=n,this._content=r,this._lineOffsets=void 0}return Object.defineProperty(e.prototype,"uri",{get:function(){return this._uri},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"languageId",{get:function(){return this._languageId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"version",{get:function(){return this._version},enumerable:!1,configurable:!0}),e.prototype.getText=function(e){if(e){var t=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(t,n)}return this._content},e.prototype.update=function(e,t){this._content=e.text,this._version=t,this._lineOffsets=void 0},e.prototype.getLineOffsets=function(){if(void 0===this._lineOffsets){for(var e=[],t=this._content,n=!0,r=0;r0&&e.push(t.length),this._lineOffsets=e}return this._lineOffsets},e.prototype.positionAt=function(e){e=Math.max(Math.min(e,this._content.length),0);var t=this.getLineOffsets(),n=0,i=t.length;if(0===i)return r.create(0,e);for(;ne?i=o:n=o+1}var s=n-1;return r.create(s,e-t[s])},e.prototype.offsetAt=function(e){var t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;var n=t[e.line],r=e.line+1e?r=i:n=i+1}var o=n-1;return{line:o,character:e-t[o]}},e.prototype.offsetAt=function(e){var t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;var n=t[e.line],r=e.line+1n.line||t.line===n.line&&t.character>n.character?{start:n,end:t}:e}function s(e){var t=o(e.range);return t!==e.range?{newText:e.newText,range:t}:e}!function(e){e.create=function(e,t,r,i){return new n(e,t,r,i)},e.update=function(e,t,r){if(e instanceof n)return e.update(t,r),e;throw new Error("TextDocument.update: document must be created by TextDocument.create")},e.applyEdits=function(e,t){for(var n=e.getText(),i=0,o=[],a=0,l=r(t.map(s),(function(e,t){var n=e.range.start.line-t.range.start.line;return 0===n?e.range.start.character-t.range.start.character:n}));ai&&o.push(n.substring(i,d)),c.newText.length&&o.push(c.newText),i=e.offsetAt(c.range.end)}return o.push(n.substr(i)),o.join("")}}(t.TextDocument||(t.TextDocument={}))})),define("vscode-languageserver-textdocument",["vscode-languageserver-textdocument/main"],(function(e){return e})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/cssLanguageTypes",["require","exports","vscode-languageserver-types","vscode-languageserver-textdocument"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FileType=t.ClientCapabilities=t.DocumentHighlightKind=t.VersionedTextDocumentIdentifier=t.TextDocumentEdit=t.CodeActionKind=t.TextEdit=t.WorkspaceEdit=t.DocumentLink=t.DocumentHighlight=t.CodeAction=t.Command=t.CodeActionContext=t.MarkedString=t.Hover=t.Location=t.DocumentSymbol=t.SymbolKind=t.SymbolInformation=t.InsertTextFormat=t.CompletionItemTag=t.CompletionList=t.CompletionItemKind=t.CompletionItem=t.DiagnosticSeverity=t.Diagnostic=t.SelectionRange=t.FoldingRangeKind=t.FoldingRange=t.ColorPresentation=t.ColorInformation=t.Color=t.MarkupKind=t.MarkupContent=t.Position=t.Range=t.TextDocument=void 0;var n=e("vscode-languageserver-types");Object.defineProperty(t,"Range",{enumerable:!0,get:function(){return n.Range}}),Object.defineProperty(t,"Position",{enumerable:!0,get:function(){return n.Position}}),Object.defineProperty(t,"MarkupContent",{enumerable:!0,get:function(){return n.MarkupContent}}),Object.defineProperty(t,"MarkupKind",{enumerable:!0,get:function(){return n.MarkupKind}}),Object.defineProperty(t,"Color",{enumerable:!0,get:function(){return n.Color}}),Object.defineProperty(t,"ColorInformation",{enumerable:!0,get:function(){return n.ColorInformation}}),Object.defineProperty(t,"ColorPresentation",{enumerable:!0,get:function(){return n.ColorPresentation}}),Object.defineProperty(t,"FoldingRange",{enumerable:!0,get:function(){return n.FoldingRange}}),Object.defineProperty(t,"FoldingRangeKind",{enumerable:!0,get:function(){return n.FoldingRangeKind}}),Object.defineProperty(t,"SelectionRange",{enumerable:!0,get:function(){return n.SelectionRange}}),Object.defineProperty(t,"Diagnostic",{enumerable:!0,get:function(){return n.Diagnostic}}),Object.defineProperty(t,"DiagnosticSeverity",{enumerable:!0,get:function(){return n.DiagnosticSeverity}}),Object.defineProperty(t,"CompletionItem",{enumerable:!0,get:function(){return n.CompletionItem}}),Object.defineProperty(t,"CompletionItemKind",{enumerable:!0,get:function(){return n.CompletionItemKind}}),Object.defineProperty(t,"CompletionList",{enumerable:!0,get:function(){return n.CompletionList}}),Object.defineProperty(t,"CompletionItemTag",{enumerable:!0,get:function(){return n.CompletionItemTag}}),Object.defineProperty(t,"InsertTextFormat",{enumerable:!0,get:function(){return n.InsertTextFormat}}),Object.defineProperty(t,"SymbolInformation",{enumerable:!0,get:function(){return n.SymbolInformation}}),Object.defineProperty(t,"SymbolKind",{enumerable:!0,get:function(){return n.SymbolKind}}),Object.defineProperty(t,"DocumentSymbol",{enumerable:!0,get:function(){return n.DocumentSymbol}}),Object.defineProperty(t,"Location",{enumerable:!0,get:function(){return n.Location}}),Object.defineProperty(t,"Hover",{enumerable:!0,get:function(){return n.Hover}}),Object.defineProperty(t,"MarkedString",{enumerable:!0,get:function(){return n.MarkedString}}),Object.defineProperty(t,"CodeActionContext",{enumerable:!0,get:function(){return n.CodeActionContext}}),Object.defineProperty(t,"Command",{enumerable:!0,get:function(){return n.Command}}),Object.defineProperty(t,"CodeAction",{enumerable:!0,get:function(){return n.CodeAction}}),Object.defineProperty(t,"DocumentHighlight",{enumerable:!0,get:function(){return n.DocumentHighlight}}),Object.defineProperty(t,"DocumentLink",{enumerable:!0,get:function(){return n.DocumentLink}}),Object.defineProperty(t,"WorkspaceEdit",{enumerable:!0,get:function(){return n.WorkspaceEdit}}),Object.defineProperty(t,"TextEdit",{enumerable:!0,get:function(){return n.TextEdit}}),Object.defineProperty(t,"CodeActionKind",{enumerable:!0,get:function(){return n.CodeActionKind}}),Object.defineProperty(t,"TextDocumentEdit",{enumerable:!0,get:function(){return n.TextDocumentEdit}}),Object.defineProperty(t,"VersionedTextDocumentIdentifier",{enumerable:!0,get:function(){return n.VersionedTextDocumentIdentifier}}),Object.defineProperty(t,"DocumentHighlightKind",{enumerable:!0,get:function(){return n.DocumentHighlightKind}});var r=e("vscode-languageserver-textdocument");Object.defineProperty(t,"TextDocument",{enumerable:!0,get:function(){return r.TextDocument}}),function(e){e.LATEST={textDocument:{completion:{completionItem:{documentationFormat:[n.MarkupKind.Markdown,n.MarkupKind.PlainText]}},hover:{contentFormat:[n.MarkupKind.Markdown,n.MarkupKind.PlainText]}}}}(t.ClientCapabilities||(t.ClientCapabilities={})),function(e){e[e.Unknown=0]="Unknown",e[e.File=1]="File",e[e.Directory=2]="Directory",e[e.SymbolicLink=64]="SymbolicLink"}(t.FileType||(t.FileType={}))})),function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define("vscode-uri/index",[],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(this,(function(){return(()=>{"use strict";var e={470:e=>{function t(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function n(e,t){for(var n,r="",i=0,o=-1,s=0,a=0;a<=e.length;++a){if(a2){var l=r.lastIndexOf("/");if(l!==r.length-1){-1===l?(r="",i=0):i=(r=r.slice(0,l)).length-1-r.lastIndexOf("/"),o=a,s=0;continue}}else if(2===r.length||1===r.length){r="",i=0,o=a,s=0;continue}t&&(r.length>0?r+="/..":r="..",i=2)}else r.length>0?r+="/"+e.slice(o+1,a):r=e.slice(o+1,a),i=a-o-1;o=a,s=0}else 46===n&&-1!==s?++s:s=-1}return r}var r={resolve:function(){for(var e,r="",i=!1,o=arguments.length-1;o>=-1&&!i;o--){var s;o>=0?s=arguments[o]:(void 0===e&&(e=process.cwd()),s=e),t(s),0!==s.length&&(r=s+"/"+r,i=47===s.charCodeAt(0))}return r=n(r,!i),i?r.length>0?"/"+r:"/":r.length>0?r:"."},normalize:function(e){if(t(e),0===e.length)return".";var r=47===e.charCodeAt(0),i=47===e.charCodeAt(e.length-1);return 0!==(e=n(e,!r)).length||r||(e="."),e.length>0&&i&&(e+="/"),r?"/"+e:e},isAbsolute:function(e){return t(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,n=0;n0&&(void 0===e?e=i:e+="/"+i)}return void 0===e?".":r.normalize(e)},relative:function(e,n){if(t(e),t(n),e===n)return"";if((e=r.resolve(e))===(n=r.resolve(n)))return"";for(var i=1;ic){if(47===n.charCodeAt(a+p))return n.slice(a+p+1);if(0===p)return n.slice(a+p)}else s>c&&(47===e.charCodeAt(i+p)?d=p:0===p&&(d=0));break}var h=e.charCodeAt(i+p);if(h!==n.charCodeAt(a+p))break;47===h&&(d=p)}var u="";for(p=i+d+1;p<=o;++p)p!==o&&47!==e.charCodeAt(p)||(0===u.length?u+="..":u+="/..");return u.length>0?u+n.slice(a+d):(a+=d,47===n.charCodeAt(a)&&++a,n.slice(a))},_makeLong:function(e){return e},dirname:function(e){if(t(e),0===e.length)return".";for(var n=e.charCodeAt(0),r=47===n,i=-1,o=!0,s=e.length-1;s>=1;--s)if(47===(n=e.charCodeAt(s))){if(!o){i=s;break}}else o=!1;return-1===i?r?"/":".":r&&1===i?"//":e.slice(0,i)},basename:function(e,n){if(void 0!==n&&"string"!=typeof n)throw new TypeError('"ext" argument must be a string');t(e);var r,i=0,o=-1,s=!0;if(void 0!==n&&n.length>0&&n.length<=e.length){if(n.length===e.length&&n===e)return"";var a=n.length-1,l=-1;for(r=e.length-1;r>=0;--r){var c=e.charCodeAt(r);if(47===c){if(!s){i=r+1;break}}else-1===l&&(s=!1,l=r+1),a>=0&&(c===n.charCodeAt(a)?-1==--a&&(o=r):(a=-1,o=l))}return i===o?o=l:-1===o&&(o=e.length),e.slice(i,o)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!s){i=r+1;break}}else-1===o&&(s=!1,o=r+1);return-1===o?"":e.slice(i,o)},extname:function(e){t(e);for(var n=-1,r=0,i=-1,o=!0,s=0,a=e.length-1;a>=0;--a){var l=e.charCodeAt(a);if(47!==l)-1===i&&(o=!1,i=a+1),46===l?-1===n?n=a:1!==s&&(s=1):-1!==n&&(s=-1);else if(!o){r=a+1;break}}return-1===n||-1===i||0===s||1===s&&n===i-1&&n===r+1?"":e.slice(n,i)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var n=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return n?n===t.root?n+r:n+"/"+r:r}(0,e)},parse:function(e){t(e);var n={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return n;var r,i=e.charCodeAt(0),o=47===i;o?(n.root="/",r=1):r=0;for(var s=-1,a=0,l=-1,c=!0,d=e.length-1,p=0;d>=r;--d)if(47!==(i=e.charCodeAt(d)))-1===l&&(c=!1,l=d+1),46===i?-1===s?s=d:1!==p&&(p=1):-1!==s&&(p=-1);else if(!c){a=d+1;break}return-1===s||-1===l||0===p||1===p&&s===l-1&&s===a+1?-1!==l&&(n.base=n.name=0===a&&o?e.slice(1,l):e.slice(a,l)):(0===a&&o?(n.name=e.slice(1,s),n.base=e.slice(1,l)):(n.name=e.slice(a,s),n.base=e.slice(a,l)),n.ext=e.slice(s,l)),a>0?n.dir=e.slice(0,a-1):o&&(n.dir="/"),n},sep:"/",delimiter:":",win32:null,posix:null};r.posix=r,e.exports=r},465:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Utils=t.URI=void 0;var r=n(796);Object.defineProperty(t,"URI",{enumerable:!0,get:function(){return r.URI}});var i=n(679);Object.defineProperty(t,"Utils",{enumerable:!0,get:function(){return i.Utils}})},674:(e,t)=>{if(Object.defineProperty(t,"__esModule",{value:!0}),t.isWindows=void 0,"object"==typeof process)t.isWindows="win32"===process.platform;else if("object"==typeof navigator){var n=navigator.userAgent;t.isWindows=n.indexOf("Windows")>=0}},796:function(e,t,n){var r,i,o=this&&this.__extends||(r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)},function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0}),t.uriToFsPath=t.URI=void 0;var s=n(674),a=/^\w[\w\d+.-]*$/,l=/^\//,c=/^\/\//,d="",p="/",h=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/,u=function(){function e(e,t,n,r,i,o){void 0===o&&(o=!1),"object"==typeof e?(this.scheme=e.scheme||d,this.authority=e.authority||d,this.path=e.path||d,this.query=e.query||d,this.fragment=e.fragment||d):(this.scheme=function(e,t){return e||t?e:"file"}(e,o),this.authority=t||d,this.path=function(e,t){switch(e){case"https":case"http":case"file":t?t[0]!==p&&(t=p+t):t=p}return t}(this.scheme,n||d),this.query=r||d,this.fragment=i||d,function(e,t){if(!e.scheme&&t)throw new Error('[UriError]: Scheme is missing: {scheme: "", authority: "'+e.authority+'", path: "'+e.path+'", query: "'+e.query+'", fragment: "'+e.fragment+'"}');if(e.scheme&&!a.test(e.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(e.path)if(e.authority){if(!l.test(e.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(c.test(e.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}(this,o))}return e.isUri=function(t){return t instanceof e||!!t&&"string"==typeof t.authority&&"string"==typeof t.fragment&&"string"==typeof t.path&&"string"==typeof t.query&&"string"==typeof t.scheme&&"function"==typeof t.fsPath&&"function"==typeof t.with&&"function"==typeof t.toString},Object.defineProperty(e.prototype,"fsPath",{get:function(){return v(this,!1)},enumerable:!1,configurable:!0}),e.prototype.with=function(e){if(!e)return this;var t=e.scheme,n=e.authority,r=e.path,i=e.query,o=e.fragment;return void 0===t?t=this.scheme:null===t&&(t=d),void 0===n?n=this.authority:null===n&&(n=d),void 0===r?r=this.path:null===r&&(r=d),void 0===i?i=this.query:null===i&&(i=d),void 0===o?o=this.fragment:null===o&&(o=d),t===this.scheme&&n===this.authority&&r===this.path&&i===this.query&&o===this.fragment?this:new f(t,n,r,i,o)},e.parse=function(e,t){void 0===t&&(t=!1);var n=h.exec(e);return n?new f(n[2]||d,k(n[4]||d),k(n[5]||d),k(n[7]||d),k(n[9]||d),t):new f(d,d,d,d,d)},e.file=function(e){var t=d;if(s.isWindows&&(e=e.replace(/\\/g,p)),e[0]===p&&e[1]===p){var n=e.indexOf(p,2);-1===n?(t=e.substring(2),e=p):(t=e.substring(2,n),e=e.substring(n)||p)}return new f("file",t,e,d,d)},e.from=function(e){return new f(e.scheme,e.authority,e.path,e.query,e.fragment)},e.prototype.toString=function(e){return void 0===e&&(e=!1),w(this,e)},e.prototype.toJSON=function(){return this},e.revive=function(t){if(t){if(t instanceof e)return t;var n=new f(t);return n._formatted=t.external,n._fsPath=t._sep===m?t.fsPath:null,n}return t},e}();t.URI=u;var m=s.isWindows?1:void 0,f=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._formatted=null,t._fsPath=null,t}return o(t,e),Object.defineProperty(t.prototype,"fsPath",{get:function(){return this._fsPath||(this._fsPath=v(this,!1)),this._fsPath},enumerable:!1,configurable:!0}),t.prototype.toString=function(e){return void 0===e&&(e=!1),e?w(this,!0):(this._formatted||(this._formatted=w(this,!1)),this._formatted)},t.prototype.toJSON=function(){var e={$mid:1};return this._fsPath&&(e.fsPath=this._fsPath,e._sep=m),this._formatted&&(e.external=this._formatted),this.path&&(e.path=this.path),this.scheme&&(e.scheme=this.scheme),this.authority&&(e.authority=this.authority),this.query&&(e.query=this.query),this.fragment&&(e.fragment=this.fragment),e},t}(u),g=((i={})[58]="%3A",i[47]="%2F",i[63]="%3F",i[35]="%23",i[91]="%5B",i[93]="%5D",i[64]="%40",i[33]="%21",i[36]="%24",i[38]="%26",i[39]="%27",i[40]="%28",i[41]="%29",i[42]="%2A",i[43]="%2B",i[44]="%2C",i[59]="%3B",i[61]="%3D",i[32]="%20",i);function b(e,t){for(var n=void 0,r=-1,i=0;i=97&&o<=122||o>=65&&o<=90||o>=48&&o<=57||45===o||46===o||95===o||126===o||t&&47===o)-1!==r&&(n+=encodeURIComponent(e.substring(r,i)),r=-1),void 0!==n&&(n+=e.charAt(i));else{void 0===n&&(n=e.substr(0,i));var s=g[o];void 0!==s?(-1!==r&&(n+=encodeURIComponent(e.substring(r,i)),r=-1),n+=s):-1===r&&(r=i)}}return-1!==r&&(n+=encodeURIComponent(e.substring(r))),void 0!==n?n:e}function y(e){for(var t=void 0,n=0;n1&&"file"===e.scheme?"//"+e.authority+e.path:47===e.path.charCodeAt(0)&&(e.path.charCodeAt(1)>=65&&e.path.charCodeAt(1)<=90||e.path.charCodeAt(1)>=97&&e.path.charCodeAt(1)<=122)&&58===e.path.charCodeAt(2)?t?e.path.substr(1):e.path[1].toLowerCase()+e.path.substr(2):e.path,s.isWindows&&(n=n.replace(/\//g,"\\")),n}function w(e,t){var n=t?y:b,r="",i=e.scheme,o=e.authority,s=e.path,a=e.query,l=e.fragment;if(i&&(r+=i,r+=":"),(o||"file"===i)&&(r+=p,r+=p),o){var c=o.indexOf("@");if(-1!==c){var d=o.substr(0,c);o=o.substr(c+1),-1===(c=d.indexOf(":"))?r+=n(d,!1):(r+=n(d.substr(0,c),!1),r+=":",r+=n(d.substr(c+1),!1)),r+="@"}-1===(c=(o=o.toLowerCase()).indexOf(":"))?r+=n(o,!1):(r+=n(o.substr(0,c),!1),r+=o.substr(c))}if(s){if(s.length>=3&&47===s.charCodeAt(0)&&58===s.charCodeAt(2))(h=s.charCodeAt(1))>=65&&h<=90&&(s="/"+String.fromCharCode(h+32)+":"+s.substr(3));else if(s.length>=2&&58===s.charCodeAt(1)){var h;(h=s.charCodeAt(0))>=65&&h<=90&&(s=String.fromCharCode(h+32)+":"+s.substr(2))}r+=n(s,!0)}return a&&(r+="?",r+=n(a,!1)),l&&(r+="#",r+=t?l:b(l,!1)),r}function x(e){try{return decodeURIComponent(e)}catch(t){return e.length>3?e.substr(0,3)+x(e.substr(3)):e}}t.uriToFsPath=v;var S=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function k(e){return e.match(S)?e.replace(S,(function(e){return x(e)})):e}},679:function(e,t,n){var r=this&&this.__spreadArrays||function(){for(var e=0,t=0,n=arguments.length;t0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=0&&-1===' \t\n\r":{[()]},*>+'.indexOf(r.charAt(n));)n--;return r.substring(n+1,t)}(e,this.offset),this.defaultReplaceRange=a.Range.create(a.Position.create(this.position.line,this.position.character-this.currentWord.length),this.position),this.textDocument=e,this.styleSheet=n,this.documentSettings=i;try{var o={isIncomplete:!1,items:[]};this.nodePath=r.getNodePath(this.styleSheet,this.offset);for(var s=this.nodePath.length-1;s>=0;s--){var l=this.nodePath[s];if(l instanceof r.Property)this.getCompletionsForDeclarationProperty(l.getParent(),o);else if(l instanceof r.Expression)l.parent instanceof r.Interpolation?this.getVariableProposals(null,o):this.getCompletionsForExpression(l,o);else if(l instanceof r.SimpleSelector){var c=l.findAParent(r.NodeType.ExtendsReference,r.NodeType.Ruleset);if(c)if(c.type===r.NodeType.ExtendsReference)this.getCompletionsForExtendsReference(c,l,o);else{var d=c;this.getCompletionsForSelector(d,d&&d.isNested(),o)}}else if(l instanceof r.FunctionArgument)this.getCompletionsForFunctionArgument(l,l.getParent(),o);else if(l instanceof r.Declarations)this.getCompletionsForDeclarations(l,o);else if(l instanceof r.VariableDeclaration)this.getCompletionsForVariableDeclaration(l,o);else if(l instanceof r.RuleSet)this.getCompletionsForRuleSet(l,o);else if(l instanceof r.Interpolation)this.getCompletionsForInterpolation(l,o);else if(l instanceof r.FunctionDeclaration)this.getCompletionsForFunctionDeclaration(l,o);else if(l instanceof r.MixinReference)this.getCompletionsForMixinReference(l,o);else if(l instanceof r.Function)this.getCompletionsForFunctionArgument(null,l,o);else if(l instanceof r.Supports)this.getCompletionsForSupports(l,o);else if(l instanceof r.SupportsCondition)this.getCompletionsForSupportsCondition(l,o);else if(l instanceof r.ExtendsReference)this.getCompletionsForExtendsReference(l,null,o);else if(l.type===r.NodeType.URILiteral)this.getCompletionForUriLiteralValue(l,o);else if(null===l.parent)this.getCompletionForTopLevel(o);else{if(l.type!==r.NodeType.StringLiteral||!this.isImportPathParent(l.parent.type))continue;this.getCompletionForImportPath(l,o)}if(o.items.length>0||this.offset>l.offset)return this.finalize(o)}return this.getCompletionsForStylesheet(o),0===o.items.length&&this.variablePrefix&&0===this.currentWord.indexOf(this.variablePrefix)&&this.getVariableProposals(null,o),this.finalize(o)}finally{this.position=null,this.currentWord=null,this.textDocument=null,this.styleSheet=null,this.symbolContext=null,this.defaultReplaceRange=null,this.nodePath=null}},e.prototype.isImportPathParent=function(e){return e===r.NodeType.Import},e.prototype.finalize=function(e){return e},e.prototype.findInNodePath=function(){for(var e=[],t=0;t=0;n--){var r=this.nodePath[n];if(-1!==e.indexOf(r.type))return r}return null},e.prototype.getCompletionsForDeclarationProperty=function(e,t){return this.getPropertyProposals(e,t)},e.prototype.getPropertyProposals=function(e,t){var r=this,i=this.isTriggerPropertyValueCompletionEnabled,l=this.isCompletePropertyWithSemicolonEnabled;return this.cssDataManager.getProperties().forEach((function(d){var p,h,u=!1;e?(p=r.getCompletionRange(e.getProperty()),h=d.name,c.isDefined(e.colonPosition)||(h+=": ",u=!0)):(p=r.getCompletionRange(null),h=d.name+": ",u=!0),!e&&l&&(h+="$0;"),e&&!e.semicolonPosition&&l&&r.offset>=r.textDocument.offsetAt(p.end)&&(h+="$0;");var f={label:d.name,documentation:o.getEntryDescription(d,r.doesSupportMarkdown()),tags:m(d)?[a.CompletionItemTag.Deprecated]:[],textEdit:a.TextEdit.replace(p,h),insertTextFormat:a.InsertTextFormat.Snippet,kind:a.CompletionItemKind.Property};d.restrictions||(u=!1),i&&u&&(f.command={title:"Suggest",command:"editor.action.triggerSuggest"});var g=(255-("number"==typeof d.relevance?Math.min(Math.max(d.relevance,0),99):50)).toString(16),b=s.startsWith(d.name,"-")?n.VendorPrefixed:n.Normal;f.sortText=b+"_"+g,t.items.push(f)})),this.completionParticipants.forEach((function(e){e.onCssProperty&&e.onCssProperty({propertyName:r.currentWord,range:r.defaultReplaceRange})})),t},Object.defineProperty(e.prototype,"isTriggerPropertyValueCompletionEnabled",{get:function(){var e,t;return null===(t=null===(e=this.documentSettings)||void 0===e?void 0:e.triggerPropertyValueCompletion)||void 0===t||t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isCompletePropertyWithSemicolonEnabled",{get:function(){var e,t;return null===(t=null===(e=this.documentSettings)||void 0===e?void 0:e.completePropertyWithSemicolon)||void 0===t||t},enumerable:!1,configurable:!0}),e.prototype.getCompletionsForDeclarationValue=function(e,t){for(var n=this,i=e.getFullPropertyName(),o=this.cssDataManager.getProperty(i),s=e.getValue()||null;s&&s.hasChildren();)s=s.findChildAtOffset(this.offset,!1);if(this.completionParticipants.forEach((function(e){e.onCssPropertyValue&&e.onCssPropertyValue({propertyName:i,propertyValue:n.currentWord,range:n.getCompletionRange(s)})})),o){if(o.restrictions)for(var l=0,c=o.restrictions;l=e.offset+2&&this.getVariableProposals(null,t),t},e.prototype.getVariableProposals=function(e,t){for(var i=0,o=this.getSymbolContext().findSymbolsAtOffset(this.offset,r.ReferenceType.Variable);i0){var s=this.currentWord.match(/^-?\d[\.\d+]*/);s&&(i=s[0],n.isIncomplete=i.length===this.currentWord.length)}else 0===this.currentWord.length&&(n.isIncomplete=!0);if(t&&t.parent&&t.parent.type===r.NodeType.Term&&(t=t.getParent()),e.restrictions)for(var l=0,c=e.restrictions;l=n.end?this.getCompletionForTopLevel(t):!n||this.offset<=n.offset?this.getCompletionsForSelector(e,e.isNested(),t):this.getCompletionsForDeclarations(e.getDeclarations(),t)},e.prototype.getCompletionsForSelector=function(e,t,i){var l=this,c=this.findInNodePath(r.NodeType.PseudoSelector,r.NodeType.IdentifierSelector,r.NodeType.ClassSelector,r.NodeType.ElementNameSelector);if(!c&&this.hasCharacterAtPosition(this.offset-this.currentWord.length-1,":")&&(this.currentWord=":"+this.currentWord,this.hasCharacterAtPosition(this.offset-this.currentWord.length-1,":")&&(this.currentWord=":"+this.currentWord),this.defaultReplaceRange=a.Range.create(a.Position.create(this.position.line,this.position.character-this.currentWord.length),this.position)),this.cssDataManager.getPseudoClasses().forEach((function(e){var t=g(e.name),r={label:e.name,textEdit:a.TextEdit.replace(l.getCompletionRange(c),t),documentation:o.getEntryDescription(e,l.doesSupportMarkdown()),tags:m(e)?[a.CompletionItemTag.Deprecated]:[],kind:a.CompletionItemKind.Function,insertTextFormat:e.name!==t?h:void 0};s.startsWith(e.name,":-")&&(r.sortText=n.VendorPrefixed),i.items.push(r)})),this.cssDataManager.getPseudoElements().forEach((function(e){var t=g(e.name),r={label:e.name,textEdit:a.TextEdit.replace(l.getCompletionRange(c),t),documentation:o.getEntryDescription(e,l.doesSupportMarkdown()),tags:m(e)?[a.CompletionItemTag.Deprecated]:[],kind:a.CompletionItemKind.Function,insertTextFormat:e.name!==t?h:void 0};s.startsWith(e.name,"::-")&&(r.sortText=n.VendorPrefixed),i.items.push(r)})),!t){for(var d=0,p=o.html5Tags;d0){var t=v.substr(e.offset,e.length);return"."!==t.charAt(0)||y[t]||(y[t]=!0,i.items.push({label:t,textEdit:a.TextEdit.replace(l.getCompletionRange(c),t),kind:a.CompletionItemKind.Keyword})),!1}return!0})),e&&e.isNested()){var w=e.getSelectors().findFirstChildBeforeOffset(this.offset);w&&0===e.getSelectors().getChildren().indexOf(w)&&this.getPropertyProposals(null,i)}return i},e.prototype.getCompletionsForDeclarations=function(e,t){if(!e||this.offset===e.offset)return t;var n=e.findFirstChildBeforeOffset(this.offset);if(!n)return this.getCompletionsForDeclarationProperty(null,t);if(n instanceof r.AbstractDeclaration){var i=n;if(!c.isDefined(i.colonPosition)||this.offset<=i.colonPosition)return this.getCompletionsForDeclarationProperty(i,t);if(c.isDefined(i.semicolonPosition)&&i.semicolonPositione.colonPosition&&this.getVariableProposals(e.getValue(),t),t},e.prototype.getCompletionsForExpression=function(e,t){var n=e.getParent();if(n instanceof r.FunctionArgument)return this.getCompletionsForFunctionArgument(n,n.getParent(),t),t;var i=e.findParent(r.NodeType.Declaration);if(!i)return this.getTermProposals(void 0,null,t),t;var o=e.findChildAtOffset(this.offset,!0);return o?o instanceof r.NumericValue||o instanceof r.Identifier?this.getCompletionsForDeclarationValue(i,t):t:this.getCompletionsForDeclarationValue(i,t)},e.prototype.getCompletionsForFunctionArgument=function(e,t,n){var r=t.getIdentifier();return r&&r.matches("var")&&(t.getArguments().hasChildren()&&t.getArguments().getChild(0)!==e||this.getVariableProposalsForCSSVarFunction(n)),n},e.prototype.getCompletionsForFunctionDeclaration=function(e,t){var n=e.getDeclarations();return n&&this.offset>n.offset&&this.offsete.lParent&&(!c.isDefined(e.rParent)||this.offset<=e.rParent)?this.getCompletionsForDeclarationProperty(null,t):t},e.prototype.getCompletionsForSupports=function(e,t){var n=e.getDeclarations();if(!n||this.offset<=n.offset){var i=e.findFirstChildBeforeOffset(this.offset);return i instanceof r.SupportsCondition?this.getCompletionsForSupportsCondition(i,t):t}return this.getCompletionForTopLevel(t)},e.prototype.getCompletionsForExtendsReference=function(e,t,n){return n},e.prototype.getCompletionForUriLiteralValue=function(e,t){var n,r,i;if(e.hasChildren()){var o=e.getChild(0);n=o.getText(),r=this.position,i=this.getCompletionRange(o)}else{n="",r=this.position;var s=this.textDocument.positionAt(e.offset+"url(".length);i=a.Range.create(s,s)}return this.completionParticipants.forEach((function(e){e.onCssURILiteralValue&&e.onCssURILiteralValue({uriValue:n,position:r,range:i})})),t},e.prototype.getCompletionForImportPath=function(e,t){var n=this;return this.completionParticipants.forEach((function(t){t.onCssImportPath&&t.onCssImportPath({pathValue:e.getText(),position:n.position,range:n.getCompletionRange(e)})})),t},e.prototype.hasCharacterAtPosition=function(e,t){var n=this.textDocument.getText();return e>=0&&e"),this.writeLine(t,r.join(""))}},e}();!function(e){function t(e){var t=e.match(/^['"](.*)["']$/);return t?t[1]:e}e.ensure=function(e,n){return n+t(e)+n},e.remove=t}(l||(l={}));var d=function(){this.id=0,this.attr=0,this.tag=0};function p(e,t){for(var r=new o,i=0,s=e.getChildren();i1){var p=t.cloneWithParent();r.addChild(p.findRoot()),r=p}r.append(c[d])}}break;case n.NodeType.SelectorPlaceholder:if(a.matches("@at-root"))return r;case n.NodeType.ElementNameSelector:var u=a.getText();r.addAttr("name","*"===u?"element":h(u));break;case n.NodeType.ClassSelector:r.addAttr("class",h(a.getText().substring(1)));break;case n.NodeType.IdentifierSelector:r.addAttr("id",h(a.getText().substring(1)));break;case n.NodeType.MixinDeclaration:r.addAttr("class",a.getName());break;case n.NodeType.PseudoSelector:r.addAttr(h(a.getText()),"");break;case n.NodeType.AttributeSelector:var m=a,f=m.getIdentifier();if(f){var g=m.getValue(),b=m.getOperator(),y=void 0;if(g&&b)switch(h(b.getText())){case"|=":y=l.remove(h(g.getText()))+"-…";break;case"^=":y=l.remove(h(g.getText()))+"…";break;case"$=":y="…"+l.remove(h(g.getText()));break;case"~=":y=" … "+l.remove(h(g.getText()))+" … ";break;case"*=":y="…"+l.remove(h(g.getText()))+"…";break;default:y=l.remove(h(g.getText()))}r.addAttr(h(f.getText()),y)}}}return r}function h(e){var t=new r.Scanner;t.setSource(e);var n=t.scanUnquotedString();return n?n.text:e}t.toElement=p;var u=function(){function e(e){this.cssDataManager=e}return e.prototype.selectorToMarkedString=function(e){var t=g(e);if(t){var n=new c('"').print(t);return n.push(this.selectorToSpecificityMarkedString(e)),n}return[]},e.prototype.simpleSelectorToMarkedString=function(e){var t=p(e),n=new c('"').print(t);return n.push(this.selectorToSpecificityMarkedString(e)),n},e.prototype.isPseudoElementIdentifier=function(e){var t=e.match(/^::?([\w-]+)/);return!!t&&!!this.cssDataManager.getPseudoElement("::"+t[1])},e.prototype.selectorToSpecificityMarkedString=function(e){var t=this,r=function(e){for(var i=0,s=e.getChildren();i0&&r(a)}},o=new d;return r(e),i("specificity","[Selector Specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity): ({0}, {1}, {2})",o.id,o.attr,o.tag)},e}();t.SelectorPrinting=u;var m=function(){function e(e){this.prev=null,this.element=e}return e.prototype.processSelector=function(e){var t=null;if(!(this.element instanceof s)&&e.getChildren().some((function(e){return e.hasChildren()&&e.getChild(0).type===n.NodeType.SelectorCombinator}))){var r=this.element.findRoot();r.parent instanceof s&&(t=this.element,this.element=r.parent,this.element.removeChild(r),this.prev=null)}for(var i=0,o=e.getChildren();i=0;l--){var c=r[l].getSelectors().getChild(0);c&&a.processSelector(c)}return a.processSelector(e),t}t.selectorToElement=g})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/services/cssHover",["require","exports","../parser/cssNodes","../languageFacts/facts","./selectorPrinting","../utils/strings","../cssLanguageTypes","../utils/objects"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CSSHover=void 0;var n=e("../parser/cssNodes"),r=e("../languageFacts/facts"),i=e("./selectorPrinting"),o=e("../utils/strings"),s=e("../cssLanguageTypes"),a=e("../utils/objects"),l=function(){function e(e,t){this.clientCapabilities=e,this.cssDataManager=t,this.selectorPrinting=new i.SelectorPrinting(t)}return e.prototype.configure=function(e){this.defaultSettings=e},e.prototype.doHover=function(e,t,i,a){function l(t){return s.Range.create(e.positionAt(t.offset),e.positionAt(t.end))}void 0===a&&(a=this.defaultSettings);for(var c=e.offsetAt(t),d=n.getNodePath(i,c),p=null,h=0;h0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]=a.length/2&&l.push({property:e.name,score:t})})),l.sort((function(e,t){return t.score-e.score||e.property.localeCompare(t.property)}));for(var c=3,d=0,p=l;d=0;c--){var d=l[c];if(d instanceof n.Declaration){var p=d.getProperty();if(p&&p.offset===s&&p.end===a)return void this.getFixesForUnknownProperty(e,p,r,o)}}},e}();t.CSSCodeActions=a})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/services/lintUtil",["require","exports","../utils/arrays"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Element=void 0;var n=e("../utils/arrays"),r=function(e){this.fullPropertyName=e.getFullPropertyName().toLowerCase(),this.node=e};function i(e,t,r,i){var o=e[t];o.value=r,r&&(n.includes(o.properties,i)||o.properties.push(i))}function o(e,t,n,r){"top"===t||"right"===t||"bottom"===t||"left"===t?i(e,t,n,r):function(e,t,n){i(e,"top",t,n),i(e,"right",t,n),i(e,"bottom",t,n),i(e,"left",t,n)}(e,n,r)}function s(e,t,n){switch(t.length){case 1:o(e,void 0,t[0],n);break;case 2:o(e,"top",t[0],n),o(e,"bottom",t[0],n),o(e,"right",t[1],n),o(e,"left",t[1],n);break;case 3:o(e,"top",t[0],n),o(e,"right",t[1],n),o(e,"left",t[1],n),o(e,"bottom",t[2],n);break;case 4:o(e,"top",t[0],n),o(e,"right",t[1],n),o(e,"bottom",t[2],n),o(e,"left",t[3],n)}}function a(e,t){for(var n=0,r=t;n0)for(var w=this.fetch(r,"float"),x=0;x0)for(w=this.fetch(r,"vertical-align"),x=0;x1)for(var D=0;D".charCodeAt(0),m=".".charCodeAt(0),f=("@".charCodeAt(0),n.TokenType.CustomToken);t.VariableName=f++,t.InterpolationFunction=f++,t.Default=f++,t.EqualsOperator=f++,t.NotEqualsOperator=f++,t.GreaterEqualsOperator=f++,t.SmallerEqualsOperator=f++,t.Ellipsis=f++,t.Module=f++;var g=function(e){function f(){return null!==e&&e.apply(this,arguments)||this}return __extends(f,e),f.prototype.scanNext=function(r){if(this.stream.advanceIfChar(a)){var i=["$"];if(this.ident(i))return this.finishToken(r,t.VariableName,i.join(""));this.stream.goBackTo(r)}return this.stream.advanceIfChars([l,c])?this.finishToken(r,t.InterpolationFunction):this.stream.advanceIfChars([d,d])?this.finishToken(r,t.EqualsOperator):this.stream.advanceIfChars([p,d])?this.finishToken(r,t.NotEqualsOperator):this.stream.advanceIfChar(h)?this.stream.advanceIfChar(d)?this.finishToken(r,t.SmallerEqualsOperator):this.finishToken(r,n.TokenType.Delim):this.stream.advanceIfChar(u)?this.stream.advanceIfChar(d)?this.finishToken(r,t.GreaterEqualsOperator):this.finishToken(r,n.TokenType.Delim):this.stream.advanceIfChars([m,m,m])?this.finishToken(r,t.Ellipsis):e.prototype.scanNext.call(this,r)},f.prototype.comment=function(){return!!e.prototype.comment.call(this)||!(this.inURL||!this.stream.advanceIfChars([r,r]))&&(this.stream.advanceWhileChar((function(e){switch(e){case i:case o:case s:return!1;default:return!0}})),!0)},f}(n.Scanner);t.SCSSScanner=g})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/parser/scssErrors",["require","exports","vscode-nls"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SCSSParseError=t.SCSSIssueType=void 0;var n=e("vscode-nls").loadMessageBundle(),r=function(e,t){this.id=e,this.message=t};t.SCSSIssueType=r,t.SCSSParseError={FromExpected:new r("scss-fromexpected",n("expected.from","'from' expected")),ThroughOrToExpected:new r("scss-throughexpected",n("expected.through","'through' or 'to' expected")),InExpected:new r("scss-fromexpected",n("expected.in","'in' expected"))}}));__extends=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();!function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/parser/scssParser",["require","exports","./scssScanner","./cssScanner","./cssParser","./cssNodes","./scssErrors","./cssErrors"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SCSSParser=void 0;var n=e("./scssScanner"),r=e("./cssScanner"),i=e("./cssParser"),o=e("./cssNodes"),s=e("./scssErrors"),a=e("./cssErrors"),l=function(e){function t(){return e.call(this,new n.SCSSScanner)||this}return __extends(t,e),t.prototype._parseStylesheetStatement=function(t){return void 0===t&&(t=!1),this.peek(r.TokenType.AtKeyword)?this._parseWarnAndDebug()||this._parseControlStatement()||this._parseMixinDeclaration()||this._parseMixinContent()||this._parseMixinReference()||this._parseFunctionDeclaration()||this._parseForward()||this._parseUse()||this._parseRuleset(t)||e.prototype._parseStylesheetAtStatement.call(this,t):this._parseRuleset(!0)||this._parseVariableDeclaration()},t.prototype._parseImport=function(){if(!this.peekKeyword("@import"))return null;var e=this.create(o.Import);if(this.consumeToken(),!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral()))return this.finish(e,a.ParseError.URIOrStringExpected);for(;this.accept(r.TokenType.Comma);)if(!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral()))return this.finish(e,a.ParseError.URIOrStringExpected);return this.peek(r.TokenType.SemiColon)||this.peek(r.TokenType.EOF)||e.setMedialist(this._parseMediaQueryList()),this.finish(e)},t.prototype._parseVariableDeclaration=function(e){if(void 0===e&&(e=[]),!this.peek(n.VariableName))return null;var t=this.create(o.VariableDeclaration);if(!t.setVariable(this._parseVariable()))return null;if(!this.accept(r.TokenType.Colon))return this.finish(t,a.ParseError.ColonExpected);if(this.prevToken&&(t.colonPosition=this.prevToken.offset),!t.setValue(this._parseExpr()))return this.finish(t,a.ParseError.VariableValueExpected,[],e);for(;this.peek(r.TokenType.Exclamation);)if(t.addChild(this._tryParsePrio()));else{if(this.consumeToken(),!this.peekRegExp(r.TokenType.Ident,/^(default|global)$/))return this.finish(t,a.ParseError.UnknownKeyword);this.consumeToken()}return this.peek(r.TokenType.SemiColon)&&(t.semicolonPosition=this.token.offset),this.finish(t)},t.prototype._parseMediaContentStart=function(){return this._parseInterpolation()},t.prototype._parseMediaFeatureName=function(){return this._parseModuleMember()||this._parseFunction()||this._parseIdent()||this._parseVariable()},t.prototype._parseKeyframeSelector=function(){return this._tryParseKeyframeSelector()||this._parseControlStatement(this._parseKeyframeSelector.bind(this))||this._parseVariableDeclaration()||this._parseMixinContent()},t.prototype._parseVariable=function(){if(!this.peek(n.VariableName))return null;var e=this.create(o.Variable);return this.consumeToken(),e},t.prototype._parseModuleMember=function(){var e=this.mark(),t=this.create(o.Module);return t.setIdentifier(this._parseIdent([o.ReferenceType.Module]))?this.hasWhitespace()||!this.acceptDelim(".")||this.hasWhitespace()?(this.restoreAtMark(e),null):t.addChild(this._parseVariable()||this._parseFunction())?t:this.finish(t,a.ParseError.IdentifierOrVariableExpected):null},t.prototype._parseIdent=function(e){var t=this;if(!this.peek(r.TokenType.Ident)&&!this.peek(n.InterpolationFunction)&&!this.peekDelim("-"))return null;var i=this.create(o.Identifier);i.referenceTypes=e,i.isCustomProperty=this.peekRegExp(r.TokenType.Ident,/^--/);for(var s,a=!1;(this.accept(r.TokenType.Ident)||i.addChild((s=void 0,s=t.mark(),t.acceptDelim("-")&&(t.hasWhitespace()||t.acceptDelim("-"),t.hasWhitespace())?(t.restoreAtMark(s),null):t._parseInterpolation()))||a&&this.acceptRegexp(/^[\w-]/))&&(a=!0,!this.hasWhitespace()););return a?this.finish(i):null},t.prototype._parseTermExpression=function(){return this._parseModuleMember()||this._parseVariable()||this._parseSelectorCombinator()||e.prototype._parseTermExpression.call(this)},t.prototype._parseInterpolation=function(){if(this.peek(n.InterpolationFunction)){var e=this.create(o.Interpolation);return this.consumeToken(),e.addChild(this._parseExpr())||this._parseSelectorCombinator()?this.accept(r.TokenType.CurlyR)?this.finish(e):this.finish(e,a.ParseError.RightCurlyExpected):this.accept(r.TokenType.CurlyR)?this.finish(e):this.finish(e,a.ParseError.ExpressionExpected)}return null},t.prototype._parseOperator=function(){if(this.peek(n.EqualsOperator)||this.peek(n.NotEqualsOperator)||this.peek(n.GreaterEqualsOperator)||this.peek(n.SmallerEqualsOperator)||this.peekDelim(">")||this.peekDelim("<")||this.peekIdent("and")||this.peekIdent("or")||this.peekDelim("%")){var t=this.createNode(o.NodeType.Operator);return this.consumeToken(),this.finish(t)}return e.prototype._parseOperator.call(this)},t.prototype._parseUnaryOperator=function(){if(this.peekIdent("not")){var t=this.create(o.Node);return this.consumeToken(),this.finish(t)}return e.prototype._parseUnaryOperator.call(this)},t.prototype._parseRuleSetDeclaration=function(){return this.peek(r.TokenType.AtKeyword)?this._parseKeyframe()||this._parseImport()||this._parseMedia(!0)||this._parseFontFace()||this._parseWarnAndDebug()||this._parseControlStatement()||this._parseFunctionDeclaration()||this._parseExtends()||this._parseMixinReference()||this._parseMixinContent()||this._parseMixinDeclaration()||this._parseRuleset(!0)||this._parseSupports(!0)||e.prototype._parseRuleSetDeclarationAtStatement.call(this):this._parseVariableDeclaration()||this._tryParseRuleset(!0)||e.prototype._parseRuleSetDeclaration.call(this)},t.prototype._parseDeclaration=function(e){var t=this._tryParseCustomPropertyDeclaration(e);if(t)return t;var n=this.create(o.Declaration);if(!n.setProperty(this._parseProperty()))return null;if(!this.accept(r.TokenType.Colon))return this.finish(n,a.ParseError.ColonExpected,[r.TokenType.Colon],e||[r.TokenType.SemiColon]);this.prevToken&&(n.colonPosition=this.prevToken.offset);var i=!1;if(n.setValue(this._parseExpr())&&(i=!0,n.addChild(this._parsePrio())),this.peek(r.TokenType.CurlyL))n.setNestedProperties(this._parseNestedProperties());else if(!i)return this.finish(n,a.ParseError.PropertyValueExpected);return this.peek(r.TokenType.SemiColon)&&(n.semicolonPosition=this.token.offset),this.finish(n)},t.prototype._parseNestedProperties=function(){var e=this.create(o.NestedProperties);return this._parseBody(e,this._parseDeclaration.bind(this))},t.prototype._parseExtends=function(){if(this.peekKeyword("@extend")){var e=this.create(o.ExtendsReference);if(this.consumeToken(),!e.getSelectors().addChild(this._parseSimpleSelector()))return this.finish(e,a.ParseError.SelectorExpected);for(;this.accept(r.TokenType.Comma);)e.getSelectors().addChild(this._parseSimpleSelector());return this.accept(r.TokenType.Exclamation)&&!this.acceptIdent("optional")?this.finish(e,a.ParseError.UnknownKeyword):this.finish(e)}return null},t.prototype._parseSimpleSelectorBody=function(){return this._parseSelectorCombinator()||this._parseSelectorPlaceholder()||e.prototype._parseSimpleSelectorBody.call(this)},t.prototype._parseSelectorCombinator=function(){if(this.peekDelim("&")){var e=this.createNode(o.NodeType.SelectorCombinator);for(this.consumeToken();!this.hasWhitespace()&&(this.acceptDelim("-")||this.accept(r.TokenType.Num)||this.accept(r.TokenType.Dimension)||e.addChild(this._parseIdent())||this.acceptDelim("&")););return this.finish(e)}return null},t.prototype._parseSelectorPlaceholder=function(){if(this.peekDelim("%")){var e=this.createNode(o.NodeType.SelectorPlaceholder);return this.consumeToken(),this._parseIdent(),this.finish(e)}if(this.peekKeyword("@at-root")){e=this.createNode(o.NodeType.SelectorPlaceholder);return this.consumeToken(),this.finish(e)}return null},t.prototype._parseElementName=function(){var t=this.mark(),n=e.prototype._parseElementName.call(this);return n&&!this.hasWhitespace()&&this.peek(r.TokenType.ParenthesisL)?(this.restoreAtMark(t),null):n},t.prototype._tryParsePseudoIdentifier=function(){return this._parseInterpolation()||e.prototype._tryParsePseudoIdentifier.call(this)},t.prototype._parseWarnAndDebug=function(){if(!this.peekKeyword("@debug")&&!this.peekKeyword("@warn")&&!this.peekKeyword("@error"))return null;var e=this.createNode(o.NodeType.Debug);return this.consumeToken(),e.addChild(this._parseExpr()),this.finish(e)},t.prototype._parseControlStatement=function(e){return void 0===e&&(e=this._parseRuleSetDeclaration.bind(this)),this.peek(r.TokenType.AtKeyword)?this._parseIfStatement(e)||this._parseForStatement(e)||this._parseEachStatement(e)||this._parseWhileStatement(e):null},t.prototype._parseIfStatement=function(e){return this.peekKeyword("@if")?this._internalParseIfStatement(e):null},t.prototype._internalParseIfStatement=function(e){var t=this.create(o.IfStatement);if(this.consumeToken(),!t.setExpression(this._parseExpr(!0)))return this.finish(t,a.ParseError.ExpressionExpected);if(this._parseBody(t,e),this.acceptKeyword("@else"))if(this.peekIdent("if"))t.setElseClause(this._internalParseIfStatement(e));else if(this.peek(r.TokenType.CurlyL)){var n=this.create(o.ElseStatement);this._parseBody(n,e),t.setElseClause(n)}return this.finish(t)},t.prototype._parseForStatement=function(e){if(!this.peekKeyword("@for"))return null;var t=this.create(o.ForStatement);return this.consumeToken(),t.setVariable(this._parseVariable())?this.acceptIdent("from")?t.addChild(this._parseBinaryExpr())?this.acceptIdent("to")||this.acceptIdent("through")?t.addChild(this._parseBinaryExpr())?this._parseBody(t,e):this.finish(t,a.ParseError.ExpressionExpected,[r.TokenType.CurlyR]):this.finish(t,s.SCSSParseError.ThroughOrToExpected,[r.TokenType.CurlyR]):this.finish(t,a.ParseError.ExpressionExpected,[r.TokenType.CurlyR]):this.finish(t,s.SCSSParseError.FromExpected,[r.TokenType.CurlyR]):this.finish(t,a.ParseError.VariableNameExpected,[r.TokenType.CurlyR])},t.prototype._parseEachStatement=function(e){if(!this.peekKeyword("@each"))return null;var t=this.create(o.EachStatement);this.consumeToken();var n=t.getVariables();if(!n.addChild(this._parseVariable()))return this.finish(t,a.ParseError.VariableNameExpected,[r.TokenType.CurlyR]);for(;this.accept(r.TokenType.Comma);)if(!n.addChild(this._parseVariable()))return this.finish(t,a.ParseError.VariableNameExpected,[r.TokenType.CurlyR]);return this.finish(n),this.acceptIdent("in")?t.addChild(this._parseExpr())?this._parseBody(t,e):this.finish(t,a.ParseError.ExpressionExpected,[r.TokenType.CurlyR]):this.finish(t,s.SCSSParseError.InExpected,[r.TokenType.CurlyR])},t.prototype._parseWhileStatement=function(e){if(!this.peekKeyword("@while"))return null;var t=this.create(o.WhileStatement);return this.consumeToken(),t.addChild(this._parseBinaryExpr())?this._parseBody(t,e):this.finish(t,a.ParseError.ExpressionExpected,[r.TokenType.CurlyR])},t.prototype._parseFunctionBodyDeclaration=function(){return this._parseVariableDeclaration()||this._parseReturnStatement()||this._parseWarnAndDebug()||this._parseControlStatement(this._parseFunctionBodyDeclaration.bind(this))},t.prototype._parseFunctionDeclaration=function(){if(!this.peekKeyword("@function"))return null;var e=this.create(o.FunctionDeclaration);if(this.consumeToken(),!e.setIdentifier(this._parseIdent([o.ReferenceType.Function])))return this.finish(e,a.ParseError.IdentifierExpected,[r.TokenType.CurlyR]);if(!this.accept(r.TokenType.ParenthesisL))return this.finish(e,a.ParseError.LeftParenthesisExpected,[r.TokenType.CurlyR]);if(e.getParameters().addChild(this._parseParameterDeclaration()))for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);return this.accept(r.TokenType.ParenthesisR)?this._parseBody(e,this._parseFunctionBodyDeclaration.bind(this)):this.finish(e,a.ParseError.RightParenthesisExpected,[r.TokenType.CurlyR])},t.prototype._parseReturnStatement=function(){if(!this.peekKeyword("@return"))return null;var e=this.createNode(o.NodeType.ReturnStatement);return this.consumeToken(),e.addChild(this._parseExpr())?this.finish(e):this.finish(e,a.ParseError.ExpressionExpected)},t.prototype._parseMixinDeclaration=function(){if(!this.peekKeyword("@mixin"))return null;var e=this.create(o.MixinDeclaration);if(this.consumeToken(),!e.setIdentifier(this._parseIdent([o.ReferenceType.Mixin])))return this.finish(e,a.ParseError.IdentifierExpected,[r.TokenType.CurlyR]);if(this.accept(r.TokenType.ParenthesisL)){if(e.getParameters().addChild(this._parseParameterDeclaration()))for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,a.ParseError.RightParenthesisExpected,[r.TokenType.CurlyR])}return this._parseBody(e,this._parseRuleSetDeclaration.bind(this))},t.prototype._parseParameterDeclaration=function(){var e=this.create(o.FunctionParameter);return e.setIdentifier(this._parseVariable())?(this.accept(n.Ellipsis),this.accept(r.TokenType.Colon)&&!e.setDefaultValue(this._parseExpr(!0))?this.finish(e,a.ParseError.VariableValueExpected,[],[r.TokenType.Comma,r.TokenType.ParenthesisR]):this.finish(e)):null},t.prototype._parseMixinContent=function(){if(!this.peekKeyword("@content"))return null;var e=this.create(o.MixinContentReference);if(this.consumeToken(),this.accept(r.TokenType.ParenthesisL)){if(e.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getArguments().addChild(this._parseFunctionArgument()))return this.finish(e,a.ParseError.ExpressionExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,a.ParseError.RightParenthesisExpected)}return this.finish(e)},t.prototype._parseMixinReference=function(){if(!this.peekKeyword("@include"))return null;var e=this.create(o.MixinReference);this.consumeToken();var t=this._parseIdent([o.ReferenceType.Mixin]);if(!e.setIdentifier(t))return this.finish(e,a.ParseError.IdentifierExpected,[r.TokenType.CurlyR]);if(!this.hasWhitespace()&&this.acceptDelim(".")&&!this.hasWhitespace()){var n=this._parseIdent([o.ReferenceType.Mixin]);if(!n)return this.finish(e,a.ParseError.IdentifierExpected,[r.TokenType.CurlyR]);var i=this.create(o.Module);t.referenceTypes=[o.ReferenceType.Module],i.setIdentifier(t),e.setIdentifier(n),e.addChild(i)}if(this.accept(r.TokenType.ParenthesisL)){if(e.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getArguments().addChild(this._parseFunctionArgument()))return this.finish(e,a.ParseError.ExpressionExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,a.ParseError.RightParenthesisExpected)}return(this.peekIdent("using")||this.peek(r.TokenType.CurlyL))&&e.setContent(this._parseMixinContentDeclaration()),this.finish(e)},t.prototype._parseMixinContentDeclaration=function(){var e=this.create(o.MixinContentDeclaration);if(this.acceptIdent("using")){if(!this.accept(r.TokenType.ParenthesisL))return this.finish(e,a.ParseError.LeftParenthesisExpected,[r.TokenType.CurlyL]);if(e.getParameters().addChild(this._parseParameterDeclaration()))for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,a.ParseError.RightParenthesisExpected,[r.TokenType.CurlyL])}return this.peek(r.TokenType.CurlyL)&&this._parseBody(e,this._parseMixinReferenceBodyStatement.bind(this)),this.finish(e)},t.prototype._parseMixinReferenceBodyStatement=function(){return this._tryParseKeyframeSelector()||this._parseRuleSetDeclaration()},t.prototype._parseFunctionArgument=function(){var e=this.create(o.FunctionArgument),t=this.mark(),i=this._parseVariable();if(i)if(this.accept(r.TokenType.Colon))e.setIdentifier(i);else{if(this.accept(n.Ellipsis))return e.setValue(i),this.finish(e);this.restoreAtMark(t)}return e.setValue(this._parseExpr(!0))?(this.accept(n.Ellipsis),e.addChild(this._parsePrio()),this.finish(e)):e.setValue(this._tryParsePrio())?this.finish(e):null},t.prototype._parseURLArgument=function(){var t=this.mark(),n=e.prototype._parseURLArgument.call(this);if(!n||!this.peek(r.TokenType.ParenthesisR)){this.restoreAtMark(t);var i=this.create(o.Node);return i.addChild(this._parseBinaryExpr()),this.finish(i)}return n},t.prototype._parseOperation=function(){if(!this.peek(r.TokenType.ParenthesisL))return null;var e=this.create(o.Node);for(this.consumeToken();e.addChild(this._parseListElement());)this.accept(r.TokenType.Comma);return this.accept(r.TokenType.ParenthesisR)?this.finish(e):this.finish(e,a.ParseError.RightParenthesisExpected)},t.prototype._parseListElement=function(){var e=this.create(o.ListEntry),t=this._parseBinaryExpr();if(!t)return null;if(this.accept(r.TokenType.Colon)){if(e.setKey(t),!e.setValue(this._parseBinaryExpr()))return this.finish(e,a.ParseError.ExpressionExpected)}else e.setValue(t);return this.finish(e)},t.prototype._parseUse=function(){if(!this.peekKeyword("@use"))return null;var e=this.create(o.Use);if(this.consumeToken(),!e.addChild(this._parseStringLiteral()))return this.finish(e,a.ParseError.StringLiteralExpected);if(!this.peek(r.TokenType.SemiColon)&&!this.peek(r.TokenType.EOF)){if(!this.peekRegExp(r.TokenType.Ident,/as|with/))return this.finish(e,a.ParseError.UnknownKeyword);if(this.acceptIdent("as")&&!e.setIdentifier(this._parseIdent([o.ReferenceType.Module]))&&!this.acceptDelim("*"))return this.finish(e,a.ParseError.IdentifierOrWildcardExpected);if(this.acceptIdent("with")){if(!this.accept(r.TokenType.ParenthesisL))return this.finish(e,a.ParseError.LeftParenthesisExpected,[r.TokenType.ParenthesisR]);if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,a.ParseError.RightParenthesisExpected)}}return this.accept(r.TokenType.SemiColon)||this.accept(r.TokenType.EOF)?this.finish(e):this.finish(e,a.ParseError.SemiColonExpected)},t.prototype._parseModuleConfigDeclaration=function(){var e=this.create(o.ModuleConfiguration);return e.setIdentifier(this._parseVariable())?this.accept(r.TokenType.Colon)&&e.setValue(this._parseExpr(!0))?!this.accept(r.TokenType.Exclamation)||!this.hasWhitespace()&&this.acceptIdent("default")?this.finish(e):this.finish(e,a.ParseError.UnknownKeyword):this.finish(e,a.ParseError.VariableValueExpected,[],[r.TokenType.Comma,r.TokenType.ParenthesisR]):null},t.prototype._parseForward=function(){if(!this.peekKeyword("@forward"))return null;var e=this.create(o.Forward);if(this.consumeToken(),!e.addChild(this._parseStringLiteral()))return this.finish(e,a.ParseError.StringLiteralExpected);if(this.acceptIdent("with")){if(!this.accept(r.TokenType.ParenthesisL))return this.finish(e,a.ParseError.LeftParenthesisExpected,[r.TokenType.ParenthesisR]);if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);for(;this.accept(r.TokenType.Comma)&&!this.peek(r.TokenType.ParenthesisR);)if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,a.ParseError.VariableNameExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,a.ParseError.RightParenthesisExpected)}if(!this.peek(r.TokenType.SemiColon)&&!this.peek(r.TokenType.EOF)){if(!this.peekRegExp(r.TokenType.Ident,/as|hide|show/))return this.finish(e,a.ParseError.UnknownKeyword);if(this.acceptIdent("as")){var t=this._parseIdent([o.ReferenceType.Forward]);if(!e.setIdentifier(t))return this.finish(e,a.ParseError.IdentifierExpected);if(this.hasWhitespace()||!this.acceptDelim("*"))return this.finish(e,a.ParseError.WildcardExpected)}if((this.peekIdent("hide")||this.peekIdent("show"))&&!e.addChild(this._parseForwardVisibility()))return this.finish(e,a.ParseError.IdentifierOrVariableExpected)}return this.accept(r.TokenType.SemiColon)||this.accept(r.TokenType.EOF)?this.finish(e):this.finish(e,a.ParseError.SemiColonExpected)},t.prototype._parseForwardVisibility=function(){var e=this.create(o.ForwardVisibility);for(e.setIdentifier(this._parseIdent());e.addChild(this._parseVariable()||this._parseIdent());)this.accept(r.TokenType.Comma);return e.getChildren().length>1?e:null},t.prototype._parseSupportsCondition=function(){return this._parseInterpolation()||e.prototype._parseSupportsCondition.call(this)},t}(i.Parser);t.SCSSParser=l}));__extends=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();!function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/services/scssCompletion",["require","exports","./cssCompletion","../parser/cssNodes","../cssLanguageTypes","vscode-nls"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SCSSCompletion=void 0;var n=e("./cssCompletion"),r=e("../parser/cssNodes"),i=e("../cssLanguageTypes"),o=e("vscode-nls").loadMessageBundle(),s=function(e){function t(n,r){var i=e.call(this,"$",n,r)||this;return a(t.scssModuleLoaders),a(t.scssModuleBuiltIns),i}return __extends(t,e),t.prototype.isImportPathParent=function(t){return t===r.NodeType.Forward||t===r.NodeType.Use||e.prototype.isImportPathParent.call(this,t)},t.prototype.getCompletionForImportPath=function(n,o){var s=n.getParent().type;if(s===r.NodeType.Forward||s===r.NodeType.Use)for(var a=0,l=t.scssModuleBuiltIns;a0){var t="string"==typeof e.documentation?{kind:"markdown",value:e.documentation}:{kind:"markdown",value:e.documentation.value};t.value+="\n\n",t.value+=e.references.map((function(e){return"["+e.name+"]("+e.url+")"})).join(" | "),e.documentation=t}}))}t.SCSSCompletion=s}));__extends=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();!function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/parser/lessScanner",["require","exports","./cssScanner"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LESSScanner=t.Ellipsis=void 0;var n=e("./cssScanner"),r="/".charCodeAt(0),i="\n".charCodeAt(0),o="\r".charCodeAt(0),s="\f".charCodeAt(0),a="`".charCodeAt(0),l=".".charCodeAt(0),c=n.TokenType.CustomToken;t.Ellipsis=c++;var d=function(e){function c(){return null!==e&&e.apply(this,arguments)||this}return __extends(c,e),c.prototype.scanNext=function(n){var r=this.escapedJavaScript();return null!==r?this.finishToken(n,r):this.stream.advanceIfChars([l,l,l])?this.finishToken(n,t.Ellipsis):e.prototype.scanNext.call(this,n)},c.prototype.comment=function(){return!!e.prototype.comment.call(this)||!(this.inURL||!this.stream.advanceIfChars([r,r]))&&(this.stream.advanceWhileChar((function(e){switch(e){case i:case o:case s:return!1;default:return!0}})),!0)},c.prototype.escapedJavaScript=function(){return this.stream.peekChar()===a?(this.stream.advance(1),this.stream.advanceWhileChar((function(e){return e!==a})),this.stream.advanceIfChar(a)?n.TokenType.EscapedJavaScript:n.TokenType.BadEscapedJavaScript):null},c}(n.Scanner);t.LESSScanner=d}));__extends=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();!function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/parser/lessParser",["require","exports","./lessScanner","./cssScanner","./cssParser","./cssNodes","./cssErrors"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LESSParser=void 0;var n=e("./lessScanner"),r=e("./cssScanner"),i=e("./cssParser"),o=e("./cssNodes"),s=e("./cssErrors"),a=function(e){function t(){return e.call(this,new n.LESSScanner)||this}return __extends(t,e),t.prototype._parseStylesheetStatement=function(t){return void 0===t&&(t=!1),this.peek(r.TokenType.AtKeyword)?this._parseVariableDeclaration()||this._parsePlugin()||e.prototype._parseStylesheetAtStatement.call(this,t):this._tryParseMixinDeclaration()||this._tryParseMixinReference()||this._parseFunction()||this._parseRuleset(!0)},t.prototype._parseImport=function(){if(!this.peekKeyword("@import")&&!this.peekKeyword("@import-once"))return null;var e=this.create(o.Import);if(this.consumeToken(),this.accept(r.TokenType.ParenthesisL)){if(!this.accept(r.TokenType.Ident))return this.finish(e,s.ParseError.IdentifierExpected,[r.TokenType.SemiColon]);do{if(!this.accept(r.TokenType.Comma))break}while(this.accept(r.TokenType.Ident));if(!this.accept(r.TokenType.ParenthesisR))return this.finish(e,s.ParseError.RightParenthesisExpected,[r.TokenType.SemiColon])}return e.addChild(this._parseURILiteral())||e.addChild(this._parseStringLiteral())?(this.peek(r.TokenType.SemiColon)||this.peek(r.TokenType.EOF)||e.setMedialist(this._parseMediaQueryList()),this.finish(e)):this.finish(e,s.ParseError.URIOrStringExpected,[r.TokenType.SemiColon])},t.prototype._parsePlugin=function(){if(!this.peekKeyword("@plugin"))return null;var e=this.createNode(o.NodeType.Plugin);return this.consumeToken(),e.addChild(this._parseStringLiteral())?this.accept(r.TokenType.SemiColon)?this.finish(e):this.finish(e,s.ParseError.SemiColonExpected):this.finish(e,s.ParseError.StringLiteralExpected)},t.prototype._parseMediaQuery=function(t){var n=e.prototype._parseMediaQuery.call(this,t);if(!n){var r=this.create(o.MediaQuery);return r.addChild(this._parseVariable())?this.finish(r):null}return n},t.prototype._parseMediaDeclaration=function(e){return void 0===e&&(e=!1),this._tryParseRuleset(e)||this._tryToParseDeclaration()||this._tryParseMixinDeclaration()||this._tryParseMixinReference()||this._parseDetachedRuleSetMixin()||this._parseStylesheetStatement(e)},t.prototype._parseMediaFeatureName=function(){return this._parseIdent()||this._parseVariable()},t.prototype._parseVariableDeclaration=function(e){void 0===e&&(e=[]);var t=this.create(o.VariableDeclaration),n=this.mark();if(!t.setVariable(this._parseVariable(!0)))return null;if(!this.accept(r.TokenType.Colon))return this.restoreAtMark(n),null;if(this.prevToken&&(t.colonPosition=this.prevToken.offset),t.setValue(this._parseDetachedRuleSet()))t.needsSemicolon=!1;else if(!t.setValue(this._parseExpr()))return this.finish(t,s.ParseError.VariableValueExpected,[],e);return t.addChild(this._parsePrio()),this.peek(r.TokenType.SemiColon)&&(t.semicolonPosition=this.token.offset),this.finish(t)},t.prototype._parseDetachedRuleSet=function(){var e=this.mark();if(this.peekDelim("#")||this.peekDelim(".")){if(this.consumeToken(),this.hasWhitespace()||!this.accept(r.TokenType.ParenthesisL))return this.restoreAtMark(e),null;var t=this.create(o.MixinDeclaration);if(t.getParameters().addChild(this._parseMixinParameter()))for(;(this.accept(r.TokenType.Comma)||this.accept(r.TokenType.SemiColon))&&!this.peek(r.TokenType.ParenthesisR);)t.getParameters().addChild(this._parseMixinParameter())||this.markError(t,s.ParseError.IdentifierExpected,[],[r.TokenType.ParenthesisR]);if(!this.accept(r.TokenType.ParenthesisR))return this.restoreAtMark(e),null}if(!this.peek(r.TokenType.CurlyL))return null;var n=this.create(o.BodyDeclaration);return this._parseBody(n,this._parseDetachedRuleSetBody.bind(this)),this.finish(n)},t.prototype._parseDetachedRuleSetBody=function(){return this._tryParseKeyframeSelector()||this._parseRuleSetDeclaration()},t.prototype._addLookupChildren=function(e){if(!e.addChild(this._parseLookupValue()))return!1;for(var t=!1;this.peek(r.TokenType.BracketL)&&(t=!0),e.addChild(this._parseLookupValue());)t=!1;return!t},t.prototype._parseLookupValue=function(){var e=this.create(o.Node),t=this.mark();return this.accept(r.TokenType.BracketL)&&((e.addChild(this._parseVariable(!1,!0))||e.addChild(this._parsePropertyIdentifier()))&&this.accept(r.TokenType.BracketR)||this.accept(r.TokenType.BracketR))?e:(this.restoreAtMark(t),null)},t.prototype._parseVariable=function(e,t){void 0===e&&(e=!1),void 0===t&&(t=!1);var n=!e&&this.peekDelim("$");if(!this.peekDelim("@")&&!n&&!this.peek(r.TokenType.AtKeyword))return null;for(var i=this.create(o.Variable),s=this.mark();this.acceptDelim("@")||!e&&this.acceptDelim("$");)if(this.hasWhitespace())return this.restoreAtMark(s),null;return(this.accept(r.TokenType.AtKeyword)||this.accept(r.TokenType.Ident))&&(t||!this.peek(r.TokenType.BracketL)||this._addLookupChildren(i))?i:(this.restoreAtMark(s),null)},t.prototype._parseTermExpression=function(){return this._parseVariable()||this._parseEscaped()||e.prototype._parseTermExpression.call(this)||this._tryParseMixinReference(!1)},t.prototype._parseEscaped=function(){if(this.peek(r.TokenType.EscapedJavaScript)||this.peek(r.TokenType.BadEscapedJavaScript)){var e=this.createNode(o.NodeType.EscapedValue);return this.consumeToken(),this.finish(e)}if(this.peekDelim("~")){e=this.createNode(o.NodeType.EscapedValue);return this.consumeToken(),this.accept(r.TokenType.String)||this.accept(r.TokenType.EscapedJavaScript)?this.finish(e):this.finish(e,s.ParseError.TermExpected)}return null},t.prototype._parseOperator=function(){var t=this._parseGuardOperator();return t||e.prototype._parseOperator.call(this)},t.prototype._parseGuardOperator=function(){if(this.peekDelim(">")){var e=this.createNode(o.NodeType.Operator);return this.consumeToken(),this.acceptDelim("="),e}if(this.peekDelim("=")){e=this.createNode(o.NodeType.Operator);return this.consumeToken(),this.acceptDelim("<"),e}if(this.peekDelim("<")){e=this.createNode(o.NodeType.Operator);return this.consumeToken(),this.acceptDelim("="),e}return null},t.prototype._parseRuleSetDeclaration=function(){return this.peek(r.TokenType.AtKeyword)?this._parseKeyframe()||this._parseMedia(!0)||this._parseImport()||this._parseSupports(!0)||this._parseDetachedRuleSetMixin()||this._parseVariableDeclaration()||e.prototype._parseRuleSetDeclarationAtStatement.call(this):this._tryParseMixinDeclaration()||this._tryParseRuleset(!0)||this._tryParseMixinReference()||this._parseFunction()||this._parseExtend()||e.prototype._parseRuleSetDeclaration.call(this)},t.prototype._parseKeyframeIdent=function(){return this._parseIdent([o.ReferenceType.Keyframe])||this._parseVariable()},t.prototype._parseKeyframeSelector=function(){return this._parseDetachedRuleSetMixin()||e.prototype._parseKeyframeSelector.call(this)},t.prototype._parseSimpleSelectorBody=function(){return this._parseSelectorCombinator()||e.prototype._parseSimpleSelectorBody.call(this)},t.prototype._parseSelector=function(e){var t=this.create(o.Selector),n=!1;for(e&&(n=t.addChild(this._parseCombinator()));t.addChild(this._parseSimpleSelector());){n=!0;var i=this.mark();if(t.addChild(this._parseGuard())&&this.peek(r.TokenType.CurlyL))break;this.restoreAtMark(i),t.addChild(this._parseCombinator())}return n?this.finish(t):null},t.prototype._parseSelectorCombinator=function(){if(this.peekDelim("&")){var e=this.createNode(o.NodeType.SelectorCombinator);for(this.consumeToken();!this.hasWhitespace()&&(this.acceptDelim("-")||this.accept(r.TokenType.Num)||this.accept(r.TokenType.Dimension)||e.addChild(this._parseIdent())||this.acceptDelim("&")););return this.finish(e)}return null},t.prototype._parseSelectorIdent=function(){if(!this.peekInterpolatedIdent())return null;var e=this.createNode(o.NodeType.SelectorInterpolation);return this._acceptInterpolatedIdent(e)?this.finish(e):null},t.prototype._parsePropertyIdentifier=function(e){void 0===e&&(e=!1);var t=/^[\w-]+/;if(!this.peekInterpolatedIdent()&&!this.peekRegExp(this.token.type,t))return null;var n=this.mark(),r=this.create(o.Identifier);r.isCustomProperty=this.acceptDelim("-")&&this.acceptDelim("-");return(e?r.isCustomProperty?r.addChild(this._parseIdent()):r.addChild(this._parseRegexp(t)):r.isCustomProperty?this._acceptInterpolatedIdent(r):this._acceptInterpolatedIdent(r,t))?(e||this.hasWhitespace()||(this.acceptDelim("+"),this.hasWhitespace()||this.acceptIdent("_")),this.finish(r)):(this.restoreAtMark(n),null)},t.prototype.peekInterpolatedIdent=function(){return this.peek(r.TokenType.Ident)||this.peekDelim("@")||this.peekDelim("$")||this.peekDelim("-")},t.prototype._acceptInterpolatedIdent=function(e,t){for(var n=this,i=!1,o=function(){var e=n.mark();return n.acceptDelim("-")&&(n.hasWhitespace()||n.acceptDelim("-"),n.hasWhitespace())?(n.restoreAtMark(e),null):n._parseInterpolation()},s=t?function(){return n.acceptRegexp(t)}:function(){return n.accept(r.TokenType.Ident)};(s()||e.addChild(this._parseInterpolation()||this.try(o)))&&(i=!0,!this.hasWhitespace()););return i},t.prototype._parseInterpolation=function(){var e=this.mark();if(this.peekDelim("@")||this.peekDelim("$")){var t=this.createNode(o.NodeType.Interpolation);return this.consumeToken(),this.hasWhitespace()||!this.accept(r.TokenType.CurlyL)?(this.restoreAtMark(e),null):t.addChild(this._parseIdent())?this.accept(r.TokenType.CurlyR)?this.finish(t):this.finish(t,s.ParseError.RightCurlyExpected):this.finish(t,s.ParseError.IdentifierExpected)}return null},t.prototype._tryParseMixinDeclaration=function(){var e=this.mark(),t=this.create(o.MixinDeclaration);if(!t.setIdentifier(this._parseMixinDeclarationIdentifier())||!this.accept(r.TokenType.ParenthesisL))return this.restoreAtMark(e),null;if(t.getParameters().addChild(this._parseMixinParameter()))for(;(this.accept(r.TokenType.Comma)||this.accept(r.TokenType.SemiColon))&&!this.peek(r.TokenType.ParenthesisR);)t.getParameters().addChild(this._parseMixinParameter())||this.markError(t,s.ParseError.IdentifierExpected,[],[r.TokenType.ParenthesisR]);return this.accept(r.TokenType.ParenthesisR)?(t.setGuard(this._parseGuard()),this.peek(r.TokenType.CurlyL)?this._parseBody(t,this._parseMixInBodyDeclaration.bind(this)):(this.restoreAtMark(e),null)):(this.restoreAtMark(e),null)},t.prototype._parseMixInBodyDeclaration=function(){return this._parseFontFace()||this._parseRuleSetDeclaration()},t.prototype._parseMixinDeclarationIdentifier=function(){var e;if(this.peekDelim("#")||this.peekDelim(".")){if(e=this.create(o.Identifier),this.consumeToken(),this.hasWhitespace()||!e.addChild(this._parseIdent()))return null}else{if(!this.peek(r.TokenType.Hash))return null;e=this.create(o.Identifier),this.consumeToken()}return e.referenceTypes=[o.ReferenceType.Mixin],this.finish(e)},t.prototype._parsePseudo=function(){if(!this.peek(r.TokenType.Colon))return null;var t=this.mark(),n=this.create(o.ExtendsReference);return this.consumeToken(),this.acceptIdent("extend")?this._completeExtends(n):(this.restoreAtMark(t),e.prototype._parsePseudo.call(this))},t.prototype._parseExtend=function(){if(!this.peekDelim("&"))return null;var e=this.mark(),t=this.create(o.ExtendsReference);return this.consumeToken(),!this.hasWhitespace()&&this.accept(r.TokenType.Colon)&&this.acceptIdent("extend")?this._completeExtends(t):(this.restoreAtMark(e),null)},t.prototype._completeExtends=function(e){if(!this.accept(r.TokenType.ParenthesisL))return this.finish(e,s.ParseError.LeftParenthesisExpected);var t=e.getSelectors();if(!t.addChild(this._parseSelector(!0)))return this.finish(e,s.ParseError.SelectorExpected);for(;this.accept(r.TokenType.Comma);)if(!t.addChild(this._parseSelector(!0)))return this.finish(e,s.ParseError.SelectorExpected);return this.accept(r.TokenType.ParenthesisR)?this.finish(e):this.finish(e,s.ParseError.RightParenthesisExpected)},t.prototype._parseDetachedRuleSetMixin=function(){if(!this.peek(r.TokenType.AtKeyword))return null;var e=this.mark(),t=this.create(o.MixinReference);return!t.addChild(this._parseVariable(!0))||!this.hasWhitespace()&&this.accept(r.TokenType.ParenthesisL)?this.accept(r.TokenType.ParenthesisR)?this.finish(t):this.finish(t,s.ParseError.RightParenthesisExpected):(this.restoreAtMark(e),null)},t.prototype._tryParseMixinReference=function(e){void 0===e&&(e=!0);for(var t=this.mark(),n=this.create(o.MixinReference),i=this._parseMixinDeclarationIdentifier();i;){this.acceptDelim(">");var a=this._parseMixinDeclarationIdentifier();if(!a)break;n.getNamespaces().addChild(i),i=a}if(!n.setIdentifier(i))return this.restoreAtMark(t),null;var l=!1;if(this.accept(r.TokenType.ParenthesisL)){if(l=!0,n.getArguments().addChild(this._parseMixinArgument()))for(;(this.accept(r.TokenType.Comma)||this.accept(r.TokenType.SemiColon))&&!this.peek(r.TokenType.ParenthesisR);)if(!n.getArguments().addChild(this._parseMixinArgument()))return this.finish(n,s.ParseError.ExpressionExpected);if(!this.accept(r.TokenType.ParenthesisR))return this.finish(n,s.ParseError.RightParenthesisExpected);i.referenceTypes=[o.ReferenceType.Mixin]}else i.referenceTypes=[o.ReferenceType.Mixin,o.ReferenceType.Rule];return this.peek(r.TokenType.BracketL)?e||this._addLookupChildren(n):n.addChild(this._parsePrio()),l||this.peek(r.TokenType.SemiColon)||this.peek(r.TokenType.CurlyR)||this.peek(r.TokenType.EOF)?this.finish(n):(this.restoreAtMark(t),null)},t.prototype._parseMixinArgument=function(){var e=this.create(o.FunctionArgument),t=this.mark(),n=this._parseVariable();return n&&(this.accept(r.TokenType.Colon)?e.setIdentifier(n):this.restoreAtMark(t)),e.setValue(this._parseDetachedRuleSet()||this._parseExpr(!0))?this.finish(e):(this.restoreAtMark(t),null)},t.prototype._parseMixinParameter=function(){var e=this.create(o.FunctionParameter);if(this.peekKeyword("@rest")){var t=this.create(o.Node);return this.consumeToken(),this.accept(n.Ellipsis)?(e.setIdentifier(this.finish(t)),this.finish(e)):this.finish(e,s.ParseError.DotExpected,[],[r.TokenType.Comma,r.TokenType.ParenthesisR])}if(this.peek(n.Ellipsis)){var i=this.create(o.Node);return this.consumeToken(),e.setIdentifier(this.finish(i)),this.finish(e)}var a=!1;return e.setIdentifier(this._parseVariable())&&(this.accept(r.TokenType.Colon),a=!0),e.setDefaultValue(this._parseDetachedRuleSet()||this._parseExpr(!0))||a?this.finish(e):null},t.prototype._parseGuard=function(){if(!this.peekIdent("when"))return null;var e=this.create(o.LessGuard);if(this.consumeToken(),e.isNegated=this.acceptIdent("not"),!e.getConditions().addChild(this._parseGuardCondition()))return this.finish(e,s.ParseError.ConditionExpected);for(;this.acceptIdent("and")||this.accept(r.TokenType.Comma);)if(!e.getConditions().addChild(this._parseGuardCondition()))return this.finish(e,s.ParseError.ConditionExpected);return this.finish(e)},t.prototype._parseGuardCondition=function(){if(!this.peek(r.TokenType.ParenthesisL))return null;var e=this.create(o.GuardCondition);return this.consumeToken(),e.addChild(this._parseExpr()),this.accept(r.TokenType.ParenthesisR)?this.finish(e):this.finish(e,s.ParseError.RightParenthesisExpected)},t.prototype._parseFunction=function(){var e=this.mark(),t=this.create(o.Function);if(!t.setIdentifier(this._parseFunctionIdentifier()))return null;if(this.hasWhitespace()||!this.accept(r.TokenType.ParenthesisL))return this.restoreAtMark(e),null;if(t.getArguments().addChild(this._parseMixinArgument()))for(;(this.accept(r.TokenType.Comma)||this.accept(r.TokenType.SemiColon))&&!this.peek(r.TokenType.ParenthesisR);)if(!t.getArguments().addChild(this._parseMixinArgument()))return this.finish(t,s.ParseError.ExpressionExpected);return this.accept(r.TokenType.ParenthesisR)?this.finish(t):this.finish(t,s.ParseError.RightParenthesisExpected)},t.prototype._parseFunctionIdentifier=function(){if(this.peekDelim("%")){var t=this.create(o.Identifier);return t.referenceTypes=[o.ReferenceType.Function],this.consumeToken(),this.finish(t)}return e.prototype._parseFunctionIdentifier.call(this)},t.prototype._parseURLArgument=function(){var t=this.mark(),n=e.prototype._parseURLArgument.call(this);if(!n||!this.peek(r.TokenType.ParenthesisR)){this.restoreAtMark(t);var i=this.create(o.Node);return i.addChild(this._parseBinaryExpr()),this.finish(i)}return n},t}(i.Parser);t.LESSParser=a}));__extends=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();!function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/services/lessCompletion",["require","exports","./cssCompletion","../cssLanguageTypes","vscode-nls"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LESSCompletion=void 0;var n=e("./cssCompletion"),r=e("../cssLanguageTypes"),i=e("vscode-nls").loadMessageBundle(),o=function(e){function t(t,n){return e.call(this,"@",t,n)||this}return __extends(t,e),t.prototype.createFunctionProposals=function(e,t,n,i){for(var o=0,s=e;o 50%"),example:"percentage(@number);",type:"percentage"},{name:"round",description:i("less.builtin.round","rounds a number to a number of places"),example:"round(number, [places: 0]);"},{name:"sqrt",description:i("less.builtin.sqrt","calculates square root of a number"),example:"sqrt(number);"},{name:"sin",description:i("less.builtin.sin","sine function"),example:"sin(number);"},{name:"tan",description:i("less.builtin.tan","tangent function"),example:"tan(number);"},{name:"atan",description:i("less.builtin.atan","arctangent - inverse of tangent function"),example:"atan(number);"},{name:"pi",description:i("less.builtin.pi","returns pi"),example:"pi();"},{name:"pow",description:i("less.builtin.pow","first argument raised to the power of the second argument"),example:"pow(@base, @exponent);"},{name:"mod",description:i("less.builtin.mod","first argument modulus second argument"),example:"mod(number, number);"},{name:"min",description:i("less.builtin.min","returns the lowest of one or more values"),example:"min(@x, @y);"},{name:"max",description:i("less.builtin.max","returns the lowest of one or more values"),example:"max(@x, @y);"}],t.colorProposals=[{name:"argb",example:"argb(@color);",description:i("less.builtin.argb","creates a #AARRGGBB")},{name:"hsl",example:"hsl(@hue, @saturation, @lightness);",description:i("less.builtin.hsl","creates a color")},{name:"hsla",example:"hsla(@hue, @saturation, @lightness, @alpha);",description:i("less.builtin.hsla","creates a color")},{name:"hsv",example:"hsv(@hue, @saturation, @value);",description:i("less.builtin.hsv","creates a color")},{name:"hsva",example:"hsva(@hue, @saturation, @value, @alpha);",description:i("less.builtin.hsva","creates a color")},{name:"hue",example:"hue(@color);",description:i("less.builtin.hue","returns the `hue` channel of `@color` in the HSL space")},{name:"saturation",example:"saturation(@color);",description:i("less.builtin.saturation","returns the `saturation` channel of `@color` in the HSL space")},{name:"lightness",example:"lightness(@color);",description:i("less.builtin.lightness","returns the `lightness` channel of `@color` in the HSL space")},{name:"hsvhue",example:"hsvhue(@color);",description:i("less.builtin.hsvhue","returns the `hue` channel of `@color` in the HSV space")},{name:"hsvsaturation",example:"hsvsaturation(@color);",description:i("less.builtin.hsvsaturation","returns the `saturation` channel of `@color` in the HSV space")},{name:"hsvvalue",example:"hsvvalue(@color);",description:i("less.builtin.hsvvalue","returns the `value` channel of `@color` in the HSV space")},{name:"red",example:"red(@color);",description:i("less.builtin.red","returns the `red` channel of `@color`")},{name:"green",example:"green(@color);",description:i("less.builtin.green","returns the `green` channel of `@color`")},{name:"blue",example:"blue(@color);",description:i("less.builtin.blue","returns the `blue` channel of `@color`")},{name:"alpha",example:"alpha(@color);",description:i("less.builtin.alpha","returns the `alpha` channel of `@color`")},{name:"luma",example:"luma(@color);",description:i("less.builtin.luma","returns the `luma` value (perceptual brightness) of `@color`")},{name:"saturate",example:"saturate(@color, 10%);",description:i("less.builtin.saturate","return `@color` 10% points more saturated")},{name:"desaturate",example:"desaturate(@color, 10%);",description:i("less.builtin.desaturate","return `@color` 10% points less saturated")},{name:"lighten",example:"lighten(@color, 10%);",description:i("less.builtin.lighten","return `@color` 10% points lighter")},{name:"darken",example:"darken(@color, 10%);",description:i("less.builtin.darken","return `@color` 10% points darker")},{name:"fadein",example:"fadein(@color, 10%);",description:i("less.builtin.fadein","return `@color` 10% points less transparent")},{name:"fadeout",example:"fadeout(@color, 10%);",description:i("less.builtin.fadeout","return `@color` 10% points more transparent")},{name:"fade",example:"fade(@color, 50%);",description:i("less.builtin.fade","return `@color` with 50% transparency")},{name:"spin",example:"spin(@color, 10);",description:i("less.builtin.spin","return `@color` with a 10 degree larger in hue")},{name:"mix",example:"mix(@color1, @color2, [@weight: 50%]);",description:i("less.builtin.mix","return a mix of `@color1` and `@color2`")},{name:"greyscale",example:"greyscale(@color);",description:i("less.builtin.greyscale","returns a grey, 100% desaturated color")},{name:"contrast",example:"contrast(@color1, [@darkcolor: black], [@lightcolor: white], [@threshold: 43%]);",description:i("less.builtin.contrast","return `@darkcolor` if `@color1 is> 43% luma` otherwise return `@lightcolor`, see notes")},{name:"multiply",example:"multiply(@color1, @color2);"},{name:"screen",example:"screen(@color1, @color2);"},{name:"overlay",example:"overlay(@color1, @color2);"},{name:"softlight",example:"softlight(@color1, @color2);"},{name:"hardlight",example:"hardlight(@color1, @color2);"},{name:"difference",example:"difference(@color1, @color2);"},{name:"exclusion",example:"exclusion(@color1, @color2);"},{name:"average",example:"average(@color1, @color2);"},{name:"negation",example:"negation(@color1, @color2);"}],t}(n.CSSCompletion);t.LESSCompletion=o})),function(e){if("object"==typeof module&&"object"==typeof module.exports){var t=e(require,exports);void 0!==t&&(module.exports=t)}else"function"==typeof define&&define.amd&&define("vscode-css-languageservice/services/cssFolding",["require","exports","../parser/cssScanner","../parser/scssScanner","../parser/lessScanner"],e)}((function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getFoldingRanges=void 0;var n=e("../parser/cssScanner"),r=e("../parser/scssScanner"),i=e("../parser/lessScanner");function o(e,t){if(0===e.length)return null;for(var n=e.length-1;n>=0;n--)if(e[n].type===t&&e[n].isStart)return e.splice(n,1)[0];return null}t.getFoldingRanges=function(e,t){return function(e,t){var n=t&&t.rangeLimit||Number.MAX_VALUE,r=e.sort((function(e,t){var n=e.startLine-t.startLine;return 0===n&&(n=e.endLine-t.endLine),n})),i=[],o=-1;return r.forEach((function(e){e.startLine && ]#",relevance:50,description:"@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor. Needs to be specified if the counter system is 'additive'.",restrictions:["integer","string","image","identifier"]},{name:"align-content",values:[{name:"center",description:"Lines are packed toward the center of the flex container."},{name:"flex-end",description:"Lines are packed toward the end of the flex container."},{name:"flex-start",description:"Lines are packed toward the start of the flex container."},{name:"space-around",description:"Lines are evenly distributed in the flex container, with half-size spaces on either end."},{name:"space-between",description:"Lines are evenly distributed in the flex container."},{name:"stretch",description:"Lines stretch to take up the remaining space."}],syntax:"normal | | | ? ",relevance:60,description:"Aligns a flex container’s lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.",restrictions:["enum"]},{name:"align-items",values:[{name:"baseline",description:"If the flex item’s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item’s margin box is centered in the cross axis within the line."},{name:"flex-end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"flex-start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."}],syntax:"normal | stretch | | [ ? ]",relevance:83,description:"Aligns flex items along the cross axis of the current line of the flex container.",restrictions:["enum"]},{name:"justify-items",values:[{name:"auto"},{name:"normal"},{name:"end"},{name:"start"},{name:"flex-end",description:'"Flex items are packed toward the end of the line."'},{name:"flex-start",description:'"Flex items are packed toward the start of the line."'},{name:"self-end",description:"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."},{name:"self-start",description:"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."},{name:"center",description:"The items are packed flush to each other toward the center of the of the alignment container."},{name:"left"},{name:"right"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"save"},{name:"unsave"},{name:"legacy"}],syntax:"normal | stretch | | ? [ | left | right ] | legacy | legacy && [ left | right | center ]",relevance:51,description:"Defines the default justify-self for all items of the box, giving them the default way of justifying each box along the appropriate axis",restrictions:["enum"]},{name:"justify-self",values:[{name:"auto"},{name:"normal"},{name:"end"},{name:"start"},{name:"flex-end",description:'"Flex items are packed toward the end of the line."'},{name:"flex-start",description:'"Flex items are packed toward the start of the line."'},{name:"self-end",description:"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."},{name:"self-start",description:"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."},{name:"center",description:"The items are packed flush to each other toward the center of the of the alignment container."},{name:"left"},{name:"right"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"save"},{name:"unsave"}],syntax:"auto | normal | stretch | | ? [ | left | right ]",relevance:52,description:"Defines the way of justifying a box inside its container along the appropriate axis.",restrictions:["enum"]},{name:"align-self",values:[{name:"auto",description:"Computes to the value of 'align-items' on the element’s parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself."},{name:"baseline",description:"If the flex item’s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item’s margin box is centered in the cross axis within the line."},{name:"flex-end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"flex-start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."}],syntax:"auto | normal | stretch | | ? ",relevance:70,description:"Allows the default alignment along the cross axis to be overridden for individual flex items.",restrictions:["enum"]},{name:"all",browsers:["E79","FF27","S9.1","C37","O24"],values:[],syntax:"initial | inherit | unset | revert",relevance:52,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/all"}],description:"Shorthand that resets all properties except 'direction' and 'unicode-bidi'.",restrictions:["enum"]},{name:"alt",browsers:["S9"],values:[],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/alt"}],description:"Provides alternative text for assistive technology to replace the generated content of a ::before or ::after element.",restrictions:["string","enum"]},{name:"animation",values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"backwards",description:"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."},{name:"both",description:"Both forwards and backwards fill modes are applied."},{name:"forwards",description:"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."},{name:"infinite",description:"Causes the animation to repeat forever."},{name:"none",description:"No animation is performed"},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],syntax:"#",relevance:80,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation"}],description:"Shorthand property combines six of the animation properties into a single property.",restrictions:["time","timing-function","enum","identifier","number"]},{name:"animation-delay",syntax:"